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

Commit cd2ec3aa authored by Louis Chang's avatar Louis Chang Committed by Android (Google) Code Review
Browse files

Merge "Dispose the embedded TFs synchronously when handle app died" into main

parents 566e424c dead9268
Loading
Loading
Loading
Loading
+11 −0
Original line number Diff line number Diff line
@@ -184,3 +184,14 @@ flag {
    bug: "400351723"
    is_fixed_read_only: true
}

flag {
    namespace: "windowing_sdk"
    name: "dispose_task_fragment_synchronously"
    description: "Handle TaskFragment disposal synchronously when handling app died."
    bug: "429336735"
    is_fixed_read_only: true
    metadata {
        purpose: PURPOSE_BUGFIX
    }
}
 No newline at end of file
+41 −14
Original line number Diff line number Diff line
@@ -181,6 +181,13 @@ public class TaskFragmentOrganizerController extends ITaskFragmentOrganizerContr
        private final ArrayMap<IBinder, Transition.ReadyCondition> mInFlightTransactions =
                new ArrayMap<>();

        /** Listener for process death event. */
        private final WindowProcessController.Listener mProcessListener = () -> {
            synchronized (mGlobalLock) {
                handleAppDied();
            }
        };

        TaskFragmentOrganizerState(@NonNull ITaskFragmentOrganizer organizer, int pid, int uid,
                boolean isSystemOrganizer) {
            mAppThread = getAppThread(pid, uid);
@@ -188,22 +195,23 @@ public class TaskFragmentOrganizerController extends ITaskFragmentOrganizerContr
            mOrganizerPid = pid;
            mOrganizerUid = uid;
            mIsSystemOrganizer = isSystemOrganizer;
            try {
                mOrganizer.asBinder().linkToDeath(this, 0 /*flags*/);
            } catch (RemoteException e) {
                Slog.e(TAG, "TaskFragmentOrganizer failed to register death recipient");
            }

            registerProcessDiedHandler(pid);
        }

        @Override
        public void binderDied() {
            synchronized (mGlobalLock) {
                handleAppDied();
            }
        }

        private void handleAppDied() {
            // TODO(b/419688177): remove the debug log
            ProtoLog.d(WmProtoLogGroups.WM_DEBUG_WINDOW_TRANSITIONS_MIN,
                    "TaskFragmentOrganizer=%s died", mOrganizer);
            removeOrganizer(mOrganizer, "client died");
        }
        }

        void restore(@NonNull ITaskFragmentOrganizer organizer, int pid) {
            mOrganizer = organizer;
@@ -218,12 +226,23 @@ public class TaskFragmentOrganizerController extends ITaskFragmentOrganizerContr
                    mOrganizedTaskFragments.remove(taskFragment);
                }
            }
            registerProcessDiedHandler(pid);
        }

        private void registerProcessDiedHandler(int pid) {
            if (com.android.window.flags.Flags.disposeTaskFragmentSynchronously()) {
                final WindowProcessController wpc = mAtmService.mProcessMap.getProcess(pid);
                if (wpc != null) {
                    wpc.addListener(mProcessListener);
                }
            } else {
                try {
                    mOrganizer.asBinder().linkToDeath(this, 0 /*flags*/);
                } catch (RemoteException e) {
                    Slog.e(TAG, "TaskFragmentOrganizer failed to register death recipient");
                }
            }
        }

        boolean hasSavedState() {
            return mSavedState != null && !mSavedState.isEmpty();
@@ -312,8 +331,16 @@ public class TaskFragmentOrganizerController extends ITaskFragmentOrganizerContr
                // Cleanup any in-flight transactions to unblock the transition.
                mInFlightTransactions.valueAt(i).meetAlternate("disposed(" + reason + ")");
            }
            if (com.android.window.flags.Flags.disposeTaskFragmentSynchronously()) {
                final WindowProcessController wpc = mAtmService.mProcessMap.getProcess(
                        mOrganizerPid);
                if (wpc != null) {
                    wpc.removeListener(mProcessListener);
                }
            } else {
                mOrganizer.asBinder().unlinkToDeath(this, 0 /* flags */);
            }
        }

        @NonNull
        TaskFragmentTransaction.Change prepareTaskFragmentAppeared(@NonNull TaskFragment tf) {
+39 −0
Original line number Diff line number Diff line
@@ -274,6 +274,8 @@ public class WindowProcessController extends ConfigurationContainer<Configuratio
    private volatile boolean mIsActivityConfigOverrideAllowed = true;
    /** Non-zero to pause dispatching process configuration change. */
    private int mPauseConfigurationDispatchCount;
    /** Listeners to handle the process died event. */
    private List<WindowProcessController.Listener> mListeners = null;

    /**
     * Activities that hosts some UI drawn by the current process. The activities live
@@ -1566,6 +1568,7 @@ public class WindowProcessController extends ConfigurationContainer<Configuratio
        }
        clearRecentTasks();
        clearActivities();
        notifyHandleAppDied();

        return hasVisibleActivities;
    }
@@ -2314,4 +2317,40 @@ public class WindowProcessController extends ConfigurationContainer<Configuratio
    PackageOptimizationInfo getOptimizationInfo() {
        return mOptimizationInfo;
    }

    void addListener(@NonNull WindowProcessController.Listener listener) {
        if (!com.android.window.flags.Flags.disposeTaskFragmentSynchronously()) {
            return;
        }
        if (mListeners == null) {
            mListeners = new ArrayList<>();
        }
        mListeners.add(listener);
    }

    void removeListener(@NonNull WindowProcessController.Listener listener) {
        if (mListeners == null) {
            return;
        }

        mListeners.remove(listener);
    }

    private void notifyHandleAppDied() {
        if (mListeners == null) {
            return;
        }

        for (int i = mListeners.size() - 1; i >= 0; --i) {
            mListeners.get(i).onHandleAppDied();
        }
        mListeners = null;
    }

    interface Listener {
        /**
         * Called when the process died.
         */
        void onHandleAppDied();
    }
}