Commit a6c2e714ba8289213571c4c7de289c7424c5d864

Authored by 简柏林
1 parent 8705e211

代码提交

Showing 28 changed files with 1302 additions and 226 deletions
... ... @@ -10,9 +10,9 @@
10 10 {
11 11 "type": "SINGLE",
12 12 "filters": [],
13   - "versionCode": 204,
14   - "versionName": "2.0.4",
15   - "outputFile": "StudyMachine_v2.0.4_release_0901.apk"
  13 + "versionCode": 205,
  14 + "versionName": "2.0.5",
  15 + "outputFile": "StudyMachine_v2.0.5_release_0908.apk"
16 16 }
17 17 ]
18 18 }
\ No newline at end of file
... ...
... ... @@ -10,6 +10,7 @@
10 10
11 11 <!-- 外部存储 -->
12 12 <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
  13 + <uses-permission android:name="android.permission.READ_PHONE_STATE" />
13 14 <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
14 15
15 16 <!-- 拍照权限 -->
... ... @@ -146,6 +147,12 @@
146 147 android:launchMode="singleTask"
147 148 android:screenOrientation="landscape"
148 149 android:windowSoftInputMode="adjustPan" />
  150 + <!-- 首页 -->
  151 + <activity
  152 + android:name="com.studymachine.www.ui.activity.SwitchInfoActivity"
  153 + android:launchMode="singleTask"
  154 + android:screenOrientation="landscape"
  155 + android:windowSoftInputMode="adjustPan" />
149 156
150 157 <!-- 学情档案详情 -->
151 158 <activity
... ...
  1 +package com.studymachine.www.action;
  2 +
  3 +public interface PresentationAction {
  4 +
  5 + void openAppPresentation();
  6 +}
... ...
1 1 package com.studymachine.www.app;
2 2
  3 +import android.content.Context;
3 4 import android.content.Intent;
  5 +import android.hardware.display.DisplayManager;
  6 +import android.hardware.usb.UsbDevice;
  7 +import android.os.Build;
4 8 import android.os.Bundle;
  9 +import android.view.Display;
5 10 import android.view.View;
6 11 import android.view.WindowManager;
  12 +import android.widget.Button;
  13 +import android.widget.ImageView;
7 14
8 15 import androidx.annotation.NonNull;
9 16 import androidx.annotation.Nullable;
10 17 import androidx.annotation.StringRes;
  18 +import androidx.lifecycle.MutableLiveData;
11 19
12 20 import com.gyf.immersionbar.BarHide;
13 21 import com.gyf.immersionbar.ImmersionBar;
14 22 import com.hjq.bar.TitleBar;
15 23 import com.hjq.base.BaseActivity;
16 24 import com.hjq.base.BaseDialog;
  25 +import com.rokid.axr.phone.glassdevice.RKGlassDevice;
  26 +import com.rokid.axr.phone.glassdevice.callback.OnGlassDeviceConnectListener;
  27 +import com.rokid.axr.phone.glassdevice.hw.GlassInfo;
17 28 import com.studymachine.www.R;
  29 +import com.studymachine.www.action.PresentationAction;
18 30 import com.studymachine.www.action.TitleBarAction;
19 31 import com.studymachine.www.action.ToastAction;
20 32 import com.studymachine.www.http.model.HttpData;
... ... @@ -23,6 +35,7 @@ import com.studymachine.www.other.Tool;
23 35 import com.studymachine.www.ui.activity.HomeActivity;
24 36 import com.studymachine.www.ui.dialog.WaitDialog;
25 37 import com.hjq.http.listener.OnHttpListener;
  38 +import com.studymachine.www.ui.presentation.WebPresentation;
26 39
27 40 import org.greenrobot.eventbus.EventBus;
28 41
... ... @@ -33,7 +46,7 @@ import okhttp3.Call;
33 46 * desc : Activity 业务基类
34 47 */
35 48 public abstract class AppActivity extends BaseActivity
36   - implements ToastAction, TitleBarAction, OnHttpListener<Object> {
  49 + implements ToastAction, TitleBarAction, OnHttpListener<Object>, PresentationAction {
37 50
38 51 /**
39 52 * 标题栏对象
... ... @@ -48,11 +61,21 @@ public abstract class AppActivity extends BaseActivity
48 61 * 加载对话框
49 62 */
50 63 private BaseDialog mDialog;
  64 + public Button mControlBack;
  65 + public Button mControlChange;
  66 + public Button mControlMode;
  67 + public ImageView mControlLine;
51 68 /**
52 69 * 对话框数量
53 70 */
54 71 private int mDialogCount;
55 72
  73 + public GlassInfo deviceInfo = RKGlassDevice.getInstance().getGlassInfo();;
  74 +
  75 + MutableLiveData<Boolean> connectStatus = new MutableLiveData();
  76 +
  77 + public int mode = 0;
  78 +
56 79 /**
57 80 * 当前加载对话框是否在显示中
58 81 */
... ... @@ -84,6 +107,10 @@ public abstract class AppActivity extends BaseActivity
84 107 }, 300);
85 108 }
86 109
  110 + @Override
  111 + public void openAppPresentation() {
  112 + }
  113 +
87 114 /**
88 115 * 隐藏加载对话框
89 116 */
... ... @@ -105,8 +132,28 @@ public abstract class AppActivity extends BaseActivity
105 132
106 133 @Override
107 134 protected void initLayout() {
108   - super.initLayout();
  135 + if(!RKGlassDevice.getInstance().requestUSBDevicePermission()){
  136 + toast("请到系统设置添加悬浮框权限");
  137 + finish();
  138 + }
  139 + RKGlassDevice.getInstance().init(new OnGlassDeviceConnectListener() {
  140 + @Override
  141 + public void onGlassDeviceConnected(UsbDevice usbDevice) {
  142 +// //Glass 设备连接成功
  143 +// addControllerView();
  144 + connectStatus.setValue(true);
  145 + openAppPresentation();
  146 + }
109 147
  148 + @Override
  149 + public void onGlassDeviceDisconnected() {
  150 + connectStatus.setValue(false);
  151 +// mControllerBid.setVisibility(View.GONE);
  152 + }
  153 + });
  154 +
  155 + deviceInfo = RKGlassDevice.getInstance().getGlassInfo();
  156 + super.initLayout();
110 157 if (getTitleBar() != null) {
111 158 getTitleBar().setOnTitleBarListener(this);
112 159 }
... ...
... ... @@ -160,6 +160,7 @@ public final class AppApplication extends Application {
160 160
161 161 @Override
162 162 public void onGlassDeviceDisconnected() {
  163 + ActivityManager.getInstance().finishAllActivities();
163 164 //Glass 设备断开连接
164 165 }
165 166 });
... ...
... ... @@ -5,6 +5,7 @@ import android.content.Context;
5 5 import android.graphics.Rect;
6 6 import android.graphics.drawable.Drawable;
7 7 import android.os.Bundle;
  8 +import android.os.Handler;
8 9 import android.os.SystemClock;
9 10 import android.util.DisplayMetrics;
10 11 import android.view.Display;
... ... @@ -37,9 +38,12 @@ public abstract class AppPresentation extends Presentation implements TitleBarAc
37 38 private FrameLayout mControllerFrame;
38 39 private ControllerView controllerView;
39 40 private FrameLayout mControllerBid;
40   - private ImageView imageView;
  41 + private ImageView mControllerPoint;
  42 + private ImageView mControllerImage;
41 43 private StatusLayout mStatusLayout;
42 44 private ImageView mIvBack, mImgView;
  45 + public int mode = 1;
  46 +
43 47 public AppPresentation(Context outerContext, Display display) {
44 48 super(outerContext, display);
45 49 }
... ... @@ -48,29 +52,54 @@ public abstract class AppPresentation extends Presentation implements TitleBarAc
48 52 super(outerContext, display, theme);
49 53 }
50 54
  55 + public void setMode(int mode) {
  56 + this.mode = mode;
  57 + if (mode == 1) {
  58 + mControllerImage.setVisibility(View.VISIBLE);
  59 + mControllerPoint.setVisibility(View.GONE);
  60 + } else {
  61 + mControllerImage.setVisibility(View.GONE);
  62 + mControllerPoint.setVisibility(View.VISIBLE);
  63 + }
  64 + }
  65 +
51 66 @Override
52 67 protected void onCreate(Bundle savedInstanceState) {
53 68 super.onCreate(savedInstanceState);
54 69 setContentView(getLayout());
55 70 addControllerView();
56 71 initData();
57   -
58   - mIvBack.setOnClickListener(new View.OnClickListener() {
59   - @Override
60   - public void onClick(View v) {
61   - dismiss();
62   - getOwnerActivity().finish();
63   - }
64   - });
  72 + mIvBack = findViewById(R.id.iv_back);
  73 + if (mIvBack != null) {
  74 + mIvBack.setOnClickListener(new View.OnClickListener() {
  75 + @Override
  76 + public void onClick(View v) {
  77 + getOwnerActivity().finish();
  78 + dismiss();
  79 + }
  80 + });
  81 + }
65 82 EventBusManager.register(this);
66 83 }
67 84
  85 + public void changeMode() {
  86 + if (mode == 1){
  87 + setMode(0);
  88 + } else {
  89 + setMode(1);
  90 + }
  91 + }
  92 +
68 93 private void addControllerView() {
69 94 controllerView = new ControllerView(getContext(), null);
70 95 ViewGroup root = (ViewGroup) getWindow().getDecorView();
71 96 root.addView(controllerView);
72 97 controllerView.bringToFront();
  98 + mControllerBid = findViewById(R.id.controller_bid);
  99 + mControllerImage = findViewById(R.id.controller_image);
  100 + mControllerPoint = findViewById(R.id.controller_point);
73 101 }
  102 +
