Remove sub-text from slice builder
We would like to remove all sub-text from Settings Search. But slice view does not support API to configure the sub-text visibility. Therefore, the only way is to remove the sub-text from slices directly. Since Settings slices are also invoked by other apps, we can not directly remove the sub-text. Finally, we decide to check the caller's uid. If it comes from Settings Search, we will return the slice without the sub-text. Bug: 143118037 Test: visual, robotests Change-Id: Iac72f1683a2c930592634e0599058890d86f669d
This commit is contained in:
@@ -57,6 +57,7 @@ import android.net.LinkProperties;
|
|||||||
import android.net.Network;
|
import android.net.Network;
|
||||||
import android.net.wifi.WifiManager;
|
import android.net.wifi.WifiManager;
|
||||||
import android.os.BatteryManager;
|
import android.os.BatteryManager;
|
||||||
|
import android.os.Binder;
|
||||||
import android.os.Build;
|
import android.os.Build;
|
||||||
import android.os.Bundle;
|
import android.os.Bundle;
|
||||||
import android.os.IBinder;
|
import android.os.IBinder;
|
||||||
@@ -1089,4 +1090,15 @@ public final class Utils extends com.android.settingslib.Utils {
|
|||||||
}
|
}
|
||||||
return f;
|
return f;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns true if current binder uid is Settings Intelligence.
|
||||||
|
*/
|
||||||
|
public static boolean isSettingsIntelligence(Context context) {
|
||||||
|
final int callingUid = Binder.getCallingUid();
|
||||||
|
final String callingPackage = context.getPackageManager().getPackagesForUid(callingUid)[0];
|
||||||
|
final boolean isSettingsIntelligence = TextUtils.equals(callingPackage,
|
||||||
|
context.getString(R.string.config_settingsintelligence_package_name));
|
||||||
|
return isSettingsIntelligence;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@@ -96,15 +96,18 @@ public class MobileDataSlice implements CustomSliceable {
|
|||||||
ListBuilder.ICON_IMAGE, title);
|
ListBuilder.ICON_IMAGE, title);
|
||||||
final SliceAction toggleSliceAction = SliceAction.createToggle(toggleAction,
|
final SliceAction toggleSliceAction = SliceAction.createToggle(toggleAction,
|
||||||
null /* actionTitle */, isMobileDataEnabled());
|
null /* actionTitle */, isMobileDataEnabled());
|
||||||
|
final ListBuilder.RowBuilder rowBuilder = new ListBuilder.RowBuilder()
|
||||||
|
.setTitle(title)
|
||||||
|
.addEndItem(toggleSliceAction)
|
||||||
|
.setPrimaryAction(primarySliceAction);
|
||||||
|
if (!Utils.isSettingsIntelligence(mContext)) {
|
||||||
|
rowBuilder.setSubtitle(summary);
|
||||||
|
}
|
||||||
|
|
||||||
final ListBuilder listBuilder = new ListBuilder(mContext, getUri(),
|
final ListBuilder listBuilder = new ListBuilder(mContext, getUri(),
|
||||||
ListBuilder.INFINITY)
|
ListBuilder.INFINITY)
|
||||||
.setAccentColor(color)
|
.setAccentColor(color)
|
||||||
.addRow(new ListBuilder.RowBuilder()
|
.addRow(rowBuilder);
|
||||||
.setTitle(title)
|
|
||||||
.setSubtitle(summary)
|
|
||||||
.addEndItem(toggleSliceAction)
|
|
||||||
.setPrimaryAction(primarySliceAction));
|
|
||||||
return listBuilder.build();
|
return listBuilder.build();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -82,15 +82,18 @@ public class ZenModeSliceBuilder {
|
|||||||
final SliceAction toggleSliceAction = SliceAction.createToggle(toggleAction,
|
final SliceAction toggleSliceAction = SliceAction.createToggle(toggleAction,
|
||||||
null /* actionTitle */,
|
null /* actionTitle */,
|
||||||
isZenModeEnabled);
|
isZenModeEnabled);
|
||||||
|
final RowBuilder rowBuilder = new RowBuilder()
|
||||||
|
.setTitle(title)
|
||||||
|
.addEndItem(toggleSliceAction)
|
||||||
|
.setPrimaryAction(primarySliceAction);
|
||||||
|
if (!Utils.isSettingsIntelligence(context)) {
|
||||||
|
rowBuilder.setSubtitle(subtitle);
|
||||||
|
}
|
||||||
|
|
||||||
return new ListBuilder(context, CustomSliceRegistry.ZEN_MODE_SLICE_URI,
|
return new ListBuilder(context, CustomSliceRegistry.ZEN_MODE_SLICE_URI,
|
||||||
ListBuilder.INFINITY)
|
ListBuilder.INFINITY)
|
||||||
.setAccentColor(color)
|
.setAccentColor(color)
|
||||||
.addRow(new RowBuilder()
|
.addRow(rowBuilder)
|
||||||
.setTitle(title)
|
|
||||||
.setSubtitle(subtitle)
|
|
||||||
.addEndItem(toggleSliceAction)
|
|
||||||
.setPrimaryAction(primarySliceAction))
|
|
||||||
.build();
|
.build();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -241,16 +241,19 @@ public class SliceBuilderUtils {
|
|||||||
final SliceAction sliceAction = getToggleAction(context, sliceData,
|
final SliceAction sliceAction = getToggleAction(context, sliceData,
|
||||||
toggleController.isChecked());
|
toggleController.isChecked());
|
||||||
final Set<String> keywords = buildSliceKeywords(sliceData);
|
final Set<String> keywords = buildSliceKeywords(sliceData);
|
||||||
|
final RowBuilder rowBuilder = new RowBuilder()
|
||||||
return new ListBuilder(context, sliceData.getUri(), ListBuilder.INFINITY)
|
|
||||||
.setAccentColor(color)
|
|
||||||
.addRow(new RowBuilder()
|
|
||||||
.setTitle(sliceData.getTitle())
|
.setTitle(sliceData.getTitle())
|
||||||
.setSubtitle(subtitleText)
|
|
||||||
.setPrimaryAction(
|
.setPrimaryAction(
|
||||||
SliceAction.createDeeplink(contentIntent, icon,
|
SliceAction.createDeeplink(contentIntent, icon,
|
||||||
ListBuilder.ICON_IMAGE, sliceData.getTitle()))
|
ListBuilder.ICON_IMAGE, sliceData.getTitle()))
|
||||||
.addEndItem(sliceAction))
|
.addEndItem(sliceAction);
|
||||||
|
if (!Utils.isSettingsIntelligence(context)) {
|
||||||
|
rowBuilder.setSubtitle(subtitleText);
|
||||||
|
}
|
||||||
|
|
||||||
|
return new ListBuilder(context, sliceData.getUri(), ListBuilder.INFINITY)
|
||||||
|
.setAccentColor(color)
|
||||||
|
.addRow(rowBuilder)
|
||||||
.setKeywords(keywords)
|
.setKeywords(keywords)
|
||||||
.build();
|
.build();
|
||||||
}
|
}
|
||||||
@@ -262,16 +265,19 @@ public class SliceBuilderUtils {
|
|||||||
final CharSequence subtitleText = getSubtitleText(context, controller, sliceData);
|
final CharSequence subtitleText = getSubtitleText(context, controller, sliceData);
|
||||||
@ColorInt final int color = Utils.getColorAccentDefaultColor(context);
|
@ColorInt final int color = Utils.getColorAccentDefaultColor(context);
|
||||||
final Set<String> keywords = buildSliceKeywords(sliceData);
|
final Set<String> keywords = buildSliceKeywords(sliceData);
|
||||||
|
final RowBuilder rowBuilder = new RowBuilder()
|
||||||
return new ListBuilder(context, sliceData.getUri(), ListBuilder.INFINITY)
|
|
||||||
.setAccentColor(color)
|
|
||||||
.addRow(new RowBuilder()
|
|
||||||
.setTitle(sliceData.getTitle())
|
.setTitle(sliceData.getTitle())
|
||||||
.setSubtitle(subtitleText)
|
|
||||||
.setPrimaryAction(
|
.setPrimaryAction(
|
||||||
SliceAction.createDeeplink(contentIntent, icon,
|
SliceAction.createDeeplink(contentIntent, icon,
|
||||||
ListBuilder.ICON_IMAGE,
|
ListBuilder.ICON_IMAGE,
|
||||||
sliceData.getTitle())))
|
sliceData.getTitle()));
|
||||||
|
if (!Utils.isSettingsIntelligence(context)) {
|
||||||
|
rowBuilder.setSubtitle(subtitleText);
|
||||||
|
}
|
||||||
|
|
||||||
|
return new ListBuilder(context, sliceData.getUri(), ListBuilder.INFINITY)
|
||||||
|
.setAccentColor(color)
|
||||||
|
.addRow(rowBuilder)
|
||||||
.setKeywords(keywords)
|
.setKeywords(keywords)
|
||||||
.build();
|
.build();
|
||||||
}
|
}
|
||||||
@@ -301,7 +307,6 @@ public class SliceBuilderUtils {
|
|||||||
}
|
}
|
||||||
final InputRangeBuilder inputRangeBuilder = new InputRangeBuilder()
|
final InputRangeBuilder inputRangeBuilder = new InputRangeBuilder()
|
||||||
.setTitle(sliceData.getTitle())
|
.setTitle(sliceData.getTitle())
|
||||||
.setSubtitle(subtitleText)
|
|
||||||
.setPrimaryAction(primaryAction)
|
.setPrimaryAction(primaryAction)
|
||||||
.setMax(sliderController.getMax())
|
.setMax(sliderController.getMax())
|
||||||
.setMin(sliderController.getMin())
|
.setMin(sliderController.getMin())
|
||||||
@@ -311,6 +316,9 @@ public class SliceBuilderUtils {
|
|||||||
inputRangeBuilder.setTitleItem(icon, ListBuilder.ICON_IMAGE);
|
inputRangeBuilder.setTitleItem(icon, ListBuilder.ICON_IMAGE);
|
||||||
color = CustomSliceable.COLOR_NOT_TINTED;
|
color = CustomSliceable.COLOR_NOT_TINTED;
|
||||||
}
|
}
|
||||||
|
if (!Utils.isSettingsIntelligence(context)) {
|
||||||
|
inputRangeBuilder.setSubtitle(subtitleText);
|
||||||
|
}
|
||||||
|
|
||||||
return new ListBuilder(context, sliceData.getUri(), ListBuilder.INFINITY)
|
return new ListBuilder(context, sliceData.getUri(), ListBuilder.INFINITY)
|
||||||
.setAccentColor(color)
|
.setAccentColor(color)
|
||||||
@@ -330,14 +338,17 @@ public class SliceBuilderUtils {
|
|||||||
final CharSequence subtitleText = getSubtitleText(context, controller, sliceData);
|
final CharSequence subtitleText = getSubtitleText(context, controller, sliceData);
|
||||||
@ColorInt final int color = Utils.getColorAccentDefaultColor(context);
|
@ColorInt final int color = Utils.getColorAccentDefaultColor(context);
|
||||||
final Set<String> keywords = buildSliceKeywords(sliceData);
|
final Set<String> keywords = buildSliceKeywords(sliceData);
|
||||||
|
final RowBuilder rowBuilder = new RowBuilder()
|
||||||
|
.setTitle(sliceData.getTitle())
|
||||||
|
.setPrimaryAction(primaryAction)
|
||||||
|
.addEndItem(copyableAction);
|
||||||
|
if (!Utils.isSettingsIntelligence(context)) {
|
||||||
|
rowBuilder.setSubtitle(subtitleText);
|
||||||
|
}
|
||||||
|
|
||||||
return new ListBuilder(context, sliceData.getUri(), ListBuilder.INFINITY)
|
return new ListBuilder(context, sliceData.getUri(), ListBuilder.INFINITY)
|
||||||
.setAccentColor(color)
|
.setAccentColor(color)
|
||||||
.addRow(new RowBuilder()
|
.addRow(rowBuilder)
|
||||||
.setTitle(sliceData.getTitle())
|
|
||||||
.setSubtitle(subtitleText)
|
|
||||||
.setPrimaryAction(primaryAction)
|
|
||||||
.addEndItem(copyableAction))
|
|
||||||
.setKeywords(keywords)
|
.setKeywords(keywords)
|
||||||
.build();
|
.build();
|
||||||
}
|
}
|
||||||
@@ -418,14 +429,17 @@ public class SliceBuilderUtils {
|
|||||||
final SliceAction primaryAction = SliceAction.createDeeplink(
|
final SliceAction primaryAction = SliceAction.createDeeplink(
|
||||||
getContentPendingIntent(context, data),
|
getContentPendingIntent(context, data),
|
||||||
icon, ListBuilder.ICON_IMAGE, title);
|
icon, ListBuilder.ICON_IMAGE, title);
|
||||||
|
final RowBuilder rowBuilder = new RowBuilder()
|
||||||
|
.setTitle(title)
|
||||||
|
.setTitleItem(icon, ListBuilder.ICON_IMAGE)
|
||||||
|
.setPrimaryAction(primaryAction);
|
||||||
|
if (!Utils.isSettingsIntelligence(context)) {
|
||||||
|
rowBuilder.setSubtitle(subtitle);
|
||||||
|
}
|
||||||
|
|
||||||
return new ListBuilder(context, data.getUri(), ListBuilder.INFINITY)
|
return new ListBuilder(context, data.getUri(), ListBuilder.INFINITY)
|
||||||
.setAccentColor(color)
|
.setAccentColor(color)
|
||||||
.addRow(new RowBuilder()
|
.addRow(rowBuilder)
|
||||||
.setTitle(title)
|
|
||||||
.setTitleItem(icon, ListBuilder.ICON_IMAGE)
|
|
||||||
.setSubtitle(subtitle)
|
|
||||||
.setPrimaryAction(primaryAction))
|
|
||||||
.setKeywords(keywords)
|
.setKeywords(keywords)
|
||||||
.build();
|
.build();
|
||||||
}
|
}
|
||||||
|
@@ -269,14 +269,17 @@ public class WifiCallingSliceHelper {
|
|||||||
// Top row shows information on current preference state
|
// Top row shows information on current preference state
|
||||||
final ListBuilder listBuilder = new ListBuilder(mContext, sliceUri, ListBuilder.INFINITY)
|
final ListBuilder listBuilder = new ListBuilder(mContext, sliceUri, ListBuilder.INFINITY)
|
||||||
.setAccentColor(Utils.getColorAccentDefaultColor(mContext));
|
.setAccentColor(Utils.getColorAccentDefaultColor(mContext));
|
||||||
listBuilder.setHeader(new ListBuilder.HeaderBuilder()
|
final ListBuilder.HeaderBuilder headerBuilder = new ListBuilder.HeaderBuilder()
|
||||||
.setTitle(res.getText(R.string.wifi_calling_mode_title))
|
.setTitle(res.getText(R.string.wifi_calling_mode_title))
|
||||||
.setSubtitle(getWifiCallingPreferenceSummary(currentWfcPref, subId))
|
|
||||||
.setPrimaryAction(SliceAction.createDeeplink(
|
.setPrimaryAction(SliceAction.createDeeplink(
|
||||||
getActivityIntent(ACTION_WIFI_CALLING_SETTINGS_ACTIVITY),
|
getActivityIntent(ACTION_WIFI_CALLING_SETTINGS_ACTIVITY),
|
||||||
icon,
|
icon,
|
||||||
ListBuilder.ICON_IMAGE,
|
ListBuilder.ICON_IMAGE,
|
||||||
res.getText(R.string.wifi_calling_mode_title))));
|
res.getText(R.string.wifi_calling_mode_title)));
|
||||||
|
if (!Utils.isSettingsIntelligence(mContext)) {
|
||||||
|
headerBuilder.setSubtitle(getWifiCallingPreferenceSummary(currentWfcPref, subId));
|
||||||
|
}
|
||||||
|
listBuilder.setHeader(headerBuilder);
|
||||||
|
|
||||||
if (isWifiOnlySupported) {
|
if (isWifiOnlySupported) {
|
||||||
listBuilder.addRow(wifiPreferenceRowBuilder(listBuilder,
|
listBuilder.addRow(wifiPreferenceRowBuilder(listBuilder,
|
||||||
@@ -458,14 +461,17 @@ public class WifiCallingSliceHelper {
|
|||||||
private Slice getNonActionableWifiCallingSlice(CharSequence title, CharSequence subtitle,
|
private Slice getNonActionableWifiCallingSlice(CharSequence title, CharSequence subtitle,
|
||||||
Uri sliceUri, PendingIntent primaryActionIntent) {
|
Uri sliceUri, PendingIntent primaryActionIntent) {
|
||||||
final IconCompat icon = IconCompat.createWithResource(mContext, R.drawable.wifi_signal);
|
final IconCompat icon = IconCompat.createWithResource(mContext, R.drawable.wifi_signal);
|
||||||
return new ListBuilder(mContext, sliceUri, ListBuilder.INFINITY)
|
final RowBuilder rowBuilder = new RowBuilder()
|
||||||
.setAccentColor(Utils.getColorAccentDefaultColor(mContext))
|
|
||||||
.addRow(new RowBuilder()
|
|
||||||
.setTitle(title)
|
.setTitle(title)
|
||||||
.setSubtitle(subtitle)
|
|
||||||
.setPrimaryAction(SliceAction.createDeeplink(
|
.setPrimaryAction(SliceAction.createDeeplink(
|
||||||
primaryActionIntent, icon, ListBuilder.SMALL_IMAGE,
|
primaryActionIntent, icon, ListBuilder.SMALL_IMAGE,
|
||||||
title)))
|
title));
|
||||||
|
if (!Utils.isSettingsIntelligence(mContext)) {
|
||||||
|
rowBuilder.setSubtitle(subtitle);
|
||||||
|
}
|
||||||
|
return new ListBuilder(mContext, sliceUri, ListBuilder.INFINITY)
|
||||||
|
.setAccentColor(Utils.getColorAccentDefaultColor(mContext))
|
||||||
|
.addRow(rowBuilder)
|
||||||
.build();
|
.build();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -29,7 +29,6 @@ import static org.mockito.Mockito.verify;
|
|||||||
import static org.mockito.Mockito.when;
|
import static org.mockito.Mockito.when;
|
||||||
|
|
||||||
import android.app.ActionBar;
|
import android.app.ActionBar;
|
||||||
import android.app.Activity;
|
|
||||||
import android.app.admin.DevicePolicyManager;
|
import android.app.admin.DevicePolicyManager;
|
||||||
import android.content.ComponentName;
|
import android.content.ComponentName;
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
@@ -67,6 +66,7 @@ import org.mockito.MockitoAnnotations;
|
|||||||
import org.robolectric.Robolectric;
|
import org.robolectric.Robolectric;
|
||||||
import org.robolectric.RobolectricTestRunner;
|
import org.robolectric.RobolectricTestRunner;
|
||||||
import org.robolectric.RuntimeEnvironment;
|
import org.robolectric.RuntimeEnvironment;
|
||||||
|
import org.robolectric.shadows.ShadowBinder;
|
||||||
|
|
||||||
import java.net.InetAddress;
|
import java.net.InetAddress;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
@@ -281,4 +281,22 @@ public class UtilsTest {
|
|||||||
|
|
||||||
assertThat(actionBar.getElevation()).isEqualTo(0.f);
|
assertThat(actionBar.getElevation()).isEqualTo(0.f);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void isSettingsIntelligence_IsSI_returnTrue() {
|
||||||
|
final String siPackageName = mContext.getString(
|
||||||
|
R.string.config_settingsintelligence_package_name);
|
||||||
|
ShadowBinder.setCallingUid(USER_ID);
|
||||||
|
when(mPackageManager.getPackagesForUid(USER_ID)).thenReturn(new String[]{siPackageName});
|
||||||
|
|
||||||
|
assertThat(Utils.isSettingsIntelligence(mContext)).isTrue();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void isSettingsIntelligence_IsNotSI_returnFalse() {
|
||||||
|
ShadowBinder.setCallingUid(USER_ID);
|
||||||
|
when(mPackageManager.getPackagesForUid(USER_ID)).thenReturn(new String[]{PACKAGE_NAME});
|
||||||
|
|
||||||
|
assertThat(Utils.isSettingsIntelligence(mContext)).isFalse();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@@ -23,7 +23,6 @@ import static org.mockito.Mockito.spy;
|
|||||||
import static org.mockito.Mockito.verify;
|
import static org.mockito.Mockito.verify;
|
||||||
|
|
||||||
import android.app.settings.SettingsEnums;
|
import android.app.settings.SettingsEnums;
|
||||||
import android.content.ContentResolver;
|
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
import android.content.Intent;
|
import android.content.Intent;
|
||||||
import android.net.Uri;
|
import android.net.Uri;
|
||||||
@@ -455,37 +454,6 @@ public class SliceBuilderUtilsTest {
|
|||||||
assertThat(actualIconResource).isEqualTo(settingsIcon);
|
assertThat(actualIconResource).isEqualTo(settingsIcon);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
|
||||||
public void buildUnavailableSlice_customizeSubtitle_returnsSliceWithCustomizedSubtitle() {
|
|
||||||
final String subtitleOfUnavailableSlice = "subtitleOfUnavailableSlice";
|
|
||||||
final SliceData data = getDummyData(FakeUnavailablePreferenceController.class,
|
|
||||||
SUMMARY, SliceData.SliceType.SWITCH, SCREEN_TITLE, 0 /* icon */,
|
|
||||||
subtitleOfUnavailableSlice);
|
|
||||||
Settings.Global.putInt(mContext.getContentResolver(),
|
|
||||||
FakeUnavailablePreferenceController.AVAILABILITY_KEY,
|
|
||||||
BasePreferenceController.DISABLED_DEPENDENT_SETTING);
|
|
||||||
|
|
||||||
final Slice slice = SliceBuilderUtils.buildSlice(mContext, data);
|
|
||||||
|
|
||||||
final SliceMetadata metadata = SliceMetadata.from(mContext, slice);
|
|
||||||
assertThat(metadata.getSubtitle()).isEqualTo(subtitleOfUnavailableSlice);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
public void buildUnavailableSlice_notCustomizeSubtitle_returnsSliceWithDefaultSubtitle() {
|
|
||||||
final SliceData data = getDummyData(FakeUnavailablePreferenceController.class,
|
|
||||||
SliceData.SliceType.SWITCH);
|
|
||||||
Settings.Global.putInt(mContext.getContentResolver(),
|
|
||||||
FakeUnavailablePreferenceController.AVAILABILITY_KEY,
|
|
||||||
BasePreferenceController.DISABLED_DEPENDENT_SETTING);
|
|
||||||
|
|
||||||
final Slice slice = SliceBuilderUtils.buildSlice(mContext, data);
|
|
||||||
|
|
||||||
final SliceMetadata metadata = SliceMetadata.from(mContext, slice);
|
|
||||||
assertThat(metadata.getSubtitle()).isEqualTo(
|
|
||||||
mContext.getString(R.string.disabled_dependent_setting_summary));
|
|
||||||
}
|
|
||||||
|
|
||||||
private SliceData getDummyData() {
|
private SliceData getDummyData() {
|
||||||
return getDummyData(TOGGLE_CONTROLLER, SUMMARY, SliceData.SliceType.SWITCH, SCREEN_TITLE,
|
return getDummyData(TOGGLE_CONTROLLER, SUMMARY, SliceData.SliceType.SWITCH, SCREEN_TITLE,
|
||||||
ICON, null /* unavailableSliceSubtitle */);
|
ICON, null /* unavailableSliceSubtitle */);
|
||||||
|
Reference in New Issue
Block a user