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

Commit 41ec2bc8 authored by Gary Jian's avatar Gary Jian Committed by Automerger Merge Worker
Browse files

Merge "Add a developer option to controll mockmodemservice permission" am: 78b2b241

Original change: https://android-review.googlesource.com/c/platform/packages/apps/Settings/+/2026223

Change-Id: Ia08609cddc63034e3f9d02f64727d92fe9e2348f
parents 285952a8 78b2b241
Loading
Loading
Loading
Loading
+5 −0
Original line number Diff line number Diff line
@@ -13169,6 +13169,11 @@
    <!-- Summary for allowing screen overlays on Settings app. [CHAR LIMIT=NONE]-->
    <string name="overlay_settings_summary">Allow apps that can display over other apps to overlay Settings screens</string>
    <!-- Developer settings: Title for allowing mock modem service for testing. [CHAR LIMIT=50]-->
    <string name="allow_mock_modem">Allow Mock Modem</string>
    <!-- Developer settings: Summary for allowing mock modem service. [CHAR LIMIT=NONE]-->
    <string name="allow_mock_modem_summary">Allow this device to run Mock Modem service for instrumentation testing. Do not enable this during normal usage of the phone</string>
    <!-- Title for media control settings [CHAR LIMIT=50]-->
    <string name="media_controls_title">Media</string>
    <!-- Title of toggle to enable or disable the media resumption feature in quick settings [CHAR LIMIT=50]-->
+5 −0
Original line number Diff line number Diff line
@@ -246,6 +246,11 @@
            android:title="@string/force_high_refresh_rate_toggle"
            android:summary="@string/force_high_refresh_rate_desc" />

        <SwitchPreference
            android:key="allow_mock_modem"
            android:title="@string/allow_mock_modem"
            android:summary="@string/allow_mock_modem_summary" />

    </PreferenceCategory>

    <PreferenceCategory
+1 −0
Original line number Diff line number Diff line
@@ -511,6 +511,7 @@ public class DevelopmentSettingsDashboardFragment extends RestrictedDashboardFra
        controllers.add(new BugReportInPowerPreferenceController(context));
        controllers.add(new AutomaticSystemServerHeapDumpPreferenceController(context));
        controllers.add(new MockLocationAppPreferenceController(context, fragment));
        controllers.add(new MockModemPreferenceController(context));
        controllers.add(new DebugViewAttributesPreferenceController(context));
        controllers.add(new SelectDebugAppPreferenceController(context, fragment));
        controllers.add(new WaitForDebuggerPreferenceController(context));
+86 −0
Original line number Diff line number Diff line
/*
 * Copyright (C) 2022 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.settings.development;

import android.content.Context;
import android.os.SystemProperties;
import android.util.Log;

import androidx.annotation.VisibleForTesting;
import androidx.preference.Preference;
import androidx.preference.SwitchPreference;

import com.android.settings.core.PreferenceControllerMixin;
import com.android.settingslib.development.DeveloperOptionsPreferenceController;

/**
 * PreferenceController for MockModem
 */
