Merge "Tweak lifecycle of nav bar/view" into sc-dev
diff --git a/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBar.java b/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBar.java
index 9e77b60..d8b342a 100644
--- a/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBar.java
+++ b/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBar.java
@@ -31,6 +31,7 @@
 import static android.view.WindowInsetsController.APPEARANCE_OPAQUE_NAVIGATION_BARS;
 import static android.view.WindowInsetsController.APPEARANCE_SEMI_TRANSPARENT_NAVIGATION_BARS;
 import static android.view.WindowInsetsController.BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE;
+import static android.view.WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_ALWAYS;
 import static android.view.WindowManager.LayoutParams.PRIVATE_FLAG_NO_MOVE_ANIMATION;
 import static android.view.WindowManagerPolicyConstants.NAV_BAR_MODE_3BUTTON;
 import static android.view.WindowManagerPolicyConstants.NAV_BAR_MODE_GESTURAL;
@@ -200,7 +201,7 @@
     private final UiEventLogger mUiEventLogger;
 
     private Bundle mSavedState;
-    private NavigationBarView mNavigationBarView = null;
+    private NavigationBarView mNavigationBarView;
 
     private @WindowVisibleState int mNavigationBarWindowState = WINDOW_STATE_SHOWING;
 
@@ -392,7 +393,8 @@
             };
 
     private final Runnable mAutoDim = () -> getBarTransitions().setAutoDim(true);
