Merge "[SettingsLib] Support master switch of inline toggle of Settings Injection v2"
This commit is contained in:
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
}
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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();
|
||||
|
||||
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user