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

Commit 78922b8a authored by Jeffrey Huang's avatar Jeffrey Huang Committed by Android (Google) Code Review
Browse files

Merge "Introduce BugReportInPowerPreferenceControllerV2"

parents ac8a3f24 abda723c
Loading
Loading
Loading
Loading
+11 −7
Original line number Diff line number Diff line
@@ -28,6 +28,10 @@ import android.support.v7.preference.PreferenceScreen;
import com.android.settings.core.PreferenceControllerMixin;
import com.android.settingslib.core.AbstractPreferenceController;

/**
 * deprecated in favor of {@link BugReportInPowerPreferenceControllerV2}
 */
@Deprecated
public class BugReportInPowerPreferenceController extends AbstractPreferenceController
        implements PreferenceControllerMixin {

+106 −0
Original line number Diff line number Diff line
/*
 * Copyright (C) 2017 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.ComponentName;
import android.content.Context;
import android.content.pm.PackageManager;
import android.os.UserManager;
import android.provider.Settings;
import android.support.annotation.VisibleForTesting;
import android.support.v14.preference.SwitchPreference;
import android.support.v7.preference.Preference;
import android.support.v7.preference.PreferenceScreen;

import com.android.settingslib.wrapper.PackageManagerWrapper;

public class BugReportInPowerPreferenceControllerV2 extends
        DeveloperOptionsPreferenceController implements Preference.OnPreferenceChangeListener {

    private static final String KEY_BUGREPORT_IN_POWER = "bugreport_in_power";

    @VisibleForTesting
    static final ComponentName COMPONENT_NAME = new ComponentName("com.android.shell",
            "com.android.shell.BugreportStorageProvider");
    @VisibleForTesting
    static int SETTING_VALUE_ON = 1;
    @VisibleForTesting
    static int SETTING_VALUE_OFF = 0;

    private final PackageManagerWrapper mPackageManager;
    private final UserManager mUserManager;
    private SwitchPreference mPreference;

    public BugReportInPowerPreferenceControllerV2(Context context) {
        super(context);
        mUserManager = (UserManager) context.getSystemService(Context.USER_SERVICE);
        mPackageManager = new PackageManagerWrapper(context.getPackageManager());
    }

    @Override
    public boolean isAvailable() {
        return !mUserManager.hasUserRestriction(UserManager.DISALLOW_DEBUGGING_FEATURES);
    }

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

    @Override
    public void displayPreference(PreferenceScreen screen) {
        super.displayPreference(screen);

        mPreference = (SwitchPreference) screen.findPreference(KEY_BUGREPORT_IN_POWER);
    }

    @Override
    public boolean onPreferenceChange(Preference preference, Object newValue) {
        final boolean isEnabled = (Boolean) newValue;
        Settings.Secure.putInt(mContext.getContentResolver(),
                Settings.Global.BUGREPORT_IN_POWER_MENU,
                isEnabled ? SETTING_VALUE_ON : SETTING_VALUE_OFF);
        setBugreportStorageProviderStatus(isEnabled);
        return true;
    }

    @Override
    public void updateState(Preference preference) {
        final int mode = Settings.Secure.getInt(mContext.getContentResolver(),
                Settings.Global.BUGREPORT_IN_POWER_MENU, SETTING_VALUE_OFF);
        mPreference.setChecked(mode != SETTING_VALUE_OFF);
    }

    @Override
    protected void onDeveloperOptionsSwitchEnabled() {
        // no-op because this preference can never be disabled
    }

    @Override
    protected void onDeveloperOptionsSwitchDisabled() {
        Settings.Secure.putInt(mContext.getContentResolver(),
                Settings.Global.BUGREPORT_IN_POWER_MENU, SETTING_VALUE_OFF);
        setBugreportStorageProviderStatus(false);
        mPreference.setChecked(false);
    }

    private void setBugreportStorageProviderStatus(boolean isEnabled) {
        mPackageManager.setComponentEnabledSetting(COMPONENT_NAME,
                isEnabled ? PackageManager.COMPONENT_ENABLED_STATE_ENABLED
                        : PackageManager.COMPONENT_ENABLED_STATE_DEFAULT, 0 /* flags */);
    }
}
+1 −1
Original line number Diff line number Diff line
@@ -254,7 +254,7 @@ public class DevelopmentSettingsDashboardFragment extends RestrictedDashboardFra
        controllers.add(new AdbPreferenceController(context, fragment));
        // revoke usb debugging authorizations
        controllers.add(new LocalTerminalPreferenceController(context));
        // bug report shortcut
        controllers.add(new BugReportInPowerPreferenceControllerV2(context));
        // select mock location app
        controllers.add(new DebugViewAttributesPreferenceController(context));
        controllers.add(new SelectDebugAppPreferenceController(context, fragment));
+4 −0
Original line number Diff line number Diff line
@@ -47,6 +47,10 @@ import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;

/**
 * deprecated in favor of {@link BugReportInPowerPreferenceControllerV2}
 */
