/* * Copyright (C) 2013 The CyanogenMod 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 com.cyanogenmod.setupwizard.setup; import android.content.BroadcastReceiver; import android.content.Context; import android.os.Bundle; import java.util.ArrayList; public abstract class AbstractSetupData extends BroadcastReceiver implements SetupDataCallbacks { private static final String TAG = AbstractSetupData.class.getSimpleName(); protected final Context mContext; private ArrayList mListeners = new ArrayList(); private PageList mPageList; private int mCurrentPageIndex = 0; private boolean mIsResumed = false; private boolean mIsFinished = false; private OnResumeRunnable mOnResumeRunnable; public AbstractSetupData(Context context) { mContext = context; mPageList = onNewPageList(); } protected abstract PageList onNewPageList(); @Override public void onPageLoaded(Page page) { for (int i = 0; i < mListeners.size(); i++) { mListeners.get(i).onPageLoaded(page); } } @Override public void onPageTreeChanged() { for (int i = 0; i < mListeners.size(); i++) { mListeners.get(i).onPageTreeChanged(); } } @Override public void onFinish() { for (int i = 0; i < mListeners.size(); i++) { mListeners.get(i).onFinish(); } } @Override public void finishSetup() { for (int i = 0; i < mListeners.size(); i++) { mListeners.get(i).finishSetup(); } } @Override public Page getPage(String key) { return mPageList.getPage(key); } @Override public Page getPage(int index) { return mPageList.getPage(index); } public Page getCurrentPage() { 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; } public boolean isLastPage() { return mCurrentPageIndex == mPageList.size() - 1; } @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++) { mListeners.get(i).onNextPage(); } } } } }; 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++) { mListeners.get(i).onPreviousPage(); } } } } }; doPreviousNext(runnable); } @Override public void setCurrentPage(String key) { if (mPageList.getPage(key) != null) { mCurrentPageIndex = mPageList.getPageIndex(key); } } public Page getNextPage(String key) { if (mPageList.getPage(key) != null) { int currentPageIndex = mPageList.getPageIndex(key); return mPageList.getPage(currentPageIndex + 1); } return null; } private boolean advanceToNextUnhidden() { while (mCurrentPageIndex < mPageList.size()) { mCurrentPageIndex++; if (!getCurrentPage().isHidden()) { return true; } } return false; } private boolean advanceToPreviousUnhidden() { while (mCurrentPageIndex > 0) { mCurrentPageIndex--; if (!getCurrentPage().isHidden()) { return true; } } return false; } public void load(Bundle savedValues) { for (String key : savedValues.keySet()) { Page page = mPageList.getPage(key); if (page != null) { page.resetData(savedValues.getBundle(key)); } } } private void doPreviousNext(Runnable runnable) { if (mIsResumed) { runnable.run(); } else { mOnResumeRunnable = new OnResumeRunnable(runnable, this); } } public void onDestroy() { mOnResumeRunnable = null; } public void onPause() { mIsResumed = false; } public void onResume() { mIsResumed = true; if (mOnResumeRunnable != null) { mOnResumeRunnable.run(); } } public void finishPages() { mIsFinished = true; for (Page page : mPageList.values()) { page.onFinishSetup(); } } @Override public void addFinishRunnable(Runnable runnable) { for (int i = 0; i < mListeners.size(); i++) { mListeners.get(i).addFinishRunnable(runnable); } } public boolean isFinished() { return mIsFinished; } public Bundle save() { Bundle bundle = new Bundle(); for (Page page : mPageList.values()) { bundle.putBundle(page.getKey(), page.getData()); } return bundle; } public void registerListener(SetupDataCallbacks listener) { mListeners.add(listener); } 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; } } }