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.wifi.WifiManager;
|
||||
import android.os.BatteryManager;
|
||||
import android.os.Binder;
|
||||
import android.os.Build;
|
||||
import android.os.Bundle;
|
||||
import android.os.IBinder;
|
||||
@@ -1089,4 +1090,15 @@ public final class Utils extends com.android.settingslib.Utils {
|
||||
}
|
||||
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);
|
||||
final SliceAction toggleSliceAction = SliceAction.createToggle(toggleAction,
|
||||
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(),
|
||||
ListBuilder.INFINITY)
|
||||
.setAccentColor(color)
|
||||
.addRow(new ListBuilder.RowBuilder()
|
||||
.setTitle(title)
|
||||
.setSubtitle(summary)
|
||||
.addEndItem(toggleSliceAction)
|
||||
.setPrimaryAction(primarySliceAction));
|
||||
.addRow(rowBuilder);
|
||||
return listBuilder.build();
|
||||
}
|
||||
|
||||
|
@@ -82,15 +82,18 @@ public class ZenModeSliceBuilder {
|
||||
final SliceAction toggleSliceAction = SliceAction.createToggle(toggleAction,
|
||||
null /* actionTitle */,
|
||||
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,
|
||||
ListBuilder.INFINITY)
|
||||
.setAccentColor(color)
|
||||
.addRow(new RowBuilder()
|
||||
.setTitle(title)
|
||||
.setSubtitle(subtitle)
|
||||
.addEndItem(toggleSliceAction)
|
||||
.setPrimaryAction(primarySliceAction))
|
||||
.addRow(rowBuilder)
|
||||
.build();
|
||||
}
|
||||
|
||||
|
@@ -241,16 +241,19 @@ public class SliceBuilderUtils {
|
||||
final SliceAction sliceAction = getToggleAction(context, sliceData,
|
||||
toggleController.isChecked());
|
||||
final Set<String> keywords = buildSliceKeywords(sliceData);
|
||||
final RowBuilder rowBuilder = new RowBuilder()
|
||||
.setTitle(sliceData.getTitle())
|
||||
.setPrimaryAction(
|
||||
SliceAction.createDeeplink(contentIntent, icon,
|
||||
ListBuilder.ICON_IMAGE, sliceData.getTitle()))
|
||||
.addEndItem(sliceAction);
|
||||
if (!Utils.isSettingsIntelligence(context)) {
|
||||
rowBuilder.setSubtitle(subtitleText);
|
||||
}
|
||||
|
||||
return new ListBuilder(context, sliceData.getUri(), ListBuilder.INFINITY)
|
||||
.setAccentColor(color)
|
||||
.addRow(new RowBuilder()
|
||||
.setTitle(sliceData.getTitle())
|
||||
.setSubtitle(subtitleText)
|
||||
.setPrimaryAction(
|
||||
SliceAction.createDeeplink(contentIntent, icon,
|
||||
ListBuilder.ICON_IMAGE, sliceData.getTitle()))
|
||||
.addEndItem(sliceAction))
|
||||
.addRow(rowBuilder)
|
||||
.setKeywords(keywords)
|
||||
.build();
|
||||
}
|
||||
@@ -262,16 +265,19 @@ public class SliceBuilderUtils {
|
||||
final CharSequence subtitleText = getSubtitleText(context, controller, sliceData);
|
||||
@ColorInt final int color = Utils.getColorAccentDefaultColor(context);
|
||||
final Set<String> keywords = buildSliceKeywords(sliceData);
|
||||
final RowBuilder rowBuilder = new RowBuilder()
|
||||
.setTitle(sliceData.getTitle())
|
||||
.setPrimaryAction(
|
||||
SliceAction.createDeeplink(contentIntent, icon,
|
||||
ListBuilder.ICON_IMAGE,
|
||||
sliceData.getTitle()));
|
||||
if (!Utils.isSettingsIntelligence(context)) {
|
||||
rowBuilder.setSubtitle(subtitleText);
|
||||
}
|
||||
|
||||
return new ListBuilder(context, sliceData.getUri(), ListBuilder.INFINITY)
|
||||
.setAccentColor(color)
|
||||
.addRow(new RowBuilder()
|
||||
.setTitle(sliceData.getTitle())
|
||||
.setSubtitle(subtitleText)
|
||||
.setPrimaryAction(
|
||||
SliceAction.createDeeplink(contentIntent, icon,
|
||||
ListBuilder.ICON_IMAGE,
|
||||
sliceData.getTitle())))
|
||||
.addRow(rowBuilder)
|
||||
.setKeywords(keywords)
|
||||
.build();
|
||||
}
|
||||
@@ -301,7 +307,6 @@ public class SliceBuilderUtils {
|
||||
}
|
||||
final InputRangeBuilder inputRangeBuilder = new InputRangeBuilder()
|
||||
.setTitle(sliceData.getTitle())
|
||||
.setSubtitle(subtitleText)
|
||||
.setPrimaryAction(primaryAction)
|
||||
.setMax(sliderController.getMax())
|
||||
.setMin(sliderController.getMin())
|
||||
@@ -311,6 +316,9 @@ public class SliceBuilderUtils {
|
||||
inputRangeBuilder.setTitleItem(icon, ListBuilder.ICON_IMAGE);
|
||||
color = CustomSliceable.COLOR_NOT_TINTED;
|
||||
}
|
||||
if (!Utils.isSettingsIntelligence(context)) {
|
||||
inputRangeBuilder.setSubtitle(subtitleText);
|
||||
}
|
||||
|
||||
return new ListBuilder(context, sliceData.getUri(), ListBuilder.INFINITY)
|
||||
.setAccentColor(color)
|
||||
@@ -330,14 +338,17 @@ public class SliceBuilderUtils {
|
||||
final CharSequence subtitleText = getSubtitleText(context, controller, sliceData);
|
||||
@ColorInt final int color = Utils.getColorAccentDefaultColor(context);
|
||||
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)
|
||||
.setAccentColor(color)
|
||||
.addRow(new RowBuilder()
|
||||
.setTitle(sliceData.getTitle())
|
||||
.setSubtitle(subtitleText)
|
||||
.setPrimaryAction(primaryAction)
|
||||
.addEndItem(copyableAction))
|
||||
.addRow(rowBuilder)
|
||||
.setKeywords(keywords)
|
||||
.build();
|
||||
}
|
||||
@@ -418,14 +429,17 @@ public class SliceBuilderUtils {
|
||||
final SliceAction primaryAction = SliceAction.createDeeplink(
|
||||
getContentPendingIntent(context, data),
|
||||
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)
|
||||
.setAccentColor(color)
|
||||
.addRow(new RowBuilder()
|
||||
.setTitle(title)
|
||||
.setTitleItem(icon, ListBuilder.ICON_IMAGE)
|
||||
.setSubtitle(subtitle)
|
||||
.setPrimaryAction(primaryAction))
|
||||
.addRow(rowBuilder)
|
||||
.setKeywords(keywords)
|
||||
.build();
|
||||
}
|
||||
|
@@ -269,14 +269,17 @@ public class WifiCallingSliceHelper {
|
||||
// Top row shows information on current preference state
|
||||
final ListBuilder listBuilder = new ListBuilder(mContext, sliceUri, ListBuilder.INFINITY)
|
||||
.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))
|
||||
.setSubtitle(getWifiCallingPreferenceSummary(currentWfcPref, subId))
|
||||
.setPrimaryAction(SliceAction.createDeeplink(
|
||||
getActivityIntent(ACTION_WIFI_CALLING_SETTINGS_ACTIVITY),
|
||||
icon,
|
||||
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) {
|
||||
listBuilder.addRow(wifiPreferenceRowBuilder(listBuilder,
|
||||
@@ -458,14 +461,17 @@ public class WifiCallingSliceHelper {
|
||||
private Slice getNonActionableWifiCallingSlice(CharSequence title, CharSequence subtitle,
|
||||
Uri sliceUri, PendingIntent primaryActionIntent) {
|
||||
final IconCompat icon = IconCompat.createWithResource(mContext, R.drawable.wifi_signal);
|
||||
final RowBuilder rowBuilder = new RowBuilder()
|
||||
.setTitle(title)
|
||||
.setPrimaryAction(SliceAction.createDeeplink(
|
||||
primaryActionIntent, icon, ListBuilder.SMALL_IMAGE,
|
||||
title));
|
||||
if (!Utils.isSettingsIntelligence(mContext)) {
|
||||
rowBuilder.setSubtitle(subtitle);
|
||||
}
|
||||
return new ListBuilder(mContext, sliceUri, ListBuilder.INFINITY)
|
||||
.setAccentColor(Utils.getColorAccentDefaultColor(mContext))
|
||||
.addRow(new RowBuilder()
|
||||
.setTitle(title)
|
||||
.setSubtitle(subtitle)
|
||||
.setPrimaryAction(SliceAction.createDeeplink(
|
||||
primaryActionIntent, icon, ListBuilder.SMALL_IMAGE,
|
||||
title)))
|
||||
.addRow(rowBuilder)
|
||||
.build();
|
||||
}
|
||||
|
||||
|
@@ -29,7 +29,6 @@ import static org.mockito.Mockito.verify;
|
||||
import static org.mockito.Mockito.when;
|
||||
|
||||
import android.app.ActionBar;
|
||||
import android.app.Activity;
|
||||
import android.app.admin.DevicePolicyManager;
|
||||
import android.content.ComponentName;
|
||||
import android.content.Context;
|
||||
@@ -67,6 +66,7 @@ import org.mockito.MockitoAnnotations;
|
||||
import org.robolectric.Robolectric;
|
||||
import org.robolectric.RobolectricTestRunner;
|
||||
import org.robolectric.RuntimeEnvironment;
|
||||
import org.robolectric.shadows.ShadowBinder;
|
||||
|
||||
import java.net.InetAddress;
|
||||
import java.util.ArrayList;
|
||||
@@ -281,4 +281,22 @@ public class UtilsTest {
|
||||
|
||||
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 android.app.settings.SettingsEnums;
|
||||
import android.content.ContentResolver;
|
||||
import android.content.Context;
|
||||
import android.content.Intent;
|
||||
import android.net.Uri;
|
||||
@@ -455,37 +454,6 @@ public class SliceBuilderUtilsTest {
|
||||
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() {
|
||||
return getDummyData(TOGGLE_CONTROLLER, SUMMARY, SliceData.SliceType.SWITCH, SCREEN_TITLE,
|
||||
ICON, null /* unavailableSliceSubtitle */);
|
||||
|
Reference in New Issue
Block a user