diff options
Diffstat (limited to 'java')
| -rw-r--r-- | java/res/layout/chooser_grid_preview_file.xml | 9 | ||||
| -rw-r--r-- | java/res/layout/chooser_grid_preview_image.xml | 9 | ||||
| -rw-r--r-- | java/res/layout/chooser_grid_preview_text.xml | 9 | ||||
| -rw-r--r-- | java/res/values/strings.xml | 7 | ||||
| -rw-r--r-- | java/res/values/styles.xml | 6 | ||||
| -rw-r--r-- | java/src/com/android/intentresolver/ChooserActivity.java | 32 | ||||
| -rw-r--r-- | java/src/com/android/intentresolver/ChooserContentPreviewUi.java | 15 | ||||
| -rw-r--r-- | java/src/com/android/intentresolver/ChooserRequestParameters.java | 28 |
8 files changed, 113 insertions, 2 deletions
diff --git a/java/res/layout/chooser_grid_preview_file.xml b/java/res/layout/chooser_grid_preview_file.xml index e98c3273..94755114 100644 --- a/java/res/layout/chooser_grid_preview_file.xml +++ b/java/res/layout/chooser_grid_preview_file.xml @@ -68,6 +68,15 @@ android:singleLine="true"/> </LinearLayout> + <TextView + android:id="@+id/reselection_action" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:visibility="gone" + android:text="@string/select_files" + android:gravity="center" + style="@style/ReselectionAction" /> + <ViewStub android:id="@+id/action_row_stub" android:layout_width="match_parent" diff --git a/java/res/layout/chooser_grid_preview_image.xml b/java/res/layout/chooser_grid_preview_image.xml index 95cee0cb..23bc25d7 100644 --- a/java/res/layout/chooser_grid_preview_image.xml +++ b/java/res/layout/chooser_grid_preview_image.xml @@ -33,6 +33,15 @@ android:paddingBottom="@dimen/chooser_view_spacing" android:background="?android:attr/colorBackground" /> + <TextView + android:id="@+id/reselection_action" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:visibility="gone" + android:text="@string/select_images" + android:gravity="center" + style="@style/ReselectionAction" /> + <ViewStub android:id="@+id/action_row_stub" android:layout_width="match_parent" diff --git a/java/res/layout/chooser_grid_preview_text.xml b/java/res/layout/chooser_grid_preview_text.xml index db7282e3..49a2edff 100644 --- a/java/res/layout/chooser_grid_preview_text.xml +++ b/java/res/layout/chooser_grid_preview_text.xml @@ -52,6 +52,15 @@ </RelativeLayout> + <TextView + android:id="@+id/reselection_action" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:visibility="gone" + android:text="@string/select_text" + android:gravity="center" + style="@style/ReselectionAction" /> + <ViewStub android:id="@+id/action_row_stub" android:layout_width="match_parent" diff --git a/java/res/values/strings.xml b/java/res/values/strings.xml index a536d3bc..59179504 100644 --- a/java/res/values/strings.xml +++ b/java/res/values/strings.xml @@ -101,4 +101,11 @@ <string name="miniresolver_use_personal_browser">Use personal browser</string> <!-- Button option. Open the link in the work browser. [CHAR LIMIT=NONE] --> <string name="miniresolver_use_work_browser">Use work browser</string> + + <!-- Tittle for a button. Launches client-provided content reselection action. --> + <string name="select_files">Select Files</string> + <!-- Tittle for a button. Launches client-provided content reselection action. --> + <string name="select_images">Select Images</string> + <!-- Tittle for a button. Launches client-provided content reselection action. --> + <string name="select_text">Select Text</string> </resources> diff --git a/java/res/values/styles.xml b/java/res/values/styles.xml index cbbf406d..229512fa 100644 --- a/java/res/values/styles.xml +++ b/java/res/values/styles.xml @@ -46,4 +46,10 @@ <item name="*android:iconfactoryIconSize">@dimen/chooser_icon_size</item> <item name="*android:iconfactoryBadgeSize">@dimen/chooser_badge_size</item> </style> + + <style name="ReselectionAction"> + <item name="android:paddingTop">5dp</item> + <item name="android:paddingBottom">5dp</item> + <item name="android:textColor">?android:attr/textColorPrimary</item> + </style> </resources> diff --git a/java/src/com/android/intentresolver/ChooserActivity.java b/java/src/com/android/intentresolver/ChooserActivity.java index dce8bde1..5a1d2a39 100644 --- a/java/src/com/android/intentresolver/ChooserActivity.java +++ b/java/src/com/android/intentresolver/ChooserActivity.java @@ -160,6 +160,7 @@ public class ChooserActivity extends ResolverActivity implements private static final boolean DEBUG = true; static final boolean ENABLE_CUSTOM_ACTIONS = false; + static final boolean ENABLE_RESELECTION_ACTION = false; public static final String LAUNCH_LOCATION_DIRECT_SHARE = "direct_share"; private static final String SHORTCUT_TARGET = "shortcut_target"; @@ -267,7 +268,11 @@ public class ChooserActivity extends ResolverActivity implements try { mChooserRequest = new ChooserRequestParameters( - getIntent(), getReferrer(), getNearbySharingComponent(), ENABLE_CUSTOM_ACTIONS); + getIntent(), + getReferrer(), + getNearbySharingComponent(), + ENABLE_CUSTOM_ACTIONS, + ENABLE_RESELECTION_ACTION); } catch (IllegalArgumentException e) { Log.e(TAG, "Caller provided invalid Chooser request parameters", e); finish(); @@ -743,6 +748,18 @@ public class ChooserActivity extends ResolverActivity implements } return actions; } + + @Nullable + @Override + public Runnable getReselectionAction() { + if (!ENABLE_RESELECTION_ACTION) { + return null; + } + PendingIntent reselectionAction = mChooserRequest.getReselectionAction(); + return reselectionAction == null + ? null + : createReselectionRunnable(reselectionAction); + } }; ViewGroup layout = ChooserContentPreviewUi.displayContentPreview( @@ -962,6 +979,19 @@ public class ChooserActivity extends ResolverActivity implements ); } + private Runnable createReselectionRunnable(PendingIntent pendingIntent) { + return () -> { + try { + pendingIntent.send(); + } catch (PendingIntent.CanceledException e) { + Log.d(TAG, "Payload reselection action has been cancelled"); + } + // TODO: add reporting + setResult(RESULT_OK); + finish(); + }; + } + @Nullable private View getFirstVisibleImgPreviewView() { View firstImage = findViewById(com.android.internal.R.id.content_preview_image_1_large); diff --git a/java/src/com/android/intentresolver/ChooserContentPreviewUi.java b/java/src/com/android/intentresolver/ChooserContentPreviewUi.java index 27645da4..390c47c7 100644 --- a/java/src/com/android/intentresolver/ChooserContentPreviewUi.java +++ b/java/src/com/android/intentresolver/ChooserContentPreviewUi.java @@ -90,6 +90,12 @@ public final class ChooserContentPreviewUi { /** Create custom actions */ List<ActionRow.Action> createCustomActions(); + + /** + * Provides a re-selection action, if any. + */ + @Nullable + Runnable getReselectionAction(); } /** @@ -218,6 +224,15 @@ public final class ChooserContentPreviewUi { default: Log.e(TAG, "Unexpected content preview type: " + previewType); } + Runnable reselectionAction = actionFactory.getReselectionAction(); + if (reselectionAction != null && layout != null + && ChooserActivity.ENABLE_RESELECTION_ACTION) { + View reselectionView = layout.findViewById(R.id.reselection_action); + if (reselectionView != null) { + reselectionView.setVisibility(View.VISIBLE); + reselectionView.setOnClickListener(view -> reselectionAction.run()); + } + } return layout; } diff --git a/java/src/com/android/intentresolver/ChooserRequestParameters.java b/java/src/com/android/intentresolver/ChooserRequestParameters.java index a7e543a5..97bee82c 100644 --- a/java/src/com/android/intentresolver/ChooserRequestParameters.java +++ b/java/src/com/android/intentresolver/ChooserRequestParameters.java @@ -18,6 +18,7 @@ package com.android.intentresolver; import android.annotation.NonNull; import android.annotation.Nullable; +import android.app.PendingIntent; import android.content.ComponentName; import android.content.Intent; import android.content.IntentFilter; @@ -72,6 +73,7 @@ public class ChooserRequestParameters { private final ImmutableList<ComponentName> mFilteredComponentNames; private final ImmutableList<ChooserTarget> mCallerChooserTargets; private final ImmutableList<ChooserAction> mChooserActions; + private final PendingIntent mReselectionAction; private final boolean mRetainInOnStop; @Nullable @@ -99,7 +101,8 @@ public class ChooserRequestParameters { final Intent clientIntent, final Uri referrer, @Nullable final ComponentName nearbySharingComponent, - boolean extractCustomActions) { + boolean extractCustomActions, + boolean extractReslectionAction) { final Intent requestedTarget = parseTargetIntentExtra( clientIntent.getParcelableExtra(Intent.EXTRA_INTENT)); mTarget = intentWithModifiedLaunchFlags(requestedTarget); @@ -137,6 +140,9 @@ public class ChooserRequestParameters { mChooserActions = extractCustomActions ? getChooserActions(clientIntent) : ImmutableList.of(); + mReselectionAction = extractReslectionAction + ? getReselectionActionExtra(clientIntent) + : null; } public Intent getTargetIntent() { @@ -182,6 +188,11 @@ public class ChooserRequestParameters { return mChooserActions; } + @Nullable + public PendingIntent getReselectionAction() { + return mReselectionAction; + } + /** * Whether the {@link ChooserActivity.EXTRA_PRIVATE_RETAIN_IN_ON_STOP} behavior was requested. */ @@ -321,6 +332,21 @@ public class ChooserRequestParameters { .collect(toImmutableList()); } + @Nullable + private static PendingIntent getReselectionActionExtra(Intent intent) { + try { + return intent.getParcelableExtra( + Intent.EXTRA_CHOOSER_PAYLOAD_RESELECTION_ACTION, + PendingIntent.class); + } catch (Throwable t) { + Log.w( + TAG, + "Unable to retrieve Intent.EXTRA_CHOOSER_PAYLOAD_RESELECTION_ACTION argument", + t); + return null; + } + } + private static <T> Collector<T, ?, ImmutableList<T>> toImmutableList() { return Collectors.collectingAndThen(Collectors.toList(), ImmutableList::copyOf); } |