diff --git a/core/java/android/app/ContextImpl.java b/core/java/android/app/ContextImpl.java index 3e1e35886d8ed..95b6bed3dfb8c 100644 --- a/core/java/android/app/ContextImpl.java +++ b/core/java/android/app/ContextImpl.java @@ -77,6 +77,7 @@ import android.net.wifi.p2p.WifiP2pManager; import android.nfc.NfcManager; import android.os.Binder; import android.os.Bundle; +import android.os.Debug; import android.os.DropBoxManager; import android.os.Environment; import android.os.FileUtils; @@ -97,6 +98,7 @@ import android.telephony.TelephonyManager; import android.content.ClipboardManager; import android.util.AndroidRuntimeException; import android.util.Log; +import android.util.Slog; import android.view.CompatibilityInfoHolder; import android.view.ContextThemeWrapper; import android.view.Display; @@ -925,6 +927,7 @@ class ContextImpl extends Context { @Override public void startActivity(Intent intent) { + warnIfCallingFromSystemProcess(); startActivity(intent, null); } @@ -936,6 +939,7 @@ class ContextImpl extends Context { @Override public void startActivity(Intent intent, Bundle options) { + warnIfCallingFromSystemProcess(); if ((intent.getFlags()&Intent.FLAG_ACTIVITY_NEW_TASK) == 0) { throw new AndroidRuntimeException( "Calling startActivity() from outside of an Activity " @@ -962,6 +966,7 @@ class ContextImpl extends Context { @Override public void startActivities(Intent[] intents) { + warnIfCallingFromSystemProcess(); startActivities(intents, null); } @@ -981,6 +986,7 @@ class ContextImpl extends Context { @Override public void startActivities(Intent[] intents, Bundle options) { + warnIfCallingFromSystemProcess(); if ((intents[0].getFlags()&Intent.FLAG_ACTIVITY_NEW_TASK) == 0) { throw new AndroidRuntimeException( "Calling startActivities() from outside of an Activity " @@ -1023,6 +1029,7 @@ class ContextImpl extends Context { @Override public void sendBroadcast(Intent intent) { + warnIfCallingFromSystemProcess(); String resolvedType = intent.resolveTypeIfNeeded(getContentResolver()); try { intent.setAllowFds(false); @@ -1036,6 +1043,7 @@ class ContextImpl extends Context { @Override public void sendBroadcast(Intent intent, String receiverPermission) { + warnIfCallingFromSystemProcess(); String resolvedType = intent.resolveTypeIfNeeded(getContentResolver()); try { intent.setAllowFds(false); @@ -1050,6 +1058,7 @@ class ContextImpl extends Context { @Override public void sendOrderedBroadcast(Intent intent, String receiverPermission) { + warnIfCallingFromSystemProcess(); String resolvedType = intent.resolveTypeIfNeeded(getContentResolver()); try { intent.setAllowFds(false); @@ -1066,6 +1075,7 @@ class ContextImpl extends Context { String receiverPermission, BroadcastReceiver resultReceiver, Handler scheduler, int initialCode, String initialData, Bundle initialExtras) { + warnIfCallingFromSystemProcess(); IIntentReceiver rd = null; if (resultReceiver != null) { if (mPackageInfo != null) { @@ -1154,6 +1164,7 @@ class ContextImpl extends Context { @Override public void sendStickyBroadcast(Intent intent) { + warnIfCallingFromSystemProcess(); String resolvedType = intent.resolveTypeIfNeeded(getContentResolver()); try { intent.setAllowFds(false); @@ -1170,6 +1181,7 @@ class ContextImpl extends Context { BroadcastReceiver resultReceiver, Handler scheduler, int initialCode, String initialData, Bundle initialExtras) { + warnIfCallingFromSystemProcess(); IIntentReceiver rd = null; if (resultReceiver != null) { if (mPackageInfo != null) { @@ -1337,11 +1349,13 @@ class ContextImpl extends Context { @Override public ComponentName startService(Intent service) { + warnIfCallingFromSystemProcess(); return startServiceAsUser(service, mUser); } @Override public boolean stopService(Intent service) { + warnIfCallingFromSystemProcess(); return stopServiceAsUser(service, mUser); } @@ -1389,6 +1403,7 @@ class ContextImpl extends Context { @Override public boolean bindService(Intent service, ServiceConnection conn, int flags) { + warnIfCallingFromSystemProcess(); return bindService(service, conn, flags, UserHandle.getUserId(Process.myUid())); } @@ -1697,6 +1712,13 @@ class ContextImpl extends Context { message); } + private void warnIfCallingFromSystemProcess() { + if (Process.myUid() == Process.SYSTEM_UID) { + Slog.w(TAG, "Calling a method in the system process without a qualified user: " + + Debug.getCallers(3)); + } + } + @Override public Context createPackageContext(String packageName, int flags) throws NameNotFoundException { diff --git a/core/java/android/content/SyncManager.java b/core/java/android/content/SyncManager.java index 05bab9c2d691b..977b46161164b 100644 --- a/core/java/android/content/SyncManager.java +++ b/core/java/android/content/SyncManager.java @@ -2530,7 +2530,7 @@ public class SyncManager { syncStateIntent.addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY_BEFORE_BOOT); syncStateIntent.putExtra("active", mNeedSyncActiveNotification); syncStateIntent.putExtra("failing", false); - mContext.sendBroadcast(syncStateIntent); + mContext.sendBroadcastAsUser(syncStateIntent, UserHandle.OWNER); } private void installHandleTooManyDeletesNotification(Account account, String authority, diff --git a/policy/src/com/android/internal/policy/impl/keyguard/ClockView.java b/policy/src/com/android/internal/policy/impl/keyguard/ClockView.java index 97a3f26709ce6..6c701c7dca015 100644 --- a/policy/src/com/android/internal/policy/impl/keyguard/ClockView.java +++ b/policy/src/com/android/internal/policy/impl/keyguard/ClockView.java @@ -23,6 +23,7 @@ import android.content.IntentFilter; import android.database.ContentObserver; import android.graphics.Typeface; import android.os.Handler; +import android.os.UserHandle; import android.provider.Settings; import android.text.format.DateFormat; import android.util.AttributeSet; @@ -172,7 +173,7 @@ public class ClockView extends RelativeLayout { filter.addAction(Intent.ACTION_TIME_TICK); filter.addAction(Intent.ACTION_TIME_CHANGED); filter.addAction(Intent.ACTION_TIMEZONE_CHANGED); - mContext.registerReceiver(mIntentReceiver, filter); + mContext.registerReceiverAsUser(mIntentReceiver, UserHandle.OWNER, filter, null, null ); } /* monitor 12/24-hour display preference */ diff --git a/services/java/com/android/server/BackupManagerService.java b/services/java/com/android/server/BackupManagerService.java index f241c8090dbc3..dcbf3f51257d8 100644 --- a/services/java/com/android/server/BackupManagerService.java +++ b/services/java/com/android/server/BackupManagerService.java @@ -836,7 +836,8 @@ class BackupManagerService extends IBackupManager.Stub { if ((info.flags & ApplicationInfo.FLAG_SYSTEM) != 0) { if (DEBUG) Slog.v(TAG, "Binding to Google transport"); Intent intent = new Intent().setComponent(transportComponent); - context.bindService(intent, mGoogleConnection, Context.BIND_AUTO_CREATE); + context.bindService(intent, mGoogleConnection, Context.BIND_AUTO_CREATE, + UserHandle.USER_OWNER); } else { Slog.w(TAG, "Possible Google transport spoof: ignoring " + info); } diff --git a/services/java/com/android/server/InputMethodManagerService.java b/services/java/com/android/server/InputMethodManagerService.java index ffbfef684811f..679a22a6c2a23 100644 --- a/services/java/com/android/server/InputMethodManagerService.java +++ b/services/java/com/android/server/InputMethodManagerService.java @@ -1561,7 +1561,7 @@ public class InputMethodManagerService extends IInputMethodManager.Stub intent.putExtra(SuggestionSpan.SUGGESTION_SPAN_PICKED_BEFORE, originalString); intent.putExtra(SuggestionSpan.SUGGESTION_SPAN_PICKED_AFTER, suggestions[index]); intent.putExtra(SuggestionSpan.SUGGESTION_SPAN_PICKED_HASHCODE, span.hashCode()); - mContext.sendBroadcast(intent); + mContext.sendBroadcastAsUser(intent, UserHandle.CURRENT); return true; } } @@ -1649,7 +1649,7 @@ public class InputMethodManagerService extends IInputMethodManager.Stub Intent intent = new Intent(Intent.ACTION_INPUT_METHOD_CHANGED); intent.addFlags(Intent.FLAG_RECEIVER_REPLACE_PENDING); intent.putExtra("input_method_id", id); - mContext.sendBroadcast(intent); + mContext.sendBroadcastAsUser(intent, UserHandle.CURRENT); } unbindCurrentClientLocked(); } finally { diff --git a/services/java/com/android/server/SystemServer.java b/services/java/com/android/server/SystemServer.java index e46afd3260840..894c4d02e794b 100644 --- a/services/java/com/android/server/SystemServer.java +++ b/services/java/com/android/server/SystemServer.java @@ -37,6 +37,7 @@ import android.os.ServiceManager; import android.os.StrictMode; import android.os.SystemClock; import android.os.SystemProperties; +import android.os.UserHandle; import android.server.search.SearchManagerService; import android.service.dreams.DreamService; import android.util.DisplayMetrics; @@ -1005,7 +1006,7 @@ class ServerThread extends Thread { intent.setComponent(new ComponentName("com.android.systemui", "com.android.systemui.SystemUIService")); Slog.d(TAG, "Starting service: " + intent); - context.startService(intent); + context.startServiceAsUser(intent, UserHandle.OWNER); } } diff --git a/services/java/com/android/server/dreams/DreamController.java b/services/java/com/android/server/dreams/DreamController.java index bfb60bbe8f55a..1ab6a77a85e72 100644 --- a/services/java/com/android/server/dreams/DreamController.java +++ b/services/java/com/android/server/dreams/DreamController.java @@ -25,6 +25,7 @@ import android.os.Handler; import android.os.IBinder; import android.os.RemoteException; import android.os.IBinder.DeathRecipient; +import android.os.UserHandle; import android.service.dreams.DreamService; import android.service.dreams.IDreamService; import android.util.Slog; @@ -83,8 +84,8 @@ final class DreamController { public void startDream(Binder token, ComponentName name, boolean isTest, int userId) { stopDream(); - // Close the notification shade - mContext.sendBroadcast(mCloseNotificationShadeIntent); + // Close the notification shade. Don't need to send to all, but better to be explicit. + mContext.sendBroadcastAsUser(mCloseNotificationShadeIntent, UserHandle.ALL); Slog.i(TAG, "Starting dream: name=" + name + ", isTest=" + isTest + ", userId=" + userId); @@ -128,7 +129,7 @@ final class DreamController { + ", isTest=" + oldDream.mIsTest + ", userId=" + oldDream.mUserId); if (oldDream.mSentStartBroadcast) { - mContext.sendBroadcast(mDreamingStoppedIntent); + mContext.sendBroadcastAsUser(mDreamingStoppedIntent, UserHandle.ALL); } if (oldDream.mService != null) { @@ -180,7 +181,7 @@ final class DreamController { mCurrentDream.mService = service; if (!mCurrentDream.mIsTest) { - mContext.sendBroadcast(mDreamingStartedIntent); + mContext.sendBroadcastAsUser(mDreamingStartedIntent, UserHandle.ALL); mCurrentDream.mSentStartBroadcast = true; } }