diff --git a/app/src/main/java/com/aoleyun/sn/activity/main/MainActivity.java b/app/src/main/java/com/aoleyun/sn/activity/main/MainActivity.java index f6bb1e7..1112971 100644 --- a/app/src/main/java/com/aoleyun/sn/activity/main/MainActivity.java +++ b/app/src/main/java/com/aoleyun/sn/activity/main/MainActivity.java @@ -28,6 +28,7 @@ import com.aoleyun.sn.activity.debug.DebugActivity; import com.aoleyun.sn.activity.update.UpdateActivity; import com.aoleyun.sn.base.mvvm.BaseMvvmActivity; import com.aoleyun.sn.bean.AppSettings; +import com.aoleyun.sn.bean.SnInfo; import com.aoleyun.sn.bean.StudentsInfo; import com.aoleyun.sn.comm.CommonConfig; import com.aoleyun.sn.comm.JGYActions; @@ -41,6 +42,7 @@ import com.aoleyun.sn.utils.GlideLoadUtils; import com.aoleyun.sn.utils.JgyUtils; import com.aoleyun.sn.utils.SPUtils; import com.aoleyun.sn.utils.SysSettingUtils; +import com.aoleyun.sn.utils.TimeUtils; import com.aoleyun.sn.utils.Utils; import com.blankj.utilcode.util.NetworkUtils; import com.bumptech.glide.Glide; @@ -48,6 +50,11 @@ import com.google.gson.JsonObject; import com.hjq.toast.Toaster; import com.tencent.mmkv.MMKV; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.Locale; + public class MainActivity extends BaseMvvmActivity implements NetworkUtils.OnNetworkStatusChangedListener { private static final String TAG = "MainActivity"; @@ -239,7 +246,7 @@ public class MainActivity extends BaseMvvmActivity dialog.dismiss()); + mExpireDialog = builder.create(); + if (!this.isFinishing() && !mExpireDialog.isShowing()) { + mExpireDialog.show(); + } + } + + /** + * 将服务端返回的过期时间字符串解析为毫秒时间戳 + * 兼容:纯数字秒(10位)/毫秒(13位)时间戳,或 yyyy-MM-dd HH:mm:ss 等常见日期格式 + * 解析失败返回0(表示无需处理) + */ + private long parseExpireAtToMillis(String expire_at) { + if (TextUtils.isEmpty(expire_at)) { + return 0; + } + String time = expire_at.trim(); + //纯数字时间戳 + if (TextUtils.isDigitsOnly(time)) { + try { + long value = Long.parseLong(time); + if (time.length() == 10) { + return value * 1000;//秒 + } else if (time.length() == 13) { + return value;//毫秒 + } + } catch (NumberFormatException e) { + Log.e(TAG, "parseExpireAtToMillis: " + e.getMessage()); + } + return 0; + } + //日期格式 + String[] patterns = { + "yyyy-MM-dd HH:mm:ss", + "yyyy-MM-dd HH:mm", + "yyyy-MM-dd", + "yyyy/MM/dd HH:mm:ss", + "yyyy/MM/dd HH:mm", + "yyyy/MM/dd", + "yyyy-MM-dd'T'HH:mm:ss", + "yyyy-MM-dd'T'HH:mm:ss.SSS" + }; + for (String pattern : patterns) { + try { + SimpleDateFormat sdf = new SimpleDateFormat(pattern, Locale.getDefault()); + sdf.setLenient(false); + Date date = sdf.parse(time); + if (date != null) { + return date.getTime(); + } + } catch (ParseException e) { + //尝试下一种格式 + } + } + Log.e(TAG, "parseExpireAtToMillis: 无法解析的过期时间格式 = " + expire_at); + return 0; + } + @Override public void initData() { Log.e("getMacAddress", Utils.getAndroid10MAC(this)); @@ -296,6 +372,7 @@ public class MainActivity extends BaseMvvmActivity() { + @Override + public void onChanged(SnInfo snInfo) { + if (snInfo == null) { + return; + } + String expire_at = snInfo.getExpire_at(); + Log.e(TAG, "mSnInfoData onChanged: " + expire_at); + long expireTime = parseExpireAtToMillis(expire_at); + Log.e(TAG, "mSnInfoData onChanged: expireTime = " + expireTime + ", now = " + System.currentTimeMillis()); + if (expireTime > 0 && expireTime <= System.currentTimeMillis()) { + Log.e(TAG, "mSnInfoData onChanged: 设备已过期"); + showExpireDialog("设备服务已过期,过期时间:" + TimeUtils.transferLongToDate(expireTime) + ",请联系管理员处理!"); + } + } + }); } MainService.MainBinder mMainBinder; @@ -509,6 +602,9 @@ public class MainActivity extends BaseMvvmActivity mSnInfoData = new MutableLiveData<>(); + + public void getSnInfo() { + NetInterfaceManager.getInstance().getSnInfoControl() + .compose(RxLifecycle.bindUntilEvent(getLifecycle(), ActivityEvent.DESTROY)) + .subscribe(new Observer>() { + @Override + public void onSubscribe(@NonNull Disposable d) { + Log.e("getSnInfo", "onSubscribe: "); + } + + @Override + public void onNext(BaseResponse response) { + Log.e("getSnInfo", "onNext: " + response); + mSnInfoData.setValue(response.data); + } + + @Override + public void onError(@NonNull Throwable e) { + Log.e("getSnInfo", "onError: "); + } + + @Override + public void onComplete() { + Log.e("getSnInfo", "onComplete: "); + } + }); + } } diff --git a/app/src/main/java/com/aoleyun/sn/bean/SnInfo.java b/app/src/main/java/com/aoleyun/sn/bean/SnInfo.java new file mode 100644 index 0000000..2b2ef9a --- /dev/null +++ b/app/src/main/java/com/aoleyun/sn/bean/SnInfo.java @@ -0,0 +1,55 @@ +package com.aoleyun.sn.bean; + +import java.io.Serializable; + +public class SnInfo implements Serializable { + int control_status; + + int is_log; + + int is_log_type; + + int is_screen_lock; + + String expire_at; + + public int getControl_status() { + return control_status; + } + + public void setControl_status(int control_status) { + this.control_status = control_status; + } + + public int getIs_log() { + return is_log; + } + + public void setIs_log(int is_log) { + this.is_log = is_log; + } + + public int getIs_log_type() { + return is_log_type; + } + + public void setIs_log_type(int is_log_type) { + this.is_log_type = is_log_type; + } + + public int getIs_screen_lock() { + return is_screen_lock; + } + + public void setIs_screen_lock(int is_screen_lock) { + this.is_screen_lock = is_screen_lock; + } + + public String getExpire_at() { + return expire_at; + } + + public void setExpire_at(String expire_at) { + this.expire_at = expire_at; + } +} \ No newline at end of file diff --git a/app/src/main/java/com/aoleyun/sn/network/NetInterfaceManager.java b/app/src/main/java/com/aoleyun/sn/network/NetInterfaceManager.java index b31dca5..2f3df50 100644 --- a/app/src/main/java/com/aoleyun/sn/network/NetInterfaceManager.java +++ b/app/src/main/java/com/aoleyun/sn/network/NetInterfaceManager.java @@ -55,6 +55,7 @@ import com.aoleyun.sn.bean.NetAndLaunchData; import com.aoleyun.sn.bean.PoweroffBean; import com.aoleyun.sn.bean.PushTag; import com.aoleyun.sn.bean.ScreenLockState; +import com.aoleyun.sn.bean.SnInfo; import com.aoleyun.sn.bean.SnRunLog; import com.aoleyun.sn.bean.SnSetting; import com.aoleyun.sn.bean.SnTimeControl; @@ -669,6 +670,10 @@ public class NetInterfaceManager { 1440 * CACHE_EXPIRE_ONE_MINUTE); } + public Observable> getSnInfoControl() { + return schedule(getDevicesStatusApi().getSnInfo(Utils.getSerial(mContext))); + } + public Observable> getSnRunLogControl() { return schedule(getLogApi().getSnRunLog(Utils.getSerial(mContext))); } diff --git a/app/src/main/java/com/aoleyun/sn/network/UrlAddress.java b/app/src/main/java/com/aoleyun/sn/network/UrlAddress.java index 6cd07ac..260fed2 100644 --- a/app/src/main/java/com/aoleyun/sn/network/UrlAddress.java +++ b/app/src/main/java/com/aoleyun/sn/network/UrlAddress.java @@ -25,6 +25,8 @@ public class UrlAddress { public static final String GET_EBAG_CODE = "And/getEbagCode"; /*绑定设备*/ public static final String SN_CONFIRM_BIND = "And/sn/snConfirmBind"; + /*获取设备信息设置*/ + public static final String GET_SN_INFO = "And/sn/getSnInfo"; /*网课模式*/ public final static String GET_CLOUD_LESSON = "And/control/getCloudLessonSetting"; diff --git a/app/src/main/java/com/aoleyun/sn/network/api/aoleyun/DevicesStatusApi.java b/app/src/main/java/com/aoleyun/sn/network/api/aoleyun/DevicesStatusApi.java index 301ad68..cb03089 100644 --- a/app/src/main/java/com/aoleyun/sn/network/api/aoleyun/DevicesStatusApi.java +++ b/app/src/main/java/com/aoleyun/sn/network/api/aoleyun/DevicesStatusApi.java @@ -6,6 +6,7 @@ import com.aoleyun.sn.bean.DeveloperBean; import com.aoleyun.sn.bean.EBagCode; import com.aoleyun.sn.bean.PushTag; import com.aoleyun.sn.bean.ScreenLockState; +import com.aoleyun.sn.bean.SnInfo; import com.aoleyun.sn.bean.StudentsInfo; import com.aoleyun.sn.network.UrlAddress; @@ -65,4 +66,9 @@ public interface DevicesStatusApi { @Field("type") int type ); + @GET(UrlAddress.GET_SN_INFO) + Observable> getSnInfo( + @Query("sn") String sn + ); + } \ No newline at end of file