@Deprecated
@RunWith(SettingsRobolectricTestRunner.class)
@Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION)
public class BugReportInPowerPreferenceControllerTest {
+174 −0
Original line number Diff line number Diff line
/*
 * Copyright (C) 2016 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
        .BugReportInPowerPreferenceControllerV2.COMPONENT_NAME;
import static com.android.settings.development
        .BugReportInPowerPreferenceControllerV2.SETTING_VALUE_OFF;
import static com.android.settings.development
        .BugReportInPowerPreferenceControllerV2.SETTING_VALUE_ON;

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

import static org.mockito.Matchers.anyString;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;

import android.content.ContentResolver;
import android.content.Context;
import android.content.pm.PackageManager;
import android.os.UserManager;
import android.provider.Settings;
import android.support.v14.preference.SwitchPreference;
import android.support.v7.preference.PreferenceScreen;

import com.android.settings.TestConfig;
import com.android.settings.testutils.SettingsRobolectricTestRunner;
import com.android.settingslib.wrapper.PackageManagerWrapper;

import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
import org.robolectric.RuntimeEnvironment;
import org.robolectric.annotation.Config;
import org.robolectric.util.ReflectionHelpers;


@RunWith(SettingsRobolectricTestRunner.class)
@Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION)
public class BugReportInPowerPreferenceControllerV2Test {

    @Mock
    private PreferenceScreen mScreen;
    @Mock
    private UserManager mUserManager;
    @Mock
    private PackageManagerWrapper mPackageManager;
    @Mock
    private Context mContext;
    @Mock
    private SwitchPreference mPreference;

    private ContentResolver mContentResolver;
    private BugReportInPowerPreferenceControllerV2 mController;

    @Before
    public void setUp() {
        MockitoAnnotations.initMocks(this);
        mContentResolver = RuntimeEnvironment.application.getContentResolver();
        when(mContext.getContentResolver()).thenReturn(mContentResolver);
        when(mContext.getSystemService(Context.USER_SERVICE)).thenReturn(mUserManager);
        mController = new BugReportInPowerPreferenceControllerV2(mContext);
        when(mScreen.findPreference(mController.getPreferenceKey())).thenReturn(mPreference);
        ReflectionHelpers.setField(mController, "mPackageManager", mPackageManager);
    }

    @Test
    public void isAvailable_hasDebugRestriction_shouldReturnFalse() {
        when(mUserManager.hasUserRestriction(anyString())).thenReturn(true);

        assertThat(mController.isAvailable()).isFalse();
    }

    @Test
    public void isAvailable_noDebugRestriction_shouldReturnTrue() {
        when(mUserManager.hasUserRestriction(anyString())).thenReturn(false);

        assertThat(mController.isAvailable()).isTrue();
    }

    @Test
    public void onDeveloperOptionsSwitchDisabled_preferenceShouldNotBeChecked() {
        when(mUserManager.hasUserRestriction(anyString())).thenReturn(false);
        mController.displayPreference(mScreen);

        mController.onDeveloperOptionsSwitchDisabled();

        verify(mPreference).setChecked(false);
    }

    @Test
    public void onPreferenceChanged_settingDisabled_shouldDisableBugReportInPowerSetting() {
        when(mUserManager.hasUserRestriction(anyString())).thenReturn(false);
        mController.displayPreference(mScreen);

        mController.onPreferenceChange(mPreference, false /* new value */);
        int mode = Settings.Secure.getInt(mContext.getContentResolver(),
                Settings.Global.BUGREPORT_IN_POWER_MENU, -1 /* default */);

        assertThat(mode).isEqualTo(SETTING_VALUE_OFF);
        verify(mPackageManager).setComponentEnabledSetting(COMPONENT_NAME,
                PackageManager.COMPONENT_ENABLED_STATE_DEFAULT, 0 /* flags */);
    }

    @Test
    public void onPreferenceChanged_settingEnabled_shouldEnableBugReportInPowerSetting() {
        when(mUserManager.hasUserRestriction(anyString())).thenReturn(false);
        mController.displayPreference(mScreen);

        mController.onPreferenceChange(mPreference, true /* new value */);
        int mode = Settings.Secure.getInt(mContext.getContentResolver(),
                Settings.Global.BUGREPORT_IN_POWER_MENU, -1 /* default */);

        assertThat(mode).isEqualTo(SETTING_VALUE_ON);
        verify(mPackageManager).setComponentEnabledSetting(COMPONENT_NAME,
                PackageManager.COMPONENT_ENABLED_STATE_ENABLED, 0 /* flags */);
    }


    @Test
    public void updateState_settingsOn_preferenceShouldBeChecked() {
        when(mUserManager.hasUserRestriction(anyString())).thenReturn(false);
        Settings.Secure.putInt(mContext.getContentResolver(),
                Settings.Global.BUGREPORT_IN_POWER_MENU, SETTING_VALUE_ON);
        mController.displayPreference(mScreen);

        mController.updateState(mPreference);

        verify(mPreference).setChecked(true);
    }

    @Test
    public void updateState_settingsOff_preferenceShouldNotBeChecked() {
        when(mUserManager.hasUserRestriction(anyString())).thenReturn(false);
        Settings.Secure.putInt(mContext.getContentResolver(),
                Settings.Global.BUGREPORT_IN_POWER_MENU, SETTING_VALUE_OFF);
        mController.displayPreference(mScreen);

        mController.updateState(mPreference);

        verify(mPreference).setChecked(false);
    }

    @Test
    public void onDeveloperOptionsSwitchDisabled_shouldTurnOffPreference() {
        when(mUserManager.hasUserRestriction(anyString())).thenReturn(false);
        mController.displayPreference(mScreen);

        mController.onDeveloperOptionsSwitchDisabled();
        int mode = Settings.Secure.getInt(mContext.getContentResolver(),
                Settings.Global.BUGREPORT_IN_POWER_MENU, -1 /* default */);

        assertThat(mode).isEqualTo(SETTING_VALUE_OFF);
        verify(mPreference).setChecked(false);
        verify(mPackageManager).setComponentEnabledSetting(COMPONENT_NAME,
                PackageManager.COMPONENT_ENABLED_STATE_DEFAULT, 0 /* flags */);
    }
}