-
+    private final Runnable mEnableLayoutTransitions = () ->
+            mNavigationBarView.setLayoutTransitionsEnabled(true);
     private final Runnable mOnVariableDurationHomeLongClick = () -> {
         if (onHomeLongClick(mNavigationBarView.getHomeButton().getCurrentView())) {
             mNavigationBarView.getHomeButton().getCurrentView().performHapticFeedback(
@@ -488,7 +490,7 @@
         mA11yBtnMode = mAccessibilityButtonModeObserver.getCurrentAccessibilityButtonMode();
     }
 
-    public View getView() {
+    public NavigationBarView getView() {
         return mNavigationBarView;
     }
 
@@ -504,16 +506,19 @@
                         | WindowManager.LayoutParams.FLAG_SLIPPERY,
                 PixelFormat.TRANSLUCENT);
         lp.token = new Binder();
-        lp.setTitle("NavigationBar" + mContext.getDisplayId());
         lp.accessibilityTitle = mContext.getString(R.string.nav_bar);
-        lp.windowAnimations = 0;
         lp.privateFlags |= WindowManager.LayoutParams.PRIVATE_FLAG_COLOR_SPACE_AGNOSTIC;
+        lp.layoutInDisplayCutoutMode = LAYOUT_IN_DISPLAY_CUTOUT_MODE_ALWAYS;
+        lp.windowAnimations = 0;
+        lp.setTitle("NavigationBar" + mContext.getDisplayId());
+        lp.setFitInsetsTypes(0 /* types */);
 
         NavigationBarFrame frame = (NavigationBarFrame) LayoutInflater.from(mContext).inflate(
                 R.layout.navigation_bar_window, null);
         View barView = LayoutInflater.from(frame.getContext()).inflate(
                 R.layout.navigation_bar, frame);
         barView.addOnAttachStateChangeListener(this);
+        mNavigationBarView = barView.findViewById(R.id.navigation_bar_view);
 
         if (DEBUG) Log.v(TAG, "addNavigationBar: about to add " + barView);
         mContext.getSystemService(WindowManager.class).addView(frame, lp);
@@ -533,6 +538,19 @@
         mContentResolver.registerContentObserver(
                 Settings.Secure.getUriFor(Settings.Secure.ASSIST_TOUCH_GESTURE_ENABLED),
                 false, mAssistContentObserver, UserHandle.USER_ALL);
+        mAllowForceNavBarHandleOpaque = mContext.getResources().getBoolean(
+                R.bool.allow_force_nav_bar_handle_opaque);
+        mForceNavBarHandleOpaque = DeviceConfig.getBoolean(
+                DeviceConfig.NAMESPACE_SYSTEMUI,
+                NAV_BAR_HANDLE_FORCE_OPAQUE,
+                /* defaultValue = */ true);
+        mHomeButtonLongPressDurationMs = Optional.of(DeviceConfig.getLong(
+                DeviceConfig.NAMESPACE_SYSTEMUI,
+                HOME_BUTTON_LONG_PRESS_DURATION_MS,
+                /* defaultValue = */ 0
+        )).filter(duration -> duration != 0);
+        DeviceConfig.addOnPropertiesChangedListener(
+                DeviceConfig.NAMESPACE_SYSTEMUI, mHandler::post, mOnPropertiesChangedListener);
         updateAssistantEntrypoints();
 
         if (savedState != null) {
@@ -543,25 +561,10 @@
             mTransientShown = savedState.getBoolean(EXTRA_TRANSIENT_STATE, false);
         }
         mSavedState = savedState;
-        mAccessibilityManagerWrapper.addCallback(mAccessibilityListener);
 
         // Respect the latest disabled-flags.
         mCommandQueue.recomputeDisableFlags(mDisplayId, false);
 
-        mAllowForceNavBarHandleOpaque = mContext.getResources().getBoolean(
-                R.bool.allow_force_nav_bar_handle_opaque);
-        mForceNavBarHandleOpaque = DeviceConfig.getBoolean(
-                DeviceConfig.NAMESPACE_SYSTEMUI,
-                NAV_BAR_HANDLE_FORCE_OPAQUE,
-                /* defaultValue = */ true);
-        mHomeButtonLongPressDurationMs = Optional.of(DeviceConfig.getLong(
-            DeviceConfig.NAMESPACE_SYSTEMUI,
-            HOME_BUTTON_LONG_PRESS_DURATION_MS,
-            /* defaultValue = */ 0
-        )).filter(duration -> duration != 0);
-        DeviceConfig.addOnPropertiesChangedListener(
-                DeviceConfig.NAMESPACE_SYSTEMUI, mHandler::post, mOnPropertiesChangedListener);
-
         mIsCurrentUserSetup = mDeviceProvisionedController.isCurrentUserSetup();
         mDeviceProvisionedController.addCallback(mUserSetupListener);
 
@@ -587,7 +590,6 @@
     @Override
     public void onViewAttachedToWindow(View v) {
         final Display display = v.getDisplay();
-        mNavigationBarView = v.findViewById(R.id.navigation_bar_view);
         mNavigationBarView.setComponents(mStatusBarLazy.get().getPanelController());
         mNavigationBarView.setDisabledFlags(mDisabledFlags1);
         mNavigationBarView.setOnVerticalChangedListener(this::onVerticalChanged);
@@ -598,6 +600,9 @@
         mNavigationBarView.setNavigationIconHints(mNavigationIconHints);
         mNavigationBarView.setWindowVisible(isNavBarWindowVisible());
         mNavigationBarView.setBehavior(mBehavior);
+
+        mAccessibilityManagerWrapper.addCallback(mAccessibilityListener);
+
         mSplitScreenOptional.ifPresent(mNavigationBarView::registerDockedListener);
         mPipOptional.ifPresent(mNavigationBarView::registerPipExclusionBoundsChangeListener);
 
@@ -657,10 +662,8 @@
 
     @Override
     public void onViewDetachedFromWindow(View v) {
-        if (mNavigationBarView != null) {
-            mNavigationBarView.getBarTransitions().destroy();
-            mNavigationBarView.getLightTransitionsController().destroy(mContext);
-        }
+        mNavigationBarView.getBarTransitions().destroy();
+        mNavigationBarView.getLightTransitionsController().destroy(mContext);
         mOverviewProxyService.removeCallback(mOverviewProxyListener);
         mBroadcastDispatcher.unregisterReceiver(mBroadcastReceiver);
         if (mOrientationHandle != null) {
@@ -671,6 +674,8 @@
                     mOrientationHandleGlobalLayoutListener);
         }
         mHandler.removeCallbacks(mAutoDim);
+        mHandler.removeCallbacks(mOnVariableDurationHomeLongClick);
+        mHandler.removeCallbacks(mEnableLayoutTransitions);
         mNavigationBarView = null;
         mOrientationHandle = null;
     }
@@ -682,9 +687,7 @@
         outState.putInt(EXTRA_APPEARANCE, mAppearance);
         outState.putInt(EXTRA_BEHAVIOR, mBehavior);
         outState.putBoolean(EXTRA_TRANSIENT_STATE, mTransientShown);
-        if (mNavigationBarView != null) {
-            mNavigationBarView.getLightTransitionsController().saveState(outState);
-        }
+        mNavigationBarView.getLightTransitionsController().saveState(outState);
     }
 
     /**
@@ -809,15 +812,12 @@
             // mOrientedHandle is initialized lazily
             mOrientationHandle.setVisibility(View.GONE);
         }
-        if (mNavigationBarView != null) {
-            mNavigationBarView.setVisibility(View.VISIBLE);
-            mNavigationBarView.setOrientedHandleSamplingRegion(null);
-        }
+        mNavigationBarView.setVisibility(View.VISIBLE);
+        mNavigationBarView.setOrientedHandleSamplingRegion(null);
     }
 
     private void reconfigureHomeLongClick() {
-        if (mNavigationBarView == null
-                || mNavigationBarView.getHomeButton().getCurrentView() == null) {
+        if (mNavigationBarView.getHomeButton().getCurrentView() == null) {
             return;
         }
         if (mHomeButtonLongPressDurationMs.isPresent() || !mLongPressHomeEnabled) {
@@ -844,17 +844,12 @@
         pw.println("  mHomeButtonLongPressDurationMs=" + mHomeButtonLongPressDurationMs);
         pw.println("  mLongPressHomeEnabled=" + mLongPressHomeEnabled);
         pw.println("  mAssistantTouchGestureEnabled=" + mAssistantTouchGestureEnabled);
-
-        if (mNavigationBarView != null) {
-            pw.println("  mNavigationBarWindowState="
-                    + windowStateToString(mNavigationBarWindowState));
-            pw.println("  mNavigationBarMode="
-                    + BarTransitions.modeToString(mNavigationBarMode));
-            dumpBarTransitions(pw, "mNavigationBarView", mNavigationBarView.getBarTransitions());
-            mNavigationBarView.dump(pw);
-        } else {
-            pw.print("  mNavigationBarView=null");
-        }
+        pw.println("  mNavigationBarWindowState="
+                + windowStateToString(mNavigationBarWindowState));
+        pw.println("  mNavigationBarMode="
+                + BarTransitions.modeToString(mNavigationBarMode));
+        dumpBarTransitions(pw, "mNavigationBarView", mNavigationBarView.getBarTransitions());
+        mNavigationBarView.dump(pw);
     }
 
     // ----- CommandQueue Callbacks -----
@@ -889,10 +884,7 @@
         if (hints == mNavigationIconHints) return;
 
         mNavigationIconHints = hints;
-
-        if (mNavigationBarView != null) {
-            mNavigationBarView.setNavigationIconHints(hints);
-        }
+        mNavigationBarView.setNavigationIconHints(hints);
         checkBarModes();
         updateSystemUiStateFlags(-1);
     }
@@ -911,23 +903,12 @@
                 orientSecondaryHomeHandle();
             }
             if (DEBUG_WINDOW_STATE) Log.d(TAG, "Navigation bar " + windowStateToString(state));
-
-            if (mNavigationBarView != null) {
-                mNavigationBarView.setWindowVisible(isNavBarWindowVisible());
-            }
+            mNavigationBarView.setWindowVisible(isNavBarWindowVisible());
         }
     }
 
     @Override
     public void onRotationProposal(final int rotation, boolean isValid) {
-        if (mNavigationBarView == null) {
-            if (RotationContextButton.DEBUG_ROTATION) {
-                Log.v(TAG, "onRotationProposal proposedRotation=" +
-                        Surface.rotationToString(rotation) + ", mNavigationBarView is null");
-            }
-            return;
-        }
-
         final int winRotation = mNavigationBarView.getDisplay().getRotation();
         final boolean rotateSuggestionsDisabled = RotationButtonController
                 .hasDisable2RotateSuggestionFlag(mDisabledFlags2);
@@ -941,8 +922,7 @@
                     + ", isValid=" + isValid + ", mNavBarWindowState="
                     + StatusBarManager.windowStateToString(mNavigationBarWindowState)
                     + ", rotateSuggestionsDisabled=" + rotateSuggestionsDisabled
-                    + ", isRotateButtonVisible=" + (mNavigationBarView == null ? "null"
-                    : rotationButton.isVisible()));
+                    + ", isRotateButtonVisible=" + rotationButton.isVisible());
         }
 
         // Respect the disabled flag, no need for action as flag change callback will handle hiding
@@ -983,9 +963,6 @@
         boolean nbModeChanged = false;
         if (mAppearance != appearance) {
             mAppearance = appearance;
-            if (getView() == null) {
-                return;
-            }
             nbModeChanged = updateBarMode(barMode(mTransientShown, appearance));
         }
         if (mLightBarController != null) {
@@ -994,9 +971,7 @@
         }
         if (mBehavior != behavior) {
             mBehavior = behavior;
-            if (mNavigationBarView != null) {
-                mNavigationBarView.setBehavior(behavior);
-            }
+            mNavigationBarView.setBehavior(behavior);
             updateSystemUiStateFlags(-1);
         }
     }
@@ -1034,12 +1009,7 @@
     }
 
     private void handleTransientChanged() {
-        if (getView() == null) {
-            return;
-        }
-        if (mNavigationBarView != null) {
-            mNavigationBarView.onTransientStateChanged(mTransientShown);
-        }
+        mNavigationBarView.onTransientStateChanged(mTransientShown);
         final int barMode = barMode(mTransientShown, mAppearance);
         if (updateBarMode(barMode) && mLightBarController != null) {
             mLightBarController.onNavigationBarModeChanged(barMode);
@@ -1092,9 +1062,7 @@
                 | StatusBarManager.DISABLE_SEARCH);
         if (masked != mDisabledFlags1) {
             mDisabledFlags1 = masked;
-            if (mNavigationBarView != null) {
-                mNavigationBarView.setDisabledFlags(state1);
-            }
+            mNavigationBarView.setDisabledFlags(state1);
             updateScreenPinningGestures();
         }
 
@@ -1110,17 +1078,13 @@
 
     private void setDisabled2Flags(int state2) {
         // Method only called on change of disable2 flags
-        if (mNavigationBarView != null) {
-            mNavigationBarView.getRotationButtonController().onDisable2FlagChanged(state2);
-        }
+        mNavigationBarView.getRotationButtonController().onDisable2FlagChanged(state2);
     }
 
     // ----- Internal stuff -----
 
     private void refreshLayout(int layoutDirection) {
-        if (mNavigationBarView != null) {
-            mNavigationBarView.setLayoutDirection(layoutDirection);
-        }
+        mNavigationBarView.setLayoutDirection(layoutDirection);
     }
 
     private boolean shouldDisableNavbarGestures() {
@@ -1129,7 +1093,7 @@
     }
 
     private void repositionNavigationBar() {
-        if (mNavigationBarView == null || !mNavigationBarView.isAttachedToWindow()) return;
+        if (!mNavigationBarView.isAttachedToWindow()) return;
 
         prepareNavigationBarView();
 
@@ -1138,10 +1102,6 @@
     }
 
     private void updateScreenPinningGestures() {
-        if (mNavigationBarView == null) {
-            return;
-        }
-
         // Change the cancel pin gesture to home and back if recents button is invisible
         boolean pinningActive = ActivityManagerWrapper.getInstance().isScreenPinningActive();
         ButtonDispatcher backButton = mNavigationBarView.getBackButton();
@@ -1252,10 +1212,7 @@
                 AssistManager.INVOCATION_TYPE_HOME_BUTTON_LONG_PRESS);
         mAssistManagerLazy.get().startAssist(args);
         mStatusBarLazy.get().awakenDreams();
-
-        if (mNavigationBarView != null) {
-            mNavigationBarView.abortCurrentGesture();
-        }
+        mNavigationBarView.abortCurrentGesture();
         return true;
     }
 
@@ -1405,9 +1362,6 @@
     }
 
     void updateAccessibilityServicesState(AccessibilityManager accessibilityManager) {
-        if (mNavigationBarView == null) {
-            return;
-        }
         boolean[] feedbackEnabled = new boolean[1];
         int a11yFlags = getA11yButtonState(feedbackEnabled);
 
@@ -1593,7 +1547,7 @@
 
     public void disableAnimationsDuringHide(long delay) {
         mNavigationBarView.setLayoutTransitionsEnabled(false);
-        mNavigationBarView.postDelayed(() -> mNavigationBarView.setLayoutTransitionsEnabled(true),
+        mHandler.postDelayed(mEnableLayoutTransitions,
                 delay + StackStateAnimator.ANIMATION_DURATION_GO_TO_FULL_SHADE);
     }
 
@@ -1608,10 +1562,7 @@
     }
 
     public NavigationBarTransitions getBarTransitions() {
-        if (mNavigationBarView != null) {
-            return mNavigationBarView.getBarTransitions();
-        }
-        return null;
+        return mNavigationBarView.getBarTransitions();
     }
 
     public void finishBarAnimations() {
@@ -1626,8 +1577,7 @@
     }
 
     private final Consumer<Integer> mRotationWatcher = rotation -> {
-        if (mNavigationBarView != null
-                && mNavigationBarView.needsReorient(rotation)) {
+        if (mNavigationBarView.needsReorient(rotation)) {
             repositionNavigationBar();
         }
     };
@@ -1635,9 +1585,6 @@
     private final BroadcastReceiver mBroadcastReceiver = new BroadcastReceiver() {
         @Override
         public void onReceive(Context context, Intent intent) {
-            if (mNavigationBarView == null) {
-                return;
-            }
             String action = intent.getAction();
             if (Intent.ACTION_SCREEN_OFF.equals(action)
                     || Intent.ACTION_SCREEN_ON.equals(action)) {
diff --git a/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBarController.java b/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBarController.java
index 0515fed..8b5a537 100644
--- a/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBarController.java
+++ b/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBarController.java
@@ -224,10 +224,7 @@
                 if (navBar == null) {
                     continue;
                 }
-                NavigationBarView view = (NavigationBarView) navBar.getView();
-                if (view != null) {
-                    view.updateStates();
-                }
+                navBar.getView().updateStates();
             }
         });
     }
@@ -365,13 +362,12 @@
                 mHandler,
                 mNavBarOverlayController,
                 mUiEventLogger);
+        mNavigationBars.put(displayId, navBar);
 
         View navigationBarView = navBar.createView(savedState);
         navigationBarView.addOnAttachStateChangeListener(new View.OnAttachStateChangeListener() {
             @Override
             public void onViewAttachedToWindow(View v) {
-                mNavigationBars.put(displayId, navBar);
-
                 if (result != null) {
                     navBar.setImeWindowStatus(display.getDisplayId(), result.mImeToken,
                             result.mImeWindowVis, result.mImeBackDisposition,
@@ -447,7 +443,7 @@
      */
     public @Nullable NavigationBarView getNavigationBarView(int displayId) {
         NavigationBar navBar = mNavigationBars.get(displayId);
-        return (navBar == null) ? null : (NavigationBarView) navBar.getView();
+        return (navBar == null) ? null : navBar.getView();
     }
 
     /** @return {@link NavigationBar} on the default display. */
diff --git a/packages/SystemUI/src/com/android/systemui/navigationbar/buttons/ButtonDispatcher.java b/packages/SystemUI/src/com/android/systemui/navigationbar/buttons/ButtonDispatcher.java
index 4d25079..0218016 100644
--- a/packages/SystemUI/src/com/android/systemui/navigationbar/buttons/ButtonDispatcher.java
+++ b/packages/SystemUI/src/com/android/systemui/navigationbar/buttons/ButtonDispatcher.java
@@ -40,7 +40,6 @@
     private final ArrayList<View> mViews = new ArrayList<>();
 
     private final int mId;
-    private final AssistManager mAssistManager;
 
     private View.OnClickListener mClickListener;
     private View.OnTouchListener mTouchListener;
@@ -73,7 +72,6 @@
 
     public ButtonDispatcher(int id) {
         mId = id;
-        mAssistManager = Dependency.get(AssistManager.class);
     }
 
     public void clear() {