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

Commit fb715501 authored by Vishnu Nair's avatar Vishnu Nair
Browse files

Add QS dev tiles to active tiles area when enabling it from dev options

Bug: 73496681
Test: make RunSettingsRoboTests ROBOTEST_FILTER=DevelopmentTilePreferenceControllerTest
Test: flash device and manually test by enabling dev options

Change-Id: Ib7f53128c79de9550d4f68274312e731c01ebd4f
parent 44935e86
Loading
Loading
Loading
Loading
+27 −3
Original line number Diff line number Diff line
@@ -22,17 +22,23 @@ import android.content.Intent;
import android.content.pm.PackageManager;
import android.content.pm.ResolveInfo;
import android.content.pm.ServiceInfo;
import android.os.RemoteException;
import android.os.ServiceManager;
import android.service.quicksettings.TileService;
import android.support.annotation.VisibleForTesting;
import android.support.v14.preference.SwitchPreference;
import android.support.v7.preference.Preference;
import android.support.v7.preference.PreferenceScreen;
import android.util.Log;

import com.android.internal.statusbar.IStatusBarService;
import com.android.settingslib.core.AbstractPreferenceController;

import java.util.List;

public class DevelopmentTilePreferenceController extends AbstractPreferenceController {

    private static final String TAG = "DevTilePrefController";
    private final OnChangeHandler mOnChangeHandler;
    private final PackageManager mPackageManager;

@@ -78,24 +84,42 @@ public class DevelopmentTilePreferenceController extends AbstractPreferenceContr
        }
    }

    private static class OnChangeHandler implements Preference.OnPreferenceChangeListener {
    @VisibleForTesting
    static class OnChangeHandler implements Preference.OnPreferenceChangeListener {

        private final Context mContext;
        private final PackageManager mPackageManager;
        private IStatusBarService mStatusBarService;

        public OnChangeHandler(Context context) {
            mContext = context;
            mPackageManager = context.getPackageManager();
            mStatusBarService = IStatusBarService.Stub.asInterface(
                    ServiceManager.checkService(Context.STATUS_BAR_SERVICE));
        }

        @Override
        public boolean onPreferenceChange(Preference preference, Object newValue) {
            ComponentName cn = new ComponentName(
            boolean enabled = ((Boolean) newValue).booleanValue();
            ComponentName componentName = new ComponentName(
                    mContext.getPackageName(), preference.getKey());
            mPackageManager.setComponentEnabledSetting(cn, (Boolean) newValue
            mPackageManager.setComponentEnabledSetting(componentName, enabled
                            ? PackageManager.COMPONENT_ENABLED_STATE_ENABLED
                            : PackageManager.COMPONENT_ENABLED_STATE_DISABLED,
                    PackageManager.DONT_KILL_APP);

            try {
                if (mStatusBarService != null) {
                    if (enabled) {
                        mStatusBarService.addTile(componentName);
                    } else {
                        mStatusBarService.remTile(componentName);
                    }
                }
            } catch (RemoteException e) {
                Log.e(TAG, "Failed to modify QS tile for component " +
                        componentName.toString(), e);
            }
            return true;
        }
    }
+47 −0
Original line number Diff line number Diff line
@@ -17,19 +17,25 @@
package com.android.settings.development.qstile;

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

import static org.mockito.Matchers.any;
import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;

import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.content.pm.ResolveInfo;
import android.content.pm.ServiceInfo;
import android.os.RemoteException;
import android.service.quicksettings.TileService;
import android.support.v14.preference.SwitchPreference;
import android.support.v7.preference.Preference;
import android.support.v7.preference.PreferenceScreen;

import com.android.internal.statusbar.IStatusBarService;
import com.android.settings.R;
import com.android.settings.TestConfig;
import com.android.settings.testutils.SettingsRobolectricTestRunner;
@@ -37,22 +43,28 @@ import com.android.settings.testutils.SettingsRobolectricTestRunner;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.ArgumentCaptor;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
import org.robolectric.RuntimeEnvironment;
import org.robolectric.Shadows;
import org.robolectric.annotation.Config;
import org.robolectric.shadows.ShadowPackageManager;
import org.robolectric.util.ReflectionHelpers;

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

    private static final String SERVICE_INFO_NAME = "TestName";
    @Mock
    private PreferenceScreen mScreen;
    @Mock
    private IStatusBarService mStatusBarService;
    private Context mContext;
    private DevelopmentTilePreferenceController mController;
    private ShadowPackageManager mShadowPackageManager;
    private DevelopmentTilePreferenceController.OnChangeHandler mOnChangeHandler;

    @Before
    public void setUp() {
@@ -63,6 +75,9 @@ public class DevelopmentTilePreferenceControllerTest {

        mController = new DevelopmentTilePreferenceController(mContext);
        assertThat(mController.getPreferenceKey()).isNull();

        mOnChangeHandler = spy(new DevelopmentTilePreferenceController.OnChangeHandler(mContext));
        ReflectionHelpers.setField(mOnChangeHandler, "mStatusBarService", mStatusBarService);
    }

    @Test
@@ -86,6 +101,38 @@ public class DevelopmentTilePreferenceControllerTest {
        verify(mScreen).addPreference(any(Preference.class));
    }

    @Test
    public void preferenceChecked_shouldAddTile() throws RemoteException {
        SwitchPreference preference = createPreference(/* defaultCheckedState = */ false);
        preference.performClick();

        ArgumentCaptor<ComponentName> argument = ArgumentCaptor.forClass(ComponentName.class);
        verify(mStatusBarService).addTile(argument.capture());
        assertThat(argument.getValue().getClassName()).isEqualTo(SERVICE_INFO_NAME);
        assertThat(argument.getValue().getPackageName()).isEqualTo(mContext.getPackageName());
    }

    @Test
    public void preferenceUnchecked_shouldRemoveTile() throws RemoteException {
        SwitchPreference preference = createPreference(/* defaultCheckedState = */ true);
        preference.performClick();

        ArgumentCaptor<ComponentName> argument = ArgumentCaptor.forClass(ComponentName.class);
        verify(mStatusBarService).remTile(argument.capture());
        assertThat(argument.getValue().getClassName()).isEqualTo(SERVICE_INFO_NAME);
        assertThat(argument.getValue().getPackageName()).isEqualTo(mContext.getPackageName());
    }

    private SwitchPreference createPreference(boolean defaultCheckedState) {
        SwitchPreference preference = new SwitchPreference(mContext);
        preference.setTitle("Test Pref");
        preference.setIcon(R.drawable.ic_settings_24dp);
        preference.setKey(SERVICE_INFO_NAME);
        preference.setChecked(defaultCheckedState);
        preference.setOnPreferenceChangeListener(mOnChangeHandler);
        return preference;
    }

    public static class FakeServiceInfo extends ServiceInfo {

        public String loadLabel(PackageManager mgr) {