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

Commit 902d5ee7 authored by Zoey Chen's avatar Zoey Chen
Browse files

Improve the performance of displaying preference - multithread.

Test: manual test, use command to run MobileNetworkSettings and record it.
Bug: 161691402
Change-Id: I33be3fab9eb470b48c0d0870d4c03cdaecbac334
parent 0829cea2
Loading
Loading
Loading
Loading
+0 −1
Original line number Diff line number Diff line
@@ -132,7 +132,6 @@ abstract class AbstractMobileNetworkSettings extends RestrictedDashboardFragment
        final TelephonyStatusControlSession session =
                setTelephonyAvailabilityStatus(controllers);


        final PreferenceScreen screen = getPreferenceScreen();
        controllers.forEach(controller -> {
            controller.displayPreference(screen);
+18 −18
Original line number Diff line number Diff line
@@ -22,6 +22,7 @@ import com.android.settings.core.BasePreferenceController;
import com.android.settingslib.core.AbstractPreferenceController;
import com.android.settingslib.utils.ThreadUtils;

import java.util.ArrayList;
import java.util.Collection;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.Future;
@@ -37,7 +38,7 @@ public class TelephonyStatusControlSession implements AutoCloseable {
    private static final String LOG_TAG = "TelephonyStatusControlSS";

    private Collection<AbstractPreferenceController> mControllers;
    private Future<Boolean> mResult;
    private Collection<Future<Boolean>> mResult = new ArrayList<>();

    /**
     * Buider of session
@@ -67,9 +68,9 @@ public class TelephonyStatusControlSession implements AutoCloseable {

    private TelephonyStatusControlSession(Collection<AbstractPreferenceController> controllers) {
        mControllers = controllers;
        mResult = ThreadUtils.postOnBackgroundThread(() ->
            setupAvailabilityStatus(controllers)
        );
        controllers.forEach(prefCtrl -> mResult
                .add(ThreadUtils.postOnBackgroundThread(() -> setupAvailabilityStatus(prefCtrl))));

    }

    /**
@@ -79,25 +80,24 @@ public class TelephonyStatusControlSession implements AutoCloseable {
     */
    public void close() {
        //check the background thread is finished then unset the status of availability.

        for (Future<Boolean> result : mResult) {
            try {
            mResult.get();
                result.get();
            } catch (ExecutionException | InterruptedException exception) {
                Log.e(LOG_TAG, "setup availability status failed!", exception);
            }
        }
        unsetAvailabilityStatus(mControllers);
    }

    private Boolean setupAvailabilityStatus(
            Collection<AbstractPreferenceController> controllerLists) {
    private Boolean setupAvailabilityStatus(AbstractPreferenceController controller) {
        try {
            controllerLists.stream()
                    .filter(controller -> controller instanceof TelephonyAvailabilityHandler)
                    .map(TelephonyAvailabilityHandler.class::cast)
                    .forEach(controller -> {
            if (controller instanceof TelephonyAvailabilityHandler) {
                int status = ((BasePreferenceController) controller)
                        .getAvailabilityStatus();
                        controller.setAvailabilityStatus(status);
                    });
                ((TelephonyAvailabilityHandler) controller).setAvailabilityStatus(status);
            }
            return true;
        } catch (Exception exception) {
            Log.e(LOG_TAG, "Setup availability status failed!", exception);