|
1 | 1 | package com.example.test;
|
2 | 2 |
|
| 3 | +import java.io.FileNotFoundException; |
3 | 4 | import android.app.Activity;
|
4 | 5 | import android.app.PendingIntent;
|
5 | 6 | import android.content.Context;
|
6 | 7 | import android.content.Intent;
|
| 8 | +import android.content.res.AssetFileDescriptor; |
| 9 | +import android.net.Uri; |
| 10 | +import android.os.Bundle; |
| 11 | +import android.os.CancellationSignal; |
| 12 | +import android.os.RemoteException; |
| 13 | +import androidx.core.graphics.drawable.IconCompat; |
| 14 | +import androidx.slice.Slice; |
| 15 | +import androidx.slice.SliceProvider; |
| 16 | +import androidx.slice.builders.ListBuilder; |
| 17 | +import androidx.slice.builders.SliceAction; |
| 18 | +import androidx.slice.core.SliceHints.ImageMode; |
7 | 19 |
|
8 | 20 | public class ImplicitPendingIntentsTest {
|
9 | 21 |
|
@@ -75,4 +87,71 @@ public static void test(Context ctx) throws PendingIntent.CanceledException {
|
75 | 87 | }
|
76 | 88 |
|
77 | 89 | }
|
| 90 | + |
| 91 | + static class TestSliceProvider extends SliceProvider { |
| 92 | + |
| 93 | + @Override |
| 94 | + public Slice onBindSlice(Uri sliceUri) { |
| 95 | + if (sliceUri.getAuthority().equals("1")) { |
| 96 | + Intent baseIntent = new Intent(); |
| 97 | + PendingIntent pi = PendingIntent.getActivity(getContext(), 0, baseIntent, 0); |
| 98 | + SliceAction activityAction = SliceAction.createDeeplink(pi, null, 0, "Test"); |
| 99 | + ListBuilder listBuilder = new ListBuilder(getContext(), sliceUri, null); |
| 100 | + listBuilder.addRow(new ListBuilder.RowBuilder().setTitle("Title") |
| 101 | + .setPrimaryAction(activityAction)); |
| 102 | + return listBuilder.build(); // $hasTaintFlow |
| 103 | + |
| 104 | + } else if (sliceUri.getAuthority().equals("2")) { |
| 105 | + Intent baseIntent = new Intent(getContext(), Activity.class); // Sanitizer |
| 106 | + PendingIntent pi = PendingIntent.getActivity(getContext(), 0, baseIntent, 0); |
| 107 | + SliceAction activityAction = SliceAction.createDeeplink(pi, null, 0, "Test"); |
| 108 | + ListBuilder listBuilder = new ListBuilder(getContext(), sliceUri, null); |
| 109 | + listBuilder.addRow(new ListBuilder.RowBuilder().setTitle("Title") |
| 110 | + .setPrimaryAction(activityAction)); |
| 111 | + return listBuilder.build(); // Safe |
| 112 | + |
| 113 | + } else { |
| 114 | + Intent baseIntent = new Intent(); |
| 115 | + PendingIntent pi = PendingIntent.getActivity(getContext(), 0, baseIntent, |
| 116 | + PendingIntent.FLAG_IMMUTABLE); // Sanitizer |
| 117 | + SliceAction activityAction = SliceAction.createDeeplink(pi, null, 0, "Test"); |
| 118 | + ListBuilder listBuilder = new ListBuilder(getContext(), sliceUri, null); |
| 119 | + listBuilder.addRow(new ListBuilder.RowBuilder().setTitle("Title") |
| 120 | + .setPrimaryAction(activityAction)); |
| 121 | + return listBuilder.build(); // Safe |
| 122 | + } |
| 123 | + } |
| 124 | + |
| 125 | + @Override |
| 126 | + public PendingIntent onCreatePermissionRequest(Uri sliceUri, String callingPackage) { |
| 127 | + if (sliceUri.getAuthority().equals("1")) { |
| 128 | + Intent baseIntent = new Intent(); |
| 129 | + PendingIntent pi = PendingIntent.getActivity(getContext(), 0, baseIntent, 0); |
| 130 | + return pi; // $hasTaintFlow |
| 131 | + } else { |
| 132 | + Intent baseIntent = new Intent(); |
| 133 | + PendingIntent pi = PendingIntent.getActivity(getContext(), 0, baseIntent, |
| 134 | + PendingIntent.FLAG_IMMUTABLE); // Sanitizer |
| 135 | + return pi; // Safe |
| 136 | + } |
| 137 | + } |
| 138 | + |
| 139 | + // Implementations needed for compilation |
| 140 | + @Override |
| 141 | + public boolean onCreateSliceProvider() { |
| 142 | + return true; |
| 143 | + } |
| 144 | + |
| 145 | + @Override |
| 146 | + public AssetFileDescriptor openTypedAssetFile(Uri uri, String mimeTypeFilter, Bundle opts, |
| 147 | + CancellationSignal signal) throws RemoteException, FileNotFoundException { |
| 148 | + return null; |
| 149 | + } |
| 150 | + |
| 151 | + @Override |
| 152 | + public Bundle call(String authority, String method, String arg, Bundle extras) |
| 153 | + throws RemoteException { |
| 154 | + return null; |
| 155 | + } |
| 156 | + } |
78 | 157 | }
|
0 commit comments