blob: ffec3671995f3a0f244cb7693fe20b6484ecf317 [file] [log] [blame]
/*
* Copyright (C) 2020 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.android.systemui.statusbar.notification.interruption;
import static com.android.systemui.statusbar.notification.row.NotificationRowContentBinder.FLAG_CONTENT_VIEW_HEADS_UP;
import android.util.ArrayMap;
import androidx.annotation.Nullable;
import androidx.core.os.CancellationSignal;
import com.android.internal.util.NotificationMessagingUtil;
import com.android.systemui.dagger.SysUISingleton;
import com.android.systemui.statusbar.NotificationPresenter;
import com.android.systemui.statusbar.notification.collection.NotificationEntry;
import com.android.systemui.statusbar.notification.collection.coordinator.HeadsUpCoordinator;
import com.android.systemui.statusbar.notification.row.NotifBindPipeline.BindCallback;
import com.android.systemui.statusbar.notification.row.RowContentBindParams;
import com.android.systemui.statusbar.notification.row.RowContentBindStage;
import java.util.Map;
import javax.inject.Inject;
/**
* Wrapper around heads up view binding logic. {@link HeadsUpViewBinder} is responsible for
* figuring out the right heads up inflation parameters and inflating/freeing the heads up
* content view.
*
* TODO: This should be moved into {@link HeadsUpCoordinator} when the old pipeline is deprecated
* (i.e. when {@link HeadsUpController} is removed).
*/
@SysUISingleton
public class HeadsUpViewBinder {
private final RowContentBindStage mStage;
private final NotificationMessagingUtil mNotificationMessagingUtil;
private final Map<NotificationEntry, CancellationSignal> mOngoingBindCallbacks =
new ArrayMap<>();
private NotificationPresenter mNotificationPresenter;
@Inject
HeadsUpViewBinder(
NotificationMessagingUtil notificationMessagingUtil,
RowContentBindStage bindStage) {
mNotificationMessagingUtil = notificationMessagingUtil;
mStage = bindStage;
}
/**
* Set notification presenter to determine parameters for heads up view inflation.
*/
public void setPresenter(NotificationPresenter presenter) {
mNotificationPresenter = presenter;
}
/**
* Bind heads up view to the notification row.
* @param callback callback after heads up view is bound
*/
public void bindHeadsUpView(NotificationEntry entry, @Nullable BindCallback callback) {
RowContentBindParams params = mStage.getStageParams(entry);
final boolean isImportantMessage = mNotificationMessagingUtil.isImportantMessaging(
entry.getSbn(), entry.getImportance());
final boolean useIncreasedHeadsUp = isImportantMessage
&& !mNotificationPresenter.isPresenterFullyCollapsed();
params.setUseIncreasedHeadsUpHeight(useIncreasedHeadsUp);
params.requireContentViews(FLAG_CONTENT_VIEW_HEADS_UP);
CancellationSignal signal = mStage.requestRebind(entry, en -> {
en.getRow().setUsesIncreasedHeadsUpHeight(params.useIncreasedHeadsUpHeight());
if (callback != null) {
callback.onBindFinished(en);
}
});
abortBindCallback(entry);
mOngoingBindCallbacks.put(entry, signal);
}
/**
* Abort any callbacks waiting for heads up view binding to finish for a given notification.
* @param entry notification with bind in progress
*/
public void abortBindCallback(NotificationEntry entry) {
CancellationSignal ongoingBindCallback = mOngoingBindCallbacks.remove(entry);
if (ongoingBindCallback != null) {
ongoingBindCallback.cancel();
}
}
/**
* Unbind the heads up view from the notification row.
*/
public void unbindHeadsUpView(NotificationEntry entry) {
abortBindCallback(entry);
mStage.getStageParams(entry).markContentViewsFreeable(FLAG_CONTENT_VIEW_HEADS_UP);
mStage.requestRebind(entry, null);
}
}