Loading packages/SettingsLib/src/com/android/settingslib/devicestate/DeviceStateRotationLockSettingsManager.java +66 −1 Original line number Diff line number Diff line Loading @@ -22,6 +22,7 @@ import static android.provider.Settings.Secure.DEVICE_STATE_ROTATION_LOCK_UNLOCK import android.content.ContentResolver; import android.content.Context; import android.content.res.Resources; import android.database.ContentObserver; import android.os.Handler; import android.os.Looper; Loading @@ -34,7 +35,10 @@ import android.util.SparseIntArray; import com.android.internal.R; import com.android.internal.annotations.VisibleForTesting; import java.util.ArrayList; import java.util.HashSet; import java.util.List; import java.util.Objects; import java.util.Set; /** Loading @@ -48,13 +52,14 @@ public final class DeviceStateRotationLockSettingsManager { private static DeviceStateRotationLockSettingsManager sSingleton; private final String[] mDeviceStateRotationLockDefaults; private final Handler mMainHandler = new Handler(Looper.getMainLooper()); private final Set<DeviceStateRotationLockSettingsListener> mListeners = new HashSet<>(); private final SecureSettings mSecureSettings; private String[] mDeviceStateRotationLockDefaults; private SparseIntArray mDeviceStateRotationLockSettings; private SparseIntArray mDeviceStateRotationLockFallbackSettings; private String mLastSettingValue; private List<SettableDeviceState> mSettableDeviceStates; @VisibleForTesting DeviceStateRotationLockSettingsManager(Context context, SecureSettings secureSettings) { Loading @@ -79,6 +84,12 @@ public final class DeviceStateRotationLockSettingsManager { return sSingleton; } /** Resets the singleton instance of this class. Only used for testing. */ @VisibleForTesting public static synchronized void resetInstance() { sSingleton = null; } /** Returns true if device-state based rotation lock settings are enabled. */ public static boolean isDeviceStateRotationLockEnabled(Context context) { return context.getResources() Loading Loading @@ -186,6 +197,12 @@ public final class DeviceStateRotationLockSettingsManager { return true; } /** Returns a list of device states and their respective auto-rotation setting availability. */ public List<SettableDeviceState> getSettableDeviceStates() { // Returning a copy to make sure that nothing outside can mutate our internal list. return new ArrayList<>(mSettableDeviceStates); } private void initializeInMemoryMap() { String serializedSetting = mSecureSettings.getStringForUser( Loading Loading @@ -220,6 +237,17 @@ public final class DeviceStateRotationLockSettingsManager { } } /** * Resets the state of the class and saved settings back to the default values provided by the * resources config. */ @VisibleForTesting public void resetStateForTesting(Resources resources) { mDeviceStateRotationLockDefaults = resources.getStringArray(R.array.config_perDeviceStateRotationLockDefaults); fallbackOnDefaults(); } private void fallbackOnDefaults() { loadDefaults(); persistSettings(); Loading Loading @@ -259,6 +287,7 @@ public final class DeviceStateRotationLockSettingsManager { } private void loadDefaults() { mSettableDeviceStates = new ArrayList<>(mDeviceStateRotationLockDefaults.length); mDeviceStateRotationLockSettings = new SparseIntArray( mDeviceStateRotationLockDefaults.length); mDeviceStateRotationLockFallbackSettings = new SparseIntArray(1); Loading @@ -279,6 +308,8 @@ public final class DeviceStateRotationLockSettingsManager { + values.length); } } boolean isSettable = rotationLockSetting != DEVICE_STATE_ROTATION_LOCK_IGNORED; mSettableDeviceStates.add(new SettableDeviceState(deviceState, isSettable)); mDeviceStateRotationLockSettings.put(deviceState, rotationLockSetting); } catch (NumberFormatException e) { Log.wtf(TAG, "Error parsing settings entry. Entry was: " + entry, e); Loading Loading @@ -308,4 +339,38 @@ public final class DeviceStateRotationLockSettingsManager { /** Called whenever the settings have changed. */ void onSettingsChanged(); } /** Represents a device state and whether it has an auto-rotation setting. */ public static class SettableDeviceState { private final int mDeviceState; private final boolean mIsSettable; SettableDeviceState(int deviceState, boolean isSettable) { mDeviceState = deviceState; mIsSettable = isSettable; } /** Returns the device state associated with this object. */ public int getDeviceState() { return mDeviceState; } /** Returns whether there is an auto-rotation setting for this device state. */ public boolean isSettable() { return mIsSettable; } @Override public boolean equals(Object o) { if (this == o) return true; if (!(o instanceof SettableDeviceState)) return false; SettableDeviceState that = (SettableDeviceState) o; return mDeviceState == that.mDeviceState && mIsSettable == that.mIsSettable; } @Override public int hashCode() { return Objects.hash(mDeviceState, mIsSettable); } } } packages/SettingsLib/tests/integ/src/com/android/settingslib/devicestate/DeviceStateRotationLockSettingsManagerTest.java +23 −0 Original line number Diff line number Diff line Loading @@ -30,12 +30,17 @@ import androidx.test.InstrumentationRegistry; import androidx.test.filters.SmallTest; import androidx.test.runner.AndroidJUnit4; import com.android.internal.R; import com.android.settingslib.devicestate.DeviceStateRotationLockSettingsManager.SettableDeviceState; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.Mock; import org.mockito.MockitoAnnotations; import java.util.List; @SmallTest @RunWith(AndroidJUnit4.class) public class DeviceStateRotationLockSettingsManagerTest { Loading Loading @@ -94,4 +99,22 @@ public class DeviceStateRotationLockSettingsManagerTest { assertThat(mNumSettingsChanges).isEqualTo(3); } @Test public void getSettableDeviceStates_returnsExpectedValuesInOriginalOrder() { when(mMockResources.getStringArray( R.array.config_perDeviceStateRotationLockDefaults)).thenReturn( new String[]{"2:2", "4:0", "1:1", "0:0"}); List<SettableDeviceState> settableDeviceStates = DeviceStateRotationLockSettingsManager.getInstance( mMockContext).getSettableDeviceStates(); assertThat(settableDeviceStates).containsExactly( new SettableDeviceState(/* deviceState= */ 2, /* isSettable= */ true), new SettableDeviceState(/* deviceState= */ 4, /* isSettable= */ false), new SettableDeviceState(/* deviceState= */ 1, /* isSettable= */ true), new SettableDeviceState(/* deviceState= */ 0, /* isSettable= */ false) ).inOrder(); } } Loading
packages/SettingsLib/src/com/android/settingslib/devicestate/DeviceStateRotationLockSettingsManager.java +66 −1 Original line number Diff line number Diff line Loading @@ -22,6 +22,7 @@ import static android.provider.Settings.Secure.DEVICE_STATE_ROTATION_LOCK_UNLOCK import android.content.ContentResolver; import android.content.Context; import android.content.res.Resources; import android.database.ContentObserver; import android.os.Handler; import android.os.Looper; Loading @@ -34,7 +35,10 @@ import android.util.SparseIntArray; import com.android.internal.R; import com.android.internal.annotations.VisibleForTesting; import java.util.ArrayList; import java.util.HashSet; import java.util.List; import java.util.Objects; import java.util.Set; /** Loading @@ -48,13 +52,14 @@ public final class DeviceStateRotationLockSettingsManager { private static DeviceStateRotationLockSettingsManager sSingleton; private final String[] mDeviceStateRotationLockDefaults; private final Handler mMainHandler = new Handler(Looper.getMainLooper()); private final Set<DeviceStateRotationLockSettingsListener> mListeners = new HashSet<>(); private final SecureSettings mSecureSettings; private String[] mDeviceStateRotationLockDefaults; private SparseIntArray mDeviceStateRotationLockSettings; private SparseIntArray mDeviceStateRotationLockFallbackSettings; private String mLastSettingValue; private List<SettableDeviceState> mSettableDeviceStates; @VisibleForTesting DeviceStateRotationLockSettingsManager(Context context, SecureSettings secureSettings) { Loading @@ -79,6 +84,12 @@ public final class DeviceStateRotationLockSettingsManager { return sSingleton; } /** Resets the singleton instance of this class. Only used for testing. */ @VisibleForTesting public static synchronized void resetInstance() { sSingleton = null; } /** Returns true if device-state based rotation lock settings are enabled. */ public static boolean isDeviceStateRotationLockEnabled(Context context) { return context.getResources() Loading Loading @@ -186,6 +197,12 @@ public final class DeviceStateRotationLockSettingsManager { return true; } /** Returns a list of device states and their respective auto-rotation setting availability. */ public List<SettableDeviceState> getSettableDeviceStates() { // Returning a copy to make sure that nothing outside can mutate our internal list. return new ArrayList<>(mSettableDeviceStates); } private void initializeInMemoryMap() { String serializedSetting = mSecureSettings.getStringForUser( Loading Loading @@ -220,6 +237,17 @@ public final class DeviceStateRotationLockSettingsManager { } } /** * Resets the state of the class and saved settings back to the default values provided by the * resources config. */ @VisibleForTesting public void resetStateForTesting(Resources resources) { mDeviceStateRotationLockDefaults = resources.getStringArray(R.array.config_perDeviceStateRotationLockDefaults); fallbackOnDefaults(); } private void fallbackOnDefaults() { loadDefaults(); persistSettings(); Loading Loading @@ -259,6 +287,7 @@ public final class DeviceStateRotationLockSettingsManager { } private void loadDefaults() { mSettableDeviceStates = new ArrayList<>(mDeviceStateRotationLockDefaults.length); mDeviceStateRotationLockSettings = new SparseIntArray( mDeviceStateRotationLockDefaults.length); mDeviceStateRotationLockFallbackSettings = new SparseIntArray(1); Loading @@ -279,6 +308,8 @@ public final class DeviceStateRotationLockSettingsManager { + values.length); } } boolean isSettable = rotationLockSetting != DEVICE_STATE_ROTATION_LOCK_IGNORED; mSettableDeviceStates.add(new SettableDeviceState(deviceState, isSettable)); mDeviceStateRotationLockSettings.put(deviceState, rotationLockSetting); } catch (NumberFormatException e) { Log.wtf(TAG, "Error parsing settings entry. Entry was: " + entry, e); Loading Loading @@ -308,4 +339,38 @@ public final class DeviceStateRotationLockSettingsManager { /** Called whenever the settings have changed. */ void onSettingsChanged(); } /** Represents a device state and whether it has an auto-rotation setting. */ public static class SettableDeviceState { private final int mDeviceState; private final boolean mIsSettable; SettableDeviceState(int deviceState, boolean isSettable) { mDeviceState = deviceState; mIsSettable = isSettable; } /** Returns the device state associated with this object. */ public int getDeviceState() { return mDeviceState; } /** Returns whether there is an auto-rotation setting for this device state. */ public boolean isSettable() { return mIsSettable; } @Override public boolean equals(Object o) { if (this == o) return true; if (!(o instanceof SettableDeviceState)) return false; SettableDeviceState that = (SettableDeviceState) o; return mDeviceState == that.mDeviceState && mIsSettable == that.mIsSettable; } @Override public int hashCode() { return Objects.hash(mDeviceState, mIsSettable); } } }
packages/SettingsLib/tests/integ/src/com/android/settingslib/devicestate/DeviceStateRotationLockSettingsManagerTest.java +23 −0 Original line number Diff line number Diff line Loading @@ -30,12 +30,17 @@ import androidx.test.InstrumentationRegistry; import androidx.test.filters.SmallTest; import androidx.test.runner.AndroidJUnit4; import com.android.internal.R; import com.android.settingslib.devicestate.DeviceStateRotationLockSettingsManager.SettableDeviceState; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.Mock; import org.mockito.MockitoAnnotations; import java.util.List; @SmallTest @RunWith(AndroidJUnit4.class) public class DeviceStateRotationLockSettingsManagerTest { Loading Loading @@ -94,4 +99,22 @@ public class DeviceStateRotationLockSettingsManagerTest { assertThat(mNumSettingsChanges).isEqualTo(3); } @Test public void getSettableDeviceStates_returnsExpectedValuesInOriginalOrder() { when(mMockResources.getStringArray( R.array.config_perDeviceStateRotationLockDefaults)).thenReturn( new String[]{"2:2", "4:0", "1:1", "0:0"}); List<SettableDeviceState> settableDeviceStates = DeviceStateRotationLockSettingsManager.getInstance( mMockContext).getSettableDeviceStates(); assertThat(settableDeviceStates).containsExactly( new SettableDeviceState(/* deviceState= */ 2, /* isSettable= */ true), new SettableDeviceState(/* deviceState= */ 4, /* isSettable= */ false), new SettableDeviceState(/* deviceState= */ 1, /* isSettable= */ true), new SettableDeviceState(/* deviceState= */ 0, /* isSettable= */ false) ).inOrder(); } }