74 103 public abstract int getLayout();
75 104
76 105 public abstract void initData();
... ... @@ -259,52 +288,71 @@ public abstract class AppPresentation extends Presentation implements TitleBarAc
259 288 float distanceY = event.getRawY() - lastY;
260 289 lastX = event.getRawX();
261 290 lastY = event.getRawY();
262   - // 得到屏幕的宽
263   - displayMetrics = getResources().getDisplayMetrics();
264   - screenWidth = displayMetrics.widthPixels;
265   - // 得到标题栏和状态栏的高度
266   - Rect rect = new Rect();
267   - Window window = getWindow();
268   - imageView.getWindowVisibleDisplayFrame(rect);
269   - int statusBarHeight = rect.top;
270   - int contentViewTop = window.findViewById(Window.ID_ANDROID_CONTENT).getTop();
271   - int titleBarHeight = contentViewTop - statusBarHeight;
272   - // 得到屏幕的高
273   - screenHeight = displayMetrics.heightPixels - (statusBarHeight + titleBarHeight);
274   - // 更新界面
275   - left = (int) (imageView.getLeft() + distanceX);
276   - top = (int) (imageView.getTop() + distanceY);
277   - right = (int) (imageView.getRight() + distanceX);
278   - bottom = (int) (imageView.getBottom() + distanceY);
279   - boolean move = false;
280   -
281   - //处理拖出屏幕的情况
282   - if (left < 0) {
283   - move = true;
284   - scollX = left;
285   - left = 0;
286   - right = imageView.getWidth();
287   - }
288   - if (right > screenWidth) {
289   - move = true;
290   - scollX = right - screenWidth;
291   - right = screenWidth;
292   - left = screenWidth - imageView.getWidth();
293   - }
294   - if (top < 0) {
295   - move = true;
296   - scollY = top;
297   - top = 0;
298   - bottom = imageView.getHeight();
299   - }
300   - if (bottom > screenHeight) {
301   - move = true;
302   - scollY = bottom - screenHeight;
303   - bottom = screenHeight;
304   - top = screenHeight - imageView.getHeight();
  291 + if (mode == 1) {
  292 + // 得到屏幕的宽
  293 + displayMetrics = getResources().getDisplayMetrics();
  294 + screenWidth = displayMetrics.widthPixels;
  295 + // 得到标题栏和状态栏的高度
  296 + Rect rect = new Rect();
  297 + Window window = getWindow();
  298 + mControllerImage.getWindowVisibleDisplayFrame(rect);
  299 + int statusBarHeight = rect.top;
  300 + int contentViewTop = window.findViewById(Window.ID_ANDROID_CONTENT).getTop();
  301 + int titleBarHeight = contentViewTop - statusBarHeight;
  302 + // 得到屏幕的高
  303 + screenHeight = displayMetrics.heightPixels - (statusBarHeight + titleBarHeight);
  304 + // 更新界面
  305 + left = (int) (mControllerImage.getLeft() + distanceX);
  306 + top = (int) (mControllerImage.getTop() + distanceY);
  307 + right = (int) (mControllerImage.getRight() + distanceX);
  308 + bottom = (int) (mControllerImage.getBottom() + distanceY);
  309 + boolean move = false;
  310 +
  311 + //处理拖出屏幕的情况
  312 + if (left < 0) {
  313 + move = true;
  314 + scollX = left;
  315 + left = 0;
  316 + right = mControllerImage.getWidth();
  317 + }
  318 + if (right > screenWidth) {
  319 + move = true;
  320 + scollX = right - screenWidth;
  321 + right = screenWidth;
  322 + left = screenWidth - mControllerImage.getWidth();
  323 + }
  324 + if (top < 0) {
  325 + move = true;
  326 + scollY = top;
  327 + top = 0;
  328 + bottom = mControllerImage.getHeight();
  329 + }
  330 + if (bottom > screenHeight) {
  331 + move = true;
  332 + scollY = bottom - screenHeight;
  333 + bottom = screenHeight;
  334 + top = screenHeight - mControllerImage.getHeight();
  335 + }
  336 + //显示图片
  337 + mControllerImage.layout(left, top, right, bottom);
  338 + if (move) {
  339 + View view = getViewAtActivity(x, y);
  340 + MotionEvent motionEvent = MotionEvent.obtain(event.getDownTime(), event.getEventTime(), MotionEvent.ACTION_DOWN, 0, 0, 0);
  341 + view.dispatchTouchEvent(motionEvent);
  342 + MotionEvent moveEvent = MotionEvent.obtain(event.getDownTime(), event.getEventTime(), MotionEvent.ACTION_MOVE, 0 - scollX, 0 - scollY, 0);
  343 + view.dispatchTouchEvent(moveEvent);
  344 + MotionEvent upEvent = MotionEvent.obtain(event.getDownTime(), event.getEventTime(), MotionEvent.ACTION_UP, 0, 0, 0);
  345 + view.dispatchTouchEvent(upEvent);
  346 + }
  347 + } else {
  348 + View view = getViewAtActivity(x, y);
  349 + MotionEvent motionEvent = MotionEvent.obtain(event.getDownTime(), event.getEventTime(), MotionEvent.ACTION_DOWN, 0, 0, 0);
  350 + view.dispatchTouchEvent(motionEvent);
  351 + MotionEvent moveEvent = MotionEvent.obtain(event.getDownTime(), event.getEventTime(), MotionEvent.ACTION_MOVE, 0 - distanceX, 0 - distanceY, 0);
  352 + view.dispatchTouchEvent(moveEvent);
  353 + MotionEvent upEvent = MotionEvent.obtain(event.getDownTime(), event.getEventTime(), MotionEvent.ACTION_UP, 0, 0, 0);
  354 + view.dispatchTouchEvent(upEvent);
305 355 }
306   - //显示图片
307   - imageView.layout(left, top, right, bottom);
308 356 break;
309 357 //抬起
310 358 case MotionEvent.ACTION_UP:
... ... @@ -312,16 +360,33 @@ public abstract class AppPresentation extends Presentation implements TitleBarAc
312 360 if (endTime - startTime < 200) {
313 361 endTime = 0;
314 362 startTime = 0;
315   - x = imageView.getX();
316   - y = imageView.getY();
317   - View view = getViewAtActivity(x, y);
318   - if (null != view) {
319   - view.post(new Runnable() {
320   - @Override
321   - public void run() {
322   - simulateTouchEvent(view, x, y);
323   - }
324   - });
  363 + if (mode == 1) {
  364 + x = mControllerImage.getX();
  365 + y = mControllerImage.getY();
  366 + View view = getViewAtActivity(x, y);
  367 + if (null != view) {
  368 + view.post(new Runnable() {
  369 + @Override
  370 + public void run() {
  371 + simulateTouchEvent(view, x, y);
  372 + }
  373 + });
  374 + }
  375 + } else {
  376 + if (mControllerPoint == null) {
  377 + break;
  378 + }
  379 + x = mControllerPoint.getX();
  380 + y = mControllerPoint.getY();
  381 + View view = getViewAtActivity(x, y);
  382 + if (null != view) {
  383 + view.post(new Runnable() {
  384 + @Override
  385 + public void run() {
  386 + simulateTouchEvent(view, x, y);
  387 + }
  388 + });
  389 + }
325 390 }
326 391 }
327 392
... ...
  1 +package com.studymachine.www.app;
  2 +
  3 +import android.app.Activity;
  4 +import android.os.Handler;
  5 +import android.os.Message;
  6 +import android.view.View;
  7 +import android.widget.ImageView;
  8 +
  9 +import androidx.annotation.NonNull;
  10 +
  11 +import com.studymachine.www.R;
  12 +import com.studymachine.www.widget.X5WebView;
  13 +import com.tencent.smtt.sdk.ValueCallback;
  14 +
  15 +import java.lang.ref.WeakReference;
  16 +import java.util.logging.LogRecord;
  17 +
  18 +public class ModeHandler extends Handler {
  19 +
  20 + private AppPresentation presentation;
  21 + private int mode;
  22 +
  23 + public ModeHandler(AppPresentation presentation) {
  24 + this.presentation = presentation;
  25 + }
  26 +
  27 + @Override
  28 + public void handleMessage(@NonNull Message msg) {
  29 + presentation.setMode(msg.what);
  30 + super.handleMessage(msg);
  31 + }
  32 +}
... ...
... ... @@ -9,13 +9,11 @@ public final class LoginApi implements IRequestApi {
9 9
10 10 @Override
11 11 public String getApi() {
12   - return "auth/login";
  12 + return "auth/glasses/login";
13 13 }
14 14
15 15 /** 手机号 */
16 16 private String mobile;
17   - /** 登录密码 */
18   - private String password;
19 17 /** 场景 */
20 18 private String scene="password_login";
21 19
... ... @@ -24,11 +22,6 @@ public final class LoginApi implements IRequestApi {
24 22 return this;
25 23 }
26 24
27   - public LoginApi setPassword(String password) {
28   - this.password = password;
29   - return this;
30   - }
31   -
32 25 public final static class Bean {
33 26
34 27 private String token;
... ...
... ... @@ -9,7 +9,7 @@ public final class UpdateVersionApi implements IRequestApi {
9 9
10 10 @Override
11 11 public String getApi() {
12   - return "common/public/version";
  12 + return "common/public/version/glasses";
13 13 }
14 14
15 15 public final static class Bean {
... ...
... ... @@ -21,6 +21,8 @@ import com.hjq.http.listener.OnDownloadListener;
21 21 import com.hjq.http.model.HttpMethod;
22 22 import com.hjq.toast.ToastUtils;
23 23 import com.studymachine.www.BuildConfig;
  24 +import com.studymachine.www.app.AppPresentation;
  25 +import com.studymachine.www.app.ModeHandler;
24 26 import com.studymachine.www.event.SwfEvent;
25 27 import com.studymachine.www.http.glide.GlideApp;
26 28 import com.studymachine.www.manager.GlobalParameterManager;
... ... @@ -29,6 +31,7 @@ import com.studymachine.www.other.AppConfig;
29 31 import com.studymachine.www.other.Tool;
30 32 import com.studymachine.www.other.WebUrlConfig;
31 33 import com.studymachine.www.ui.activity.AiDetailActivity;
  34 +import com.studymachine.www.ui.activity.AiListActivity;
32 35 import com.studymachine.www.ui.activity.BrowserActivity;
33 36 import com.studymachine.www.ui.activity.SwfActivity;
34 37 import com.studymachine.www.ui.dialog.WaitDialog;
... ... @@ -50,6 +53,7 @@ public class MainJavaScriptInterface {
50 53 private X5WebView mX5WebView;
51 54 private BaseDialog mDialog;
52 55 private String singPageData;
  56 + private ModeHandler handler;
53 57 private String time;
54 58 private boolean isSwfPlay = false;
55 59 private int mode;
... ... @@ -59,6 +63,12 @@ public class MainJavaScriptInterface {
59 63 mX5WebView = x5WebView;
60 64 }
61 65
  66 + public MainJavaScriptInterface(Activity context, X5WebView x5WebView, ModeHandler handler) {
  67 + mContext = context;
  68 + mX5WebView = x5WebView;
  69 + this.handler = handler;
  70 + }
  71 +
62 72 /**
63 73 * 记录ai的开始时间
64 74 *
... ... @@ -204,7 +214,7 @@ public class MainJavaScriptInterface {
204 214 */
205 215 @JavascriptInterface
206 216 public void modeChange(int mode) {
207   - this.mode = mode;
  217 + handler.sendEmptyMessage(mode);
208 218 }
209 219
210 220 /**
... ... @@ -222,6 +232,11 @@ public class MainJavaScriptInterface {
222 232 */
223 233 @JavascriptInterface
224 234 public void gotoApp(String packageName) {
  235 + if (packageName.equals("studyMachine")) {
  236 + AiListActivity.start(mContext);
  237 + return;
  238 + }
  239 +
225 240 boolean hasApp = Tool.isApkInstalled(mContext, packageName);
226 241 if (!hasApp) {
227 242 ToastUtils.show("app不存在");
... ...
... ... @@ -29,6 +29,7 @@ import com.studymachine.www.action.StatusAction;
29 29 import com.studymachine.www.aop.CheckNet;
30 30 import com.studymachine.www.aop.Log;
31 31 import com.studymachine.www.app.AppActivity;
  32 +import com.studymachine.www.app.ModeHandler;
32 33 import com.studymachine.www.http.glide.GlideApp;
33 34 import com.studymachine.www.js.MainJavaScriptInterface;
34 35 import com.studymachine.www.domain.AiDTO;
... ... @@ -41,6 +42,7 @@ import com.studymachine.www.ui.presentation.WebPresentation;
41 42 import com.studymachine.www.ui.dialog.ConfirmDialog;
42 43 import com.studymachine.www.widget.StatusLayout;
43 44 import com.studymachine.www.widget.X5WebView;
  45 +import com.tencent.smtt.sdk.ValueCallback;
44 46 import com.tencent.smtt.sdk.WebChromeClient;
45 47 import com.tencent.smtt.sdk.WebView;
46 48 import com.tencent.smtt.sdk.WebViewClient;
... ... @@ -104,8 +106,40 @@ public final class AiDetailActivity extends AppActivity
104 106 protected void initView() {
105 107 RKGlassDevice.getInstance().requestUSBDevicePermission();
106 108 if (deviceInfo != null && deviceInfo.getSn() != null) {
107   - mPointId = getString(INTENT_KEY_IN_POINT_ID);
108   - getPresentationDetail();
  109 + mControlBack = findViewById(R.id.control_back);
  110 + mControlChange = findViewById(R.id.control_change);
  111 + mControlMode = findViewById(R.id.control_mode);
  112 + mControlBack.setVisibility(View.VISIBLE);
  113 + mControlChange.setVisibility(View.VISIBLE);
  114 + mControlMode.setVisibility(View.VISIBLE);
  115 + mControlLine = findViewById(R.id.control_line);
  116 + mControlBack.setOnClickListener(new View.OnClickListener() {
  117 + @Override
  118 + public void onClick(View v) {
  119 + finish();
  120 + if (presentation != null) {
  121 + presentation.dismiss();
  122 + }
  123 + }
  124 + });
  125 + mControlChange.setOnClickListener(new View.OnClickListener() {
  126 + @Override
  127 + public void onClick(View v) {
  128 + SwitchInfoActivity.start(getContext());
  129 + finish();
  130 + if (presentation != null) {
  131 + presentation.dismiss();
  132 + }
  133 + }
  134 + });
  135 + mControlMode.setOnClickListener(new View.OnClickListener() {
  136 + @Override
  137 + public void onClick(View v) {
  138 + if (presentation != null) {
  139 + presentation.changeMode();
  140 + }
  141 + }
  142 + });
109 143 } else {
110 144 mImgView = findViewById(R.id.loadview);
111 145
... ... @@ -140,6 +174,10 @@ public final class AiDetailActivity extends AppActivity
140 174
141 175 @Override
142 176 public boolean dispatchTouchEvent(MotionEvent ev) {
  177 + float y = mControlLine.getY();
  178 + if (ev.getY() < y){
  179 + return super.dispatchTouchEvent(ev);
  180 + }
143 181 if (presentation != null) {
144 182 return presentation.onTouchEvent(ev);
145 183 }
... ... @@ -148,24 +186,8 @@ public final class AiDetailActivity extends AppActivity
148 186
149 187 private WebPresentation presentation;
150 188
151   - private void openAppPresentation() {
152   - if (null == presentation) {
153   - DisplayManager mDisplayManage = (DisplayManager) this.getSystemService(Context.DISPLAY_SERVICE);
154   - Display[] displayList = mDisplayManage.getDisplays();
155   - if (displayList.length > 1) {
156   - presentation = new WebPresentation(this, displayList[1],mPointId,mPointDetail);
157   - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {//8.0
158   - presentation.getWindow().setType(WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY);
159   - } else {
160   - presentation.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_OVERLAY);
161   - }
162   - }
163   - }
164   - presentation.setOwnerActivity(this);
165   - presentation.show();
166   - }
167   -
168   - private void getDetail() {
  189 + public void openAppPresentation() {
  190 + mPointId = getString(INTENT_KEY_IN_POINT_ID);
169 191 EasyHttp.get(this)
170 192 .api(new PointDetailApi()
171 193 .setPointId(mPointId)
... ... @@ -174,8 +196,21 @@ public final class AiDetailActivity extends AppActivity
174 196 @Override
175 197 public void onSucceed(HttpData<PointDetailApi.Bean<AiDTO>> result) {
176 198 mPointDetail = result.getData();
177   - mX5WebView.loadUrl(result.getData().isFinish() ? mPointDetail.getScene().getArbitrarilyUrl() : mPointDetail.getScene().getSequenceUrl());
178   -
  199 + if (null == presentation) {
  200 + DisplayManager mDisplayManage = (DisplayManager) getContext().getSystemService(Context.DISPLAY_SERVICE);
  201 + Display[] displayList = mDisplayManage.getDisplays();
  202 + if (displayList.length > 1) {
  203 + presentation = new WebPresentation(getContext(), displayList[1], mPointId, mPointDetail);
  204 + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {//8.0
  205 + presentation.getWindow().setType(WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY);
  206 + } else {
  207 + presentation.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_OVERLAY);
  208 + }
  209 + }
  210 + }
  211 + presentation.setOwnerActivity(getActivity());
  212 + presentation.show();
  213 + presentation.setMode(0);
179 214 // mX5WebView.loadUrl("http://192.168.1.26:8086/pages/ai/ai?aiIndex=0");
180 215 }
181 216
... ... @@ -187,7 +222,7 @@ public final class AiDetailActivity extends AppActivity
187 222 });
188 223 }
189 224
190   - private void getPresentationDetail() {
  225 + private void getDetail() {
191 226 EasyHttp.get(this)
192 227 .api(new PointDetailApi()
193 228 .setPointId(mPointId)
... ... @@ -196,7 +231,8 @@ public final class AiDetailActivity extends AppActivity
196 231 @Override
197 232 public void onSucceed(HttpData<PointDetailApi.Bean<AiDTO>> result) {
198 233 mPointDetail = result.getData();
199   - openAppPresentation();
  234 + mX5WebView.loadUrl(result.getData().isFinish() ? mPointDetail.getScene().getArbitrarilyUrl() : mPointDetail.getScene().getSequenceUrl());
  235 +
200 236 // mX5WebView.loadUrl("http://192.168.1.26:8086/pages/ai/ai?aiIndex=0");
201 237 }
202 238
... ... @@ -278,7 +314,7 @@ public final class AiDetailActivity extends AppActivity
278 314 @Override
279 315 public boolean onKeyDown(int keyCode, KeyEvent event) {
280 316 if (keyCode == KeyEvent.KEYCODE_BACK) {
281   - if (mX5WebView == null && presentation != null){
  317 + if (mX5WebView == null && presentation != null) {
282 318 presentation.dismiss();
283 319 return super.onKeyDown(keyCode, event);
284 320 }
... ...
... ... @@ -2,9 +2,14 @@ package com.studymachine.www.ui.activity;
2 2
3 3 import android.content.Context;
4 4 import android.content.Intent;
  5 +import android.hardware.display.DisplayManager;
5 6 import android.media.MediaPlayer;
  7 +import android.os.Build;
6 8 import android.util.Log;
  9 +import android.view.Display;
  10 +import android.view.MotionEvent;
7 11 import android.view.View;
  12 +import android.view.WindowManager;
8 13 import android.widget.ImageView;
9 14
10 15 import androidx.annotation.Nullable;
... ... @@ -31,6 +36,8 @@ import com.studymachine.www.manager.GlobalParameterManager;
31 36 import com.studymachine.www.other.PermissionCallback;
32 37 import com.studymachine.www.other.Tool;
33 38 import com.studymachine.www.ui.adapter.AiListAdapter;
  39 +import com.studymachine.www.ui.presentation.AiListPresentation;
  40 +import com.studymachine.www.ui.presentation.BrowserPresentation;
34 41
35 42 import java.util.ArrayList;
36 43 import java.util.List;
... ... @@ -47,11 +54,16 @@ public final class AiListActivity extends AppActivity implements BaseAdapter.OnI
47 54 private List<GetAiListApi.Bean> mDataList = new ArrayList<>();
48 55 private AppCompatImageView mIvPerson;
49 56 private MediaPlayer mMediaPlayer;
  57 + private AiListPresentation presentation;
50 58
51 59
52 60 @Override
53 61 protected int getLayoutId() {
54   - return R.layout.ai_list_activity;
  62 + if (deviceInfo != null && deviceInfo.getSn() != null) {
  63 + return R.layout.control_cursor;
  64 + } else {
  65 + return R.layout.ai_list_activity;
  66 + }
55 67 }
56 68
57 69 public static void start(Context context) {
... ... @@ -61,6 +73,43 @@ public final class AiListActivity extends AppActivity implements BaseAdapter.OnI
61 73
62 74 @Override
63 75 protected void initView() {
  76 + if (deviceInfo != null && deviceInfo.getSn() != null) {
  77 + mControlBack = findViewById(R.id.control_back);
  78 + mControlChange = findViewById(R.id.control_change);
  79 + mControlMode = findViewById(R.id.control_mode);
  80 + mControlBack.setVisibility(View.VISIBLE);
  81 + mControlChange.setVisibility(View.GONE);
  82 + mControlMode.setVisibility(View.GONE);
  83 + mControlLine = findViewById(R.id.control_line);
  84 + mControlBack.setOnClickListener(new View.OnClickListener() {
  85 + @Override
  86 + public void onClick(View v) {
  87 + finish();
  88 + if (presentation != null) {
  89 + presentation.dismiss();
  90 + }
  91 + }
  92 + });
  93 + mControlChange.setOnClickListener(new View.OnClickListener() {
  94 + @Override
  95 + public void onClick(View v) {
  96 + SwitchInfoActivity.start(getContext());
  97 + finish();
  98 + if (presentation != null) {
  99 + presentation.dismiss();
  100 + }
  101 + }
  102 + });
  103 + mControlMode.setOnClickListener(new View.OnClickListener() {
  104 + @Override
  105 + public void onClick(View v) {
  106 + if (presentation != null) {
  107 + presentation.changeMode();
  108 + }
  109 + }
  110 + });
  111 + return;
  112 + }
64 113 mRecyclerView = findViewById(R.id.rv_list);
65 114 mIvPerson = findViewById(R.id.iv_person);
66 115
... ... @@ -87,16 +136,17 @@ public final class AiListActivity extends AppActivity implements BaseAdapter.OnI
87 136 public boolean onLoadFailed(@Nullable GlideException e, Object model, Target<GifDrawable> target, boolean isFirstResource) {
88 137 return false;
89 138 }
  139 +
90 140 @Override
91 141 public boolean onResourceReady(GifDrawable resource, Object model, Target<GifDrawable> target, DataSource dataSource, boolean isFirstResource) {
92 142 resource.setLoopCount(GifDrawable.LOOP_INTRINSIC); //设置次数
93 143 postDelayed(() -> {
94 144 mMediaPlayer = Tool.playMediaPlayer(getContext(), R.raw.vr);
95   - mMediaPlayer.setOnErrorListener((mp,what,extra)->{
  145 + mMediaPlayer.setOnErrorListener((mp, what, extra) -> {
96 146 Tool.closeMediaPlayer(mMediaPlayer);
97 147 return true;
98 148 });
99   - mMediaPlayer.setOnCompletionListener((mp)->{
  149 + mMediaPlayer.setOnCompletionListener((mp) -> {
100 150 Tool.closeMediaPlayer(mMediaPlayer);
101 151 });
102 152 }, 0);
... ... @@ -108,13 +158,49 @@ public final class AiListActivity extends AppActivity implements BaseAdapter.OnI
108 158 }
109 159
110 160 @Override
111   - protected void initData() {}
  161 + protected void initData() {
  162 + if (deviceInfo != null && deviceInfo.getSn() != null) {
  163 + return;
  164 + }
  165 + }
  166 +
  167 +
  168 + @Override
  169 + public boolean dispatchTouchEvent(MotionEvent ev) {
  170 + float y = mControlLine.getY();
  171 + if (ev.getY() < y){
  172 + return super.dispatchTouchEvent(ev);
  173 + }
  174 +
  175 + if (presentation != null) {
  176 + return presentation.onTouchEvent(ev);
  177 + }
  178 + return super.dispatchTouchEvent(ev);
  179 + }
  180 +
  181 +
  182 + public void openAppPresentation() {
  183 + if (null == presentation) {
  184 + DisplayManager mDisplayManage = (DisplayManager) this.getSystemService(Context.DISPLAY_SERVICE);
  185 + Display[] displayList = mDisplayManage.getDisplays();
  186 + if (displayList.length > 1) {
  187 + presentation = new AiListPresentation(this, displayList[1]);
  188 + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {//8.0
  189 + presentation.getWindow().setType(WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY);
  190 + } else {
  191 + presentation.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_OVERLAY);
  192 + }
  193 + }
  194 + }
  195 + presentation.setOwnerActivity(this);
  196 + presentation.show();
  197 + }
112 198
113 199 @Override
114 200 protected void onResume() {
115 201 super.onResume();
116   - getList();
117   - GlobalParameterManager.getInstance().getData();
  202 +// getList();
  203 +// GlobalParameterManager.getInstance().getData();
118 204 }
119 205
120 206 private void getList() {
... ... @@ -156,6 +242,6 @@ public final class AiListActivity extends AppActivity implements BaseAdapter.OnI
156 242 if (mMediaPlayer != null) {
157 243 Tool.closeMediaPlayer(mMediaPlayer);
158 244 }
159   -
  245 + presentation.dismiss();
160 246 }
161 247 }
\ No newline at end of file
... ...
  1 +package com.studymachine.www.ui.activity;
  2 +
  3 +public class AirHomeActivity {
  4 +}
... ...
... ... @@ -5,10 +5,15 @@ import android.content.Context;
5 5 import android.content.Intent;
6 6 import android.graphics.Bitmap;
7 7 import android.graphics.drawable.BitmapDrawable;
  8 +import android.hardware.display.DisplayManager;
  9 +import android.os.Build;
8 10 import android.os.Message;
9 11 import android.text.TextUtils;
  12 +import android.view.Display;
10 13 import android.view.KeyEvent;
  14 +import android.view.MotionEvent;
11 15 import android.view.View;
  16 +import android.view.WindowManager;
12 17 import android.widget.ImageView;
13 18 import android.widget.ProgressBar;
14 19
... ... @@ -20,15 +25,24 @@ import com.bumptech.glide.load.engine.GlideException;
20 25 import com.bumptech.glide.load.resource.gif.GifDrawable;
21 26 import com.bumptech.glide.request.RequestListener;
22 27 import com.bumptech.glide.request.target.Target;
  28 +import com.rokid.axr.phone.glassdevice.RKGlassDevice;
23 29 import com.studymachine.www.R;
24 30 import com.studymachine.www.action.StatusAction;
25 31 import com.studymachine.www.aop.CheckNet;
26 32 import com.studymachine.www.aop.Log;
27 33 import com.studymachine.www.app.AppActivity;
  34 +import com.studymachine.www.app.ModeHandler;
28 35 import com.studymachine.www.http.glide.GlideApp;
29 36 import com.studymachine.www.js.MainJavaScriptInterface;
  37 +import com.studymachine.www.manager.ActivityManager;
  38 +import com.studymachine.www.other.DoubleClickHelper;
  39 +import com.studymachine.www.other.Tool;
  40 +import com.studymachine.www.ui.presentation.BrowserPresentation;
  41 +import com.studymachine.www.ui.presentation.SplashPresentation;
30 42 import com.studymachine.www.widget.StatusLayout;
31 43 import com.studymachine.www.widget.X5WebView;
  44 +import com.tencent.smtt.export.external.interfaces.JsResult;
  45 +import com.tencent.smtt.sdk.ValueCallback;
32 46 import com.tencent.smtt.sdk.WebChromeClient;
33 47 import com.tencent.smtt.sdk.WebView;
34 48 import com.tencent.smtt.sdk.WebViewClient;
... ... @@ -36,13 +50,13 @@ import com.tencent.smtt.sdk.WebViewClient;
36 50 import timber.log.Timber;
37 51
38 52 /**
39   - * desc : 内部使用的浏览器界面注入了特殊js
  53 + * desc : 内部使用的浏览器界面注入了特殊js
40 54 */
41 55 public final class BrowserActivity extends AppActivity
42 56 implements StatusAction {
43 57
44 58 private static final String INTENT_KEY_IN_URL = "url";
45   -
  59 + private BrowserPresentation presentation;
46 60
47 61 @CheckNet
48 62 @Log
... ... @@ -65,16 +79,26 @@ public final class BrowserActivity extends AppActivity
65 79
66 80 @Override
67 81 protected int getLayoutId() {
68   - return R.layout.browser_activity;
  82 + deviceInfo = RKGlassDevice.getInstance().getGlassInfo();
  83 + if (deviceInfo != null && deviceInfo.getSn() != null) {
  84 + return R.layout.control_cursor;
  85 + } else {
  86 + return R.layout.browser_activity;
  87 + }
69 88 }
70 89
71 90 @Override
72 91 protected void initView() {
  92 + if (deviceInfo != null && deviceInfo.getSn() != null) {
  93 + Tool.updateVersion(BrowserActivity.this.getContext());
  94 + return;
  95 + }
  96 +
73 97 mStatusLayout = findViewById(R.id.hl_browser_hint);
74 98 mProgressBar = findViewById(R.id.pb_browser_progress);
75 99 mX5WebView = findViewById(R.id.wv_browser_view);
76   - mImgView=findViewById(R.id.loadview);
77   - mX5WebView.addJavascriptInterface(new MainJavaScriptInterface(getActivity(),mX5WebView),"studyMachine");
  100 + mImgView = findViewById(R.id.loadview);
  101 + mX5WebView.addJavascriptInterface(new MainJavaScriptInterface(getActivity(), mX5WebView), "studyMachine");
78 102
79 103 GlideApp.with(this)
80 104 .asGif()
... ... @@ -85,7 +109,42 @@ public final class BrowserActivity extends AppActivity
85 109
86 110 @Override
87 111 protected void initData() {
88   -
  112 + if (deviceInfo != null && deviceInfo.getSn() != null) {
  113 + mControlBack = findViewById(R.id.control_back);
  114 + mControlChange = findViewById(R.id.control_change);
  115 + mControlMode = findViewById(R.id.control_mode);
  116 + mControlBack.setVisibility(View.VISIBLE);
  117 + mControlChange.setVisibility(View.VISIBLE);
  118 + mControlMode.setVisibility(View.VISIBLE);
  119 + mControlLine = findViewById(R.id.control_line);
  120 + mControlBack.setOnClickListener(new View.OnClickListener() {
  121 + @Override
  122 + public void onClick(View v) {
  123 + finish();
  124 + if (presentation != null) {
  125 + presentation.dismiss();
  126 + }
  127 + }
  128 + });
  129 + mControlChange.setOnClickListener(new View.OnClickListener() {
  130 + @Override
  131 + public void onClick(View v) {
  132 + SwitchInfoActivity.start(getContext());
  133 + if (presentation != null) {
  134 + presentation.dismiss();
  135 + }
  136 + }
  137 + });
  138 + mControlMode.setOnClickListener(new View.OnClickListener() {
  139 + @Override
  140 + public void onClick(View v) {
  141 + if (presentation != null) {
  142 + presentation.changeMode();
  143 + }
  144 + }
  145 + });
  146 + return;
  147 + }
89 148 mX5WebView.setWebViewClient(new AppBrowserViewClient());
90 149 mX5WebView.setWebChromeClient(new AppBrowserChromeClient());
91 150 mX5WebView.loadUrl(getString(INTENT_KEY_IN_URL));
... ... @@ -103,6 +162,7 @@ public final class BrowserActivity extends AppActivity
103 162
104 163 @Override
105 164 public boolean onKeyDown(int keyCode, KeyEvent event) {
  165 + mX5WebView = presentation.getmX5WebView();
106 166 if (keyCode == KeyEvent.KEYCODE_BACK && mX5WebView.canGoBack()) {
107 167 // 后退网页并且拦截该事件
108 168 mX5WebView.goBack();
... ... @@ -111,6 +171,53 @@ public final class BrowserActivity extends AppActivity
111 171 return super.onKeyDown(keyCode, event);
112 172 }
113 173
  174 + @Override
  175 + public void onBackPressed() {
  176 + if (!DoubleClickHelper.isOnDoubleClick()) {
  177 + toast(R.string.home_exit_hint);
  178 + return;
  179 + }
  180 + // 移动到上一个任务栈,避免侧滑引起的不良反应
  181 + moveTaskToBack(false);
  182 + postDelayed(() -> {
  183 + // 进行内存优化,销毁掉所有的界面
  184 + ActivityManager.getInstance().finishAllActivities();
  185 + // 销毁进程(注意:调用此 API 可能导致当前 Activity onDestroy 方法无法正常回调)
  186 + // System.exit(0);
  187 + }, 300);
  188 + }
  189 +
  190 + @Override
  191 + public boolean dispatchTouchEvent(MotionEvent ev) {
  192 + float y = mControlLine.getY();
  193 + if (ev.getY() < y){
  194 + return super.dispatchTouchEvent(ev);
  195 + }
  196 + if (presentation != null) {
  197 + return presentation.onTouchEvent(ev);
  198 + }
  199 + return super.dispatchTouchEvent(ev);
  200 + }
  201 +
  202 +
  203 + public void openAppPresentation() {
  204 + if (null == presentation) {
  205 + DisplayManager mDisplayManage = (DisplayManager) this.getSystemService(Context.DISPLAY_SERVICE);
  206 + Display[] displayList = mDisplayManage.getDisplays();
  207 + if (displayList.length > 1) {
  208 + presentation = new BrowserPresentation(this, displayList[1], getString(INTENT_KEY_IN_URL));
  209 + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {//8.0
  210 + presentation.getWindow().setType(WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY);
  211 + } else {
  212 + presentation.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_OVERLAY);
  213 + }
  214 + }
  215 + }
  216 + presentation.setOwnerActivity(this);
  217 + presentation.show();
  218 + presentation.setMode(0);
  219 + }
  220 +
114 221 /**
115 222 * 重新加载当前页
116 223 */
... ... @@ -123,6 +230,7 @@ public final class BrowserActivity extends AppActivity
123 230 @Override
124 231 protected void onDestroy() {
125 232 super.onDestroy();
  233 + presentation.dismiss();
126 234 }
127 235
128 236 private class AppBrowserViewClient extends WebViewClient {
... ... @@ -131,6 +239,7 @@ public final class BrowserActivity extends AppActivity
131 239 Timber.tag("网页UrlLoading").d(url);
132 240 return super.shouldOverrideUrlLoading(webView, url);
133 241 }
  242 +
134 243 /**
135 244 * 网页加载错误时回调,这个方法会在 onPageFinished 之前调用
136 245 */
... ... @@ -139,11 +248,13 @@ public final class BrowserActivity extends AppActivity
139 248 // 这里为什么要用延迟呢?因为加载出错之后会先调用 onReceivedError 再调用 onPageFinished
140 249 post(() -> showError(listener -> reload()));
141 250 }
  251 +
142 252 /**
143 253 * 开始加载网页
144 254 */
145 255 @Override
146   - public void onPageStarted(WebView view, String url, Bitmap favicon) {}
  256 + public void onPageStarted(WebView view, String url, Bitmap favicon) {
  257 + }
147 258
148 259 /**
149 260 * 完成加载网页
... ... @@ -190,4 +301,13 @@ public final class BrowserActivity extends AppActivity
190 301 mProgressBar.setProgress(newProgress);
191 302 }
192 303 }
  304 +
  305 + @Override
  306 + protected void onResume() {
  307 + Tool.updateVersion(BrowserActivity.this.getContext());
  308 + if (presentation != null) {
  309 + presentation.show();
  310 + }
  311 + super.onResume();
  312 + }
193 313 }
\ No newline at end of file
... ...
... ... @@ -115,7 +115,6 @@ public final class LoginActivity extends AppActivity
115 115
116 116 EasyHttp.post(this)
117 117 .api(new LoginApi()
118   - .setPassword(password)
119 118 .setMobile(phone))
120 119 .request(new HttpCallback<HttpData<LoginApi.Bean>>(this) {
121 120 @Override
... ...
1 1 package com.studymachine.www.ui.activity;
2 2
  3 +import static com.umeng.socialize.utils.DeviceConfigInternal.context;
  4 +
  5 +import android.Manifest;
3 6 import android.animation.Animator;
4 7 import android.animation.AnimatorListenerAdapter;
  8 +import android.content.Context;
5 9 import android.content.Intent;
  10 +import android.content.pm.PackageManager;
  11 +import android.hardware.display.DisplayManager;
  12 +import android.os.Build;
  13 +import android.provider.Settings;
  14 +import android.telecom.TelecomManager;
  15 +import android.telephony.TelephonyManager;
6 16 import android.text.TextUtils;
7 17 import android.util.DisplayMetrics;
8 18 import android.util.Log;
  19 +import android.view.Display;
  20 +import android.view.MotionEvent;
9 21 import android.view.View;
10 22 import android.view.WindowManager;
11 23
12 24 import androidx.annotation.NonNull;
  25 +import androidx.core.app.ActivityCompat;
13 26
14 27 import com.airbnb.lottie.LottieAnimationView;
15 28 import com.gyf.immersionbar.BarHide;
16 29 import com.gyf.immersionbar.ImmersionBar;
17 30 import com.hjq.http.listener.OnHttpListener;
  31 +import com.rokid.axr.phone.glassdevice.RKGlassDevice;
18 32 import com.studymachine.www.BuildConfig;
19 33 import com.studymachine.www.R;
20 34 import com.studymachine.www.aop.CheckNet;
... ... @@ -22,9 +36,12 @@ import com.studymachine.www.app.AppActivity;
22 36 import com.studymachine.www.event.DictionariesEvent;
23 37 import com.studymachine.www.event.NetworkEvent;
24 38 import com.studymachine.www.http.api.HostApi;
  39 +import com.studymachine.www.http.api.LoginApi;
25 40 import com.studymachine.www.http.api.UpdateVersionApi;
26 41 import com.studymachine.www.http.api.UserInfoApi;
27 42 import com.studymachine.www.http.model.HttpData;
  43 +import com.studymachine.www.manager.AccountManager;
  44 +import com.studymachine.www.manager.ActivityManager;
28 45 import com.studymachine.www.manager.DictionariesManager;
29 46 import com.studymachine.www.manager.GlobalParameterManager;
30 47 import com.studymachine.www.manager.UserManager;
... ... @@ -33,8 +50,11 @@ import com.hjq.http.EasyHttp;
33 50 import com.hjq.http.listener.HttpCallback;
34 51 import com.hjq.widget.view.SlantedTextView;
35 52 import com.studymachine.www.other.ScreenUtils;
  53 +import com.studymachine.www.other.Tool;
36 54 import com.studymachine.www.other.WebUrlConfig;
37 55 import com.studymachine.www.ui.dialog.UpdateDialog;
  56 +import com.studymachine.www.ui.presentation.SplashPresentation;
  57 +import com.studymachine.www.ui.presentation.WebPresentation;
38 58 import com.tencent.mmkv.MMKV;
39 59
40 60 import org.greenrobot.eventbus.Subscribe;
... ... @@ -49,12 +69,17 @@ public final class SplashActivity extends AppActivity {
49 69
50 70 @Override
51 71 protected int getLayoutId() {
52   - return R.layout.splash_activity;
  72 + deviceInfo = RKGlassDevice.getInstance().getGlassInfo();
  73 + if (deviceInfo != null && deviceInfo.getSn() != null) {
  74 + return R.layout.control_cursor;
  75 + } else {
  76 + return R.layout.splash_activity;
  77 + }
53 78 }
54 79
55 80 @Override
56 81 protected void initView() {
57   -
  82 + openAppPresentation();
58 83 }
59 84
60 85 /**
... ... @@ -68,17 +93,18 @@ public final class SplashActivity extends AppActivity {
68 93 @Override
69 94 public void onSucceed(HttpData<HostApi.Bean> result) {
70 95 if (result.getData() != null) {
71   - if (AppConfig.isDebug()) {
72   - AppConfig.setHostUrl("http://192.168.1.23:8100/");
73   - AppConfig.setWebHostUrl("http://192.168.1.26:8086/");
74   - } else {
75   - AppConfig.setHostUrl(result.getData().getApi());
76   - AppConfig.setWebHostUrl(result.getData().getH5Url());
77   - }
78   - AppConfig.setHostUrl(result.getData().getApi());
79   - AppConfig.setWebHostUrl(result.getData().getH5Url());
80   -// AppConfig.setHostUrl("http://192.168.1.23:8100/");
81   -// AppConfig.setWebHostUrl("http://192.168.1.26:8086/");
  96 +// if (AppConfig.isDebug()) {
  97 +// AppConfig.setHostUrl("http://192.168.1.23:8100/");
  98 +// AppConfig.setWebHostUrl("http://192.168.1.26:8086/");
  99 +// } else {
  100 +// AppConfig.setHostUrl(result.getData().getApi());
  101 +// AppConfig.setWebHostUrl(result.getData().getH5Url());
  102 +// }
  103 +// AppConfig.setHostUrl(result.getData().getApi());
  104 +// AppConfig.setWebHostUrl(result.getData().getH5Url());
  105 + AppConfig.setHostUrl("https://api.veln.cn/");
  106 + AppConfig.setWebHostUrl("https://h5.veln.cn/");
  107 +// Tool.updateVersion(getContext());
82 108 initConfig();
83 109 }
84 110 }
... ... @@ -89,6 +115,7 @@ public final class SplashActivity extends AppActivity {
89 115 NoNetworkActivity.start(getContext());
90 116 }
91 117 });
  118 +
92 119 }
93 120
94 121 @Subscribe(threadMode = ThreadMode.MAIN)
... ... @@ -104,24 +131,68 @@ public final class SplashActivity extends AppActivity {
104 131 private void initConfig() {
105 132 DictionariesManager.getInstance();
106 133 GlobalParameterManager.getInstance().getData();
  134 + if (TextUtils.isEmpty(UserManager.getInstance().getToken())) {
  135 + String phone = Settings.System.getString(getContentResolver(), Settings.System.ANDROID_ID);
  136 + EasyHttp.post(this)
  137 + .api((new LoginApi())
  138 + .setMobile(phone))
  139 + .request(new HttpCallback<HttpData<LoginApi.Bean>>(this) {
  140 + @Override
  141 + public void onSucceed(HttpData<LoginApi.Bean> result) {
  142 + UserManager.getInstance().setToken(result.getData().getToken());
  143 + UserManager.getInstance().getUserInfo(new UserManager.OnHttpUserInfo() {
  144 + @Override
  145 + public void onSucceed() {
  146 + AccountManager.getInstance().addAccountMap(phone, "000000");
  147 + postDelayed(() -> {
  148 + SwitchInfoActivity.start(getContext());
  149 + // 销毁除了首页之外的 Activity
  150 + ActivityManager.getInstance().finishAllActivities(SwitchInfoActivity.class);
  151 + finish();
  152 + presentation.dismiss();
  153 + }, 1000);
  154 + }
  155 +
  156 + @Override
  157 + public void onFail() {
  158 +
  159 + }
  160 + });
  161 + }
107 162
108   - MMKV mmkv = MMKV.defaultMMKV();
109   - String isFirstRun = mmkv.decodeString("isFirstRun");
110   - if (TextUtils.isEmpty(isFirstRun)) {
111   - RegisterActivity.start(getContext());
112   - mmkv.encode("isFirstRun", "true");
  163 + @Override
  164 + public void onFail(Exception e) {
  165 + super.onFail(e);
  166 + }
  167 + });
113 168 } else {
114   - if (TextUtils.isEmpty(UserManager.getInstance().getToken())) {
115   - LoginActivity.start(getContext());
  169 + UserManager.getInstance().getUserInfo();
  170 + // 刷新用户信息
  171 + String grade = UserManager.getInstance().getUserBean().getGrade();
  172 + if ( TextUtils.isEmpty(grade)) {
  173 + SwitchInfoActivity.start(this);
  174 + // 销毁除了首页之外的 Activity
  175 + ActivityManager.getInstance().finishAllActivities(SwitchInfoActivity.class);
  176 + finish();
  177 + presentation.dismiss();
116 178 } else {
117   - // 刷新用户信息
118   - UserManager.getInstance().getUserInfo();
119   - HomeActivity.start(getContext());
  179 + BrowserActivity.start(getContext(),"https://preview.inibiru.com/creator/custom/index.html?id=12242");
  180 + ActivityManager.getInstance().finishAllActivities(BrowserActivity.class);
  181 + finish();
  182 + presentation.dismiss();
120 183 }
121 184 }
122   - finish();
123 185 }
124 186
  187 + @Override
  188 + public boolean dispatchTouchEvent(MotionEvent ev) {
  189 + if (presentation != null) {
  190 + return presentation.onTouchEvent(ev);
  191 + }
  192 + return super.dispatchTouchEvent(ev);
  193 + }
  194 +
  195 + private SplashPresentation presentation;
125 196
126 197 @NonNull
127 198 @Override
... ... @@ -137,6 +208,23 @@ public final class SplashActivity extends AppActivity {
137 208 //super.onBackPressed();
138 209 }
139 210
  211 + public void openAppPresentation() {
  212 + if (null == presentation) {
  213 + DisplayManager mDisplayManage = (DisplayManager) this.getSystemService(Context.DISPLAY_SERVICE);
  214 + Display[] displayList = mDisplayManage.getDisplays();
  215 + if (displayList.length > 1) {
  216 + presentation = new SplashPresentation(this, displayList[1]);
  217 + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {//8.0
  218 + presentation.getWindow().setType(WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY);
  219 + } else {
  220 + presentation.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_OVERLAY);
  221 + }
  222 + }
  223 + }
  224 + presentation.setOwnerActivity(this);
  225 + presentation.show();
  226 + }
  227 +
140 228 @Override
141 229 protected void initActivity() {
142 230 // 问题及方案:https://www.cnblogs.com/net168/p/5722752.html
... ... @@ -160,5 +248,6 @@ public final class SplashActivity extends AppActivity {
160 248 // 因为修复了一个启动页被重复启动的问题,所以有可能 Activity 还没有初始化完成就已经销毁了
161 249 // 所以如果需要在此处释放对象资源需要先对这个对象进行判空,否则可能会导致空指针异常
162 250 super.onDestroy();
  251 + presentation.dismiss();
163 252 }
164 253 }
\ No newline at end of file
... ...
  1 +package com.studymachine.www.ui.activity;
  2 +
  3 +import android.content.Context;
  4 +import android.content.Intent;
  5 +import android.hardware.display.DisplayManager;
  6 +import android.os.Build;
  7 +import android.text.TextUtils;
  8 +import android.view.Display;
  9 +import android.view.MotionEvent;
  10 +import android.view.View;
  11 +import android.view.WindowManager;
  12 +import android.widget.Button;
  13 +
  14 +import androidx.recyclerview.widget.RecyclerView;
  15 +
  16 +import com.hjq.http.EasyHttp;
  17 +import com.hjq.http.listener.HttpCallback;
  18 +import com.studymachine.www.R;
  19 +import com.studymachine.www.app.AppActivity;
  20 +import com.studymachine.www.enumtype.DictionariesEnum;
  21 +import com.studymachine.www.event.DictionariesEvent;
  22 +import com.studymachine.www.event.UserInfoEvent;
  23 +import com.studymachine.www.http.api.EditUserInfoApi;
  24 +import com.studymachine.www.http.api.GetDictionariesApi;
  25 +import com.studymachine.www.http.model.HttpData;
  26 +import com.studymachine.www.manager.ActivityManager;
  27 +import com.studymachine.www.manager.DictionariesManager;
  28 +import com.studymachine.www.manager.UserManager;
  29 +import com.studymachine.www.other.AppConfig;
  30 +import com.studymachine.www.ui.adapter.RadioAdapter;
  31 +import com.studymachine.www.ui.fragment.HomeFragment;
  32 +import com.studymachine.www.ui.fragment.SwitchInfoFragment;
  33 +import com.studymachine.www.ui.presentation.SplashPresentation;
  34 +import com.studymachine.www.ui.presentation.SwitchInfoPresentation;
  35 +
  36 +import org.greenrobot.eventbus.Subscribe;
  37 +import org.greenrobot.eventbus.ThreadMode;
  38 +
  39 +import java.util.ArrayList;
  40 +import java.util.List;
  41 +
  42 +public class SwitchInfoActivity extends AppActivity implements RadioAdapter.OnRadioListener{
  43 +
  44 + private RadioAdapter mGradeAdapter, mTextbookAdapter;
  45 + private RecyclerView mRvGrade, mTextbook;
  46 + private Button mCommitBtn;
  47 + private GetDictionariesApi.Bean mSelectGrade, mSelectTextbook;
  48 + private List<GetDictionariesApi.Bean> mGradeDataList = new ArrayList<>();
  49 + private List<GetDictionariesApi.Bean> mTextbookDataList = new ArrayList<>();
  50 + private SwitchInfoPresentation presentation;
  51 +
  52 + public static void start(Context context) {
  53 + Intent intent = new Intent(context, SwitchInfoActivity.class);
  54 + context.startActivity(intent);
  55 + }
  56 +
  57 + @Override
  58 + protected int getLayoutId() {
  59 + if (deviceInfo != null && deviceInfo.getSn() != null) {
  60 + return R.layout.control_cursor;
  61 + } else {
  62 + return R.layout.switch_info_fragment;
  63 + }
  64 + }
  65 +
  66 + @Override
  67 + protected void initView() {
  68 + if (deviceInfo != null && deviceInfo.getSn() != null) {
  69 + return;
  70 + }
  71 + mCommitBtn = findViewById(R.id.btn_commit);
  72 + mRvGrade = findViewById(R.id.rv_grade);
  73 + mTextbook = findViewById(R.id.rv_textbook);
  74 + setOnClickListener(mCommitBtn);
  75 + }
  76 +
  77 +
  78 + @Override
  79 + protected void initData() {
  80 + if (deviceInfo != null && deviceInfo.getSn() != null) {
  81 + mControlBack = findViewById(R.id.control_back);
  82 + mControlChange = findViewById(R.id.control_change);
  83 + mControlMode = findViewById(R.id.control_mode);
  84 + mControlBack.setVisibility(View.VISIBLE);
  85 + mControlChange.setVisibility(View.GONE);
  86 + mControlMode.setVisibility(View.GONE);
  87 + mControlLine = findViewById(R.id.control_line);
  88 + mControlBack.setOnClickListener(new View.OnClickListener() {
  89 + @Override
  90 + public void onClick(View v) {
  91 + finish();
  92 + if (presentation != null) {
  93 + presentation.dismiss();
  94 + }
  95 + }
  96 + });
  97 + mControlChange.setOnClickListener(new View.OnClickListener() {
  98 + @Override
  99 + public void onClick(View v) {
  100 + SwitchInfoActivity.start(getContext());
  101 + finish();
  102 + if (presentation != null) {
  103 + presentation.dismiss();
  104 + }
  105 + }
  106 + });
  107 + mControlMode.setOnClickListener(new View.OnClickListener() {
  108 + @Override
  109 + public void onClick(View v) {
  110 + if (presentation != null) {
  111 + presentation.changeMode();
  112 + }
  113 + }
  114 + });
  115 + return;
  116 + }
  117 + initGrade();
  118 + initTextbook();
  119 + DictionariesManager.getInstance().getHttpData();
  120 + }
  121 +
  122 + private void initTextbook() {
  123 + mTextbookDataList = DictionariesManager.getInstance().getDictionItem(DictionariesEnum.CATEGORY_KEY);
  124 + List<GetDictionariesApi.Bean> beanList = new ArrayList<>();
  125 + String category = UserManager.getInstance().getUserBean().getCategory();
  126 + if (!TextUtils.isEmpty(category)) {
  127 + for (int i = 0; i < mTextbookDataList.size(); i++) {
  128 + if (mTextbookDataList.get(i).getValue().equals(category)) {
  129 + beanList.add(mTextbookDataList.get(i));
  130 + mSelectTextbook = mTextbookDataList.get(i);
  131 + break;
  132 + }
  133 + }
  134 + }
  135 + mTextbookAdapter = new RadioAdapter(this, beanList);
  136 + mTextbookAdapter.setListener(this);
  137 + mTextbook.setAdapter(mTextbookAdapter);
  138 + mTextbookAdapter.setData(mTextbookDataList);
  139 +
  140 + }
  141 +
  142 + private void initGrade() {
  143 + mGradeDataList = DictionariesManager.getInstance().getDictionItem(DictionariesEnum.GRADE_KEY);
  144 + List<GetDictionariesApi.Bean> beanList = new ArrayList<>();
  145 + String grade = UserManager.getInstance().getUserBean().getGrade();
  146 + if (!TextUtils.isEmpty(grade)) {
  147 + for (int i = 0; i < mGradeDataList.size(); i++) {
  148 + if (mGradeDataList.get(i).getValue().equals(grade)) {
  149 + beanList.add(mGradeDataList.get(i));
  150 + mSelectGrade = mGradeDataList.get(i);
  151 + break;
  152 + }
  153 + }
  154 + }
  155 + mGradeAdapter = new RadioAdapter(this, beanList);
  156 + mGradeAdapter.setListener(this);
  157 + mRvGrade.setAdapter(mGradeAdapter);
  158 + mGradeAdapter.setData(mGradeDataList);
  159 + }
  160 +
  161 +
  162 + @Override
  163 + public void onClick(View view) {
  164 + if (view == mCommitBtn) {
  165 + EasyHttp.post(this)
  166 + .api(new EditUserInfoApi()
  167 + .setCategory(mSelectTextbook.getValue())
  168 + .setGrade(mSelectGrade.getValue()))
  169 + .request(new HttpCallback<HttpData>(this) {
  170 + @Override
  171 + public void onSucceed(HttpData result) {
  172 + UserManager.getInstance().getUserInfo();
  173 + BrowserActivity.start(getContext(), "https://preview.inibiru.com/creator/custom/index.html?id=12242");
  174 + presentation.dismiss();
  175 + finish();
  176 + }
  177 +
  178 + @Override
  179 + public void onFail(Exception e) {
  180 + super.onFail(e);
  181 + }
  182 + });
  183 + }
  184 + }
  185 +
  186 + @Override
  187 + public boolean dispatchTouchEvent(MotionEvent ev) {
  188 + float y = mControlLine.getY();
  189 + if (ev.getY() < y){
  190 + return super.dispatchTouchEvent(ev);
  191 + }
  192 + if (presentation != null) {
  193 + return presentation.onTouchEvent(ev);
  194 + }
  195 + return super.dispatchTouchEvent(ev);
  196 + }
  197 +
  198 + public void openAppPresentation() {
  199 + if (null == presentation) {
  200 + DisplayManager mDisplayManage = (DisplayManager) this.getSystemService(Context.DISPLAY_SERVICE);
  201 + Display[] displayList = mDisplayManage.getDisplays();
  202 + if (displayList.length > 1) {
  203 + presentation = new SwitchInfoPresentation(this, displayList[1]);
  204 + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {//8.0
  205 + presentation.getWindow().setType(WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY);
  206 + } else {
  207 + presentation.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_OVERLAY);
  208 + }
  209 + }
  210 + }
  211 + presentation.setOwnerActivity(this);
  212 + presentation.show();
  213 + }
  214 +
  215 + @Override
  216 + public void onItemClick(RecyclerView recyclerView, int position, List<GetDictionariesApi.Bean> mSelectList) {
  217 + if (recyclerView == mRvGrade) {
  218 + mSelectGrade = mSelectList.get(0);
  219 + } else if (recyclerView == mTextbook) {
  220 + mSelectTextbook = mSelectList.get(0);
  221 + }
  222 + }
  223 +
  224 + @Subscribe(threadMode = ThreadMode.MAIN)
  225 + public void onEventBus(UserInfoEvent userInfoEvent) {
  226 + }
  227 +
  228 + @Subscribe(threadMode = ThreadMode.MAIN)
  229 + public void onEventBus(DictionariesEvent dictionariesEvent) {
  230 + initGrade();
  231 + initTextbook();
  232 + }
  233 +
  234 + @Override
  235 + protected void onDestroy() {
  236 + super.onDestroy();
  237 + presentation.dismiss();
  238 + }
  239 +}
... ...
... ... @@ -66,7 +66,7 @@ public class AiListPresentation extends AppPresentation implements BaseAdapter.O
66 66 mAiListAdapter.setOnItemClickListener(this);
67 67 mRecyclerView.setAdapter(mAiListAdapter);
68 68 getList();
69   - XXPermissions.with(getContext())
  69 + XXPermissions.with(getOwnerActivity())
70 70 .permission(Permission.READ_EXTERNAL_STORAGE)
71 71 .permission(Permission.WRITE_EXTERNAL_STORAGE)
72 72 .request(new PermissionCallback() {
... ... @@ -76,7 +76,7 @@ public class AiListPresentation extends AppPresentation implements BaseAdapter.O
76 76 }
77 77 });
78 78
79   - GlideApp.with(getContext())
  79 + GlideApp.with(getOwnerActivity())
80 80 .asGif()
81 81 .load(R.drawable.ai_person)
82 82 .listener(new RequestListener<GifDrawable>() {
... ... @@ -105,10 +105,11 @@ public class AiListPresentation extends AppPresentation implements BaseAdapter.O
105 105 .into(mIvPerson);
106 106 }
107 107
  108 +
108 109 @Override
109 110 public void onItemClick(RecyclerView recyclerView, View itemView, int position) {
110 111 if (mDataList.get(position).getQuestionNum() > 0) {
111   - AiDetailActivity.start(getContext(), String.valueOf(mDataList.get(position).getId()));
  112 + AiDetailActivity.start(getOwnerActivity(), String.valueOf(mDataList.get(position).getId()));
112 113 }
113 114 }
114 115
... ...
  1 +package com.studymachine.www.ui.presentation;
  2 +
  3 +import static com.hjq.http.EasyUtils.post;
  4 +
  5 +import android.content.Context;
  6 +import android.graphics.Bitmap;
  7 +import android.graphics.drawable.BitmapDrawable;
  8 +import android.os.Message;
  9 +import android.view.Display;
  10 +import android.view.View;
  11 +import android.widget.ImageView;
  12 +import android.widget.ProgressBar;
  13 +
  14 +import com.studymachine.www.R;
  15 +import com.studymachine.www.action.StatusAction;
  16 +import com.studymachine.www.aop.CheckNet;
  17 +import com.studymachine.www.app.AppPresentation;
  18 +import com.studymachine.www.app.ModeHandler;
  19 +import com.studymachine.www.http.glide.GlideApp;
  20 +import com.studymachine.www.js.MainJavaScriptInterface;
  21 +import com.studymachine.www.ui.activity.BrowserActivity;
  22 +import com.studymachine.www.widget.StatusLayout;
  23 +import com.studymachine.www.widget.X5WebView;
  24 +import com.tencent.smtt.sdk.ValueCallback;
  25 +import com.tencent.smtt.sdk.WebChromeClient;
  26 +import com.tencent.smtt.sdk.WebView;
  27 +import com.tencent.smtt.sdk.WebViewClient;
  28 +
  29 +import java.util.TimerTask;
  30 +
  31 +import timber.log.Timber;
  32 +
  33 +public class BrowserPresentation extends AppPresentation implements StatusAction {
  34 + private String url;
  35 + private StatusLayout mStatusLayout;
  36 + private ProgressBar mProgressBar;
  37 + private X5WebView mX5WebView;
  38 + private ImageView mImgView;
  39 +
  40 + public BrowserPresentation(Context outerContext, Display display) {
  41 + super(outerContext, display);
  42 + }
  43 +
  44 + public BrowserPresentation(Context outerContext, Display display, String url) {
  45 + super(outerContext, display);
  46 + this.url = url;
  47 + }
  48 +
  49 + public X5WebView getmX5WebView() {
  50 + return this.mX5WebView;
  51 + }
  52 +
  53 + @Override
  54 + public int getLayout() {
  55 + return R.layout.browser_activity;
  56 + }
  57 +
  58 + @Override
  59 + public void initData() {
  60 + final ModeHandler handler = new ModeHandler(this);
  61 + mStatusLayout = findViewById(R.id.hl_browser_hint);
  62 + mProgressBar = findViewById(R.id.pb_browser_progress);
  63 + mX5WebView = findViewById(R.id.wv_browser_view);
  64 + mImgView = findViewById(R.id.loadview);
  65 + mX5WebView.addJavascriptInterface(new MainJavaScriptInterface(getOwnerActivity(), mX5WebView, handler), "studyMachine");
  66 +
  67 + GlideApp.with(getOwnerActivity())
  68 + .asGif()
  69 + .load(R.drawable.common_load)
  70 + .into(mImgView);
  71 + mX5WebView.setWebViewClient(new AppBrowserViewClient());
  72 + mX5WebView.setWebChromeClient(new AppBrowserChromeClient());
  73 + mX5WebView.loadUrl(url);
  74 +// handler.sendEmptyMessage(0);
  75 +// Runnable task = new Runnable() {
  76 +// public void run() {
  77 +// mX5WebView.evaluateJavascript("javascript:answerExist()", new ValueCallback<String>() {
  78 +// @Override
  79 +// public void onReceiveValue(String s) {
  80 +// try {
  81 +// mode = Integer.valueOf(s);
  82 +// } catch (Exception e) {
  83 +// mode = 0;
  84 +// }
  85 +//
  86 +// }
  87 +// });
  88 +//
  89 +// handler.sendEmptyMessage(0);//设置循环时间,此处是5秒
  90 +// handler.postDelayed(this, 100);
  91 +// //需要执行的代码
  92 +// }
  93 +// };
  94 +//
  95 +// handler.post(task);
  96 + }
  97 +
  98 +
  99 + private class AppBrowserViewClient extends WebViewClient {
  100 + @Override
  101 + public boolean shouldOverrideUrlLoading(com.tencent.smtt.sdk.WebView webView, String url) {
  102 + Timber.tag("网页UrlLoading").d(url);
  103 + return super.shouldOverrideUrlLoading(webView, url);
  104 + }
  105 +
  106 + /**
  107 + * 网页加载错误时回调,这个方法会在 onPageFinished 之前调用
  108 + */
  109 + @Override
  110 + public void onReceivedError(WebView webView, int i, String s, String s1) {
  111 + // 这里为什么要用延迟呢?因为加载出错之后会先调用 onReceivedError 再调用 onPageFinished
  112 + post(() -> showError(listener -> reload()));
  113 + }
  114 +
  115 + /**
  116 + * 开始加载网页
  117 + */
  118 + @Override
  119 + public void onPageStarted(WebView view, String url, Bitmap favicon) {
  120 + }
  121 +
  122 + /**
  123 + * 完成加载网页
  124 + */
  125 + @Override
  126 + public void onPageFinished(WebView view, String url) {
  127 +// showComplete();
  128 + mImgView.setVisibility(View.GONE);
  129 + }
  130 + }
  131 +
  132 + private class AppBrowserChromeClient extends WebChromeClient {
  133 +
  134 + @Override
  135 + public boolean onCreateWindow(WebView view, boolean isDialog, boolean isUserGesture, Message resultMsg) {
  136 + Timber.tag("网页").d("look");
  137 + return false;
  138 + }
  139 +
  140 + /**
  141 + * 收到网页标题
  142 + */
  143 + @Override
  144 + public void onReceivedTitle(WebView view, String title) {
  145 + if (title == null) {
  146 + return;
  147 + }
  148 + setTitle(title);
  149 + }
  150 +
  151 + @Override
  152 + public void onReceivedIcon(WebView view, Bitmap icon) {
  153 + if (icon == null) {
  154 + return;
  155 + }
  156 + setRightIcon(new BitmapDrawable(getResources(), icon));
  157 + }
  158 +
  159 + /**
  160 + * 收到加载进度变化
  161 + */
  162 + @Override
  163 + public void onProgressChanged(WebView view, int newProgress) {
  164 + mProgressBar.setProgress(newProgress);
  165 + }
  166 + }
  167 +
  168 + /**
  169 + * 重新加载当前页
  170 + */
  171 + @CheckNet
  172 + private void reload() {
  173 + mX5WebView.reload();
  174 + }
  175 +}
... ...
... ... @@ -55,6 +55,7 @@ import com.studymachine.www.manager.EventBusManager;
55 55 import com.studymachine.www.manager.GlobalParameterManager;
56 56 import com.studymachine.www.manager.UserManager;
57 57 import com.studymachine.www.other.AppConfig;
  58 +import com.studymachine.www.other.Tool;
58 59 import com.studymachine.www.ui.activity.AiDetailActivity;
59 60
60 61 import org.greenrobot.eventbus.EventBus;
... ... @@ -97,65 +98,13 @@ public class SplashPresentation extends AppPresentation {
97 98 }
98 99
99 100
100   - /**
101   - * 获取动态域名
102   - */
103   - @CheckNet
104   - private void getHost() {
105   - EasyHttp.get((LifecycleOwner) getOwnerActivity())
106   - .api(new HostApi())
107   - .request(new HttpCallback<HttpData<HostApi.Bean>>(this) {
108   - @Override
109   - public void onSucceed(HttpData<HostApi.Bean> result) {
110   - if (result.getData() != null) {
111   - if (AppConfig.isDebug()) {
112   - AppConfig.setHostUrl("http://192.168.1.23:8100/");
113   - AppConfig.setWebHostUrl("http://192.168.1.26:8086/");
114   - } else {
115   - AppConfig.setHostUrl(result.getData().getApi());
116   - AppConfig.setWebHostUrl(result.getData().getH5Url());
117   - }
118   - AppConfig.setHostUrl(result.getData().getApi());
119   - AppConfig.setWebHostUrl(result.getData().getH5Url());
120   -// AppConfig.setHostUrl("http://192.168.1.23:8100/");
121   -// AppConfig.setWebHostUrl("http://192.168.1.26:8086/");
122   - initConfig();
123   - }
124   - }
125   -
126   - @Override
127   - public void onFail(Exception e) {
128   - super.onFail(e);
129   - NoNetworkActivity.start(getContext());
130   - }
131   - });
132   - }
133 101
134 102 @Override
135 103 public void initData() {
136   - getHost();
  104 +// Tool.updateVersion(getOwnerActivity());
  105 +// getHost();
137 106 }
138 107
139   - private void initConfig() {
140   - DictionariesManager.getInstance();
141   - GlobalParameterManager.getInstance().getData();
142   -
143   - MMKV mmkv = MMKV.defaultMMKV();
144   - String isFirstRun = mmkv.decodeString("isFirstRun");
145   - if (TextUtils.isEmpty(isFirstRun)) {
146   - RegisterActivity.start(getContext());
147   - mmkv.encode("isFirstRun", "true");
148   - } else {
149   - if (TextUtils.isEmpty(UserManager.getInstance().getToken())) {
150   - LoginActivity.start(getContext());
151   - } else {
152   - // 刷新用户信息
153   - UserManager.getInstance().getUserInfo();
154   - HomeActivity.start(getContext());
155   - }
156   - }
157   - finish();
158   - }
159 108
160 109 private void finish() {
161 110 dismiss();
... ...
  1 +package com.studymachine.www.ui.presentation;
  2 +
  3 +import android.content.Context;
  4 +import android.text.TextUtils;
  5 +import android.view.Display;
  6 +import android.view.View;
  7 +import android.widget.Button;
  8 +
  9 +import androidx.lifecycle.LifecycleOwner;
  10 +import androidx.recyclerview.widget.RecyclerView;
  11 +
  12 +import com.hjq.base.action.ClickAction;
  13 +import com.hjq.http.EasyHttp;
  14 +import com.hjq.http.listener.HttpCallback;
  15 +import com.studymachine.www.R;
  16 +import com.studymachine.www.app.AppPresentation;
  17 +import com.studymachine.www.enumtype.DictionariesEnum;
  18 +import com.studymachine.www.event.DictionariesEvent;
  19 +import com.studymachine.www.event.UserInfoEvent;
  20 +import com.studymachine.www.http.api.EditUserInfoApi;
  21 +import com.studymachine.www.http.api.GetDictionariesApi;
  22 +import com.studymachine.www.http.model.HttpData;
  23 +import com.studymachine.www.manager.ActivityManager;
  24 +import com.studymachine.www.manager.DictionariesManager;
  25 +import com.studymachine.www.manager.UserManager;
  26 +import com.studymachine.www.other.AppConfig;
  27 +import com.studymachine.www.ui.activity.BrowserActivity;
  28 +import com.studymachine.www.ui.activity.HomeActivity;
  29 +import com.studymachine.www.ui.adapter.RadioAdapter;
  30 +import com.studymachine.www.ui.fragment.HomeFragment;
  31 +
  32 +import org.greenrobot.eventbus.Subscribe;
  33 +import org.greenrobot.eventbus.ThreadMode;
  34 +
  35 +import java.util.ArrayList;
  36 +import java.util.List;
  37 +
  38 +public class SwitchInfoPresentation extends AppPresentation implements RadioAdapter.OnRadioListener, ClickAction {
  39 +
  40 + private RadioAdapter mGradeAdapter, mTextbookAdapter;
  41 + private RecyclerView mRvGrade, mTextbook;
  42 + private Button mCommitBtn;
  43 + private GetDictionariesApi.Bean mSelectGrade, mSelectTextbook;
  44 + private List<GetDictionariesApi.Bean> mGradeDataList = new ArrayList<>();
  45 + private List<GetDictionariesApi.Bean> mTextbookDataList = new ArrayList<>();
  46 +
  47 + public SwitchInfoPresentation(Context outerContext, Display display) {
  48 + super(outerContext, display);
  49 + }
  50 +
  51 + @Override
  52 + public int getLayout() {
  53 + return R.layout.switch_info_fragment;
  54 + }
  55 +
  56 + @Override
  57 + public void initData() {
  58 + mCommitBtn = findViewById(R.id.btn_commit);
  59 + mRvGrade = findViewById(R.id.rv_grade);
  60 + mTextbook = findViewById(R.id.rv_textbook);
  61 + setOnClickListener(mCommitBtn);
  62 + initGrade();
  63 + initTextbook();
  64 + DictionariesManager.getInstance().getHttpData();
  65 + }
  66 +
  67 + private void initTextbook() {
  68 + mTextbookDataList = DictionariesManager.getInstance().getDictionItem(DictionariesEnum.CATEGORY_KEY);
  69 + List<GetDictionariesApi.Bean> beanList = new ArrayList<>();
  70 + String category = UserManager.getInstance().getUserBean().getCategory();
  71 + if (!TextUtils.isEmpty(category)) {
  72 + for (int i = 0; i < mTextbookDataList.size(); i++) {
  73 + if (mTextbookDataList.get(i).getValue().equals(category)) {
  74 + beanList.add(mTextbookDataList.get(i));
  75 + mSelectTextbook = mTextbookDataList.get(i);
  76 + break;
  77 + }
  78 + }
  79 + }
  80 + mTextbookAdapter = new RadioAdapter(getContext(), beanList);
  81 + mTextbookAdapter.setListener(this);
  82 + mTextbook.setAdapter(mTextbookAdapter);
  83 + mTextbookAdapter.setData(mTextbookDataList);
  84 +
  85 + }
  86 +
  87 + private void initGrade() {
  88 + mGradeDataList = DictionariesManager.getInstance().getDictionItem(DictionariesEnum.GRADE_KEY);
  89 + List<GetDictionariesApi.Bean> beanList = new ArrayList<>();
  90 + String grade = UserManager.getInstance().getUserBean().getGrade();
  91 + if (!TextUtils.isEmpty(grade)) {
  92 + for (int i = 0; i < mGradeDataList.size(); i++) {
  93 + if (mGradeDataList.get(i).getValue().equals(grade)) {
  94 + beanList.add(mGradeDataList.get(i));
  95 + mSelectGrade = mGradeDataList.get(i);
  96 + break;
  97 + }
  98 + }
  99 + }
  100 + mGradeAdapter = new RadioAdapter(getContext(), beanList);
  101 + mGradeAdapter.setListener(this);
  102 + mRvGrade.setAdapter(mGradeAdapter);
  103 + mGradeAdapter.setData(mGradeDataList);
  104 + }
  105 +
  106 +
  107 + @Override
  108 + public void onClick(View view) {
  109 + if (view == mCommitBtn) {
  110 + EasyHttp.post((LifecycleOwner) getOwnerActivity())
  111 + .api(new EditUserInfoApi()
  112 + .setCategory(mSelectTextbook.getValue())
  113 + .setGrade(mSelectGrade.getValue()))
  114 + .request(new HttpCallback<HttpData>(this) {
  115 + @Override
  116 + public void onSucceed(HttpData result) {
  117 + UserManager.getInstance().getUserInfo();
  118 + BrowserActivity.start(getContext(), "https://preview.inibiru.com/creator/custom/index.html?id=12242");
  119 + ActivityManager.getInstance().finishAllActivities(BrowserActivity.class);
  120 + getOwnerActivity().finish();
  121 + dismiss();
  122 + }
  123 +
  124 + @Override
  125 + public void onFail(Exception e) {
  126 + super.onFail(e);
  127 + }
  128 + });
  129 + }
  130 + }
  131 +
  132 + @Override
  133 + public void onItemClick(RecyclerView recyclerView, int position, List<GetDictionariesApi.Bean> mSelectList) {
  134 + if (recyclerView == mRvGrade) {
  135 + mSelectGrade = mSelectList.get(0);
  136 + } else if (recyclerView == mTextbook) {
  137 + mSelectTextbook = mSelectList.get(0);
  138 + }
  139 + }
  140 +
  141 + @Subscribe(threadMode = ThreadMode.MAIN)
  142 + public void onEventBus(UserInfoEvent userInfoEvent) {
  143 + }
  144 +
  145 + @Subscribe(threadMode = ThreadMode.MAIN)
  146 + public void onEventBus(DictionariesEvent dictionariesEvent) {
  147 + initGrade();
  148 + initTextbook();
  149 + }
  150 +}
... ...
... ... @@ -39,6 +39,7 @@ import com.studymachine.www.R;
39 39 import com.studymachine.www.action.TitleBarAction;
40 40 import com.studymachine.www.aop.CheckNet;
41 41 import com.studymachine.www.app.AppPresentation;
  42 +import com.studymachine.www.app.ModeHandler;
42 43 import com.studymachine.www.domain.AiDTO;
43 44 import com.studymachine.www.enumtype.TopicEnum;
44 45 import com.studymachine.www.event.SwfEvent;
... ... @@ -64,6 +65,7 @@ import com.studymachine.www.action.StatusAction;
64 65 import com.studymachine.www.ui.dialog.ConfirmDialog;
65 66 import com.studymachine.www.widget.StatusLayout;
66 67 import com.studymachine.www.widget.X5WebView;
  68 +import com.tencent.smtt.sdk.ValueCallback;
67 69 import com.tencent.smtt.sdk.WebChromeClient;
68 70 import com.tencent.smtt.sdk.WebView;
69 71 import com.tencent.smtt.sdk.WebViewClient;
... ... @@ -92,32 +94,25 @@ public class WebPresentation extends AppPresentation implements StatusAction {
92 94 this.mPointId = mPointId;
93 95 this.mPointDetail = mPointDetail;
94 96 }
95   -
  97 + public X5WebView getmX5WebView(){
  98 + return this.mX5WebView;
  99 + }
96 100 public WebPresentation(Context outerContext, Display display, int theme) {
97 101 super(outerContext, display, theme);
98 102 }
99 103
100   - private void addControllerView() {
101   - controllerView = new ControllerView(getContext(), null);
102   - ViewGroup root = (ViewGroup) getWindow().getDecorView();
103   - root.addView(controllerView);
104   - controllerView.bringToFront();
105   - }
106   -
107 104 @Override
108 105 public int getLayout() {
109 106 return R.layout.ai_detail_activity;
110 107 }
111 108
112 109 public void initData() {
113   - mControllerFrame = findViewById(R.id.controller_frame);
  110 + final ModeHandler handler = new ModeHandler(this);
114 111 mImgView = findViewById(R.id.loadview);
115 112 mStatusLayout = findViewById(R.id.hl_browser_hint);
116 113 mIvBack = findViewById(R.id.iv_back);
117 114 mX5WebView = findViewById(R.id.wv_browser_view);
118   - mControllerBid = findViewById(R.id.controller_bid);
119   - imageView = findViewById(R.id.controller_image);
120   - MainJavaScriptInterface mainJavaScriptInterface = new MainJavaScriptInterface(getOwnerActivity(), mX5WebView);
  115 + MainJavaScriptInterface mainJavaScriptInterface = new MainJavaScriptInterface(getOwnerActivity(), mX5WebView,handler);
121 116 mX5WebView.addJavascriptInterface(mainJavaScriptInterface, "studyMachine");
122 117 String currentDateTimeString = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.US).format(new Date());
123 118 mainJavaScriptInterface.setTime(currentDateTimeString);
... ... @@ -129,7 +124,35 @@ public class WebPresentation extends AppPresentation implements StatusAction {
129 124 mX5WebView.setWebViewClient(new AppBrowserViewClient());
130 125 mX5WebView.setWebChromeClient(new AppBrowserChromeClient());
131 126 mX5WebView.loadUrl(mPointDetail.isFinish() ? mPointDetail.getScene().getArbitrarilyUrl() : mPointDetail.getScene().getSequenceUrl());
132   -
  127 + mIvBack.setOnClickListener(new View.OnClickListener() {
  128 + @Override
  129 + public void onClick(View v) {
  130 + dismiss();
  131 + getOwnerActivity().finish();
  132 + }
  133 + });
  134 + handler.sendEmptyMessage(0);
  135 +// Runnable task = new Runnable() {
  136 +// public void run() {
  137 +// mX5WebView.evaluateJavascript("javascript:answerExist()", new ValueCallback<String>() {
  138 +// @Override
  139 +// public void onReceiveValue(String s) {
  140 +// try {
  141 +// mode = Integer.valueOf(s);
  142 +// } catch (Exception e) {
  143 +// mode = 1;
  144 +// }
  145 +//
  146 +// }
  147 +// });
  148 +//
  149 +// handler.sendEmptyMessage(mode);//设置循环时间,此处是5秒
  150 +// handler.postDelayed(this, 1000);
  151 +// //需要执行的代码
  152 +// }
  153 +// };
  154 +//
  155 +// handler.post(task);
133 156 }
134 157
135 158 @Subscribe(threadMode = ThreadMode.MAIN)
... ...
... ... @@ -8,15 +8,15 @@
8 8 tools:context="com.studymachine.www.ui.activity.AiListActivity">
9 9
10 10 <androidx.appcompat.widget.AppCompatImageView
11   - android:layout_width="match_parent"
12   - android:layout_height="match_parent"
  11 + android:layout_width="wrap_content"
  12 + android:layout_height="wrap_content"
13 13 android:src="@drawable/ai_person_bg"
14 14 android:translationZ="@dimen/dp_2" />
15 15
16 16
17 17 <androidx.appcompat.widget.AppCompatImageView
18 18 android:id="@+id/iv_person"
19   - android:layout_width="@dimen/dp_500"
  19 + android:layout_width="@dimen/dp_300"
20 20 android:layout_centerVertical="true"
21 21 android:layout_height="wrap_content"
22 22 android:src="@drawable/ai_person_to"
... ...
... ... @@ -3,20 +3,51 @@
3 3 xmlns:tools="http://schemas.android.com/tools"
4 4 android:layout_width="match_parent"
5 5 android:layout_height="match_parent">
6   -<FrameLayout
  6 +<RelativeLayout
7 7 android:id="@+id/controller_frame"
8 8 android:layout_width="match_parent"
9 9 android:layout_height="match_parent"
10 10 android:background="@color/black"
11 11 >
12   - <TextView
  12 + <Button
  13 + android:id="@+id/control_back"
13 14 android:layout_width="wrap_content"
14 15 android:layout_height="wrap_content"
15   - android:gravity="center"
16   - android:layout_gravity="center"
17   - android:text="触控板\n请保持手机横屏"
18   - android:textSize="@dimen/sp_25"
19   - android:textColor="@color/white"
  16 + android:layout_alignParentLeft="true"
  17 + android:text="后退"
  18 + android:textSize="@dimen/sp_16"
  19 + android:visibility="gone"
  20 + android:layout_marginLeft="@dimen/dp_15"
  21 + android:textColor="@color/black"
20 22 />
21   -</FrameLayout>
  23 +
  24 + <Button
  25 + android:id="@+id/control_change"
  26 + android:layout_width="wrap_content"
  27 + android:layout_height="wrap_content"
  28 + android:layout_toRightOf="@id/control_back"
  29 + android:layout_marginLeft="@dimen/dp_15"
  30 + android:text="版本切换"
  31 + android:visibility="gone"
  32 + android:textColor="@color/black"
  33 + android:textSize="@dimen/sp_16" />
  34 +
  35 + <Button
  36 + android:id="@+id/control_mode"
  37 + android:layout_width="wrap_content"
  38 + android:layout_height="wrap_content"
  39 + android:layout_alignParentRight="true"
  40 + android:text="操作切换"
  41 + android:visibility="gone"
  42 + android:layout_marginRight="@dimen/dp_15"
  43 + android:textColor="@color/black"
  44 + android:textSize="@dimen/sp_16" />
  45 + <ImageView
  46 + android:id="@+id/control_line"
  47 + android:layout_width="match_parent"
  48 + android:layout_height="@dimen/dp_1_5"
  49 + android:background="@color/white"
  50 + android:layout_alignBottom="@id/control_back"
  51 + />
  52 +</RelativeLayout>
22 53 </androidx.constraintlayout.widget.ConstraintLayout>
\ No newline at end of file
... ...
... ... @@ -11,4 +11,11 @@
11 11 android:layout_gravity="center"
12 12 android:background="@drawable/ai_hand"
13 13 />
  14 + <ImageView
  15 + android:id="@+id/controller_point"
  16 + android:layout_width="wrap_content"
  17 + android:layout_height="wrap_content"
  18 + android:src="@drawable/point"
  19 + android:visibility="gone"
  20 + android:layout_gravity="center"/>
14 21 </FrameLayout>
\ No newline at end of file
... ...
... ... @@ -10,8 +10,8 @@ android {
10 10 minSdkVersion 24
11 11 // 目标适配版本
12 12 targetSdkVersion 28
13   - versionName '2.0.4'
14   - versionCode 204
  13 + versionName '2.0.5'
  14 + versionCode 205
15 15 }
16 16
17 17 // 支持 Java JDK 8
... ...
... ... @@ -46,6 +46,7 @@ public abstract class BaseActivity extends AppCompatActivity
46 46 }
47 47
48 48 protected void initActivity() {
  49 +
49 50 initLayout();
50 51 initView();
51 52 initData();
... ...