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

Commit 1494159d authored by Utkarsh Gupta's avatar Utkarsh Gupta Committed by Bruno Martins
Browse files

Allow screen unpinning on devices without navbar

Change-Id: Iedfc08f4d95bbee3c8578c0d2450b90739e63603

Screen Pinning: Show correct text for on screen nav.

  Similar to I09c2ef661bff272cb4f7ca43bac0e45f4b20a4d4,
  we're not getting an instance of PhoneWindowManager which
  we can rely on to update dynamically.

  TICKET: OPO-393

Change-Id: Iacf8221066461fb6940dd88432e665812545c3ff
parent 83cea920
Loading
Loading
Loading
Loading
+6 −0
Original line number Diff line number Diff line
@@ -86,4 +86,10 @@
    <!-- Navigation bar dpad -->
    <string name="accessibility_dpad_left">Cursor left</string>
    <string name="accessibility_dpad_right">Cursor right</string>

    <!-- Screen pinning dialog description. (for devices without navbar) -->
    <string name="screen_pinning_description_no_navbar">This keeps it in view until you unpin. Touch &amp; hold Back to unpin.</string>

    <!-- Notify use that they are in Lock-to-app (for devices without navbar)-->
    <string name="screen_pinning_toast_no_navbar">To unpin this screen, touch &amp; hold Back button</string>
