Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit a1b39023 authored by Mathew Inwood's avatar Mathew Inwood
Browse files

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
parent c7997471
Loading
Loading
Loading
Loading
+6 −1
Original line number Diff line number Diff line
@@ -703,6 +703,8 @@ public final class ActivityThread extends ClientTransactionHandler {

        boolean autofillCompatibilityEnabled;

        long[] disabledCompatChanges;

        public String toString() {
            return "AppBindData{appInfo=" + appInfo + "}";
        }
@@ -920,7 +922,8 @@ public final class ActivityThread extends ClientTransactionHandler {
                boolean enableBinderTracking, boolean trackAllocation,
                boolean isRestrictedBackupMode, boolean persistent, Configuration config,
                CompatibilityInfo compatInfo, Map services, Bundle coreSettings,
                String buildSerial, boolean autofillCompatibilityEnabled) {
                String buildSerial, boolean autofillCompatibilityEnabled,
                long[] disabledCompatChanges) {

            if (services != null) {
                if (false) {
@@ -968,6 +971,7 @@ public final class ActivityThread extends ClientTransactionHandler {
            data.initProfilerInfo = profilerInfo;
            data.buildSerial = buildSerial;
            data.autofillCompatibilityEnabled = autofillCompatibilityEnabled;
            data.disabledCompatChanges = disabledCompatChanges;
            sendMessage(H.BIND_APPLICATION, data);
        }

@@ -5670,6 +5674,7 @@ public final class ActivityThread extends ClientTransactionHandler {
        // 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);
+64 −0
Original line number Diff line number Diff line
/*
 * 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;
    }

}
+2 −1
Original line number Diff line number Diff line
@@ -67,7 +67,8 @@ oneway interface IApplicationThread {
            int debugMode, boolean enableBinderTracking, boolean trackAllocation,
            boolean restrictedBackupMode, boolean persistent, in Configuration config,
            in CompatibilityInfo compatInfo, in Map services,
            in Bundle coreSettings, in String buildSerial, boolean isAutofillCompatEnabled);
            in Bundle coreSettings, in String buildSerial, boolean isAutofillCompatEnabled,
            in long[] disabledCompatChanges);
    void runIsolatedEntryPoint(in String entryPoint, in String[] entryPointArgs);
    void scheduleExit();
    void scheduleServiceArgs(IBinder token, in ParceledListSlice args);
+2 −2
Original line number Diff line number Diff line
@@ -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} 
 */
+2 −1
Original line number Diff line number Diff line
@@ -412,7 +412,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,
                boolean autofillCompatEnabled) throws RemoteException {
                boolean autofillCompatEnabled, long[] disableCompatChanges)
                throws RemoteException {
        }

        @Override
Loading