Merge "Allow device owner app to start activities from background"
diff --git a/Android.bp b/Android.bp
index a467a04..ecdc082 100644
--- a/Android.bp
+++ b/Android.bp
@@ -117,7 +117,6 @@
"core/java/android/app/timedetector/ITimeDetectorService.aidl",
"core/java/android/app/timezone/ICallback.aidl",
"core/java/android/app/timezone/IRulesManager.aidl",
- "core/java/android/app/timezonedetector/ITimeZoneDetectorService.aidl",
"core/java/android/app/usage/ICacheQuotaService.aidl",
"core/java/android/app/usage/IStorageStatsManager.aidl",
"core/java/android/app/usage/IUsageStatsManager.aidl",
diff --git a/api/current.txt b/api/current.txt
index d57cd61..ff93504 100644
--- a/api/current.txt
+++ b/api/current.txt
@@ -11324,7 +11324,7 @@
public final class ModuleInfo implements android.os.Parcelable {
method public int describeContents();
- method @Nullable public String getName();
+ method @Nullable public CharSequence getName();
method @Nullable public String getPackageName();
method public boolean isHidden();
method public void writeToParcel(android.os.Parcel, int);
diff --git a/core/java/android/app/Activity.java b/core/java/android/app/Activity.java
index e77e212..aac8f08 100644
--- a/core/java/android/app/Activity.java
+++ b/core/java/android/app/Activity.java
@@ -1768,7 +1768,7 @@
protected void onResume() {
if (DEBUG_LIFECYCLE) Slog.v(TAG, "onResume " + this);
dispatchActivityResumed();
- mActivityTransitionState.onResume(this, isTopOfTask());
+ mActivityTransitionState.onResume(this);
enableAutofillCompatibilityIfNeeded();
if (mAutoFillResetNeeded) {
if (!mAutoFillIgnoreFirstResumePause) {
diff --git a/core/java/android/app/ActivityThread.java b/core/java/android/app/ActivityThread.java
index 22dcce5..21d66e5 100644
--- a/core/java/android/app/ActivityThread.java
+++ b/core/java/android/app/ActivityThread.java
@@ -129,6 +129,7 @@
import android.util.Pair;
import android.util.PrintWriterPrinter;
import android.util.Slog;
+import android.util.SparseArray;
import android.util.SparseIntArray;
import android.util.SuperNotCalledException;
import android.util.proto.ProtoOutputStream;
@@ -305,8 +306,14 @@
@UnsupportedAppUsage
final ArrayList<Application> mAllApplications
= new ArrayList<Application>();
- // set of instantiated backup agents, keyed by package name
- final ArrayMap<String, BackupAgent> mBackupAgents = new ArrayMap<String, BackupAgent>();
+ /**
+ * Bookkeeping of instantiated backup agents indexed first by user id, then by package name.
+ * Indexing by user id supports parallel backups across users on system packages as they run in
+ * the same process with the same package name. Indexing by package name supports multiple
+ * distinct applications running in the same process.
+ */
+ private final SparseArray<ArrayMap<String, BackupAgent>> mBackupAgentsByUser =
+ new SparseArray<>();
/** Reference to singleton {@link ActivityThread} */
@UnsupportedAppUsage
private static volatile ActivityThread sCurrentActivityThread;
@@ -659,10 +666,11 @@
ApplicationInfo appInfo;
CompatibilityInfo compatInfo;
int backupMode;
+ int userId;
public String toString() {
return "CreateBackupAgentData{appInfo=" + appInfo
+ " backupAgent=" + appInfo.backupAgentName
- + " mode=" + backupMode + "}";
+ + " mode=" + backupMode + " userId=" + userId + "}";
}
}
@@ -877,20 +885,22 @@
}
public final void scheduleCreateBackupAgent(ApplicationInfo app,
- CompatibilityInfo compatInfo, int backupMode) {
+ CompatibilityInfo compatInfo, int backupMode, int userId) {
CreateBackupAgentData d = new CreateBackupAgentData();
d.appInfo = app;
d.compatInfo = compatInfo;
d.backupMode = backupMode;
+ d.userId = userId;
sendMessage(H.CREATE_BACKUP_AGENT, d);
}
public final void scheduleDestroyBackupAgent(ApplicationInfo app,
- CompatibilityInfo compatInfo) {
+ CompatibilityInfo compatInfo, int userId) {
CreateBackupAgentData d = new CreateBackupAgentData();
d.appInfo = app;
d.compatInfo = compatInfo;
+ d.userId = userId;
sendMessage(H.DESTROY_BACKUP_AGENT, d);
}
@@ -3616,7 +3626,8 @@
try {
IBinder binder = null;
- BackupAgent agent = mBackupAgents.get(packageName);
+ ArrayMap<String, BackupAgent> backupAgents = getBackupAgentsForUser(data.userId);
+ BackupAgent agent = backupAgents.get(packageName);
if (agent != null) {
// reusing the existing instance
if (DEBUG_BACKUP) {
@@ -3635,9 +3646,9 @@
context.setOuterContext(agent);
agent.attach(context);
- agent.onCreate();
+ agent.onCreate(UserHandle.of(data.userId));
binder = agent.onBind();
- mBackupAgents.put(packageName, agent);
+ backupAgents.put(packageName, agent);
} catch (Exception e) {
// If this is during restore, fail silently; otherwise go
// ahead and let the user see the crash.
@@ -3653,7 +3664,7 @@
// tell the OS that we're live now
try {
- ActivityManager.getService().backupAgentCreated(packageName, binder);
+ ActivityManager.getService().backupAgentCreated(packageName, binder, data.userId);
} catch (RemoteException e) {
throw e.rethrowFromSystemServer();
}
@@ -3669,7 +3680,8 @@
LoadedApk packageInfo = getPackageInfoNoCheck(data.appInfo, data.compatInfo);
String packageName = packageInfo.mPackageName;
- BackupAgent agent = mBackupAgents.get(packageName);
+ ArrayMap<String, BackupAgent> backupAgents = getBackupAgentsForUser(data.userId);
+ BackupAgent agent = backupAgents.get(packageName);
if (agent != null) {
try {
agent.onDestroy();
@@ -3677,12 +3689,21 @@
Slog.w(TAG, "Exception thrown in onDestroy by backup agent of " + data.appInfo);
e.printStackTrace();
}
- mBackupAgents.remove(packageName);
+ backupAgents.remove(packageName);
} else {
Slog.w(TAG, "Attempt to destroy unknown backup agent " + data);
}
}
+ private ArrayMap<String, BackupAgent> getBackupAgentsForUser(int userId) {
+ ArrayMap<String, BackupAgent> backupAgents = mBackupAgentsByUser.get(userId);
+ if (backupAgents == null) {
+ backupAgents = new ArrayMap<>();
+ mBackupAgentsByUser.put(userId, backupAgents);
+ }
+ return backupAgents;
+ }
+
@UnsupportedAppUsage
private void handleCreateService(CreateServiceData data) {
// If we are getting ready to gc after going to the background, well
diff --git a/core/java/android/app/ActivityTransitionState.java b/core/java/android/app/ActivityTransitionState.java
index 3201feb..3a95839 100644
--- a/core/java/android/app/ActivityTransitionState.java
+++ b/core/java/android/app/ActivityTransitionState.java
@@ -258,10 +258,10 @@
}
}
- public void onResume(Activity activity, boolean isTopOfTask) {
+ public void onResume(Activity activity) {
// After orientation change, the onResume can come in before the top Activity has
// left, so if the Activity is not top, wait a second for the top Activity to exit.
- if (isTopOfTask || mEnterTransitionCoordinator == null) {
+ if (mEnterTransitionCoordinator == null || activity.isTopOfTask()) {
restoreExitedViews();
restoreReenteringViews();
} else {
diff --git a/core/java/android/app/IActivityManager.aidl b/core/java/android/app/IActivityManager.aidl
index eea0543..3aa9fa7 100644
--- a/core/java/android/app/IActivityManager.aidl
+++ b/core/java/android/app/IActivityManager.aidl
@@ -221,8 +221,8 @@
boolean shutdown(int timeout);
void stopAppSwitches();
void resumeAppSwitches();
- boolean bindBackupAgent(in String packageName, int backupRestoreMode, int userId);
- void backupAgentCreated(in String packageName, in IBinder agent);
+ boolean bindBackupAgent(in String packageName, int backupRestoreMode, int targetUserId);
+ void backupAgentCreated(in String packageName, in IBinder agent, int userId);
void unbindBackupAgent(in ApplicationInfo appInfo);
int getUidForIntentSender(in IIntentSender sender);
int handleIncomingUser(int callingPid, int callingUid, int userId, boolean allowAll,
diff --git a/core/java/android/app/IApplicationThread.aidl b/core/java/android/app/IApplicationThread.aidl
index c64fcf3..e7a8c0e 100644
--- a/core/java/android/app/IApplicationThread.aidl
+++ b/core/java/android/app/IApplicationThread.aidl
@@ -88,9 +88,9 @@
void profilerControl(boolean start, in ProfilerInfo profilerInfo, int profileType);
void setSchedulingGroup(int group);
void scheduleCreateBackupAgent(in ApplicationInfo app, in CompatibilityInfo compatInfo,
- int backupMode);
+ int backupMode, int userId);
void scheduleDestroyBackupAgent(in ApplicationInfo app,
- in CompatibilityInfo compatInfo);
+ in CompatibilityInfo compatInfo, int userId);
void scheduleOnNewActivityOptions(IBinder token, in Bundle options);
void scheduleSuicide();
void dispatchPackageBroadcast(int cmd, in String[] packages);
diff --git a/core/java/android/app/SystemServiceRegistry.java b/core/java/android/app/SystemServiceRegistry.java
index 31a3def..807b7f2 100644
--- a/core/java/android/app/SystemServiceRegistry.java
+++ b/core/java/android/app/SystemServiceRegistry.java
@@ -30,7 +30,6 @@
import android.app.slice.SliceManager;
import android.app.timedetector.TimeDetector;
import android.app.timezone.RulesManager;
-import android.app.timezonedetector.TimeZoneDetector;
import android.app.trust.TrustManager;
import android.app.usage.IStorageStatsManager;
import android.app.usage.IUsageStatsManager;
@@ -1223,13 +1222,6 @@
throws ServiceNotFoundException {
return new TimeDetector();
}});
- registerService(Context.TIME_ZONE_DETECTOR_SERVICE, TimeZoneDetector.class,
- new CachedServiceFetcher<TimeZoneDetector>() {
- @Override
- public TimeZoneDetector createService(ContextImpl ctx)
- throws ServiceNotFoundException {
- return new TimeZoneDetector();
- }});
registerService(Context.PERMISSION_SERVICE, PermissionManager.class,
new CachedServiceFetcher<PermissionManager>() {
diff --git a/core/java/android/app/timezonedetector/ITimeZoneDetectorService.aidl b/core/java/android/app/timezonedetector/ITimeZoneDetectorService.aidl
deleted file mode 100644
index ef2cbab..0000000
--- a/core/java/android/app/timezonedetector/ITimeZoneDetectorService.aidl
+++ /dev/null
@@ -1,34 +0,0 @@
-/*
- * Copyright (C) 2018 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.app.timezonedetector;
-
-/**
- * System private API to comunicate with time zone detector service.
- *
- * <p>Used by parts of the Android system with signals associated with the device's time zone to
- * provide information to the Time Zone Detector Service.
- *
- * <p>Use the {@link android.app.timezonedetector.TimeZoneDetector} class rather than going through
- * this Binder interface directly. See {@link android.app.timezonedetector.TimeZoneDetectorService}
- * for more complete documentation.
- *
- *
- * {@hide}
- */
-interface ITimeZoneDetectorService {
- void stubbedCall();
-}
diff --git a/core/java/android/app/timezonedetector/TimeZoneDetector.java b/core/java/android/app/timezonedetector/TimeZoneDetector.java
deleted file mode 100644
index be3c764..0000000
--- a/core/java/android/app/timezonedetector/TimeZoneDetector.java
+++ /dev/null
@@ -1,57 +0,0 @@
-/*
- * Copyright (C) 2018 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.app.timezonedetector;
-
-import android.annotation.SystemService;
-import android.content.Context;
-import android.os.RemoteException;
-import android.os.ServiceManager;
-import android.os.ServiceManager.ServiceNotFoundException;
-import android.util.Log;
-
-/**
- * The interface through which system components can send signals to the TimeZoneDetectorService.
- * @hide
- */
-@SystemService(Context.TIME_ZONE_DETECTOR_SERVICE)
-public final class TimeZoneDetector {
-
- private static final String TAG = "timezonedetector.TimeZoneDetector";
- private static final boolean DEBUG = false;
-
- private final ITimeZoneDetectorService mITimeZoneDetectorService;
-
- public TimeZoneDetector() throws ServiceNotFoundException {
- mITimeZoneDetectorService = ITimeZoneDetectorService.Stub.asInterface(
- ServiceManager.getServiceOrThrow(Context.TIME_ZONE_DETECTOR_SERVICE));
-
- }
- /**
- * Does nothing.
- * TODO: Remove this when the service implementation is built out.
- */
- public void stubbedCall() {
- if (DEBUG) {
- Log.d(TAG, "stubbedCall called");
- }
- try {
- mITimeZoneDetectorService.stubbedCall();
- } catch (RemoteException e) {
- throw e.rethrowFromSystemServer();
- }
- }
-}
diff --git a/core/java/android/content/Context.java b/core/java/android/content/Context.java
index 97323ca..957a484 100644
--- a/core/java/android/content/Context.java
+++ b/core/java/android/content/Context.java
@@ -3186,7 +3186,6 @@
CROSS_PROFILE_APPS_SERVICE,
//@hide: SYSTEM_UPDATE_SERVICE,
//@hide: TIME_DETECTOR_SERVICE,
- //@hide: TIME_ZONE_DETECTOR_SERVICE,
PERMISSION_SERVICE,
})
@Retention(RetentionPolicy.SOURCE)
@@ -4564,15 +4563,6 @@
public static final String TIME_DETECTOR_SERVICE = "time_detector";
/**
- * Use with {@link #getSystemService(String)} to retrieve an
- * {@link android.app.timezonedetector.ITimeZoneDetectorService}.
- * @hide
- *
- * @see #getSystemService(String)
- */
- public static final String TIME_ZONE_DETECTOR_SERVICE = "time_zone_detector";
-
- /**
* Binder service name for {@link AppBindingService}.
* @hide
*/
diff --git a/core/java/android/content/pm/ModuleInfo.java b/core/java/android/content/pm/ModuleInfo.java
index 07e640b..044e87d 100644
--- a/core/java/android/content/pm/ModuleInfo.java
+++ b/core/java/android/content/pm/ModuleInfo.java
@@ -32,7 +32,7 @@
// constructor, and writeToParcel.
/** Public name of this module. */
- private String mName;
+ private CharSequence mName;
/** The package name of this module. */
private String mPackageName;
@@ -57,13 +57,13 @@
}
/** @hide Sets the public name of this module. */
- public ModuleInfo setName(String name) {
+ public ModuleInfo setName(CharSequence name) {
mName = name;
return this;
}
/** Gets the public name of this module. */
- public @Nullable String getName() {
+ public @Nullable CharSequence getName() {
return mName;
}
@@ -123,13 +123,13 @@
/** Flattens this object into the given {@link Parcel}. */
public void writeToParcel(Parcel dest, int parcelableFlags) {
- dest.writeString(mName);
+ dest.writeCharSequence(mName);
dest.writeString(mPackageName);
dest.writeBoolean(mHidden);
}
private ModuleInfo(Parcel source) {
- mName = source.readString();
+ mName = source.readCharSequence();
mPackageName = source.readString();
mHidden = source.readBoolean();
}
diff --git a/core/jni/Android.bp b/core/jni/Android.bp
index 51a3b48..e7a1c49 100644
--- a/core/jni/Android.bp
+++ b/core/jni/Android.bp
@@ -27,10 +27,6 @@
"-Wno-error=deprecated-declarations",
"-Wunused",
"-Wunreachable-code",
-
- // TODO: Linear blending should be enabled by default, but we are
- // TODO: making it an opt-in while it's a work in progress
- //"-DANDROID_ENABLE_LINEAR_BLENDING",
],
cppflags: ["-Wno-conversion-null"],
diff --git a/core/tests/coretests/src/android/app/servertransaction/TransactionParcelTests.java b/core/tests/coretests/src/android/app/servertransaction/TransactionParcelTests.java
index bdf3aa2..a5ea441 100644
--- a/core/tests/coretests/src/android/app/servertransaction/TransactionParcelTests.java
+++ b/core/tests/coretests/src/android/app/servertransaction/TransactionParcelTests.java
@@ -465,12 +465,12 @@
@Override
public void scheduleCreateBackupAgent(ApplicationInfo applicationInfo,
- CompatibilityInfo compatibilityInfo, int i) throws RemoteException {
+ CompatibilityInfo compatibilityInfo, int i, int userId) throws RemoteException {
}
@Override
public void scheduleDestroyBackupAgent(ApplicationInfo applicationInfo,
- CompatibilityInfo compatibilityInfo) throws RemoteException {
+ CompatibilityInfo compatibilityInfo, int userId) throws RemoteException {
}
@Override
diff --git a/keystore/java/android/security/OWNERS b/keystore/java/android/security/OWNERS
new file mode 100644
index 0000000..ed30587
--- /dev/null
+++ b/keystore/java/android/security/OWNERS
@@ -0,0 +1 @@
+per-file *.java,*.aidl = eranm@google.com,pgrafov@google.com,rubinxu@google.com
diff --git a/keystore/tests/OWNERS b/keystore/tests/OWNERS
new file mode 100644
index 0000000..9e65f88
--- /dev/null
+++ b/keystore/tests/OWNERS
@@ -0,0 +1,5 @@
+# Android Enterprise security team
+eranm@google.com
+irinaid@google.com
+pgrafov@google.com
+rubinxu@google.com
diff --git a/libs/hwui/Android.bp b/libs/hwui/Android.bp
index 96798f9..0335a7c 100644
--- a/libs/hwui/Android.bp
+++ b/libs/hwui/Android.bp
@@ -28,10 +28,6 @@
// clang's warning is broken, see: https://llvm.org/bugs/show_bug.cgi?id=21629
"-Wno-missing-braces",
-
- // TODO: Linear blending should be enabled by default, but we are
- // TODO: making it an opt-in while it's a work in progress
- //"-DANDROID_ENABLE_LINEAR_BLENDING",
],
include_dirs: [
diff --git a/libs/hwui/HardwareBitmapUploader.cpp b/libs/hwui/HardwareBitmapUploader.cpp
index 6b7ec97..aeeb32c 100644
--- a/libs/hwui/HardwareBitmapUploader.cpp
+++ b/libs/hwui/HardwareBitmapUploader.cpp
@@ -116,7 +116,6 @@
static FormatInfo determineFormat(const SkBitmap& skBitmap) {
FormatInfo formatInfo;
- // TODO: add support for linear blending (when ANDROID_ENABLE_LINEAR_BLENDING is defined)
switch (skBitmap.info().colorType()) {
case kRGBA_8888_SkColorType:
formatInfo.isSupported = true;
diff --git a/libs/hwui/VectorDrawable.cpp b/libs/hwui/VectorDrawable.cpp
index 7265692..da905cf 100644
--- a/libs/hwui/VectorDrawable.cpp
+++ b/libs/hwui/VectorDrawable.cpp
@@ -606,12 +606,7 @@
bool Tree::allocateBitmapIfNeeded(Cache& cache, int width, int height) {
if (!canReuseBitmap(cache.bitmap.get(), width, height)) {
-#ifndef ANDROID_ENABLE_LINEAR_BLENDING
- sk_sp<SkColorSpace> colorSpace = nullptr;
-#else
- sk_sp<SkColorSpace> colorSpace = SkColorSpace::MakeSRGB();
-#endif
- SkImageInfo info = SkImageInfo::MakeN32(width, height, kPremul_SkAlphaType, colorSpace);
+ SkImageInfo info = SkImageInfo::MakeN32(width, height, kPremul_SkAlphaType);
cache.bitmap = Bitmap::allocateHeapBitmap(info);
return true;
}
diff --git a/libs/hwui/pipeline/skia/VectorDrawableAtlas.cpp b/libs/hwui/pipeline/skia/VectorDrawableAtlas.cpp
index 8fb621d..e783f38 100644
--- a/libs/hwui/pipeline/skia/VectorDrawableAtlas.cpp
+++ b/libs/hwui/pipeline/skia/VectorDrawableAtlas.cpp
@@ -262,12 +262,7 @@
}
sk_sp<SkSurface> VectorDrawableAtlas::createSurface(int width, int height, GrContext* context) {
-#ifndef ANDROID_ENABLE_LINEAR_BLENDING
- sk_sp<SkColorSpace> colorSpace = nullptr;
-#else
- sk_sp<SkColorSpace> colorSpace = SkColorSpace::MakeSRGB();
-#endif
- SkImageInfo info = SkImageInfo::MakeN32(width, height, kPremul_SkAlphaType, colorSpace);
+ SkImageInfo info = SkImageInfo::MakeN32(width, height, kPremul_SkAlphaType);
// This must have a top-left origin so that calls to surface->canvas->writePixels
// performs a basic texture upload instead of a more complex drawing operation
return SkSurface::MakeRenderTarget(context, SkBudgeted::kYes, info, 0, kTopLeft_GrSurfaceOrigin,
diff --git a/libs/hwui/utils/Color.h b/libs/hwui/utils/Color.h
index b67d10d..79400de 100644
--- a/libs/hwui/utils/Color.h
+++ b/libs/hwui/utils/Color.h
@@ -82,17 +82,6 @@
return linear <= 0.0031308f ? linear * 12.92f : (powf(linear, 1.0f / 2.4f) * 1.055f) - 0.055f;
}
-// Opto-electronic conversion function for the sRGB color space
-// Takes a linear sRGB value and converts it to a gamma-encoded sRGB value
-// This function returns the input unmodified if linear blending is not enabled
-static constexpr float OECF(float linear) {
-#ifdef ANDROID_ENABLE_LINEAR_BLENDING
- return OECF_sRGB(linear);
-#else
- return linear;
-#endif
-}
-
// Electro-optical conversion function for the sRGB color space
// Takes a gamma-encoded sRGB value and converts it to a linear sRGB value
static constexpr float EOCF_sRGB(float srgb) {
@@ -100,17 +89,6 @@
return srgb <= 0.04045f ? srgb / 12.92f : powf((srgb + 0.055f) / 1.055f, 2.4f);
}
-// Electro-optical conversion function for the sRGB color space
-// Takes a gamma-encoded sRGB value and converts it to a linear sRGB value
-// This function returns the input unmodified if linear blending is not enabled
-static constexpr float EOCF(float srgb) {
-#ifdef ANDROID_ENABLE_LINEAR_BLENDING
- return EOCF_sRGB(srgb);
-#else
- return srgb;
-#endif
-}
-
android::PixelFormat ColorTypeToPixelFormat(SkColorType colorType);
ANDROID_API SkColorType PixelFormatToColorType(android::PixelFormat format);
diff --git a/services/core/java/com/android/server/am/ActivityManagerService.java b/services/core/java/com/android/server/am/ActivityManagerService.java
index 191b24a..58c514d 100644
--- a/services/core/java/com/android/server/am/ActivityManagerService.java
+++ b/services/core/java/com/android/server/am/ActivityManagerService.java
@@ -121,6 +121,7 @@
import static com.android.server.am.MemoryStatUtil.hasMemcg;
import static com.android.server.am.MemoryStatUtil.readMemoryStatFromFilesystem;
import static com.android.server.am.MemoryStatUtil.readRssHighWaterMarkFromProcfs;
+import static com.android.server.pm.PackageManagerService.PLATFORM_PACKAGE_NAME;
import static com.android.server.wm.ActivityTaskManagerDebugConfig.DEBUG_CLEANUP;
import static com.android.server.wm.ActivityTaskManagerDebugConfig.DEBUG_CONFIGURATION;
import static com.android.server.wm.ActivityTaskManagerDebugConfig.DEBUG_SWITCH;
@@ -4848,7 +4849,7 @@
try {
thread.scheduleCreateBackupAgent(backupTarget.appInfo,
compatibilityInfoForPackage(backupTarget.appInfo),
- backupTarget.backupMode);
+ backupTarget.backupMode, backupTarget.userId);
} catch (Exception e) {
Slog.wtf(TAG, "Exception thrown creating backup agent in " + app, e);
badApp = true;
@@ -13695,18 +13696,26 @@
// Cause the target app to be launched if necessary and its backup agent
// instantiated. The backup agent will invoke backupAgentCreated() on the
// activity manager to announce its creation.
- public boolean bindBackupAgent(String packageName, int backupMode, int userId) {
+ public boolean bindBackupAgent(String packageName, int backupMode, int targetUserId) {
if (DEBUG_BACKUP) {
- Slog.v(TAG, "bindBackupAgent: app=" + packageName + " mode="
- + backupMode + " userId=" + userId + " callingUid = " + Binder.getCallingUid()
+ Slog.v(TAG, "bindBackupAgent: app=" + packageName + " mode=" + backupMode
+ + " targetUserId=" + targetUserId + " callingUid = " + Binder.getCallingUid()
+ " uid = " + Process.myUid());
}
enforceCallingPermission("android.permission.CONFIRM_FULL_BACKUP", "bindBackupAgent");
+ // The instantiatedUserId is the user of the process the backup agent is started in. This is
+ // different from the targetUserId which is the user whose data is to be backed up or
+ // restored. This distinction is important for system-process packages that live in the
+ // system user's process but backup/restore data for non-system users.
+ // TODO (b/123688746): Handle all system-process packages with singleton check.
+ final int instantiatedUserId =
+ PLATFORM_PACKAGE_NAME.equals(packageName) ? UserHandle.USER_SYSTEM : targetUserId;
+
IPackageManager pm = AppGlobals.getPackageManager();
ApplicationInfo app = null;
try {
- app = pm.getApplicationInfo(packageName, STOCK_PM_FLAGS, userId);
+ app = pm.getApplicationInfo(packageName, STOCK_PM_FLAGS, instantiatedUserId);
} catch (RemoteException e) {
// can't happen; package manager is process-local
}
@@ -13730,7 +13739,7 @@
+ app.packageName + ": " + e);
}
- BackupRecord r = new BackupRecord(app, backupMode);
+ BackupRecord r = new BackupRecord(app, backupMode, targetUserId);
ComponentName hostingName =
(backupMode == ApplicationThreadConstants.BACKUP_MODE_INCREMENTAL)
? new ComponentName(app.packageName, app.backupAgentName)
@@ -13752,10 +13761,10 @@
proc.inFullBackup = true;
}
r.app = proc;
- final BackupRecord backupTarget = mBackupTargets.get(userId);
+ final BackupRecord backupTarget = mBackupTargets.get(targetUserId);
oldBackupUid = backupTarget != null ? backupTarget.appInfo.uid : -1;
newBackupUid = proc.inFullBackup ? r.appInfo.uid : -1;
- mBackupTargets.put(userId, r);
+ mBackupTargets.put(targetUserId, r);
// Try not to kill the process during backup
updateOomAdjLocked(proc, true);
@@ -13766,7 +13775,7 @@
if (DEBUG_BACKUP) Slog.v(TAG_BACKUP, "Agent proc already running: " + proc);
try {
proc.thread.scheduleCreateBackupAgent(app,
- compatibilityInfoForPackage(app), backupMode);
+ compatibilityInfoForPackage(app), backupMode, targetUserId);
} catch (RemoteException e) {
// Will time out on the backup manager side
}
@@ -13806,16 +13815,18 @@
// A backup agent has just come up
@Override
- public void backupAgentCreated(String agentPackageName, IBinder agent) {
- final int callingUserId = UserHandle.getCallingUserId();
+ public void backupAgentCreated(String agentPackageName, IBinder agent, int userId) {
+ // Resolve the target user id and enforce permissions.
+ userId = mUserController.handleIncomingUser(Binder.getCallingPid(), Binder.getCallingUid(),
+ userId, /* allowAll */ false, ALLOW_FULL_ONLY, "backupAgentCreated", null);
if (DEBUG_BACKUP) {
Slog.v(TAG_BACKUP, "backupAgentCreated: " + agentPackageName + " = " + agent
- + " callingUserId = " + callingUserId + " callingUid = "
- + Binder.getCallingUid() + " uid = " + Process.myUid());
+ + " callingUserId = " + UserHandle.getCallingUserId() + " userId = " + userId
+ + " callingUid = " + Binder.getCallingUid() + " uid = " + Process.myUid());
}
synchronized(this) {
- final BackupRecord backupTarget = mBackupTargets.get(callingUserId);
+ final BackupRecord backupTarget = mBackupTargets.get(userId);
String backupAppName = backupTarget == null ? null : backupTarget.appInfo.packageName;
if (!agentPackageName.equals(backupAppName)) {
Slog.e(TAG, "Backup agent created for " + agentPackageName + " but not requested!");
@@ -13827,7 +13838,7 @@
try {
IBackupManager bm = IBackupManager.Stub.asInterface(
ServiceManager.getService(Context.BACKUP_SERVICE));
- bm.agentConnectedForUser(callingUserId, agentPackageName, agent);
+ bm.agentConnectedForUser(userId, agentPackageName, agent);
} catch (RemoteException e) {
// can't happen; the backup manager service is local
} catch (Exception e) {
@@ -13880,7 +13891,7 @@
if (proc.thread != null) {
try {
proc.thread.scheduleDestroyBackupAgent(appInfo,
- compatibilityInfoForPackage(appInfo));
+ compatibilityInfoForPackage(appInfo), userId);
} catch (Exception e) {
Slog.e(TAG, "Exception when unbinding backup agent:");
e.printStackTrace();
diff --git a/services/core/java/com/android/server/am/BackupRecord.java b/services/core/java/com/android/server/am/BackupRecord.java
index 40ad383..37b4be4 100644
--- a/services/core/java/com/android/server/am/BackupRecord.java
+++ b/services/core/java/com/android/server/am/BackupRecord.java
@@ -28,14 +28,16 @@
String stringName; // cached toString() output
final ApplicationInfo appInfo; // information about BackupAgent's app
+ final int userId; // user for which backup is performed
final int backupMode; // full backup / incremental / restore
ProcessRecord app; // where this agent is running or null
// ----- Implementation -----
- BackupRecord(ApplicationInfo _appInfo, int _backupMode) {
+ BackupRecord(ApplicationInfo _appInfo, int _backupMode, int _userId) {
appInfo = _appInfo;
backupMode = _backupMode;
+ userId = _userId;
}
public String toString() {
diff --git a/services/core/java/com/android/server/pm/ModuleInfoProvider.java b/services/core/java/com/android/server/pm/ModuleInfoProvider.java
index 642bfa2..e7dace0 100644
--- a/services/core/java/com/android/server/pm/ModuleInfoProvider.java
+++ b/services/core/java/com/android/server/pm/ModuleInfoProvider.java
@@ -138,7 +138,7 @@
// to dealing with this as we'll now have to listen to all config changes and
// regenerate the data if required. Also, is this the right way to parse a resource
// reference out of an XML file ?
- final String moduleName = packageResources.getString(
+ final CharSequence moduleName = packageResources.getText(
Integer.parseInt(parser.getAttributeValue(null, "name").substring(1)));
final String modulePackageName = XmlUtils.readStringAttribute(parser,
"packageName");
diff --git a/services/core/java/com/android/server/timezonedetector/TimeZoneDetectorService.java b/services/core/java/com/android/server/timezonedetector/TimeZoneDetectorService.java
deleted file mode 100644
index 5f71b0b..0000000
--- a/services/core/java/com/android/server/timezonedetector/TimeZoneDetectorService.java
+++ /dev/null
@@ -1,67 +0,0 @@
-/*
- * Copyright (C) 2018 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.server.timezonedetector;
-
-import com.android.internal.util.DumpUtils;
-import com.android.server.SystemService;
-import android.app.timezonedetector.ITimeZoneDetectorService;
-import android.content.Context;
-import android.util.Slog;
-import java.io.FileDescriptor;
-import java.io.PrintWriter;
-
-public final class TimeZoneDetectorService extends ITimeZoneDetectorService.Stub {
- private static final String TAG = "timezonedetector.TimeZoneDetectorService";
-
- public static class Lifecycle extends SystemService {
-
- public Lifecycle(Context context) {
- super(context);
- }
-
- @Override
- public void onStart() {
- TimeZoneDetectorService service = TimeZoneDetectorService.create(getContext());
- // Publish the binder service so it can be accessed from other (appropriately
- // permissioned) processes.
- publishBinderService(Context.TIME_ZONE_DETECTOR_SERVICE, service);
- }
- }
-
- private final Context mContext;
-
- private static TimeZoneDetectorService create(Context context) {
- return new TimeZoneDetectorService(context);
- }
-
- public TimeZoneDetectorService(Context context) {
- mContext = context;
- }
-
- @Override
- public void stubbedCall() {
- // Empty call for initial tests.
- Slog.d(TAG, "stubbedCall() called");
- // TODO: Remove when there are real methods.
- }
-
- @Override
- protected void dump(FileDescriptor fd, PrintWriter pw, String[] args) {
- if (!DumpUtils.checkDumpPermission(mContext, TAG, pw)) return;
- // TODO: Implement when there is state.
- }
-}
diff --git a/services/java/com/android/server/SystemServer.java b/services/java/com/android/server/SystemServer.java
index 6733440..71ed5ae 100644
--- a/services/java/com/android/server/SystemServer.java
+++ b/services/java/com/android/server/SystemServer.java
@@ -263,8 +263,6 @@
"com.android.internal.car.CarServiceHelperService";
private static final String TIME_DETECTOR_SERVICE_CLASS =
"com.android.server.timedetector.TimeDetectorService$Lifecycle";
- private static final String TIME_ZONE_DETECTOR_SERVICE_CLASS =
- "com.android.server.timezonedetector.TimeZoneDetectorService$Lifecycle";
private static final String ACCESSIBILITY_MANAGER_SERVICE_CLASS =
"com.android.server.accessibility.AccessibilityManagerService$Lifecycle";
private static final String ADB_SERVICE_CLASS =
@@ -1428,14 +1426,6 @@
reportWtf("starting StartTimeDetectorService service", e);
}
traceEnd();
-
- traceBeginAndSlog("StartTimeZoneDetectorService");
- try {
- mSystemServiceManager.startService(TIME_ZONE_DETECTOR_SERVICE_CLASS);
- } catch (Throwable e) {
- reportWtf("starting StartTimeZoneDetectorService service", e);
- }
- traceEnd();
}
if (!isWatch) {
diff --git a/services/tests/servicestests/src/com/android/server/timezonedetector/TimeZoneDetectorServiceTest.java b/services/tests/servicestests/src/com/android/server/timezonedetector/TimeZoneDetectorServiceTest.java
deleted file mode 100644
index 0936fff..0000000
--- a/services/tests/servicestests/src/com/android/server/timezonedetector/TimeZoneDetectorServiceTest.java
+++ /dev/null
@@ -1,46 +0,0 @@
-/*
- * Copyright (C) 2018 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.server.timezonedetector;
-
-import android.content.Context;
-
-import androidx.test.InstrumentationRegistry;
-import androidx.test.runner.AndroidJUnit4;
-
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-
-/**
- * Unit tests for the {@link TimeZoneDetectorService}.
- */
-@RunWith(AndroidJUnit4.class)
-public class TimeZoneDetectorServiceTest {
-
- private TimeZoneDetectorService mTimeZoneDetectorService;
-
- @Before
- public void setUp() {
- final Context context = InstrumentationRegistry.getContext();
- mTimeZoneDetectorService = new TimeZoneDetectorService(context);
- }
-
- @Test
- public void testStubbedCall() {
- mTimeZoneDetectorService.stubbedCall();
- }
-}