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

Commit d385c7e9 authored by cretin45's avatar cretin45
Browse files

SetupWizard: Fix race conditions with async callbacks

Change-Id: Ifeeec3ac74b4644bb26b9f90d0159a64b173785b
parent d7e70040
Loading
Loading
Loading
Loading
+69 −10
Original line number Diff line number Diff line
@@ -33,11 +33,17 @@ public abstract class AbstractSetupData extends BroadcastReceiver implements Set

    private int mCurrentPageIndex = 0;

    private OnResumeRunnable mOnResumeRunnable;

    public AbstractSetupData(SetupWizardActivity context) {
        mContext = context;
        mPageList = onNewPageList();
    }

    public void setContext(SetupWizardActivity context) {
        mContext = context;
    }

    protected abstract PageList onNewPageList();

    @Override
@@ -75,6 +81,12 @@ public abstract class AbstractSetupData extends BroadcastReceiver implements Set
        return mPageList.getPage(mCurrentPageIndex);
    }

    @Override
    public boolean isCurrentPage(Page page) {
        if (page == null) return false;
        return page.getKey().equals(getCurrentPage().getKey());
    }

    public boolean isFirstPage() {
        return mCurrentPageIndex == 0;
    }
@@ -85,6 +97,9 @@ public abstract class AbstractSetupData extends BroadcastReceiver implements Set

    @Override
    public void onNextPage() {
        Runnable runnable = new Runnable() {
            @Override
            public void run() {
                if (getCurrentPage().doNextAction() == false) {
                    if (advanceToNextUnhidden()) {
                        for (int i = 0; i < mListeners.size(); i++) {
@@ -93,9 +108,15 @@ public abstract class AbstractSetupData extends BroadcastReceiver implements Set
                    }
                }
            }
        };
        doPreviousNext(runnable);
    }

    @Override
    public void onPreviousPage() {
        Runnable runnable = new Runnable() {
            @Override
            public void run() {
                if (getCurrentPage().doPreviousAction() == false) {
                    if (advanceToPreviousUnhidden()) {
                        for (int i = 0; i < mListeners.size(); i++) {
@@ -104,6 +125,9 @@ public abstract class AbstractSetupData extends BroadcastReceiver implements Set
                    }
                }
            }
        };
        doPreviousNext(runnable);
    }

    private boolean advanceToNextUnhidden() {
        while (mCurrentPageIndex < mPageList.size()) {
@@ -134,6 +158,24 @@ public abstract class AbstractSetupData extends BroadcastReceiver implements Set
        }
    }

    private void doPreviousNext(Runnable runnable) {
        if (mContext.isResumed()) {
            runnable.run();
        } else {
            mOnResumeRunnable = new OnResumeRunnable(runnable, this);
        }
    }

    public void onDestroy() {
        mOnResumeRunnable = null;
    }

    public void onResume() {
        if (mOnResumeRunnable != null) {
            mOnResumeRunnable.run();
        }
    }

    public void finishPages() {
        for (Page page : mPageList.values()) {
            page.onFinishSetup();
@@ -155,4 +197,21 @@ public abstract class AbstractSetupData extends BroadcastReceiver implements Set
    public void unregisterListener(SetupDataCallbacks listener) {
        mListeners.remove(listener);
    }

    private static class OnResumeRunnable implements Runnable {

        private final AbstractSetupData mAbstractSetupData;
        private final Runnable mRunnable;

        private OnResumeRunnable(Runnable runnable, AbstractSetupData abstractSetupData) {
            mAbstractSetupData = abstractSetupData;
            mRunnable = runnable;
        }

        @Override
        public void run() {
            mRunnable.run();
            mAbstractSetupData.mOnResumeRunnable = null;
        }
    }
}
+1 −0
Original line number Diff line number Diff line
@@ -22,6 +22,7 @@ public interface SetupDataCallbacks {
    void onPageLoaded(Page page);
    void onPageTreeChanged();
    void onFinish();
    boolean isCurrentPage(Page page);
    Page getPage(String key);
    Page getPage(int key);
}
+8 −4
Original line number Diff line number Diff line
@@ -59,7 +59,7 @@ public class WifiSetupPage extends SetupPage {
    private Runnable mFinishCaptivePortalCheckRunnable = new Runnable() {
        @Override
        public void run() {
            final Activity activity = mContext;
            final SetupWizardActivity activity = mContext;
            if (mIsCaptivePortal) {
                try {
                    int netId = ConnectivityManager.from(activity)
@@ -82,12 +82,16 @@ public class WifiSetupPage extends SetupPage {
                } catch (Exception e) {
                    //Oh well
                    Log.e(TAG, "No captive portal activity found" + e);
                    if (activity.isCurrentPage(WifiSetupPage.this)) {
                        getCallbacks().onNextPage();
                    }
                }
            } else {
                if (activity.isCurrentPage(WifiSetupPage.this)) {
                    getCallbacks().onNextPage();
                }
            }
        }
    };

    public WifiSetupPage(SetupWizardActivity context, SetupDataCallbacks callbacks) {
@@ -147,7 +151,7 @@ public class WifiSetupPage extends SetupPage {
            }
        } else if (requestCode == SetupWizardApp.REQUEST_CODE_SETUP_CAPTIVE_PORTAL) {
            if (resultCode == Activity.RESULT_CANCELED) {
                SetupWizardUtils.launchWifiSetup((Activity)mContext);
                SetupWizardUtils.launchWifiSetup(mContext);
            } else {
                getCallbacks().onNextPage();
            }
+9 −0
Original line number Diff line number Diff line
@@ -69,6 +69,8 @@ public class SetupWizardActivity extends Activity implements SetupDataCallbacks
        mSetupData = (CMSetupWizardData)getLastNonConfigurationInstance();
        if (mSetupData == null) {
            mSetupData = new CMSetupWizardData(this);
        } else {
            mSetupData.setContext(this);
        }
        mNextButton = (Button) findViewById(R.id.next_button);
        mPrevButton = (Button) findViewById(R.id.prev_button);
@@ -128,6 +130,7 @@ public class SetupWizardActivity extends Activity implements SetupDataCallbacks
                | View.SYSTEM_UI_FLAG_IMMERSIVE
                | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION);
        super.onResume();
        mSetupData.onResume();
        onPageTreeChanged();
        enableButtonBar(true);
    }
@@ -135,6 +138,7 @@ public class SetupWizardActivity extends Activity implements SetupDataCallbacks
    @Override
    protected void onDestroy() {
        super.onDestroy();
        mSetupData.onDestroy();
        mSetupData.unregisterListener(this);
        unregisterReceiver(mSetupData);
    }
@@ -236,6 +240,11 @@ public class SetupWizardActivity extends Activity implements SetupDataCallbacks
        return mSetupData.getPage(key);
    }

    @Override
    public boolean isCurrentPage(Page page) {
        return mSetupData.isCurrentPage(page);
    }

    @Override
    public void onFinish() {
        animateOut();