public class MockModemPreferenceController extends
        DeveloperOptionsPreferenceController implements Preference.OnPreferenceChangeListener,
        PreferenceControllerMixin {

    private static final String TAG = "MockModemPreferenceController";
    private static final String ALLOW_MOCK_MODEM_KEY =
            "allow_mock_modem";
    @VisibleForTesting
    static final String ALLOW_MOCK_MODEM_PROPERTY =
            "persist.radio.allow_mock_modem";

    public MockModemPreferenceController(Context context) {
        super(context);
    }

    @Override
    public String getPreferenceKey() {
        return ALLOW_MOCK_MODEM_KEY;
    }

    @Override
    public boolean onPreferenceChange(Preference preference, Object newValue) {
        final boolean isEnabled = (Boolean) newValue;
        try {
            SystemProperties.set(ALLOW_MOCK_MODEM_PROPERTY,
                    isEnabled ? "true" : "false");
        } catch (RuntimeException e) {
            Log.e(TAG, "Fail to set radio system property: " + e.getMessage());
        }
        return true;
    }

    @Override
    public void updateState(Preference preference) {
        try {
            final boolean isEnabled = SystemProperties.getBoolean(
                    ALLOW_MOCK_MODEM_PROPERTY, false /* default */);
            ((SwitchPreference) mPreference).setChecked(isEnabled);
        } catch (RuntimeException e) {
            Log.e(TAG, "Fail to get radio system property: " + e.getMessage());
        }
    }

    @Override
    protected void onDeveloperOptionsSwitchDisabled() {
        super.onDeveloperOptionsSwitchDisabled();
        try {
            SystemProperties.set(ALLOW_MOCK_MODEM_PROPERTY, "false");
            ((SwitchPreference) mPreference).setChecked(false);
        } catch (RuntimeException e) {
            Log.e(TAG, "Fail to set radio system property: " + e.getMessage());
        }
    }
}
+111 −0
Original line number Diff line number Diff line
/*
 * Copyright (C) 2022 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.settings.development;

import static com.android.settings.development.MockModemPreferenceController
        .ALLOW_MOCK_MODEM_PROPERTY;

import static com.google.common.truth.Truth.assertThat;

import android.content.Context;
import android.os.Looper;
import android.os.SystemProperties;

import androidx.preference.PreferenceManager;
import androidx.preference.PreferenceScreen;
import androidx.preference.SwitchPreference;
import androidx.test.core.app.ApplicationProvider;
import androidx.test.ext.junit.runners.AndroidJUnit4;

import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;

@RunWith(AndroidJUnit4.class)
public class MockModemPreferenceControllerTest {

    private Context mContext;
    private MockModemPreferenceController mController;
    private SwitchPreference mPreference;

    @Before
    public void setUp() {
        mContext = ApplicationProvider.getApplicationContext();
        mController = new MockModemPreferenceController(mContext);
        if (Looper.myLooper() == null) {
            Looper.prepare();
        }

        final PreferenceManager preferenceManager = new PreferenceManager(mContext);
        final PreferenceScreen screen = preferenceManager.createPreferenceScreen(mContext);
        mPreference = new SwitchPreference(mContext);
        mPreference.setKey(mController.getPreferenceKey());
        screen.addPreference(mPreference);
        mController.displayPreference(screen);
    }

    @Test
    public void onPreferenceChanged_settingDisabled_shouldNotAllowedMockModem() {
        mController.onPreferenceChange(mPreference, false /* new value */);

        final boolean mode = SystemProperties.getBoolean(
                ALLOW_MOCK_MODEM_PROPERTY, false /* default */);

        assertThat(mode).isFalse();
    }

    @Test
    public void onPreferenceChanged_settingEnabled_shouldAllowMockModem() {
        mController.onPreferenceChange(mPreference, true /* new value */);

        final boolean mode = SystemProperties.getBoolean(
                ALLOW_MOCK_MODEM_PROPERTY, false /* default */);

        assertThat(mode).isTrue();
    }

    @Test
    public void updateState_settingEnabled_preferenceShouldBeChecked() {
        SystemProperties.set(ALLOW_MOCK_MODEM_PROPERTY,
                Boolean.toString(true));

        mController.updateState(mPreference);
        assertThat(mPreference.isChecked()).isTrue();
    }

    @Test
    public void updateState_settingDisabled_preferenceShouldNotBeChecked() {
        SystemProperties.set(ALLOW_MOCK_MODEM_PROPERTY,
                Boolean.toString(false));

        mController.updateState(mPreference);
        assertThat(mPreference.isChecked()).isFalse();
    }

    @Test
    public void onDeveloperOptionsDisabled_shouldDisablePreference() {
        mController.onDeveloperOptionsSwitchDisabled();
        final boolean mode = SystemProperties.getBoolean(
                ALLOW_MOCK_MODEM_PROPERTY,
                false /* default */);

        mController.updateState(mPreference);

        assertThat(mode).isFalse();
        assertThat(mPreference.isChecked()).isFalse();
    }
}