</resources>
+19 −2
Original line number Diff line number Diff line
@@ -30,9 +30,11 @@ import android.os.RemoteException;
import android.util.DisplayMetrics;
import android.view.ContextThemeWrapper;
import android.view.Gravity;
import android.view.IWindowManager;
import android.view.View;
import android.view.ViewGroup;
import android.view.WindowManager;
import android.view.WindowManagerGlobal;
import android.view.accessibility.AccessibilityManager;
import android.view.animation.DecelerateInterpolator;
import android.widget.Button;
@@ -59,6 +61,7 @@ public class ScreenPinningRequest implements View.OnClickListener {

    private final AccessibilityManager mAccessibilityService;
    private final WindowManager mWindowManager;
    private final IWindowManager mWindowManagerService;

    private RequestWindowView mRequestWindow;

@@ -71,6 +74,7 @@ public class ScreenPinningRequest implements View.OnClickListener {
                mContext.getSystemService(Context.ACCESSIBILITY_SERVICE);
        mWindowManager = (WindowManager)
                mContext.getSystemService(Context.WINDOW_SERVICE);
        mWindowManagerService = WindowManagerGlobal.getWindowManagerService();
    }

    public void clearPrompt() {
@@ -248,14 +252,18 @@ public class ScreenPinningRequest implements View.OnClickListener {
                mLayout.findViewById(R.id.screen_pinning_recents_group).setVisibility(VISIBLE);
                mLayout.findViewById(R.id.screen_pinning_home_bg_light).setVisibility(INVISIBLE);
                mLayout.findViewById(R.id.screen_pinning_home_bg).setVisibility(INVISIBLE);
                descriptionStringResId = touchExplorationEnabled
                descriptionStringResId = !hasNavigationBar()
                        ? R.string.screen_pinning_description_no_navbar
                        : touchExplorationEnabled
                        ? R.string.screen_pinning_description_accessible
                        : R.string.screen_pinning_description;
            } else {
                mLayout.findViewById(R.id.screen_pinning_recents_group).setVisibility(INVISIBLE);
                mLayout.findViewById(R.id.screen_pinning_home_bg_light).setVisibility(VISIBLE);
                mLayout.findViewById(R.id.screen_pinning_home_bg).setVisibility(VISIBLE);
                descriptionStringResId = touchExplorationEnabled
                descriptionStringResId = !hasNavigationBar()
                        ? R.string.screen_pinning_description_no_navbar
                        : touchExplorationEnabled
                        ? R.string.screen_pinning_description_recents_invisible_accessible
                        : R.string.screen_pinning_description_recents_invisible;
            }
@@ -301,6 +309,15 @@ public class ScreenPinningRequest implements View.OnClickListener {
            }
        }

        private boolean hasNavigationBar() {
            try {
                return mWindowManagerService.hasNavigationBar();
            } catch (RemoteException e) {
                // ignore
            }
            return false;
        }

        @Override
        public void onDetachedFromWindow() {
            mContext.unregisterReceiver(mReceiver);
+17 −1
Original line number Diff line number Diff line
@@ -17,9 +17,12 @@
package com.android.systemui.statusbar.phone;

import android.content.Context;
import android.os.RemoteException;
import android.os.SystemClock;
import android.util.Slog;
import android.view.IWindowManager;
import android.view.WindowManager;
import android.view.WindowManagerGlobal;
import android.widget.Toast;

import com.android.systemui.R;
@@ -34,11 +37,13 @@ public class ScreenPinningNotify {
    private static final long SHOW_TOAST_MINIMUM_INTERVAL = 1000;

    private final Context mContext;
    private final IWindowManager mWindowManagerService;
    private Toast mLastToast;
    private long mLastShowToastTime;

    public ScreenPinningNotify(Context context) {
        mContext = context;
        mWindowManagerService = WindowManagerGlobal.getWindowManagerService();
    }

    /** Show "Screen pinned" toast. */
@@ -61,7 +66,9 @@ public class ScreenPinningNotify {
        if (mLastToast != null) {
            mLastToast.cancel();
        }
        mLastToast = makeAllUserToastAndShow(isRecentsButtonVisible
        mLastToast = makeAllUserToastAndShow(!hasNavigationBar()
                ? R.string.screen_pinning_toast_no_navbar
                : isRecentsButtonVisible
                ? R.string.screen_pinning_toast
                : R.string.screen_pinning_toast_recents_invisible);
        mLastShowToastTime = showToastTime;
@@ -72,4 +79,13 @@ public class ScreenPinningNotify {
        toast.show();
        return toast;
    }

    private boolean hasNavigationBar() {
        try {
            return mWindowManagerService.hasNavigationBar();
        } catch (RemoteException e) {
            // ignore
        }
        return false;
     }
}
+22 −1
Original line number Diff line number Diff line
@@ -156,6 +156,7 @@ import android.annotation.Nullable;
import android.app.ActivityManager;
import android.app.ActivityManagerInternal;
import android.app.ActivityManagerInternal.SleepToken;
import android.app.ActivityManagerNative;
import android.app.ActivityThread;
import android.app.AlarmManager;
import android.app.AppOpsManager;
@@ -2001,6 +2002,10 @@ public class PhoneWindowManager implements WindowManagerPolicy {

    Runnable mBackLongPress = new Runnable() {
        public void run() {
            if (unpinActivity(false)) {
                return;
            }

            if (ActionUtils.killForegroundApp(mContext, mCurrentUserId)) {
                performHapticFeedbackLw(null, HapticFeedbackConstants.LONG_PRESS, false);
                Toast.makeText(mContext,
@@ -4366,7 +4371,7 @@ public class PhoneWindowManager implements WindowManagerPolicy {
            }
            return -1;
        } else if (keyCode == KeyEvent.KEYCODE_BACK) {
            if (mKillAppLongpressBack) {
            if (mKillAppLongpressBack || unpinActivity(true)) {
                if (down && repeatCount == 0) {
                    mHandler.postDelayed(mBackLongPress, mBackKillTimeout);
                }
@@ -4618,6 +4623,22 @@ public class PhoneWindowManager implements WindowManagerPolicy {
        return false;
    }

    private boolean unpinActivity(boolean checkOnly) {
        if (!hasNavigationBar()) {
            try {
                if (ActivityManagerNative.getDefault().isInLockTaskMode()) {
                    if (!checkOnly) {
                        ActivityManagerNative.getDefault().stopSystemLockTaskMode();
                    }
                    return true;
                }
            } catch (RemoteException e) {
                // ignore
            }
        }
        return false;
    }

    /** {@inheritDoc} */
    @Override
    public KeyEvent dispatchUnhandledKey(WindowState win, KeyEvent event, int policyFlags) {