Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 44cd068b authored by Dave Mankoff's avatar Dave Mankoff
Browse files

Introduce SettingsProx in place of Settings.

This introduces SecureSettings, GlobalSettings, and SystemSettings
that are instantiable classes that proxy calls through to the static
methods of Settings.Secure, Settings.Global, and Settings.System.

This allows instances to be mocked and faked in tests. This also
removes any concern of changing shared settings between tests.

This also addes registerContentObserver and unregisterContentObserver
to these classes as a convenient way of unifying access to settings.
Previously, settings were read and written via static methods, but
changes to settings were observeed through ContentResolver, an
entirely separate class.

An example refactor using these new utilities is shown in
DozeTriggers.

Fixes: 159904757
Test: atest SystemUITests && manual
Change-Id: I3a907c2066de427676472769e212fe58cd38cf69
parent 0a7fd66f
Loading
Loading
Loading
Loading
+3 −1
Original line number Diff line number Diff line
@@ -45,6 +45,7 @@ import com.android.systemui.statusbar.policy.HeadsUpManager;
import com.android.systemui.util.concurrency.ConcurrencyModule;
import com.android.systemui.util.sensors.AsyncSensorManager;
import com.android.systemui.util.sensors.SensorModule;
import com.android.systemui.util.settings.SettingsUtilModule;
import com.android.systemui.util.time.SystemClock;
import com.android.systemui.util.time.SystemClockImpl;

