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