MainPersenter.java 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436
  1. package com.edufound.mobile.xxt.main;
  2. import android.annotation.SuppressLint;
  3. import android.app.Activity;
  4. import android.app.Dialog;
  5. import android.content.Context;
  6. import android.content.Intent;
  7. import android.graphics.Bitmap;
  8. import android.graphics.Color;
  9. import android.os.Build;
  10. import android.os.Bundle;
  11. import android.os.Handler;
  12. import android.os.Message;
  13. import android.support.annotation.Nullable;
  14. import android.view.Display;
  15. import android.view.Gravity;
  16. import android.view.KeyEvent;
  17. import android.view.View;
  18. import android.view.Window;
  19. import android.view.WindowManager;
  20. import android.webkit.JsResult;
  21. import android.webkit.WebChromeClient;
  22. import android.webkit.WebResourceRequest;
  23. import android.webkit.WebResourceResponse;
  24. import android.webkit.WebSettings;
  25. import android.webkit.WebView;
  26. import android.webkit.WebViewClient;
  27. import com.edufound.mobile.xxt.application.EApplication;
  28. import com.edufound.mobile.xxt.base.BaseModel;
  29. import com.edufound.mobile.xxt.base.BasePersenter;
  30. import com.edufound.mobile.xxt.interfaces.EfunboxPayInterfaces;
  31. import com.edufound.mobile.xxt.interfaces.JsInterfaces;
  32. import com.edufound.mobile.xxt.util.ContextUtil;
  33. import com.edufound.mobile.xxt.util.DeviceUtil;
  34. import com.edufound.mobile.xxt.util.DeviceUuidFactory;
  35. import com.edufound.mobile.xxt.util.Logger;
  36. import com.edufound.mobile.xxt.util.SPutil;
  37. import com.edufound.mobile.xxt.util.ToastUtil;
  38. import com.edufound.mobile.xxt.view.ErrorView;
  39. public class MainPersenter implements MainIPersenter {
  40. public static final int WECHAT_LOGIN = 0x76761;
  41. public static final int PAY_RESULT = 0x76762;
  42. private static MainView mView = null;
  43. private MainModel mModel = null;
  44. private JsInterfaces mJsInterfaces = null;
  45. private EfunboxPayInterfaces mPayInterfaces = null;
  46. private String mLoadUrl;
  47. ErrorView mErrorView;
  48. Dialog mErrorViewDialog;
  49. private DeviceUtil deviceUtil;
  50. public MainPersenter(MainView view) {
  51. mView = view;
  52. mModel = new MainModel();
  53. deviceUtil = new DeviceUtil();
  54. mJsInterfaces = new JsInterfaces(mView);
  55. mPayInterfaces = new EfunboxPayInterfaces(mView);
  56. }
  57. @Override
  58. public void loadData() {
  59. mModel.LoadData(new BaseModel.LoadDataBack() {
  60. @Override
  61. public void success(String datajson) {
  62. Logger.e("datajson:" + datajson);
  63. mView.showData(datajson);
  64. }
  65. @Override
  66. public void failure() {
  67. Logger.e("failure");
  68. }
  69. });
  70. }
  71. // 设置WebView
  72. @SuppressLint("JavascriptInterface")
  73. @Override
  74. public void initWebView(final WebView webview) {
  75. if (Build.VERSION.SDK_INT >= 19) {
  76. webview.getSettings().setLoadsImagesAutomatically(true);
  77. } else {
  78. webview.getSettings().setLoadsImagesAutomatically(false);
  79. }
  80. if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
  81. webview.getSettings().setMixedContentMode(WebSettings.MIXED_CONTENT_ALWAYS_ALLOW);
  82. }
  83. webview.requestFocus(View.FOCUS_DOWN);
  84. webview.getSettings().setJavaScriptEnabled(true);
  85. webview.getSettings().setJavaScriptCanOpenWindowsAutomatically(true);//允许js弹出窗口
  86. webview.getSettings().setDomStorageEnabled(true);
  87. // webview.getSettings().setMediaPlaybackRequiresUserGesture(false);
  88. webview.getSettings().setBlockNetworkImage(false);
  89. // webview.getSettings().set
  90. webview.setBackgroundColor(Color.TRANSPARENT);
  91. // webview.setBackgroundResource();
  92. webview.getSettings().setCacheMode(WebSettings.LOAD_NO_CACHE);
  93. webview.getSettings().setUseWideViewPort(true);
  94. webview.getSettings().setLoadWithOverviewMode(true);
  95. webview.getSettings().setTextZoom(100);
  96. webview.setWebChromeClient(new WebChromeClient() {
  97. @Override
  98. public boolean onJsAlert(WebView view, String url, String message, JsResult result) {
  99. return super.onJsAlert(view, url, message, result);
  100. }
  101. @Override
  102. public void onShowCustomView(View view, CustomViewCallback callback) {
  103. super.onShowCustomView(view, callback);
  104. }
  105. @Override
  106. public void onProgressChanged(WebView view, int newProgress) {
  107. if (newProgress >= 100) {
  108. }
  109. super.onProgressChanged(view, newProgress);
  110. }
  111. });
  112. webview.setWebViewClient(new WebViewClient() {
  113. @Override
  114. public boolean shouldOverrideUrlLoading(WebView view, String url) {
  115. // webview.removeAllViews();
  116. view.loadUrl(url);
  117. return true;
  118. }
  119. @Override
  120. public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) {
  121. super.onReceivedError(view, errorCode, description, failingUrl);
  122. view.loadUrl("");
  123. showDisConnNeWorkWindow();
  124. }
  125. @Override
  126. public void onReceivedHttpError(WebView view, WebResourceRequest request, WebResourceResponse errorResponse) {
  127. super.onReceivedHttpError(view, request, errorResponse);
  128. // int statusCode = 0;
  129. // if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.LOLLIPOP) {
  130. // statusCode = errorResponse.getStatusCode();
  131. // }
  132. // System.out.println("onReceivedHttpError code = " + statusCode);
  133. // if (404 == statusCode) {
  134. // view.loadUrl("about:blank");// 避免出现默认的错误界面
  135. // showDisConnNeWorkWindow();
  136. // }
  137. }
  138. @Override
  139. public void onPageStarted(WebView view, String url, Bitmap favicon) {
  140. super.onPageStarted(view, url, favicon);
  141. }
  142. @Override
  143. public void onPageFinished(WebView view, String url) {
  144. if (!webview.getSettings().getLoadsImagesAutomatically()) {
  145. webview.getSettings().setLoadsImagesAutomatically(true);
  146. }
  147. mView.hideLoading();
  148. super.onPageFinished(view, url);
  149. }
  150. });
  151. webview.addJavascriptInterface(mJsInterfaces, "efunboxJS");
  152. webview.addJavascriptInterface(mPayInterfaces, "efunboxPay");
  153. }
  154. public int dip2px(Context context, float dpValue) {
  155. final float scale = context.getResources().getDisplayMetrics().density;
  156. return (int) (dpValue * scale + 0.5f);
  157. }
  158. @Override
  159. public JsInterfaces getJsInterfaces() {
  160. return mJsInterfaces;
  161. }
  162. @Override
  163. public EfunboxPayInterfaces getPayInterfaces() {
  164. return mPayInterfaces;
  165. }
  166. @Override
  167. public void openWeb(Intent intent) {
  168. mView.loadUrl("");
  169. mLoadUrl = mModel.getDefaultLoadUrl();
  170. String intent_url = intent.getStringExtra("url");
  171. Logger.e("-----------------------------");
  172. Logger.e("intent_url:" + intent_url);
  173. Logger.e("-----------------------------");
  174. if (intent_url != null && !intent_url.isEmpty()) {
  175. mLoadUrl = intent_url;
  176. }
  177. String preuuid = SPutil.getPrefString(ContextUtil.getContext(), DeviceUuidFactory.UUID_SPKEY, "");
  178. if (preuuid.equals("")) {
  179. preuuid = DeviceUuidFactory.getUuid().toString();
  180. }
  181. StringBuffer buffer = new StringBuffer();
  182. buffer.append("appCode=" + EApplication.getAppCode());
  183. buffer.append("&uuid=" + preuuid);
  184. buffer.append("&width=" + deviceUtil.getWidth(mView.getActivity()));
  185. buffer.append("&height=" + deviceUtil.getHeight(mView.getActivity()));
  186. buffer.append("&version=" + deviceUtil.getVersionCode(mView.getActivity()));
  187. mLoadUrl += buffer.toString();
  188. Logger.DebugE("LOADURL=" + mLoadUrl);
  189. mView.loadUrl(mLoadUrl);
  190. }
  191. @Override
  192. public boolean onKeyDown(int keycode, KeyEvent event) {
  193. switch (keycode) {
  194. case KeyEvent.KEYCODE_DPAD_CENTER:
  195. case KeyEvent.KEYCODE_ENTER:
  196. mView.loadJsMehtod("boxEventHandler('key_down','KEY_SELECT')");
  197. break;
  198. case KeyEvent.KEYCODE_BACK:
  199. case KeyEvent.KEYCODE_ESCAPE:
  200. mView.loadJsMehtod("boxEventHandler('key_down','KEY_BACK')");
  201. return true;
  202. case KeyEvent.KEYCODE_HOME:
  203. // Home键 -,- P.S:不一定能监听到
  204. Logger.DebugE("click home");
  205. EApplication.exitApp();
  206. break;
  207. case KeyEvent.KEYCODE_DPAD_UP:
  208. // 上
  209. mView.loadJsMehtod("boxEventHandler('key_down','KEY_UP')");
  210. break;
  211. case KeyEvent.KEYCODE_DPAD_RIGHT:
  212. // 右
  213. mView.loadJsMehtod("boxEventHandler('key_down','KEY_RIGHT')");
  214. break;
  215. case KeyEvent.KEYCODE_DPAD_DOWN:
  216. // 下
  217. mView.loadJsMehtod("boxEventHandler('key_down','KEY_DOWN')");
  218. break;
  219. case KeyEvent.KEYCODE_DPAD_LEFT:
  220. // 左
  221. mView.loadJsMehtod("boxEventHandler('key_down','KEY_LEFT')");
  222. break;
  223. }
  224. return false;
  225. }
  226. @Override
  227. public boolean onKeyUp(int keycode, KeyEvent event) {
  228. // getJsInterfaces().clickMusic("1", "1");
  229. if (mView.getActivityPay()) {
  230. return true;
  231. }
  232. switch (keycode) {
  233. case KeyEvent.KEYCODE_DPAD_CENTER:
  234. case KeyEvent.KEYCODE_ENTER:
  235. // 确认键
  236. mView.loadJsMehtod("boxEventHandler('key_up','KEY_SELECT')");
  237. break;
  238. case KeyEvent.KEYCODE_BACK:
  239. case KeyEvent.KEYCODE_ESCAPE:
  240. // 返回键
  241. mView.loadJsMehtod("boxEventHandler('key_up','KEY_BACK')");
  242. // mJsInterfaces.closeApp();
  243. return true;
  244. case KeyEvent.KEYCODE_DPAD_UP:
  245. // 上
  246. mView.loadJsMehtod("boxEventHandler('key_up','KEY_UP')");
  247. break;
  248. case KeyEvent.KEYCODE_DPAD_RIGHT:
  249. // 右
  250. mView.loadJsMehtod("boxEventHandler('key_up','KEY_RIGHT')");
  251. break;
  252. case KeyEvent.KEYCODE_DPAD_DOWN:
  253. // 下
  254. mView.loadJsMehtod("boxEventHandler('key_up','KEY_DOWN')");
  255. break;
  256. case KeyEvent.KEYCODE_DPAD_LEFT:
  257. // 左
  258. mView.loadJsMehtod("boxEventHandler('key_up','KEY_LEFT')");
  259. break;
  260. }
  261. return false;
  262. }
  263. @Override
  264. public void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
  265. switch (requestCode) {
  266. case EfunboxPayInterfaces.START_PAY_DB:
  267. if (resultCode == Activity.RESULT_OK) {
  268. Bundle bundle = data.getExtras();
  269. int back = bundle.getInt("back");
  270. //back为返回值
  271. String Out_trade_no = bundle.getString("Out_trade_no");
  272. // Out_trade_no为订单号
  273. } else if (requestCode == Activity.RESULT_CANCELED) {
  274. }
  275. break;
  276. case EfunboxPayInterfaces.START_PAY_HUANWANG:
  277. break;
  278. case EfunboxPayInterfaces.START_PAY_SKYWORTH:
  279. // ToastUtil.showToast("START_PAY_SKYWORTH");
  280. break;
  281. case EfunboxPayInterfaces.START_PAY_XIAOMI:
  282. // ToastUtil.showToast("START_PAY_XIAOMI");
  283. break;
  284. }
  285. mView.acPostDelayed(new Runnable() {
  286. @Override
  287. public void run() {
  288. mView.setActivityPay(false);
  289. }
  290. }, 1000);
  291. }
  292. @Override
  293. public void onDisConnNetWork() {
  294. // ToastUtil.showToast("断网了。。");
  295. mView.stopWebView();
  296. showDisConnNeWorkWindow();
  297. }
  298. @Override
  299. public void onConnNetWork() {
  300. Logger.e("onConnNetWork");
  301. // if (mErrorViewDialog != null) {
  302. // mErrorViewDialog.dismiss();
  303. // mView.resumeWebView();
  304. // }
  305. }
  306. void showDisConnNeWorkWindow() {
  307. if (mErrorView == null) {
  308. mErrorViewDialog = new Dialog(mView.getActivity());
  309. try {
  310. int dividerID = mView.getActivity().getResources().getIdentifier("android:id/titleDivider", null, null);
  311. View divider = mErrorViewDialog.findViewById(dividerID);
  312. divider.setBackgroundColor(Color.TRANSPARENT);
  313. } catch (Exception e) {
  314. //上面的代码,是用来去除Holo主题的蓝色线条
  315. e.printStackTrace();
  316. }
  317. mErrorView = new ErrorView(mView);
  318. mErrorView.setViewBgColor(Color.TRANSPARENT);
  319. mErrorView.setBtnClickListener(new ErrorView.BtnClickListener() {
  320. @Override
  321. public void clickRelase() {
  322. //重新加载
  323. if (ContextUtil.getNetWorkState()) {
  324. mView.destroyWeb();
  325. mErrorViewDialog.dismiss();
  326. mView.resumeWebView();
  327. openWeb(mView.getActivity().getIntent());
  328. } else {
  329. ToastUtil.showToast("请检查网络连接状况");
  330. }
  331. }
  332. @Override
  333. public void clickExit() {
  334. //退出
  335. mErrorViewDialog.dismiss();
  336. mView.getActivity().finish();
  337. EApplication.clearActivity();
  338. }
  339. });
  340. mErrorViewDialog.setCancelable(false);
  341. mErrorViewDialog.setContentView(mErrorView);
  342. Window dialogWindow = mErrorViewDialog.getWindow();
  343. dialogWindow.setGravity(Gravity.CENTER);
  344. dialogWindow.getDecorView().setPadding(0, 0, 0, 0);
  345. dialogWindow.getDecorView().setBackgroundColor(Color.TRANSPARENT);
  346. WindowManager m = mView.getActivity().getWindowManager();
  347. Display d = m.getDefaultDisplay(); // 获取屏幕宽、高用
  348. WindowManager.LayoutParams p = dialogWindow.getAttributes(); // 获取对话框当前的参数值
  349. p.height = (int) (d.getHeight() * 1);
  350. p.width = WindowManager.LayoutParams.MATCH_PARENT;
  351. p.horizontalMargin = 0;
  352. dialogWindow.setAttributes(p);
  353. }
  354. if (!mErrorViewDialog.isShowing()) {
  355. mErrorViewDialog.show();
  356. }
  357. }
  358. public static Handler mPersenterHandler = new Handler(new Handler.Callback() {
  359. @Override
  360. public boolean handleMessage(Message msg) {
  361. switch (msg.what) {
  362. case WECHAT_LOGIN:
  363. // Logger.e("微信用户信息:" + msg.obj.toString());
  364. mView.loadJsMehtod("WeChatLoginSuccess('" + msg.obj.toString() + "')");
  365. break;
  366. case PAY_RESULT:
  367. mView.loadJsMehtod("commonPayResult(" + msg.obj.toString() + ")");
  368. Intent intent_restart = new Intent(ContextUtil.CLOSE_ACTIVITY_PAY);
  369. mView.getActivity().sendBroadcast(intent_restart);
  370. break;
  371. }
  372. return false;
  373. }
  374. });
  375. }
  376. interface MainIPersenter extends BasePersenter {
  377. void initWebView(WebView webview);
  378. JsInterfaces getJsInterfaces();
  379. EfunboxPayInterfaces getPayInterfaces();
  380. void openWeb(Intent intent);
  381. boolean onKeyDown(int keycode, KeyEvent event);
  382. boolean onKeyUp(int keycode, KeyEvent event);
  383. void onActivityResult(int requestCode, int resultCode, @Nullable Intent data);
  384. }