package net.dev123.yibo; import android.app.ProgressDialog; import android.os.Handler; import android.util.Log; import android.view.View; import android.view.View.OnClickListener; /** * Collection of utility functions used in this package. */ public class Util { private static OnClickListener sNullOnClickListener; private Util() { } public static void debugWhere(String tag, String msg) { Log.d(tag, msg + " --- stack trace begins: "); StackTraceElement[] elements = Thread.currentThread().getStackTrace(); // skip first 3 element, they are not related to the caller for (int i = 3, n = elements.length; i < n; ++i) { StackTraceElement st = elements[i]; String message = String.format(" at %s.%s(%s:%s)", st.getClassName(), st.getMethodName(), st.getFileName(), st.getLineNumber()); Log.d(tag, message); } Log.d(tag, msg + " --- stack trace ends."); } public static synchronized OnClickListener getNullOnClickListener() { if (sNullOnClickListener == null) { sNullOnClickListener = new OnClickListener() { public void onClick(View v) { } }; } return sNullOnClickListener; } private static class BackgroundJob extends MonitoredActivity.LifeCycleAdapter implements Runnable { private final MonitoredActivity mActivity; private final ProgressDialog mDialog; private final Runnable mJob; private final Handler mHandler; private final Runnable mCleanupRunner = new Runnable() { public void run() { mActivity.removeLifeCycleListener(BackgroundJob.this); if (mDialog.getWindow() != null) mDialog.dismiss(); } }; public BackgroundJob(MonitoredActivity activity, Runnable job, ProgressDialog dialog, Handler handler) { mActivity = activity; mDialog = dialog; mJob = job; mActivity.addLifeCycleListener(this); mHandler = handler; } public void run() { try { mJob.run(); } finally { mHandler.post(mCleanupRunner); } } @Override public void onActivityDestroyed(MonitoredActivity activity) { // We get here only when the onDestroyed being called before // the mCleanupRunner. So, run it now and remove it from the queue mCleanupRunner.run(); mHandler.removeCallbacks(mCleanupRunner); } @Override public void onActivityStopped(MonitoredActivity activity) { mDialog.hide(); } @Override public void onActivityStarted(MonitoredActivity activity) { mDialog.show(); } } public static void startBackgroundJob(MonitoredActivity activity, String title, String message, Runnable job, Handler handler) { // Make the progress dialog uncancelable, so that we can gurantee // the thread will be done before the activity getting destroyed. ProgressDialog dialog = ProgressDialog.show( activity, title, message, true, false); new Thread(new BackgroundJob(activity, job, dialog, handler)).start(); } }