package com.salama.android.webviewutil; import java.util.ArrayList; import java.util.List; import java.util.concurrent.ConcurrentHashMap; import MetoXML.XmlSerializer; import android.R; import android.app.AlertDialog; import android.app.ProgressDialog; import android.content.BroadcastReceiver; import android.content.Context; import android.content.DialogInterface; import android.content.Intent; import android.content.IntentFilter; import android.graphics.Color; import android.support.v4.content.LocalBroadcastManager; import android.util.Log; import android.view.View; import android.view.ViewGroup; import android.view.Window; import android.widget.ProgressBar; import android.widget.RelativeLayout; import com.salama.android.support.ServiceSupportApplication; import com.salama.android.support.ServiceSupportUtil; import com.salama.android.util.SSLog; import com.salama.android.webcore.LocalWebViewFragment; public class BaseWebViewController extends LocalWebViewFragment { private final static String LOG_TAG = "BaseWebViewController"; /** * 广播传递异步调用返回结果的参数名 */ public static final String DATA_SERVICE_NOTIFICATION_USER_INFO_RESULT = "result"; //private int _senderTagSeed; //private ConcurrentHashMap<String, String> _senderTagToJSCallBackMapping = new ConcurrentHashMap<String, String>(); private ConcurrentHashMap<String, String> _notificationNameToJSCallBackMapping = new ConcurrentHashMap<String, String>(); protected ProgressDialog _spinnerForWaiting = null; public BaseWebViewController() { super(); } public BaseWebViewController(String viewServiceClassName) { super(viewServiceClassName); } @Override public void onDestroy() { //clear receivers for(int i = 0; i < _localBroadcastReceiverList.size(); i++) { LocalBroadcastManager.getInstance(getActivity()).unregisterReceiver(_localBroadcastReceiverList.get(i)); } _localBroadcastReceiverList.clear(); super.onDestroy(); } private List<BroadcastReceiver> _localBroadcastReceiverList = new ArrayList<BroadcastReceiver>(); private class NotifySupportBroadcastReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { try { final String jsCallBack = _notificationNameToJSCallBackMapping.get(intent.getAction()); if(jsCallBack != null) { Object userInfoObj = ServiceSupportApplication.singleton().getWrappedDataFromLocalBroadcast( intent, DATA_SERVICE_NOTIFICATION_USER_INFO_RESULT); final List<String> params = new ArrayList<String>(); if(userInfoObj != null) { if(userInfoObj.getClass().isAssignableFrom(String.class)) { params.add((String)userInfoObj); } else { try { String jsParamXml = XmlSerializer.objectToString( userInfoObj, userInfoObj.getClass(), false, false); params.add(jsParamXml); } catch(Exception e) { Log.e(LOG_TAG, "onReceive()", e); } } } BaseWebViewController.this.getActivity().runOnUiThread(new Runnable() { @Override public void run() { try { callJavaScript(jsCallBack, params); } catch(Throwable e) { Log.e(LOG_TAG, "", e); } } }); } } catch(Throwable e) { Log.e(LOG_TAG, "", e); } } }; /** * 注册JavaScript函数,同通知名绑定 * @param notificationName 通知名 * @param jsCallBack JavaScript回调函数 */ public void registerJSCallBackToNotification(String notificationName, String jsCallBack) { if(notificationName == null || notificationName.length() == 0 || jsCallBack == null || jsCallBack.length() == 0) { return; } if(!_notificationNameToJSCallBackMapping.containsKey(notificationName)) { _notificationNameToJSCallBackMapping.put(notificationName, jsCallBack); SSLog.d(LOG_TAG, "registerJSCallBackToNotification() notificationName:" + notificationName + " jsCallBack:" + jsCallBack); //unregister localBroadcast //LocalBroadcastManager.getInstance(getActivity()).unregisterReceiver(_localBroadcastReceiver); IntentFilter localBroadcastIntentFilter = new IntentFilter(); localBroadcastIntentFilter.addAction(notificationName); NotifySupportBroadcastReceiver receiver = new NotifySupportBroadcastReceiver(); _localBroadcastReceiverList.add(receiver); LocalBroadcastManager.getInstance(getActivity()).registerReceiver( receiver, localBroadcastIntentFilter); } } /** * 显示Alert画面 * @param title 标题 * @param message 消息内容 * @param buttonTitleList 按钮标题列表 * @param jsCallBack JavaScript函数 */ public void showAlert(final String title, final String message, final List<String> buttonTitleList, final String jsCallBack) { getActivity().runOnUiThread(new Runnable() { @Override public void run() { try { AlertDialog.Builder alertBuilder = new AlertDialog.Builder(getActivity()); AlertDialog alert = alertBuilder.create(); alert.setTitle(title); alert.setMessage(message); final String jsCallBackTmp = jsCallBack; DialogInterface.OnClickListener listener = null; if(jsCallBackTmp != null && jsCallBackTmp.length() > 0) { listener = new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { callJavaScript(jsCallBackTmp, ServiceSupportUtil.newList( new String[]{Integer.toString(Math.abs(which)-1)})); } }; } if(buttonTitleList.size() > 0) { alert.setButton(buttonTitleList.get(0), listener); } if(buttonTitleList.size() > 1) { alert.setButton2(buttonTitleList.get(1), listener); } if(buttonTitleList.size() > 2) { alert.setButton3(buttonTitleList.get(2), listener); } alert.show(); } catch(Throwable e) { Log.e(LOG_TAG, "", e); } } }); } /** * 显示装载等待动画 * @param spinnerUIStyle 风格。此参数仅为保持和iOS版兼容,Android中不起作用。 */ public void startWaitingSpinnerAnimating(int spinnerUIStyle) { getActivity().runOnUiThread(new Runnable() { @Override public void run() { try { if(_spinnerForWaiting == null) { _spinnerForWaiting = new ProgressDialog(getActivity()); //_spinnerForWaiting.setProgressStyle(ProgressDialog.STYLE_SPINNER); //_spinnerForWaiting.requestWindowFeature(Window.FEATURE_NO_TITLE); //_spinnerForWaiting.setTitle(null); _spinnerForWaiting.setCancelable(true); //Layout -------------------------------------- RelativeLayout layout = new RelativeLayout(getActivity()); RelativeLayout.LayoutParams layoutParam = new RelativeLayout.LayoutParams( RelativeLayout.LayoutParams.WRAP_CONTENT, RelativeLayout.LayoutParams.WRAP_CONTENT); layoutParam.addRule(RelativeLayout.CENTER_IN_PARENT); layout.setLayoutParams(layoutParam); layout.setBackgroundColor(Color.TRANSPARENT); //progressBar --------------------------------- ProgressBar progressBar = new ProgressBar(getActivity(), null, android.R.attr.progressBarStyleLarge); RelativeLayout.LayoutParams layoutParam2 = new RelativeLayout.LayoutParams( RelativeLayout.LayoutParams.WRAP_CONTENT, RelativeLayout.LayoutParams.WRAP_CONTENT); //layoutParam2.addRule(RelativeLayout.CENTER_IN_PARENT); progressBar.setLayoutParams(layoutParam2); //progressBar.setBackgroundColor(Color.TRANSPARENT); progressBar.setIndeterminate(true); //progressBar.setVisibility(View.VISIBLE); layout.addView(progressBar); _spinnerForWaiting.show(); _spinnerForWaiting.setContentView(layout); } else { _spinnerForWaiting.cancel(); _spinnerForWaiting.show(); } } catch(Exception e) { SSLog.e(LOG_TAG, "startWaitingSpinnerAnimating()", e); } } }); } /** * 停止装载等待动画 */ public void stopWaitingSpinnerAnimating() { getActivity().runOnUiThread(new Runnable() { @Override public void run() { try { if(_spinnerForWaiting != null) { _spinnerForWaiting.cancel(); } } catch(Throwable e) { SSLog.e(LOG_TAG, "stopWaitingSpinnerAnimating()", e); } } }); } }