method public void notifyAppWidgetViewDataChanged(int, int);
method public void partiallyUpdateAppWidget(int[], android.widget.RemoteViews);
method public void partiallyUpdateAppWidget(int, android.widget.RemoteViews);
- method public boolean requestPinAppWidget(android.content.ComponentName, android.app.PendingIntent);
+ method public boolean requestPinAppWidget(android.content.ComponentName, android.os.Bundle, android.app.PendingIntent);
method public void updateAppWidget(int[], android.widget.RemoteViews);
method public void updateAppWidget(int, android.widget.RemoteViews);
method public void updateAppWidget(android.content.ComponentName, android.widget.RemoteViews);
field public static final java.lang.String EXTRA_APPWIDGET_IDS = "appWidgetIds";
field public static final java.lang.String EXTRA_APPWIDGET_OLD_IDS = "appWidgetOldIds";
field public static final java.lang.String EXTRA_APPWIDGET_OPTIONS = "appWidgetOptions";
+ field public static final java.lang.String EXTRA_APPWIDGET_PREVIEW = "appWidgetPreview";
field public static final java.lang.String EXTRA_APPWIDGET_PROVIDER = "appWidgetProvider";
field public static final java.lang.String EXTRA_APPWIDGET_PROVIDER_PROFILE = "appWidgetProviderProfile";
field public static final java.lang.String EXTRA_CUSTOM_EXTRAS = "customExtras";
method public boolean accept();
method public int describeContents();
method public android.appwidget.AppWidgetProviderInfo getAppWidgetProviderInfo(android.content.Context);
+ method public android.os.Bundle getExtras();
method public int getRequestType();
method public android.content.pm.ShortcutInfo getShortcutInfo();
method public boolean isValid();
field public static final int BATTERY_PLUGGED_AC = 1; // 0x1
field public static final int BATTERY_PLUGGED_USB = 2; // 0x2
field public static final int BATTERY_PLUGGED_WIRELESS = 4; // 0x4
- field public static final int BATTERY_PROPERTY_STATUS = 6; // 0x6
field public static final int BATTERY_PROPERTY_CAPACITY = 4; // 0x4
field public static final int BATTERY_PROPERTY_CHARGE_COUNTER = 1; // 0x1
field public static final int BATTERY_PROPERTY_CURRENT_AVERAGE = 3; // 0x3
field public static final int BATTERY_PROPERTY_CURRENT_NOW = 2; // 0x2
field public static final int BATTERY_PROPERTY_ENERGY_COUNTER = 5; // 0x5
+ field public static final int BATTERY_PROPERTY_STATUS = 6; // 0x6
field public static final int BATTERY_STATUS_CHARGING = 2; // 0x2
field public static final int BATTERY_STATUS_DISCHARGING = 3; // 0x3
field public static final int BATTERY_STATUS_FULL = 5; // 0x5
method public void notifyAppWidgetViewDataChanged(int, int);
method public void partiallyUpdateAppWidget(int[], android.widget.RemoteViews);
method public void partiallyUpdateAppWidget(int, android.widget.RemoteViews);
- method public boolean requestPinAppWidget(android.content.ComponentName, android.app.PendingIntent);
+ method public boolean requestPinAppWidget(android.content.ComponentName, android.os.Bundle, android.app.PendingIntent);
method public void updateAppWidget(int[], android.widget.RemoteViews);
method public void updateAppWidget(int, android.widget.RemoteViews);
method public void updateAppWidget(android.content.ComponentName, android.widget.RemoteViews);
field public static final java.lang.String EXTRA_APPWIDGET_IDS = "appWidgetIds";
field public static final java.lang.String EXTRA_APPWIDGET_OLD_IDS = "appWidgetOldIds";
field public static final java.lang.String EXTRA_APPWIDGET_OPTIONS = "appWidgetOptions";
+ field public static final java.lang.String EXTRA_APPWIDGET_PREVIEW = "appWidgetPreview";
field public static final java.lang.String EXTRA_APPWIDGET_PROVIDER = "appWidgetProvider";
field public static final java.lang.String EXTRA_APPWIDGET_PROVIDER_PROFILE = "appWidgetProviderProfile";
field public static final java.lang.String EXTRA_CUSTOM_EXTRAS = "customExtras";
method public boolean accept();
method public int describeContents();
method public android.appwidget.AppWidgetProviderInfo getAppWidgetProviderInfo(android.content.Context);
+ method public android.os.Bundle getExtras();
method public int getRequestType();
method public android.content.pm.ShortcutInfo getShortcutInfo();
method public boolean isValid();
field public static final int BATTERY_PLUGGED_AC = 1; // 0x1
field public static final int BATTERY_PLUGGED_USB = 2; // 0x2
field public static final int BATTERY_PLUGGED_WIRELESS = 4; // 0x4
- field public static final int BATTERY_PROPERTY_STATUS = 6; // 0x6
field public static final int BATTERY_PROPERTY_CAPACITY = 4; // 0x4
field public static final int BATTERY_PROPERTY_CHARGE_COUNTER = 1; // 0x1
field public static final int BATTERY_PROPERTY_CURRENT_AVERAGE = 3; // 0x3
field public static final int BATTERY_PROPERTY_CURRENT_NOW = 2; // 0x2
field public static final int BATTERY_PROPERTY_ENERGY_COUNTER = 5; // 0x5
+ field public static final int BATTERY_PROPERTY_STATUS = 6; // 0x6
field public static final int BATTERY_STATUS_CHARGING = 2; // 0x2
field public static final int BATTERY_STATUS_DISCHARGING = 3; // 0x3
field public static final int BATTERY_STATUS_FULL = 5; // 0x5
method public void notifyAppWidgetViewDataChanged(int, int);
method public void partiallyUpdateAppWidget(int[], android.widget.RemoteViews);
method public void partiallyUpdateAppWidget(int, android.widget.RemoteViews);
- method public boolean requestPinAppWidget(android.content.ComponentName, android.app.PendingIntent);
+ method public boolean requestPinAppWidget(android.content.ComponentName, android.os.Bundle, android.app.PendingIntent);
method public void updateAppWidget(int[], android.widget.RemoteViews);
method public void updateAppWidget(int, android.widget.RemoteViews);
method public void updateAppWidget(android.content.ComponentName, android.widget.RemoteViews);
field public static final java.lang.String EXTRA_APPWIDGET_IDS = "appWidgetIds";
field public static final java.lang.String EXTRA_APPWIDGET_OLD_IDS = "appWidgetOldIds";
field public static final java.lang.String EXTRA_APPWIDGET_OPTIONS = "appWidgetOptions";
+ field public static final java.lang.String EXTRA_APPWIDGET_PREVIEW = "appWidgetPreview";
field public static final java.lang.String EXTRA_APPWIDGET_PROVIDER = "appWidgetProvider";
field public static final java.lang.String EXTRA_APPWIDGET_PROVIDER_PROFILE = "appWidgetProviderProfile";
field public static final java.lang.String EXTRA_CUSTOM_EXTRAS = "customExtras";
method public boolean accept();
method public int describeContents();
method public android.appwidget.AppWidgetProviderInfo getAppWidgetProviderInfo(android.content.Context);
+ method public android.os.Bundle getExtras();
method public int getRequestType();
method public android.content.pm.ShortcutInfo getShortcutInfo();
method public boolean isValid();
field public static final int BATTERY_PLUGGED_AC = 1; // 0x1
field public static final int BATTERY_PLUGGED_USB = 2; // 0x2
field public static final int BATTERY_PLUGGED_WIRELESS = 4; // 0x4
- field public static final int BATTERY_PROPERTY_STATUS = 6; // 0x6
field public static final int BATTERY_PROPERTY_CAPACITY = 4; // 0x4
field public static final int BATTERY_PROPERTY_CHARGE_COUNTER = 1; // 0x1
field public static final int BATTERY_PROPERTY_CURRENT_AVERAGE = 3; // 0x3
field public static final int BATTERY_PROPERTY_CURRENT_NOW = 2; // 0x2
field public static final int BATTERY_PROPERTY_ENERGY_COUNTER = 5; // 0x5
+ field public static final int BATTERY_PROPERTY_STATUS = 6; // 0x6
field public static final int BATTERY_STATUS_CHARGING = 2; // 0x2
field public static final int BATTERY_STATUS_DISCHARGING = 3; // 0x3
field public static final int BATTERY_STATUS_FULL = 5; // 0x5
public static final String EXTRA_APPWIDGET_OLD_IDS = "appWidgetOldIds";
/**
+ * An extra that can be passed to
+ * {@link #requestPinAppWidget(ComponentName, Bundle, PendingIntent)}. This would allow the
+ * launcher app to present a custom preview to the user.
+ *
+ * <p>
+ * The value should be a {@link RemoteViews} similar to what is used with
+ * {@link #updateAppWidget} calls.
+ */
+ public static final String EXTRA_APPWIDGET_PREVIEW = "appWidgetPreview";
+
+ /**
* Field for the manifest meta-data tag.
*
* @see AppWidgetProviderInfo
/**
* Return {@code TRUE} if the default launcher supports
- * {@link #requestPinAppWidget(ComponentName, PendingIntent)}
+ * {@link #requestPinAppWidget(ComponentName, Bundle, PendingIntent)}
*/
public boolean isRequestPinAppWidgetSupported() {
try {
}
/**
+ * Only used during development. Can be deleted before release.
+ * @hide
+ */
+ public boolean requestPinAppWidget(@NonNull ComponentName provider,
+ @Nullable PendingIntent successCallback) {
+ return requestPinAppWidget(provider, null, successCallback);
+ }
+
+ /**
* Request to pin an app widget on the current launcher. It's up to the launcher to accept this
* request (optionally showing a user confirmation). If the request is accepted, the caller will
* get a confirmation with extra {@link #EXTRA_APPWIDGET_ID}.
*
* @param provider The {@link ComponentName} for the {@link
* android.content.BroadcastReceiver BroadcastReceiver} provider for your AppWidget.
+ * @param extras In not null, this is passed to the launcher app. For eg {@link
+ * #EXTRA_APPWIDGET_PREVIEW} can be used for a custom preview.
* @param successCallback If not null, this intent will be sent when the widget is created.
*
* @return {@code TRUE} if the launcher supports this feature. Note the API will return without
* service or when the user is locked.
*/
public boolean requestPinAppWidget(@NonNull ComponentName provider,
- @Nullable PendingIntent successCallback) {
+ @Nullable Bundle extras, @Nullable PendingIntent successCallback) {
try {
- return mService.requestPinAppWidget(mPackageName, provider,
- successCallback == null ? null : successCallback.getIntentSender());
+ return mService.requestPinAppWidget(mPackageName, provider, extras,
+ successCallback == null ? null : successCallback.getIntentSender());
} catch (RemoteException e) {
throw e.rethrowFromSystemServer();
}
boolean accept(in Bundle options);
ShortcutInfo getShortcutInfo();
AppWidgetProviderInfo getAppWidgetProviderInfo();
+ Bundle getExtras();
}
}
/**
+ * Any extras sent by the requesting app.
+ */
+ @Nullable
+ public Bundle getExtras() {
+ try {
+ return mInner.getExtras();
+ } catch (RemoteException e) {
+ throw e.rethrowAsRuntimeException();
+ }
+ }
+
+ /**
* Return {@code TRUE} if a request is valid -- i.e. {@link #accept(Bundle)} has not been
* called yet.
*/
import android.content.Intent;
import android.content.IntentSender;
import android.content.pm.LauncherApps.ShortcutQuery;
+import android.os.Bundle;
import android.os.ParcelFileDescriptor;
import java.util.List;
@NonNull String callingPackage);
public abstract boolean requestPinAppWidget(@NonNull String callingPackage,
- @NonNull AppWidgetProviderInfo appWidget, @Nullable IntentSender resultIntent,
- int userId);
+ @NonNull AppWidgetProviderInfo appWidget, @Nullable Bundle extras,
+ @Nullable IntentSender resultIntent, int userId);
public abstract boolean isRequestPinItemSupported(int callingUserId, int requestType);
}
int[] getAppWidgetIds(in ComponentName providerComponent);
boolean isBoundWidgetPackage(String packageName, int userId);
boolean requestPinAppWidget(String packageName, in ComponentName providerComponent,
- in IntentSender resultIntent);
+ in Bundle extras, in IntentSender resultIntent);
boolean isRequestPinAppWidgetSupported();
}
@Override
public boolean requestPinAppWidget(String callingPackage, ComponentName componentName,
- IntentSender resultSender) {
+ Bundle extras, IntentSender resultSender) {
final int callingUid = Binder.getCallingUid();
final int userId = UserHandle.getUserId(callingUid);
}
return LocalServices.getService(ShortcutServiceInternal.class)
- .requestPinAppWidget(callingPackage, info, resultSender, userId);
+ .requestPinAppWidget(callingPackage, info, extras, resultSender, userId);
}
@Override
import android.content.pm.LauncherApps.PinItemRequest;
import android.content.pm.ShortcutInfo;
import android.os.Bundle;
+import android.os.RemoteException;
import android.os.UserHandle;
import android.util.Log;
import android.util.Pair;
mLauncherUid = launcherUid;
}
+ @Override
public ShortcutInfo getShortcutInfo() {
return null;
}
+ @Override
public AppWidgetProviderInfo getAppWidgetProviderInfo() {
return null;
}
+ @Override
+ public Bundle getExtras() {
+ return null;
+ }
+
/**
* Returns true if the caller is same as the default launcher app when this request
* object was created.
*/
private static class PinAppWidgetRequestInner extends PinItemRequestInner {
final AppWidgetProviderInfo mAppWidgetProviderInfo;
+ final Bundle mExtras;
private PinAppWidgetRequestInner(ShortcutRequestPinProcessor processor,
IntentSender resultIntent, int launcherUid,
- AppWidgetProviderInfo appWidgetProviderInfo) {
+ AppWidgetProviderInfo appWidgetProviderInfo, Bundle extras) {
super(processor, resultIntent, launcherUid);
mAppWidgetProviderInfo = appWidgetProviderInfo;
+ mExtras = extras;
}
@Override
public AppWidgetProviderInfo getAppWidgetProviderInfo() {
return mAppWidgetProviderInfo;
}
+
+ @Override
+ public Bundle getExtras() {
+ return mExtras;
+ }
}
/**
* always null.
*/
public boolean requestPinItemLocked(ShortcutInfo inShortcut, AppWidgetProviderInfo inAppWidget,
- int userId, IntentSender resultIntent) {
+ Bundle extras, int userId, IntentSender resultIntent) {
// First, make sure the launcher supports it.
int launcherUid = mService.injectGetPackageUid(
confirmActivity.first.getPackageName(), launcherUserId);
request = new PinItemRequest(
- new PinAppWidgetRequestInner(this, resultIntent, launcherUid, inAppWidget),
+ new PinAppWidgetRequestInner(this, resultIntent, launcherUid, inAppWidget,
+ extras),
PinItemRequest.REQUEST_TYPE_APPWIDGET);
}
return startRequestConfirmActivity(confirmActivity.first, launcherUserId, request,
import android.net.Uri;
import android.os.Binder;
import android.os.Build;
+import android.os.Bundle;
import android.os.Environment;
import android.os.FileUtils;
import android.os.Handler;
IntentSender resultIntent, int userId) {
Preconditions.checkNotNull(shortcut);
Preconditions.checkArgument(shortcut.isEnabled(), "Shortcut must be enabled");
- return requestPinItem(packageName, userId, shortcut, null, resultIntent);
+ return requestPinItem(packageName, userId, shortcut, null, null, resultIntent);
}
@Override
* After validating the caller, it passes the request to {@link #mShortcutRequestPinProcessor}.
* Either {@param shortcut} or {@param appWidget} should be non-null.
*/
- private boolean requestPinItem(String packageName, int userId,
- ShortcutInfo shortcut, AppWidgetProviderInfo appWidget, IntentSender resultIntent) {
+ private boolean requestPinItem(String packageName, int userId, ShortcutInfo shortcut,
+ AppWidgetProviderInfo appWidget, Bundle extras, IntentSender resultIntent) {
verifyCaller(packageName, userId);
final boolean ret;
"Calling application must have a foreground activity or a foreground service");
// Send request to the launcher, if supported.
- ret = mShortcutRequestPinProcessor.requestPinItemLocked(shortcut, appWidget, userId,
- resultIntent);
+ ret = mShortcutRequestPinProcessor.requestPinItemLocked(shortcut, appWidget, extras,
+ userId, resultIntent);
}
verifyStates();
@Override
public boolean requestPinAppWidget(@NonNull String callingPackage,
- @NonNull AppWidgetProviderInfo appWidget, @Nullable IntentSender resultIntent,
- int userId) {
+ @NonNull AppWidgetProviderInfo appWidget, @Nullable Bundle extras,
+ @Nullable IntentSender resultIntent, int userId) {
Preconditions.checkNotNull(appWidget);
- return requestPinItem(callingPackage, userId, null, appWidget, resultIntent);
+ return requestPinItem(callingPackage, userId, null, appWidget, extras, resultIntent);
}
@Override
import android.content.IntentSender;
import android.content.pm.LauncherApps;
import android.content.pm.ShortcutServiceInternal;
+import android.os.Bundle;
import android.os.Handler;
import android.os.UserHandle;
import android.test.InstrumentationTestCase;
if (otherProvider == null) {
// No other provider found. Ignore this test.
}
- assertFalse(mManager.requestPinAppWidget(otherProvider, null));
+ assertFalse(mManager.requestPinAppWidget(otherProvider, null, null));
}
public void testRequestPinAppWidget() {
ComponentName provider = new ComponentName(mTestContext, DummyAppWidget.class);
// Set up users.
when(mMockShortcutService.requestPinAppWidget(anyString(),
- any(AppWidgetProviderInfo.class), any(IntentSender.class), anyInt()))
+ any(AppWidgetProviderInfo.class), any(Bundle.class), any(IntentSender.class), anyInt()))
.thenReturn(true);
- assertTrue(mManager.requestPinAppWidget(provider, null));
+ assertTrue(mManager.requestPinAppWidget(provider, null, null));
final ArgumentCaptor<AppWidgetProviderInfo> providerCaptor =
ArgumentCaptor.forClass(AppWidgetProviderInfo.class);
verify(mMockShortcutService, times(1)).requestPinAppWidget(anyString(),
- providerCaptor.capture(), eq(null), anyInt());
+ providerCaptor.capture(), any(null), eq(null), anyInt());
assertEquals(provider, providerCaptor.getValue().provider);
}
assertExpectException(IllegalStateException.class, "foreground activity", () -> {
mInternal.requestPinAppWidget(CALLING_PACKAGE_1, makeProviderInfo("dummy"),
- /* resultIntent= */ null, USER_P0);
+ null /* extras */, null /* resultIntent= */, USER_P0);
});
verify(mServiceContext, times(0)).sendIntentSender(any(IntentSender.class));
runWithCaller(CALLING_PACKAGE_1, USER_P0, () -> {
AppWidgetProviderInfo info = makeProviderInfo("c1");
- assertTrue(mInternal.requestPinAppWidget(CALLING_PACKAGE_1, info,
+ assertTrue(mInternal.requestPinAppWidget(CALLING_PACKAGE_1, info, null,
resultIntent == null ? null : resultIntent.getIntentSender(), USER_P0));
verify(mServiceContext, times(0)).sendIntentSender(any(IntentSender.class));