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

Commit 9a53f5ce authored by Justin Chung's avatar Justin Chung
Browse files

Use status bar to launch assistant.

Bug: 289402228
Test: atest StemKeyGestureTests
Change-Id: I7f5780191e29d9eeef23a48d7ec9452ea820ecba
parent 81d8e8c8
Loading
Loading
Loading
Loading
+26 −42
Original line number Diff line number Diff line
@@ -29,6 +29,7 @@ import static android.content.pm.PackageManager.FEATURE_WATCH;
import static android.content.pm.PackageManager.PERMISSION_GRANTED;
import static android.os.Build.VERSION_CODES.M;
import static android.os.Build.VERSION_CODES.O;
import static android.os.IInputConstants.INVALID_INPUT_DEVICE_ID;
import static android.provider.Settings.Secure.VOLUME_HUSH_OFF;
import static android.view.Display.DEFAULT_DISPLAY;
import static android.view.Display.INVALID_DISPLAY;
@@ -1331,7 +1332,7 @@ public class PhoneWindowManager implements WindowManagerPolicy {
                mPowerKeyHandled = true;
                performHapticFeedback(HapticFeedbackConstants.ASSISTANT_BUTTON, false,
                        "Power - Long Press - Go To Assistant");
                final int powerKeyDeviceId = Integer.MIN_VALUE;
                final int powerKeyDeviceId = INVALID_INPUT_DEVICE_ID;
                launchAssistAction(null, powerKeyDeviceId, eventTime,
                        AssistUtils.INVOCATION_TYPE_POWER_BUTTON_LONG_PRESS);
                break;
@@ -1520,7 +1521,7 @@ public class PhoneWindowManager implements WindowManagerPolicy {
        }
    }

    private void stemPrimaryLongPress() {
    private void stemPrimaryLongPress(long eventTime) {
        if (DEBUG_INPUT) {
            Slog.d(TAG, "Executing stem primary long press action behavior.");
        }
@@ -1529,7 +1530,12 @@ public class PhoneWindowManager implements WindowManagerPolicy {
            case LONG_PRESS_PRIMARY_NOTHING:
                break;
            case LONG_PRESS_PRIMARY_LAUNCH_VOICE_ASSISTANT:
                launchVoiceAssist(/* allowDuringSetup= */false);
                final int stemPrimaryKeyDeviceId = INVALID_INPUT_DEVICE_ID;
                launchAssistAction(
                        null,
                        stemPrimaryKeyDeviceId,
                        eventTime,
                        AssistUtils.INVOCATION_TYPE_UNKNOWN);
                break;
        }
    }
@@ -2152,6 +2158,7 @@ public class PhoneWindowManager implements WindowManagerPolicy {
        mPowerManagerInternal = LocalServices.getService(PowerManagerInternal.class);
        mAppOpsManager = mContext.getSystemService(AppOpsManager.class);
        mSensorPrivacyManager = mContext.getSystemService(SensorPrivacyManager.class);
        mSearchManager = mContext.getSystemService(SearchManager.class);
        mDisplayManager = mContext.getSystemService(DisplayManager.class);
        mDisplayManagerInternal = LocalServices.getService(DisplayManagerInternal.class);
        mUserManagerInternal = LocalServices.getService(UserManagerInternal.class);
@@ -2650,7 +2657,7 @@ public class PhoneWindowManager implements WindowManagerPolicy {

        @Override
        void onLongPress(long eventTime) {
            stemPrimaryLongPress();
            stemPrimaryLongPress(eventTime);
        }

        @Override
@@ -3897,7 +3904,7 @@ public class PhoneWindowManager implements WindowManagerPolicy {
        // Add Intent Extra data.
        Bundle args = null;
        args = new Bundle();
        if (deviceId > Integer.MIN_VALUE) {
        if (deviceId != INVALID_INPUT_DEVICE_ID) {
            args.putInt(Intent.EXTRA_ASSIST_INPUT_DEVICE_ID, deviceId);
        }
        if (hint != null) {
@@ -3906,8 +3913,15 @@ public class PhoneWindowManager implements WindowManagerPolicy {
        args.putLong(Intent.EXTRA_TIME, eventTime);
        args.putInt(AssistUtils.INVOCATION_TYPE_KEY, invocationType);

        ((SearchManager) mContext.createContextAsUser(UserHandle.of(mCurrentUserId), 0)
                .getSystemService(Context.SEARCH_SERVICE)).launchAssist(args);
        if (mSearchManager != null) {
            mSearchManager.launchAssist(args);
        } else {
            // Fallback to status bar if search manager doesn't exist (e.g. on wear).
            StatusBarManagerInternal statusBar = getStatusBarManagerInternal();
            if (statusBar != null) {
                statusBar.startAssist(args);
            }
        }
    }

    /**
@@ -3918,39 +3932,16 @@ public class PhoneWindowManager implements WindowManagerPolicy {
        final boolean keyguardActive =
                mKeyguardDelegate != null && mKeyguardDelegate.isShowing();
        if (!keyguardActive) {
            if (mHasFeatureWatch && isInRetailMode()) {
                launchRetailVoiceAssist(allowDuringSetup);
            } else {
                startVoiceAssistIntent(allowDuringSetup);
            }
        } else {
            mKeyguardDelegate.dismissKeyguardToLaunch(new Intent(Intent.ACTION_VOICE_ASSIST));
        }
    }

    private void launchRetailVoiceAssist(boolean allowDuringSetup) {
        Intent retailIntent = new Intent(ACTION_VOICE_ASSIST_RETAIL);
        ResolveInfo resolveInfo = mContext.getPackageManager().resolveActivity(
                retailIntent, /* flags= */0);
        if (resolveInfo != null) {
            retailIntent.setComponent(
                    new ComponentName(resolveInfo.activityInfo.packageName,
                            resolveInfo.activityInfo.name));
            startActivityAsUser(retailIntent, null, UserHandle.CURRENT_OR_SELF,
            startActivityAsUser(
                    new Intent(Intent.ACTION_VOICE_ASSIST),
                    /* bundle= */ null,
                    UserHandle.CURRENT_OR_SELF,
                    allowDuringSetup);
        } else {
            Slog.w(TAG, "Couldn't find an app to process " + ACTION_VOICE_ASSIST_RETAIL
                    + ". Fall back to start " + Intent.ACTION_VOICE_ASSIST);
            startVoiceAssistIntent(allowDuringSetup);
            mKeyguardDelegate.dismissKeyguardToLaunch(new Intent(Intent.ACTION_VOICE_ASSIST));
        }
    }

    private void startVoiceAssistIntent(boolean allowDuringSetup) {
        Intent intent = new Intent(Intent.ACTION_VOICE_ASSIST);
        startActivityAsUser(intent, null, UserHandle.CURRENT_OR_SELF,
                allowDuringSetup);
    }

    private boolean isInRetailMode() {
        return Settings.Global.getInt(mContext.getContentResolver(),
                Settings.Global.DEVICE_DEMO_MODE, 0) == 1;
@@ -3973,13 +3964,6 @@ public class PhoneWindowManager implements WindowManagerPolicy {
        }
    }

    private SearchManager getSearchManager() {
        if (mSearchManager == null) {
            mSearchManager = (SearchManager) mContext.getSystemService(Context.SEARCH_SERVICE);
        }
        return mSearchManager;
    }

    private void preloadRecentApps() {
        mPreloadedRecentApps = true;
        StatusBarManagerInternal statusbar = getStatusBarManagerInternal();
+1 −1
Original line number Diff line number Diff line
@@ -112,7 +112,7 @@ public class PowerKeyGestureTests extends ShortcutKeyTestBase {
        // Show assistant.
        mPhoneWindowManager.overrideLongPressOnPower(LONG_PRESS_POWER_ASSISTANT);
        sendKey(KEYCODE_POWER, true);
        mPhoneWindowManager.assertAssistLaunch();
        mPhoneWindowManager.assertSearchManagerLaunchAssist();

        // Show global actions.
        mPhoneWindowManager.overrideLongPressOnPower(LONG_PRESS_POWER_GLOBAL_ACTIONS);
+31 −0
Original line number Diff line number Diff line
@@ -16,9 +16,11 @@

package com.android.server.policy;

import static android.provider.Settings.Global.STEM_PRIMARY_BUTTON_LONG_PRESS;
import static android.provider.Settings.Global.STEM_PRIMARY_BUTTON_SHORT_PRESS;
import static android.view.KeyEvent.KEYCODE_STEM_PRIMARY;

import static com.android.server.policy.PhoneWindowManager.LONG_PRESS_PRIMARY_LAUNCH_VOICE_ASSISTANT;
import static com.android.server.policy.PhoneWindowManager.SHORT_PRESS_PRIMARY_LAUNCH_ALL_APPS;
import static com.android.server.policy.PhoneWindowManager.SHORT_PRESS_PRIMARY_LAUNCH_TARGET_ACTIVITY;

@@ -90,6 +92,35 @@ public class StemKeyGestureTests extends ShortcutKeyTestBase {
        mPhoneWindowManager.assertActivityTargetLaunched(targetComponent);
    }

    @Test
    public void stemLongKey_triggerSearchServiceToLaunchAssist() {
        overrideBehavior(
                STEM_PRIMARY_BUTTON_LONG_PRESS,
                LONG_PRESS_PRIMARY_LAUNCH_VOICE_ASSISTANT);
        setUpPhoneWindowManager(/* supportSettingsUpdate= */ true);
        mPhoneWindowManager.setupAssistForLaunch();
        mPhoneWindowManager.overrideIsUserSetupComplete(true);

        sendKey(KEYCODE_STEM_PRIMARY, /* longPress= */ true);
        mPhoneWindowManager.assertSearchManagerLaunchAssist();
    }

    @Test
    public void stemLongKey_whenNoSearchService_triggerStatusBarToStartAssist() {
        overrideBehavior(
                STEM_PRIMARY_BUTTON_LONG_PRESS,
                LONG_PRESS_PRIMARY_LAUNCH_VOICE_ASSISTANT);
        setUpPhoneWindowManager(/* supportSettingsUpdate= */ true);
        mPhoneWindowManager.setupAssistForLaunch();
        mPhoneWindowManager.overrideSearchManager(null);
        mPhoneWindowManager.overrideStatusBarManagerInternal();
        mPhoneWindowManager.overrideIsUserSetupComplete(true);

        sendKey(KEYCODE_STEM_PRIMARY, /* longPress= */ true);
        mPhoneWindowManager.assertStatusBarStartAssist();
    }


    private void overrideBehavior(String key, int expectedBehavior) {
        Settings.Global.putLong(mContext.getContentResolver(), key, expectedBehavior);
    }
+18 −6
Original line number Diff line number Diff line
@@ -232,6 +232,7 @@ class TestPhoneWindowManager {
        doReturn(mPackageManager).when(mContext).getPackageManager();
        doReturn(mSensorPrivacyManager).when(mContext).getSystemService(
                eq(SensorPrivacyManager.class));
        doReturn(mSearchManager).when(mContext).getSystemService(eq(SearchManager.class));
        doReturn(false).when(mPackageManager).hasSystemFeature(any());
        try {
            doThrow(new PackageManager.NameNotFoundException("test")).when(mPackageManager)
@@ -357,11 +358,7 @@ class TestPhoneWindowManager {
            case LONG_PRESS_POWER_GO_TO_VOICE_ASSIST:
                break;
            case LONG_PRESS_POWER_ASSISTANT:
                doNothing().when(mPhoneWindowManager).sendCloseSystemWindows();
                doReturn(true).when(mPhoneWindowManager).isUserSetupComplete();
                doReturn(mContext).when(mContext).createContextAsUser(any(), anyInt());
                doReturn(mSearchManager).when(mContext)
                        .getSystemService(eq(Context.SEARCH_SERVICE));
                setupAssistForLaunch();
                mPhoneWindowManager.mLongPressOnPowerAssistantTimeoutMs = 500;
                break;
        }
@@ -435,6 +432,16 @@ class TestPhoneWindowManager {
        doReturn(isShowing).when(mKeyguardServiceDelegate).isShowing();
    }

    void setupAssistForLaunch() {
        doNothing().when(mPhoneWindowManager).sendCloseSystemWindows();
        doReturn(true).when(mPhoneWindowManager).isUserSetupComplete();
        doReturn(mContext).when(mContext).createContextAsUser(any(), anyInt());
    }

    void overrideSearchManager(SearchManager searchManager) {
        mPhoneWindowManager.mSearchManager = searchManager;
    }

    void assumeResolveActivityNotNull() {
        ResolveInfo resolveInfo = new ResolveInfo();
        doReturn(resolveInfo).when(mPackageManager).resolveActivity(any(), anyInt());
@@ -529,7 +536,7 @@ class TestPhoneWindowManager {
                .interceptPowerKeyDown(any(), anyBoolean(), any());
    }

    void assertAssistLaunch() {
    void assertSearchManagerLaunchAssist() {
        waitForIdle();
        verify(mSearchManager, timeout(SHORTCUT_KEY_DELAY_MILLIS)).launchAssist(any());
    }
@@ -552,6 +559,11 @@ class TestPhoneWindowManager {
        verify(mStatusBarManagerInternal).showRecentApps(anyBoolean());
    }

    void assertStatusBarStartAssist() {
        waitForIdle();
        verify(mStatusBarManagerInternal).startAssist(any());
    }

    void assertSwitchKeyboardLayout(int direction) {
        waitForIdle();
        if (FeatureFlagUtils.isEnabled(mContext, FeatureFlagUtils.SETTINGS_NEW_KEYBOARD_UI)) {