summaryrefslogtreecommitdiffstats
path: root/core/java/android/app/ActivityThread.java
diff options
context:
space:
mode:
Diffstat (limited to 'core/java/android/app/ActivityThread.java')
-rw-r--r--core/java/android/app/ActivityThread.java167
1 files changed, 118 insertions, 49 deletions
diff --git a/core/java/android/app/ActivityThread.java b/core/java/android/app/ActivityThread.java
index bd83762..67e8839 100644
--- a/core/java/android/app/ActivityThread.java
+++ b/core/java/android/app/ActivityThread.java
@@ -202,7 +202,7 @@ public final class ActivityThread {
Bundle mCoreSettings = null;
- private static final class ActivityClientRecord {
+ static final class ActivityClientRecord {
IBinder token;
int ident;
Intent intent;
@@ -220,6 +220,7 @@ public final class ActivityThread {
ActivityClientRecord nextIdle;
ActivityInfo activityInfo;
+ CompatibilityInfo compatInfo;
LoadedApk packageInfo;
List<ResultInfo> pendingResults;
@@ -260,7 +261,7 @@ public final class ActivityThread {
}
}
- private final class ProviderClientRecord implements IBinder.DeathRecipient {
+ final class ProviderClientRecord implements IBinder.DeathRecipient {
final String mName;
final IContentProvider mProvider;
final ContentProvider mLocalProvider;
@@ -277,7 +278,7 @@ public final class ActivityThread {
}
}
- private static final class NewIntentData {
+ static final class NewIntentData {
List<Intent> intents;
IBinder token;
public String toString() {
@@ -285,7 +286,7 @@ public final class ActivityThread {
}
}
- private static final class ReceiverData extends BroadcastReceiver.PendingResult {
+ static final class ReceiverData extends BroadcastReceiver.PendingResult {
public ReceiverData(Intent intent, int resultCode, String resultData, Bundle resultExtras,
boolean ordered, boolean sticky, IBinder token) {
super(resultCode, resultData, resultExtras, TYPE_COMPONENT, ordered, sticky, token);
@@ -294,6 +295,7 @@ public final class ActivityThread {
Intent intent;
ActivityInfo info;
+ CompatibilityInfo compatInfo;
public String toString() {
return "ReceiverData{intent=" + intent + " packageName=" +
info.packageName + " resultCode=" + getResultCode()
@@ -302,8 +304,9 @@ public final class ActivityThread {
}
}
- private static final class CreateBackupAgentData {
+ static final class CreateBackupAgentData {
ApplicationInfo appInfo;
+ CompatibilityInfo compatInfo;
int backupMode;
public String toString() {
return "CreateBackupAgentData{appInfo=" + appInfo
@@ -312,9 +315,10 @@ public final class ActivityThread {
}
}
- private static final class CreateServiceData {
+ static final class CreateServiceData {
IBinder token;
ServiceInfo info;
+ CompatibilityInfo compatInfo;
Intent intent;
public String toString() {
return "CreateServiceData{token=" + token + " className="
@@ -323,7 +327,7 @@ public final class ActivityThread {
}
}
- private static final class BindServiceData {
+ static final class BindServiceData {
IBinder token;
Intent intent;
boolean rebind;
@@ -332,7 +336,7 @@ public final class ActivityThread {
}
}
- private static final class ServiceArgsData {
+ static final class ServiceArgsData {
IBinder token;
int startId;
int flags;
@@ -343,7 +347,7 @@ public final class ActivityThread {
}
}
- private static final class AppBindData {
+ static final class AppBindData {
LoadedApk info;
String processName;
ApplicationInfo appInfo;
@@ -355,13 +359,14 @@ public final class ActivityThread {
int debugMode;
boolean restrictedBackupMode;
Configuration config;
+ CompatibilityInfo compatInfo;
boolean handlingProfiling;
public String toString() {
return "AppBindData{appInfo=" + appInfo + "}";
}
}
- private static final class DumpComponentInfo {
+ static final class DumpComponentInfo {
FileDescriptor fd;
IBinder token;
String prefix;
@@ -369,7 +374,7 @@ public final class ActivityThread {
boolean dumped;
}
- private static final class ResultData {
+ static final class ResultData {
IBinder token;
List<ResultInfo> results;
public String toString() {
@@ -377,22 +382,27 @@ public final class ActivityThread {
}
}
- private static final class ContextCleanupInfo {
+ static final class ContextCleanupInfo {
ContextImpl context;
String what;
String who;
}
- private static final class ProfilerControlData {
+ static final class ProfilerControlData {
String path;
ParcelFileDescriptor fd;
}
- private static final class DumpHeapData {
+ static final class DumpHeapData {
String path;
ParcelFileDescriptor fd;
}
+ static final class UpdateCompatibilityData {
+ String pkg;
+ CompatibilityInfo info;
+ }
+
private final class ApplicationThread extends ApplicationThreadNative {
private static final String HEAP_COLUMN = "%17s %8s %8s %8s %8s";
private static final String ONE_COUNT_COLUMN = "%17s %8d";
@@ -443,7 +453,8 @@ public final class ActivityThread {
// we use token to identify this activity without having to send the
// activity itself back to the activity manager. (matters more with ipc)
public final void scheduleLaunchActivity(Intent intent, IBinder token, int ident,
- ActivityInfo info, Bundle state, List<ResultInfo> pendingResults,
+ ActivityInfo info, CompatibilityInfo compatInfo, Bundle state,
+ List<ResultInfo> pendingResults,
List<Intent> pendingNewIntents, boolean notResumed, boolean isForward) {
ActivityClientRecord r = new ActivityClientRecord();
@@ -451,6 +462,7 @@ public final class ActivityThread {
r.ident = ident;
r.intent = intent;
r.activityInfo = info;
+ r.compatInfo = compatInfo;
r.state = state;
r.pendingResults = pendingResults;
@@ -484,33 +496,40 @@ public final class ActivityThread {
}
public final void scheduleReceiver(Intent intent, ActivityInfo info,
- int resultCode, String data, Bundle extras, boolean sync) {
+ CompatibilityInfo compatInfo, int resultCode, String data, Bundle extras,
+ boolean sync) {
ReceiverData r = new ReceiverData(intent, resultCode, data, extras,
sync, false, mAppThread.asBinder());
r.info = info;
+ r.compatInfo = compatInfo;
queueOrSendMessage(H.RECEIVER, r);
}
- public final void scheduleCreateBackupAgent(ApplicationInfo app, int backupMode) {
+ public final void scheduleCreateBackupAgent(ApplicationInfo app,
+ CompatibilityInfo compatInfo, int backupMode) {
CreateBackupAgentData d = new CreateBackupAgentData();
d.appInfo = app;
+ d.compatInfo = compatInfo;
d.backupMode = backupMode;
queueOrSendMessage(H.CREATE_BACKUP_AGENT, d);
}
- public final void scheduleDestroyBackupAgent(ApplicationInfo app) {
+ public final void scheduleDestroyBackupAgent(ApplicationInfo app,
+ CompatibilityInfo compatInfo) {
CreateBackupAgentData d = new CreateBackupAgentData();
d.appInfo = app;
+ d.compatInfo = compatInfo;
queueOrSendMessage(H.DESTROY_BACKUP_AGENT, d);
}
public final void scheduleCreateService(IBinder token,
- ServiceInfo info) {
+ ServiceInfo info, CompatibilityInfo compatInfo) {
CreateServiceData s = new CreateServiceData();
s.token = token;
s.info = info;
+ s.compatInfo = compatInfo;
queueOrSendMessage(H.CREATE_SERVICE, s);
}
@@ -553,7 +572,8 @@ public final class ActivityThread {
ComponentName instrumentationName, String profileFile,
Bundle instrumentationArgs, IInstrumentationWatcher instrumentationWatcher,
int debugMode, boolean isRestrictedBackupMode, Configuration config,
- Map<String, IBinder> services, Bundle coreSettings) {
+ CompatibilityInfo compatInfo, Map<String, IBinder> services,
+ Bundle coreSettings) {
if (services != null) {
// Setup the service cache in the ServiceManager
@@ -573,6 +593,7 @@ public final class ActivityThread {
data.debugMode = debugMode;
data.restrictedBackupMode = isRestrictedBackupMode;
data.config = config;
+ data.compatInfo = compatInfo;
queueOrSendMessage(H.BIND_APPLICATION, data);
}
@@ -903,6 +924,13 @@ public final class ActivityThread {
public void setCoreSettings(Bundle coreSettings) {
queueOrSendMessage(H.SET_CORE_SETTINGS, coreSettings);
}
+
+ public void updatePackageCompatibilityInfo(String pkg, CompatibilityInfo info) {
+ UpdateCompatibilityData ucd = new UpdateCompatibilityData();
+ ucd.pkg = pkg;
+ ucd.info = info;
+ queueOrSendMessage(H.UPDATE_PACKAGE_COMPATIBILITY_INFO, ucd);
+ }
}
private final class H extends Handler {
@@ -945,6 +973,7 @@ public final class ActivityThread {
public static final int DUMP_ACTIVITY = 136;
public static final int SLEEPING = 137;
public static final int SET_CORE_SETTINGS = 138;
+ public static final int UPDATE_PACKAGE_COMPATIBILITY_INFO = 139;
String codeToString(int code) {
if (DEBUG_MESSAGES) {
switch (code) {
@@ -987,6 +1016,7 @@ public final class ActivityThread {
case DUMP_ACTIVITY: return "DUMP_ACTIVITY";
case SLEEPING: return "SLEEPING";
case SET_CORE_SETTINGS: return "SET_CORE_SETTINGS";
+ case UPDATE_PACKAGE_COMPATIBILITY_INFO: return "UPDATE_PACKAGE_COMPATIBILITY_INFO";
}
}
return "(unknown)";
@@ -998,7 +1028,7 @@ public final class ActivityThread {
ActivityClientRecord r = (ActivityClientRecord)msg.obj;
r.packageInfo = getPackageInfoNoCheck(
- r.activityInfo.applicationInfo);
+ r.activityInfo.applicationInfo, r.compatInfo);
handleLaunchActivity(r, null);
} break;
case RELAUNCH_ACTIVITY: {
@@ -1072,7 +1102,7 @@ public final class ActivityThread {
handleRequestThumbnail((IBinder)msg.obj);
break;
case CONFIGURATION_CHANGED:
- handleConfigurationChanged((Configuration)msg.obj);
+ handleConfigurationChanged((Configuration)msg.obj, null);
break;
case CLEAN_UP_CONTEXT:
ContextCleanupInfo cci = (ContextCleanupInfo)msg.obj;
@@ -1125,6 +1155,8 @@ public final class ActivityThread {
case SET_CORE_SETTINGS:
handleSetCoreSettings((Bundle) msg.obj);
break;
+ case UPDATE_PACKAGE_COMPATIBILITY_INFO:
+ handleUpdatePackageCompatibilityInfo((UpdateCompatibilityData)msg.obj);
}
if (DEBUG_MESSAGES) Slog.v(TAG, "<<< done: " + msg.what);
}
@@ -1335,7 +1367,8 @@ public final class ActivityThread {
return mH;
}
- public final LoadedApk getPackageInfo(String packageName, int flags) {
+ public final LoadedApk getPackageInfo(String packageName, CompatibilityInfo compatInfo,
+ int flags) {
synchronized (mPackages) {
WeakReference<LoadedApk> ref;
if ((flags&Context.CONTEXT_INCLUDE_CODE) != 0) {
@@ -1369,13 +1402,14 @@ public final class ActivityThread {
}
if (ai != null) {
- return getPackageInfo(ai, flags);
+ return getPackageInfo(ai, compatInfo, flags);
}
return null;
}
- public final LoadedApk getPackageInfo(ApplicationInfo ai, int flags) {
+ public final LoadedApk getPackageInfo(ApplicationInfo ai, CompatibilityInfo compatInfo,
+ int flags) {
boolean includeCode = (flags&Context.CONTEXT_INCLUDE_CODE) != 0;
boolean securityViolation = includeCode && ai.uid != 0
&& ai.uid != Process.SYSTEM_UID && (mBoundApplication != null
@@ -1394,14 +1428,27 @@ public final class ActivityThread {
throw new SecurityException(msg);
}
}
- return getPackageInfo(ai, null, securityViolation, includeCode);
+ return getPackageInfo(ai, compatInfo, null, securityViolation, includeCode);
}
- public final LoadedApk getPackageInfoNoCheck(ApplicationInfo ai) {
- return getPackageInfo(ai, null, false, true);
+ public final LoadedApk getPackageInfoNoCheck(ApplicationInfo ai,
+ CompatibilityInfo compatInfo) {
+ return getPackageInfo(ai, compatInfo, null, false, true);
}
- private final LoadedApk getPackageInfo(ApplicationInfo aInfo,
+ public final LoadedApk peekPackageInfo(String packageName, boolean includeCode) {
+ synchronized (mPackages) {
+ WeakReference<LoadedApk> ref;
+ if (includeCode) {
+ ref = mPackages.get(packageName);
+ } else {
+ ref = mResourcePackages.get(packageName);
+ }
+ return ref != null ? ref.get() : null;
+ }
+ }
+
+ private final LoadedApk getPackageInfo(ApplicationInfo aInfo, CompatibilityInfo compatInfo,
ClassLoader baseLoader, boolean securityViolation, boolean includeCode) {
synchronized (mPackages) {
WeakReference<LoadedApk> ref;
@@ -1419,7 +1466,7 @@ public final class ActivityThread {
? mBoundApplication.processName : null)
+ ")");
packageInfo =
- new LoadedApk(this, aInfo, this, baseLoader,
+ new LoadedApk(this, aInfo, compatInfo, this, baseLoader,
securityViolation, includeCode &&
(aInfo.flags&ApplicationInfo.FLAG_HAS_CODE) != 0);
if (includeCode) {
@@ -1476,7 +1523,8 @@ public final class ActivityThread {
if (mSystemContext == null) {
ContextImpl context =
ContextImpl.createSystemContext(this);
- LoadedApk info = new LoadedApk(this, "android", context, null);
+ LoadedApk info = new LoadedApk(this, "android", context, null,
+ CompatibilityInfo.DEFAULT_COMPATIBILITY_INFO);
context.init(info, null, this);
context.getResources().updateConfiguration(
getConfiguration(), getDisplayMetricsLocked(false));
@@ -1491,7 +1539,8 @@ public final class ActivityThread {
public void installSystemApplicationInfo(ApplicationInfo info) {
synchronized (this) {
ContextImpl context = getSystemContext();
- context.init(new LoadedApk(this, "android", context, info), null, this);
+ context.init(new LoadedApk(this, "android", context, info,
+ new CompatibilityInfo(info, 0, false)), null, this);
}
}
@@ -1641,7 +1690,7 @@ public final class ActivityThread {
ActivityInfo aInfo = r.activityInfo;
if (r.packageInfo == null) {
- r.packageInfo = getPackageInfo(aInfo.applicationInfo,
+ r.packageInfo = getPackageInfo(aInfo.applicationInfo, r.compatInfo,
Context.CONTEXT_INCLUDE_CODE);
}
@@ -1865,7 +1914,7 @@ public final class ActivityThread {
String component = data.intent.getComponent().getClassName();
LoadedApk packageInfo = getPackageInfoNoCheck(
- data.info.applicationInfo);
+ data.info.applicationInfo, data.compatInfo);
IActivityManager mgr = ActivityManagerNative.getDefault();
@@ -1926,7 +1975,7 @@ public final class ActivityThread {
unscheduleGcIdler();
// instantiate the BackupAgent class named in the manifest
- LoadedApk packageInfo = getPackageInfoNoCheck(data.appInfo);
+ LoadedApk packageInfo = getPackageInfoNoCheck(data.appInfo, data.compatInfo);
String packageName = packageInfo.mPackageName;
if (mBackupAgents.get(packageName) != null) {
Slog.d(TAG, "BackupAgent " + " for " + packageName
@@ -1988,7 +2037,7 @@ public final class ActivityThread {
private final void handleDestroyBackupAgent(CreateBackupAgentData data) {
if (DEBUG_BACKUP) Slog.v(TAG, "handleDestroyBackupAgent: " + data);
- LoadedApk packageInfo = getPackageInfoNoCheck(data.appInfo);
+ LoadedApk packageInfo = getPackageInfoNoCheck(data.appInfo, data.compatInfo);
String packageName = packageInfo.mPackageName;
BackupAgent agent = mBackupAgents.get(packageName);
if (agent != null) {
@@ -2010,7 +2059,7 @@ public final class ActivityThread {
unscheduleGcIdler();
LoadedApk packageInfo = getPackageInfoNoCheck(
- data.info.applicationInfo);
+ data.info.applicationInfo, data.compatInfo);
Service service = null;
try {
java.lang.ClassLoader cl = packageInfo.getClassLoader();
@@ -2727,6 +2776,18 @@ public final class ActivityThread {
}
}
+ private void handleUpdatePackageCompatibilityInfo(UpdateCompatibilityData data) {
+ LoadedApk apk = peekPackageInfo(data.pkg, false);
+ if (apk != null) {
+ apk.mCompatibilityInfo = data.info;
+ }
+ apk = peekPackageInfo(data.pkg, true);
+ if (apk != null) {
+ apk.mCompatibilityInfo = data.info;
+ }
+ handleConfigurationChanged(mConfiguration, data.info);
+ }
+
private final void deliverResults(ActivityClientRecord r, List<ResultInfo> results) {
final int N = results.size();
for (int i=0; i<N; i++) {
@@ -3064,7 +3125,7 @@ public final class ActivityThread {
// If there was a pending configuration change, execute it first.
if (changedConfig != null) {
- handleConfigurationChanged(changedConfig);
+ handleConfigurationChanged(changedConfig, null);
}
ActivityClientRecord r = mActivities.get(tmp.token);
@@ -3234,11 +3295,12 @@ public final class ActivityThread {
}
}
- final boolean applyConfigurationToResourcesLocked(Configuration config) {
+ final boolean applyConfigurationToResourcesLocked(Configuration config,
+ CompatibilityInfo compat) {
if (mResConfiguration == null) {
mResConfiguration = new Configuration();
}
- if (!mResConfiguration.isOtherSeqNewer(config)) {
+ if (!mResConfiguration.isOtherSeqNewer(config) && compat == null) {
if (DEBUG_CONFIGURATION) Slog.v(TAG, "Skipping new config: curSeq="
+ mResConfiguration.seq + ", newSeq=" + config.seq);
return false;
@@ -3251,7 +3313,7 @@ public final class ActivityThread {
Locale.setDefault(config.locale);
}
- Resources.updateSystemConfiguration(config, dm);
+ Resources.updateSystemConfiguration(config, dm, compat);
ApplicationPackageManager.configurationChanged();
//Slog.i(TAG, "Configuration changed in " + currentPackageName());
@@ -3266,7 +3328,7 @@ public final class ActivityThread {
if (r != null) {
if (DEBUG_CONFIGURATION) Slog.v(TAG, "Changing resources "
+ r + " config to: " + config);
- r.updateConfiguration(config, dm);
+ r.updateConfiguration(config, dm, compat);
//Slog.i(TAG, "Updated app resources " + v.getKey()
// + " " + r + ": " + r.getConfiguration());
} else {
@@ -3278,7 +3340,7 @@ public final class ActivityThread {
return changes != 0;
}
- final void handleConfigurationChanged(Configuration config) {
+ final void handleConfigurationChanged(Configuration config, CompatibilityInfo compat) {
ArrayList<ComponentCallbacks> callbacks = null;
@@ -3297,15 +3359,21 @@ public final class ActivityThread {
if (DEBUG_CONFIGURATION) Slog.v(TAG, "Handle configuration changed: "
+ config);
- applyConfigurationToResourcesLocked(config);
+ applyConfigurationToResourcesLocked(config, compat);
if (mConfiguration == null) {
mConfiguration = new Configuration();
}
- if (!mConfiguration.isOtherSeqNewer(config)) {
+ if (!mConfiguration.isOtherSeqNewer(config) && compat == null) {
return;
}
mConfiguration.updateFrom(config);
+ if (compat != null) {
+ // Can't do this here, because it causes us to report the
+ // comatible config back to the am as the current config
+ // of the activity, and much unhappiness results.
+ //compat.applyToConfiguration(mConfiguration);
+ }
callbacks = collectComponentCallbacksLocked(false, config);
}
@@ -3445,9 +3513,10 @@ public final class ActivityThread {
* reflect configuration changes. The configuration object passed
* in AppBindData can be safely assumed to be up to date
*/
- Resources.getSystem().updateConfiguration(mConfiguration, null);
+ Resources.getSystem().updateConfiguration(mConfiguration,
+ Resources.getSystem().getDisplayMetrics(), data.compatInfo);
- data.info = getPackageInfoNoCheck(data.appInfo);
+ data.info = getPackageInfoNoCheck(data.appInfo, data.compatInfo);
/**
* For system applications on userdebug/eng builds, log stack
@@ -3539,7 +3608,7 @@ public final class ActivityThread {
instrApp.publicSourceDir = ii.publicSourceDir;
instrApp.dataDir = ii.dataDir;
instrApp.nativeLibraryDir = ii.nativeLibraryDir;
- LoadedApk pi = getPackageInfo(instrApp,
+ LoadedApk pi = getPackageInfo(instrApp, data.compatInfo,
appContext.getClassLoader(), false, true);
ContextImpl instrContext = new ContextImpl();
instrContext.init(pi, null, this);
@@ -3953,7 +4022,7 @@ public final class ActivityThread {
// We need to apply this change to the resources
// immediately, because upon returning the view
// hierarchy will be informed about it.
- if (applyConfigurationToResourcesLocked(newConfig)) {
+ if (applyConfigurationToResourcesLocked(newConfig, null)) {
// This actually changed the resources! Tell
// everyone about it.
if (mPendingConfiguration == null ||