Merge "Fix issue #8470131: Process thrash kills battery" into jb-mr2-dev
This commit is contained in:
committed by
Android (Google) Code Review
commit
3bcc2fbaad
@@ -49,8 +49,8 @@ public class AppWidgetManager {
|
||||
static final String TAG = "AppWidgetManager";
|
||||
|
||||
/**
|
||||
* Send this from your {@link AppWidgetHost} activity when you want to pick an AppWidget to display.
|
||||
* The AppWidget picker activity will be launched.
|
||||
* Activity action to launch from your {@link AppWidgetHost} activity when you want to
|
||||
* pick an AppWidget to display. The AppWidget picker activity will be launched.
|
||||
* <p>
|
||||
* You must supply the following extras:
|
||||
* <table>
|
||||
@@ -89,8 +89,8 @@ public class AppWidgetManager {
|
||||
ACTION_KEYGUARD_APPWIDGET_PICK = "android.appwidget.action.KEYGUARD_APPWIDGET_PICK";
|
||||
|
||||
/**
|
||||
* Send this from your {@link AppWidgetHost} activity when you want to bind an AppWidget to
|
||||
* display and bindAppWidgetIdIfAllowed returns false.
|
||||
* Activity action to launch from your {@link AppWidgetHost} activity when you want to bind
|
||||
* an AppWidget to display and bindAppWidgetIdIfAllowed returns false.
|
||||
* <p>
|
||||
* You must supply the following extras:
|
||||
* <table>
|
||||
@@ -269,6 +269,9 @@ public class AppWidgetManager {
|
||||
/**
|
||||
* Sent when the custom extras for an AppWidget change.
|
||||
*
|
||||
* <p class="note">This is a protected intent that can only be sent
|
||||
* by the system.
|
||||
*
|
||||
* @see AppWidgetProvider#onAppWidgetOptionsChanged
|
||||
* AppWidgetProvider.onAppWidgetOptionsChanged(Context context,
|
||||
* AppWidgetManager appWidgetManager, int appWidgetId, Bundle newExtras)
|
||||
@@ -278,6 +281,9 @@ public class AppWidgetManager {
|
||||
/**
|
||||
* Sent when an instance of an AppWidget is deleted from its host.
|
||||
*
|
||||
* <p class="note">This is a protected intent that can only be sent
|
||||
* by the system.
|
||||
*
|
||||
* @see AppWidgetProvider#onDeleted AppWidgetProvider.onDeleted(Context context, int[] appWidgetIds)
|
||||
*/
|
||||
public static final String ACTION_APPWIDGET_DELETED = "android.appwidget.action.APPWIDGET_DELETED";
|
||||
@@ -285,6 +291,9 @@ public class AppWidgetManager {
|
||||
/**
|
||||
* Sent when an instance of an AppWidget is removed from the last host.
|
||||
*
|
||||
* <p class="note">This is a protected intent that can only be sent
|
||||
* by the system.
|
||||
*
|
||||
* @see AppWidgetProvider#onEnabled AppWidgetProvider.onEnabled(Context context)
|
||||
*/
|
||||
public static final String ACTION_APPWIDGET_DISABLED = "android.appwidget.action.APPWIDGET_DISABLED";
|
||||
@@ -294,6 +303,9 @@ public class AppWidgetManager {
|
||||
* This broadcast is sent at boot time if there is a AppWidgetHost installed with
|
||||
* an instance for this provider.
|
||||
*
|
||||
* <p class="note">This is a protected intent that can only be sent
|
||||
* by the system.
|
||||
*
|
||||
* @see AppWidgetProvider#onEnabled AppWidgetProvider.onEnabled(Context context)
|
||||
*/
|
||||
public static final String ACTION_APPWIDGET_ENABLED = "android.appwidget.action.APPWIDGET_ENABLED";
|
||||
|
||||
@@ -74,6 +74,11 @@
|
||||
<protected-broadcast android:name="android.app.action.ENTER_DESK_MODE" />
|
||||
<protected-broadcast android:name="android.app.action.EXIT_DESK_MODE" />
|
||||
|
||||
<protected-broadcast android:name="android.appwidget.action.APPWIDGET_UPDATE_OPTIONS" />
|
||||
<protected-broadcast android:name="android.appwidget.action.APPWIDGET_DELETED" />
|
||||
<protected-broadcast android:name="android.appwidget.action.APPWIDGET_DISABLED" />
|
||||
<protected-broadcast android:name="android.appwidget.action.APPWIDGET_ENABLED" />
|
||||
|
||||
<protected-broadcast android:name="android.backup.intent.RUN" />
|
||||
<protected-broadcast android:name="android.backup.intent.CLEAR" />
|
||||
<protected-broadcast android:name="android.backup.intent.INIT" />
|
||||
|
||||
@@ -19,6 +19,7 @@ package com.android.server.am;
|
||||
import static android.content.pm.PackageManager.PERMISSION_GRANTED;
|
||||
|
||||
import android.app.AppOpsManager;
|
||||
import android.appwidget.AppWidgetManager;
|
||||
import com.android.internal.R;
|
||||
import com.android.internal.os.BatteryStatsImpl;
|
||||
import com.android.internal.os.ProcessStats;
|
||||
@@ -11791,6 +11792,32 @@ public final class ActivityManagerService extends ActivityManagerNative
|
||||
+ callingPid + ", uid=" + callingUid;
|
||||
Slog.w(TAG, msg);
|
||||
throw new SecurityException(msg);
|
||||
} else if (AppWidgetManager.ACTION_APPWIDGET_CONFIGURE.equals(intent.getAction())) {
|
||||
// Special case for compatibility: we don't want apps to send this,
|
||||
// but historically it has not been protected and apps may be using it
|
||||
// to poke their own app widget. So, instead of making it protected,
|
||||
// just limit it to the caller.
|
||||
if (callerApp == null) {
|
||||
String msg = "Permission Denial: not allowed to send broadcast "
|
||||
+ intent.getAction() + " from unknown caller.";
|
||||
Slog.w(TAG, msg);
|
||||
throw new SecurityException(msg);
|
||||
} else if (intent.getComponent() != null) {
|
||||
// They are good enough to send to an explicit component... verify
|
||||
// it is being sent to the calling app.
|
||||
if (!intent.getComponent().getPackageName().equals(
|
||||
callerApp.info.packageName)) {
|
||||
String msg = "Permission Denial: not allowed to send broadcast "
|
||||
+ intent.getAction() + " to "
|
||||
+ intent.getComponent().getPackageName() + " from "
|
||||
+ callerApp.info.packageName;
|
||||
Slog.w(TAG, msg);
|
||||
throw new SecurityException(msg);
|
||||
}
|
||||
} else {
|
||||
// Limit broadcast to their own package.
|
||||
intent.setPackage(callerApp.info.packageName);
|
||||
}
|
||||
}
|
||||
} catch (RemoteException e) {
|
||||
Slog.w(TAG, "Remote exception", e);
|
||||
|
||||
@@ -29,7 +29,6 @@ import android.content.Intent;
|
||||
import android.content.pm.ActivityInfo;
|
||||
import android.content.pm.PackageManager;
|
||||
import android.content.pm.ResolveInfo;
|
||||
import android.content.pm.ServiceInfo;
|
||||
import android.os.Bundle;
|
||||
import android.os.Handler;
|
||||
import android.os.IBinder;
|
||||
@@ -1080,6 +1079,9 @@ public class BroadcastQueue {
|
||||
pw.print(" #"); pw.print(i); pw.print(": "); pw.println(r);
|
||||
pw.print(" ");
|
||||
pw.println(r.intent.toShortString(false, true, true, false));
|
||||
if (r.targetComp != null && r.targetComp != r.intent.getComponent()) {
|
||||
pw.print(" targetComp: "); pw.println(r.targetComp.toShortString());
|
||||
}
|
||||
Bundle bundle = r.intent.getExtras();
|
||||
if (bundle != null) {
|
||||
pw.print(" extras: "); pw.println(bundle.toString());
|
||||
|
||||
@@ -38,6 +38,7 @@ import java.util.List;
|
||||
*/
|
||||
class BroadcastRecord extends Binder {
|
||||
final Intent intent; // the original intent that generated us
|
||||
final ComponentName targetComp; // original component name set on the intent
|
||||
final ProcessRecord callerApp; // process that sent this
|
||||
final String callerPackage; // who sent this
|
||||
final int callingPid; // the pid of who sent this
|
||||
@@ -84,9 +85,12 @@ class BroadcastRecord extends Binder {
|
||||
|
||||
pw.print(prefix); pw.print(this); pw.print(" to user "); pw.println(userId);
|
||||
pw.print(prefix); pw.println(intent.toInsecureString());
|
||||
if (targetComp != null && targetComp != intent.getComponent()) {
|
||||
pw.print(prefix); pw.print(" targetComp: "); pw.println(targetComp.toShortString());
|
||||
}
|
||||
Bundle bundle = intent.getExtras();
|
||||
if (bundle != null) {
|
||||
pw.print(prefix); pw.print("extras: "); pw.println(bundle.toString());
|
||||
pw.print(prefix); pw.print(" extras: "); pw.println(bundle.toString());
|
||||
}
|
||||
pw.print(prefix); pw.print("caller="); pw.print(callerPackage); pw.print(" ");
|
||||
pw.print(callerApp != null ? callerApp.toShortString() : "null");
|
||||
@@ -174,6 +178,7 @@ class BroadcastRecord extends Binder {
|
||||
int _userId) {
|
||||
queue = _queue;
|
||||
intent = _intent;
|
||||
targetComp = _intent.getComponent();
|
||||
callerApp = _callerApp;
|
||||
callerPackage = _callerPackage;
|
||||
callingPid = _callingPid;
|
||||
|
||||
Reference in New Issue
Block a user