diff --git a/app/build.gradle b/app/build.gradle index 5dcbd17..a41d9c5 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -61,14 +61,8 @@ android { v1SigningEnabled true v2SigningEnabled true } - debug { - storeFile file("src/doc/xueshibaoos.jks") - storePassword "123456" - keyAlias "xueshibaoos" - keyPassword "123456" - v2SigningEnabled false - } - release {// 签名文件 + + mtk { storeFile file("src/doc/xueshibaoos.jks") storePassword "123456" keyAlias "xueshibaoos" @@ -92,6 +86,7 @@ android { debuggable true signingConfig signingConfigs.zhanRui } + debug { // 显示Log buildConfigField "boolean", "LOG_DEBUG", "true" @@ -99,7 +94,7 @@ android { minifyEnabled false //Zipalign优化 zipAlignEnabled true - signingConfig signingConfigs.debug + signingConfig signingConfigs.mtk applicationVariants.all { variant -> variant.outputs.each { output -> if (outputFile != null) { @@ -109,6 +104,7 @@ android { } } } + release { // 不显示Log buildConfigField "boolean", "LOG_DEBUG", "false" @@ -119,7 +115,7 @@ android { //前一部分代表系统默认的android程序的混淆文件,该文件已经包含了基本的混淆声明,后一个文件是自己的定义混淆文件 proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' //签名 - signingConfig signingConfigs.release + signingConfig signingConfigs.mtk // 将release版本的包名重命名,加上版本及日期 applicationVariants.all { variant -> variant.outputs.each { output -> @@ -191,7 +187,7 @@ dependencies { implementation 'com.amap.api:location:5.1.0' //MMKV implementation 'com.tencent:mmkv-static:1.2.12' - implementation 'com.tencent.tpns:tpns:1.3.6.0-release' + implementation 'com.tencent.tpns:tpns:1.3.6.1-release' //状态栏透明 implementation 'com.gitee.zackratos:UltimateBarX:0.8.0' //指示器 diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index b4bff93..0d0150b 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -72,7 +72,7 @@ healthCodes) { @@ -86,44 +91,31 @@ public class CodeActivity extends BaseActivity { mHealthCodeAdapter.notifyDataSetChanged(); } + @Override + public void setHealthCode(List codeList) { + NetInterfaceManager.getInstance().getHealthCode(true, lifecycleSubject, new NetInterfaceManager.HealthCodeCallback() { + @Override + public void setHealthCode(List healthCode) { + setImageViews(healthCode); + mViewPager.setVisibility(View.VISIBLE); + mMagicIndicator.setVisibility(View.VISIBLE); + iv_nodata.setVisibility(View.GONE); + } - private void getHealthCode() { - NetInterfaceManager.getInstance().getHealthCodeApi() - .getArticleDetails(Utils.getSerial()) - .subscribeOn(Schedulers.io()) - .observeOn(AndroidSchedulers.mainThread()) - .compose(RxLifecycle.bindUntilEvent(lifecycleSubject, ActivityEvent.DESTROY)) - .subscribe(new Observer>>() { - @Override - public void onSubscribe(@NonNull Disposable d) { - Log.e("getHealthCode", "onSubscribe: "); - } + @Override + public void noData() { + mViewPager.setVisibility(View.GONE); + mMagicIndicator.setVisibility(View.GONE); + iv_nodata.setVisibility(View.VISIBLE); + } - @Override - public void onNext(@NonNull BaseResponse> listBaseResponse) { - Log.e("getHealthCode", "onNext: " + listBaseResponse); - if (listBaseResponse.code == 200) { - List healthCodeList = listBaseResponse.data; - setImageViews(healthCodeList); - mViewPager.setVisibility(View.VISIBLE); - mMagicIndicator.setVisibility(View.VISIBLE); - iv_nodata.setVisibility(View.GONE); - } else { - mViewPager.setVisibility(View.GONE); - mMagicIndicator.setVisibility(View.GONE); - iv_nodata.setVisibility(View.VISIBLE); - } - } - - @Override - public void onError(@NonNull Throwable e) { - Log.e("getHealthCode", "onError: "); - } - - @Override - public void onComplete() { - Log.e("getHealthCode", "onComplete: "); - } - }); + @Override + public void onError() { + ToastUtil.show("网络连接失败"); + mViewPager.setVisibility(View.GONE); + mMagicIndicator.setVisibility(View.GONE); + iv_nodata.setVisibility(View.VISIBLE); + } + }); } } diff --git a/app/src/main/java/com/uiui/aios/activity/code/HealthCodeContact.java b/app/src/main/java/com/uiui/aios/activity/code/HealthCodeContact.java new file mode 100644 index 0000000..8e6fc3a --- /dev/null +++ b/app/src/main/java/com/uiui/aios/activity/code/HealthCodeContact.java @@ -0,0 +1,17 @@ +package com.uiui.aios.activity.code; + +import com.uiui.aios.base.BasePresenter; +import com.uiui.aios.base.BaseView; +import com.uiui.aios.bean.HealthCode; + +import java.util.List; + +public class HealthCodeContact { + public interface Presenter extends BasePresenter { + void getHealthCode(); + } + + public interface CodeView extends BaseView { + void setHealthCode(List codeList); + } +} diff --git a/app/src/main/java/com/uiui/aios/activity/code/HealthCodePresenter.java b/app/src/main/java/com/uiui/aios/activity/code/HealthCodePresenter.java new file mode 100644 index 0000000..3108ee7 --- /dev/null +++ b/app/src/main/java/com/uiui/aios/activity/code/HealthCodePresenter.java @@ -0,0 +1,49 @@ +package com.uiui.aios.activity.code; + +import android.content.Context; +import android.util.Log; + +import androidx.annotation.NonNull; + +import com.trello.rxlifecycle4.android.ActivityEvent; + +import io.reactivex.rxjava3.subjects.BehaviorSubject; + +public class HealthCodePresenter implements HealthCodeContact.Presenter { + private static final String TAG = HealthCodePresenter.class.getSimpleName(); + private HealthCodeContact.CodeView mView; + + private Context mContext; + + private BehaviorSubject lifecycle; + + void setLifecycle(BehaviorSubject lifecycle) { + this.lifecycle = lifecycle; + } + + public BehaviorSubject getLifecycle() { + return lifecycle; + } + + HealthCodePresenter(Context context) { + this.mContext = context; + Log.e(TAG, "MainPresenter: " + context.getClass()); + } + + + @Override + public void attachView(@NonNull HealthCodeContact.CodeView view) { + this.mView = view; + } + + @Override + public void detachView() { + this.mView = null; + } + + + @Override + public void getHealthCode() { + + } +} diff --git a/app/src/main/java/com/uiui/aios/activity/main/MainContact.java b/app/src/main/java/com/uiui/aios/activity/main/MainContact.java index 9248745..973c3e6 100644 --- a/app/src/main/java/com/uiui/aios/activity/main/MainContact.java +++ b/app/src/main/java/com/uiui/aios/activity/main/MainContact.java @@ -4,7 +4,7 @@ import com.uiui.aios.base.BasePresenter; import com.uiui.aios.base.BaseView; public class MainContact { - public interface Presenter extends BasePresenter { + public interface Presenter extends BasePresenter { /*获取桌面布局*/ void getDesktopLayout(); /*更新桌面布局*/ diff --git a/app/src/main/java/com/uiui/aios/fragment/CustomFragment.java b/app/src/main/java/com/uiui/aios/fragment/CustomFragment.java index 2a0f059..8952de9 100644 --- a/app/src/main/java/com/uiui/aios/fragment/CustomFragment.java +++ b/app/src/main/java/com/uiui/aios/fragment/CustomFragment.java @@ -31,7 +31,6 @@ import com.amap.api.location.AMapLocation; import com.amap.api.location.AMapLocationListener; import com.blankj.utilcode.util.NetworkUtils; import com.google.gson.Gson; -import com.google.gson.reflect.TypeToken; import com.qweather.sdk.bean.base.Code; import com.qweather.sdk.bean.base.Lang; import com.qweather.sdk.bean.base.Unit; @@ -41,7 +40,7 @@ import com.qweather.sdk.view.QWeather; import com.tencent.mmkv.MMKV; import com.uiui.aios.BuildConfig; import com.uiui.aios.R; -import com.uiui.aios.activity.CodeActivity; +import com.uiui.aios.activity.code.HealthCodeActivity; import com.uiui.aios.activity.EmergencyActivity; import com.uiui.aios.activity.alarm.AlarmClockActivity; import com.uiui.aios.activity.weather.WeatherActivity; @@ -57,7 +56,6 @@ import com.uiui.aios.utils.SchemeUtils; import com.uiui.aios.utils.Utils; import java.lang.reflect.Method; -import java.lang.reflect.Type; import java.util.ArrayList; import java.util.Arrays; import java.util.List; @@ -356,7 +354,7 @@ public class CustomFragment extends Fragment implements NetworkUtils.OnNetworkSt mClHealth.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { - startActivity(new Intent(getActivity(), CodeActivity.class)); + startActivity(new Intent(getActivity(), HealthCodeActivity.class)); // SchemeUtils.openScheme(getActivity(), SchemeUtils.SCHEME_TONGUE); } }); diff --git a/app/src/main/java/com/uiui/aios/manager/ConnectManager.java b/app/src/main/java/com/uiui/aios/manager/ConnectManager.java new file mode 100644 index 0000000..e7577dc --- /dev/null +++ b/app/src/main/java/com/uiui/aios/manager/ConnectManager.java @@ -0,0 +1,134 @@ +package com.uiui.aios.manager; + +import android.annotation.SuppressLint; +import android.content.Context; +import android.util.Log; + +import com.tencent.mmkv.MMKV; +import com.uiui.aios.utils.TimeUtils; + +public class ConnectManager { + private static final String TAG = ConnectManager.class.getSimpleName(); + + + public static final long ONE_MINUTES_TIME = 60 * 1000; + public static final long FIFTEEN_MINUTES_TIME = ONE_MINUTES_TIME * 15; + public static final long HALF_HOUR_TIME = FIFTEEN_MINUTES_TIME * 2; + public static final long ONE_HOUR_TIME = HALF_HOUR_TIME * 2; + public static final long SIX_HOUR_TIME = ONE_HOUR_TIME * 6; + public static final long HALF_DAY_TIME = SIX_HOUR_TIME * 2; + public static final long ONE_DAY_TIME = HALF_DAY_TIME * 2; + + /*重启后连接成功的时间*/ + public static final String REBOOT_LAST_ONNECT_TIME = "reboot_last_connect_time"; + /*WiFi连接后连接成功的时间*/ + public static final String WIFI_LAST_CONNECT_TIME = "WiFi_last_connect_time"; + /*打开设备信息连接成功的时间*/ + public static final String OPENINFO_LAST_ONNECT_TIME = "opneinfo_last_connect_time"; + + + @SuppressLint("StaticFieldLeak") + private static ConnectManager sInstance; + private Context mContext; + private MMKV mMMKV = MMKV.defaultMMKV(); + + private ConnectManager(Context context) { + if (context == null) { + throw new RuntimeException("Context is NULL"); + } + this.mContext = context; + + } + + public static void init(Context context) { + if (sInstance == null) { + Log.e(TAG, "init: "); + sInstance = new ConnectManager(context); + } + } + + public static ConnectManager getInstance() { + if (sInstance == null) { + throw new IllegalStateException("You must be init ConnectManager first"); + } + return sInstance; + } + + public long getConnectModeTime(ConnectMode connectMode) { + long time = 0; + switch (connectMode) { + case DEFAULT: + time = 0; + break; + case ONE_MINUTE: + time = ONE_MINUTES_TIME; + break; + case FIFTEEN_MINUTES: + time = FIFTEEN_MINUTES_TIME; + break; + case HALF_HOUR: + time = HALF_HOUR_TIME; + break; + case ONE_HOUR: + time = ONE_HOUR_TIME; + break; + case SIX_HOUR: + time = SIX_HOUR_TIME; + break; + case HALF_DAY: + time = HALF_DAY_TIME; + break; + case ONE_DAY: + time = ONE_DAY_TIME; + break; + default: + } + return time; + } + + public boolean isNeedConnect(String key, ConnectMode connectMode) { + long nowTime = System.currentTimeMillis(); + long lastTime = mMMKV.decodeLong(key, 0); + long intervalTime = getConnectModeTime(connectMode); + //防止一分钟内重复请求 + return nowTime - lastTime > intervalTime && nowTime - lastTime > ONE_MINUTES_TIME; + } + + + /** + * @return 重启后是否连接 + */ + public boolean isRebootFistConnect() { + long rebootTime = mMMKV.decodeLong(REBOOT_LAST_ONNECT_TIME, 0); + //只在开机后15内连接,其他情况为service重启 + long time = System.currentTimeMillis() - rebootTime; + return time < 15 * 1000; + } + + /** + * @return 今天WiFi连接是否有连接 + */ + public boolean isWiFiFistConnect() { + long time = mMMKV.decodeLong(WIFI_LAST_CONNECT_TIME, 0); + return !TimeUtils.isTodayTime(time); + } + + /** + * @return 今天打开设备信息后是否连接 + */ + public boolean isOpenInfoFistConnect() { + long time = mMMKV.decodeLong(OPENINFO_LAST_ONNECT_TIME, 0); + return !TimeUtils.isTodayTime(time); + } + + /** + * @param WiFiAlias + * @return 今天切换WiFi后是否连接 + */ + public boolean isWiFiCutoverFistConnect(String WiFiAlias) { + long time = mMMKV.decodeLong(WiFiAlias, 0); + return !TimeUtils.isTodayTime(time); + } + + +} diff --git a/app/src/main/java/com/uiui/aios/manager/ConnectMode.java b/app/src/main/java/com/uiui/aios/manager/ConnectMode.java new file mode 100644 index 0000000..ea36582 --- /dev/null +++ b/app/src/main/java/com/uiui/aios/manager/ConnectMode.java @@ -0,0 +1,12 @@ +package com.uiui.aios.manager; + +public enum ConnectMode { + DEFAULT, + ONE_MINUTE, + FIFTEEN_MINUTES, + HALF_HOUR, + ONE_HOUR, + SIX_HOUR, + HALF_DAY, + ONE_DAY, +} \ No newline at end of file diff --git a/app/src/main/java/com/uiui/aios/network/NetInterfaceManager.java b/app/src/main/java/com/uiui/aios/network/NetInterfaceManager.java index 89c561a..625a371 100644 --- a/app/src/main/java/com/uiui/aios/network/NetInterfaceManager.java +++ b/app/src/main/java/com/uiui/aios/network/NetInterfaceManager.java @@ -3,7 +3,10 @@ package com.uiui.aios.network; import android.annotation.SuppressLint; import android.content.Context; import android.util.Log; +import android.view.View; +import com.google.gson.Gson; +import com.google.gson.reflect.TypeToken; import com.tencent.mmkv.MMKV; import com.trello.rxlifecycle4.RxLifecycle; import com.trello.rxlifecycle4.android.ActivityEvent; @@ -13,9 +16,12 @@ import com.uiui.aios.bean.ArticleInfo; import com.uiui.aios.bean.BaseResponse; import com.uiui.aios.bean.DemandBean; import com.uiui.aios.bean.GoodsInfo; +import com.uiui.aios.bean.HealthCode; import com.uiui.aios.bean.NetDesktopIcon; import com.uiui.aios.bean.UserId; import com.uiui.aios.disklrucache.CacheHelper; +import com.uiui.aios.manager.ConnectManager; +import com.uiui.aios.manager.ConnectMode; import com.uiui.aios.network.api.ActivityListApi; import com.uiui.aios.network.api.AlarmClockApi; import com.uiui.aios.network.api.AppUsageRecordApi; @@ -39,6 +45,7 @@ import org.jetbrains.annotations.NotNull; import java.io.File; import java.io.IOException; +import java.lang.reflect.Type; import java.util.List; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.TimeUnit; @@ -282,14 +289,14 @@ public class NetInterfaceManager { public Observable>> getActivityListObservable() { return mRetrofit.create(ActivityListApi.class) - .getActivityList(Utils.getSerial(), 1, 1,getUserId()) + .getActivityList(Utils.getSerial(), 1, 1, getUserId()) .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()); } public Observable>> getDemandListObservable() { return mRetrofit.create(DemandListApi.class) - .getDemandList(Utils.getSerial(), 1, 1,getUserId()) + .getDemandList(Utils.getSerial(), 1, 1, getUserId()) .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()); } @@ -303,7 +310,80 @@ public class NetInterfaceManager { return mRetrofit.create(SendScreenshotApi.class); } - public HealthCodeApi getHealthCodeApi() { - return mRetrofit.create(HealthCodeApi.class); + public Observable>> getHealthCodeObservable() { + return mRetrofit.create(HealthCodeApi.class) + .getArticleDetails(Utils.getSerial()) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()); } + + public interface HealthCodeCallback { + void setHealthCode(List healthCode); + + void noData(); + + void onError(); + } + + public void getHealthCode(boolean refresh, BehaviorSubject lifecycle, HealthCodeCallback callback) { + ConnectMode connectMode = ConnectMode.ONE_HOUR; + if (refresh) { + connectMode = ConnectMode.DEFAULT; + } + if (ConnectManager.getInstance().isNeedConnect(URLAddress.GET_HEALTH_CODE, connectMode)) { + getHealthCode(lifecycle, callback); + } else { + String jsonString = mCacheHelper.getAsString(URLAddress.GET_HEALTH_CODE); + //为 "" 是已经请求成功的 + if (jsonString == null) { + getHealthCode(lifecycle, callback); + } else { + Gson gson = new Gson(); + Type type = new TypeToken() { + }.getType(); + List healthCodeList = gson.fromJson(jsonString, type); + if (healthCodeList == null || healthCodeList.size() == 0) { + callback.noData(); + } else { + callback.setHealthCode(healthCodeList); + } + } + } + } + + public void getHealthCode(BehaviorSubject lifecycle, HealthCodeCallback callback) { + getHealthCodeObservable() + .compose(RxLifecycle.bindUntilEvent(lifecycle, ActivityEvent.DESTROY)) + .subscribe(new Observer>>() { + @Override + public void onSubscribe(@NonNull Disposable d) { + Log.e("getHealthCode", "onSubscribe: "); + } + + @Override + public void onNext(@NonNull BaseResponse> listBaseResponse) { + Log.e("getHealthCode", "onNext: " + listBaseResponse); + if (listBaseResponse.code == 200) { + List healthCodeList = listBaseResponse.data; + callback.setHealthCode(healthCodeList); + } else { + callback.noData(); + } + } + + @Override + public void onError(@NonNull Throwable e) { + Log.e("getHealthCode", "onError: "); + callback.onError(); + onComplete(); + } + + @Override + public void onComplete() { + Log.e("getHealthCode", "onComplete: "); + } + }); + } + + } diff --git a/app/src/main/java/com/uiui/aios/utils/TimeUtils.java b/app/src/main/java/com/uiui/aios/utils/TimeUtils.java new file mode 100644 index 0000000..70b3712 --- /dev/null +++ b/app/src/main/java/com/uiui/aios/utils/TimeUtils.java @@ -0,0 +1,29 @@ +package com.uiui.aios.utils; + +import android.os.Build; + +import androidx.annotation.RequiresApi; + +import java.text.SimpleDateFormat; +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; +import java.util.Date; + +public class TimeUtils { + @RequiresApi(api = Build.VERSION_CODES.O) + public static boolean isTodayTime(long timeStamp) { + String time = transferLongToDate(timeStamp); + DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); + LocalDateTime localTime = LocalDateTime.parse(time, dtf); + LocalDateTime startTime = LocalDate.now().atTime(0, 0, 0); + LocalDateTime endTime = LocalDate.now().atTime(23, 59, 59); + return localTime.isAfter(startTime) && localTime.isBefore(endTime); + } + + public static String transferLongToDate(Long millSec) { + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + Date date = new Date(millSec); + return sdf.format(date); + } +} diff --git a/app/src/main/res/layout-land/activity_code.xml b/app/src/main/res/layout-land/activity_code.xml index 99086d9..f5d8be8 100644 --- a/app/src/main/res/layout-land/activity_code.xml +++ b/app/src/main/res/layout-land/activity_code.xml @@ -4,7 +4,7 @@ xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" - tools:context=".activity.CodeActivity"> + tools:context=".activity.code.HealthCodeActivity"> + tools:context=".activity.code.HealthCodeActivity">