[Settings] Support pure switch of inline toggle of Settings Injection v2
Bug: 132808482 Test: robotest Change-Id: Ib24614fb46fe990925edad721e3b7d5d032854fc
This commit is contained in:
@@ -18,9 +18,18 @@ package com.android.settings.dashboard;
|
||||
|
||||
import static android.content.Intent.EXTRA_USER;
|
||||
|
||||
import static com.android.settingslib.drawer.SwitchesProvider.EXTRA_SWITCH_CHECKED_STATE;
|
||||
import static com.android.settingslib.drawer.SwitchesProvider.EXTRA_SWITCH_SET_CHECKED_ERROR;
|
||||
import static com.android.settingslib.drawer.SwitchesProvider.EXTRA_SWITCH_SET_CHECKED_ERROR_MESSAGE;
|
||||
import static com.android.settingslib.drawer.SwitchesProvider.METHOD_GET_DYNAMIC_SUMMARY;
|
||||
import static com.android.settingslib.drawer.SwitchesProvider.METHOD_GET_DYNAMIC_TITLE;
|
||||
import static com.android.settingslib.drawer.SwitchesProvider.METHOD_GET_PROVIDER_ICON;
|
||||
import static com.android.settingslib.drawer.SwitchesProvider.METHOD_IS_CHECKED;
|
||||
import static com.android.settingslib.drawer.SwitchesProvider.METHOD_ON_CHECKED_CHANGED;
|
||||
import static com.android.settingslib.drawer.TileUtils.META_DATA_PREFERENCE_ICON_URI;
|
||||
import static com.android.settingslib.drawer.TileUtils.META_DATA_PREFERENCE_SUMMARY;
|
||||
import static com.android.settingslib.drawer.TileUtils.META_DATA_PREFERENCE_SUMMARY_URI;
|
||||
import static com.android.settingslib.drawer.TileUtils.META_DATA_PREFERENCE_SWITCH_URI;
|
||||
import static com.android.settingslib.drawer.TileUtils.META_DATA_PREFERENCE_TITLE;
|
||||
import static com.android.settingslib.drawer.TileUtils.META_DATA_PREFERENCE_TITLE_URI;
|
||||
|
||||
@@ -40,22 +49,26 @@ import android.text.TextUtils;
|
||||
import android.util.ArrayMap;
|
||||
import android.util.Log;
|
||||
import android.util.Pair;
|
||||
import android.widget.Toast;
|
||||
|
||||
import androidx.annotation.VisibleForTesting;
|
||||
import androidx.fragment.app.FragmentActivity;
|
||||
import androidx.preference.Preference;
|
||||
import androidx.preference.SwitchPreference;
|
||||
|
||||
import com.android.settings.R;
|
||||
import com.android.settings.SettingsActivity;
|
||||
import com.android.settings.dashboard.profileselector.ProfileSelectDialog;
|
||||
import com.android.settings.overlay.FeatureFactory;
|
||||
import com.android.settingslib.core.instrumentation.MetricsFeatureProvider;
|
||||
import com.android.settingslib.drawer.ActivityTile;
|
||||
import com.android.settingslib.drawer.DashboardCategory;
|
||||
import com.android.settingslib.drawer.Tile;
|
||||
import com.android.settingslib.drawer.TileUtils;
|
||||
import com.android.settingslib.utils.ThreadUtils;
|
||||
import com.android.settingslib.widget.AdaptiveIcon;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
@@ -106,40 +119,54 @@ public class DashboardFeatureProviderImpl implements DashboardFeatureProvider {
|
||||
}
|
||||
|
||||
@Override
|
||||
public void bindPreferenceToTile(FragmentActivity activity, boolean forceRoundedIcon,
|
||||
int sourceMetricsCategory, Preference pref, Tile tile, String key, int baseOrder) {
|
||||
public List<DynamicDataObserver> bindPreferenceToTileAndGetObservers(FragmentActivity activity,
|
||||
boolean forceRoundedIcon, int sourceMetricsCategory, Preference pref, Tile tile,
|
||||
String key, int baseOrder) {
|
||||
if (pref == null) {
|
||||
return;
|
||||
return null;
|
||||
}
|
||||
if (!TextUtils.isEmpty(key)) {
|
||||
pref.setKey(key);
|
||||
} else {
|
||||
pref.setKey(getDashboardKeyForTile(tile));
|
||||
}
|
||||
bindTitle(pref, tile);
|
||||
bindSummary(pref, tile);
|
||||
final List<DynamicDataObserver> outObservers = new ArrayList<>();
|
||||
DynamicDataObserver observer = bindTitleAndGetObserver(pref, tile);
|
||||
if (observer != null) {
|
||||
outObservers.add(observer);
|
||||
}
|
||||
observer = bindSummaryAndGetObserver(pref, tile);
|
||||
if (observer != null) {
|
||||
outObservers.add(observer);
|
||||
}
|
||||
observer = bindSwitchAndGetObserver(pref, tile);
|
||||
if (observer != null) {
|
||||
outObservers.add(observer);
|
||||
}
|
||||
bindIcon(pref, tile, forceRoundedIcon);
|
||||
|
||||
final Bundle metadata = tile.getMetaData();
|
||||
String clsName = null;
|
||||
String action = null;
|
||||
if (metadata != null) {
|
||||
clsName = metadata.getString(SettingsActivity.META_DATA_KEY_FRAGMENT_CLASS);
|
||||
action = metadata.getString(META_DATA_KEY_INTENT_ACTION);
|
||||
}
|
||||
if (!TextUtils.isEmpty(clsName)) {
|
||||
pref.setFragment(clsName);
|
||||
} else {
|
||||
final Intent intent = new Intent(tile.getIntent());
|
||||
intent.putExtra(MetricsFeatureProvider.EXTRA_SOURCE_METRICS_CATEGORY,
|
||||
sourceMetricsCategory);
|
||||
if (action != null) {
|
||||
intent.setAction(action);
|
||||
if (tile instanceof ActivityTile) {
|
||||
final Bundle metadata = tile.getMetaData();
|
||||
String clsName = null;
|
||||
String action = null;
|
||||
if (metadata != null) {
|
||||
clsName = metadata.getString(SettingsActivity.META_DATA_KEY_FRAGMENT_CLASS);
|
||||
action = metadata.getString(META_DATA_KEY_INTENT_ACTION);
|
||||
}
|
||||
if (!TextUtils.isEmpty(clsName)) {
|
||||
pref.setFragment(clsName);
|
||||
} else {
|
||||
final Intent intent = new Intent(tile.getIntent());
|
||||
intent.putExtra(MetricsFeatureProvider.EXTRA_SOURCE_METRICS_CATEGORY,
|
||||
sourceMetricsCategory);
|
||||
if (action != null) {
|
||||
intent.setAction(action);
|
||||
}
|
||||
pref.setOnPreferenceClickListener(preference -> {
|
||||
launchIntentOrSelectProfile(activity, tile, intent, sourceMetricsCategory);
|
||||
return true;
|
||||
});
|
||||
}
|
||||
pref.setOnPreferenceClickListener(preference -> {
|
||||
launchIntentOrSelectProfile(activity, tile, intent, sourceMetricsCategory);
|
||||
return true;
|
||||
});
|
||||
}
|
||||
|
||||
if (tile.hasOrder()) {
|
||||
@@ -153,6 +180,7 @@ public class DashboardFeatureProviderImpl implements DashboardFeatureProvider {
|
||||
pref.setOrder(order + baseOrder);
|
||||
}
|
||||
}
|
||||
return outObservers.isEmpty() ? null : outObservers;
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -170,11 +198,35 @@ public class DashboardFeatureProviderImpl implements DashboardFeatureProvider {
|
||||
launchIntentOrSelectProfile(activity, tile, intent, SettingsEnums.DASHBOARD_SUMMARY);
|
||||
}
|
||||
|
||||
private void bindTitle(Preference preference, Tile tile) {
|
||||
private DynamicDataObserver createDynamicDataObserver(String method, Uri uri, Preference pref) {
|
||||
return new DynamicDataObserver() {
|
||||
@Override
|
||||
public Uri getUri() {
|
||||
return uri;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onDataChanged() {
|
||||
switch (method) {
|
||||
case METHOD_GET_DYNAMIC_TITLE:
|
||||
refreshTitle(uri, pref);
|
||||
break;
|
||||
case METHOD_GET_DYNAMIC_SUMMARY:
|
||||
refreshSummary(uri, pref);
|
||||
break;
|
||||
case METHOD_IS_CHECKED:
|
||||
refreshSwitch(uri, pref);
|
||||
break;
|
||||
}
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
private DynamicDataObserver bindTitleAndGetObserver(Preference preference, Tile tile) {
|
||||
final CharSequence title = tile.getTitle(mContext.getApplicationContext());
|
||||
if (title != null) {
|
||||
preference.setTitle(title);
|
||||
return;
|
||||
return null;
|
||||
}
|
||||
if (tile.getMetaData() != null && tile.getMetaData().containsKey(
|
||||
META_DATA_PREFERENCE_TITLE_URI)) {
|
||||
@@ -182,9 +234,12 @@ public class DashboardFeatureProviderImpl implements DashboardFeatureProvider {
|
||||
// to avoid preference height change.
|
||||
preference.setTitle(R.string.summary_placeholder);
|
||||
|
||||
final Uri uri = TileUtils.getCompleteUri(tile, META_DATA_PREFERENCE_TITLE_URI);
|
||||
final Uri uri = TileUtils.getCompleteUri(tile, META_DATA_PREFERENCE_TITLE_URI,
|
||||
METHOD_GET_DYNAMIC_TITLE);
|
||||
refreshTitle(uri, preference);
|
||||
return createDynamicDataObserver(METHOD_GET_DYNAMIC_TITLE, uri, preference);
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
private void refreshTitle(Uri uri, Preference preference) {
|
||||
@@ -196,7 +251,7 @@ public class DashboardFeatureProviderImpl implements DashboardFeatureProvider {
|
||||
});
|
||||
}
|
||||
|
||||
private void bindSummary(Preference preference, Tile tile) {
|
||||
private DynamicDataObserver bindSummaryAndGetObserver(Preference preference, Tile tile) {
|
||||
final CharSequence summary = tile.getSummary(mContext);
|
||||
if (summary != null) {
|
||||
preference.setSummary(summary);
|
||||
@@ -206,11 +261,14 @@ public class DashboardFeatureProviderImpl implements DashboardFeatureProvider {
|
||||
// to avoid preference height change.
|
||||
preference.setSummary(R.string.summary_placeholder);
|
||||
|
||||
final Uri uri = TileUtils.getCompleteUri(tile, META_DATA_PREFERENCE_SUMMARY_URI);
|
||||
final Uri uri = TileUtils.getCompleteUri(tile, META_DATA_PREFERENCE_SUMMARY_URI,
|
||||
METHOD_GET_DYNAMIC_SUMMARY);
|
||||
refreshSummary(uri, preference);
|
||||
return createDynamicDataObserver(METHOD_GET_DYNAMIC_SUMMARY, uri, preference);
|
||||
} else {
|
||||
preference.setSummary(R.string.summary_placeholder);
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
private void refreshSummary(Uri uri, Preference preference) {
|
||||
@@ -222,6 +280,70 @@ public class DashboardFeatureProviderImpl implements DashboardFeatureProvider {
|
||||
});
|
||||
}
|
||||
|
||||
private DynamicDataObserver bindSwitchAndGetObserver(Preference preference, Tile tile) {
|
||||
if (!tile.hasSwitch()) {
|
||||
return null;
|
||||
}
|
||||
|
||||
final Uri onCheckedChangedUri = TileUtils.getCompleteUri(tile,
|
||||
META_DATA_PREFERENCE_SWITCH_URI, METHOD_ON_CHECKED_CHANGED);
|
||||
preference.setOnPreferenceChangeListener((pref, newValue) -> {
|
||||
onCheckedChanged(onCheckedChangedUri, pref, (boolean) newValue);
|
||||
return true;
|
||||
});
|
||||
|
||||
final Uri isCheckedUri = TileUtils.getCompleteUri(tile, META_DATA_PREFERENCE_SWITCH_URI,
|
||||
METHOD_IS_CHECKED);
|
||||
setSwitchEnabled(preference, false);
|
||||
refreshSwitch(isCheckedUri, preference);
|
||||
return createDynamicDataObserver(METHOD_IS_CHECKED, isCheckedUri, preference);
|
||||
}
|
||||
|
||||
private void onCheckedChanged(Uri uri, Preference pref, boolean checked) {
|
||||
setSwitchEnabled(pref, false);
|
||||
ThreadUtils.postOnBackgroundThread(() -> {
|
||||
final Map<String, IContentProvider> providerMap = new ArrayMap<>();
|
||||
final Bundle result = TileUtils.putBooleanToUri(mContext, uri, providerMap,
|
||||
EXTRA_SWITCH_CHECKED_STATE, checked);
|
||||
|
||||
ThreadUtils.postOnMainThread(() -> {
|
||||
setSwitchEnabled(pref, true);
|
||||
final boolean error = result.getBoolean(EXTRA_SWITCH_SET_CHECKED_ERROR);
|
||||
if (!error) {
|
||||
return;
|
||||
}
|
||||
|
||||
setSwitchChecked(pref, !checked);
|
||||
final String errorMsg = result.getString(EXTRA_SWITCH_SET_CHECKED_ERROR_MESSAGE);
|
||||
if (!TextUtils.isEmpty(errorMsg)) {
|
||||
Toast.makeText(mContext, errorMsg, Toast.LENGTH_SHORT).show();
|
||||
}
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
private void refreshSwitch(Uri uri, Preference preference) {
|
||||
ThreadUtils.postOnBackgroundThread(() -> {
|
||||
final Map<String, IContentProvider> providerMap = new ArrayMap<>();
|
||||
final boolean checked = TileUtils.getBooleanFromUri(mContext, uri, providerMap,
|
||||
EXTRA_SWITCH_CHECKED_STATE);
|
||||
ThreadUtils.postOnMainThread(() -> {
|
||||
setSwitchChecked(preference, checked);
|
||||
setSwitchEnabled(preference, true);
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
private void setSwitchChecked(Preference pref, boolean checked) {
|
||||
if (pref instanceof SwitchPreference) {
|
||||
((SwitchPreference) pref).setChecked(checked);
|
||||
}
|
||||
}
|
||||
|
||||
private void setSwitchEnabled(Preference pref, boolean enabled) {
|
||||
pref.setEnabled(enabled);
|
||||
}
|
||||
|
||||
@VisibleForTesting
|
||||
void bindIcon(Preference preference, Tile tile, boolean forceRoundedIcon) {
|
||||
// Use preference context instead here when get icon from Tile, as we are using the context
|
||||
@@ -246,7 +368,8 @@ public class DashboardFeatureProviderImpl implements DashboardFeatureProvider {
|
||||
packageName = intent.getComponent().getPackageName();
|
||||
}
|
||||
final Map<String, IContentProvider> providerMap = new ArrayMap<>();
|
||||
final Uri uri = TileUtils.getCompleteUri(tile, META_DATA_PREFERENCE_ICON_URI);
|
||||
final Uri uri = TileUtils.getCompleteUri(tile, META_DATA_PREFERENCE_ICON_URI,
|
||||
METHOD_GET_PROVIDER_ICON);
|
||||
final Pair<String, Integer> iconInfo = TileUtils.getIconFromUri(
|
||||
mContext, packageName, uri, providerMap);
|
||||
if (iconInfo == null) {
|
||||
|
Reference in New Issue
Block a user