2/ Do not access SettingProvider in test code

- Refactor OneHandedSettingsUtil.java
- Remove redundant test for SettingProvider

New policy: b/175024829
Settings key: <one_handed_*> is not readable.
From S+, new public settings keys need to be annotated
with @Readable unless they are annotated with @hide.

Recent changes :
ag/13764747 Remove @Readable for hidden fields added in S

Test: atest WMShellUnitTests
Bug: 183064974
Change-Id: I85bf3680cbcdba4c85aa96de058bc85cfabead46
This commit is contained in:
Bill Lin
2021-03-18 17:55:22 +08:00
parent 3be701e767
commit 8a612f73e2
5 changed files with 69 additions and 64 deletions

View File

@@ -73,6 +73,7 @@ public class OneHandedController {
private final Context mContext;
private final DisplayController mDisplayController;
private final OneHandedGestureHandler mGestureHandler;
private final OneHandedSettingsUtil mOneHandedSettingsUtil;
private final OneHandedTimeoutHandler mTimeoutHandler;
private final OneHandedTouchHandler mTouchHandler;
private final OneHandedTutorialHandler mTutorialHandler;
@@ -108,8 +109,12 @@ public class OneHandedController {
new AccessibilityManager.AccessibilityStateChangeListener() {
@Override
public void onAccessibilityStateChanged(boolean enabled) {
if (mOneHandedSettingsUtil == null) {
Slog.w(TAG, "mOneHandedSettingsUtil may not instantiate yet");
return;
}
if (enabled) {
final int mOneHandedTimeout = OneHandedSettingsUtil
final int mOneHandedTimeout = mOneHandedSettingsUtil
.getSettingsOneHandedModeTimeout(mContext.getContentResolver());
final int timeout = mAccessibilityManager
.getRecommendedTimeoutMillis(mOneHandedTimeout * 1000
@@ -117,7 +122,7 @@ public class OneHandedController {
AccessibilityManager.FLAG_CONTENT_CONTROLS);
mTimeoutHandler.setTimeout(timeout / 1000);
} else {
mTimeoutHandler.setTimeout(OneHandedSettingsUtil
mTimeoutHandler.setTimeout(mOneHandedSettingsUtil
.getSettingsOneHandedModeTimeout(mContext.getContentResolver()));
}
}
@@ -166,13 +171,14 @@ public class OneHandedController {
OneHandedDisplayAreaOrganizer organizer = new OneHandedDisplayAreaOrganizer(
context, windowManager, animationController, tutorialHandler,
oneHandedBackgroundPanelOrganizer, mainExecutor);
OneHandedSettingsUtil settingsUtil = new OneHandedSettingsUtil();
OneHandedUiEventLogger oneHandedUiEventsLogger = new OneHandedUiEventLogger(uiEventLogger);
IOverlayManager overlayManager = IOverlayManager.Stub.asInterface(
ServiceManager.getService(Context.OVERLAY_SERVICE));
return new OneHandedController(context, windowManager, displayController,
oneHandedBackgroundPanelOrganizer, organizer, touchHandler, tutorialHandler,
gestureHandler, timeoutHandler, oneHandedUiEventsLogger, overlayManager,
taskStackListener, mainExecutor, mainHandler);
gestureHandler, settingsUtil, timeoutHandler, oneHandedUiEventsLogger,
overlayManager, taskStackListener, mainExecutor, mainHandler);
}
@VisibleForTesting
@@ -184,6 +190,7 @@ public class OneHandedController {
OneHandedTouchHandler touchHandler,
OneHandedTutorialHandler tutorialHandler,
OneHandedGestureHandler gestureHandler,
OneHandedSettingsUtil settingsUtil,
OneHandedTimeoutHandler timeoutHandler,
OneHandedUiEventLogger uiEventsLogger,
IOverlayManager overlayManager,
@@ -191,6 +198,7 @@ public class OneHandedController {
ShellExecutor mainExecutor,
Handler mainHandler) {
mContext = context;
mOneHandedSettingsUtil = settingsUtil;
mWindowManager = windowManager;
mBackgroundPanelOrganizer = backgroundPanelOrganizer;
mDisplayAreaOrganizer = displayAreaOrganizer;
@@ -209,10 +217,10 @@ public class OneHandedController {
final int sysPropPercentageConfig = SystemProperties.getInt(
ONE_HANDED_MODE_OFFSET_PERCENTAGE, Math.round(offsetPercentageConfig * 100.0f));
mOffSetFraction = sysPropPercentageConfig / 100.0f;
mIsOneHandedEnabled = OneHandedSettingsUtil.getSettingsOneHandedModeEnabled(
mIsOneHandedEnabled = mOneHandedSettingsUtil.getSettingsOneHandedModeEnabled(
context.getContentResolver());
mIsSwipeToNotificationEnabled =
OneHandedSettingsUtil.getSettingsSwipeToNotificationEnabled(
mOneHandedSettingsUtil.getSettingsSwipeToNotificationEnabled(
context.getContentResolver());
mTimeoutHandler = timeoutHandler;
@@ -325,25 +333,25 @@ public class OneHandedController {
}
private void setupSettingObservers() {
OneHandedSettingsUtil.registerSettingsKeyObserver(Settings.Secure.ONE_HANDED_MODE_ENABLED,
mOneHandedSettingsUtil.registerSettingsKeyObserver(Settings.Secure.ONE_HANDED_MODE_ENABLED,
mContext.getContentResolver(), mEnabledObserver);
OneHandedSettingsUtil.registerSettingsKeyObserver(Settings.Secure.ONE_HANDED_MODE_TIMEOUT,
mOneHandedSettingsUtil.registerSettingsKeyObserver(Settings.Secure.ONE_HANDED_MODE_TIMEOUT,
mContext.getContentResolver(), mTimeoutObserver);
OneHandedSettingsUtil.registerSettingsKeyObserver(Settings.Secure.TAPS_APP_TO_EXIT,
mOneHandedSettingsUtil.registerSettingsKeyObserver(Settings.Secure.TAPS_APP_TO_EXIT,
mContext.getContentResolver(), mTaskChangeExitObserver);
OneHandedSettingsUtil.registerSettingsKeyObserver(
mOneHandedSettingsUtil.registerSettingsKeyObserver(
Settings.Secure.SWIPE_BOTTOM_TO_NOTIFICATION_ENABLED,
mContext.getContentResolver(), mSwipeToNotificationEnabledObserver);
}
private void updateSettings() {
setOneHandedEnabled(OneHandedSettingsUtil
setOneHandedEnabled(mOneHandedSettingsUtil
.getSettingsOneHandedModeEnabled(mContext.getContentResolver()));
mTimeoutHandler.setTimeout(OneHandedSettingsUtil
mTimeoutHandler.setTimeout(mOneHandedSettingsUtil
.getSettingsOneHandedModeTimeout(mContext.getContentResolver()));
setTaskChangeToExit(OneHandedSettingsUtil
setTaskChangeToExit(mOneHandedSettingsUtil
.getSettingsTapsAppToExit(mContext.getContentResolver()));
setSwipeToNotificationEnabled(OneHandedSettingsUtil
setSwipeToNotificationEnabled(mOneHandedSettingsUtil
.getSettingsSwipeToNotificationEnabled(mContext.getContentResolver()));
}
@@ -358,7 +366,7 @@ public class OneHandedController {
@VisibleForTesting
void onEnabledSettingChanged() {
final boolean enabled = OneHandedSettingsUtil.getSettingsOneHandedModeEnabled(
final boolean enabled = mOneHandedSettingsUtil.getSettingsOneHandedModeEnabled(
mContext.getContentResolver());
mOneHandedUiEventLogger.writeEvent(enabled
? OneHandedUiEventLogger.EVENT_ONE_HANDED_SETTINGS_ENABLED_ON
@@ -368,13 +376,13 @@ public class OneHandedController {
// Also checks swipe to notification settings since they all need gesture overlay.
setEnabledGesturalOverlay(
enabled || OneHandedSettingsUtil.getSettingsSwipeToNotificationEnabled(
enabled || mOneHandedSettingsUtil.getSettingsSwipeToNotificationEnabled(
mContext.getContentResolver()));
}
@VisibleForTesting
void onTimeoutSettingChanged() {
final int newTimeout = OneHandedSettingsUtil.getSettingsOneHandedModeTimeout(
final int newTimeout = mOneHandedSettingsUtil.getSettingsOneHandedModeTimeout(
mContext.getContentResolver());
int metricsId = OneHandedUiEventLogger.OneHandedSettingsTogglesEvent.INVALID.getId();
switch (newTimeout) {
@@ -403,7 +411,7 @@ public class OneHandedController {
@VisibleForTesting
void onTaskChangeExitSettingChanged() {
final boolean enabled = OneHandedSettingsUtil.getSettingsTapsAppToExit(
final boolean enabled = mOneHandedSettingsUtil.getSettingsTapsAppToExit(
mContext.getContentResolver());
mOneHandedUiEventLogger.writeEvent(enabled
? OneHandedUiEventLogger.EVENT_ONE_HANDED_SETTINGS_APP_TAPS_EXIT_ON
@@ -415,13 +423,13 @@ public class OneHandedController {
@VisibleForTesting
void onSwipeToNotificationEnabledSettingChanged() {
final boolean enabled =
OneHandedSettingsUtil.getSettingsSwipeToNotificationEnabled(
mOneHandedSettingsUtil.getSettingsSwipeToNotificationEnabled(
mContext.getContentResolver());
setSwipeToNotificationEnabled(enabled);
// Also checks one handed mode settings since they all need gesture overlay.
setEnabledGesturalOverlay(
enabled || OneHandedSettingsUtil.getSettingsOneHandedModeEnabled(
enabled || mOneHandedSettingsUtil.getSettingsOneHandedModeEnabled(
mContext.getContentResolver()));
}
@@ -480,7 +488,8 @@ public class OneHandedController {
}
private void setupGesturalOverlay() {
if (!OneHandedSettingsUtil.getSettingsOneHandedModeEnabled(mContext.getContentResolver())) {
if (!mOneHandedSettingsUtil.getSettingsOneHandedModeEnabled(
mContext.getContentResolver())) {
return;
}
@@ -551,7 +560,7 @@ public class OneHandedController {
mTutorialHandler.dump(pw);
}
OneHandedSettingsUtil.dump(pw, innerPrefix, mContext.getContentResolver());
mOneHandedSettingsUtil.dump(pw, innerPrefix, mContext.getContentResolver());
if (mOverlayManager != null) {
OverlayInfo info = null;

View File

@@ -67,7 +67,7 @@ public final class OneHandedSettingsUtil {
* @param observer Observer from caller
* @return uri key for observing
*/
public static Uri registerSettingsKeyObserver(String key, ContentResolver resolver,
public Uri registerSettingsKeyObserver(String key, ContentResolver resolver,
ContentObserver observer) {
Uri uriKey = null;
uriKey = Settings.Secure.getUriFor(key);
@@ -83,7 +83,7 @@ public final class OneHandedSettingsUtil {
* @param resolver ContentResolver of context
* @param observer preference key change observer
*/
public static void unregisterSettingsKeyObserver(ContentResolver resolver,
public void unregisterSettingsKeyObserver(ContentResolver resolver,
ContentObserver observer) {
if (resolver != null) {
resolver.unregisterContentObserver(observer);
@@ -95,7 +95,7 @@ public final class OneHandedSettingsUtil {
*
* @return enable or disable one handed mode flag.
*/
public static boolean getSettingsOneHandedModeEnabled(ContentResolver resolver) {
public boolean getSettingsOneHandedModeEnabled(ContentResolver resolver) {
return Settings.Secure.getInt(resolver,
Settings.Secure.ONE_HANDED_MODE_ENABLED, 0 /* Disabled */) == 1;
}
@@ -105,7 +105,7 @@ public final class OneHandedSettingsUtil {
*
* @return enable or disable taps app exit.
*/
public static boolean getSettingsTapsAppToExit(ContentResolver resolver) {
public boolean getSettingsTapsAppToExit(ContentResolver resolver) {
return Settings.Secure.getInt(resolver,
Settings.Secure.TAPS_APP_TO_EXIT, 0) == 1;
}
@@ -116,7 +116,7 @@ public final class OneHandedSettingsUtil {
*
* @return timeout value in seconds.
*/
public static @OneHandedTimeout int getSettingsOneHandedModeTimeout(ContentResolver resolver) {
public @OneHandedTimeout int getSettingsOneHandedModeTimeout(ContentResolver resolver) {
return Settings.Secure.getInt(resolver,
Settings.Secure.ONE_HANDED_MODE_TIMEOUT, ONE_HANDED_TIMEOUT_MEDIUM_IN_SECONDS);
}
@@ -124,12 +124,12 @@ public final class OneHandedSettingsUtil {
/**
* Returns whether swipe bottom to notification gesture enabled or not.
*/
public static boolean getSettingsSwipeToNotificationEnabled(ContentResolver resolver) {
public boolean getSettingsSwipeToNotificationEnabled(ContentResolver resolver) {
return Settings.Secure.getInt(resolver,
Settings.Secure.SWIPE_BOTTOM_TO_NOTIFICATION_ENABLED, 1) == 1;
}
protected static void dump(PrintWriter pw, String prefix, ContentResolver resolver) {
void dump(PrintWriter pw, String prefix, ContentResolver resolver) {
final String innerPrefix = prefix + " ";
pw.println(prefix + TAG);
pw.print(innerPrefix + "isOneHandedModeEnable=");
@@ -139,6 +139,6 @@ public final class OneHandedSettingsUtil {
pw.print(innerPrefix + "tapsAppToExit=");
pw.println(getSettingsTapsAppToExit(resolver));
}
private OneHandedSettingsUtil() {}
public OneHandedSettingsUtil() {
}
}

View File

@@ -66,6 +66,8 @@ public class OneHandedControllerTest extends OneHandedTestCase {
@Mock
OneHandedGestureHandler mMockGestureHandler;
@Mock
OneHandedSettingsUtil mMockSettingsUitl;
@Mock
OneHandedUiEventLogger mMockUiEventLogger;
@Mock
IOverlayManager mMockOverlayManager;
@@ -78,6 +80,7 @@ public class OneHandedControllerTest extends OneHandedTestCase {
@Mock
Handler mMockShellMainHandler;
final boolean mDefaultEnabled = true;
final boolean mDefaultSwipeToNotificationEnabled = false;
final boolean mDefaultTapAppToExitEnabled = true;
@@ -91,6 +94,14 @@ public class OneHandedControllerTest extends OneHandedTestCase {
when(mMockDisplayAreaOrganizer.isInOneHanded()).thenReturn(false);
when(mMockDisplayAreaOrganizer.getDisplayAreaTokenMap()).thenReturn(new ArrayMap<>());
when(mMockBackgroundOrganizer.getBackgroundSurface()).thenReturn(mMockLeash);
when(mMockSettingsUitl.getSettingsOneHandedModeEnabled(any())).thenReturn(
mDefaultEnabled);
when(mMockSettingsUitl.getSettingsOneHandedModeTimeout(any())).thenReturn(
OneHandedSettingsUtil.ONE_HANDED_TIMEOUT_MEDIUM_IN_SECONDS);
when(mMockSettingsUitl.getSettingsTapsAppToExit(any())).thenReturn(
mDefaultTapAppToExitEnabled);
when(mMockSettingsUitl.getSettingsSwipeToNotificationEnabled(any())).thenReturn(
mDefaultSwipeToNotificationEnabled);
mSpiedOneHandedController = spy(new OneHandedController(
mContext,
@@ -101,6 +112,7 @@ public class OneHandedControllerTest extends OneHandedTestCase {
mMockTouchHandler,
mMockTutorialHandler,
mMockGestureHandler,
mMockSettingsUitl,
mSpiedTimeoutHandler,
mMockUiEventLogger,
mMockOverlayManager,

View File

@@ -16,12 +16,11 @@
package com.android.wm.shell.onehanded;
import static com.google.common.truth.Truth.assertThat;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.Mockito.verify;
import android.content.ContentResolver;
import android.database.ContentObserver;
import android.net.Uri;
import android.provider.Settings;
import android.testing.AndroidTestingRunner;
import androidx.test.filters.SmallTest;
@@ -29,48 +28,30 @@ import androidx.test.filters.SmallTest;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
@SmallTest
@RunWith(AndroidTestingRunner.class)
public class OneHandedSettingsUtilTest extends OneHandedTestCase {
ContentResolver mContentResolver;
ContentObserver mContentObserver;
boolean mOnChanged;
OneHandedSettingsUtil mSettingsUtil;
@Mock
ContentResolver mMockContentResolver;
@Mock
ContentObserver mMockContentObserver;
@Before
public void setUp() {
mContentResolver = mContext.getContentResolver();
mContentObserver = new ContentObserver(mContext.getMainThreadHandler()) {
@Override
public void onChange(boolean selfChange) {
super.onChange(selfChange);
mOnChanged = true;
}
};
}
MockitoAnnotations.initMocks(this);
@Test
public void testRegisterSecureKeyObserver() {
final Uri result = OneHandedSettingsUtil.registerSettingsKeyObserver(
Settings.Secure.TAPS_APP_TO_EXIT, mContentResolver, mContentObserver);
assertThat(result).isNotNull();
OneHandedSettingsUtil.registerSettingsKeyObserver(
Settings.Secure.TAPS_APP_TO_EXIT, mContentResolver, mContentObserver);
mSettingsUtil = new OneHandedSettingsUtil();
}
@Test
public void testUnregisterSecureKeyObserver() {
OneHandedSettingsUtil.registerSettingsKeyObserver(
Settings.Secure.TAPS_APP_TO_EXIT, mContentResolver, mContentObserver);
OneHandedSettingsUtil.unregisterSettingsKeyObserver(mContentResolver, mContentObserver);
mSettingsUtil.unregisterSettingsKeyObserver(mMockContentResolver, mMockContentObserver);
assertThat(mOnChanged).isFalse();
Settings.Secure.putInt(mContext.getContentResolver(),
Settings.Secure.TAPS_APP_TO_EXIT, 0);
assertThat(mOnChanged).isFalse();
verify(mMockContentResolver).unregisterContentObserver(any());
}
}

View File

@@ -64,6 +64,8 @@ public class OneHandedTutorialHandlerTest extends OneHandedTestCase {
Handler mMockShellMainHandler;
@Mock
OneHandedUiEventLogger mMockUiEventLogger;
@Mock
OneHandedSettingsUtil mMockSettingsUtil;
@Before
public void setUp() {
@@ -80,6 +82,7 @@ public class OneHandedTutorialHandlerTest extends OneHandedTestCase {
mMockTouchHandler,
mMockTutorialHandler,
mMockGestureHandler,
mMockSettingsUtil,
mTimeoutHandler,
mMockUiEventLogger,
mMockOverlayManager,