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

Commit 6da958a9 authored by Fan Zhang's avatar Fan Zhang
Browse files

Move dev option restriction check from app to controller.

Dev option is not supposed to show up when there is a user restriction.
However the restriction is sometimes not applied universally. So let's
move the check into controller and avoid handling this logic ad-hoc.

Change-Id: Iab85c90a7c43330abb66bf63dc4c70fb69bc3757
Fixes: 72815875
Test: robotest
parent c65eb444
Loading
Loading
Loading
Loading
+10 −2
Original line number Diff line number Diff line
@@ -19,6 +19,7 @@ package com.android.settingslib.development;
import android.content.Context;
import android.content.Intent;
import android.os.Build;
import android.os.UserManager;
import android.provider.Settings;
import android.support.v4.content.LocalBroadcastManager;

@@ -27,7 +28,8 @@ public class DevelopmentSettingsEnabler {
    public static final String DEVELOPMENT_SETTINGS_CHANGED_ACTION =
            "com.android.settingslib.development.DevelopmentSettingsEnabler.SETTINGS_CHANGED";

    private DevelopmentSettingsEnabler() {}
    private DevelopmentSettingsEnabler() {
    }

    public static void setDevelopmentSettingsEnabled(Context context, boolean enable) {
        Settings.Global.putInt(context.getContentResolver(),
@@ -37,8 +39,14 @@ public class DevelopmentSettingsEnabler {
    }

    public static boolean isDevelopmentSettingsEnabled(Context context) {
        return Settings.Global.getInt(context.getContentResolver(),
        final UserManager um = (UserManager) context.getSystemService(Context.USER_SERVICE);
        final boolean settingEnabled = Settings.Global.getInt(context.getContentResolver(),
                Settings.Global.DEVELOPMENT_SETTINGS_ENABLED,
                Build.TYPE.equals("eng") ? 1 : 0) != 0;
        final boolean hasRestriction = um.hasUserRestriction(
                UserManager.DISALLOW_DEBUGGING_FEATURES);
        final boolean isAdmin = um.isAdminUser();

        return isAdmin && !hasRestriction && settingEnabled;
    }
}
+22 −3
Original line number Diff line number Diff line
@@ -23,7 +23,9 @@ import android.provider.Settings;

import com.android.settingslib.SettingsLibRobolectricTestRunner;
import com.android.settingslib.TestConfig;
import com.android.settingslib.testutils.shadow.ShadowUserManager;

import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
@@ -31,7 +33,9 @@ import org.robolectric.RuntimeEnvironment;
import org.robolectric.annotation.Config;

@RunWith(SettingsLibRobolectricTestRunner.class)
@Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION)
@Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION, shadows = {
        ShadowUserManager.class
})
public class DevelopmentSettingsEnablerTest {

    private Context mContext;
@@ -39,10 +43,16 @@ public class DevelopmentSettingsEnablerTest {
    @Before
    public void setUp() {
        mContext = RuntimeEnvironment.application;
        ShadowUserManager.getShadow().setIsAdminUser(true);
    }

    @After
    public void tearDown() {
        ShadowUserManager.getShadow().reset();
    }

    @Test
    public void testEnabling() {
    public void isEnabled_settingsOn_noRestriction_isAdmin_shouldReturnTrue() {
        Settings.Global.putInt(mContext.getContentResolver(),
                Settings.Global.DEVELOPMENT_SETTINGS_ENABLED, 0);

@@ -54,7 +64,7 @@ public class DevelopmentSettingsEnablerTest {
    }

    @Test
    public void testDisabling() {
    public void isEnabled_settingsOff_noRestriction_isAdmin_shouldReturnFalse() {
        Settings.Global.putInt(mContext.getContentResolver(),
                Settings.Global.DEVELOPMENT_SETTINGS_ENABLED, 1);

@@ -64,4 +74,13 @@ public class DevelopmentSettingsEnablerTest {

        assertThat(DevelopmentSettingsEnabler.isDevelopmentSettingsEnabled(mContext)).isFalse();
    }

    @Test
    public void isEnabled_settingsOn_noRestriction_notAdmin_shouldReturnFalse() {
        Settings.Global.putInt(mContext.getContentResolver(),
                Settings.Global.DEVELOPMENT_SETTINGS_ENABLED, 1);
        ShadowUserManager.getShadow().setIsAdminUser(false);

        assertThat(DevelopmentSettingsEnabler.isDevelopmentSettingsEnabled(mContext)).isFalse();
    }
}
+56 −0
Original line number Diff line number Diff line
/*
 * Copyright (C) 2018 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.settingslib.testutils.shadow;

import android.content.Context;
import android.os.UserManager;

import org.robolectric.RuntimeEnvironment;
import org.robolectric.annotation.Implementation;
import org.robolectric.annotation.Implements;
import org.robolectric.annotation.Resetter;
import org.robolectric.shadow.api.Shadow;

@Implements(UserManager.class)
public class ShadowUserManager extends org.robolectric.shadows.ShadowUserManager {

    private boolean mAdminUser;

    public void setIsAdminUser(boolean isAdminUser) {
        mAdminUser = isAdminUser;
    }

    @Resetter
    public void reset() {
        mAdminUser = false;
    }

    @Implementation
    public boolean isAdminUser() {
        return mAdminUser;
    }

    @Implementation
    public static UserManager get(Context context) {
        return (UserManager) context.getSystemService(Context.USER_SERVICE);
    }

    public static ShadowUserManager getShadow() {
        return (ShadowUserManager) Shadow.extract(
                RuntimeEnvironment.application.getSystemService(UserManager.class));
    }
}
 No newline at end of file