blob: 76c4518169bb349d2a4d58168a75bbcfeb3b603e [file] [log] [blame]
Adam Cohena6d04922014-10-23 17:28:30 -07001package com.android.launcher3;
2
Sunny Goyala314d5a2020-05-20 20:34:04 -07003import static com.android.launcher3.config.FeatureFlags.SEPARATE_RECENTS_ACTIVITY;
Sunny Goyaled2d2bc2018-04-19 12:34:43 -07004
Sunny Goyal93264612015-11-23 11:47:50 -08005import android.annotation.TargetApi;
Adam Cohena6d04922014-10-23 17:28:30 -07006import android.content.Context;
Adam Cohen501e1392021-02-02 16:45:07 -08007import android.graphics.Canvas;
Adam Cohena6d04922014-10-23 17:28:30 -07008import android.graphics.Rect;
Tony Wickham12e8a342019-04-23 11:28:54 -07009import android.os.Build;
Adam Cohena6d04922014-10-23 17:28:30 -070010import android.util.AttributeSet;
Sunny Goyal4ffec482016-02-09 11:28:52 -080011import android.view.ViewDebug;
Sunny Goyal022b1822019-06-12 08:44:09 -070012import android.view.WindowInsets;
Adam Cohena6d04922014-10-23 17:28:30 -070013
Adam Cohen501e1392021-02-02 16:45:07 -080014import com.android.launcher3.graphics.SysUiScrim;
Sunny Goyal9d89f752020-06-19 11:09:24 -070015import com.android.launcher3.statemanager.StatefulActivity;
16
Tony Wickham12e8a342019-04-23 11:28:54 -070017import java.util.Collections;
18import java.util.List;
19
Adam Cohena6d04922014-10-23 17:28:30 -070020public class LauncherRootView extends InsettableFrameLayout {
Sunny Goyal0abb36f2015-06-23 10:53:59 -070021
Sunny Goyal022b1822019-06-12 08:44:09 -070022 private final Rect mTempRect = new Rect();
23
Sunny Goyal9d89f752020-06-19 11:09:24 -070024 private final StatefulActivity mActivity;
Sunny Goyal07b69292018-01-08 14:19:34 -080025
Sunny Goyal745df7c2019-04-03 15:25:00 -070026 @ViewDebug.ExportedProperty(category = "launcher")
Tony Wickham12e8a342019-04-23 11:28:54 -070027 private static final List<Rect> SYSTEM_GESTURE_EXCLUSION_RECT =
28 Collections.singletonList(new Rect());
29
Sunny Goyal7185dd62018-03-14 17:51:49 -070030 private WindowStateListener mWindowStateListener;
Tony Wickham12e8a342019-04-23 11:28:54 -070031 @ViewDebug.ExportedProperty(category = "launcher")
32 private boolean mDisallowBackGesture;
Vinit Nayak9a846212019-09-05 11:47:12 -070033 @ViewDebug.ExportedProperty(category = "launcher")
34 private boolean mForceHideBackArrow;
Sunny Goyal93264612015-11-23 11:47:50 -080035
Adam Cohen501e1392021-02-02 16:45:07 -080036 private SysUiScrim mSysUiScrim;
37
Adam Cohena6d04922014-10-23 17:28:30 -070038 public LauncherRootView(Context context, AttributeSet attrs) {
39 super(context, attrs);
Sunny Goyal9d89f752020-06-19 11:09:24 -070040 mActivity = StatefulActivity.fromContext(context);
Adam Cohena6d04922014-10-23 17:28:30 -070041 }
42
Sunny Goyal022b1822019-06-12 08:44:09 -070043 private void handleSystemWindowInsets(Rect insets) {
Sunny Goyal07b69292018-01-08 14:19:34 -080044 // Update device profile before notifying th children.
Sunny Goyal9d89f752020-06-19 11:09:24 -070045 mActivity.getDeviceProfile().updateInsets(insets);
Sunny Goyalce8809a2018-01-18 14:02:47 -080046 boolean resetState = !insets.equals(mInsets);
Sunny Goyal906c6b22017-08-18 00:35:52 -070047 setInsets(insets);
48
Sunny Goyalce8809a2018-01-18 14:02:47 -080049 if (resetState) {
Sunny Goyal9d89f752020-06-19 11:09:24 -070050 mActivity.getStateManager().reapplyState(true /* cancelCurrentAnimation */);
Sunny Goyalce8809a2018-01-18 14:02:47 -080051 }
Sunny Goyal022b1822019-06-12 08:44:09 -070052 }
Sunny Goyal0abb36f2015-06-23 10:53:59 -070053
Sunny Goyal022b1822019-06-12 08:44:09 -070054 @Override
55 public WindowInsets onApplyWindowInsets(WindowInsets insets) {
56 mTempRect.set(insets.getSystemWindowInsetLeft(), insets.getSystemWindowInsetTop(),
57 insets.getSystemWindowInsetRight(), insets.getSystemWindowInsetBottom());
58 handleSystemWindowInsets(mTempRect);
Sunny Goyal786940a2020-06-02 02:31:31 -070059 return insets;
Adam Cohena6d04922014-10-23 17:28:30 -070060 }
Sunny Goyal0abb36f2015-06-23 10:53:59 -070061
Jon Mirandade43a712018-01-18 11:35:10 -080062 @Override
63 public void setInsets(Rect insets) {
Sunny Goyalf8d56fc2018-01-31 15:18:11 -080064 // If the insets haven't changed, this is a no-op. Avoid unnecessary layout caused by
65 // modifying child layout params.
66 if (!insets.equals(mInsets)) {
67 super.setInsets(insets);
68 }
Jon Mirandade43a712018-01-18 11:35:10 -080069 }
70
Sunny Goyal07b69292018-01-08 14:19:34 -080071 public void dispatchInsets() {
Sunny Goyal9d89f752020-06-19 11:09:24 -070072 mActivity.getDeviceProfile().updateInsets(mInsets);
Sunny Goyalf8d56fc2018-01-31 15:18:11 -080073 super.setInsets(mInsets);
Sunny Goyal07b69292018-01-08 14:19:34 -080074 }
75
Sunny Goyal7185dd62018-03-14 17:51:49 -070076 public void setWindowStateListener(WindowStateListener listener) {
77 mWindowStateListener = listener;
78 }
79
80 @Override
81 public void onWindowFocusChanged(boolean hasWindowFocus) {
82 super.onWindowFocusChanged(hasWindowFocus);
83 if (mWindowStateListener != null) {
84 mWindowStateListener.onWindowFocusChanged(hasWindowFocus);
85 }
86 }
87
88 @Override
89 protected void onWindowVisibilityChanged(int visibility) {
90 super.onWindowVisibilityChanged(visibility);
91 if (mWindowStateListener != null) {
92 mWindowStateListener.onWindowVisibilityChanged(visibility);
93 }
94 }
95
Adam Cohen501e1392021-02-02 16:45:07 -080096 public void setSysUiScrim(SysUiScrim scrim) {
97 mSysUiScrim = scrim;
98 }
99
100 @Override
101 protected void dispatchDraw(Canvas canvas) {
102 if (mSysUiScrim != null) {
103 mSysUiScrim.draw(canvas);
104 }
105 super.dispatchDraw(canvas);
106 }
107
Sunny Goyal745df7c2019-04-03 15:25:00 -0700108 @Override
Tony Wickham12e8a342019-04-23 11:28:54 -0700109 protected void onLayout(boolean changed, int l, int t, int r, int b) {
110 super.onLayout(changed, l, t, r, b);
111 SYSTEM_GESTURE_EXCLUSION_RECT.get(0).set(l, t, r, b);
112 setDisallowBackGesture(mDisallowBackGesture);
113 }
114
115 @TargetApi(Build.VERSION_CODES.Q)
Vinit Nayak9a846212019-09-05 11:47:12 -0700116 public void setForceHideBackArrow(boolean forceHideBackArrow) {
117 this.mForceHideBackArrow = forceHideBackArrow;
118 setDisallowBackGesture(mDisallowBackGesture);
119 }
120
121 @TargetApi(Build.VERSION_CODES.Q)
Tony Wickham12e8a342019-04-23 11:28:54 -0700122 public void setDisallowBackGesture(boolean disallowBackGesture) {
Sunny Goyala314d5a2020-05-20 20:34:04 -0700123 if (!Utilities.ATLEAST_Q || SEPARATE_RECENTS_ACTIVITY.get()) {
Tony Wickham12e8a342019-04-23 11:28:54 -0700124 return;
125 }
126 mDisallowBackGesture = disallowBackGesture;
Vinit Nayak9a846212019-09-05 11:47:12 -0700127 setSystemGestureExclusionRects((mForceHideBackArrow || mDisallowBackGesture)
Tony Wickham12e8a342019-04-23 11:28:54 -0700128 ? SYSTEM_GESTURE_EXCLUSION_RECT
129 : Collections.emptyList());
130 }
131
Sunny Goyal7185dd62018-03-14 17:51:49 -0700132 public interface WindowStateListener {
133
134 void onWindowFocusChanged(boolean hasFocus);
135
136 void onWindowVisibilityChanged(int visibility);
137 }
Adam Cohen501e1392021-02-02 16:45:07 -0800138}