summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Fabian Kozynski <kozynski@google.com> 2021-11-16 15:46:00 +0000
committer Android (Google) Code Review <android-gerrit@google.com> 2021-11-16 15:46:00 +0000
commit635a90d46a2f35347e1d61e9efee9e67ca88778c (patch)
tree32d163f010a4b360409a9dc8bc52f31efd8e463d
parent7ff3fe9ca518cecbce37bebf67b0388c9f345cad (diff)
parenta04e56ce7415e45752a08f8e280696299c569401 (diff)
Merge "Show chevron on DndTile if it'd show dialog" into sc-v2-dev
-rw-r--r--packages/SystemUI/src/com/android/systemui/qs/SecureSetting.java13
-rw-r--r--packages/SystemUI/src/com/android/systemui/qs/tiles/DndTile.java36
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/qs/tiles/DndTileTest.kt150
3 files changed, 190 insertions, 9 deletions
diff --git a/packages/SystemUI/src/com/android/systemui/qs/SecureSetting.java b/packages/SystemUI/src/com/android/systemui/qs/SecureSetting.java
index 8aa2d09459e5..d2bc38edd337 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/SecureSetting.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/SecureSetting.java
@@ -54,19 +54,23 @@ public abstract class SecureSetting extends ContentObserver implements Listenabl
}
public int getValue() {
- return mSecureSettings.getIntForUser(mSettingName, mDefaultValue, mUserId);
+ return mListening ? mObservedValue : getValueFromProvider();
}
public void setValue(int value) {
mSecureSettings.putIntForUser(mSettingName, value, mUserId);
}
+ private int getValueFromProvider() {
+ return mSecureSettings.getIntForUser(mSettingName, mDefaultValue, mUserId);
+ }
+
@Override
public void setListening(boolean listening) {
if (listening == mListening) return;
mListening = listening;
if (listening) {
- mObservedValue = getValue();
+ mObservedValue = getValueFromProvider();
mSecureSettings.registerContentObserverForUser(
mSecureSettings.getUriFor(mSettingName), false, this, mUserId);
} else {
@@ -77,9 +81,10 @@ public abstract class SecureSetting extends ContentObserver implements Listenabl
@Override
public void onChange(boolean selfChange) {
- final int value = getValue();
- handleValueChanged(value, value != mObservedValue);
+ final int value = getValueFromProvider();
+ final boolean changed = value != mObservedValue;
mObservedValue = value;
+ handleValueChanged(value, changed);
}
public void setUserId(int userId) {
diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/DndTile.java b/packages/SystemUI/src/com/android/systemui/qs/tiles/DndTile.java
index e896c7ca87e6..b1cd68e5185c 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/tiles/DndTile.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/DndTile.java
@@ -61,10 +61,12 @@ import com.android.systemui.plugins.qs.DetailAdapter;
import com.android.systemui.plugins.qs.QSTile.BooleanState;
import com.android.systemui.plugins.statusbar.StatusBarStateController;
import com.android.systemui.qs.QSHost;
+import com.android.systemui.qs.SecureSetting;
import com.android.systemui.qs.logging.QSLogger;
import com.android.systemui.qs.tileimpl.QSTileImpl;
import com.android.systemui.statusbar.phone.SystemUIDialog;
import com.android.systemui.statusbar.policy.ZenModeController;
+import com.android.systemui.util.settings.SecureSettings;
import com.android.systemui.volume.ZenModePanel;
import javax.inject.Inject;
@@ -81,6 +83,7 @@ public class DndTile extends QSTileImpl<BooleanState> {
private final ZenModeController mController;
private final DndDetailAdapter mDetailAdapter;
private final SharedPreferences mSharedPreferences;
+ private final SecureSetting mSettingZenDuration;
private boolean mListening;
private boolean mShowingDetail;
@@ -96,7 +99,8 @@ public class DndTile extends QSTileImpl<BooleanState> {
ActivityStarter activityStarter,
QSLogger qsLogger,
ZenModeController zenModeController,
- @Main SharedPreferences sharedPreferences
+ @Main SharedPreferences sharedPreferences,
+ SecureSettings secureSettings
) {
super(host, backgroundLooper, mainHandler, falsingManager, metricsLogger,
statusBarStateController, activityStarter, qsLogger);
@@ -104,8 +108,17 @@ public class DndTile extends QSTileImpl<BooleanState> {
mSharedPreferences = sharedPreferences;
mDetailAdapter = new DndDetailAdapter();
mController.observe(getLifecycle(), mZenCallback);
+ mSettingZenDuration = new SecureSetting(secureSettings, mUiHandler,
+ Settings.Secure.ZEN_DURATION, getHost().getUserId()) {
+ @Override
+ protected void handleValueChanged(int value, boolean observedChange) {
+ refreshState();
+ }
+ };
}
+
+
public static void setVisible(Context context, boolean visible) {
Prefs.putBoolean(context, Prefs.Key.DND_TILE_VISIBLE, visible);
}
@@ -144,14 +157,18 @@ public class DndTile extends QSTileImpl<BooleanState> {
if (mState.value) {
mController.setZen(ZEN_MODE_OFF, null, TAG);
} else {
- showDetail(true);
+ enableZenMode(view);
}
}
@Override
- public void showDetail(boolean show) {
- int zenDuration = Settings.Secure.getInt(mContext.getContentResolver(),
- Settings.Secure.ZEN_DURATION, 0);
+ protected void handleUserSwitch(int newUserId) {
+ super.handleUserSwitch(newUserId);
+ mSettingZenDuration.setUserId(newUserId);
+ }
+
+ private void enableZenMode(@Nullable View view) {
+ int zenDuration = mSettingZenDuration.getValue();
boolean showOnboarding = Settings.Secure.getInt(mContext.getContentResolver(),
Settings.Secure.SHOW_ZEN_UPGRADE_NOTIFICATION, 0) != 0
&& Settings.Secure.getInt(mContext.getContentResolver(),
@@ -270,6 +287,8 @@ public class DndTile extends QSTileImpl<BooleanState> {
state.dualLabelContentDescription = mContext.getResources().getString(
R.string.accessibility_quick_settings_open_settings, getTileLabel());
state.expandedAccessibilityClassName = Switch.class.getName();
+ state.forceExpandIcon =
+ mSettingZenDuration.getValue() == Settings.Secure.ZEN_DURATION_PROMPT;
}
@Override
@@ -296,6 +315,13 @@ public class DndTile extends QSTileImpl<BooleanState> {
} else {
Prefs.unregisterListener(mContext, mPrefListener);
}
+ mSettingZenDuration.setListening(listening);
+ }
+
+ @Override
+ protected void handleDestroy() {
+ super.handleDestroy();
+ mSettingZenDuration.setListening(false);
}
@Override
diff --git a/packages/SystemUI/tests/src/com/android/systemui/qs/tiles/DndTileTest.kt b/packages/SystemUI/tests/src/com/android/systemui/qs/tiles/DndTileTest.kt
new file mode 100644
index 000000000000..f99703e2415d
--- /dev/null
+++ b/packages/SystemUI/tests/src/com/android/systemui/qs/tiles/DndTileTest.kt
@@ -0,0 +1,150 @@
+/*
+ * 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.qs.tiles
+
+import android.content.ContextWrapper
+import android.content.SharedPreferences
+import android.os.Handler
+import android.provider.Settings
+import android.testing.AndroidTestingRunner
+import android.testing.TestableLooper
+import androidx.test.filters.SmallTest
+import com.android.internal.logging.MetricsLogger
+import com.android.internal.logging.UiEventLogger
+import com.android.systemui.SysuiTestCase
+import com.android.systemui.classifier.FalsingManagerFake
+import com.android.systemui.plugins.ActivityStarter
+import com.android.systemui.plugins.statusbar.StatusBarStateController
+import com.android.systemui.qs.QSHost
+import com.android.systemui.qs.logging.QSLogger
+import com.android.systemui.statusbar.policy.ZenModeController
+import com.android.systemui.util.settings.FakeSettings
+import com.android.systemui.util.settings.SecureSettings
+import com.google.common.truth.Truth.assertThat
+import org.junit.After
+import org.junit.Before
+import org.junit.Test
+import org.junit.runner.RunWith
+import org.mockito.Mock
+import org.mockito.Mockito
+import org.mockito.MockitoAnnotations
+import java.io.File
+
+@SmallTest
+@RunWith(AndroidTestingRunner::class)
+@TestableLooper.RunWithLooper(setAsMainLooper = true)
+class DndTileTest : SysuiTestCase() {
+
+ companion object {
+ private const val DEFAULT_USER = 0
+ private const val KEY = Settings.Secure.ZEN_DURATION
+ }
+
+ @Mock
+ private lateinit var qsHost: QSHost
+ @Mock
+ private lateinit var metricsLogger: MetricsLogger
+ @Mock
+ private lateinit var statusBarStateController: StatusBarStateController
+ @Mock
+ private lateinit var activityStarter: ActivityStarter
+ @Mock
+ private lateinit var qsLogger: QSLogger
+ @Mock
+ private lateinit var uiEventLogger: UiEventLogger
+ @Mock
+ private lateinit var zenModeController: ZenModeController
+ @Mock
+ private lateinit var sharedPreferences: SharedPreferences
+
+ private lateinit var secureSettings: SecureSettings
+ private lateinit var testableLooper: TestableLooper
+ private lateinit var tile: DndTile
+
+ @Before
+ fun setUp() {
+ MockitoAnnotations.initMocks(this)
+ testableLooper = TestableLooper.get(this)
+ secureSettings = FakeSettings()
+
+ Mockito.`when`(qsHost.userId).thenReturn(DEFAULT_USER)
+ Mockito.`when`(qsHost.uiEventLogger).thenReturn(uiEventLogger)
+
+ val wrappedContext = object : ContextWrapper(context) {
+ override fun getSharedPreferences(file: File?, mode: Int): SharedPreferences {
+ return sharedPreferences
+ }
+ }
+ Mockito.`when`(qsHost.context).thenReturn(wrappedContext)
+
+ tile = DndTile(
+ qsHost,
+ testableLooper.looper,
+ Handler(testableLooper.looper),
+ FalsingManagerFake(),
+ metricsLogger,
+ statusBarStateController,
+ activityStarter,
+ qsLogger,
+ zenModeController,
+ sharedPreferences,
+ secureSettings
+ )
+ }
+
+ @After
+ fun tearDown() {
+ tile.handleSetListening(false)
+ }
+
+ @Test
+ fun testForceExpandIcon_durationAskAlways_true() {
+ secureSettings.putIntForUser(KEY, Settings.Secure.ZEN_DURATION_PROMPT, DEFAULT_USER)
+
+ tile.refreshState()
+ testableLooper.processAllMessages()
+
+ assertThat(tile.state.forceExpandIcon).isTrue()
+ }
+
+ @Test
+ fun testForceExpandIcon_durationNotAskAlways_false() {
+ secureSettings.putIntForUser(KEY, 60, DEFAULT_USER)
+
+ tile.refreshState()
+ testableLooper.processAllMessages()
+
+ assertThat(tile.state.forceExpandIcon).isFalse()
+ }
+
+ @Test
+ fun testForceExpandIcon_changeWhileListening() {
+ secureSettings.putIntForUser(KEY, 60, DEFAULT_USER)
+
+ tile.refreshState()
+ testableLooper.processAllMessages()
+
+ assertThat(tile.state.forceExpandIcon).isFalse()
+
+ tile.handleSetListening(true)
+
+ secureSettings.putIntForUser(KEY, Settings.Secure.ZEN_DURATION_PROMPT, DEFAULT_USER)
+ testableLooper.processAllMessages()
+
+ assertThat(tile.state.forceExpandIcon).isTrue()
+ }
+} \ No newline at end of file