Uniquely identify Slice intents
PendingIntents were being cached because they had the same targets and would not differentiate on extras - thus all Slice intents would go to the same destination as the first intent fired. Adding the data stops the system from caching the intents. Change-Id: Ifccab72ed482e22750422c5c36aa6d205c20ae3d Fixes: 77650727 Test: robotests
This commit is contained in:
@@ -51,7 +51,6 @@ import com.android.settingslib.core.AbstractPreferenceController;
|
|||||||
import android.support.v4.graphics.drawable.IconCompat;
|
import android.support.v4.graphics.drawable.IconCompat;
|
||||||
|
|
||||||
import androidx.slice.Slice;
|
import androidx.slice.Slice;
|
||||||
import androidx.slice.SliceMetadata;
|
|
||||||
import androidx.slice.builders.ListBuilder;
|
import androidx.slice.builders.ListBuilder;
|
||||||
import androidx.slice.builders.SliceAction;
|
import androidx.slice.builders.SliceAction;
|
||||||
|
|
||||||
@@ -154,7 +153,7 @@ public class SliceBuilderUtils {
|
|||||||
* @return {@link PendingIntent} for a non-primary {@link SliceAction}.
|
* @return {@link PendingIntent} for a non-primary {@link SliceAction}.
|
||||||
*/
|
*/
|
||||||
public static PendingIntent getActionIntent(Context context, String action, SliceData data) {
|
public static PendingIntent getActionIntent(Context context, String action, SliceData data) {
|
||||||
Intent intent = new Intent(action);
|
final Intent intent = new Intent(action);
|
||||||
intent.setClass(context, SliceBroadcastReceiver.class);
|
intent.setClass(context, SliceBroadcastReceiver.class);
|
||||||
intent.putExtra(EXTRA_SLICE_KEY, data.getKey());
|
intent.putExtra(EXTRA_SLICE_KEY, data.getKey());
|
||||||
intent.putExtra(EXTRA_SLICE_PLATFORM_DEFINED, data.isPlatformDefined());
|
intent.putExtra(EXTRA_SLICE_PLATFORM_DEFINED, data.isPlatformDefined());
|
||||||
@@ -165,11 +164,8 @@ public class SliceBuilderUtils {
|
|||||||
/**
|
/**
|
||||||
* @return {@link PendingIntent} for the primary {@link SliceAction}.
|
* @return {@link PendingIntent} for the primary {@link SliceAction}.
|
||||||
*/
|
*/
|
||||||
public static PendingIntent getContentIntent(Context context, SliceData sliceData) {
|
public static PendingIntent getContentPendingIntent(Context context, SliceData sliceData) {
|
||||||
Intent intent = DatabaseIndexingUtils.buildSearchResultPageIntent(context,
|
final Intent intent = getContentIntent(context, sliceData);
|
||||||
sliceData.getFragmentClassName(), sliceData.getKey(), sliceData.getScreenTitle(),
|
|
||||||
0 /* TODO */);
|
|
||||||
intent.setClassName("com.android.settings", SubSettings.class.getName());
|
|
||||||
return PendingIntent.getActivity(context, 0 /* requestCode */, intent, 0 /* flags */);
|
return PendingIntent.getActivity(context, 0 /* requestCode */, intent, 0 /* flags */);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -215,9 +211,20 @@ public class SliceBuilderUtils {
|
|||||||
.build();
|
.build();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@VisibleForTesting
|
||||||
|
static Intent getContentIntent(Context context, SliceData sliceData) {
|
||||||
|
final Uri contentUri = new Uri.Builder().appendPath(sliceData.getKey()).build();
|
||||||
|
final Intent intent = DatabaseIndexingUtils.buildSearchResultPageIntent(context,
|
||||||
|
sliceData.getFragmentClassName(), sliceData.getKey(), sliceData.getScreenTitle(),
|
||||||
|
0 /* TODO */);
|
||||||
|
intent.setClassName(context.getPackageName(), SubSettings.class.getName());
|
||||||
|
intent.setData(contentUri);
|
||||||
|
return intent;
|
||||||
|
}
|
||||||
|
|
||||||
private static Slice buildToggleSlice(Context context, SliceData sliceData,
|
private static Slice buildToggleSlice(Context context, SliceData sliceData,
|
||||||
BasePreferenceController controller) {
|
BasePreferenceController controller) {
|
||||||
final PendingIntent contentIntent = getContentIntent(context, sliceData);
|
final PendingIntent contentIntent = getContentPendingIntent(context, sliceData);
|
||||||
final Icon icon = Icon.createWithResource(context, sliceData.getIconResource());
|
final Icon icon = Icon.createWithResource(context, sliceData.getIconResource());
|
||||||
final CharSequence subtitleText = getSubtitleText(context, controller, sliceData);
|
final CharSequence subtitleText = getSubtitleText(context, controller, sliceData);
|
||||||
final TogglePreferenceController toggleController =
|
final TogglePreferenceController toggleController =
|
||||||
@@ -237,7 +244,7 @@ public class SliceBuilderUtils {
|
|||||||
|
|
||||||
private static Slice buildIntentSlice(Context context, SliceData sliceData,
|
private static Slice buildIntentSlice(Context context, SliceData sliceData,
|
||||||
BasePreferenceController controller) {
|
BasePreferenceController controller) {
|
||||||
final PendingIntent contentIntent = getContentIntent(context, sliceData);
|
final PendingIntent contentIntent = getContentPendingIntent(context, sliceData);
|
||||||
final Icon icon = Icon.createWithResource(context, sliceData.getIconResource());
|
final Icon icon = Icon.createWithResource(context, sliceData.getIconResource());
|
||||||
final CharSequence subtitleText = getSubtitleText(context, controller, sliceData);
|
final CharSequence subtitleText = getSubtitleText(context, controller, sliceData);
|
||||||
|
|
||||||
@@ -314,12 +321,12 @@ public class SliceBuilderUtils {
|
|||||||
break;
|
break;
|
||||||
case DISABLED_FOR_USER:
|
case DISABLED_FOR_USER:
|
||||||
summary = context.getString(R.string.disabled_for_user_setting_summary);
|
summary = context.getString(R.string.disabled_for_user_setting_summary);
|
||||||
primaryAction = new SliceAction(getContentIntent(context, data),
|
primaryAction = new SliceAction(getContentPendingIntent(context, data),
|
||||||
(IconCompat) null /* actionIcon */, null /* actionTitle */);
|
(IconCompat) null /* actionIcon */, null /* actionTitle */);
|
||||||
break;
|
break;
|
||||||
case DISABLED_DEPENDENT_SETTING:
|
case DISABLED_DEPENDENT_SETTING:
|
||||||
summary = context.getString(R.string.disabled_dependent_setting_summary);
|
summary = context.getString(R.string.disabled_dependent_setting_summary);
|
||||||
primaryAction = new SliceAction(getContentIntent(context, data),
|
primaryAction = new SliceAction(getContentPendingIntent(context, data),
|
||||||
(IconCompat) null /* actionIcon */, null /* actionTitle */);
|
(IconCompat) null /* actionIcon */, null /* actionTitle */);
|
||||||
break;
|
break;
|
||||||
case UNAVAILABLE_UNKNOWN:
|
case UNAVAILABLE_UNKNOWN:
|
||||||
|
@@ -24,8 +24,10 @@ import static org.mockito.Mockito.doReturn;
|
|||||||
import static org.mockito.Mockito.spy;
|
import static org.mockito.Mockito.spy;
|
||||||
import static org.mockito.Mockito.verify;
|
import static org.mockito.Mockito.verify;
|
||||||
|
|
||||||
|
import android.app.PendingIntent;
|
||||||
import android.content.ContentResolver;
|
import android.content.ContentResolver;
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
|
import android.content.Intent;
|
||||||
import android.content.res.Resources;
|
import android.content.res.Resources;
|
||||||
import android.net.Uri;
|
import android.net.Uri;
|
||||||
import android.provider.Settings;
|
import android.provider.Settings;
|
||||||
@@ -389,6 +391,17 @@ public class SliceBuilderUtilsTest {
|
|||||||
SliceTester.testSettingsUnavailableSlice(mContext, slice, data);
|
SliceTester.testSettingsUnavailableSlice(mContext, slice, data);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testContentIntent_includesUniqueData() {
|
||||||
|
final SliceData sliceData = getDummyData();
|
||||||
|
final Uri expectedUri = new Uri.Builder().appendPath(sliceData.getKey()).build();
|
||||||
|
|
||||||
|
final Intent intent = SliceBuilderUtils.getContentIntent(mContext, sliceData);
|
||||||
|
final Uri intentData = intent.getData();
|
||||||
|
|
||||||
|
assertThat(intentData).isEqualTo(expectedUri);
|
||||||
|
}
|
||||||
|
|
||||||
private SliceData getDummyData() {
|
private SliceData getDummyData() {
|
||||||
return getDummyData(TOGGLE_CONTROLLER, SUMMARY, SliceData.SliceType.SWITCH);
|
return getDummyData(TOGGLE_CONTROLLER, SUMMARY, SliceData.SliceType.SWITCH);
|
||||||
}
|
}
|
||||||
|
@@ -64,7 +64,7 @@ public class SliceTester {
|
|||||||
|
|
||||||
final PendingIntent primaryPendingIntent = metadata.getPrimaryAction().getAction();
|
final PendingIntent primaryPendingIntent = metadata.getPrimaryAction().getAction();
|
||||||
assertThat(primaryPendingIntent).isEqualTo(
|
assertThat(primaryPendingIntent).isEqualTo(
|
||||||
SliceBuilderUtils.getContentIntent(context, sliceData));
|
SliceBuilderUtils.getContentPendingIntent(context, sliceData));
|
||||||
|
|
||||||
final List<SliceItem> sliceItems = slice.getItems();
|
final List<SliceItem> sliceItems = slice.getItems();
|
||||||
assertTitle(sliceItems, sliceData.getTitle());
|
assertTitle(sliceItems, sliceData.getTitle());
|
||||||
@@ -97,7 +97,7 @@ public class SliceTester {
|
|||||||
// Check primary intent
|
// Check primary intent
|
||||||
final PendingIntent primaryPendingIntent = metadata.getPrimaryAction().getAction();
|
final PendingIntent primaryPendingIntent = metadata.getPrimaryAction().getAction();
|
||||||
assertThat(primaryPendingIntent).isEqualTo(
|
assertThat(primaryPendingIntent).isEqualTo(
|
||||||
SliceBuilderUtils.getContentIntent(context, sliceData));
|
SliceBuilderUtils.getContentPendingIntent(context, sliceData));
|
||||||
|
|
||||||
final List<SliceItem> sliceItems = slice.getItems();
|
final List<SliceItem> sliceItems = slice.getItems();
|
||||||
assertTitle(sliceItems, sliceData.getTitle());
|
assertTitle(sliceItems, sliceData.getTitle());
|
||||||
@@ -147,7 +147,7 @@ public class SliceTester {
|
|||||||
case DISABLED_FOR_USER:
|
case DISABLED_FOR_USER:
|
||||||
case DISABLED_DEPENDENT_SETTING:
|
case DISABLED_DEPENDENT_SETTING:
|
||||||
assertThat(primaryPendingIntent).isEqualTo(
|
assertThat(primaryPendingIntent).isEqualTo(
|
||||||
SliceBuilderUtils.getContentIntent(context, sliceData));
|
SliceBuilderUtils.getContentPendingIntent(context, sliceData));
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user