Showing
8 changed files
with
134 additions
and
26 deletions
| @@ -57,6 +57,12 @@ | @@ -57,6 +57,12 @@ | ||
| 57 | <meta-data | 57 | <meta-data |
| 58 | android:name="ScopedStorage" | 58 | android:name="ScopedStorage" |
| 59 | android:value="true" /> | 59 | android:value="true" /> |
| 60 | + <meta-data | ||
| 61 | + android:name="com.rokid.uxr.application.mode" | ||
| 62 | + android:value="3d" /> | ||
| 63 | + <meta-data | ||
| 64 | + android:name="com.rokid.uxr.sdk.version" | ||
| 65 | + android:value="10900" /> | ||
| 60 | 66 | ||
| 61 | <!-- 适配 Android 7.0 文件意图 --> | 67 | <!-- 适配 Android 7.0 文件意图 --> |
| 62 | <provider | 68 | <provider |
| 1 | package com.studymachine.www.app; | 1 | package com.studymachine.www.app; |
| 2 | 2 | ||
| 3 | +import android.app.Activity; | ||
| 4 | +import android.app.AppOpsManager; | ||
| 3 | import android.content.Context; | 5 | import android.content.Context; |
| 4 | import android.content.Intent; | 6 | import android.content.Intent; |
| 5 | import android.hardware.display.DisplayManager; | 7 | import android.hardware.display.DisplayManager; |
| 6 | import android.hardware.usb.UsbDevice; | 8 | import android.hardware.usb.UsbDevice; |
| 9 | +import android.net.Uri; | ||
| 10 | +import android.os.Binder; | ||
| 7 | import android.os.Build; | 11 | import android.os.Build; |
| 8 | import android.os.Bundle; | 12 | import android.os.Bundle; |
| 13 | +import android.provider.Settings; | ||
| 9 | import android.view.Display; | 14 | import android.view.Display; |
| 10 | import android.view.View; | 15 | import android.view.View; |
| 11 | import android.view.WindowManager; | 16 | import android.view.WindowManager; |
| @@ -40,6 +45,9 @@ import com.studymachine.www.ui.presentation.WebPresentation; | @@ -40,6 +45,9 @@ import com.studymachine.www.ui.presentation.WebPresentation; | ||
| 40 | 45 | ||
| 41 | import org.greenrobot.eventbus.EventBus; | 46 | import org.greenrobot.eventbus.EventBus; |
| 42 | 47 | ||
| 48 | +import java.lang.reflect.Field; | ||
| 49 | +import java.lang.reflect.Method; | ||
| 50 | + | ||
| 43 | import okhttp3.Call; | 51 | import okhttp3.Call; |
| 44 | 52 | ||
| 45 | /** | 53 | /** |
| @@ -71,7 +79,8 @@ public abstract class AppActivity extends BaseActivity | @@ -71,7 +79,8 @@ public abstract class AppActivity extends BaseActivity | ||
| 71 | */ | 79 | */ |
| 72 | private int mDialogCount; | 80 | private int mDialogCount; |
| 73 | 81 | ||
| 74 | - public GlassInfo deviceInfo = RKGlassDevice.getInstance().getGlassInfo();; | 82 | + public GlassInfo deviceInfo = RKGlassDevice.getInstance().getGlassInfo(); |
| 83 | + ; | ||
| 75 | 84 | ||
| 76 | MutableLiveData<Boolean> connectStatus = new MutableLiveData(); | 85 | MutableLiveData<Boolean> connectStatus = new MutableLiveData(); |
| 77 | 86 | ||
| @@ -131,30 +140,69 @@ public abstract class AppActivity extends BaseActivity | @@ -131,30 +140,69 @@ public abstract class AppActivity extends BaseActivity | ||
| 131 | mDialog.dismiss(); | 140 | mDialog.dismiss(); |
| 132 | } | 141 | } |
| 133 | 142 | ||
| 143 | + //判断是否开启悬浮窗权限 context可以用你的Activity.或者tiis | ||
| 144 | + public static boolean checkFloatPermission(Context context) { | ||
| 145 | + if (Build.VERSION.SDK_INT < Build.VERSION_CODES.KITKAT) | ||
| 146 | + return true; | ||
| 147 | + if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) { | ||
| 148 | + try { | ||
| 149 | + Class cls = Class.forName("android.content.Context"); | ||
| 150 | + Field declaredField = cls.getDeclaredField("APP_OPS_SERVICE"); | ||
| 151 | + declaredField.setAccessible(true); | ||
| 152 | + Object obj = declaredField.get(cls); | ||
| 153 | + if (!(obj instanceof String)) { | ||
| 154 | + return false; | ||
| 155 | + } | ||
| 156 | + String str2 = (String) obj; | ||
| 157 | + obj = cls.getMethod("getSystemService", String.class).invoke(context, str2); | ||
| 158 | + cls = Class.forName("android.app.AppOpsManager"); | ||
| 159 | + Field declaredField2 = cls.getDeclaredField("MODE_ALLOWED"); | ||
| 160 | + declaredField2.setAccessible(true); | ||
| 161 | + Method checkOp = cls.getMethod("checkOp", Integer.TYPE, Integer.TYPE, String.class); | ||
| 162 | + int result = (Integer) checkOp.invoke(obj, 24, Binder.getCallingUid(), context.getPackageName()); | ||
| 163 | + return result == declaredField2.getInt(cls); | ||
| 164 | + } catch (Exception e) { | ||
| 165 | + return false; | ||
| 166 | + } | ||
| 167 | + } else { | ||
| 168 | + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { | ||
| 169 | + AppOpsManager appOpsMgr = (AppOpsManager) context.getSystemService(Context.APP_OPS_SERVICE); | ||
| 170 | + if (appOpsMgr == null) | ||
| 171 | + return false; | ||
| 172 | + int mode = appOpsMgr.checkOpNoThrow("android:system_alert_window", android.os.Process.myUid(), context | ||
| 173 | + .getPackageName()); | ||
| 174 | + return mode == AppOpsManager.MODE_ALLOWED || mode == AppOpsManager.MODE_IGNORED; | ||
| 175 | + } else { | ||
| 176 | + return Settings.canDrawOverlays(context); | ||
| 177 | + } | ||
| 178 | + } | ||
| 179 | + } | ||
| 180 | + | ||
| 181 | + private void requestSettingCanDrawOverlays() { | ||
| 182 | + int sdkInt = Build.VERSION.SDK_INT; | ||
| 183 | + if (sdkInt >= Build.VERSION_CODES.O) {//8.0以上 | ||
| 184 | + Intent intent = new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION); | ||
| 185 | + startActivity(intent); | ||
| 186 | + } else if (sdkInt >= Build.VERSION_CODES.M) {//6.0-8.0 | ||
| 187 | + Intent intent = new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION); | ||
| 188 | + intent.setData(Uri.parse("package:" + getPackageName())); | ||
| 189 | + startActivity(intent); | ||
| 190 | + } else {//4.4-6.0以下 | ||
| 191 | + //无需处理了 | ||
| 192 | + } | ||
| 193 | + } | ||
| 194 | + | ||
| 134 | @Override | 195 | @Override |
| 135 | protected void initLayout() { | 196 | protected void initLayout() { |
| 136 | - if(!RKGlassDevice.getInstance().requestUSBDevicePermission()){ | 197 | + if (!checkFloatPermission(this)) { |
| 198 | + //权限请求方法 | ||
| 199 | + requestSettingCanDrawOverlays(); | ||
| 200 | + } | ||
| 201 | + if (!RKGlassDevice.getInstance().requestUSBDevicePermission()) { | ||
| 137 | toast("请到系统设置添加悬浮框权限"); | 202 | toast("请到系统设置添加悬浮框权限"); |
| 138 | finish(); | 203 | finish(); |
| 139 | } | 204 | } |
| 140 | - RKGlassDevice.getInstance().init(new OnGlassDeviceConnectListener() { | ||
| 141 | - @Override | ||
| 142 | - public void onGlassDeviceConnected(UsbDevice usbDevice) { | ||
| 143 | -// //Glass 设备连接成功 | ||
| 144 | -// addControllerView(); | ||
| 145 | - connectStatus.setValue(true); | ||
| 146 | - openAppPresentation(); | ||
| 147 | - } | ||
| 148 | - | ||
| 149 | - @Override | ||
| 150 | - public void onGlassDeviceDisconnected() { | ||
| 151 | - connectStatus.setValue(false); | ||
| 152 | - ActivityManager.getInstance().finishAllActivities(); | ||
| 153 | -// mControllerBid.setVisibility(View.GONE); | ||
| 154 | - } | ||
| 155 | - }); | ||
| 156 | 205 | ||
| 157 | - deviceInfo = RKGlassDevice.getInstance().getGlassInfo(); | ||
| 158 | super.initLayout(); | 206 | super.initLayout(); |
| 159 | if (getTitleBar() != null) { | 207 | if (getTitleBar() != null) { |
| 160 | getTitleBar().setOnTitleBarListener(this); | 208 | getTitleBar().setOnTitleBarListener(this); |
| @@ -172,6 +220,30 @@ public abstract class AppActivity extends BaseActivity | @@ -172,6 +220,30 @@ public abstract class AppActivity extends BaseActivity | ||
| 172 | //保持常亮 | 220 | //保持常亮 |
| 173 | getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); | 221 | getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); |
| 174 | EventBusManager.register(this); | 222 | EventBusManager.register(this); |
| 223 | + RKGlassDevice.getInstance().init(new OnGlassDeviceConnectListener() { | ||
| 224 | + @Override | ||
| 225 | + public void onGlassDeviceConnected(UsbDevice usbDevice) { | ||
| 226 | +// //Glass 设备连接成功 | ||
| 227 | +// addControllerView(); | ||
| 228 | + if (isDestroyed()){ | ||
| 229 | + return; | ||
| 230 | + } | ||
| 231 | + connectStatus.setValue(true); | ||
| 232 | + openAppPresentation(); | ||
| 233 | + } | ||
| 234 | + | ||
| 235 | + @Override | ||
| 236 | + public void onGlassDeviceDisconnected() { | ||
| 237 | + if (isDestroyed()){ | ||
| 238 | + return; | ||
| 239 | + } | ||
| 240 | + | ||
| 241 | + connectStatus.setValue(false); | ||
| 242 | + ActivityManager.getInstance().finishAllActivities(); | ||
| 243 | +// mControllerBid.setVisibility(View.GONE); | ||
| 244 | + } | ||
| 245 | + }); | ||
| 246 | + deviceInfo = RKGlassDevice.getInstance().getGlassInfo(); | ||
| 175 | } | 247 | } |
| 176 | 248 | ||
| 177 | /** | 249 | /** |
| @@ -289,6 +361,12 @@ public abstract class AppActivity extends BaseActivity | @@ -289,6 +361,12 @@ public abstract class AppActivity extends BaseActivity | ||
| 289 | } | 361 | } |
| 290 | 362 | ||
| 291 | @Override | 363 | @Override |
| 364 | + protected void onResume() { | ||
| 365 | + RKGlassDevice.getInstance().setDisplayMode(RKGlassDevice.GlassDisplayMode.MODE_2D); | ||
| 366 | + super.onResume(); | ||
| 367 | + } | ||
| 368 | + | ||
| 369 | + @Override | ||
| 292 | protected void onDestroy() { | 370 | protected void onDestroy() { |
| 293 | super.onDestroy(); | 371 | super.onDestroy(); |
| 294 | if (isShowDialog()) { | 372 | if (isShowDialog()) { |
| @@ -154,13 +154,13 @@ public final class AppApplication extends Application { | @@ -154,13 +154,13 @@ public final class AppApplication extends Application { | ||
| 154 | @Override | 154 | @Override |
| 155 | public void onGlassDeviceConnected(UsbDevice usbDevice) { | 155 | public void onGlassDeviceConnected(UsbDevice usbDevice) { |
| 156 | //Glass 设备连接成功 | 156 | //Glass 设备连接成功 |
| 157 | - MutableLiveData<Boolean> connectStatus = new MutableLiveData(); | ||
| 158 | - connectStatus.setValue(true); | 157 | +// MutableLiveData<Boolean> connectStatus = new MutableLiveData(); |
| 158 | +// connectStatus.setValue(true); | ||
| 159 | } | 159 | } |
| 160 | 160 | ||
| 161 | @Override | 161 | @Override |
| 162 | public void onGlassDeviceDisconnected() { | 162 | public void onGlassDeviceDisconnected() { |
| 163 | - ActivityManager.getInstance().finishAllActivities(); | 163 | +// ActivityManager.getInstance().finishAllActivities(); |
| 164 | //Glass 设备断开连接 | 164 | //Glass 设备断开连接 |
| 165 | } | 165 | } |
| 166 | }); | 166 | }); |
| @@ -2,9 +2,14 @@ package com.studymachine.www.js; | @@ -2,9 +2,14 @@ package com.studymachine.www.js; | ||
| 2 | 2 | ||
| 3 | 3 | ||
| 4 | import android.app.Activity; | 4 | import android.app.Activity; |
| 5 | +import android.content.Context; | ||
| 5 | import android.graphics.drawable.Drawable; | 6 | import android.graphics.drawable.Drawable; |
| 7 | +import android.hardware.display.DisplayManager; | ||
| 8 | +import android.os.Build; | ||
| 6 | import android.os.Handler; | 9 | import android.os.Handler; |
| 7 | import android.os.Looper; | 10 | import android.os.Looper; |
| 11 | +import android.view.Display; | ||
| 12 | +import android.view.WindowManager; | ||
| 8 | import android.webkit.JavascriptInterface; | 13 | import android.webkit.JavascriptInterface; |
| 9 | 14 | ||
| 10 | 15 | ||
| @@ -25,6 +30,7 @@ import com.studymachine.www.app.AppPresentation; | @@ -25,6 +30,7 @@ import com.studymachine.www.app.AppPresentation; | ||
| 25 | import com.studymachine.www.app.ModeHandler; | 30 | import com.studymachine.www.app.ModeHandler; |
| 26 | import com.studymachine.www.event.SwfEvent; | 31 | import com.studymachine.www.event.SwfEvent; |
| 27 | import com.studymachine.www.http.glide.GlideApp; | 32 | import com.studymachine.www.http.glide.GlideApp; |
| 33 | +import com.studymachine.www.manager.ActivityManager; | ||
| 28 | import com.studymachine.www.manager.GlobalParameterManager; | 34 | import com.studymachine.www.manager.GlobalParameterManager; |
| 29 | import com.studymachine.www.manager.UserManager; | 35 | import com.studymachine.www.manager.UserManager; |
| 30 | import com.studymachine.www.other.AppConfig; | 36 | import com.studymachine.www.other.AppConfig; |
| @@ -35,6 +41,7 @@ import com.studymachine.www.ui.activity.AiListActivity; | @@ -35,6 +41,7 @@ import com.studymachine.www.ui.activity.AiListActivity; | ||
| 35 | import com.studymachine.www.ui.activity.BrowserActivity; | 41 | import com.studymachine.www.ui.activity.BrowserActivity; |
| 36 | import com.studymachine.www.ui.activity.SwfActivity; | 42 | import com.studymachine.www.ui.activity.SwfActivity; |
| 37 | import com.studymachine.www.ui.dialog.WaitDialog; | 43 | import com.studymachine.www.ui.dialog.WaitDialog; |
| 44 | +import com.studymachine.www.ui.presentation.BrowserPresentation; | ||
| 38 | import com.studymachine.www.widget.X5WebView; | 45 | import com.studymachine.www.widget.X5WebView; |
| 39 | 46 | ||
| 40 | import org.greenrobot.eventbus.EventBus; | 47 | import org.greenrobot.eventbus.EventBus; |
| @@ -246,8 +253,10 @@ public class MainJavaScriptInterface { | @@ -246,8 +253,10 @@ public class MainJavaScriptInterface { | ||
| 246 | } | 253 | } |
| 247 | 254 | ||
| 248 | Tool.startOtherApp(mContext, packageName); | 255 | Tool.startOtherApp(mContext, packageName); |
| 256 | + ActivityManager.getInstance().finishAllActivities(); | ||
| 249 | if (presentation != null) { | 257 | if (presentation != null) { |
| 250 | presentation.dismiss(); | 258 | presentation.dismiss(); |
| 259 | + presentation = null; | ||
| 251 | } | 260 | } |
| 252 | } | 261 | } |
| 253 | 262 |
| @@ -8,6 +8,8 @@ import androidx.annotation.NonNull; | @@ -8,6 +8,8 @@ import androidx.annotation.NonNull; | ||
| 8 | import androidx.annotation.Nullable; | 8 | import androidx.annotation.Nullable; |
| 9 | import androidx.collection.ArrayMap; | 9 | import androidx.collection.ArrayMap; |
| 10 | 10 | ||
| 11 | +import com.rokid.axr.phone.glassdevice.RKGlassDevice; | ||
| 12 | + | ||
| 11 | import java.util.ArrayList; | 13 | import java.util.ArrayList; |
| 12 | 14 | ||
| 13 | import timber.log.Timber; | 15 | import timber.log.Timber; |
| @@ -122,6 +124,7 @@ public final class ActivityManager implements Application.ActivityLifecycleCallb | @@ -122,6 +124,7 @@ public final class ActivityManager implements Application.ActivityLifecycleCallb | ||
| 122 | */ | 124 | */ |
| 123 | public void finishAllActivities() { | 125 | public void finishAllActivities() { |
| 124 | finishAllActivities((Class<? extends Activity>) null); | 126 | finishAllActivities((Class<? extends Activity>) null); |
| 127 | + RKGlassDevice.getInstance().deInit(); | ||
| 125 | } | 128 | } |
| 126 | 129 | ||
| 127 | /** | 130 | /** |
| @@ -109,10 +109,13 @@ public final class BrowserActivity extends AppActivity | @@ -109,10 +109,13 @@ public final class BrowserActivity extends AppActivity | ||
| 109 | 109 | ||
| 110 | @Override | 110 | @Override |
| 111 | protected void initData() { | 111 | protected void initData() { |
| 112 | - if (deviceInfo != null && deviceInfo.getSn() != null) { | 112 | + if (deviceInfo != null && deviceInfo.getSn() != null && deviceInfo.isvSyncStatus()) { |
| 113 | mControlBack = findViewById(R.id.control_back); | 113 | mControlBack = findViewById(R.id.control_back); |
| 114 | mControlChange = findViewById(R.id.control_change); | 114 | mControlChange = findViewById(R.id.control_change); |
| 115 | mControlMode = findViewById(R.id.control_mode); | 115 | mControlMode = findViewById(R.id.control_mode); |
| 116 | + if (mControlBack == null){ | ||
| 117 | + return; | ||
| 118 | + } | ||
| 116 | mControlBack.setVisibility(View.VISIBLE); | 119 | mControlBack.setVisibility(View.VISIBLE); |
| 117 | mControlChange.setVisibility(View.VISIBLE); | 120 | mControlChange.setVisibility(View.VISIBLE); |
| 118 | mControlMode.setVisibility(View.GONE); | 121 | mControlMode.setVisibility(View.GONE); |
| @@ -211,10 +214,17 @@ public final class BrowserActivity extends AppActivity | @@ -211,10 +214,17 @@ public final class BrowserActivity extends AppActivity | ||
| 211 | } else { | 214 | } else { |
| 212 | presentation.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_OVERLAY); | 215 | presentation.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_OVERLAY); |
| 213 | } | 216 | } |
| 217 | + } else { | ||
| 218 | + return; | ||
| 214 | } | 219 | } |
| 215 | } | 220 | } |
| 216 | presentation.setOwnerActivity(this); | 221 | presentation.setOwnerActivity(this); |
| 217 | - presentation.show(); | 222 | + try { |
| 223 | + presentation.show(); | ||
| 224 | + } catch (Exception e) { | ||
| 225 | + presentation.dismiss(); | ||
| 226 | + presentation.show(); | ||
| 227 | + } | ||
| 218 | presentation.setMode(0); | 228 | presentation.setMode(0); |
| 219 | } | 229 | } |
| 220 | 230 |
| @@ -41,10 +41,10 @@ public final class RestartActivity extends AppActivity { | @@ -41,10 +41,10 @@ public final class RestartActivity extends AppActivity { | ||
| 41 | Intent intent; | 41 | Intent intent; |
| 42 | if (UserManager.getInstance().getToken()==null) { | 42 | if (UserManager.getInstance().getToken()==null) { |
| 43 | // 如果是未登录的情况下跳转到闪屏页 | 43 | // 如果是未登录的情况下跳转到闪屏页 |
| 44 | - intent = new Intent(context, LoginActivity.class); | 44 | + intent = new Intent(context, SplashActivity.class); |
| 45 | } else { | 45 | } else { |
| 46 | // 如果是已登录的情况下跳转到首页 | 46 | // 如果是已登录的情况下跳转到首页 |
| 47 | - intent = new Intent(context, HomeActivity.class); | 47 | + intent = new Intent(context, SplashActivity.class); |
| 48 | } | 48 | } |
| 49 | if (!(context instanceof Activity)) { | 49 | if (!(context instanceof Activity)) { |
| 50 | intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); | 50 | intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); |
| @@ -2,9 +2,11 @@ package com.studymachine.www.ui.presentation; | @@ -2,9 +2,11 @@ package com.studymachine.www.ui.presentation; | ||
| 2 | 2 | ||
| 3 | import static com.hjq.http.EasyUtils.post; | 3 | import static com.hjq.http.EasyUtils.post; |
| 4 | 4 | ||
| 5 | +import android.app.Activity; | ||
| 5 | import android.content.Context; | 6 | import android.content.Context; |
| 6 | import android.graphics.Bitmap; | 7 | import android.graphics.Bitmap; |
| 7 | import android.graphics.drawable.BitmapDrawable; | 8 | import android.graphics.drawable.BitmapDrawable; |
| 9 | +import android.os.Build; | ||
| 8 | import android.os.Message; | 10 | import android.os.Message; |
| 9 | import android.view.Display; | 11 | import android.view.Display; |
| 10 | import android.view.View; | 12 | import android.view.View; |