blob: fa1843e34305fcd04edf7e1d8e2140a7b812cfbc [file] [log] [blame]
/*
* Copyright (C) 2018 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.stack;
import androidx.annotation.NonNull;
import com.android.systemui.Dumpable;
import com.android.systemui.dagger.SysUISingleton;
import com.android.systemui.dump.DumpManager;
import com.android.systemui.statusbar.notification.Roundable;
import com.android.systemui.statusbar.notification.SourceType;
import com.android.systemui.statusbar.notification.row.ExpandableView;
import java.io.PrintWriter;
import java.util.HashSet;
import javax.inject.Inject;
/**
* A class that manages the roundness for notification views
*/
@SysUISingleton
public class NotificationRoundnessManager implements Dumpable {
private static final String TAG = "NotificationRoundnessManager";
private static final SourceType DISMISS_ANIMATION = SourceType.from("DismissAnimation");
private final DumpManager mDumpManager;
private HashSet<ExpandableView> mAnimatedChildren;
private boolean mRoundForPulsingViews;
private boolean mIsClearAllInProgress;
private ExpandableView mSwipedView = null;
private Roundable mViewBeforeSwipedView = null;
private Roundable mViewAfterSwipedView = null;
@Inject
NotificationRoundnessManager(DumpManager dumpManager) {
mDumpManager = dumpManager;
mDumpManager.registerDumpable(TAG, this);
}
@Override
public void dump(@NonNull PrintWriter pw, @NonNull String[] args) {
pw.println("roundForPulsingViews=" + mRoundForPulsingViews);
pw.println("isClearAllInProgress=" + mIsClearAllInProgress);
}
public boolean isViewAffectedBySwipe(ExpandableView expandableView) {
return expandableView != null
&& (expandableView == mSwipedView
|| expandableView == mViewBeforeSwipedView
|| expandableView == mViewAfterSwipedView);
}
void setViewsAffectedBySwipe(
Roundable viewBefore,
ExpandableView viewSwiped,
Roundable viewAfter) {
// This method requires you to change the roundness of the current View targets and reset
// the roundness of the old View targets (if any) to 0f.
// To avoid conflicts, it generates a set of old Views and removes the current Views
// from this set.
HashSet<Roundable> oldViews = new HashSet<>();
if (mViewBeforeSwipedView != null) oldViews.add(mViewBeforeSwipedView);
if (mSwipedView != null) oldViews.add(mSwipedView);
if (mViewAfterSwipedView != null) oldViews.add(mViewAfterSwipedView);
mViewBeforeSwipedView = viewBefore;
if (viewBefore != null) {
oldViews.remove(viewBefore);
viewBefore.requestRoundness(/* top = */ 0f, /* bottom = */ 1f, DISMISS_ANIMATION);
}
mSwipedView = viewSwiped;
if (viewSwiped != null) {
oldViews.remove(viewSwiped);
viewSwiped.requestRoundness(/* top = */ 1f, /* bottom = */ 1f, DISMISS_ANIMATION);
}
mViewAfterSwipedView = viewAfter;
if (viewAfter != null) {
oldViews.remove(viewAfter);
viewAfter.requestRoundness(/* top = */ 1f, /* bottom = */ 0f, DISMISS_ANIMATION);
}
// After setting the current Views, reset the views that are still present in the set.
for (Roundable oldView : oldViews) {
oldView.requestRoundnessReset(DISMISS_ANIMATION);
}
}
void setClearAllInProgress(boolean isClearingAll) {
mIsClearAllInProgress = isClearingAll;
}
/**
* Check if "Clear all" notifications is in progress.
*/
public boolean isClearAllInProgress() {
return mIsClearAllInProgress;
}
/**
* Check if we can request the `Pulsing` roundness for notification.
*/
public boolean shouldRoundNotificationPulsing() {
return mRoundForPulsingViews;
}
public void setAnimatedChildren(HashSet<ExpandableView> animatedChildren) {
mAnimatedChildren = animatedChildren;
}
/**
* Check if the view should be animated
* @param view target view
* @return true, if is in the AnimatedChildren set
*/
public boolean isAnimatedChild(ExpandableView view) {
return mAnimatedChildren.contains(view);
}
public void setShouldRoundPulsingViews(boolean shouldRoundPulsingViews) {
mRoundForPulsingViews = shouldRoundPulsingViews;
}
}