diff options
| author | 2022-11-19 04:16:15 +0000 | |
|---|---|---|
| committer | 2022-11-22 17:47:40 +0000 | |
| commit | b8bb4dd9068b701693e86b62b404bbbd946ea047 (patch) | |
| tree | 32f388c6d42b4083728c48deafdaa244cf38d17c | |
| parent | 837507ea200734ee8e67b138afffa7e243023d9f (diff) | |
Add rear display dialog methods to CommandQueue and StatusBarService
Creates new methods through CommandQueue and StatusBarService
to allow DeviceStateManagerService to notify SystemUI
to show the rear display education dialog
Bug: 207686851
Test: CommandQueueTest
Change-Id: I65e22a9940a866bb62b597f5cd4f6ce81d891e12
Merged-In: I65e22a9940a866bb62b597f5cd4f6ce81d891e12
7 files changed, 75 insertions, 14 deletions
diff --git a/core/java/com/android/internal/statusbar/IStatusBar.aidl b/core/java/com/android/internal/statusbar/IStatusBar.aidl index 1d4b246de5c8..56e1a872423d 100644 --- a/core/java/com/android/internal/statusbar/IStatusBar.aidl +++ b/core/java/com/android/internal/statusbar/IStatusBar.aidl @@ -325,4 +325,7 @@ oneway interface IStatusBar      /** Dump protos from SystemUI. The proto definition is defined there */      void dumpProto(in String[] args, in ParcelFileDescriptor pfd); + +    /** Shows rear display educational dialog */ +    void showRearDisplayDialog(int currentBaseState);  } diff --git a/core/java/com/android/internal/statusbar/IStatusBarService.aidl b/core/java/com/android/internal/statusbar/IStatusBarService.aidl index ef8f2db5ff57..e140ce88bf28 100644 --- a/core/java/com/android/internal/statusbar/IStatusBarService.aidl +++ b/core/java/com/android/internal/statusbar/IStatusBarService.aidl @@ -226,4 +226,7 @@ interface IStatusBarService      /** Unregisters a nearby media devices provider. */      void unregisterNearbyMediaDevicesProvider(in INearbyMediaDevicesProvider provider); + +    /** Shows rear display educational dialog */ +    void showRearDisplayDialog(int currentBaseState);  } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/CommandQueue.java b/packages/SystemUI/src/com/android/systemui/statusbar/CommandQueue.java index e6d7e4124d01..426d4fcbb27d 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/CommandQueue.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/CommandQueue.java @@ -165,6 +165,7 @@ public class CommandQueue extends IStatusBar.Stub implements      private static final int MSG_REGISTER_NEARBY_MEDIA_DEVICE_PROVIDER = 66 << MSG_SHIFT;      private static final int MSG_UNREGISTER_NEARBY_MEDIA_DEVICE_PROVIDER = 67 << MSG_SHIFT;      private static final int MSG_TILE_SERVICE_REQUEST_LISTENING_STATE = 68 << MSG_SHIFT; +    private static final int MSG_SHOW_REAR_DISPLAY_DIALOG = 69 << MSG_SHIFT;      public static final int FLAG_EXCLUDE_NONE = 0;      public static final int FLAG_EXCLUDE_SEARCH_PANEL = 1 << 0; @@ -474,6 +475,11 @@ public class CommandQueue extends IStatusBar.Stub implements           */          default void unregisterNearbyMediaDevicesProvider(                  @NonNull INearbyMediaDevicesProvider provider) {} + +        /** +         * @see IStatusBar#showRearDisplayDialog +         */ +        default void showRearDisplayDialog(int currentBaseState) {}      }      public CommandQueue(Context context) { @@ -1229,6 +1235,13 @@ public class CommandQueue extends IStatusBar.Stub implements      }      @Override +    public void showRearDisplayDialog(int currentBaseState) { +        synchronized (mLock) { +            mHandler.obtainMessage(MSG_SHOW_REAR_DISPLAY_DIALOG, currentBaseState).sendToTarget(); +        } +    } + +    @Override      public void requestAddTile(              @NonNull ComponentName componentName,              @NonNull CharSequence appName, @@ -1724,6 +1737,10 @@ public class CommandQueue extends IStatusBar.Stub implements                          mCallbacks.get(i).requestTileServiceListeningState(component);                      }                      break; +                case MSG_SHOW_REAR_DISPLAY_DIALOG: +                    for (int i = 0; i < mCallbacks.size(); i++) { +                        mCallbacks.get(i).showRearDisplayDialog((Integer) msg.obj); +                    }              }          }      } diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/CommandQueueTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/CommandQueueTest.java index cf7f8dd26647..42bc7948caf4 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/CommandQueueTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/CommandQueueTest.java @@ -519,4 +519,12 @@ public class CommandQueueTest extends SysuiTestCase {          waitForIdleSync();          verify(mCallbacks).setNavigationBarLumaSamplingEnabled(eq(1), eq(true));      } + +    @Test +    public void testShowRearDisplayDialog() { +        final int currentBaseState = 1; +        mCommandQueue.showRearDisplayDialog(currentBaseState); +        waitForIdleSync(); +        verify(mCallbacks).showRearDisplayDialog(eq(currentBaseState)); +    }  } diff --git a/services/core/java/com/android/server/devicestate/DeviceStateManagerService.java b/services/core/java/com/android/server/devicestate/DeviceStateManagerService.java index 925fc21737e5..c856cabdc967 100644 --- a/services/core/java/com/android/server/devicestate/DeviceStateManagerService.java +++ b/services/core/java/com/android/server/devicestate/DeviceStateManagerService.java @@ -17,10 +17,7 @@  package com.android.server.devicestate;  import static android.Manifest.permission.CONTROL_DEVICE_STATE; -import static android.content.Intent.FLAG_ACTIVITY_NEW_TASK;  import static android.content.pm.PackageManager.PERMISSION_GRANTED; -import static android.hardware.devicestate.DeviceStateManager.ACTION_SHOW_REAR_DISPLAY_OVERLAY; -import static android.hardware.devicestate.DeviceStateManager.EXTRA_ORIGINAL_DEVICE_BASE_STATE;  import static android.hardware.devicestate.DeviceStateManager.INVALID_DEVICE_STATE;  import static android.hardware.devicestate.DeviceStateManager.MAXIMUM_DEVICE_STATE;  import static android.hardware.devicestate.DeviceStateManager.MINIMUM_DEVICE_STATE; @@ -36,10 +33,7 @@ import android.annotation.IntDef;  import android.annotation.IntRange;  import android.annotation.NonNull;  import android.annotation.Nullable; -import android.app.ActivityOptions; -import android.app.WindowConfiguration;  import android.content.Context; -import android.content.Intent;  import android.hardware.devicestate.DeviceStateInfo;  import android.hardware.devicestate.DeviceStateManager;  import android.hardware.devicestate.DeviceStateManagerInternal; @@ -64,6 +58,7 @@ import com.android.internal.util.FrameworkStatsLog;  import com.android.server.DisplayThread;  import com.android.server.LocalServices;  import com.android.server.SystemService; +import com.android.server.statusbar.StatusBarManagerInternal;  import com.android.server.wm.ActivityTaskManagerInternal;  import com.android.server.wm.WindowProcessController; @@ -731,19 +726,18 @@ public final class DeviceStateManagerService extends SystemService {      /**       * If we get a request to enter rear display  mode, we need to display an educational -     * overlay to let the user know what will happen. This creates the pending request and then -     * launches the {@link RearDisplayEducationActivity} +     * overlay to let the user know what will happen. This calls into the +     * {@link StatusBarManagerInternal} to notify SystemUI to display the educational dialog.       */      @GuardedBy("mLock")      private void showRearDisplayEducationalOverlayLocked(OverrideRequest request) {          mRearDisplayPendingOverrideRequest = request; -        Intent intent = new Intent(ACTION_SHOW_REAR_DISPLAY_OVERLAY); -        intent.setFlags(FLAG_ACTIVITY_NEW_TASK); -        intent.putExtra(EXTRA_ORIGINAL_DEVICE_BASE_STATE, mBaseState.get().getIdentifier()); -        final ActivityOptions options = ActivityOptions.makeBasic(); -        options.setLaunchWindowingMode(WindowConfiguration.WINDOWING_MODE_FULLSCREEN); -        getUiContext().startActivity(intent, options.toBundle()); +        StatusBarManagerInternal statusBar = +                LocalServices.getService(StatusBarManagerInternal.class); +        if (statusBar != null) { +            statusBar.showRearDisplayDialog(mBaseState.get().getIdentifier()); +        }      }      private void cancelStateRequestInternal(int callingPid) { diff --git a/services/core/java/com/android/server/statusbar/StatusBarManagerInternal.java b/services/core/java/com/android/server/statusbar/StatusBarManagerInternal.java index 690dd10aa3e5..c758f487d4de 100644 --- a/services/core/java/com/android/server/statusbar/StatusBarManagerInternal.java +++ b/services/core/java/com/android/server/statusbar/StatusBarManagerInternal.java @@ -172,4 +172,11 @@ public interface StatusBarManagerInternal {       * @see com.android.internal.statusbar.IStatusBar#setUdfpsHbmListener(IUdfpsHbmListener)       */      void setUdfpsHbmListener(IUdfpsHbmListener listener); + +    /** +     * Shows the rear display educational dialog +     * +     * @see com.android.internal.statusbar.IStatusBar#showRearDisplayDialog +     */ +    void showRearDisplayDialog(int currentBaseState);  } diff --git a/services/core/java/com/android/server/statusbar/StatusBarManagerService.java b/services/core/java/com/android/server/statusbar/StatusBarManagerService.java index 036739271c93..194dfb25583f 100644 --- a/services/core/java/com/android/server/statusbar/StatusBarManagerService.java +++ b/services/core/java/com/android/server/statusbar/StatusBarManagerService.java @@ -16,6 +16,7 @@  package com.android.server.statusbar; +import static android.Manifest.permission.CONTROL_DEVICE_STATE;  import static android.Manifest.permission.INTERACT_ACROSS_USERS;  import static android.Manifest.permission.INTERACT_ACROSS_USERS_FULL;  import static android.app.StatusBarManager.DISABLE2_GLOBAL_ACTIONS; @@ -31,6 +32,7 @@ import static android.view.WindowManagerPolicyConstants.NAV_BAR_MODE_3BUTTON_OVE  import android.Manifest;  import android.annotation.NonNull;  import android.annotation.Nullable; +import android.annotation.RequiresPermission;  import android.app.ActivityManager;  import android.app.ActivityManagerInternal;  import android.app.ActivityThread; @@ -685,6 +687,15 @@ public class StatusBarManagerService extends IStatusBarService.Stub implements D                  } catch (RemoteException ex) { }              }          } + +        @Override +        public void showRearDisplayDialog(int currentBaseState) { +            if (mBar != null) { +                try { +                    mBar.showRearDisplayDialog(currentBaseState); +                } catch (RemoteException ex) { } +            } +        }      };      private final GlobalActionsProvider mGlobalActionsProvider = new GlobalActionsProvider() { @@ -1288,6 +1299,11 @@ public class StatusBarManagerService extends IStatusBarService.Stub implements D                  "StatusBarManagerService");      } +    @RequiresPermission(android.Manifest.permission.CONTROL_DEVICE_STATE) +    private void enforceControlDeviceStatePermission() { +        mContext.enforceCallingOrSelfPermission(CONTROL_DEVICE_STATE, "StatusBarManagerService"); +    } +      private boolean doesCallerHoldInteractAcrossUserPermission() {          return mContext.checkCallingPermission(INTERACT_ACROSS_USERS_FULL) == PERMISSION_GRANTED                  || mContext.checkCallingPermission(INTERACT_ACROSS_USERS) == PERMISSION_GRANTED; @@ -2171,6 +2187,19 @@ public class StatusBarManagerService extends IStatusBarService.Stub implements D          }      } +    @RequiresPermission(android.Manifest.permission.CONTROL_DEVICE_STATE) +    @Override +    public void showRearDisplayDialog(int currentState) { +        enforceControlDeviceStatePermission(); +        if (mBar != null) { +            try { +                mBar.showRearDisplayDialog(currentState); +            } catch (RemoteException e) { +                Slog.e(TAG, "showRearDisplayDialog", e); +            } +        } +    } +      /** @hide */      public void passThroughShellCommand(String[] args, FileDescriptor fd) {          enforceStatusBarOrShell();  |