Merge "Show chevron on DndTile if it'd show dialog" into sc-v2-dev am: 635a90d46a

Original change: https://googleplex-android-review.googlesource.com/c/platform/frameworks/base/+/16263949

Change-Id: I400bf0a42ad01dcf1a950e3d95c71b4deb92dec6
This commit is contained in:
Fabian Kozynski
2021-11-16 15:58:56 +00:00
committed by Automerger Merge Worker
3 changed files with 190 additions and 9 deletions

View File

@@ -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) {

View File

@@ -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

View File

@@ -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()
}
}