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 | 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 | } | ... | ... |
... | ... | @@ -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; | ... | ... |
... | ... | @@ -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 | ... | ... |
... | ... | @@ -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 | ... | ... |
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) | ... | ... |
app/src/main/res/drawable-xhdpi/point.png
0 → 100644
2.08 KB
... | ... | @@ -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 | ... | ... |