Merge "[SettingsLib] Support master switch of inline toggle of Settings Injection v2"

This commit is contained in:
Jason Chiu
2019-11-25 02:36:08 +00:00
committed by Android (Google) Code Review
9 changed files with 171 additions and 36 deletions

View File

@@ -18,6 +18,7 @@ package com.android.settingslib.drawer;
import android.content.Context;
import android.content.Intent;
import android.content.pm.ActivityInfo;
import android.content.pm.ComponentInfo;
import android.content.pm.PackageManager;
import android.content.pm.ResolveInfo;
@@ -33,7 +34,7 @@ import java.util.Objects;
public class ActivityTile extends Tile {
private static final String TAG = "ActivityTile";
public ActivityTile(ComponentInfo info, String category) {
public ActivityTile(ActivityInfo info, String category) {
super(info, category);
setMetaData(info.metaData);
}

View File

@@ -0,0 +1,35 @@
/*
* Copyright (C) 2019 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.drawer;
import android.os.Bundle;
/**
* A controller that manages event for master switch.
*/
public abstract class MasterSwitchController extends SwitchController {
@Override
protected final MetaData getMetaData() {
throw new UnsupportedOperationException();
}
@Override
final Bundle getBundle() {
throw new UnsupportedOperationException();
}
}

View File

@@ -42,10 +42,10 @@ public class ProviderTile extends Tile {
private String mAuthority;
private String mKey;
public ProviderTile(ComponentInfo info, String category, Bundle metaData) {
public ProviderTile(ProviderInfo info, String category, Bundle metaData) {
super(info, category);
setMetaData(metaData);
mAuthority = ((ProviderInfo) info).authority;
mAuthority = info.authority;
mKey = metaData.getString(META_DATA_PREFERENCE_KEYHINT);
}

View File

@@ -108,7 +108,7 @@ public abstract class SwitchController {
Bundle getBundle() {
final MetaData metaData = getMetaData();
if (metaData == null) {
throw new IllegalArgumentException("Should not return null in getMetaData()");
throw new NullPointerException("Should not return null in getMetaData()");
}
final Bundle bundle = metaData.build();

View File

@@ -55,7 +55,7 @@ public abstract class SwitchesProvider extends ContentProvider {
private String mAuthority;
private final Map<String, SwitchController> mControllerMap = new LinkedHashMap<>();
private final List<Bundle> mSwitchList = new ArrayList<>();
private final List<Bundle> mSwitchDataList = new ArrayList<>();
/**
* Get a list of {@link SwitchController} for this provider.
@@ -88,7 +88,9 @@ public abstract class SwitchesProvider extends ContentProvider {
controller.setAuthority(mAuthority);
mControllerMap.put(key, controller);
mSwitchList.add(controller.getBundle());
if (!(controller instanceof MasterSwitchController)) {
mSwitchDataList.add(controller.getBundle());
}
});
return true;
}
@@ -101,7 +103,7 @@ public abstract class SwitchesProvider extends ContentProvider {
: null;
if (TextUtils.isEmpty(key)) {
if (METHOD_GET_SWITCH_DATA.equals(method)) {
bundle.putParcelableList(EXTRA_SWITCH_DATA, mSwitchList);
bundle.putParcelableList(EXTRA_SWITCH_DATA, mSwitchDataList);
return bundle;
}
return null;
@@ -114,7 +116,10 @@ public abstract class SwitchesProvider extends ContentProvider {
switch (method) {
case METHOD_GET_SWITCH_DATA:
return controller.getBundle();
if (!(controller instanceof MasterSwitchController)) {
return controller.getBundle();
}
break;
case METHOD_GET_PROVIDER_ICON:
if (controller instanceof ProviderIcon) {
return ((ProviderIcon) controller).getProviderIcon();

View File

@@ -244,15 +244,15 @@ public class TileUtils {
// TODO: Needs much optimization, too many PM queries going on here.
if (user.getIdentifier() == ActivityManager.getCurrentUser()) {
// Only add Settings for this user.
getTilesForAction(context, user, SETTINGS_ACTION, cache, null, tiles, true);
getTilesForAction(context, user, OPERATOR_SETTINGS, cache,
loadTilesForAction(context, user, SETTINGS_ACTION, cache, null, tiles, true);
loadTilesForAction(context, user, OPERATOR_SETTINGS, cache,
OPERATOR_DEFAULT_CATEGORY, tiles, false);
getTilesForAction(context, user, MANUFACTURER_SETTINGS, cache,
loadTilesForAction(context, user, MANUFACTURER_SETTINGS, cache,
MANUFACTURER_DEFAULT_CATEGORY, tiles, false);
}
if (setup) {
getTilesForAction(context, user, EXTRA_SETTINGS_ACTION, cache, null, tiles, false);
getTilesForAction(context, user, IA_SETTINGS_ACTION, cache, null, tiles, false);
loadTilesForAction(context, user, EXTRA_SETTINGS_ACTION, cache, null, tiles, false);
loadTilesForAction(context, user, IA_SETTINGS_ACTION, cache, null, tiles, false);
}
}
@@ -284,18 +284,18 @@ public class TileUtils {
}
@VisibleForTesting
static void getTilesForAction(Context context,
static void loadTilesForAction(Context context,
UserHandle user, String action, Map<Pair<String, String>, Tile> addedCache,
String defaultCategory, List<Tile> outTiles, boolean requireSettings) {
final Intent intent = new Intent(action);
if (requireSettings) {
intent.setPackage(SETTING_PKG);
}
getActivityTiles(context, user, addedCache, defaultCategory, outTiles, intent);
getProviderTiles(context, user, addedCache, defaultCategory, outTiles, intent);
loadActivityTiles(context, user, addedCache, defaultCategory, outTiles, intent);
loadProviderTiles(context, user, addedCache, defaultCategory, outTiles, intent);
}
private static void getActivityTiles(Context context,
private static void loadActivityTiles(Context context,
UserHandle user, Map<Pair<String, String>, Tile> addedCache,
String defaultCategory, List<Tile> outTiles, Intent intent) {
final PackageManager pm = context.getPackageManager();
@@ -308,11 +308,11 @@ public class TileUtils {
}
final ActivityInfo activityInfo = resolved.activityInfo;
final Bundle metaData = activityInfo.metaData;
getTile(user, addedCache, defaultCategory, outTiles, intent, metaData, activityInfo);
loadTile(user, addedCache, defaultCategory, outTiles, intent, metaData, activityInfo);
}
}
private static void getProviderTiles(Context context,
private static void loadProviderTiles(Context context,
UserHandle user, Map<Pair<String, String>, Tile> addedCache,
String defaultCategory, List<Tile> outTiles, Intent intent) {
final PackageManager pm = context.getPackageManager();
@@ -330,13 +330,13 @@ public class TileUtils {
continue;
}
for (Bundle metaData : switchData) {
getTile(user, addedCache, defaultCategory, outTiles, intent, metaData,
loadTile(user, addedCache, defaultCategory, outTiles, intent, metaData,
providerInfo);
}
}
}
private static void getTile(UserHandle user, Map<Pair<String, String>, Tile> addedCache,
private static void loadTile(UserHandle user, Map<Pair<String, String>, Tile> addedCache,
String defaultCategory, List<Tile> outTiles, Intent intent, Bundle metaData,
ComponentInfo componentInfo) {
String categoryKey = defaultCategory;
@@ -359,8 +359,8 @@ public class TileUtils {
Tile tile = addedCache.get(key);
if (tile == null) {
tile = isProvider
? new ProviderTile(componentInfo, categoryKey, metaData)
: new ActivityTile(componentInfo, categoryKey);
? new ProviderTile((ProviderInfo) componentInfo, categoryKey, metaData)
: new ActivityTile((ActivityInfo) componentInfo, categoryKey);
addedCache.put(key, tile);
} else {
tile.setMetaData(metaData);
@@ -516,7 +516,7 @@ public class TileUtils {
* @param value Boolean associated with the key
* @return Bundle associated with the action, if returned by the content provider
*/
public static Bundle putBooleanToUri(Context context, Uri uri,
public static Bundle putBooleanToUriAndGetResult(Context context, Uri uri,
Map<String, IContentProvider> providerMap, String key, boolean value) {
final Bundle bundle = new Bundle();
bundle.putBoolean(key, value);

View File

@@ -0,0 +1,80 @@
/*
* Copyright (C) 2019 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.drawer;
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.ExpectedException;
import org.junit.runner.RunWith;
import org.robolectric.RobolectricTestRunner;
@RunWith(RobolectricTestRunner.class)
public class MasterSwitchControllerTest {
@Rule
public final ExpectedException thrown = ExpectedException.none();
private MasterSwitchController mController;
@Before
public void setUp() {
mController = new TestMasterSwitchController("123");
}
@Test
public void getMetaData_shouldThrowUnsupportedOperationException() {
thrown.expect(UnsupportedOperationException.class);
mController.getMetaData();
}
@Test
public void getBundle_shouldThrowUnsupportedOperationException() {
thrown.expect(UnsupportedOperationException.class);
mController.getBundle();
}
static class TestMasterSwitchController extends MasterSwitchController {
private String mKey;
TestMasterSwitchController(String key) {
mKey = key;
}
@Override
public String getSwitchKey() {
return mKey;
}
@Override
protected boolean isChecked() {
return true;
}
@Override
protected boolean onCheckedChanged(boolean checked) {
return true;
}
@Override
protected String getErrorMessage(boolean attemptedChecked) {
return null;
}
}
}

View File

@@ -35,6 +35,7 @@ import android.content.Context;
import android.content.pm.ProviderInfo;
import android.os.Bundle;
import com.android.settingslib.drawer.MasterSwitchControllerTest.TestMasterSwitchController;
import com.android.settingslib.drawer.SwitchController.MetaData;
import org.junit.Before;
@@ -84,8 +85,8 @@ public class SwitchesProviderTest {
}
@Test
public void attachInfo_NoMetaDataInController_shouldThrowIllegalArgumentException() {
thrown.expect(IllegalArgumentException.class);
public void attachInfo_NoMetaDataInController_shouldThrowNullPointerException() {
thrown.expect(NullPointerException.class);
final TestSwitchController controller = new TestSwitchController();
controller.setKey("123");
mSwitchesProvider.addSwitchController(controller);
@@ -122,6 +123,19 @@ public class SwitchesProviderTest {
mSwitchesProvider.attachInfo(mContext, mProviderInfo);
}
@Test
public void getSwitchData_shouldNotReturnMasterSwitchData() {
final SwitchController controller = new TestMasterSwitchController("123");
mSwitchesProvider.addSwitchController(controller);
mSwitchesProvider.attachInfo(mContext, mProviderInfo);
final Bundle switchData = mSwitchesProvider.call(METHOD_GET_SWITCH_DATA, "uri" ,
null /* extras*/);
final ArrayList<Bundle> dataList = switchData.getParcelableArrayList(EXTRA_SWITCH_DATA);
assertThat(dataList).isEmpty();
}
@Test
public void getSwitchData_shouldReturnDataList() {
final TestSwitchController controller = new TestSwitchController();

View File

@@ -113,7 +113,7 @@ public class TileUtilsTest {
when(mPackageManager.queryIntentContentProvidersAsUser(any(Intent.class), anyInt(),
anyInt())).thenReturn(info);
TileUtils.getTilesForAction(mContext, UserHandle.CURRENT, IA_SETTINGS_ACTION, addedCache,
TileUtils.loadTilesForAction(mContext, UserHandle.CURRENT, IA_SETTINGS_ACTION, addedCache,
null /* defaultCategory */, outTiles, false /* usePriority */);
assertThat(outTiles).hasSize(2);
@@ -135,7 +135,7 @@ public class TileUtilsTest {
when(mPackageManager.queryIntentContentProvidersAsUser(any(Intent.class), anyInt(),
anyInt())).thenReturn(info);
TileUtils.getTilesForAction(mContext, UserHandle.CURRENT, IA_SETTINGS_ACTION, addedCache,
TileUtils.loadTilesForAction(mContext, UserHandle.CURRENT, IA_SETTINGS_ACTION, addedCache,
null /* defaultCategory */, outTiles, false /* requiresSettings */);
assertThat(outTiles).hasSize(2);
@@ -156,7 +156,7 @@ public class TileUtilsTest {
when(mPackageManager.queryIntentContentProvidersAsUser(any(Intent.class), anyInt(),
anyInt())).thenReturn(info);
TileUtils.getTilesForAction(mContext, UserHandle.CURRENT, IA_SETTINGS_ACTION,
TileUtils.loadTilesForAction(mContext, UserHandle.CURRENT, IA_SETTINGS_ACTION,
addedCache, null /* defaultCategory */, outTiles, false /* requiresSettings */);
assertThat(outTiles).isEmpty();
@@ -197,7 +197,7 @@ public class TileUtilsTest {
when(mPackageManager.queryIntentContentProvidersAsUser(any(Intent.class), anyInt(),
anyInt())).thenReturn(info);
TileUtils.getTilesForAction(mContext, UserHandle.CURRENT, IA_SETTINGS_ACTION, addedCache,
TileUtils.loadTilesForAction(mContext, UserHandle.CURRENT, IA_SETTINGS_ACTION, addedCache,
null /* defaultCategory */, outTiles, false /* usePriority */);
assertThat(outTiles).hasSize(2);
@@ -222,7 +222,7 @@ public class TileUtilsTest {
when(mResources.getString(eq(123)))
.thenReturn("my localized title");
TileUtils.getTilesForAction(mContext, UserHandle.CURRENT, IA_SETTINGS_ACTION, addedCache,
TileUtils.loadTilesForAction(mContext, UserHandle.CURRENT, IA_SETTINGS_ACTION, addedCache,
null /* defaultCategory */, outTiles, false /* usePriority */);
assertThat(outTiles).hasSize(2);
assertThat(outTiles.get(0).getTitle(mContext)).isEqualTo("my localized title");
@@ -245,7 +245,7 @@ public class TileUtilsTest {
when(mPackageManager.queryIntentContentProvidersAsUser(any(Intent.class), anyInt(),
anyInt())).thenReturn(info);
TileUtils.getTilesForAction(mContext, UserHandle.CURRENT, IA_SETTINGS_ACTION, addedCache,
TileUtils.loadTilesForAction(mContext, UserHandle.CURRENT, IA_SETTINGS_ACTION, addedCache,
null /* defaultCategory */, outTiles, false /* usePriority */);
assertThat(outTiles.get(0).isIconTintable(mContext)).isFalse();
@@ -266,7 +266,7 @@ public class TileUtilsTest {
when(mPackageManager.queryIntentActivitiesAsUser(any(Intent.class), anyInt(), anyInt()))
.thenReturn(info);
TileUtils.getTilesForAction(mContext, UserHandle.CURRENT, IA_SETTINGS_ACTION, addedCache,
TileUtils.loadTilesForAction(mContext, UserHandle.CURRENT, IA_SETTINGS_ACTION, addedCache,
null /* defaultCategory */, outTiles, false /* usePriority */);
assertThat(outTiles).hasSize(1);
@@ -276,7 +276,7 @@ public class TileUtilsTest {
resolveInfo.activityInfo.metaData.putInt(META_DATA_PREFERENCE_ICON,
com.android.internal.R.drawable.ic_phone);
outTiles.clear();
TileUtils.getTilesForAction(mContext, UserHandle.CURRENT, IA_SETTINGS_ACTION, addedCache,
TileUtils.loadTilesForAction(mContext, UserHandle.CURRENT, IA_SETTINGS_ACTION, addedCache,
null /* defaultCategory */, outTiles, false /* usePriority */);
assertThat(outTiles).hasSize(1);
@@ -300,7 +300,7 @@ public class TileUtilsTest {
when(mPackageManager.queryIntentContentProvidersAsUser(any(Intent.class), anyInt(),
anyInt())).thenReturn(info);
TileUtils.getTilesForAction(mContext, UserHandle.CURRENT, IA_SETTINGS_ACTION, addedCache,
TileUtils.loadTilesForAction(mContext, UserHandle.CURRENT, IA_SETTINGS_ACTION, addedCache,
null /* defaultCategory */, outTiles, false /* usePriority */);
assertThat(outTiles.get(0).isIconTintable(mContext)).isTrue();
@@ -321,7 +321,7 @@ public class TileUtilsTest {
when(mPackageManager.queryIntentContentProvidersAsUser(any(Intent.class), anyInt(),
anyInt())).thenReturn(info);
TileUtils.getTilesForAction(mContext, UserHandle.CURRENT, IA_SETTINGS_ACTION, addedCache,
TileUtils.loadTilesForAction(mContext, UserHandle.CURRENT, IA_SETTINGS_ACTION, addedCache,
null /* defaultCategory */, outTiles, false /* usePriority */);
assertThat(outTiles).hasSize(2);