summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Mathew Inwood <mathewi@google.com> 2019-06-24 12:07:22 +0100
committer Mathew Inwood <mathewi@google.com> 2019-07-18 15:50:26 +0000
commitbe2b0a71d73ea66426c1e4585520c386939388f2 (patch)
tree4b0f1f4d2dd284e349608355aefb785c25702145
parent7fdff6402e52ffb8a462c77d0777c39e928a3165 (diff)
Compatibility API implementation for app processes.
Pass the set of disabled changes from the system server into the app in the bindApplication() call. Use this to instantiate an implementation of Compatibility.Callbacks() to implement the API. Test: Manual. Bug: 135010838 Merged-In: I2fcf25264c62acc801f9e62967072cd04e4641e7 Change-Id: I2fcf25264c62acc801f9e62967072cd04e4641e7
-rw-r--r--core/java/android/app/ActivityThread.java7
-rw-r--r--core/java/android/app/AppCompatCallbacks.java64
-rw-r--r--core/java/android/app/IApplicationThread.aidl2
-rw-r--r--core/java/android/content/res/CompatibilityInfo.java4
-rw-r--r--core/tests/coretests/src/android/app/servertransaction/TransactionParcelTests.java3
-rw-r--r--services/core/java/com/android/server/am/ActivityManagerService.java8
6 files changed, 80 insertions, 8 deletions
diff --git a/core/java/android/app/ActivityThread.java b/core/java/android/app/ActivityThread.java
index 546f000159a0..9173e214cddd 100644
--- a/core/java/android/app/ActivityThread.java
+++ b/core/java/android/app/ActivityThread.java
@@ -790,6 +790,8 @@ public final class ActivityThread extends ClientTransactionHandler {
@Nullable
ContentCaptureOptions contentCaptureOptions;
+ long[] disabledCompatChanges;
+
@Override
public String toString() {
return "AppBindData{appInfo=" + appInfo + "}";
@@ -1002,7 +1004,7 @@ public final class ActivityThread extends ClientTransactionHandler {
boolean isRestrictedBackupMode, boolean persistent, Configuration config,
CompatibilityInfo compatInfo, Map services, Bundle coreSettings,
String buildSerial, AutofillOptions autofillOptions,
- ContentCaptureOptions contentCaptureOptions) {
+ ContentCaptureOptions contentCaptureOptions, long[] disabledCompatChanges) {
if (services != null) {
if (false) {
// Test code to make sure the app could see the passed-in services.
@@ -1050,6 +1052,7 @@ public final class ActivityThread extends ClientTransactionHandler {
data.buildSerial = buildSerial;
data.autofillOptions = autofillOptions;
data.contentCaptureOptions = contentCaptureOptions;
+ data.disabledCompatChanges = disabledCompatChanges;
sendMessage(H.BIND_APPLICATION, data);
}
@@ -6130,10 +6133,10 @@ public final class ActivityThread extends ClientTransactionHandler {
if (data.trackAllocation) {
DdmVmInternal.enableRecentAllocations(true);
}
-
// Note when this process has started.
Process.setStartTimes(SystemClock.elapsedRealtime(), SystemClock.uptimeMillis());
+ AppCompatCallbacks.install(data.disabledCompatChanges);
mBoundApplication = data;
mConfiguration = new Configuration(data.config);
mCompatConfiguration = new Configuration(data.config);
diff --git a/core/java/android/app/AppCompatCallbacks.java b/core/java/android/app/AppCompatCallbacks.java
new file mode 100644
index 000000000000..17697dba9ccd
--- /dev/null
+++ b/core/java/android/app/AppCompatCallbacks.java
@@ -0,0 +1,64 @@
+/*
+ * Copyright (C) 2019 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;
+
+import android.compat.Compatibility;
+import android.os.Process;
+import android.util.Log;
+
+import java.util.Arrays;
+
+/**
+ * App process implementation of the {@link Compatibility} API.
+ *
+ * @hide
+ */
+public final class AppCompatCallbacks extends Compatibility.Callbacks {
+
+ private static final String TAG = "Compatibility";
+
+ private final long[] mDisabledChanges;
+
+ /**
+ * Install this class into the current process.
+ *
+ * @param disabledChanges Set of compatibility changes that are disabled for this process.
+ */
+ public static void install(long[] disabledChanges) {
+ Compatibility.setCallbacks(new AppCompatCallbacks(disabledChanges));
+ }
+
+ private AppCompatCallbacks(long[] disabledChanges) {
+ mDisabledChanges = Arrays.copyOf(disabledChanges, disabledChanges.length);
+ Arrays.sort(mDisabledChanges);
+ }
+
+ protected void reportChange(long changeId) {
+ Log.d(TAG, "Compat change reported: " + changeId + "; UID " + Process.myUid());
+ // TODO log via StatsLog
+ }
+
+ protected boolean isChangeEnabled(long changeId) {
+ if (Arrays.binarySearch(mDisabledChanges, changeId) < 0) {
+ // Not present in the disabled array
+ reportChange(changeId);
+ return true;
+ }
+ return false;
+ }
+
+}
diff --git a/core/java/android/app/IApplicationThread.aidl b/core/java/android/app/IApplicationThread.aidl
index 66c438393bd6..cfa065ba5bc9 100644
--- a/core/java/android/app/IApplicationThread.aidl
+++ b/core/java/android/app/IApplicationThread.aidl
@@ -73,7 +73,7 @@ oneway interface IApplicationThread {
boolean restrictedBackupMode, boolean persistent, in Configuration config,
in CompatibilityInfo compatInfo, in Map services,
in Bundle coreSettings, in String buildSerial, in AutofillOptions autofillOptions,
- in ContentCaptureOptions contentCaptureOptions);
+ in ContentCaptureOptions contentCaptureOptions, in long[] disabledCompatChanges);
void runIsolatedEntryPoint(in String entryPoint, in String[] entryPointArgs);
void scheduleExit();
void scheduleServiceArgs(IBinder token, in ParceledListSlice args);
diff --git a/core/java/android/content/res/CompatibilityInfo.java b/core/java/android/content/res/CompatibilityInfo.java
index a99a0b5a7a90..f3b7553577ca 100644
--- a/core/java/android/content/res/CompatibilityInfo.java
+++ b/core/java/android/content/res/CompatibilityInfo.java
@@ -32,8 +32,8 @@ import android.view.WindowManager;
import android.view.WindowManager.LayoutParams;
/**
- * CompatibilityInfo class keeps the information about compatibility mode that the application is
- * running under.
+ * CompatibilityInfo class keeps the information about the screen compatibility mode that the
+ * application is running under.
*
* {@hide}
*/
diff --git a/core/tests/coretests/src/android/app/servertransaction/TransactionParcelTests.java b/core/tests/coretests/src/android/app/servertransaction/TransactionParcelTests.java
index d2b18cb0bcb8..51da0c871c4d 100644
--- a/core/tests/coretests/src/android/app/servertransaction/TransactionParcelTests.java
+++ b/core/tests/coretests/src/android/app/servertransaction/TransactionParcelTests.java
@@ -416,7 +416,8 @@ public class TransactionParcelTests {
IUiAutomationConnection iUiAutomationConnection, int i, boolean b, boolean b1,
boolean b2, boolean b3, Configuration configuration,
CompatibilityInfo compatibilityInfo, Map map, Bundle bundle1, String s1,
- AutofillOptions ao, ContentCaptureOptions co) throws RemoteException {
+ AutofillOptions ao, ContentCaptureOptions co, long[] disableCompatChanges)
+ throws RemoteException {
}
@Override
diff --git a/services/core/java/com/android/server/am/ActivityManagerService.java b/services/core/java/com/android/server/am/ActivityManagerService.java
index 91ae156afdf5..e58fe6762b68 100644
--- a/services/core/java/com/android/server/am/ActivityManagerService.java
+++ b/services/core/java/com/android/server/am/ActivityManagerService.java
@@ -348,6 +348,7 @@ import com.android.server.ThreadPriorityBooster;
import com.android.server.Watchdog;
import com.android.server.am.ActivityManagerServiceDumpProcessesProto.UidObserverRegistrationProto;
import com.android.server.appop.AppOpsService;
+import com.android.server.compat.CompatConfig;
import com.android.server.contentcapture.ContentCaptureManagerInternal;
import com.android.server.firewall.IntentFirewall;
import com.android.server.job.JobSchedulerInternal;
@@ -5038,6 +5039,7 @@ public class ActivityManagerService extends IActivityManager.Stub
bindApplicationTimeMillis = SystemClock.elapsedRealtime();
mAtmInternal.preBindApplication(app.getWindowProcessController());
final ActiveInstrumentation instr2 = app.getActiveInstrumentation();
+ long[] disabledCompatChanges = CompatConfig.get().getDisabledChanges(app.info);
if (app.isolatedEntryPoint != null) {
// This is an isolated process which should just call an entry point instead of
// being bound to an application.
@@ -5053,7 +5055,8 @@ public class ActivityManagerService extends IActivityManager.Stub
new Configuration(app.getWindowProcessController().getConfiguration()),
app.compat, getCommonServicesLocked(app.isolated),
mCoreSettingsObserver.getCoreSettingsLocked(),
- buildSerial, autofillOptions, contentCaptureOptions);
+ buildSerial, autofillOptions, contentCaptureOptions,
+ disabledCompatChanges);
} else {
thread.bindApplication(processName, appInfo, providers, null, profilerInfo,
null, null, null, testMode,
@@ -5062,7 +5065,8 @@ public class ActivityManagerService extends IActivityManager.Stub
new Configuration(app.getWindowProcessController().getConfiguration()),
app.compat, getCommonServicesLocked(app.isolated),
mCoreSettingsObserver.getCoreSettingsLocked(),
- buildSerial, autofillOptions, contentCaptureOptions);
+ buildSerial, autofillOptions, contentCaptureOptions,
+ disabledCompatChanges);
}
if (profilerInfo != null) {
profilerInfo.closeFd();