Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 0bb1e39f authored by Dave Mankoff's avatar Dave Mankoff Committed by Automerger Merge Worker
Browse files

Merge "Prevent NPE in NavigationBar" into sc-v2-dev am: 43057f8d

Original change: https://googleplex-android-review.googlesource.com/c/platform/frameworks/base/+/15886625

Change-Id: Ief7dd75f4b098bcd5378a645cb0bf81b2148eb67
parents 16948bab 43057f8d
Loading
Loading
Loading
Loading
+6 −4
Original line number Original line Diff line number Diff line
@@ -712,6 +712,7 @@ public class NavigationBar implements View.OnAttachStateChangeListener,
        mHandler.removeCallbacks(mAutoDim);
        mHandler.removeCallbacks(mAutoDim);
        mHandler.removeCallbacks(mOnVariableDurationHomeLongClick);
        mHandler.removeCallbacks(mOnVariableDurationHomeLongClick);
        mHandler.removeCallbacks(mEnableLayoutTransitions);
        mHandler.removeCallbacks(mEnableLayoutTransitions);
        mNavigationBarA11yHelper.removeA11yEventListener(mAccessibilityListener);
        mFrame = null;
        mFrame = null;
        mNavigationBarView = null;
        mNavigationBarView = null;
        mOrientationHandle = null;
        mOrientationHandle = null;
@@ -1391,10 +1392,11 @@ public class NavigationBar implements View.OnAttachStateChangeListener,
    void updateAccessibilityServicesState() {
    void updateAccessibilityServicesState() {
        int a11yFlags = mNavigationBarA11yHelper.getA11yButtonState();
        int a11yFlags = mNavigationBarA11yHelper.getA11yButtonState();


        if (mNavigationBarView != null) {
            boolean clickable = (a11yFlags & SYSUI_STATE_A11Y_BUTTON_CLICKABLE) != 0;
            boolean clickable = (a11yFlags & SYSUI_STATE_A11Y_BUTTON_CLICKABLE) != 0;
            boolean longClickable = (a11yFlags & SYSUI_STATE_A11Y_BUTTON_LONG_CLICKABLE) != 0;
            boolean longClickable = (a11yFlags & SYSUI_STATE_A11Y_BUTTON_LONG_CLICKABLE) != 0;
            mNavigationBarView.setAccessibilityButtonState(clickable, longClickable);
            mNavigationBarView.setAccessibilityButtonState(clickable, longClickable);

        }
        updateSystemUiStateFlags(a11yFlags);
        updateSystemUiStateFlags(a11yFlags);
    }
    }


+18 −1
Original line number Original line Diff line number Diff line
@@ -56,6 +56,7 @@ import android.testing.TestableLooper.RunWithLooper;
import android.view.Display;
import android.view.Display;
import android.view.DisplayInfo;
import android.view.DisplayInfo;
import android.view.MotionEvent;
import android.view.MotionEvent;
import android.view.View;
import android.view.WindowManager;
import android.view.WindowManager;
import android.view.WindowMetrics;
import android.view.WindowMetrics;
import android.view.accessibility.AccessibilityManager;
import android.view.accessibility.AccessibilityManager;
@@ -122,6 +123,8 @@ public class NavigationBarTest extends SysuiTestCase {
    EdgeBackGestureHandler.Factory mEdgeBackGestureHandlerFactory;
    EdgeBackGestureHandler.Factory mEdgeBackGestureHandlerFactory;
    @Mock
    @Mock
    EdgeBackGestureHandler mEdgeBackGestureHandler;
    EdgeBackGestureHandler mEdgeBackGestureHandler;
    @Mock
    NavigationBarA11yHelper mNavigationBarA11yHelper;


    @Rule
    @Rule
    public final LeakCheckedTest.SysuiLeakCheck mLeakCheck = new LeakCheckedTest.SysuiLeakCheck();
    public final LeakCheckedTest.SysuiLeakCheck mLeakCheck = new LeakCheckedTest.SysuiLeakCheck();
@@ -256,6 +259,20 @@ public class NavigationBarTest extends SysuiTestCase {
        assertFalse((defaultNavBar.getNavigationIconHints() & NAVIGATION_HINT_IME_SHOWN) != 0);
        assertFalse((defaultNavBar.getNavigationIconHints() & NAVIGATION_HINT_IME_SHOWN) != 0);
    }
    }


    @Test
    public void testA11yEventAfterDetach() {
        View v = mNavigationBar.createView(null);
        mNavigationBar.onViewAttachedToWindow(v);
        verify(mNavigationBarA11yHelper).registerA11yEventListener(any(
                NavigationBarA11yHelper.NavA11yEventListener.class));
        mNavigationBar.onViewDetachedFromWindow(v);
        verify(mNavigationBarA11yHelper).removeA11yEventListener(any(
                NavigationBarA11yHelper.NavA11yEventListener.class));

        // Should be safe even though the internal view is now null.
        mNavigationBar.updateAccessibilityServicesState();
    }

    private NavigationBar createNavBar(Context context) {
    private NavigationBar createNavBar(Context context) {
        DeviceProvisionedController deviceProvisionedController =
        DeviceProvisionedController deviceProvisionedController =
                mock(DeviceProvisionedController.class);
                mock(DeviceProvisionedController.class);
@@ -287,7 +304,7 @@ public class NavigationBarTest extends SysuiTestCase {
                mHandler,
                mHandler,
                mock(NavigationBarOverlayController.class),
                mock(NavigationBarOverlayController.class),
                mUiEventLogger,
                mUiEventLogger,
                mock(NavigationBarA11yHelper.class),
                mNavigationBarA11yHelper,
                mock(UserTracker.class)));
                mock(UserTracker.class)));
    }
    }