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

Commit 2349332f authored by Filip Gruszczynski's avatar Filip Gruszczynski
Browse files

Only relaunch activity on significant size configuration changes.

Currently if the configuration width/height/smallest width changes, we
relaunch the activity or invoke onConfigurationChanged callback. When it
comes to size based configuration changes it might not be necessary: if
the size change doesn't pass one of the threshold defined by the
resources, it means there is no need to relaunch the activity.

In this CL the ActivityManager will receive the thresholds from the
application and use them to decide, whether to relaunch the activity.
The application reads the thresholds from the resources, specifically
from resource qualifiers used by the app.

Change-Id: Ie3cf0a172dc1ba0b865cf30c2962e7cfd9ad8436
parent 0f9f0189
Loading
Loading
Loading
Loading
+45 −2
Original line number Diff line number Diff line
@@ -2653,6 +2653,24 @@ public abstract class ActivityManagerNative extends Binder implements IActivityM
            reply.writeNoException();
            return true;
        }
        case REPORT_SIZE_CONFIGURATIONS: {
            data.enforceInterface(IActivityManager.descriptor);
            IBinder token = data.readStrongBinder();
            int horizontalSize = data.readInt();
            int[] horizontal = null;
            if (horizontalSize > 0) {
                horizontal = new int[horizontalSize];
                data.readIntArray(horizontal);
            }
            int[] vertical = null;
            int verticalSize = data.readInt();
            if (verticalSize > 0) {
                vertical = new int[verticalSize];
                data.readIntArray(vertical);
            }
            reportSizeConfigurations(token, horizontal, vertical);
            return true;
        }
        }

        return super.onTransact(code, data, reply, flags);
@@ -6146,5 +6164,30 @@ class ActivityManagerProxy implements IActivityManager
        return stackId;
    }

    @Override
    public void reportSizeConfigurations(IBinder token, int[] horizontalSizeConfiguration,
            int[] verticalSizeConfigurations) throws RemoteException {
        Parcel data = Parcel.obtain();
        Parcel reply = Parcel.obtain();
        data.writeInterfaceToken(IActivityManager.descriptor);
        data.writeStrongBinder(token);
        if (horizontalSizeConfiguration == null) {
            data.writeInt(0);
        } else {
            data.writeInt(horizontalSizeConfiguration.length);
            data.writeIntArray(horizontalSizeConfiguration);
        }
        if (verticalSizeConfigurations == null) {
            data.writeInt(0);
        } else {
            data.writeInt(verticalSizeConfigurations.length);
            data.writeIntArray(verticalSizeConfigurations);
        }
        mRemote.transact(REPORT_SIZE_CONFIGURATIONS, data, reply, 0);
        reply.readException();
        data.recycle();
        reply.recycle();
    }

    private IBinder mRemote;
}
+38 −0
Original line number Diff line number Diff line
@@ -82,6 +82,7 @@ import android.util.AndroidRuntimeException;
import android.util.ArrayMap;
import android.util.DisplayMetrics;
import android.util.EventLog;
import android.util.IntArray;
import android.util.Log;
import android.util.LogPrinter;
import android.util.Pair;
@@ -2504,6 +2505,7 @@ public final class ActivityThread {

        if (a != null) {
            r.createdConfig = new Configuration(mConfiguration);
            reportSizeConfigurations(r);
            Bundle oldState = r.state;
            handleResumeActivity(r.token, false, r.isForward,
                    !r.activity.mFinished && !r.startsNotResumed);
@@ -2563,6 +2565,42 @@ public final class ActivityThread {
        }
    }

    private void reportSizeConfigurations(ActivityClientRecord r) {
        Configuration[] configurations = r.activity.getResources().getSizeConfigurations();
        if (configurations == null) {
            return;
        }
        IntArray horizontal = new IntArray();
        IntArray vertical = new IntArray();
        for (int i = configurations.length - 1; i >= 0; i--) {
            Configuration config = configurations[i];
            if (config.screenHeightDp != Configuration.SCREEN_HEIGHT_DP_UNDEFINED) {
                vertical.add(config.screenHeightDp);
            }
            if (config.screenWidthDp != Configuration.SCREEN_WIDTH_DP_UNDEFINED) {
                horizontal.add(config.screenWidthDp);
            }
            if (config.smallestScreenWidthDp != Configuration.SMALLEST_SCREEN_WIDTH_DP_UNDEFINED) {
                vertical.add(config.smallestScreenWidthDp);
                horizontal.add(config.smallestScreenWidthDp);
            }
        }
        int[] horizontalArray = null;
        if (horizontal.size() > 0) {
            horizontalArray = horizontal.toArray();
        }
        int[] verticalArray = null;
        if (vertical.size() > 0) {
            verticalArray = vertical.toArray();
        }
        try {
            ActivityManagerNative.getDefault().reportSizeConfigurations(r.token, horizontalArray,
                    verticalArray);
        } catch (RemoteException ex) {
        }

    }

    private void deliverNewIntents(ActivityClientRecord r, List<ReferrerIntent> intents) {
        final int N = intents.size();
        for (int i=0; i<N; i++) {
+3 −0
Original line number Diff line number Diff line
@@ -121,6 +121,8 @@ public interface IActivityManager extends IInterface {
            PersistableBundle persistentState, CharSequence description) throws RemoteException;
    public void activitySlept(IBinder token) throws RemoteException;
    public void activityDestroyed(IBinder token) throws RemoteException;
    public void reportSizeConfigurations(IBinder token, int[] horizontalSizeConfiguration,
            int[] verticalSizeConfigurations) throws RemoteException;
    public String getCallingPackage(IBinder token) throws RemoteException;
    public ComponentName getCallingActivity(IBinder token) throws RemoteException;
    public List<IAppTask> getAppTasks(String callingPackage) throws RemoteException;
@@ -884,4 +886,5 @@ public interface IActivityManager extends IInterface {
    int POSITION_TASK_IN_STACK_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION + 342;
    int GET_ACTIVITY_STACK_ID_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION + 343;
    int MOVE_ACTIVITY_TO_STACK_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION + 344;
    int REPORT_SIZE_CONFIGURATIONS = IBinder.FIRST_CALL_TRANSACTION + 345;
}
+3 −0
Original line number Diff line number Diff line
@@ -691,6 +691,9 @@ public final class AssetManager implements AutoCloseable {
     */
    public native final String[] getLocales();

    /** {@hide} */
    public native final Configuration[] getSizeConfigurations();

    /**
     * Change the configuation used when retrieving resources.  Not for use by
     * applications.
+6 −1
Original line number Diff line number Diff line
@@ -2140,6 +2140,11 @@ public class Resources {
        return mConfiguration;
    }

    /** @hide */
    public Configuration[] getSizeConfigurations() {
        return mAssets.getSizeConfigurations();
    };

    /**
     * Return the compatibility mode information for the application.
     * The returned object should be treated as read-only.
Loading