blob: dd798027200652d222321d3cc555d9456a7fc74f [file] [log] [blame]
// Copyright 2016 The Vanadium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
package io.v.todos;
import android.app.Activity;
import android.app.ProgressDialog;
import android.os.AsyncTask;
import android.util.Log;
import android.widget.Toast;
import com.google.common.base.Throwables;
import java.util.concurrent.Executor;
import java.util.concurrent.Executors;
import io.v.todos.persistence.Persistence;
/**
* Persistence initialization may or may not block. For non-blocking persistence initialization,
* this class simply calls {@link #initPersistence()} and
* {@link #onSuccess(Persistence)}/{@link #onFailure(Exception)} in a single thread. For blocking
* persistence initialization, it shows a {@link ProgressDialog} while initializing persistence on
* a worker thread. This obscures the main UI in a friendly way until persistence is ready.
*/
public abstract class PersistenceInitializer<T extends Persistence> {
private static final String TAG = PersistenceInitializer.class.getSimpleName();
// TODO(rosswang): https://github.com/vanadium/issues/issues/1309
private static final Executor sInitExecutor = Executors.newCachedThreadPool();
protected final Activity mActivity;
public PersistenceInitializer(Activity activity) {
mActivity = activity;
}
protected abstract T initPersistence() throws Exception;
protected abstract void onSuccess(T persistence);
protected void onFailure(Exception e) {
Toast.makeText(mActivity, R.string.err_init, Toast.LENGTH_LONG).show();
Log.e(TAG, Throwables.getStackTraceAsString(e));
mActivity.finish();
}
public void execute(boolean mayBlock) {
if (mayBlock) {
final ProgressDialog progress = new ProgressDialog(mActivity);
progress.setMessage(mActivity.getString(R.string.init_persistence));
progress.setCancelable(false);
progress.show();
new AsyncTask<Void, Void, Object>() {
@Override
protected Object doInBackground(Void... params) {
try {
return initPersistence();
} catch (Exception e) {
return e;
}
}
@Override
@SuppressWarnings("unchecked")
protected void onPostExecute(Object o) {
if (o instanceof Exception) {
onFailure((Exception) o);
} else {
onSuccess((T) o);
}
progress.dismiss();
}
}.executeOnExecutor(sInitExecutor);
} else {
T persistence;
try {
persistence = initPersistence();
} catch (Exception e) {
onFailure(e);
return;
}
onSuccess(persistence);
}
}
}