/*
* Copyright (C) 2007-2013 Geometer Plus <contact@geometerplus.com>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
* 02110-1301, USA.
*/
package org.geometerplus.android.util;
import java.util.LinkedList;
import java.util.Queue;
import org.geometerplus.zlibrary.core.resources.ZLResource;
import android.app.Activity;
import android.app.ProgressDialog;
import android.content.Context;
import android.os.Handler;
import android.os.Message;
import android.widget.Toast;
import com.yamin.reader.view.LoadingDialog;
public abstract class UIUtil {
private static final Object ourMonitor = new Object();
private static ProgressDialog ourProgress;
private static LoadingDialog loadDialog = null;
private static class Pair {
final Runnable Action;
final String Message;
Pair(Runnable action, String message) {
Action = action;
Message = message;
}
};
private static final Queue<Pair> ourTaskQueue = new LinkedList<Pair>();
private static volatile Handler ourProgressHandler;
private static boolean init() {
if (ourProgressHandler != null) {
return true;
}
try {
ourProgressHandler = new Handler() {
public void handleMessage(Message message) {
try {
synchronized (ourMonitor) {
if (ourTaskQueue.isEmpty()) {
ourProgress.dismiss();
ourProgress = null;
} else {
ourProgress
.setMessage(ourTaskQueue.peek().Message);
}
ourMonitor.notify();
}
} catch (Exception e) {
}
}
};
return true;
} catch (Throwable t) {
t.printStackTrace();
return false;
}
}
public static void wait(String key, Runnable action, Context context) {
if (!init()) {
action.run();
return;
}
synchronized (ourMonitor) {
final String message = ZLResource.resource("dialog")
.getResource("waitMessage").getResource(key).getValue();
ourTaskQueue.offer(new Pair(action, message));
if (ourProgress == null) {
ourProgress = ProgressDialog.show(context, null, "请等待,搜索中...", true,
false);
} else {
return;
}
}
final ProgressDialog currentProgress = ourProgress;
new Thread(new Runnable() {
public void run() {
while ((ourProgress == currentProgress)
&& !ourTaskQueue.isEmpty()) {
Pair p = ourTaskQueue.poll();
p.Action.run();
synchronized (ourMonitor) {
ourProgressHandler.sendEmptyMessage(0);
try {
ourMonitor.wait();
} catch (InterruptedException e) {
}
}
}
}
}).start();
}
public static void runWithMessage(final Activity activity, String key,
final Runnable action, final Runnable postAction,
final boolean minPriority) {
// final String message =
// ZLResource.resource("dialog").getResource("waitMessage").getResource(key).getValue();
activity.runOnUiThread(new Runnable() {
public void run() {
// final ProgressDialog progress = ProgressDialog.show(activity,
// null, "请稍后...加载中", true, false);
showLoading(activity, "请稍后...加载中");
final Thread runner = new Thread() {
public void run() {
action.run();
activity.runOnUiThread(new Runnable() {
public void run() {
try {
// progress.dismiss();
stopLoading();
} catch (Exception e) {
e.printStackTrace();
}
if (postAction != null) {
postAction.run();
}
}
});
}
};
if (minPriority) {
runner.setPriority(Thread.MIN_PRIORITY);
}
runner.start();
}
});
}
/*
* modify by yamin.cao
*/
public static void showLoading(Activity activity, String msg) {
if (loadDialog == null) {
loadDialog = LoadingDialog.createDialog(activity, msg);
loadDialog.setCanceledOnTouchOutside(false);
}
loadDialog.show();
}
private static void stopLoading() {
if (loadDialog != null) {
loadDialog.dismiss();
loadDialog = null;
}
}
public static void showMessageText(Context context, String text) {
Toast.makeText(context, text, Toast.LENGTH_SHORT).show();
}
public static void showErrorMessage(Context context, String resourceKey) {
showMessageText(context, ZLResource.resource("errorMessage")
.getResource(resourceKey).getValue());
}
public static void showErrorMessage(Context context, String resourceKey,
String parameter) {
showMessageText(context, ZLResource.resource("errorMessage")
.getResource(resourceKey).getValue().replace("%s", parameter));
}
}