diff --git a/packages/SystemUI/res/layout/screen_pinning_request_buttons.xml b/packages/SystemUI/res/layout/screen_pinning_request_buttons.xml index e3662f17b336d..c2b1009c31370 100644 --- a/packages/SystemUI/res/layout/screen_pinning_request_buttons.xml +++ b/packages/SystemUI/res/layout/screen_pinning_request_buttons.xml @@ -108,7 +108,25 @@ android:layout_height="@dimen/screen_pinning_request_button_height" android:layout_weight="0" android:paddingStart="@dimen/screen_pinning_request_frame_padding" - android:paddingEnd="@dimen/screen_pinning_request_frame_padding" > + android:paddingEnd="@dimen/screen_pinning_request_frame_padding" + android:theme="@*android:style/ThemeOverlay.DeviceDefault.Accent"> + + + + + android:layout_weight="0" + android:theme="@*android:style/ThemeOverlay.DeviceDefault.Accent"> + + + + Screen is pinned - This keeps it in view until you unpin. Touch & hold Back to unpin. + This keeps it in view until you unpin. Touch & hold Back and Overview to unpin. + + This keeps it in view until you unpin. Touch & hold Overview to unpin. Got it diff --git a/packages/SystemUI/src/com/android/systemui/recents/ScreenPinningRequest.java b/packages/SystemUI/src/com/android/systemui/recents/ScreenPinningRequest.java index b961055c6fed0..2e78ac0c29f81 100644 --- a/packages/SystemUI/src/com/android/systemui/recents/ScreenPinningRequest.java +++ b/packages/SystemUI/src/com/android/systemui/recents/ScreenPinningRequest.java @@ -230,10 +230,12 @@ public class ScreenPinningRequest implements View.OnClickListener { .setVisibility(View.INVISIBLE); } + boolean touchExplorationEnabled = mAccessibilityService.isTouchExplorationEnabled(); ((TextView) mLayout.findViewById(R.id.screen_pinning_description)) - .setText(R.string.screen_pinning_description); - final int backBgVisibility = - mAccessibilityService.isEnabled() ? View.INVISIBLE : View.VISIBLE; + .setText(touchExplorationEnabled + ? R.string.screen_pinning_description_accessible + : R.string.screen_pinning_description); + final int backBgVisibility = touchExplorationEnabled ? View.INVISIBLE : View.VISIBLE; mLayout.findViewById(R.id.screen_pinning_back_bg).setVisibility(backBgVisibility); mLayout.findViewById(R.id.screen_pinning_back_bg_light).setVisibility(backBgVisibility); diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java index 30613bc76e494..6ab4111f96aef 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java @@ -112,6 +112,7 @@ import android.view.ViewStub; import android.view.ViewTreeObserver; import android.view.WindowManager; import android.view.WindowManagerGlobal; +import android.view.accessibility.AccessibilityEvent; import android.view.animation.AccelerateInterpolator; import android.view.animation.Interpolator; import android.widget.ImageView; @@ -178,6 +179,7 @@ import com.android.systemui.statusbar.policy.EncryptionHelper; import com.android.systemui.statusbar.policy.FlashlightController; import com.android.systemui.statusbar.policy.HeadsUpManager; import com.android.systemui.statusbar.policy.HotspotControllerImpl; +import com.android.systemui.statusbar.policy.KeyButtonView; import com.android.systemui.statusbar.policy.KeyguardMonitor; import com.android.systemui.statusbar.policy.KeyguardUserSwitcher; import com.android.systemui.statusbar.policy.LocationControllerImpl; @@ -665,6 +667,7 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode, private RankingMap mLatestRankingMap; private boolean mNoAnimationOnNextBarModeChange; private FalsingManager mFalsingManager; + private long mLastLockToAppLongPress; private KeyguardUpdateMonitorCallback mUpdateCallback = new KeyguardUpdateMonitorCallback() { @Override @@ -1322,29 +1325,6 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode, } }; - private View.OnLongClickListener mLongPressBackListener = new View.OnLongClickListener() { - @Override - public boolean onLongClick(View v) { - return handleLongPressBack(); - } - }; - - private View.OnLongClickListener mRecentsLongClickListener = new View.OnLongClickListener() { - - @Override - public boolean onLongClick(View v) { - if (mRecents == null || !ActivityManager.supportsMultiWindow() - || !getComponent(Divider.class).getView().getSnapAlgorithm() - .isSplitScreenFeasible()) { - return false; - } - - toggleSplitScreenMode(MetricsEvent.ACTION_WINDOW_DOCK_LONGPRESS, - MetricsEvent.ACTION_WINDOW_UNDOCK_LONGPRESS); - return true; - } - }; - @Override protected void toggleSplitScreenMode(int metricsDockAction, int metricsUndockAction) { if (mRecents == null) { @@ -1429,11 +1409,11 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode, recentsButton.setOnClickListener(mRecentsClickListener); recentsButton.setOnTouchListener(mRecentsPreloadOnTouchListener); recentsButton.setLongClickable(true); - recentsButton.setOnLongClickListener(mRecentsLongClickListener); + recentsButton.setOnLongClickListener(this::handleLongPressBackRecents); ButtonDispatcher backButton = mNavigationBarView.getBackButton(); backButton.setLongClickable(true); - backButton.setOnLongClickListener(mLongPressBackListener); + backButton.setOnLongClickListener(this::handleLongPressBackRecents); ButtonDispatcher homeButton = mNavigationBarView.getHomeButton(); homeButton.setOnTouchListener(mHomeActionListener); @@ -4831,16 +4811,59 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode, } /** - * Handles long press for back button. This exits screen pinning. + * This handles long-press of both back and recents. They are + * handled together to capture them both being long-pressed + * at the same time to exit screen pinning (lock task). + * + * When accessibility mode is on, only a long-press from recents + * is required to exit. + * + * In all other circumstances we try to pass through long-press events + * for Back, so that apps can still use it. Which can be from two things. + * 1) Not currently in screen pinning (lock task). + * 2) Back is long-pressed without recents. */ - private boolean handleLongPressBack() { + private boolean handleLongPressBackRecents(View v) { try { + boolean sendBackLongPress = false; IActivityManager activityManager = ActivityManagerNative.getDefault(); - if (activityManager.isInLockTaskMode()) { - activityManager.stopSystemLockTaskMode(); - - // When exiting refresh disabled flags. - mNavigationBarView.setDisabledFlags(mDisabled1, true); + boolean touchExplorationEnabled = mAccessibilityManager.isTouchExplorationEnabled(); + boolean inLockTaskMode = activityManager.isInLockTaskMode(); + if (inLockTaskMode && !touchExplorationEnabled) { + long time = System.currentTimeMillis(); + // If we recently long-pressed the other button then they were + // long-pressed 'together' + if ((time - mLastLockToAppLongPress) < LOCK_TO_APP_GESTURE_TOLERENCE) { + activityManager.stopLockTaskMode(); + // When exiting refresh disabled flags. + mNavigationBarView.setDisabledFlags(mDisabled1, true); + return true; + } else if ((v.getId() == R.id.back) + && !mNavigationBarView.getRecentsButton().getCurrentView().isPressed()) { + // If we aren't pressing recents right now then they presses + // won't be together, so send the standard long-press action. + sendBackLongPress = true; + } + mLastLockToAppLongPress = time; + } else { + // If this is back still need to handle sending the long-press event. + if (v.getId() == R.id.back) { + sendBackLongPress = true; + } else if (touchExplorationEnabled && inLockTaskMode) { + // When in accessibility mode a long press that is recents (not back) + // should stop lock task. + activityManager.stopLockTaskMode(); + // When exiting refresh disabled flags. + mNavigationBarView.setDisabledFlags(mDisabled1, true); + return true; + } else if (v.getId() == R.id.recent_apps) { + return handleLongPressRecents(); + } + } + if (sendBackLongPress) { + KeyButtonView keyButtonView = (KeyButtonView) v; + keyButtonView.sendEvent(KeyEvent.ACTION_DOWN, KeyEvent.FLAG_LONG_PRESS); + keyButtonView.sendAccessibilityEvent(AccessibilityEvent.TYPE_VIEW_LONG_CLICKED); return true; } } catch (RemoteException e) { @@ -4849,6 +4872,18 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode, return false; } + private boolean handleLongPressRecents() { + if (mRecents == null || !ActivityManager.supportsMultiWindow() + || !getComponent(Divider.class).getView().getSnapAlgorithm() + .isSplitScreenFeasible()) { + return false; + } + + toggleSplitScreenMode(MetricsEvent.ACTION_WINDOW_DOCK_LONGPRESS, + MetricsEvent.ACTION_WINDOW_UNDOCK_LONGPRESS); + return true; + } + @Override public void showScreenPinningRequest(int taskId) { if (mKeyguardMonitor.isShowing()) {