diff --git a/packages/SystemUI/res/layout/global_actions_change_panel.xml b/packages/SystemUI/res/layout/global_actions_change_panel.xml
new file mode 100644
index 0000000000000..dffb0f011bb5d
--- /dev/null
+++ b/packages/SystemUI/res/layout/global_actions_change_panel.xml
@@ -0,0 +1,21 @@
+
+
+
diff --git a/packages/SystemUI/res/layout/global_actions_grid_lite.xml b/packages/SystemUI/res/layout/global_actions_grid_lite.xml
index 2430eec776781..5588fd391681e 100644
--- a/packages/SystemUI/res/layout/global_actions_grid_lite.xml
+++ b/packages/SystemUI/res/layout/global_actions_grid_lite.xml
@@ -13,13 +13,12 @@
See the License for the specific language governing permissions and
limitations under the License.
-->
-
+ app:layout_constraintBottom_toBottomOf="parent"
+ app:layout_constraintTop_toTopOf="parent"
+ app:layout_constraintStart_toStartOf="parent"
+ app:layout_constraintEnd_toEndOf="parent"
+ android:layout_weight="1">
-
+
diff --git a/packages/SystemUI/res/values/config.xml b/packages/SystemUI/res/values/config.xml
index be9065b2c13b2..119507b67e9ad 100644
--- a/packages/SystemUI/res/values/config.xml
+++ b/packages/SystemUI/res/values/config.xml
@@ -603,6 +603,8 @@
false
+
+ false
diff --git a/packages/SystemUI/res/values/dimens.xml b/packages/SystemUI/res/values/dimens.xml
index 5c1e9355b6501..ab606babe804d 100644
--- a/packages/SystemUI/res/values/dimens.xml
+++ b/packages/SystemUI/res/values/dimens.xml
@@ -1106,6 +1106,7 @@
38dp
28dp
24dp
+ 32dp
diff --git a/packages/SystemUI/res/values/strings.xml b/packages/SystemUI/res/values/strings.xml
index db3fae6fa491c..e2a49a1a7b2b5 100644
--- a/packages/SystemUI/res/values/strings.xml
+++ b/packages/SystemUI/res/values/strings.xml
@@ -2966,4 +2966,7 @@
Ongoing phone call
+
+
+
diff --git a/packages/SystemUI/src/com/android/systemui/globalactions/GlobalActionsDialog.java b/packages/SystemUI/src/com/android/systemui/globalactions/GlobalActionsDialog.java
index 3873c25f32c64..dfd85fe4dc90d 100644
--- a/packages/SystemUI/src/com/android/systemui/globalactions/GlobalActionsDialog.java
+++ b/packages/SystemUI/src/com/android/systemui/globalactions/GlobalActionsDialog.java
@@ -151,6 +151,7 @@ public class GlobalActionsDialog extends GlobalActionsDialogLite
iWindowManager,
backgroundExecutor,
uiEventLogger,
+ null,
ringerModeTracker, sysUiState, handler);
mLockPatternUtils = lockPatternUtils;
@@ -298,7 +299,7 @@ public class GlobalActionsDialog extends GlobalActionsDialogLite
super(context, com.android.systemui.R.style.Theme_SystemUI_Dialog_GlobalActions,
adapter, overflowAdapter, depthController, sysuiColorExtractor,
statusBarService, notificationShadeWindowController, sysuiState,
- onRotateCallback, keyguardShowing, powerAdapter, uiEventLogger);
+ onRotateCallback, keyguardShowing, powerAdapter, uiEventLogger, null);
mWalletFactory = walletFactory;
// Update window attributes
diff --git a/packages/SystemUI/src/com/android/systemui/globalactions/GlobalActionsDialogLite.java b/packages/SystemUI/src/com/android/systemui/globalactions/GlobalActionsDialogLite.java
index f9bb35fcb723b..8e152830e2089 100644
--- a/packages/SystemUI/src/com/android/systemui/globalactions/GlobalActionsDialogLite.java
+++ b/packages/SystemUI/src/com/android/systemui/globalactions/GlobalActionsDialogLite.java
@@ -188,6 +188,7 @@ public class GlobalActionsDialogLite implements DialogInterface.OnDismissListene
private final UiEventLogger mUiEventLogger;
private final NotificationShadeDepthController mDepthController;
private final SysUiState mSysUiState;
+ private final GlobalActionsInfoProvider mInfoProvider;
// Used for RingerModeTracker
private final LifecycleRegistry mLifecycle = new LifecycleRegistry(this);
@@ -320,6 +321,7 @@ public class GlobalActionsDialogLite implements DialogInterface.OnDismissListene
IWindowManager iWindowManager,
@Background Executor backgroundExecutor,
UiEventLogger uiEventLogger,
+ GlobalActionsInfoProvider infoProvider,
RingerModeTracker ringerModeTracker, SysUiState sysUiState, @Main Handler handler) {
mContext = context;
mWindowManagerFuncs = windowManagerFuncs;
@@ -339,6 +341,7 @@ public class GlobalActionsDialogLite implements DialogInterface.OnDismissListene
mTelecomManager = telecomManager;
mMetricsLogger = metricsLogger;
mUiEventLogger = uiEventLogger;
+ mInfoProvider = infoProvider;
mDepthController = depthController;
mSysuiColorExtractor = colorExtractor;
mStatusBarService = statusBarService;
@@ -621,7 +624,8 @@ public class GlobalActionsDialogLite implements DialogInterface.OnDismissListene
mAdapter, mOverflowAdapter,
mDepthController, mSysuiColorExtractor,
mStatusBarService, mNotificationShadeWindowController,
- mSysUiState, this::onRotate, mKeyguardShowing, mPowerAdapter, mUiEventLogger);
+ mSysUiState, this::onRotate, mKeyguardShowing, mPowerAdapter, mUiEventLogger,
+ mInfoProvider);
dialog.setOnDismissListener(this);
dialog.setOnShowListener(this);
@@ -2095,6 +2099,7 @@ public class GlobalActionsDialogLite implements DialogInterface.OnDismissListene
private Dialog mPowerOptionsDialog;
protected final Runnable mOnRotateCallback;
private UiEventLogger mUiEventLogger;
+ private GlobalActionsInfoProvider mInfoProvider;
protected ViewGroup mContainer;
@@ -2104,7 +2109,8 @@ public class GlobalActionsDialogLite implements DialogInterface.OnDismissListene
SysuiColorExtractor sysuiColorExtractor, IStatusBarService statusBarService,
NotificationShadeWindowController notificationShadeWindowController,
SysUiState sysuiState, Runnable onRotateCallback, boolean keyguardShowing,
- MyPowerOptionsAdapter powerAdapter, UiEventLogger uiEventLogger) {
+ MyPowerOptionsAdapter powerAdapter, UiEventLogger uiEventLogger,
+ @Nullable GlobalActionsInfoProvider infoProvider) {
super(context, themeRes);
mContext = context;
mAdapter = adapter;
@@ -2118,6 +2124,7 @@ public class GlobalActionsDialogLite implements DialogInterface.OnDismissListene
mOnRotateCallback = onRotateCallback;
mKeyguardShowing = keyguardShowing;
mUiEventLogger = uiEventLogger;
+ mInfoProvider = infoProvider;
// Window initialization
Window window = getWindow();
@@ -2215,6 +2222,10 @@ public class GlobalActionsDialogLite implements DialogInterface.OnDismissListene
mBackgroundDrawable = new ScrimDrawable();
mScrimAlpha = 1.0f;
}
+
+ if (mInfoProvider != null && mInfoProvider.shouldShowMessage()) {
+ mInfoProvider.addPanel(mContext, mContainer, mAdapter.getCount(), () -> dismiss());
+ }
}
protected void fixNavBarClipping() {
diff --git a/packages/SystemUI/src/com/android/systemui/globalactions/GlobalActionsInfoProvider.kt b/packages/SystemUI/src/com/android/systemui/globalactions/GlobalActionsInfoProvider.kt
new file mode 100644
index 0000000000000..ee7f5ed8c86ea
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/globalactions/GlobalActionsInfoProvider.kt
@@ -0,0 +1,38 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.android.systemui.globalactions
+
+import android.content.Context
+import android.service.quickaccesswallet.QuickAccessWalletClient
+import android.view.ViewGroup
+import com.android.systemui.controls.controller.ControlsController
+import com.android.systemui.plugins.ActivityStarter
+import javax.inject.Inject
+
+// Empty class, will be overridden for relevant devices
+class GlobalActionsInfoProvider @Inject constructor(
+ private val context: Context,
+ private val walletClient: QuickAccessWalletClient,
+ private val controlsController: ControlsController,
+ private val activityStarter: ActivityStarter
+) {
+
+ fun addPanel(context: Context, parent: ViewGroup, nActions: Int, dismissParent: Runnable) { }
+
+ fun shouldShowMessage(): Boolean {
+ return false
+ }
+}
\ No newline at end of file
diff --git a/packages/SystemUI/tests/src/com/android/systemui/globalactions/GlobalActionsDialogLiteTest.java b/packages/SystemUI/tests/src/com/android/systemui/globalactions/GlobalActionsDialogLiteTest.java
index 003368d99dcc5..83e7b17eb7463 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/globalactions/GlobalActionsDialogLiteTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/globalactions/GlobalActionsDialogLiteTest.java
@@ -103,6 +103,7 @@ public class GlobalActionsDialogLiteTest extends SysuiTestCase {
@Mock private IWindowManager mWindowManager;
@Mock private Executor mBackgroundExecutor;
@Mock private UiEventLogger mUiEventLogger;
+ @Mock private GlobalActionsInfoProvider mInfoProvider;
@Mock private RingerModeTracker mRingerModeTracker;
@Mock private RingerModeLiveData mRingerModeLiveData;
@Mock private SysUiState mSysUiState;
@@ -146,6 +147,7 @@ public class GlobalActionsDialogLiteTest extends SysuiTestCase {
mWindowManager,
mBackgroundExecutor,
mUiEventLogger,
+ mInfoProvider,
mRingerModeTracker,
mSysUiState,
mHandler
diff --git a/packages/SystemUI/tests/src/com/android/systemui/globalactions/GlobalActionsInfoProviderTest.kt b/packages/SystemUI/tests/src/com/android/systemui/globalactions/GlobalActionsInfoProviderTest.kt
new file mode 100644
index 0000000000000..d3b9228fff6de
--- /dev/null
+++ b/packages/SystemUI/tests/src/com/android/systemui/globalactions/GlobalActionsInfoProviderTest.kt
@@ -0,0 +1,73 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.systemui.globalactions
+
+import android.service.quickaccesswallet.QuickAccessWalletClient
+import android.testing.AndroidTestingRunner
+import android.view.ViewGroup
+import androidx.test.filters.SmallTest
+import com.android.systemui.SysuiTestCase
+import com.android.systemui.controls.controller.ControlsController
+import com.android.systemui.plugins.ActivityStarter
+import com.google.common.truth.Truth.assertThat
+import org.junit.Before
+import org.junit.Test
+import org.junit.runner.RunWith
+import org.mockito.ArgumentMatchers.anyInt
+import org.mockito.ArgumentMatchers.anyObject
+import org.mockito.Mock
+import org.mockito.Mockito.mock
+import org.mockito.Mockito.verify
+import org.mockito.Mockito.never
+import org.mockito.MockitoAnnotations
+
+@SmallTest
+@RunWith(AndroidTestingRunner::class)
+class GlobalActionsInfoProviderTest : SysuiTestCase() {
+
+ @Mock
+ private lateinit var walletClient: QuickAccessWalletClient
+ @Mock
+ private lateinit var controlsController: ControlsController
+ @Mock
+ private lateinit var activityStarter: ActivityStarter
+
+ private lateinit var infoProvider: GlobalActionsInfoProvider
+
+ @Before
+ fun setup() {
+ MockitoAnnotations.initMocks(this)
+ infoProvider = GlobalActionsInfoProvider(
+ context,
+ walletClient,
+ controlsController,
+ activityStarter
+ )
+ }
+
+ @Test
+ fun testAddPanel_doesNothing() {
+ val parent = mock(ViewGroup::class.java)
+ infoProvider.addPanel(context, parent, 1, { })
+ verify(parent, never()).addView(anyObject(), anyInt())
+ }
+
+ @Test
+ fun testShouldShowPanel() {
+ assertThat(infoProvider.shouldShowMessage()).isFalse()
+ }
+}
\ No newline at end of file