Removing scrim overdraw
> Moving all the scrims to draglayer to avoid creating multiple layers during various animations > Removing sys-ui scrim in various states which alread have a background scrim Bug: 74556464 Bug: 78585335 Change-Id: I8a3fd34ed440f3c7d2e19b3cdb4b72723c535602
This commit is contained in:
parent
522e388b17
commit
5d1873a812
|
@ -18,7 +18,6 @@
|
|||
android:id="@+id/launcher"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:background="?attr/workspaceStatusBarScrim"
|
||||
android:fitsSystemWindows="true">
|
||||
|
||||
<com.android.launcher3.dragndrop.DragLayer
|
||||
|
|
|
@ -25,9 +25,7 @@ import static com.android.launcher3.LauncherState.NORMAL;
|
|||
import static com.android.launcher3.logging.LoggerUtils.newContainerTarget;
|
||||
|
||||
import android.animation.Animator;
|
||||
import android.animation.AnimatorListenerAdapter;
|
||||
import android.animation.AnimatorSet;
|
||||
import android.animation.ObjectAnimator;
|
||||
import android.animation.ValueAnimator;
|
||||
import android.annotation.TargetApi;
|
||||
import android.app.ActivityOptions;
|
||||
|
@ -220,9 +218,6 @@ public class Launcher extends BaseDraggingActivity
|
|||
private IconCache mIconCache;
|
||||
private LauncherAccessibilityDelegate mAccessibilityDelegate;
|
||||
|
||||
private ObjectAnimator mScrimAnimator;
|
||||
private boolean mShouldFadeInScrim;
|
||||
|
||||
private PopupDataProvider mPopupDataProvider;
|
||||
|
||||
private int mSynchronouslyBoundPage = PagedView.INVALID_PAGE;
|
||||
|
@ -244,12 +239,6 @@ public class Launcher extends BaseDraggingActivity
|
|||
|
||||
private RotationHelper mRotationHelper;
|
||||
|
||||
// Used to keep track of the swipe up state
|
||||
private SharedPreferences.OnSharedPreferenceChangeListener mSharedPrefsListener =
|
||||
(sharedPreferences, s) -> {
|
||||
mDragLayer.setup(mDragController);
|
||||
};
|
||||
|
||||
@Override
|
||||
protected void onCreate(Bundle savedInstanceState) {
|
||||
if (DEBUG_STRICT_MODE) {
|
||||
|
@ -277,7 +266,6 @@ public class Launcher extends BaseDraggingActivity
|
|||
initDeviceProfile(app.getInvariantDeviceProfile());
|
||||
|
||||
mSharedPrefs = Utilities.getPrefs(this);
|
||||
mSharedPrefs.registerOnSharedPreferenceChangeListener(mSharedPrefsListener);
|
||||
mIconCache = app.getIconCache();
|
||||
mAccessibilityDelegate = new LauncherAccessibilityDelegate(this);
|
||||
|
||||
|
@ -336,11 +324,7 @@ public class Launcher extends BaseDraggingActivity
|
|||
getRootView().dispatchInsets();
|
||||
|
||||
// Listen for broadcasts
|
||||
IntentFilter filter = new IntentFilter();
|
||||
filter.addAction(Intent.ACTION_SCREEN_OFF);
|
||||
filter.addAction(Intent.ACTION_USER_PRESENT); // When the device wakes up + keyguard is gone
|
||||
registerReceiver(mReceiver, filter);
|
||||
mShouldFadeInScrim = true;
|
||||
registerReceiver(mScreenOffReceiver, new IntentFilter(Intent.ACTION_SCREEN_OFF));
|
||||
|
||||
getSystemUiController().updateUiState(SystemUiController.UI_STATE_BASE_WINDOW,
|
||||
Themes.getAttrBoolean(this, R.attr.isWorkspaceDarkText));
|
||||
|
@ -361,9 +345,7 @@ public class Launcher extends BaseDraggingActivity
|
|||
initDeviceProfile(mDeviceProfile.inv);
|
||||
dispatchDeviceProfileChanged();
|
||||
reapplyUi();
|
||||
|
||||
// Recreate touch controllers
|
||||
mDragLayer.setup(mDragController);
|
||||
mDragLayer.recreateControllers();
|
||||
|
||||
// TODO: We can probably avoid rebind when only screen size changed.
|
||||
rebindModel();
|
||||
|
@ -764,25 +746,6 @@ public class Launcher extends BaseDraggingActivity
|
|||
}
|
||||
mAppWidgetHost.setListenIfResumed(true);
|
||||
NotificationListener.setNotificationsChangedListener(mPopupDataProvider);
|
||||
|
||||
if (mShouldFadeInScrim && mLauncherView.getBackground() != null) {
|
||||
if (mScrimAnimator != null) {
|
||||
mScrimAnimator.cancel();
|
||||
}
|
||||
mLauncherView.getBackground().setAlpha(0);
|
||||
mScrimAnimator = ObjectAnimator.ofInt(mLauncherView.getBackground(),
|
||||
LauncherAnimUtils.DRAWABLE_ALPHA, 0, 255);
|
||||
mScrimAnimator.addListener(new AnimatorListenerAdapter() {
|
||||
@Override
|
||||
public void onAnimationEnd(Animator animation) {
|
||||
mScrimAnimator = null;
|
||||
}
|
||||
});
|
||||
mScrimAnimator.setDuration(600);
|
||||
mScrimAnimator.setStartDelay(getWindow().getTransitionBackgroundFadeDuration());
|
||||
mScrimAnimator.start();
|
||||
}
|
||||
mShouldFadeInScrim = false;
|
||||
UiFactory.onStart(this);
|
||||
}
|
||||
|
||||
|
@ -939,9 +902,8 @@ public class Launcher extends BaseDraggingActivity
|
|||
| View.SYSTEM_UI_FLAG_LAYOUT_STABLE);
|
||||
|
||||
// Setup the drag layer
|
||||
Runnable setupDragLayer = () -> mDragLayer.setup(mDragController);
|
||||
UiFactory.setOnTouchControllersChangedListener(this, setupDragLayer);
|
||||
setupDragLayer.run();
|
||||
mDragLayer.setup(mDragController, mWorkspace);
|
||||
UiFactory.setOnTouchControllersChangedListener(this, mDragLayer::recreateControllers);
|
||||
|
||||
mWorkspace.setup(mDragController);
|
||||
// Until the workspace is bound, ensure that we keep the wallpaper offset locked to the
|
||||
|
@ -1118,21 +1080,13 @@ public class Launcher extends BaseDraggingActivity
|
|||
hostView.setOnFocusChangeListener(mFocusHandler);
|
||||
}
|
||||
|
||||
private final BroadcastReceiver mReceiver = new BroadcastReceiver() {
|
||||
private final BroadcastReceiver mScreenOffReceiver = new BroadcastReceiver() {
|
||||
@Override
|
||||
public void onReceive(Context context, Intent intent) {
|
||||
final String action = intent.getAction();
|
||||
if (Intent.ACTION_SCREEN_OFF.equals(action)) {
|
||||
// Reset AllApps to its initial state only if we are not in the middle of
|
||||
// processing a multi-step drop
|
||||
if (mAppsView != null && mPendingRequestArgs == null) {
|
||||
mStateManager.goToState(NORMAL);
|
||||
}
|
||||
mShouldFadeInScrim = true;
|
||||
} else if (Intent.ACTION_USER_PRESENT.equals(action)) {
|
||||
// ACTION_USER_PRESENT is sent after onStart/onResume. This covers the case where
|
||||
// the user unlocked and the Launcher is not in the foreground.
|
||||
mShouldFadeInScrim = false;
|
||||
// Reset AllApps to its initial state only if we are not in the middle of
|
||||
// processing a multi-step drop
|
||||
if (mPendingRequestArgs == null) {
|
||||
mStateManager.goToState(NORMAL);
|
||||
}
|
||||
}
|
||||
};
|
||||
|
@ -1267,7 +1221,7 @@ public class Launcher extends BaseDraggingActivity
|
|||
}
|
||||
|
||||
// Reset the apps view
|
||||
if (!alreadyOnHome && mAppsView != null) {
|
||||
if (!alreadyOnHome) {
|
||||
mAppsView.reset(isStarted() /* animate */);
|
||||
}
|
||||
|
||||
|
@ -1336,7 +1290,7 @@ public class Launcher extends BaseDraggingActivity
|
|||
public void onDestroy() {
|
||||
super.onDestroy();
|
||||
|
||||
unregisterReceiver(mReceiver);
|
||||
unregisterReceiver(mScreenOffReceiver);
|
||||
mWorkspace.removeFolderListeners();
|
||||
|
||||
UiFactory.setOnTouchControllersChangedListener(this, null);
|
||||
|
@ -1349,7 +1303,6 @@ public class Launcher extends BaseDraggingActivity
|
|||
LauncherAppState.getInstance(this).setLauncher(null);
|
||||
}
|
||||
mRotationHelper.destroy();
|
||||
mSharedPrefs.unregisterOnSharedPreferenceChangeListener(mSharedPrefsListener);
|
||||
|
||||
try {
|
||||
mAppWidgetHost.stopListening();
|
||||
|
|
|
@ -14,8 +14,6 @@ import android.util.AttributeSet;
|
|||
import android.view.View;
|
||||
import android.view.ViewDebug;
|
||||
|
||||
import com.android.launcher3.util.Themes;
|
||||
|
||||
public class LauncherRootView extends InsettableFrameLayout {
|
||||
|
||||
private final Launcher mLauncher;
|
||||
|
@ -103,8 +101,6 @@ public class LauncherRootView extends InsettableFrameLayout {
|
|||
if (!insets.equals(mInsets)) {
|
||||
super.setInsets(insets);
|
||||
}
|
||||
setBackground(insets.top == 0 ? null
|
||||
: Themes.getAttrDrawable(getContext(), R.attr.workspaceStatusBarScrim));
|
||||
}
|
||||
|
||||
public void dispatchInsets() {
|
||||
|
|
|
@ -61,6 +61,7 @@ public class LauncherState {
|
|||
protected static final int FLAG_DISABLE_INTERACTION = 1 << 6;
|
||||
protected static final int FLAG_OVERVIEW_UI = 1 << 7;
|
||||
protected static final int FLAG_HIDE_BACK_BUTTON = 1 << 8;
|
||||
protected static final int FLAG_HAS_SYS_UI_SCRIM = 1 << 9;
|
||||
|
||||
protected static final PageAlphaProvider DEFAULT_ALPHA_PROVIDER =
|
||||
new PageAlphaProvider(ACCEL_2) {
|
||||
|
@ -75,8 +76,9 @@ public class LauncherState {
|
|||
/**
|
||||
* TODO: Create a separate class for NORMAL state.
|
||||
*/
|
||||
public static final LauncherState NORMAL = new LauncherState(0, ContainerType.WORKSPACE,
|
||||
0, FLAG_DISABLE_RESTORE | FLAG_WORKSPACE_ICONS_CAN_BE_DRAGGED | FLAG_HIDE_BACK_BUTTON);
|
||||
public static final LauncherState NORMAL = new LauncherState(0, ContainerType.WORKSPACE, 0,
|
||||
FLAG_DISABLE_RESTORE | FLAG_WORKSPACE_ICONS_CAN_BE_DRAGGED | FLAG_HIDE_BACK_BUTTON |
|
||||
FLAG_HAS_SYS_UI_SCRIM);
|
||||
|
||||
/**
|
||||
* Various Launcher states arranged in the increasing order of UI layers
|
||||
|
@ -147,6 +149,8 @@ public class LauncherState {
|
|||
*/
|
||||
public final boolean hideBackButton;
|
||||
|
||||
public final boolean hasSysUiScrim;
|
||||
|
||||
public LauncherState(int id, int containerType, int transitionDuration, int flags) {
|
||||
this.containerType = containerType;
|
||||
this.transitionDuration = transitionDuration;
|
||||
|
@ -162,6 +166,7 @@ public class LauncherState {
|
|||
this.disableInteraction = (flags & FLAG_DISABLE_INTERACTION) != 0;
|
||||
this.overviewUi = (flags & FLAG_OVERVIEW_UI) != 0;
|
||||
this.hideBackButton = (flags & FLAG_HIDE_BACK_BUTTON) != 0;
|
||||
this.hasSysUiScrim = (flags & FLAG_HAS_SYS_UI_SCRIM) != 0;
|
||||
|
||||
this.ordinal = id;
|
||||
sAllStates[id] = this;
|
||||
|
|
|
@ -75,8 +75,6 @@ import com.android.launcher3.folder.FolderIcon;
|
|||
import com.android.launcher3.folder.PreviewBackground;
|
||||
import com.android.launcher3.graphics.DragPreviewProvider;
|
||||
import com.android.launcher3.graphics.PreloadIconDrawable;
|
||||
import com.android.launcher3.graphics.ViewScrim;
|
||||
import com.android.launcher3.graphics.WorkspaceAndHotseatScrim;
|
||||
import com.android.launcher3.pageindicators.WorkspacePageIndicator;
|
||||
import com.android.launcher3.popup.PopupContainerWithArrow;
|
||||
import com.android.launcher3.shortcuts.ShortcutDragPreviewProvider;
|
||||
|
@ -279,9 +277,6 @@ public class Workspace extends PagedView<WorkspacePageIndicator>
|
|||
|
||||
// Disable multitouch across the workspace/all apps/customize tray
|
||||
setMotionEventSplittingEnabled(true);
|
||||
|
||||
// Attach a scrim
|
||||
new WorkspaceAndHotseatScrim(this).attach();
|
||||
setOnTouchListener(new WorkspaceTouchListener(mLauncher, this));
|
||||
}
|
||||
|
||||
|
@ -2152,7 +2147,7 @@ public class Workspace extends PagedView<WorkspacePageIndicator>
|
|||
}
|
||||
// Invalidating the scrim will also force this CellLayout
|
||||
// to be invalidated so that it is highlighted if necessary.
|
||||
ViewScrim.get(this).invalidate();
|
||||
mLauncher.getDragLayer().getScrim().invalidate();
|
||||
}
|
||||
|
||||
public CellLayout getCurrentDragOverlappingLayout() {
|
||||
|
|
|
@ -21,6 +21,8 @@ import static com.android.launcher3.LauncherAnimUtils.SCALE_PROPERTY;
|
|||
import static com.android.launcher3.LauncherState.HOTSEAT_ICONS;
|
||||
import static com.android.launcher3.LauncherState.HOTSEAT_SEARCH_BOX;
|
||||
import static com.android.launcher3.anim.PropertySetter.NO_ANIM_PROPERTY_SETTER;
|
||||
import static com.android.launcher3.graphics.WorkspaceAndHotseatScrim.SCRIM_PROGRESS;
|
||||
import static com.android.launcher3.graphics.WorkspaceAndHotseatScrim.SYSUI_PROGRESS;
|
||||
|
||||
import android.view.View;
|
||||
import android.view.animation.Interpolator;
|
||||
|
@ -30,7 +32,7 @@ import com.android.launcher3.LauncherStateManager.AnimationConfig;
|
|||
import com.android.launcher3.anim.AnimatorSetBuilder;
|
||||
import com.android.launcher3.anim.Interpolators;
|
||||
import com.android.launcher3.anim.PropertySetter;
|
||||
import com.android.launcher3.graphics.ViewScrim;
|
||||
import com.android.launcher3.graphics.WorkspaceAndHotseatScrim;
|
||||
|
||||
/**
|
||||
* Manages the animations between each of the workspace states.
|
||||
|
@ -103,8 +105,11 @@ public class WorkspaceStateTransitionAnimation {
|
|||
pageAlphaProvider.interpolator);
|
||||
|
||||
// Set scrim
|
||||
propertySetter.setFloat(ViewScrim.get(mWorkspace), ViewScrim.PROGRESS,
|
||||
state.getWorkspaceScrimAlpha(mLauncher), Interpolators.LINEAR);
|
||||
WorkspaceAndHotseatScrim scrim = mLauncher.getDragLayer().getScrim();
|
||||
propertySetter.setFloat(scrim, SCRIM_PROGRESS, state.getWorkspaceScrimAlpha(mLauncher),
|
||||
Interpolators.LINEAR);
|
||||
propertySetter.setFloat(scrim, SYSUI_PROGRESS, state.hasSysUiScrim ? 1 : 0,
|
||||
Interpolators.LINEAR);
|
||||
}
|
||||
|
||||
public void applyChildState(LauncherState state, CellLayout cl, int childIndex) {
|
||||
|
|
|
@ -27,6 +27,8 @@ import android.content.Context;
|
|||
import android.content.res.Resources;
|
||||
import android.graphics.Canvas;
|
||||
import android.graphics.Rect;
|
||||
import android.graphics.drawable.Drawable;
|
||||
import android.support.annotation.NonNull;
|
||||
import android.util.AttributeSet;
|
||||
import android.view.KeyEvent;
|
||||
import android.view.MotionEvent;
|
||||
|
@ -42,10 +44,12 @@ import com.android.launcher3.DropTargetBar;
|
|||
import com.android.launcher3.Launcher;
|
||||
import com.android.launcher3.R;
|
||||
import com.android.launcher3.ShortcutAndWidgetContainer;
|
||||
import com.android.launcher3.Workspace;
|
||||
import com.android.launcher3.anim.Interpolators;
|
||||
import com.android.launcher3.folder.Folder;
|
||||
import com.android.launcher3.folder.FolderIcon;
|
||||
import com.android.launcher3.graphics.ViewScrim;
|
||||
import com.android.launcher3.graphics.WorkspaceAndHotseatScrim;
|
||||
import com.android.launcher3.keyboard.ViewGroupFocusHelper;
|
||||
import com.android.launcher3.uioverrides.UiFactory;
|
||||
import com.android.launcher3.util.Thunk;
|
||||
|
@ -77,6 +81,7 @@ public class DragLayer extends BaseDragLayer<Launcher> {
|
|||
|
||||
// Related to adjacent page hints
|
||||
private final ViewGroupFocusHelper mFocusIndicatorHelper;
|
||||
private final WorkspaceAndHotseatScrim mScrim;
|
||||
|
||||
/**
|
||||
* Used to create a new DragLayer from XML.
|
||||
|
@ -92,10 +97,16 @@ public class DragLayer extends BaseDragLayer<Launcher> {
|
|||
setChildrenDrawingOrderEnabled(true);
|
||||
|
||||
mFocusIndicatorHelper = new ViewGroupFocusHelper(this);
|
||||
mScrim = new WorkspaceAndHotseatScrim(this);
|
||||
}
|
||||
|
||||
public void setup(DragController dragController) {
|
||||
public void setup(DragController dragController, Workspace workspace) {
|
||||
mDragController = dragController;
|
||||
mScrim.setWorkspace(workspace);
|
||||
recreateControllers();
|
||||
}
|
||||
|
||||
public void recreateControllers() {
|
||||
mControllers = UiFactory.createTouchControllers(mActivity);
|
||||
}
|
||||
|
||||
|
@ -542,7 +553,24 @@ public class DragLayer extends BaseDragLayer<Launcher> {
|
|||
@Override
|
||||
protected void dispatchDraw(Canvas canvas) {
|
||||
// Draw the background below children.
|
||||
mScrim.draw(canvas);
|
||||
mFocusIndicatorHelper.draw(canvas);
|
||||
super.dispatchDraw(canvas);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onSizeChanged(int w, int h, int oldw, int oldh) {
|
||||
super.onSizeChanged(w, h, oldw, oldh);
|
||||
mScrim.setSize(w, h);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setInsets(Rect insets) {
|
||||
super.setInsets(insets);
|
||||
mScrim.onInsetsChanged(insets);
|
||||
}
|
||||
|
||||
public WorkspaceAndHotseatScrim getScrim() {
|
||||
return mScrim;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -16,6 +16,14 @@
|
|||
|
||||
package com.android.launcher3.graphics;
|
||||
|
||||
import static android.content.Intent.ACTION_SCREEN_OFF;
|
||||
import static android.content.Intent.ACTION_USER_PRESENT;
|
||||
|
||||
import android.animation.ObjectAnimator;
|
||||
import android.content.BroadcastReceiver;
|
||||
import android.content.Context;
|
||||
import android.content.Intent;
|
||||
import android.content.IntentFilter;
|
||||
import android.graphics.Bitmap;
|
||||
import android.graphics.Canvas;
|
||||
import android.graphics.Color;
|
||||
|
@ -25,8 +33,11 @@ import android.graphics.Rect;
|
|||
import android.graphics.RectF;
|
||||
import android.graphics.Region;
|
||||
import android.graphics.Shader;
|
||||
import android.graphics.drawable.Drawable;
|
||||
import android.support.v4.graphics.ColorUtils;
|
||||
import android.util.DisplayMetrics;
|
||||
import android.util.Log;
|
||||
import android.util.Property;
|
||||
import android.view.View;
|
||||
|
||||
import com.android.launcher3.CellLayout;
|
||||
|
@ -35,13 +46,68 @@ import com.android.launcher3.R;
|
|||
import com.android.launcher3.Utilities;
|
||||
import com.android.launcher3.Workspace;
|
||||
import com.android.launcher3.uioverrides.WallpaperColorInfo;
|
||||
import com.android.launcher3.util.Themes;
|
||||
|
||||
/**
|
||||
* View scrim which draws behind hotseat and workspace
|
||||
*/
|
||||
public class WorkspaceAndHotseatScrim extends ViewScrim<Workspace> implements
|
||||
public class WorkspaceAndHotseatScrim implements
|
||||
View.OnAttachStateChangeListener, WallpaperColorInfo.OnChangeListener {
|
||||
|
||||
public static Property<WorkspaceAndHotseatScrim, Float> SCRIM_PROGRESS =
|
||||
new Property<WorkspaceAndHotseatScrim, Float>(Float.TYPE, "scrimProgress") {
|
||||
@Override
|
||||
public Float get(WorkspaceAndHotseatScrim scrim) {
|
||||
return scrim.mScrimProgress;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void set(WorkspaceAndHotseatScrim scrim, Float value) {
|
||||
scrim.setScrimProgress(value);
|
||||
}
|
||||
};
|
||||
|
||||
public static Property<WorkspaceAndHotseatScrim, Float> SYSUI_PROGRESS =
|
||||
new Property<WorkspaceAndHotseatScrim, Float>(Float.TYPE, "sysUiProgress") {
|
||||
@Override
|
||||
public Float get(WorkspaceAndHotseatScrim scrim) {
|
||||
return scrim.mSysUiProgress;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void set(WorkspaceAndHotseatScrim scrim, Float value) {
|
||||
scrim.setSysUiProgress(value);
|
||||
}
|
||||
};
|
||||
|
||||
private static Property<WorkspaceAndHotseatScrim, Float> SYSUI_ANIM_MULTIPLIER =
|
||||
new Property<WorkspaceAndHotseatScrim, Float>(Float.TYPE, "sysUiAnimMultiplier") {
|
||||
@Override
|
||||
public Float get(WorkspaceAndHotseatScrim scrim) {
|
||||
return scrim.mSysUiAnimMultiplier;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void set(WorkspaceAndHotseatScrim scrim, Float value) {
|
||||
scrim.mSysUiAnimMultiplier = value;
|
||||
scrim.reapplySysUiAlpha();
|
||||
}
|
||||
};
|
||||
|
||||
private final BroadcastReceiver mReceiver = new BroadcastReceiver() {
|
||||
@Override
|
||||
public void onReceive(Context context, Intent intent) {
|
||||
final String action = intent.getAction();
|
||||
if (ACTION_SCREEN_OFF.equals(action)) {
|
||||
mAnimateScrimOnNextDraw = true;
|
||||
} else if (ACTION_USER_PRESENT.equals(action)) {
|
||||
// ACTION_USER_PRESENT is sent after onStart/onResume. This covers the case where
|
||||
// the user unlocked and the Launcher is not in the foreground.
|
||||
mAnimateScrimOnNextDraw = false;
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
private static final int DARK_SCRIM_COLOR = 0x55000000;
|
||||
private static final int MAX_HOTSEAT_SCRIM_ALPHA = 100;
|
||||
private static final int ALPHA_MASK_HEIGHT_DP = 500;
|
||||
|
@ -51,40 +117,61 @@ public class WorkspaceAndHotseatScrim extends ViewScrim<Workspace> implements
|
|||
private final Rect mHighlightRect = new Rect();
|
||||
private final Launcher mLauncher;
|
||||
private final WallpaperColorInfo mWallpaperColorInfo;
|
||||
private final View mRoot;
|
||||
|
||||
private Workspace mWorkspace;
|
||||
|
||||
private final boolean mHasSysUiScrim;
|
||||
private boolean mDrawTopScrim, mDrawBottomScrim;
|
||||
|
||||
private final boolean mHasHotseatScrim;
|
||||
private final RectF mFinalMaskRect = new RectF();
|
||||
private final Paint mBottomMaskPaint = new Paint(Paint.FILTER_BITMAP_FLAG);
|
||||
|
||||
private final Bitmap mBottomMask;
|
||||
private final int mMaskHeight;
|
||||
|
||||
private final Drawable mTopScrim;
|
||||
|
||||
private int mFullScrimColor;
|
||||
|
||||
private int mAlpha = 0;
|
||||
private float mScrimProgress;
|
||||
private int mScrimAlpha = 0;
|
||||
|
||||
public WorkspaceAndHotseatScrim(Workspace view) {
|
||||
super(view);
|
||||
private float mSysUiProgress = 1;
|
||||
|
||||
private boolean mAnimateScrimOnNextDraw = false;
|
||||
private float mSysUiAnimMultiplier = 1;
|
||||
|
||||
public WorkspaceAndHotseatScrim(View view) {
|
||||
mRoot = view;
|
||||
mLauncher = Launcher.getLauncher(view.getContext());
|
||||
mWallpaperColorInfo = WallpaperColorInfo.getInstance(mLauncher);
|
||||
|
||||
mMaskHeight = Utilities.pxFromDp(ALPHA_MASK_BITMAP_DP,
|
||||
view.getResources().getDisplayMetrics());
|
||||
|
||||
mHasHotseatScrim = !mWallpaperColorInfo.supportsDarkText();
|
||||
mBottomMask = mHasHotseatScrim ? createDitheredAlphaMask() : null;
|
||||
mHasSysUiScrim = !mWallpaperColorInfo.supportsDarkText();
|
||||
if (mHasSysUiScrim) {
|
||||
mTopScrim = Themes.getAttrDrawable(view.getContext(), R.attr.workspaceStatusBarScrim);
|
||||
mBottomMask = createDitheredAlphaMask();
|
||||
} else {
|
||||
mTopScrim = null;
|
||||
mBottomMask = null;
|
||||
}
|
||||
|
||||
view.addOnAttachStateChangeListener(this);
|
||||
onExtractedColorsChanged(mWallpaperColorInfo);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void draw(Canvas canvas, int width, int height) {
|
||||
public void setWorkspace(Workspace workspace) {
|
||||
mWorkspace = workspace;
|
||||
}
|
||||
|
||||
public void draw(Canvas canvas) {
|
||||
// Draw the background below children.
|
||||
if (mAlpha > 0) {
|
||||
if (mScrimAlpha > 0) {
|
||||
// Update the scroll position first to ensure scrim cutout is in the right place.
|
||||
mView.computeScrollWithoutInvalidation();
|
||||
CellLayout currCellLayout = mView.getCurrentDragOverlappingLayout();
|
||||
mWorkspace.computeScrollWithoutInvalidation();
|
||||
CellLayout currCellLayout = mWorkspace.getCurrentDragOverlappingLayout();
|
||||
canvas.save();
|
||||
if (currCellLayout != null && currCellLayout != mLauncher.getHotseat().getLayout()) {
|
||||
// Cut a hole in the darkening scrim on the page that should be highlighted, if any.
|
||||
|
@ -93,31 +180,68 @@ public class WorkspaceAndHotseatScrim extends ViewScrim<Workspace> implements
|
|||
canvas.clipRect(mHighlightRect, Region.Op.DIFFERENCE);
|
||||
}
|
||||
|
||||
canvas.drawColor(ColorUtils.setAlphaComponent(mFullScrimColor, mAlpha));
|
||||
canvas.drawColor(ColorUtils.setAlphaComponent(mFullScrimColor, mScrimAlpha));
|
||||
canvas.restore();
|
||||
}
|
||||
|
||||
if (mHasHotseatScrim && !mLauncher.getDeviceProfile().isVerticalBarLayout()) {
|
||||
mFinalMaskRect.set(0, height - mMaskHeight, width, height);
|
||||
mBottomMaskPaint.setAlpha(Math.round(MAX_HOTSEAT_SCRIM_ALPHA * (1 - mProgress)));
|
||||
canvas.drawBitmap(mBottomMask, null, mFinalMaskRect, mBottomMaskPaint);
|
||||
if (mHasSysUiScrim) {
|
||||
if (mSysUiProgress <= 0) {
|
||||
mAnimateScrimOnNextDraw = false;
|
||||
return;
|
||||
}
|
||||
|
||||
if (mAnimateScrimOnNextDraw) {
|
||||
mSysUiAnimMultiplier = 0;
|
||||
reapplySysUiAlphaNoInvalidate();
|
||||
|
||||
ObjectAnimator anim = ObjectAnimator.ofFloat(this, SYSUI_ANIM_MULTIPLIER, 1);
|
||||
anim.setAutoCancel(true);
|
||||
anim.setDuration(600);
|
||||
anim.setStartDelay(mLauncher.getWindow().getTransitionBackgroundFadeDuration());
|
||||
anim.start();
|
||||
mAnimateScrimOnNextDraw = false;
|
||||
}
|
||||
|
||||
if (mDrawTopScrim) {
|
||||
mTopScrim.draw(canvas);
|
||||
}
|
||||
if (mDrawBottomScrim) {
|
||||
canvas.drawBitmap(mBottomMask, null, mFinalMaskRect, mBottomMaskPaint);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onProgressChanged() {
|
||||
mAlpha = Math.round(255 * mProgress);
|
||||
public void onInsetsChanged(Rect insets) {
|
||||
mDrawTopScrim = insets.top > 0;
|
||||
mDrawBottomScrim = !mLauncher.getDeviceProfile().isVerticalBarLayout();
|
||||
}
|
||||
|
||||
private void setScrimProgress(float progress) {
|
||||
if (mScrimProgress != progress) {
|
||||
mScrimProgress = progress;
|
||||
mScrimAlpha = Math.round(255 * mScrimProgress);
|
||||
invalidate();
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onViewAttachedToWindow(View view) {
|
||||
mWallpaperColorInfo.addOnChangeListener(this);
|
||||
onExtractedColorsChanged(mWallpaperColorInfo);
|
||||
|
||||
if (mHasSysUiScrim) {
|
||||
IntentFilter filter = new IntentFilter(ACTION_SCREEN_OFF);
|
||||
filter.addAction(ACTION_USER_PRESENT); // When the device wakes up + keyguard is gone
|
||||
mRoot.getContext().registerReceiver(mReceiver, filter);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onViewDetachedFromWindow(View view) {
|
||||
mWallpaperColorInfo.removeOnChangeListener(this);
|
||||
if (mHasSysUiScrim) {
|
||||
mRoot.getContext().unregisterReceiver(mReceiver);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -126,7 +250,42 @@ public class WorkspaceAndHotseatScrim extends ViewScrim<Workspace> implements
|
|||
// for dark wallpapers the text is white so darkening works as well
|
||||
mBottomMaskPaint.setColor(ColorUtils.compositeColors(DARK_SCRIM_COLOR,
|
||||
wallpaperColorInfo.getMainColor()));
|
||||
reapplySysUiAlpha();
|
||||
mFullScrimColor = wallpaperColorInfo.getMainColor();
|
||||
if (mScrimAlpha > 0) {
|
||||
invalidate();
|
||||
}
|
||||
}
|
||||
|
||||
public void setSize(int w, int h) {
|
||||
if (mHasSysUiScrim) {
|
||||
mTopScrim.setBounds(0, 0, w, h);
|
||||
mFinalMaskRect.set(0, h - mMaskHeight, w, h);
|
||||
}
|
||||
}
|
||||
|
||||
private void setSysUiProgress(float progress) {
|
||||
if (progress != mSysUiProgress) {
|
||||
mSysUiProgress = progress;
|
||||
reapplySysUiAlpha();
|
||||
}
|
||||
}
|
||||
|
||||
private void reapplySysUiAlpha() {
|
||||
if (mHasSysUiScrim) {
|
||||
reapplySysUiAlphaNoInvalidate();
|
||||
invalidate();
|
||||
}
|
||||
}
|
||||
|
||||
private void reapplySysUiAlphaNoInvalidate() {
|
||||
float factor = mSysUiProgress * mSysUiAnimMultiplier;
|
||||
mBottomMaskPaint.setAlpha(Math.round(MAX_HOTSEAT_SCRIM_ALPHA * factor));
|
||||
mTopScrim.setAlpha(Math.round(255 * factor));
|
||||
}
|
||||
|
||||
public void invalidate() {
|
||||
mRoot.invalidate();
|
||||
}
|
||||
|
||||
public Bitmap createDitheredAlphaMask() {
|
||||
|
|
Loading…
Reference in New Issue