@@ -65,7 +66,8 @@ import dagger.Provides;
            LogModule.class,
            PeopleHubModule.class,
            SensorModule.class,
            SettingsModule.class
            SettingsModule.class,
            SettingsUtilModule.class
        },
        subcomponents = {StatusBarComponent.class,
                NotificationRowComponent.class,
+8 −9
Original line number Diff line number Diff line
@@ -21,7 +21,6 @@ import static com.android.systemui.plugins.SensorManagerPlugin.Sensor.TYPE_WAKE_

import android.annotation.AnyThread;
import android.app.ActivityManager;
import android.content.ContentResolver;
import android.content.Context;
import android.database.ContentObserver;
import android.hardware.Sensor;
@@ -49,6 +48,7 @@ import com.android.systemui.plugins.SensorManagerPlugin;
import com.android.systemui.statusbar.phone.DozeParameters;
import com.android.systemui.util.sensors.AsyncSensorManager;
import com.android.systemui.util.sensors.ProximitySensor;
import com.android.systemui.util.settings.SecureSettings;
import com.android.systemui.util.wakelock.WakeLock;

import java.io.PrintWriter;
@@ -64,10 +64,10 @@ public class DozeSensors {

    private final Context mContext;
    private final AsyncSensorManager mSensorManager;
    private final ContentResolver mResolver;
    private final AmbientDisplayConfiguration mConfig;
    private final WakeLock mWakeLock;
    private final Consumer<Boolean> mProxCallback;
    private final SecureSettings mSecureSettings;
    private final Callback mCallback;
    @VisibleForTesting
    protected TriggerSensor[] mSensors;
@@ -98,13 +98,13 @@ public class DozeSensors {
    DozeSensors(Context context, AsyncSensorManager sensorManager,
            DozeParameters dozeParameters, AmbientDisplayConfiguration config, WakeLock wakeLock,
            Callback callback, Consumer<Boolean> proxCallback, DozeLog dozeLog,
            ProximitySensor proximitySensor) {
            ProximitySensor proximitySensor, SecureSettings secureSettings) {
        mContext = context;
        mSensorManager = sensorManager;
        mConfig = config;
        mWakeLock = wakeLock;
        mProxCallback = proxCallback;
        mResolver = mContext.getContentResolver();
        mSecureSettings = secureSettings;
        mCallback = callback;
        mProximitySensor = proximitySensor;

@@ -241,7 +241,7 @@ public class DozeSensors {
        }

        if (!anyListening) {
            mResolver.unregisterContentObserver(mSettingsObserver);
            mSecureSettings.unregisterContentObserver(mSettingsObserver);
        } else if (!mSettingRegistered) {
            for (TriggerSensor s : mSensors) {
                s.registerSettingsObserver(mSettingsObserver);
@@ -400,7 +400,7 @@ public class DozeSensors {
            } else if (TextUtils.isEmpty(mSetting)) {
                return true;
            }
            return Settings.Secure.getIntForUser(mResolver, mSetting, mSettingDefault ? 1 : 0,
            return mSecureSettings.getIntForUser(mSetting, mSettingDefault ? 1 : 0,
                    UserHandle.USER_CURRENT) != 0;
        }

@@ -444,9 +444,8 @@ public class DozeSensors {

        public void registerSettingsObserver(ContentObserver settingsObserver) {
            if (mConfigured && !TextUtils.isEmpty(mSetting)) {
                mResolver.registerContentObserver(
                        Settings.Secure.getUriFor(mSetting), false /* descendants */,
                        mSettingsObserver, UserHandle.USER_ALL);
                mSecureSettings.registerContentObserverForUser(
                        mSetting, mSettingsObserver, UserHandle.USER_ALL);
            }
        }

+5 −2
Original line number Diff line number Diff line
@@ -46,6 +46,7 @@ import com.android.systemui.statusbar.phone.DozeParameters;
import com.android.systemui.util.Assert;
import com.android.systemui.util.sensors.AsyncSensorManager;
import com.android.systemui.util.sensors.ProximitySensor;
import com.android.systemui.util.settings.SecureSettings;
import com.android.systemui.util.wakelock.WakeLock;

import java.io.PrintWriter;
@@ -163,7 +164,8 @@ public class DozeTriggers implements DozeMachine.Part {
            DozeParameters dozeParameters, AsyncSensorManager sensorManager,
            WakeLock wakeLock, DockManager dockManager,
            ProximitySensor proximitySensor, ProximitySensor.ProximityCheck proxCheck,
            DozeLog dozeLog, BroadcastDispatcher broadcastDispatcher) {
            DozeLog dozeLog, BroadcastDispatcher broadcastDispatcher,
            SecureSettings secureSettings) {
        mContext = context;
        mDozeHost = dozeHost;
        mConfig = config;
@@ -172,7 +174,8 @@ public class DozeTriggers implements DozeMachine.Part {
        mWakeLock = wakeLock;
        mAllowPulseTriggers = true;
        mDozeSensors = new DozeSensors(context, mSensorManager, dozeParameters,
                config, wakeLock, this::onSensor, this::onProximityFar, dozeLog, proximitySensor);
                config, wakeLock, this::onSensor, this::onProximityFar, dozeLog, proximitySensor,
                secureSettings);
        mUiModeManager = mContext.getSystemService(UiModeManager.class);
        mDockManager = dockManager;
        mProxCheck = proxCheck;
+25 −0
Original line number Diff line number Diff line
/*
 * Copyright (C) 2020 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.util.settings;

/**
 * Public interface that can be injected to interact with Settings.Global.
 *
 * See {@link SettingsProxy} for details.
 */
public interface GlobalSettings extends SettingsProxy {
}
+70 −0
Original line number Diff line number Diff line
/*
 * Copyright (C) 2020 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.util.settings;

import android.content.ContentResolver;
import android.net.Uri;
import android.provider.Settings;

import javax.inject.Inject;

class GlobalSettingsImpl implements GlobalSettings {
    private final ContentResolver mContentResolver;

    @Inject
    GlobalSettingsImpl(ContentResolver contentResolver) {
        mContentResolver = contentResolver;
    }

    @Override
    public ContentResolver getContentResolver() {
        return mContentResolver;
    }

    @Override
    public Uri getUriFor(String name) {
        return Settings.Global.getUriFor(name);
    }

    @Override
    public String getStringForUser(String name, int userHandle) {
        return Settings.Global.getStringForUser(mContentResolver, name, userHandle);
    }

    @Override
    public boolean putString(String name, String value, boolean overrideableByRestore) {
        throw new UnsupportedOperationException(
                "This method only exists publicly for Settings.System and Settings.Secure");
    }

    @Override
    public boolean putStringForUser(String name, String value, int userHandle) {
        return Settings.Global.putStringForUser(mContentResolver, name, value, userHandle);
    }

    @Override
    public boolean putStringForUser(String name, String value, String tag, boolean makeDefault,
            int userHandle, boolean overrideableByRestore) {
        return Settings.Global.putStringForUser(
                mContentResolver, name, value, tag, makeDefault, userHandle, overrideableByRestore);
    }

    @Override
    public boolean putString(String name, String value, String tag, boolean makeDefault) {
        return Settings.Global.putString(mContentResolver, name, value, tag, makeDefault);
    }
}
Loading