bfde63c27c
Themes keep breaking the handle themeConfig flag. This provides a workaround for cases the activity gets torn down during the finish process. Change-Id: I6664ded3dfff5b69c1217f89f25106953cb5f92a
241 lines
6.3 KiB
Java
241 lines
6.3 KiB
Java
/*
|
|
* 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<SetupDataCallbacks> mListeners = new ArrayList<SetupDataCallbacks>();
|
|
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);
|
|
}
|
|
|
|
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;
|
|
}
|
|
}
|
|
}
|