diff --git a/app/build.gradle b/app/build.gradle index 7bebe5e..94e6821 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -1,22 +1,25 @@ apply plugin: 'com.android.application' +apply plugin: 'kotlin-android' +apply plugin: 'kotlin-android-extensions' +apply plugin: 'kotlin-kapt' def appName() { return "SnInfo" } def releaseTime() { - return new Date().format("yyyyMMddHHmm", TimeZone.getDefault()) + return new Date().format("yyyyMMdd", TimeZone.getDefault()) } android { - compileSdkVersion 28 + compileSdkVersion 29 buildToolsVersion "29.0.3" defaultConfig { applicationId "com.info.sn" - minSdkVersion 23 - targetSdkVersion 28 - versionCode 35 - versionName "1.3.5" + minSdkVersion 24 + targetSdkVersion 29 + versionCode 61 + versionName "1.6.1" multiDexEnabled true testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" ndk { @@ -29,7 +32,12 @@ android { JPUSH_APPKEY : "edf9cec22731b8b2fed56ee6", //JPush 上注册的包名对应的 Appkey. JPUSH_CHANNEL: "developer-default", //暂时填写默认值即可. ] - + buildConfigField "String", "SCREEN_URL", '"https://homework.uiuios.com:3018/wm/is_online"' + javaCompileOptions { + annotationProcessorOptions { + includeCompileClasspath true + } + } } compileOptions { @@ -43,9 +51,11 @@ android { proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' } } + lintOptions { checkReleaseBuilds false } + //签名 signingConfigs { zhanRui { @@ -56,19 +66,23 @@ android { v1SigningEnabled true v2SigningEnabled true } + debug { storeFile file("src/keys/xueshibaoos.jks") storePassword "123456" keyAlias "xueshibaoos" keyPassword "123456" - v2SigningEnabled false + v1SigningEnabled true + v2SigningEnabled true } + release {// 签名文件 storeFile file("src/keys/xueshibaoos.jks") storePassword "123456" keyAlias "xueshibaoos" keyPassword "123456" - v2SigningEnabled false + v1SigningEnabled true + v2SigningEnabled true } } @@ -77,6 +91,9 @@ android { zhanRuiRelease { buildConfigField "String", "platform", '"ZhanRui"' signingConfig signingConfigs.zhanRui + manifestPlaceholders = [ + AMAP_KEY: "8c4e1d478cb91e6b5713562bc424efba" + ] } zhanRuiDebug.initWith(debug) @@ -85,6 +102,9 @@ android { buildConfigField "String", "platform", '"ZhanRui"' debuggable true signingConfig signingConfigs.zhanRui + manifestPlaceholders = [ + AMAP_KEY: "8c4e1d478cb91e6b5713562bc424efba" + ] } debug { @@ -102,6 +122,9 @@ android { } } } + manifestPlaceholders = [ + AMAP_KEY: "83869aed8624eb00615c2b6d3d15d777" + ] } release { @@ -124,27 +147,31 @@ android { } } } + manifestPlaceholders = [ + AMAP_KEY: "83869aed8624eb00615c2b6d3d15d777" + ] } } + lintOptions { checkReleaseBuilds false // Or, if you prefer, you can continue to check for errors in release builds, // but continue the build even when errors are found: abortOnError false } - - } dependencies { - implementation fileTree(dir: 'libs', include: ['*.jar']) +// implementation fileTree(dir: 'libs', include: ['*.jar']) + implementation 'androidx.legacy:legacy-support-v4:1.0.0' compileOnly files('src/main/libs/classes.jar') - implementation 'androidx.appcompat:appcompat:1.2.0' + implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version" + implementation 'androidx.appcompat:appcompat:1.3.1' //implementation 'com.android.support:multidex:1.0.3' implementation 'androidx.constraintlayout:constraintlayout:2.0.4' - testImplementation 'junit:junit:4.13.1' - androidTestImplementation 'androidx.test.ext:junit:1.1.2' - androidTestImplementation 'androidx.test.espresso:espresso-core:3.3.0' + testImplementation 'junit:junit:4.13.2' + androidTestImplementation 'androidx.test.ext:junit:1.1.3' + androidTestImplementation 'androidx.test.espresso:espresso-core:3.4.0' //极光推送 implementation 'cn.jiguang.sdk:jpush:3.8.6' // 此处以JPush 3.8.6 版本为例。 @@ -152,7 +179,7 @@ dependencies { //动态权限框架 implementation 'com.hjq:xxpermissions:6.0' //okhttp - implementation 'com.squareup.okhttp3:okhttp:4.6.0' + implementation 'com.squareup.okhttp3:okhttp:4.9.1' //Retrofit implementation 'com.squareup.retrofit2:retrofit:2.9.0' implementation 'com.squareup.retrofit2:converter-gson:2.9.0' @@ -160,23 +187,38 @@ dependencies { //RxJava implementation 'io.reactivex.rxjava2:rxjava:2.2.8' implementation 'io.reactivex.rxjava2:rxandroid:2.1.1' + //声明周期管理 + implementation 'com.trello.rxlifecycle2:rxlifecycle:2.2.2' + implementation 'com.trello.rxlifecycle2:rxlifecycle-android:2.2.2' + implementation 'com.trello.rxlifecycle2:rxlifecycle-components:2.2.2' - implementation 'com.google.code.gson:gson:2.8.6' + implementation 'com.google.code.gson:gson:2.8.7' implementation 'com.google.zxing:core:3.3.0' - implementation 'com.alibaba:fastjson:1.2.70' + implementation 'com.alibaba:fastjson:1.2.76' //implementation 'com.blankj:utilcode:1.26.0' implementation 'com.arialyy.aria:core:3.8.15' - annotationProcessor 'com.arialyy.aria:compiler:3.8.15' + kapt 'com.arialyy.aria:compiler:3.8.15' implementation "org.java-websocket:Java-WebSocket:1.4.1" //高德地图定位 implementation 'com.amap.api:location:5.1.0' //屏幕适配方案 + implementation 'com.blankj:utilcodex:1.30.6' + //autosize会改变第三方view的大小 //https://github.com/JessYanCoding/AndroidAutoSize - implementation 'me.jessyan:autosize:1.2.1' + //implementation 'me.jessyan:autosize:1.2.1' + implementation 'com.flyco.tablayout:FlycoTabLayout_Lib:2.1.2@aar' + + implementation 'com.github.bumptech.glide:glide:4.11.0' + annotationProcessor 'com.github.bumptech.glide:compiler:4.11.0' + + implementation 'com.jakewharton:butterknife:10.2.1' +// If you are using Kotlin, replace annotationProcessor with kapt. +// annotationProcessor rootProject.ext.dependencies["butterknife-compiler"] + kapt 'com.jakewharton:butterknife-compiler:10.2.1' } preBuild { diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 0f8ed25..4b1ad80 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -4,17 +4,21 @@ package="com.info.sn" android:sharedUserId="android.uid.system"> + + + + + - - - - - - - - - - + + + + + + + @@ -50,7 +52,7 @@ - - - - - - - - - - - - - - - - + android:exported="true" + android:process=":remote"/> @@ -92,6 +76,29 @@ + + + + + + + + + + + + + + + + + + + - - - - - - - + - - - - + @@ -258,20 +258,16 @@ - - + + android:value="${JPUSH_APPKEY}" /> + android:value="${AMAP_KEY}" /> diff --git a/app/src/main/aidl/com/info/sn/IGetInfoInterface.aidl b/app/src/main/aidl/com/info/sn/IGetInfoInterface.aidl new file mode 100644 index 0000000..627fdba --- /dev/null +++ b/app/src/main/aidl/com/info/sn/IGetInfoInterface.aidl @@ -0,0 +1,20 @@ +// IGetInfoInterface.aidl +package com.info.sn; + +// Declare any non-default types here with import statements + +interface IGetInfoInterface { + /** + * Demonstrates some basic types that you can use as parameters + * and return values in AIDL. + */ + void basicTypes(int anInt, long aLong, boolean aBoolean, float aFloat, + double aDouble, String aString); + + //获取用户信息 + String getUserInfo(); + //获取隐藏APP + List getHideAPP(); + //获取禁止打开的APP + List getForbidAPP(); +} diff --git a/app/src/main/java/com/info/sn/Statistics/AppInformation.java b/app/src/main/java/com/info/sn/Statistics/AppInformation.java new file mode 100644 index 0000000..282f1fe --- /dev/null +++ b/app/src/main/java/com/info/sn/Statistics/AppInformation.java @@ -0,0 +1,132 @@ +package com.info.sn.Statistics; + +import android.annotation.TargetApi; +import android.app.usage.UsageStats; +import android.content.Context; +import android.content.pm.ApplicationInfo; +import android.content.pm.PackageManager; +import android.graphics.drawable.Drawable; +import android.os.Build; +import android.os.SystemClock; + +import java.io.Serializable; + + +public class AppInformation { + private UsageStats usageStats; + private String packageName; + private String label; + private Drawable Icon; + private long UsedTimebyDay; //milliseconds + private Context context; + private int times; + + + public AppInformation(UsageStats usageStats, Context context) { + this.usageStats = usageStats; + this.context = context; + + try { + GenerateInfo(); + } catch (PackageManager.NameNotFoundException | IllegalAccessException | NoSuchFieldException e) { + e.printStackTrace(); + } + } + + @TargetApi(Build.VERSION_CODES.LOLLIPOP) + private void GenerateInfo() throws PackageManager.NameNotFoundException, NoSuchFieldException, IllegalAccessException { + PackageManager packageManager = context.getPackageManager(); + this.packageName = usageStats.getPackageName(); + if (this.packageName != null && !this.packageName.equals("")) { + ApplicationInfo applicationInfo = packageManager.getApplicationInfo(this.packageName, 0); + this.label = (String) packageManager.getApplicationLabel(applicationInfo); + this.UsedTimebyDay = usageStats.getTotalTimeInForeground(); + this.times = (Integer) usageStats.getClass().getDeclaredField("mLaunchCount").get(usageStats); + + if (this.UsedTimebyDay > 0) { + this.Icon = applicationInfo.loadIcon(packageManager); + } + } + } + + public UsageStats getUsageStats() { + return usageStats; + } + + public int getTimes() { + return times; + } + + public void setTimes(int times) { + this.times = times; + } + + public void setUsedTimebyDay(long usedTimebyDay) { + this.UsedTimebyDay = usedTimebyDay; + } + + public Drawable getIcon() { + return Icon; + } + + public long getUsedTimebyDay() { + return UsedTimebyDay; + } + + public String getLabel() { + return label; + } + + public String getPackageName() { + return packageName; + } + + private long timeStampMoveToForeground = -1; + + private long timeStampMoveToBackGround = -1; + + + public void setTimeStampMoveToForeground(long timeStampMoveToForeground) { +// if (timeStampMoveToForeground > bootTime()){ +// timesPlusPlus(); +// } + this.timeStampMoveToForeground = timeStampMoveToForeground; + } + + public void timesPlusPlus(){ + times++; + } + + public void setTimeStampMoveToBackGround(long timeStampMoveToBackGround) { + this.timeStampMoveToBackGround = timeStampMoveToBackGround; + } + + public long getTimeStampMoveToBackGround() { + return timeStampMoveToBackGround; + } + + public long getTimeStampMoveToForeground() { + return timeStampMoveToForeground; + } + + public void calculateRunningTime() { + + if (timeStampMoveToForeground < 0 || timeStampMoveToBackGround < 0) { + return; + } + + if (timeStampMoveToBackGround > timeStampMoveToForeground) { + UsedTimebyDay += (timeStampMoveToBackGround - timeStampMoveToForeground); + timeStampMoveToForeground = -1; + timeStampMoveToBackGround = -1; + } + + } + + + // 返回开机时间,单位微妙 + public static long bootTime() { + return System.currentTimeMillis() - SystemClock.elapsedRealtime(); + } + +} diff --git a/app/src/main/java/com/info/sn/Statistics/StatisticsInfo.java b/app/src/main/java/com/info/sn/Statistics/StatisticsInfo.java new file mode 100644 index 0000000..c6eed8c --- /dev/null +++ b/app/src/main/java/com/info/sn/Statistics/StatisticsInfo.java @@ -0,0 +1,285 @@ +package com.info.sn.Statistics; + +import android.annotation.TargetApi; +import android.app.usage.UsageEvents; +import android.app.usage.UsageStats; +import android.app.usage.UsageStatsManager; +import android.content.Context; +import android.os.Build; + + +import java.util.ArrayList; +import java.util.Calendar; +import java.util.HashMap; +import java.util.List; + + +public class StatisticsInfo { + + final public static int DAY = 0; + final public static int WEEK = 1; + final public static int MONTH = 2; + final public static int YEAR = 3; + + private ArrayList ShowList; + private ArrayList AppInfoList; + private List result; + private long totalTime; + private int totalTimes; + private int style; + private Context mContext; + + public StatisticsInfo(Context context, int style) { + this.mContext = context; + try { + this.style = style; + setUsageStatsList(context); + setShowList(); + + } catch (NoSuchFieldException e) { + e.printStackTrace(); + } + } + + List packageList = new ArrayList() {{ + this.add("com.info.sn"); + this.add("com.android.launcher3"); + this.add("com.android.settings"); + this.add("com.appstore.uiui"); + }}; + + //将次数和时间为0的应用信息过滤掉 + private void setShowList() { + this.ShowList = new ArrayList<>(); + + totalTime = 0; + + for (int i = 0; i < AppInfoList.size(); i++) { + if (AppInfoList.get(i).getUsedTimebyDay() > 0 + && AppInfoList.get(i).getTimes() > 0 +// && !AppUtil.isSystemApp(mContext, AppInfoList.get(i).getPackageName()) + && !packageList.contains(AppInfoList.get(i).getPackageName()) + ) { + + this.ShowList.add(AppInfoList.get(i)); + totalTime += AppInfoList.get(i).getUsedTimebyDay(); + totalTimes += AppInfoList.get(i).getTimes(); + } + } + + //将显示列表中的应用按显示顺序排序 + for (int i = 0; i < this.ShowList.size() - 1; i++) { + for (int j = 0; j < this.ShowList.size() - i - 1; j++) { + if (this.ShowList.get(j).getUsedTimebyDay() < this.ShowList.get(j + 1).getUsedTimebyDay()) { + AppInformation temp = this.ShowList.get(j); + this.ShowList.set(j, this.ShowList.get(j + 1)); + this.ShowList.set(j + 1, temp); + } + } + } + } + + + //统计当天的应用使用时间 + @TargetApi(Build.VERSION_CODES.LOLLIPOP) + private void setUsageStatsList(Context context) throws NoSuchFieldException { + UsageStatsManager m = (UsageStatsManager) context.getSystemService(Context.USAGE_STATS_SERVICE); + this.AppInfoList = new ArrayList<>(); + if (m != null) { + Calendar calendar = Calendar.getInstance(); + long now = calendar.getTimeInMillis(); + long begintime = getBeginTime(); + if (style == DAY) { + this.result = m.queryUsageStats(UsageStatsManager.INTERVAL_BEST, begintime, now); + AppInfoList = getAccurateDailyStatsList(context, result, m, begintime, now); + } else { + if (style == WEEK) { + this.result = m.queryUsageStats(UsageStatsManager.INTERVAL_WEEKLY, begintime, now); + } else if (style == MONTH) { + this.result = m.queryUsageStats(UsageStatsManager.INTERVAL_MONTHLY, begintime, now); + } else if (style == YEAR) { + this.result = m.queryUsageStats(UsageStatsManager.INTERVAL_YEARLY, begintime, now); + } else { + this.result = m.queryUsageStats(UsageStatsManager.INTERVAL_BEST, begintime, now); + } + + List Mergeresult = MergeList(this.result); + for (UsageStats usageStats : Mergeresult) { + this.AppInfoList.add(new AppInformation(usageStats, context)); + } + calculateLaunchTimesAfterBootOn(context, AppInfoList); + } + } + } + + /** + * 根据UsageEvents来对当天的操作次数和开机后运行时间来进行精确计算 + */ + @TargetApi(Build.VERSION_CODES.LOLLIPOP) + private ArrayList getAccurateDailyStatsList(Context context, List result, UsageStatsManager m, long begintime, long now) { + //针对每个packageName建立一个 使用信息 + HashMap mapData = new HashMap<>(); + //得到包名 + for (UsageStats stats : result) { + if (stats.getLastTimeUsed() > begintime && stats.getTotalTimeInForeground() > 0) { + if (mapData.get(stats.getPackageName()) == null) { + AppInformation information = new AppInformation(stats, context); + //重置总运行时间 开机操作次数 + information.setTimes(0); + information.setUsedTimebyDay(0); + mapData.put(stats.getPackageName(), information); + } + } + } + + //这个是相对比较精确的 + long bootTime = AppInformation.bootTime(); + UsageEvents events = m.queryEvents(bootTime, now); + + UsageEvents.Event e = new UsageEvents.Event(); + while (events.hasNextEvent()) { + events.getNextEvent(e); + String packageName = e.getPackageName(); + + AppInformation information = mapData.get(packageName); + if (information == null) { + continue; + } + + //这里在同时计算开机后的操作次数和运行时间,所以如果获取到的时间戳是昨天的话就得过滤掉 continue + + if (e.getEventType() == UsageEvents.Event.MOVE_TO_FOREGROUND) { + information.timesPlusPlus(); + if (e.getTimeStamp() < begintime) { + continue; + } + information.setTimeStampMoveToForeground(e.getTimeStamp()); + } else if (e.getEventType() == UsageEvents.Event.MOVE_TO_BACKGROUND) { + if (e.getTimeStamp() < begintime) { + continue; + } + information.setTimeStampMoveToBackGround(e.getTimeStamp()); + //当前应用是在昨天进入的前台,0点后转入了后台,所以会先得到MOVE_TO_BACKGROUND 的timeStamp + if (information.getTimeStampMoveToForeground() < 0) { + //从今天开始计算即可 + information.setTimeStampMoveToForeground(begintime); + } + } + information.calculateRunningTime(); + } + + //再计算一次当前应用的运行时间,因为当前应用,最后得不到MOVE_TO_BACKGROUND 的timeStamp + AppInformation information = mapData.get(context.getPackageName()); + information.setTimeStampMoveToBackGround(now); + information.calculateRunningTime(); + + return new ArrayList<>(mapData.values()); + } + + /** + * 根据UsageEvents 精确计算APP开机的启动(activity打开的)次数 + */ + @TargetApi(Build.VERSION_CODES.LOLLIPOP) + private void calculateLaunchTimesAfterBootOn(Context context, List AppInfoList) { + + UsageStatsManager m = (UsageStatsManager) context.getSystemService(Context.USAGE_STATS_SERVICE); + if (m == null || AppInfoList == null || AppInfoList.size() < 1) { + return; + } + //针对每个packageName建立一个 使用信息 + HashMap mapData = new HashMap<>(); + + UsageEvents events = m.queryEvents(AppInformation.bootTime(), System.currentTimeMillis()); + for (AppInformation information : AppInfoList) { + mapData.put(information.getPackageName(), information); + information.setTimes(0); + } + + UsageEvents.Event e = new UsageEvents.Event(); + while (events.hasNextEvent()) { + events.getNextEvent(e); + String packageName = e.getPackageName(); + AppInformation information = mapData.get(packageName); + if (information == null) { + continue; + } + + if (e.getEventType() == UsageEvents.Event.MOVE_TO_FOREGROUND) { + information.timesPlusPlus(); + } + } + } + + private long getBeginTime() { + Calendar calendar = Calendar.getInstance(); + long begintime; + if (style == WEEK) { + //int weekDay = calendar.get(Calendar.DAY_OF_WEEK); + calendar.add(Calendar.DATE, -7); + begintime = calendar.getTimeInMillis(); + } else if (style == MONTH) { + //int mounthDay = calendar.get(Calendar.DAY_OF_MONTH); + calendar.add(Calendar.DATE, -30); + begintime = calendar.getTimeInMillis(); + } else if (style == YEAR) { + calendar.add(Calendar.YEAR, -1); + begintime = calendar.getTimeInMillis(); + } else { + //剩下的输入均显示当天的数据 + int hour = calendar.get(Calendar.HOUR_OF_DAY); + int minute = calendar.get(Calendar.MINUTE); + int second = calendar.get(Calendar.SECOND); + + calendar.add(Calendar.SECOND, -1 * second); + calendar.add(Calendar.MINUTE, -1 * minute); + calendar.add(Calendar.HOUR, -1 * hour); + begintime = calendar.getTimeInMillis(); + + } + return begintime; + } + + @TargetApi(Build.VERSION_CODES.LOLLIPOP) + private List MergeList(List result) { + List Mergeresult = new ArrayList<>(); + long begintime; + begintime = getBeginTime(); + for (int i = 0; i < result.size(); i++) { + if (result.get(i).getLastTimeUsed() > begintime) { + int num = FoundUsageStats(Mergeresult, result.get(i)); + if (num >= 0) { + UsageStats u = Mergeresult.get(num); + u.add(result.get(i)); + Mergeresult.set(num, u); + } else { + Mergeresult.add(result.get(i)); + } + } + } + return Mergeresult; + } + + @TargetApi(Build.VERSION_CODES.LOLLIPOP) + private int FoundUsageStats(List Mergeresult, UsageStats usageStats) { + for (int i = 0; i < Mergeresult.size(); i++) { + if (Mergeresult.get(i).getPackageName().equals(usageStats.getPackageName())) { + return i; + } + } + return -1; + } + + + public long getTotalTime() { + return totalTime; + } + + public int getTotalTimes() { + return totalTimes; + } + + public ArrayList getShowList() { + return ShowList; + } +} + diff --git a/app/src/main/java/com/info/sn/activity/MainActivity.java b/app/src/main/java/com/info/sn/activity/MainActivity.java deleted file mode 100644 index 9488616..0000000 --- a/app/src/main/java/com/info/sn/activity/MainActivity.java +++ /dev/null @@ -1,752 +0,0 @@ -package com.info.sn.activity; - -import android.app.AlertDialog; -import android.content.BroadcastReceiver; -import android.content.Context; -import android.content.DialogInterface; -import android.content.Intent; -import android.content.IntentFilter; -import android.content.pm.PackageManager; -import android.content.res.Configuration; -import android.graphics.Bitmap; -import android.os.Bundle; -import android.os.Environment; -import android.os.Handler; -import android.os.Message; -import android.os.SystemClock; -import android.text.TextUtils; -import android.util.Log; -import android.view.KeyEvent; -import android.view.View; -import android.view.WindowManager; -import android.widget.ImageView; -import android.widget.TextView; - -import androidx.constraintlayout.widget.ConstraintLayout; - -import com.amap.api.location.AMapLocation; -import com.amap.api.location.AMapLocationClient; -import com.amap.api.location.AMapLocationListener; -import com.amap.api.location.AMapLocationQualityReport; -import com.hjq.permissions.OnPermission; -import com.hjq.permissions.Permission; -import com.hjq.permissions.XXPermissions; -import com.info.sn.BuildConfig; -import com.info.sn.R; -import com.info.sn.base.CheckPermissionsActivity; -import com.info.sn.base.MyApplication; -import com.info.sn.bean.BaseResponse; -import com.info.sn.bean.SystemSettings; -import com.info.sn.bean.UserInfo; -import com.info.sn.jpush.ExampleUtil; -import com.info.sn.jpush.LocalBroadcastManager; -import com.info.sn.jpush.TagAliasOperatorHelper; -import com.info.sn.network.HTTPInterface; -import com.info.sn.network.NetWorkManager; -import com.info.sn.network.api.SNInfo; -import com.info.sn.network.api.Setting; -import com.info.sn.service.GuardService; -import com.info.sn.service.InitJpushServer; -import com.info.sn.service.MyDownloadService; -import com.info.sn.service.StepService; -import com.info.sn.utils.ApkUtils; -import com.info.sn.utils.LogUtils; -import com.info.sn.utils.SPUtils; -import com.info.sn.utils.TimeUtils; -import com.info.sn.utils.ToastUtil; -import com.info.sn.utils.Utils; - -import java.io.File; -import java.util.List; -import java.util.Set; -import java.util.concurrent.TimeUnit; - -import cn.jpush.android.api.JPushInterface; -import io.reactivex.Observable; -import io.reactivex.Observer; -import io.reactivex.android.schedulers.AndroidSchedulers; -import io.reactivex.annotations.NonNull; -import io.reactivex.disposables.Disposable; -import io.reactivex.schedulers.Schedulers; -import me.jessyan.autosize.internal.CustomAdapt; - -import static com.info.sn.jpush.TagAliasOperatorHelper.ACTION_ADD; -import static com.info.sn.jpush.TagAliasOperatorHelper.ACTION_CHECK; -import static com.info.sn.jpush.TagAliasOperatorHelper.ACTION_CLEAN; -import static com.info.sn.jpush.TagAliasOperatorHelper.ACTION_DELETE; -import static com.info.sn.jpush.TagAliasOperatorHelper.ACTION_GET; -import static com.info.sn.jpush.TagAliasOperatorHelper.ACTION_SET; -import static com.info.sn.jpush.TagAliasOperatorHelper.TagAliasBean; -import static com.info.sn.jpush.TagAliasOperatorHelper.sequence; -import static java.lang.System.getProperty; - -public class MainActivity extends CheckPermissionsActivity implements AMapLocationListener, CustomAdapt { - private static final String TAG = "MainActivity"; - - public static final String REFRESHACTION = BuildConfig.APPLICATION_ID + ".REFRESH"; - public static boolean isForeground = false; - private ImageView imageView, exit; - private TextView tv_note, tv_devsn, tv_username, tv_school, tv_grade, tv_version,tv_customversion; - private ConstraintLayout layout; - - private int DeviceInfo; - private long mExitTime; - - private RefreshReceiver mRefreshReceiver; - - @Override - protected void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - setContentView(R.layout.activity_main); - starService(); - initAmap(); - PackageManager pm = getPackageManager(); - //后台为0可能传过来null - pm.setApplicationEnabledSetting("com.info.sn", PackageManager.COMPONENT_ENABLED_STATE_DEFAULT, 0); - - requestPermission(); - registerMessageReceiver(); // used for receive msg - registerRefreshReceiver(); - String rid = JPushInterface.getRegistrationID(getApplicationContext()); - if (!rid.isEmpty()) { - ToastUtil.debugShow("RegId:" + rid); - LogUtils.e("RegId", rid); - onTagAliasAction(7); - } else { -// ToastUtil.show("Get registration fail, JPush init failed!"); -// Toast.makeText(this, "Get registration fail, JPush init failed!", Toast.LENGTH_SHORT).show(); - } - initView(); - initData(); -// HTTPInterface.checkDevicesInfo(handler); - checkDevicesInfo(); -// HTTPInterface.checkUpdateByself(handler, this.getPackageName(), String.valueOf(BuildConfig.VERSION_CODE)); -// startService(new Intent(MainActivity.this, MyDownloadService.class)); -// HTTPInterface.getAllAppPackageName(MainActivity.this); -// HTTPInterface.setBrowser(MainActivity.this); - delay(MainActivity.this); -// HTTPInterface.get_settings(MainActivity.this); - TimeUtils.ContralTime c2 = TimeUtils.getDefaltContralTime(MainActivity.this); - Log.e("fht", "time:" + TimeUtils.getNowTime()); - } - - private void initAmap() { - AMapLocationClient aMapLocationClient = MyApplication.getLocationClient(); - aMapLocationClient.setLocationListener(new AMapLocationListener() { - @Override - public void onLocationChanged(AMapLocation aMapLocation) { - StringBuffer sb = new StringBuffer(); - //errCode等于0代表定位成功,其他的为定位失败,具体的可以参照官网定位错误码说明 - if (aMapLocation.getErrorCode() == 0) { - sb.append(aMapLocation.getAddress() + "\n"); - SPUtils.put(MainActivity.this, "AmapAddress", aMapLocation.getAddress()); - SPUtils.put(MainActivity.this, "longitude", aMapLocation.getLongitude()); - SPUtils.put(MainActivity.this, "latitude", aMapLocation.getLatitude()); - } else { - //定位失败 - sb.append("定位失败" + "\n"); - SPUtils.put(MainActivity.this, "AmapError", aMapLocation.getErrorInfo()); - } - HTTPInterface.updateAdminInfo(MainActivity.this); - } - }); - aMapLocationClient.stopLocation(); - aMapLocationClient.startLocation(); - } - - - private void delay(final Context context) { - Observable.timer(10000, TimeUnit.MILLISECONDS) - .observeOn(AndroidSchedulers.mainThread()) - .subscribe(new Observer() { - @Override - public void onSubscribe(@NonNull Disposable d) { - - } - - @Override - public void onNext(@NonNull Long aLong) { - HTTPInterface.getAllappPackage(MainActivity.this); - HTTPInterface.getBrowserLabel(context); - HTTPInterface.setBrowser(context); - HTTPInterface.getSystemSettings(context); - HTTPInterface.getForceInstall(context); - HTTPInterface.getAppStart(context); -// HTTPInterface.getAppJump(context); - } - - @Override - public void onError(@NonNull Throwable e) { - Log.e("delay", "onError: " + e.getMessage()); - } - - @Override - public void onComplete() { - Log.e("delay", "onComplete: "); - } - }); - } - - private void starService() { - startService(new Intent(this, GuardService.class)); - startService(new Intent(this, StepService.class)); - startService(new Intent(this, InitJpushServer.class)); - startService(new Intent(this, MyDownloadService.class)); - } - - - @Override - public void onConfigurationChanged(Configuration newConfig) { - super.onConfigurationChanged(newConfig); - } - - @Override - protected void onSaveInstanceState(Bundle outState) { - super.onSaveInstanceState(outState); - } - - public void registerRefreshReceiver() { - mRefreshReceiver = new RefreshReceiver(); - IntentFilter filter = new IntentFilter(); - filter.setPriority(IntentFilter.SYSTEM_HIGH_PRIORITY); - filter.addAction(REFRESHACTION); - registerReceiver(mRefreshReceiver, filter); - } - - @Override - public void onLocationChanged(AMapLocation aMapLocation) { - StringBuffer sb = new StringBuffer(); - //errCode等于0代表定位成功,其他的为定位失败,具体的可以参照官网定位错误码说明 - if (aMapLocation.getErrorCode() == 0) { -// sb.append("定位成功" + "\n"); -// sb.append("定位类型: " + aMapLocation.getLocationType() + "\n"); - sb.append("位置: " + aMapLocation.getAddress() + "\n"); -// sb.append("经 度 : " + aMapLocation.getLongitude() + "\n"); -// sb.append("纬 度 : " + aMapLocation.getLatitude() + "\n"); -// sb.append("精 度 : " + aMapLocation.getAccuracy() + "米" + "\n"); -// sb.append("提供者 : " + aMapLocation.getProvider() + "\n"); - -// sb.append("速 度 : " + aMapLocation.getSpeed() + "米/秒" + "\n"); -// sb.append("角 度 : " + aMapLocation.getBearing() + "\n"); -// 定位完成的时间 -// sb.append("定位时间: " + amapUtils.formatUTC(aMapLocation.getTime(), "yyyy-MM-dd HH:mm:ss") + "\n"); - } else { - //定位失败 - sb.append("定位失败" + "\n"); - sb.append("错误码:" + aMapLocation.getErrorCode() + "\n"); - sb.append("错误信息:" + aMapLocation.getErrorInfo() + "\n"); - sb.append("错误描述:" + aMapLocation.getLocationDetail() + "\n"); - } -// sb.append("***定位质量报告***").append("\n"); -// sb.append("* WIFI开关:").append(aMapLocation.getLocationQualityReport().isWifiAble() ? "开启" : "关闭").append("\n"); -// sb.append("* GPS状态:").append(getGPSStatusString(aMapLocation.getLocationQualityReport().getGPSStatus())).append("\n"); -// sb.append("* GPS星数:").append(aMapLocation.getLocationQualityReport().getGPSSatellites()).append("\n"); -// sb.append("****************").append("\n"); -// 定位之后的回调时间 -// sb.append("回调时间: " + amapUtils.formatUTC(System.currentTimeMillis(), "yyyy-MM-dd HH:mm:ss") + "\n"); - Log.e("onLocationChanged", sb.toString()); - } - - /** - * 获取GPS状态的字符串 - * - * @param statusCode GPS状态码 - * @return - */ - private String getGPSStatusString(int statusCode) { - String str = ""; - switch (statusCode) { - case AMapLocationQualityReport.GPS_STATUS_OK: - str = "GPS状态正常"; - break; - case AMapLocationQualityReport.GPS_STATUS_NOGPSPROVIDER: - str = "手机中没有GPS Provider,无法进行GPS定位"; - break; - case AMapLocationQualityReport.GPS_STATUS_OFF: - str = "GPS关闭,建议开启GPS,提高定位质量"; - break; - case AMapLocationQualityReport.GPS_STATUS_MODE_SAVING: - str = "选择的定位模式中不包含GPS定位,建议选择包含GPS定位的模式,提高定位质量"; - break; - case AMapLocationQualityReport.GPS_STATUS_NOGPSPERMISSION: - str = "没有GPS定位权限,建议开启gps定位权限"; - break; - } - return str; - } - - public class RefreshReceiver extends BroadcastReceiver { - @Override - public void onReceive(Context context, Intent intent) { - if (REFRESHACTION.equals(intent.getAction())) { -// HTTPInterface.checkDevicesInfo(handler); - checkDevicesInfo(); - } - } - } - - - @Override - protected void onResume() { - super.onResume(); - Log.e(TAG, "onResume: "); - checkDevicesInfo(); - } - - @Override - public boolean isBaseOnWidth() { - if (getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT) { - return true; - } else if (getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE) { - return false; - } else { - return false; - } - } - - @Override - public float getSizeInDp() { - return 360; - } - - - private void initView() { - tv_note = findViewById(R.id.tv_note); - imageView = findViewById(R.id.imageView); - exit = findViewById(R.id.iv_exit); - exit.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View view) { - exit(); - } - }); - layout = findViewById(R.id.layout); - layout.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View view) { - continuousClick(COUNTS, DURATION); - } - }); - tv_devsn = findViewById(R.id.tv_devsn); - tv_devsn.setText(Utils.getSerial()); - tv_username = findViewById(R.id.tv_username); - tv_school = findViewById(R.id.tv_school); - tv_grade = findViewById(R.id.tv_grade); - tv_version = findViewById(R.id.version); - tv_version.setText(BuildConfig.VERSION_NAME); - tv_customversion = findViewById(R.id.tv_customversion); - String rom =Utils. getProperty("ro.custom.build.version", "获取失败"); - tv_customversion.setText(rom); - } - - final static int COUNTS = 4;// 点击次数 - final static long DURATION = 1000;// 规定有效时间 - long[] mHits = new long[COUNTS]; - - private void continuousClick(int count, long time) { - //每次点击时,数组向前移动一位 - System.arraycopy(mHits, 1, mHits, 0, mHits.length - 1); - //为数组最后一位赋值 - mHits[mHits.length - 1] = SystemClock.uptimeMillis(); - if (mHits[0] >= (SystemClock.uptimeMillis() - DURATION)) { - mHits = new long[COUNTS];//重新初始化数组 - ToastUtil.show("正在检查更新"); -// HTTPInterface.checkUpdateByself(handler, this.getPackageName(), String.valueOf(BuildConfig.VERSION_CODE)); - } - } - - private void initData() { - DeviceInfo = (int) SPUtils.get(this, "isLogined", 2); - switch (DeviceInfo) { - case 0: - setImageAndText(imageView, "设备未绑定"); - break; - case 1: - setImageAndText(imageView, "设备已绑定"); - break; - case 2: - setImageAndText(imageView, "未经验证的设备,请联系客服"); - break; - } - } - - private void checkDevicesInfo() { - SNInfo snInfo = NetWorkManager.getsnInfoControl(); - snInfo.getsninfo(Utils.getSerial()) - .subscribeOn(Schedulers.io()) - .observeOn(AndroidSchedulers.mainThread()) - .subscribe(new Observer>() { - @Override - public void onSubscribe(@NonNull Disposable d) { - - } - - @Override - public void onNext(@NonNull BaseResponse userInfoBaseResponse) { - int code = userInfoBaseResponse.code; - if (code == 200) { - UserInfo userInfo = userInfoBaseResponse.data; - SPUtils.put(MainActivity.this, "isLogined", 1); - SPUtils.put(MainActivity.this, "member_id", userInfo.getMember_id()); - SPUtils.put(MainActivity.this, "sn_id", userInfo.getId()); - setImageAndText(imageView, "设备已绑定"); - setUserInfo(userInfo); - } else if (code == -200) { - SPUtils.put(MainActivity.this, "isLogined", 0); - setImageAndText(imageView, "设备未绑定"); - setUserInfo(); - } else if (code == -250) { - SPUtils.put(MainActivity.this, "isLogined", 2); - setImageAndText(imageView, "未经验证的设备,请联系客服"); - } - } - - @Override - public void onError(@NonNull Throwable e) { - Log.e(TAG, "onError: " + e.getMessage()); - } - - @Override - public void onComplete() { - - } - }); - } - - - @Override - public boolean onKeyDown(int keyCode, KeyEvent event) { - if (keyCode == KeyEvent.KEYCODE_BACK && event.getRepeatCount() == 0) { - exit(); - return true; - } - return super.onKeyDown(keyCode, event); - } - - public void exit() { - if ((System.currentTimeMillis() - mExitTime) > 2000) { - ToastUtil.show("再按一次退出程序"); - mExitTime = System.currentTimeMillis(); - } else { - finish(); - } - } - - private void setImageAndText(ImageView imageView, String text) { - Bitmap bitmap = Utils.createQRImage(Utils.getSerial(), 250, 250); - imageView.setImageBitmap(bitmap); - tv_note.setText(text); - } - - private void setUserInfo(UserInfo userInfo) { - String name = userInfo.getSn_name(); - String school = userInfo.getSchool(); - String grade = userInfo.getGrade(); - if (name == null || name.equals("")) { - tv_username.setText("未设置"); - } else { - tv_username.setText(name); - } - if (school == null || school.equals("")) { - tv_school.setText("未设置"); - } else { - tv_school.setText(school); - } - if (grade == null || grade.equals("")) { - tv_grade.setText("未设置"); - } else { - tv_grade.setText(getGrade(grade)); - } - } - - private void setUserInfo() { - tv_username.setText(""); - tv_school.setText(""); - tv_grade.setText(""); - } - - private String getGrade(String grade) { - String s; - switch (grade) { - case "1": - s = "一年级"; - break; - case "2": - s = "二年级"; - break; - case "3": - s = "三年级"; - break; - case "4": - s = "四年级"; - break; - case "5": - s = "五年级"; - break; - case "6": - s = "六年级"; - break; - case "7": - s = "初一"; - break; - case "8": - s = "初二"; - break; - case "9": - s = "初三"; - break; - case "10": - s = "高一"; - break; - case "11": - s = "高二"; - break; - case "12": - s = "高三"; - break; - default: - s = "一年级"; - break; - } - return s; - } - - Handler handler = new Handler() { - @Override - public void handleMessage(Message msg) { - super.handleMessage(msg); - switch (msg.what) { - case 0: - SPUtils.put(MainActivity.this, "isLogined", 0); - setImageAndText(imageView, "设备未绑定"); - break; - case 1: - UserInfo userInfo = (UserInfo) msg.obj; - SPUtils.put(MainActivity.this, "isLogined", 1); - SPUtils.put(MainActivity.this, "member_id", userInfo.getMember_id()); - SPUtils.put(MainActivity.this, "sn_id", userInfo.getId()); - setUserInfo((UserInfo) msg.obj); - setImageAndText(imageView, "设备已绑定"); - break; - case 2: - SPUtils.put(MainActivity.this, "isLogined", 2); - setImageAndText(imageView, "未经验证的设备,请联系客服"); - break; - case 300: - Bundle bundle = (Bundle) msg.obj; - getFile(bundle); - break; - case -200: - ToastUtil.show("已是最新版本"); - break; - - case -300: - ToastUtil.show("网络连接失败,检查网络连接"); - break; - } - } - }; - - private void getFile(final Bundle bundle) { - String url = bundle.getString("url"); - - final File path = new File(Environment.getExternalStoragePublicDirectory("Download") + "/Sninfo/"); - path.mkdirs(); - final File file = new File(Environment.getExternalStoragePublicDirectory("Download") + "/Sninfo/" + url.substring(url.lastIndexOf("/") + 1)); - - if (file.exists() && file.isFile()) { - AlertDialog.Builder builder = new AlertDialog.Builder(this) - .setTitle("软件更新") - .setIcon(R.mipmap.ic_launcher) - .setCancelable(false) - .setMessage("发现新版本,点击确定更新\n" + "更新内容:" + bundle.getString("content")) - .setPositiveButton("确定", new DialogInterface.OnClickListener() { - @Override - public void onClick(DialogInterface dialogInterface, int i) { - ApkUtils.installApk(MainActivity.this, file); - dialogInterface.dismiss(); - } - }); - AlertDialog ad = builder.create(); - ad.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT); - ad.setCanceledOnTouchOutside(false); //点击外面区域不会让dialog消失 - ad.show(); - } else { - - } - } - - private String[] permission = new String[]{ -// Permission.SYSTEM_ALERT_WINDOW, -// Permission.CAMERA, -// Permission.READ_SMS, -// Permission.RECEIVE_SMS, -// Permission.SEND_SMS, - Permission.REQUEST_INSTALL_PACKAGES, - Permission.READ_EXTERNAL_STORAGE, - Permission.WRITE_EXTERNAL_STORAGE, -// Permission.READ_PHONE_STATE - }; - - public void requestPermission() { - XXPermissions.with(this) - // 可设置被拒绝后继续申请,直到用户授权或者永久拒绝 - .constantRequest() - // 支持请求6.0悬浮窗权限8.0请求安装权限 - //.permission(Permission.REQUEST_INSTALL_PACKAGES) - // 不指定权限则自动获取清单中的危险权限 - .permission(permission) - .request(new OnPermission() { - - @Override - public void hasPermission(List granted, boolean isAll) { - if (isAll) { - String path = Environment.getExternalStorageDirectory().getAbsolutePath() + File.separator + "POStemp"; - File file = new File(path); - file.mkdirs(); - } else { - ToastUtil.show("需要授予所有权限才能正常使用本程序!"); - } - } - - @Override - public void noPermission(List denied, boolean quick) { - if (quick) { - ToastUtil.show("被永久拒绝授权,请手动授予权限!"); - //如果是被永久拒绝就跳转到应用权限系统设置页面 - XXPermissions.gotoPermissionSettings(MainActivity.this); - } else { - ToastUtil.show("获取权限失败"); - } - } - }); - } - - - public void onTagAliasAction(int i) { - Set tags = null; - String alias = null; - int action = -1; - boolean isAliasAction = false; - switch (i) { - //设置手机号码: - case 0: -// handleSetMobileNumber(); - return; - //增加tag - case 1: -// tags = getInPutTags(); - if (tags == null) { - return; - } - action = ACTION_ADD; - break; - //设置tag - case 2: -// tags = getInPutTags(); - if (tags == null) { - return; - } - action = ACTION_SET; - break; - //删除tag - case 3: -// tags = getInPutTags(); - if (tags == null) { - return; - } - action = ACTION_DELETE; - break; - //获取所有tag - case 4: - action = ACTION_GET; - break; - //清除所有tag - case 5: - action = ACTION_CLEAN; - break; - case 6: -// tags = getInPutTags(); - if (tags == null) { - return; - } - action = ACTION_CHECK; - break; - //设置alias - case 7: -// alias = getInPutAlias(); - alias = Utils.getSerial(); - if (TextUtils.isEmpty(alias)) { - return; - } - isAliasAction = true; - action = ACTION_SET; - break; - //获取alias - case 8: - isAliasAction = true; - action = ACTION_GET; - break; - //删除alias - case 9: - isAliasAction = true; - action = ACTION_DELETE; - break; - default: - return; - } - TagAliasBean tagAliasBean = new TagAliasBean(); - tagAliasBean.action = action; - sequence++; - if (isAliasAction) { - tagAliasBean.alias = alias; - } else { - tagAliasBean.tags = tags; - } - tagAliasBean.isAliasAction = isAliasAction; - TagAliasOperatorHelper.getInstance().handleAction(getApplicationContext(), sequence, tagAliasBean); - - } - - - //for receive customer msg from jpush server - private MessageReceiver mMessageReceiver; - public static final String MESSAGE_RECEIVED_ACTION = "com.info.sn.MESSAGE_RECEIVED_ACTION"; - public static final String KEY_TITLE = "title"; - public static final String KEY_MESSAGE = "message"; - public static final String KEY_EXTRAS = "extras"; - - public void registerMessageReceiver() { - mMessageReceiver = new MessageReceiver(); - IntentFilter filter = new IntentFilter(); - filter.setPriority(IntentFilter.SYSTEM_HIGH_PRIORITY); - filter.addAction(MESSAGE_RECEIVED_ACTION); - LocalBroadcastManager.getInstance(this).registerReceiver(mMessageReceiver, filter); - } - - public class MessageReceiver extends BroadcastReceiver { - - @Override - public void onReceive(Context context, Intent intent) { - try { - if (MESSAGE_RECEIVED_ACTION.equals(intent.getAction())) { - String messge = intent.getStringExtra(KEY_MESSAGE); - String extras = intent.getStringExtra(KEY_EXTRAS); - StringBuilder showMsg = new StringBuilder(); - showMsg.append(KEY_MESSAGE + " : " + messge + "\n"); - if (!ExampleUtil.isEmpty(extras)) { - showMsg.append(KEY_EXTRAS + " : " + extras + "\n"); - } -// setCostomMsg(showMsg.toString()); - } - } catch (Exception e) { - } - } - } - - @Override - protected void onDestroy() { - super.onDestroy(); - unregisterReceiver(mRefreshReceiver); - } -} diff --git a/app/src/main/java/com/info/sn/activity/main/MainActivity.java b/app/src/main/java/com/info/sn/activity/main/MainActivity.java new file mode 100644 index 0000000..3375a45 --- /dev/null +++ b/app/src/main/java/com/info/sn/activity/main/MainActivity.java @@ -0,0 +1,780 @@ +package com.info.sn.activity.main; + +import android.content.BroadcastReceiver; +import android.content.ComponentName; +import android.content.Context; +import android.content.Intent; +import android.content.IntentFilter; +import android.graphics.Bitmap; +import android.net.Uri; +import android.os.AsyncTask; +import android.os.SystemClock; +import android.provider.Settings; +import android.text.TextUtils; +import android.util.Log; +import android.view.Gravity; +import android.view.KeyEvent; +import android.view.View; +import android.view.WindowManager; +import android.widget.ImageView; +import android.widget.TextView; + +import androidx.constraintlayout.widget.ConstraintLayout; +import androidx.fragment.app.Fragment; +import androidx.fragment.app.FragmentManager; +import androidx.viewpager.widget.ViewPager; + +import com.alibaba.fastjson.JSONObject; +import com.blankj.utilcode.util.NetworkUtils; +import com.flyco.tablayout.SlidingTabLayout; +import com.info.sn.BuildConfig; +import com.info.sn.R; +import com.info.sn.base.BaseActivity; +import com.info.sn.bean.gankao.AvailableProduct; +import com.info.sn.bean.zuoye.BaseResponse; +import com.info.sn.bean.zuoye.UserInfo; +import com.info.sn.config.Configs; +import com.info.sn.config.Scheme; +import com.info.sn.dialog.ActivationDialog; +import com.info.sn.dialog.UserDebugDialog; +import com.info.sn.fragment.AppletQRCodeFragment; +import com.info.sn.fragment.BaseFragmentPagerAdapter; +import com.info.sn.fragment.QRCodeFragment; +import com.info.sn.jpush.ExampleUtil; +import com.info.sn.jpush.LocalBroadcastManager; +import com.info.sn.jpush.TagAliasOperatorHelper; +import com.info.sn.network.HTTPInterface; +import com.info.sn.service.GuardService; +import com.info.sn.service.MainService; +import com.info.sn.service.ManagerService; +import com.info.sn.service.MyDownloadService; +import com.info.sn.service.StepService; +import com.info.sn.manager.ControlManager; +import com.info.sn.manager.DeviceManager; +import com.info.sn.utils.JGYUtils; +import com.info.sn.utils.LaunchTools; +import com.info.sn.utils.SPUtils; +import com.info.sn.utils.TimeUtils; +import com.info.sn.utils.ToastUtil; +import com.info.sn.utils.Utils; + +import org.jetbrains.annotations.NotNull; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; + +import butterknife.BindView; +import butterknife.ButterKnife; +import cn.jpush.android.api.JPushInterface; + +import static com.info.sn.jpush.TagAliasOperatorHelper.ACTION_SET; +import static com.info.sn.jpush.TagAliasOperatorHelper.TagAliasBean; + +public class MainActivity extends BaseActivity implements MainContact.MainView, NetworkUtils.OnNetworkStatusChangedListener { + private final String TAG = MainActivity.class.getSimpleName(); + private final String defaultText = "未绑定"; + + private MainPresenter mPresenter = new MainPresenter(this); + + private long time0; + private long timeMillis; + public static boolean isForeground = false; + + @BindView(R.id.cl_update) + ConstraintLayout cl_update; + + @BindView(R.id.tv_exit) + TextView iv_exit; + + @BindView(R.id.tv_title) + TextView tv_title; + + @BindView(R.id.qr_code) + ImageView qr_code; + + @BindView(R.id.iv_logo) + ImageView iv_logo; + + @BindView(R.id.tv_note) + TextView tv_note; + + @BindView(R.id.tv_devsn) + TextView tv_devsn; + + @BindView(R.id.tv_username) + TextView tv_username; + + @BindView(R.id.tv_school) + TextView tv_school; + + @BindView(R.id.tv_grade) + TextView tv_grade; + + @BindView(R.id.tv_version) + TextView tv_version; + + @BindView(R.id.tv_customversion) + TextView tv_customversion; + + @BindView(R.id.bt_activation) + TextView bt_activation; + + @BindView(R.id.viewPager) + ViewPager viewPager; + + @BindView(R.id.slidingtablayout) + SlidingTabLayout slidingtablayout; + + @Override + public void onDisconnected() { + + } + + @Override + public void onConnected(NetworkUtils.NetworkType networkType) { + mPresenter.getInfo(); + } + + @Override + public int getLayoutId() { + return R.layout.activity_main; + } + + @Override + public void initView() { + Utils.getAndroiodScreenProperty(this); + ButterKnife.bind(this); + mPresenter.setProvider(this); + mPresenter.attachView(this); + + setOnClickListener(); + tv_devsn.setText(Utils.getSerial()); + tv_version.setText(BuildConfig.VERSION_NAME); + String rom = JGYUtils.getCustomVersion(); + tv_customversion.setText(rom); + + initTabLayout(); + readOldData(); + TimeTask task = new TimeTask(); + task.execute("ntp.aliyun.com"); + + } + + private class TimeTask extends AsyncTask { + + @Override + protected Long doInBackground(String... strings) { + return TimeUtils.getTimeFromNtpServer(strings[0]); + } + + @Override + protected void onPostExecute(Long aLong) { + super.onPostExecute(aLong); + Log.e(TAG, "getTimeFromNtpServer: " + aLong); + } + } + + @Override + public void initData() { + if (DeviceManager.isDebugMode()) { + Log.e(TAG, "getAllSPUtils: " + JSONObject.toJSONString(SPUtils.getAll(this))); +// TimeUtils.setSystemTime(1627702095000L); + Log.e(TAG, "getWeekDay: " + TimeUtils.inWeekDay()); + Log.e(TAG, "getWeekDay: " + TimeUtils.inWeekDay(1627702095000L)); + Log.e(TAG, "getWeekDayString: " + new TimeUtils().getWeekDayString()); + Log.e(TAG, "getWeekDayString: " + new TimeUtils().getWeekDayString(1627702095000L)); + } + JPushInterface.init(this); + if (DeviceManager.isDebugMode()) { + JGYUtils.putInt(getContentResolver(), "qch_Developeroptions", 0); + } + startService(); + registerReceiver(); + setJpush(); + HTTPInterface.sendAppUsed(this); + HTTPInterface.sendRunningApp(this); + HTTPInterface.getAPPinfo(this); + time0 = System.currentTimeMillis(); + timeMillis = System.currentTimeMillis(); + mPresenter.getQRCode(); +// mPresenter.getInfo(); + mPresenter.getUserInfo(); + } + + @Override + protected void onDestroy() { + super.onDestroy(); + mPresenter.detachView(); + startService(); + } + + @Override + protected void onResume() { + super.onResume(); + setClickable(); + mPresenter.getInfo(); + isForeground = true; + } + + @Override + protected void onPause() { + super.onPause(); + isForeground = false; + } + + @Override + public boolean onKeyDown(int keyCode, KeyEvent event) { + if (keyCode == KeyEvent.KEYCODE_BACK && event.getRepeatCount() == KeyEvent.ACTION_DOWN) { + exit(); + return true; + } + return super.onKeyDown(keyCode, event); + } + + @Override + protected void onNewIntent(Intent intent) { + super.onNewIntent(intent); + if (REFRESHACTION.equals(intent.getAction())) { + mPresenter.getInfo(); + } + } + + private boolean isDebugMode() { + if (DeviceManager.isDebugMode()) { + return true; + } else { + return (boolean) SPUtils.get(this, Configs.userDebugMode, false); + } + } + + final static int DEBUGCOUNTS = 8;//点击次数 + final static long DEBUGDURATION = 4 * 1000;//规定有效时间 + long[] mDEBUGHits = new long[DEBUGCOUNTS]; + + private void enterUserDebug() { + //每次点击时,数组向前移动一位 + System.arraycopy(mDEBUGHits, 1, mDEBUGHits, 0, mDEBUGHits.length - 1); + //为数组最后一位赋值 + mDEBUGHits[mDEBUGHits.length - 1] = SystemClock.uptimeMillis(); + if (mDEBUGHits[0] >= SystemClock.uptimeMillis() - DEBUGDURATION) { + mDEBUGHits = new long[DEBUGCOUNTS]; //重新初始化数组 + if ((boolean) SPUtils.get(MainActivity.this, Configs.EnableDebug, false)) { + ToastUtil.show("已经是Debug模式"); + } else { + showDebugDialog(); + } + } + } + + private void showDebugDialog() { + UserDebugDialog dialog = new UserDebugDialog(this); + dialog.setOnClickBottomListener(new UserDebugDialog.OnClickBottomListener() { + @Override + public void onPositiveClick() { + if ("53680320".equals(dialog.getEdittext())) { + SPUtils.put(MainActivity.this, Configs.EnableDebug, true); + ToastUtil.show("进入用户Debug模式"); + } else { + ToastUtil.show("密码错误"); + } + dialog.dismiss(); + } + + @Override + public void onNegtiveClick() { + dialog.dismiss(); + } + }); + dialog.show(); + dialog.getWindow().setGravity(Gravity.CENTER); + dialog.getWindow().clearFlags(WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE | WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM); + dialog.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE); + } + + + private void initTabLayout() { + List fragmentList = new ArrayList<>(); + FragmentManager fragmentManager = getSupportFragmentManager(); + fragmentList.add(new AppletQRCodeFragment()); + fragmentList.add(new QRCodeFragment()); + BaseFragmentPagerAdapter adapter = new BaseFragmentPagerAdapter(fragmentManager, fragmentList); + viewPager.setAdapter(adapter); + viewPager.setOffscreenPageLimit(3); + String[] titles = new String[]{"第一步 ", " 第二步"}; + slidingtablayout.setViewPager(viewPager, titles); + } + + private void setJpush() { + String rid = JPushInterface.getRegistrationID(this); + if (TextUtils.isEmpty(rid)) { + ToastUtil.debugShow("RegId:" + rid); + Log.e("RegId", rid); + } + setAlias(); + } + + private void setAlias() { + String alias = Utils.getSerial(); + int action = ACTION_SET; + TagAliasBean tagAliasBean = new TagAliasBean(); + tagAliasBean.action = action; + TagAliasOperatorHelper.sequence++; + tagAliasBean.alias = alias; + tagAliasBean.isAliasAction = true; + TagAliasOperatorHelper.getInstance().handleAction(MainActivity.this, TagAliasOperatorHelper.sequence, tagAliasBean); + } + + + private long mExitTime; + + private void exit() { + if (System.currentTimeMillis() - this.mExitTime > (long) 2000) { + ToastUtil.show("再按一次退出程序"); + this.mExitTime = System.currentTimeMillis(); + } else { + this.finish(); + } + } + + private void readOldData() { + String sn_name = (String) SPUtils.get(this, Configs.UserName, defaultText); + tv_username.setText(sn_name); + String school = (String) SPUtils.get(this, Configs.UserSchool, defaultText); + tv_school.setText(school); + String grade = (String) SPUtils.get(this, Configs.UserGrade, defaultText); + tv_grade.setText(grade); + int statu = (int) SPUtils.get(this, Configs.isLogined, 0); + switch (statu) { + case 0: +// tv_note.setText("设备未绑定"); + break; + case 1: +// tv_note.setText("设备已绑定"); + break; + case 2: +// tv_note.setText("未经验证的设备,请联系客服"); + break; + } + } + + private void setOnClickListener() { + setClickable(); + cl_update.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + continuousClick(COUNTS, DURATION); + } + }); + bt_activation.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + showActivationDialog(); + } + }); + iv_exit.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + finish(); + } + }); + tv_title.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + if (isDebugMode()) { + enterUserDebug(); + } else { + + } + + } + }); + } + + + private void showActivationDialog() { + ActivationDialog dialog = new ActivationDialog(this); + dialog.setMessage("是否激活学习系统") + .setTitle("激活") + .setPositive("确定") + .setNegtive("取消") + .setOnClickBottomListener(new ActivationDialog.OnClickBottomListener() { + @Override + public void onPositiveClick() { + mPresenter.checkSN(); + dialog.dismiss(); + } + + @Override + public void onNegtiveClick() { + dialog.dismiss(); + } + }); + dialog.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT); + dialog.show(); + } + + private void toDesktop() { + try { + Intent intent = new Intent(activation); + ComponentName componentName = new ComponentName("com.android.uiuios", "com.android.uiuios.activity.MainActivity"); + intent.setComponent(componentName); + startActivity(intent); + } catch (Exception e) { + ToastUtil.show("未安装桌面"); + Log.e("toDesktop", "Exception: " + e.getMessage()); + } + } + + @Override + public void checkSNFinish(int code) { + switch (code) { + case 200: + case 300: + mPresenter.getGankaoUID(); + break; + case 400: + ToastUtil.show("此设备未经授权,禁止激活"); + break; + case 404: + ToastUtil.show("网络连接失败,稍后重试"); + break; + default: + break; + } + } + + @Override + public void setGankaoUID(@NotNull String gankaoUID) { + if (TextUtils.isEmpty(gankaoUID)) { + ToastUtil.show("用户注册失败"); + } else { + ToastUtil.show("用户注册成功"); + mPresenter.queryAvailableProduct(); + } + } + + @Override + public void setAvailableProduct(@NotNull List availableProductList) { + setGrade(availableProductList); + } + + /** + * @param list 通过年纪获取对应的产品id + */ + private void setGrade(List list) { + if (list == null || list.size() == 0) { + ToastUtil.show("获取激活套餐失败"); + } else { + AvailableProduct defaultProduct = null; + AvailableProduct primary = null; + AvailableProduct junior = null; + AvailableProduct high = null; + for (AvailableProduct product : list) { + if (product.getDuration().contains("全学段")) { + defaultProduct = product; + } + if (product.getDuration().contains("小学")) { + primary = product; + } + if (product.getDuration().contains("初中")) { + junior = product; + } + if (product.getDuration().contains("高中")) { + high = product; + } + } + String grade = Settings.System.getString(getContentResolver(), "UserInfo_grade"); + if (TextUtils.isEmpty(grade)) { + grade = "一年级"; + } + switch (grade) { + default: + activeUser(defaultProduct); + break; +// case "一年级": +// case "二年级": +// case "三年级": +// case "四年级": +// case "五年级": +// case "六年级": +// activeUser(junior); +// break; +// case "七年级": +// case "八年级": +// case "九年级": +// activeUser(primary); +// break; +// case "高一": +// case "高二": +// case "高三": +// activeUser(high); +// break; + } + } + } + + @Override + public void activeUser(int code) { + switch (code) { + case 10000: + ToastUtil.show("授权成功"); + toGankaoApp(); + break; + case 50000: + ToastUtil.show("已经授权"); + toGankaoApp(); + break; + case 0: + default: + ToastUtil.show("授权失败"); + break; + } + } + + private void toGankaoApp() { + String gankaoUID = (String) SPUtils.get(MainActivity.this, "gankaoUID", ""); + if (TextUtils.isEmpty(gankaoUID)) { + ToastUtil.show("获取用户信息失败"); + return; + } + HashMap keys = new HashMap(); + //device_id 传入赶考 UID 可实现账户公用,不会创建新账号 + keys.put("device_id", Uri.encode(gankaoUID)); + keys.put("partner_id", Scheme.partner_id); + keys.put("macaddr", Uri.encode(Utils.getAndroid7MAC())); + try { + String uri = LaunchTools.toUserCenter(MainActivity.this, keys, Uri.encode(Scheme.ownCenter)); +// Scheme.openScheme(MainActivity.this, Scheme.getLogin(MainActivity.this)); + Scheme.openScheme(MainActivity.this, uri); +// LaunchTools.goGankao(MainActivity.this, "", ""); + } catch (Exception e) { + e.printStackTrace(); + } + } + + /** + * @param product 通过产品id激活设备 + */ + private void activeUser(AvailableProduct product) { + if (product == null) { + ToastUtil.show("获取激活套餐失败"); + return; + } + mPresenter.activeUser(product); + } + + private final int COUNTS = 4; // 点击次数 + private final long DURATION = 2 * 1000; // 规定有效时间 + private long[] mHits = new long[COUNTS]; + + private void continuousClick(int count, long time) { + //每次点击时,数组向前移动一位 + System.arraycopy(mHits, 1, mHits, 0, mHits.length - 1); + //为数组最后一位赋值 + mHits[mHits.length - 1] = SystemClock.uptimeMillis(); + if (mHits[0] >= SystemClock.uptimeMillis() - DURATION) { + mHits = new long[COUNTS]; //重新初始化数组 + ToastUtil.show("正在检查更新"); + } + } + + public static String activation = "gankao_activation"; + + private void setClickable() { + int isEnabled = Settings.System.getInt(getContentResolver(), activation, 0); + if (isEnabled == 0) { + bt_activation.setEnabled(true); + bt_activation.setText("激活学习系统"); + } else { + bt_activation.setEnabled(false); + bt_activation.setText("已激活学习系统"); + } + if (BuildConfig.DEBUG) { + bt_activation.setEnabled(true); + bt_activation.setText("激活学习系统"); + } + } + + + private void startService() { + startService(new Intent(this, MainService.class)); + startService(new Intent(this, GuardService.class)); + startService(new Intent(this, StepService.class)); + startService(new Intent(this, MyDownloadService.class)); + startService(new Intent(this, ManagerService.class)); + } + + private void registerReceiver() { + registerMessageReceiver(); + registerRefreshReceiver(); + } + + public static final String REFRESHACTION = BuildConfig.APPLICATION_ID + ".REFRESH"; + + private RefreshReceiver mRefreshReceiver = new RefreshReceiver(); + + private void registerRefreshReceiver() { + IntentFilter filter = new IntentFilter(); + filter.setPriority(IntentFilter.SYSTEM_HIGH_PRIORITY); + filter.addAction(REFRESHACTION); + registerReceiver(mRefreshReceiver, filter); + } + + class RefreshReceiver extends BroadcastReceiver { + @Override + public void onReceive(Context context, Intent intent) { + if (REFRESHACTION.equals(intent.getAction())) { + mPresenter.getInfo(); + } + } + } + + //for receive customer msg from jpush server + private MessageReceiver mMessageReceiver = new MessageReceiver(); + + private String MESSAGE_RECEIVED_ACTION = "com.info.sn.MESSAGE_RECEIVED_ACTION"; + private String KEY_TITLE = "title"; + private String KEY_MESSAGE = "message"; + private String KEY_EXTRAS = "extras"; + + private void registerMessageReceiver() { + IntentFilter filter = new IntentFilter(); + filter.setPriority(IntentFilter.SYSTEM_HIGH_PRIORITY); + filter.addAction(MESSAGE_RECEIVED_ACTION); + LocalBroadcastManager.getInstance(this).registerReceiver(mMessageReceiver, filter); + } + + class MessageReceiver extends BroadcastReceiver { + @Override + public void onReceive(Context context, Intent intent) { + if (MESSAGE_RECEIVED_ACTION.equals(intent.getAction())) { + String messge = intent.getStringExtra(KEY_MESSAGE); + String extras = intent.getStringExtra(KEY_EXTRAS); + StringBuilder showMsg = new StringBuilder(); + showMsg.append(KEY_MESSAGE + " : " + messge + "\n"); + if (!ExampleUtil.isEmpty(extras)) { + showMsg.append(KEY_EXTRAS + " : " + extras + "\n"); + } + } + } + } + + @Override + public void setQRCode(@NotNull Bitmap bitmap) { + qr_code.setImageBitmap(bitmap); + mPresenter.initAmap(); + } + + @Override + public void setInfo(BaseResponse response) { + int code = response.code; + if (code == 200) { + UserInfo userInfo = response.data; + SPUtils.put(this, Configs.isLogined, 1); + SPUtils.put(this, "member_id", userInfo.getMember_id()); + SPUtils.put(this, "sn_id", userInfo.getId()); + if (!TextUtils.isEmpty(userInfo.getSn_name())) { + SPUtils.put(this, "USERINFO_NAME", userInfo.getSn_name()); + tv_username.setText(userInfo.getSn_name()); + } + if (!TextUtils.isEmpty(userInfo.getSchool())) { + SPUtils.put(this, "USERINFO_SCHOOL", userInfo.getSchool()); + tv_school.setText(userInfo.getSchool()); + } + if (!TextUtils.isEmpty(userInfo.getGrade())) { + SPUtils.put(this, "USERINFO_GRADE", userInfo.getGrade()); + tv_grade.setText(userInfo.getGrade()); + } + mPresenter.getLocked(); + } else if (code == 300) { + tv_username.setText(defaultText); + tv_school.setText(defaultText); + tv_grade.setText(defaultText); + ControlManager.getInstance().setDisableSetting(); + } else if (code == 400) { + ToastUtil.show("设备未经授权"); + Log.e(TAG, "setInfo: " + "设备未经授权"); + ControlManager.getInstance().setDisableSetting(); + } + Log.e(TAG, "setInfo: " + (System.currentTimeMillis() - time0) + "ms"); + } + + @Override + public void setUserInfo() { + + } + + @Override + public void setLocked(int lockedStatus) { + switch (lockedStatus) { + case 0: +// tv_note.setText("设备未绑定"); + ControlManager.getInstance().setDisableSetting(); + break; + case 1: +// tv_note.setText("设备已绑定"); + break; + case 2: + ControlManager.getInstance().setDisableSetting(); +// tv_note.setText("未经验证的设备,请联系客服"); + break; + default: + break; + } + mPresenter.checkUpdate(); + } + + @Override + public void onLocationChanged() { + HTTPInterface.updateAdminInfo(this); + } + + @Override + public void checkUpdateFinish() { + mPresenter.getAllApp(); + } + + @Override + public void getAllAppFinish() { + mPresenter.getAppInside(); + } + + @Override + public void setAppInside() { + mPresenter.getForceInstall(); + } + + @Override + public void setForceInstall() { + mPresenter.getSystemSettings(); + } + + @Override + public void setSystemSettings() { + mPresenter.getBrowserLabel(); + } + + @Override + public void setBrowserLabel() { + mPresenter.getBrowserWhiteList(); + } + + @Override + public void setBrowserWhiteList() { + mPresenter.getAppStart(); + } + + @Override + public void setAppStart() { + Log.e(TAG, "SettingFinished: " + (System.currentTimeMillis() - timeMillis) + " ms"); + mPresenter.getTimeControl(); + } + + @Override + public void setTimeControl() { + + } + + +} diff --git a/app/src/main/java/com/info/sn/activity/main/MainContact.java b/app/src/main/java/com/info/sn/activity/main/MainContact.java new file mode 100644 index 0000000..15b549d --- /dev/null +++ b/app/src/main/java/com/info/sn/activity/main/MainContact.java @@ -0,0 +1,71 @@ +package com.info.sn.activity.main; + +import android.graphics.Bitmap; + +import com.info.sn.bean.zuoye.BaseResponse; +import com.info.sn.bean.zuoye.UserInfo; +import com.info.sn.bean.gankao.AvailableProduct; +import com.info.sn.mvp.BasePresenter; +import com.info.sn.mvp.BaseView; + +import java.util.List; + +public class MainContact { + public interface MainView extends BaseView { + void checkSNFinish(int code); + void setGankaoUID(String gankaoUID); + void setAvailableProduct( List availableProductList); + void activeUser( int code); + + void setQRCode(Bitmap bitmap); + void setInfo(BaseResponse response); + void setUserInfo(); + void setLocked(int lockedStatus); + void onLocationChanged(); + void checkUpdateFinish(); + void getAllAppFinish(); + void setAppInside(); + void setForceInstall(); + void setSystemSettings(); + void setBrowserLabel(); + void setBrowserWhiteList(); + void setAppStart(); + void setTimeControl(); + } + + interface Presenter extends BasePresenter { + void checkSN(); + void getGankaoUID(); + void queryAvailableProduct(); + void activeUser(AvailableProduct product); + + //获取二维码 + void getQRCode(); + //获取设备信息 + void getInfo(); + //获取头像昵称 + void getUserInfo(); + //获取锁定状态 + void getLocked(); + //初始化地图 + void initAmap(); + //检查更新 + void checkUpdate(); + //获取所有app包名 + void getAllApp(); + //获取id管控 + void getAppInside(); + //获取强制下载 + void getForceInstall(); + //获取系统设置 + void getSystemSettings(); + //获取浏览器书签 + void getBrowserLabel(); + //获取浏览器黑白名单 + void getBrowserWhiteList(); + //应用自启 + void getAppStart(); + //获取时间管控、 + void getTimeControl(); + } +} diff --git a/app/src/main/java/com/info/sn/activity/main/MainPresenter.java b/app/src/main/java/com/info/sn/activity/main/MainPresenter.java new file mode 100644 index 0000000..fa11081 --- /dev/null +++ b/app/src/main/java/com/info/sn/activity/main/MainPresenter.java @@ -0,0 +1,844 @@ +package com.info.sn.activity.main; + +import android.annotation.SuppressLint; +import android.content.Context; +import android.content.Intent; +import android.graphics.Bitmap; +import android.os.Build; +import android.provider.Settings; +import android.text.TextUtils; +import android.util.Log; + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; +import com.amap.api.location.AMapLocation; +import com.amap.api.location.AMapLocationClient; +import com.amap.api.location.AMapLocationListener; +import com.google.gson.Gson; +import com.google.gson.JsonObject; +import com.google.gson.reflect.TypeToken; +import com.info.sn.bean.gankao.AvailableProduct; +import com.info.sn.bean.gankao.CreateUserBean; +import com.info.sn.bean.gankao.GankaoBaseResponse; +import com.info.sn.bean.zuoye.AppInfo; +import com.info.sn.bean.zuoye.AppStart; +import com.info.sn.bean.zuoye.BaseResponse; +import com.info.sn.bean.zuoye.BrowserBean; +import com.info.sn.bean.zuoye.Response; +import com.info.sn.bean.zuoye.SystemSettings; +import com.info.sn.bean.zuoye.UserAvatarInfo; +import com.info.sn.bean.zuoye.UserInfo; +import com.info.sn.config.Configs; +import com.info.sn.config.Scheme; +import com.info.sn.manager.AmapManager; +import com.info.sn.manager.ControlManager; +import com.info.sn.manager.NetInterfaceManager; +import com.info.sn.network.HTTPInterface; +import com.info.sn.service.ManagerService; +import com.info.sn.utils.ApkUtils; +import com.info.sn.utils.CXAESUtil; +import com.info.sn.utils.JGYUtils; +import com.info.sn.utils.LaunchTools; +import com.info.sn.utils.SPUtils; +import com.info.sn.utils.TimeUtils; +import com.info.sn.utils.ToastUtil; +import com.info.sn.utils.URLUtils; +import com.info.sn.utils.Utils; +import com.trello.rxlifecycle2.LifecycleProvider; +import com.trello.rxlifecycle2.android.ActivityEvent; + +import org.jetbrains.annotations.NotNull; + +import java.lang.reflect.Type; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.HashSet; +import java.util.List; + +import io.reactivex.Observer; +import io.reactivex.android.schedulers.AndroidSchedulers; +import io.reactivex.disposables.Disposable; +import io.reactivex.schedulers.Schedulers; + +/** + * @author jgy02 + */ +public class MainPresenter implements MainContact.Presenter { + private String TAG; + + private MainContact.MainView mView; + private Context mContext; + + public MainPresenter(Context context) { + this.mContext = context; + TAG = context.getClass().getSimpleName() + "." + MainPresenter.class.getSimpleName() + ":"; + } + + private LifecycleProvider provider; + + public void setProvider(LifecycleProvider provider) { + this.provider = provider; + } + + public LifecycleProvider getProvider() { + return provider; + } + + @Override + public void attachView(MainContact.MainView view) { + this.mView = view; + } + + @Override + public void detachView() { + this.mView = null; + } + + + @Override + public void checkSN() { + NetInterfaceManager.getInstance() + .getsnInfoControl() + .compose(getProvider().bindUntilEvent(ActivityEvent.DESTROY)) + .subscribe(new Observer>() { + @Override + public void onSubscribe(Disposable d) { + Log.e(TAG + "checkSN", "onSubscribe: "); + } + + @Override + public void onNext(BaseResponse userInfoBaseResponse) { + Log.e(TAG + "checkSN", "onNext: "); + int code = userInfoBaseResponse.code; + mView.checkSNFinish(code); + } + + @Override + public void onError(Throwable e) { + Log.e(TAG + "checkSN", "onError: " + e.getMessage()); + mView.checkSNFinish(404); + onComplete(); + } + + @Override + public void onComplete() { + + Log.e(TAG + TAG + "checkSN", "onComplete: "); + } + }); + } + + /** + * 创建赶考账户 + */ + @Override + public void getGankaoUID() { + String appid = Scheme.partner_id; + String timestamp = String.valueOf(System.currentTimeMillis()); + String uid = Utils.getSerial(); + Log.e(TAG + TAG, "getGankaoUID: uid: $uid"); + if (TextUtils.isEmpty(uid) || "0".equals(uid)) { + ToastUtil.show("设备未绑定账号,请绑定后重试"); + return; + } + + HashMap params = new HashMap<>(); + params.put("appid", appid); + params.put("timestamp", timestamp); + params.put("uid", uid); + + NetInterfaceManager.getInstance() + .getCreateUserControl() + .createUser(appid, timestamp, uid, LaunchTools.getToken(params)) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .compose(getProvider().bindUntilEvent(ActivityEvent.DESTROY)) + .subscribe(new Observer() { + @Override + public void onSubscribe(Disposable d) { + Log.e(TAG + "getGankaoUID", "onSubscribe: "); + } + + @Override + public void onNext(GankaoBaseResponse gankaoBaseResponse) { + Log.e(TAG + "getGankaoUID", "onNext: " + JSONObject.toJSONString(gankaoBaseResponse)); + if (gankaoBaseResponse.code == 10002) { + Type type = new TypeToken() { + }.getType(); + Gson gson = new Gson(); + CreateUserBean userBean = gson.fromJson(gson.toJson(gankaoBaseResponse.data), type); + String gankaoPartnerUID = userBean.getGankaoPartnerUID(); + int gankaoUIDint = userBean.getGankaoUID(); + String gankaoUID = String.valueOf(gankaoUIDint); + sendUid(gankaoUID); + Log.e(TAG + "getGankaoUID", "onNext: gankaoUID: $gankaoUID"); + SPUtils.put(mContext, "gankaoUID", gankaoUID); + Settings.System.putString(mContext.getContentResolver(), "gankaoUID", gankaoUID); + int isNew = userBean.getIsNew(); + mView.setGankaoUID(gankaoUID); + } else { + mView.setGankaoUID(""); + } + + } + + @Override + public void onError(Throwable e) { + mView.setGankaoUID(""); + Log.e(TAG + "getGankaoUID", "onError: " + e.getMessage()); + } + + @Override + public void onComplete() { + Log.e(TAG + "getGankaoUID", "onComplete: "); + } + }); + } + + /** + * @param gankaoUID 发送赶考uid到后台 + */ + private void sendUid(String gankaoUID) { + NetInterfaceManager.getInstance() + .getSaveSnUidApiControl(gankaoUID) + .compose(getProvider().bindUntilEvent(ActivityEvent.DESTROY)) + .subscribe(new Observer() { + @Override + public void onSubscribe(Disposable d) { + Log.e(TAG + "sendUid", "onSubscribe: "); + } + + @Override + public void onNext(Response response) { + Log.e(TAG + "sendUid", "onNext: " + response); + if (response.code == 200) { + Log.e(TAG + "sendUid", "onNext: " + response.msg); + } + } + + @Override + public void onError(Throwable e) { + Log.e(TAG + "sendUid", "onError: " + e.getMessage()); + } + + @Override + public void onComplete() { + Log.e(TAG + "sendUid", "onComplete: "); + } + }); + } + + @Override + public void queryAvailableProduct() { + String appid = Scheme.partner_id; + String timestamp = String.valueOf(System.currentTimeMillis()); + HashMap params = new HashMap<>(); + params.put("appid", appid); + params.put("timestamp", timestamp); + NetInterfaceManager.getInstance() + .getQueryProductControl() + .activeUser(appid, timestamp, LaunchTools.getToken(params)) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .compose(getProvider().bindUntilEvent(ActivityEvent.DESTROY)) + .subscribe(new Observer() { + @Override + public void onSubscribe(Disposable d) { + Log.e(TAG + "queryAvailableProduct", "onSubscribe: "); + } + + @Override + public void onNext(GankaoBaseResponse gankaoBaseResponse) { + Log.e(TAG + "queryAvailableProduct", "onNext: " + JSONObject.toJSONString(gankaoBaseResponse)); + if (gankaoBaseResponse.code == 10000) { + Type type = new TypeToken>() { + }.getType(); + Gson gson = new Gson(); + List availableProductList = gson.fromJson(gson.toJson(gankaoBaseResponse.data), type); + mView.setAvailableProduct(availableProductList); + } else { + ToastUtil.show("获取激活套餐失败"); + mView.setAvailableProduct(new ArrayList()); + } + } + + @Override + public void onError(Throwable e) { + Log.e(TAG + "queryAvailableProduct", "onError: " + e.getMessage()); + mView.setAvailableProduct(new ArrayList()); + } + + @Override + public void onComplete() { + Log.e(TAG + "queryAvailableProduct", "onComplete: "); + } + }); + } + + @Override + public void activeUser(@NotNull AvailableProduct product) { + int specification_id = product.getSpecification_id(); + Log.e(TAG, "activeUser: specification_id: " + specification_id); + String appid = Scheme.partner_id; + String timestamp = String.valueOf(System.currentTimeMillis()); + String uid = Utils.getSerial(); + HashMap params = new HashMap<>(); + params.put("appid", appid); + params.put("timestamp", timestamp); + params.put("uid", uid); + params.put("specification_id", String.valueOf(specification_id)); + + NetInterfaceManager.getInstance() + .getActiveUserControl() + .activeUser(appid, timestamp, LaunchTools.getToken(params), uid, specification_id) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .compose(getProvider().bindUntilEvent(ActivityEvent.DESTROY)) + .subscribe(new Observer() { + @Override + public void onSubscribe(Disposable d) { + Log.e(TAG + "activeUser", "onSubscribe: "); + } + + @Override + public void onNext(GankaoBaseResponse gankaoBaseResponse) { + Log.e(TAG + "activeUser", "onNext: "); + switch (gankaoBaseResponse.code) { + case 10000: + case 50000: + Settings.System.putInt(mContext.getContentResolver(), MainActivity.activation, 1); + break; + default: + Settings.System.putInt(mContext.getContentResolver(), MainActivity.activation, 0); + break; + + } + mView.activeUser(gankaoBaseResponse.code); + } + + @Override + public void onError(Throwable e) { + Log.e(TAG + "activeUser", "onError: "); + mView.activeUser(0); + } + + @Override + public void onComplete() { + Log.e(TAG + "activeUser", "onComplete: "); + } + }); + } + + @Override + public void getQRCode() { + String encryptString = CXAESUtil.encrypt(Configs.AES_KEY, Utils.getSerial()); + Log.e(TAG + TAG, "setImageAndText: " + encryptString); + Bitmap bitmap = Utils.createQRImage(encryptString, 300, 300); + mView.setQRCode(bitmap); + } + + @Override + public void getInfo() { + NetInterfaceManager.getInstance() + .getsnInfoControl() + .compose(getProvider().bindUntilEvent(ActivityEvent.DESTROY)) + .subscribe(new Observer>() { + @Override + public void onSubscribe(Disposable d) { + Log.e(TAG + "getInfo", "onSubscribe: "); + } + + @Override + public void onNext(BaseResponse userInfoBaseResponse) { + Log.e(TAG + "getInfo", "onNext: "); + if (userInfoBaseResponse.code == 200) { + UserInfo userInfo = userInfoBaseResponse.data; + boolean username = Settings.System.putString(mContext.getContentResolver(), "UserInfo_username", userInfo.getSn_name()); + boolean gread = Settings.System.putString(mContext.getContentResolver(), "UserInfo_grade", userInfo.getGrade()); + mView.setInfo(userInfoBaseResponse); + } + } + + @Override + public void onError(Throwable e) { + Log.e(TAG + "getInfo", "onError: " + e.getMessage()); + onComplete(); + } + + @Override + public void onComplete() { + Log.e(TAG + "getInfo", "onComplete: "); + } + }); + } + + @Override + public void getUserInfo() { + NetInterfaceManager.getInstance() + .getUserAvatarInfoControl() + .compose(getProvider().bindUntilEvent(ActivityEvent.DESTROY)) + .subscribe(new Observer>() { + @Override + public void onSubscribe(Disposable d) { + Log.e(TAG + "getUserInfo", "onSubscribe: "); + } + + @Override + public void onNext(BaseResponse userAvatarInfoBaseResponse) { + Log.e(TAG + "getUserInfo", "onNext: "); + if (userAvatarInfoBaseResponse.code == 200) { + UserAvatarInfo info = userAvatarInfoBaseResponse.data; + if (!TextUtils.isEmpty(info.getUsername())) { + Log.e(TAG + "getUserInfo", "onNext: " + " " + info.getUsername()); + } + if (!TextUtils.isEmpty(info.getAvatar())) { + boolean avatar = Settings.System.putString(mContext.getContentResolver(), "UserInfo_avatar", info.getAvatar()); + Log.e(TAG + "getUserInfo", "onNext: " + avatar + " " + info.getAvatar()); + } + if (!TextUtils.isEmpty(info.getGread())) { + Log.e(TAG + "getUserInfo", "onNext: " + " " + info.getGread()); + } + boolean id = Settings.System.putInt(mContext.getContentResolver(), "UserInfo_userid", info.getId()); + Log.e(TAG + "getUserInfo", "onNext: " + id + " " + info.getId()); + } + } + + @Override + public void onError(Throwable e) { + Log.e(TAG + "getUserInfo", "onError: " + e.getMessage()); + } + + @Override + public void onComplete() { + Log.e(TAG + "getUserInfo", "onComplete: "); + } + }); + } + + @Override + public void getLocked() { + int statu = (int) SPUtils.get(mContext, Configs.isLogined, 0); + mView.setLocked(statu); + } + + @Override + public void initAmap() { + AMapLocationClient aMapLocationClient = AmapManager.getInstance().getLocationClient(); + aMapLocationClient.stopLocation(); + aMapLocationClient.startLocation(); + aMapLocationClient.setLocationListener(new AMapLocationListener() { + @Override + public void onLocationChanged(AMapLocation aMapLocation) { + mView.onLocationChanged(); + } + }); + } + + @Override + public void checkUpdate() { + mView.checkUpdateFinish(); + } + + @Override + @SuppressLint("NewApi") + public void getAllApp() { + NetInterfaceManager.getInstance() + .getQueryAllAppControl() + .compose(getProvider().bindUntilEvent(ActivityEvent.DESTROY)) + .subscribe(new Observer>>() { + @Override + public void onSubscribe(Disposable d) { + Log.e(TAG + "getAllApp", "onSubscribe: "); + } + + @Override + public void onNext(BaseResponse> listBaseResponse) { + Log.e(TAG + "getAllApp", "onNext: "); + int code = listBaseResponse.code; + if (code == 200) { + List appInfoList = listBaseResponse.data; + if (appInfoList == null || appInfoList.size() == 0) { + ApkUtils.writeAppPackageList(mContext, "Invalid"); + } else { + HashSet allPkgSet = new HashSet(); + for (AppInfo pkg : appInfoList) { + allPkgSet.add(pkg.getApp_package()); + } + String allPkgString = String.join(",", allPkgSet); + ApkUtils.writeAppPackageList(mContext, allPkgString); + HTTPInterface.getAppStart(mContext, appInfoList); + } + } + } + + @Override + public void onError(Throwable e) { + Log.e(TAG + "getAllApp", "onError: " + e.getMessage()); + onComplete(); + } + + @Override + public void onComplete() { + Log.e(TAG + "getAllApp", "onComplete: "); + mView.getAllAppFinish(); + } + }); + } + + @Override + public void getAppInside() { + NetInterfaceManager.getInstance() + .getAppInsideControl() + .compose(getProvider().bindUntilEvent(ActivityEvent.DESTROY)) + .subscribe(new Observer() { + @Override + public void onSubscribe(Disposable d) { + Log.e("getAppInside", "onSubscribe: "); + } + + @Override + public void onNext(BaseResponse baseResponse) { + String jsonString = JSON.toJSONString(baseResponse.data); + Log.e("getAppInside", "onNext: " + jsonString); + if (baseResponse.code == 200) { + JSONObject jsonObject = JSON.parseObject(jsonString); + String ids = jsonObject.getString("ids"); + String packages = jsonObject.getString("package"); + JGYUtils.getInstance().writeDeselectIDtoSystem(ids, packages); + } else { + Log.e("getAppInside", "onNext: " + baseResponse.msg); + } + } + + @Override + public void onError(Throwable e) { + Log.e("getAppInside", "onError: " + e.getMessage()); + onComplete(); + } + + @Override + public void onComplete() { + Log.e("getAppInside", "onComplete: "); + mView.setAppInside(); + } + }); + } + + @Override + public void getForceInstall() { + NetInterfaceManager.getInstance() + .getForceInstallControl() + .compose(getProvider().bindUntilEvent(ActivityEvent.DESTROY)) + .subscribe(new Observer>>() { + @Override + public void onSubscribe(Disposable d) { + Log.e(TAG + "getForceInstall", "onSubscribe: "); + } + + @Override + public void onNext(BaseResponse> listBaseResponse) { + Log.e(TAG + "getForceInstall", "onNext: "); + int code = listBaseResponse.code; + if (code == 200) { + List appInfos = listBaseResponse.data; + if (null != appInfos && appInfos.size() != 0) { + HTTPInterface.getForceInstallState(mContext, appInfos); + } + } else { + boolean qch_force_app = JGYUtils.putString(mContext.getContentResolver(), "qch_force_app", "invalid"); + Log.e(TAG + TAG, "qch_force_app: invalid: " + qch_force_app); + } + } + + @Override + public void onError(Throwable e) { + Log.e(TAG + "getForceInstall", "onError: "); + onComplete(); + } + + @Override + public void onComplete() { + Log.e(TAG + "getForceInstall", "onComplete: "); + mView.setForceInstall(); + } + }); + } + + @Override + public void getSystemSettings() { + NetInterfaceManager.getInstance() + .getsettingKTControl() + .compose(getProvider().bindUntilEvent(ActivityEvent.DESTROY)) + .subscribe(new Observer>() { + @Override + public void onSubscribe(Disposable d) { + Log.e(TAG + "getSystemSettings", "onSubscribe: "); + } + + @Override + public void onNext(BaseResponse systemSettingsBaseResponse) { + Log.e(TAG + "getSystemSettings", "onNext: "); + int code = systemSettingsBaseResponse.code; + if (code == 200) { + JSONObject jsonObject = (JSONObject) JSON.toJSON(systemSettingsBaseResponse.data); + Log.e(TAG + "getSystemSettings", "onNext: settings: " + jsonObject.toString()); + ControlManager.getInstance().setSystemSetting(mContext, jsonObject.toJSONString()); + } else { + + } + } + + @Override + public void onError(Throwable e) { + Log.e(TAG + "getSystemSettings", "onError: " + e.getMessage()); + onComplete(); + } + + @Override + public void onComplete() { + Log.e(TAG + "getSystemSettings", "onComplete: "); + mView.setSystemSettings(); + } + }); + } + + @Override + public void getBrowserLabel() { + NetInterfaceManager.getInstance() + .getLabelControl() + .compose(getProvider().bindUntilEvent(ActivityEvent.DESTROY)) + .subscribe(new Observer() { + @Override + public void onSubscribe(Disposable d) { + Log.e(TAG + "getBrowserLabel", "onSubscribe: "); + } + + @Override + public void onNext(BaseResponse baseResponse) { + Log.e(TAG + "getBrowserLabel", "onNext: " + baseResponse); + int code = baseResponse.code; + if (code == 200) { + Gson gson = new Gson(); + String data = gson.toJson(baseResponse.data); + JsonObject jsonObject = gson.fromJson(data, JsonObject.class); +// JsonElement label = jsonObject.get(0).getAsJsonObject(); + String home_page = jsonObject.get("home_page").getAsString(); + JGYUtils.putString(mContext.getContentResolver(), "homepagURL", home_page); + String label_page = jsonObject.get("label_page").getAsString(); +// Log.e("getBrowserLabel", "onNext: " + home_page); + //主页 + Intent homepag = new Intent("qch_app_brower_homepage"); + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { + homepag.setPackage("com.android.settings") + .setPackage("com.android.browser"); + } + if (home_page != null && !home_page.equals("")) { + homepag.putExtra("homepage", home_page); + } else { + homepag.putExtra("homepage", "Invalid"); + } + mContext.sendBroadcast(homepag); + + //书签 + Intent websiteBookMark = new Intent("qch_app_brower_website"); + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { + websiteBookMark.setPackage("com.android.settings") + .setPackage("com.android.browser"); + } + if (label_page != null && !label_page.equals("")) { + websiteBookMark.putExtra("websiteBookMark", label_page); + } else { + websiteBookMark.putExtra("websiteBookMark", "Invalid"); + } + mContext.sendBroadcast(websiteBookMark); + } else { + Intent intent1 = new Intent("qch_app_brower_homepage"); + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { + intent1.setPackage("com.android.settings") + .setPackage("com.android.browser"); + } + intent1.putExtra("homepage", "Invalid"); + mContext.sendBroadcast(intent1); + Intent intent2 = new Intent("qch_app_brower_website"); + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { + intent2.setPackage("com.android.settings") + .setPackage("com.android.browser"); + } + intent2.putExtra("websiteBookMark", "Invalid"); + mContext.sendBroadcast(intent2); + } + } + + @Override + public void onError(Throwable e) { + Log.e(TAG + "getBrowserLabel", "onError: " + e.getMessage()); + onComplete(); + } + + @Override + public void onComplete() { + Log.e(TAG + "getBrowserLabel", "onComplete: "); + mView.setBrowserLabel(); + } + }); + } + + /** + * 浏览器黑白名单 + */ + @Override + public void getBrowserWhiteList() { + NetInterfaceManager.getInstance() + .getBrowserControl() + .compose(getProvider().bindUntilEvent(ActivityEvent.DESTROY)) + .subscribe(new Observer() { + @Override + public void onSubscribe(Disposable d) { + Log.e(TAG + "getBrowserWhiteList", "onSubscribe: "); + } + + @Override + public void onNext(BaseResponse baseResponse) { + Log.e(TAG + "getBrowserWhiteList", "onNext: "); + int code = baseResponse.code; + if (code == 200) { + JSONObject jsonObject = (JSONObject) JSON.toJSON(baseResponse.data); + //白名单 + List white = JSON.parseArray(jsonObject.getString("browser"), BrowserBean.class); + if (null != white && white.size() != 0) { + StringBuilder s = new StringBuilder(); + for (BrowserBean bean : white) { + s.append(bean.getAddress()).append(","); + } + boolean whiteList = JGYUtils.putString(mContext.getContentResolver(), "DeselectBrowserArray", s.toString()); + Log.e(TAG + "getBrowserWhiteList", "setBrowserList_white: "); + } else { + JGYUtils.putString(mContext.getContentResolver(), "DeselectBrowserArray", " "); + } + //黑名单 + List black = JSON.parseArray(jsonObject.getString("browser_black"), BrowserBean.class); + if (null != black && black.size() != 0) { + StringBuilder s = new StringBuilder(); + for (BrowserBean bean : black) { + s.append(bean.getAddress()).append(","); + } + boolean blackList = JGYUtils.putString(mContext.getContentResolver(), "qch_webblack_url", s.toString()); + Log.e(TAG + "getBrowserWhiteList", "setBrowserList_black:$blackList:$black"); + } else { + JGYUtils.putString(mContext.getContentResolver(), "qch_webblack_url", " "); + } + } + } + + @Override + public void onError(Throwable e) { + Log.e(TAG + "getBrowserWhiteList", "onError: " + e.getMessage()); + onComplete(); + } + + @Override + public void onComplete() { + new URLUtils(mContext).setBrowserList(); + mView.setBrowserWhiteList(); + Log.e(TAG + "getBrowserWhiteList", "onComplete: "); + } + }); + } + + @Override + public void getAppStart() { + NetInterfaceManager.getInstance() + .getAppStartControl() + .compose(getProvider().bindUntilEvent(ActivityEvent.DESTROY)) + .subscribe(new Observer>>() { + @Override + public void onSubscribe(Disposable d) { + Log.e(TAG + "getAppStart", "onSubscribe: "); + } + + @Override + public void onNext(BaseResponse> listBaseResponse) { + Log.e(TAG + "getAppStart", "onNext: "); + int code = listBaseResponse.code; + if (code == 200) { + List list = listBaseResponse.data; + HTTPInterface.setAppState(mContext, list); + } else { + HTTPInterface.setInvalid(mContext); + } + } + + @Override + public void onError(Throwable e) { + Log.e(TAG + "getAppStart", "onError: " + e.getMessage()); + onComplete(); + } + + @Override + public void onComplete() { + Log.e(TAG + "getAppStart", "onComplete: "); + mView.setAppStart(); + } + }); + } + + @Override + public void getTimeControl() { + NetInterfaceManager.getInstance() + .getTimeControl() + .compose(getProvider().bindUntilEvent(ActivityEvent.DESTROY)) + .subscribe(new Observer() { + @Override + public void onSubscribe(Disposable d) { + Log.e(TAG + "getTimeControl", "onSubscribe: "); + } + + @Override + public void onNext(BaseResponse baseResponse) { + Log.e(TAG + "getTimeControl", "onNext: "); + int code = baseResponse.code; + if (code == 200) { + JSONObject jsonObject = (JSONObject) JSON.toJSON(baseResponse.data); + JSONObject work = jsonObject.getJSONObject("work"); + String work_start_time = work.getString("start_time"); + String work_end_time = work.getString("end_time"); + JSONObject rest = jsonObject.getJSONObject("rest"); + String rest_start_time = rest.getString("start_time"); + String rest_end_time = rest.getString("end_time"); + TimeUtils.ContralTime workingTime = TimeUtils.String2WorkingTime(mContext, work_start_time + "-" + work_end_time); + TimeUtils.ContralTime weekTime = TimeUtils.String2WeekTime(mContext, rest_start_time + "-" + rest_end_time); + if (null != workingTime) { + Log.e("getTimeControl", "200:" + workingTime.toString()); + } + if (null != weekTime) { + Log.e("getTimeControl", "200:" + weekTime.toString()); + } + } else { + TimeUtils.setEmpty(mContext); + TimeUtils.ContralTime workingTime = TimeUtils.getWorkingDayContralTime(mContext); + if (null != workingTime) { + Log.e("getTimeControl", workingTime.toString()); + } + TimeUtils.ContralTime weekTime = TimeUtils.getWeekDayContralTime(mContext); + if (null != weekTime) { + Log.e("getTimeControl", weekTime.toString()); + } + } + } + + @Override + public void onError(Throwable e) { + Log.e(TAG + "getTimeControl", "onError: " + e.getMessage()); + } + + @Override + public void onComplete() { + Log.e(TAG + "getTimeControl", "onComplete: "); + Intent intent = new Intent(); + intent.setAction(ManagerService.ACTION_UPDATE); + mContext.sendBroadcast(intent); + mView.setTimeControl(); + } + }); + } +} diff --git a/app/src/main/java/com/info/sn/base/BaseActivity.java b/app/src/main/java/com/info/sn/base/BaseActivity.java new file mode 100644 index 0000000..a676920 --- /dev/null +++ b/app/src/main/java/com/info/sn/base/BaseActivity.java @@ -0,0 +1,37 @@ +package com.info.sn.base; + +import android.os.Bundle; + +import androidx.annotation.Nullable; +import androidx.appcompat.app.AppCompatActivity; + +import com.trello.rxlifecycle2.components.support.RxAppCompatActivity; + + +public abstract class BaseActivity extends RxAppCompatActivity { + @Override + protected void onCreate(@Nullable Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(this.getLayoutId()); + initView(); + initData(); + } + + /** + * 设置布局 + * + */ + public abstract int getLayoutId(); + + /** + * 初始化视图 + */ + public abstract void initView(); + + + /** + * 初始化数据 + */ + public abstract void initData(); + +} diff --git a/app/src/main/java/com/info/sn/base/BaseApplication.java b/app/src/main/java/com/info/sn/base/BaseApplication.java new file mode 100644 index 0000000..8107d82 --- /dev/null +++ b/app/src/main/java/com/info/sn/base/BaseApplication.java @@ -0,0 +1,68 @@ +package com.info.sn.base; + +import android.app.Application; +import android.os.Handler; +import android.os.Looper; +import android.util.Log; + +import com.arialyy.aria.core.Aria; +import com.blankj.utilcode.util.ProcessUtils; +import com.info.sn.BuildConfig; +import com.info.sn.manager.AmapManager; +import com.info.sn.manager.NetInterfaceManager; +import com.info.sn.manager.ControlManager; +import com.info.sn.manager.DeviceManager; +import com.info.sn.utils.JGYUtils; + +public class BaseApplication extends Application { + @Override + public void onCreate() { + super.onCreate(); + if (!getPackageName().equals(ProcessUtils.getCurrentProcessName())) { + return; + } + utilsInint(); + } + + private void utilsInint() { + if (!BuildConfig.DEBUG) { + catchException(); + } + Aria.init(this); + Aria.download(this).resumeAllTask(); + JGYUtils.init(this); + ControlManager.init(this); + DeviceManager.init(this); + AmapManager.init(this); + AmapManager.getInstance().initAmap(); + NetInterfaceManager.init(this); + JGYUtils.hookWebView(); + } + + private void catchException() { + Thread.setDefaultUncaughtExceptionHandler( + new Thread.UncaughtExceptionHandler() { + @Override + public void uncaughtException(Thread t, Throwable e) { + Log.e("捕获异常子线程:", Thread.currentThread().getName() + + "在:" + e.getStackTrace()[0].getClassName()); + } + } + ); + //下面是新增方法! + new Handler(Looper.getMainLooper()).post(new Runnable() { + @Override + public void run() { + while (true) { + try { + Looper.loop(); //会先执行这个方法,然后在执行下面的异常捕获方法! + } catch (Exception e) { + Log.e("捕获异常主线程:", Thread.currentThread().getName() + "在:" + e.getStackTrace()[0].getClassName()); + e.printStackTrace(); + } + } + } + }); + } + +} diff --git a/app/src/main/java/com/info/sn/base/MyApplication.java b/app/src/main/java/com/info/sn/base/MyApplication.java deleted file mode 100644 index 565aa1b..0000000 --- a/app/src/main/java/com/info/sn/base/MyApplication.java +++ /dev/null @@ -1,265 +0,0 @@ -package com.info.sn.base; - -import android.app.ActivityManager; -import android.app.Application; -import android.content.Context; -import android.content.Intent; -import android.content.IntentFilter; -import android.os.Build; -import android.os.Handler; -import android.os.Looper; -import android.util.Log; - -import com.amap.api.location.AMapLocation; -import com.amap.api.location.AMapLocationClient; -import com.amap.api.location.AMapLocationClientOption; -import com.amap.api.location.AMapLocationListener; -import com.arialyy.aria.core.Aria; -import com.info.sn.BuildConfig; -import com.info.sn.activity.MainActivity; -import com.info.sn.network.HTTPInterface; -import com.info.sn.receiver.APKinstallReceiver; -import com.info.sn.receiver.BootReceiver; -import com.info.sn.utils.JGYUtils; -import com.info.sn.utils.LogUtils; -import com.info.sn.utils.SPUtils; -import com.info.sn.utils.ToastUtil; - -import org.json.JSONException; -import org.json.JSONObject; - -import java.lang.reflect.Constructor; -import java.lang.reflect.Field; -import java.lang.reflect.Method; - -//import com.blankj.utilcode.util.NetworkUtils; - -//public class MyApplication extends Application implements NetworkUtils.OnNetworkStatusChangedListener { -public class MyApplication extends Application { - public static Context context; - private static MyApplication app; - private static AMapLocationClient locationClient = null; - private static String TAG = MyApplication.class.getSimpleName(); - - @Override - public void onCreate() { - super.onCreate(); - if (!getPackageName().equals(getCurrentProcessName())) { - return; - } - app = this; - if (!BuildConfig.DEBUG) { - catchException(); - } - ToastUtil.init(this); - context = getApplicationContext(); - Aria.init(this); - Aria.download(this).resumeAllTask(); - registAppReceive(); - registBootReceive(); - hookWebView(); - JGYUtils.init(this); - } - - public void hookWebView() { - int sdkInt = Build.VERSION.SDK_INT; - try { - Class factoryClass = Class.forName("android.webkit.WebViewFactory"); - Field field = factoryClass.getDeclaredField("sProviderInstance"); - field.setAccessible(true); - Object sProviderInstance = field.get(null); - if (sProviderInstance != null) { - Log.i(TAG, "sProviderInstance isn't null"); - return; - } - - Method getProviderClassMethod; - if (sdkInt > 22) { - getProviderClassMethod = factoryClass.getDeclaredMethod("getProviderClass"); - } else if (sdkInt == 22) { - getProviderClassMethod = factoryClass.getDeclaredMethod("getFactoryClass"); - } else { - Log.i(TAG, "Don't need to Hook WebView"); - return; - } - getProviderClassMethod.setAccessible(true); - Class factoryProviderClass = (Class) getProviderClassMethod.invoke(factoryClass); - Class delegateClass = Class.forName("android.webkit.WebViewDelegate"); - Constructor delegateConstructor = delegateClass.getDeclaredConstructor(); - delegateConstructor.setAccessible(true); - if (sdkInt < 26) {//低于Android O版本 - Constructor providerConstructor = factoryProviderClass.getConstructor(delegateClass); - if (providerConstructor != null) { - providerConstructor.setAccessible(true); - sProviderInstance = providerConstructor.newInstance(delegateConstructor.newInstance()); - } - } else { - Field chromiumMethodName = factoryClass.getDeclaredField("CHROMIUM_WEBVIEW_FACTORY_METHOD"); - chromiumMethodName.setAccessible(true); - String chromiumMethodNameStr = (String) chromiumMethodName.get(null); - if (chromiumMethodNameStr == null) { - chromiumMethodNameStr = "create"; - } - Method staticFactory = factoryProviderClass.getMethod(chromiumMethodNameStr, delegateClass); - if (staticFactory != null) { - sProviderInstance = staticFactory.invoke(null, delegateConstructor.newInstance()); - } - } - - if (sProviderInstance != null) { - field.set("sProviderInstance", sProviderInstance); - Log.i(TAG, "Hook success!"); - } else { - Log.i(TAG, "Hook failed!"); - } - } catch (Throwable e) { - Log.w(TAG, e); - } - } - - - /** - * 获取当前进程名 - */ - private String getCurrentProcessName() { - int pid = android.os.Process.myPid(); - String processName = ""; - ActivityManager manager = (ActivityManager) getApplicationContext().getSystemService - (Context.ACTIVITY_SERVICE); - for (ActivityManager.RunningAppProcessInfo process : manager.getRunningAppProcesses()) { - if (process.pid == pid) { - processName = process.processName; - } - } - return processName; - } - - private void catchException() { - Thread.setDefaultUncaughtExceptionHandler( - new Thread.UncaughtExceptionHandler() { - @Override - public void uncaughtException(Thread t, Throwable e) { - Log.d("捕获异常子线程:", Thread.currentThread().getName() + - "在:" + e.getStackTrace()[0].getClassName()); - } - } - ); - //下面是新增方法! - new Handler(Looper.getMainLooper()).post(new Runnable() { - @Override - public void run() { - while (true) { - try { - Looper.loop(); //会先执行这个方法,然后在执行下面的异常捕获方法! - } catch (Exception e) { - Log.d("捕获异常主线程:", Thread.currentThread().getName() + "在:" + e.getStackTrace()[0].getClassName()); - e.printStackTrace(); - } - } - } - }); - } - -// protected void attachBaseContext(Context newBase) { -// super.attachBaseContext(newBase); -// MultiDex.install(this); -// } - - - @Override - public void onTerminate() { - super.onTerminate(); - //销毁时,需要销毁定位client - if (null != locationClient) { - locationClient.onDestroy(); - } - } - - public static MyApplication getInstance() { - return app; - } - - public static Context getAppContext() { - if (context == null) { - context = getAppContext(); - } - return context; - } - - public static AMapLocationClient getLocationClient() { - if (null == locationClient) { - initAmap(); - } - return locationClient; - } - - private static void initAmap() { - locationClient = new AMapLocationClient(context); - AMapLocationClientOption option = new AMapLocationClientOption(); - option.setLocationPurpose(AMapLocationClientOption.AMapLocationPurpose.SignIn); - option.setLocationMode(AMapLocationClientOption.AMapLocationMode.Hight_Accuracy); - option.setNeedAddress(true); - //获取一次定位结果: - //该方法默认为false。 - option.setOnceLocation(true); - //获取最近3s内精度最高的一次定位结果: - //设置setOnceLocationLatest(boolean b)接口为true,启动定位时SDK会返回最近3s内精度最高的一次定位结果。 - // 如果设置其为true,setOnceLocation(boolean b)接口也会被设置为true,反之不会,默认为false。 - option.setOnceLocationLatest(true); - locationClient.setLocationOption(option); - //设置定位模式为AMapLocationMode.Hight_Accuracy,高精度模式。 - //设置定位监听 - locationClient.setLocationListener(new AMapLocationListener() { - @Override - public void onLocationChanged(AMapLocation aMapLocation) { - StringBuffer sb = new StringBuffer(); - //errCode等于0代表定位成功,其他的为定位失败,具体的可以参照官网定位错误码说明 - if (aMapLocation.getErrorCode() == 0) { - sb.append(aMapLocation.getAddress() + "\n"); - SPUtils.put(context, "AmapAddress", aMapLocation.getAddress()); - SPUtils.put(context, "longitude", aMapLocation.getLongitude()); - SPUtils.put(context, "latitude", aMapLocation.getLatitude()); - } else { - //定位失败 - sb.append("定位失败" + "\n"); - SPUtils.put(context, "AmapError", aMapLocation.getErrorInfo()); - } -// Log.e("AmapAddress", (String) SPUtils.get(context, "AmapAddress", "")); -// Log.e("AmapError", (String) SPUtils.get(context, "AmapError", "")); - Log.e("addr", sb.toString()); - HTTPInterface.updateAdminInfo(context); - } - }); - //设置场景模式后最好调用一次stop,再调用start以保证场景模式生效 - locationClient.stopLocation(); - locationClient.startLocation(); - } - - private APKinstallReceiver apKinstallReceiver; - - private void registAppReceive() { - if (null == apKinstallReceiver) { - apKinstallReceiver = new APKinstallReceiver(); - } - IntentFilter filter = new IntentFilter(); - filter.setPriority(IntentFilter.SYSTEM_HIGH_PRIORITY); - filter.addAction(Intent.ACTION_PACKAGE_ADDED); - filter.addAction(Intent.ACTION_PACKAGE_REPLACED); - filter.addAction(Intent.ACTION_PACKAGE_REMOVED); - filter.addDataScheme("package"); - registerReceiver(apKinstallReceiver, filter); - } - - private BootReceiver bootReceiver; - - private void registBootReceive() { - if (null == bootReceiver) { - bootReceiver = new BootReceiver(); - IntentFilter filter = new IntentFilter(); - filter.setPriority(IntentFilter.SYSTEM_HIGH_PRIORITY); - filter.addAction(Intent.ACTION_USER_PRESENT); - registerReceiver(bootReceiver, filter); - } - } - -} diff --git a/app/src/main/java/com/info/sn/bean/gankao/ActiveUser.java b/app/src/main/java/com/info/sn/bean/gankao/ActiveUser.java new file mode 100644 index 0000000..d913eae --- /dev/null +++ b/app/src/main/java/com/info/sn/bean/gankao/ActiveUser.java @@ -0,0 +1,6 @@ +package com.info.sn.bean.gankao; + +import java.io.Serializable; + +public class ActiveUser implements Serializable { +} diff --git a/app/src/main/java/com/info/sn/bean/gankao/AvailableProduct.java b/app/src/main/java/com/info/sn/bean/gankao/AvailableProduct.java new file mode 100644 index 0000000..b651261 --- /dev/null +++ b/app/src/main/java/com/info/sn/bean/gankao/AvailableProduct.java @@ -0,0 +1,80 @@ +package com.info.sn.bean.gankao; + +import java.io.Serializable; + +public class AvailableProduct implements Serializable { + private static final long serialVersionUID = -4302961917717416837L; + + String productname; + String product_id; + int specification_id; + String duration; + String register_autobind; + String max_apply_preuser; + String product_id_onweb; + String month; + + public String getProductname() { + return productname; + } + + public void setProductname(String productname) { + this.productname = productname; + } + + public String getProduct_id() { + return product_id; + } + + public void setProduct_id(String product_id) { + this.product_id = product_id; + } + + public int getSpecification_id() { + return specification_id; + } + + public void setSpecification_id(int specification_id) { + this.specification_id = specification_id; + } + + public String getDuration() { + return duration; + } + + public void setDuration(String duration) { + this.duration = duration; + } + + public String getRegister_autobind() { + return register_autobind; + } + + public void setRegister_autobind(String register_autobind) { + this.register_autobind = register_autobind; + } + + public String getMax_apply_preuser() { + return max_apply_preuser; + } + + public void setMax_apply_preuser(String max_apply_preuser) { + this.max_apply_preuser = max_apply_preuser; + } + + public String getProduct_id_onweb() { + return product_id_onweb; + } + + public void setProduct_id_onweb(String product_id_onweb) { + this.product_id_onweb = product_id_onweb; + } + + public String getMonth() { + return month; + } + + public void setMonth(String month) { + this.month = month; + } +} diff --git a/app/src/main/java/com/info/sn/bean/gankao/CreateUserBean.java b/app/src/main/java/com/info/sn/bean/gankao/CreateUserBean.java new file mode 100644 index 0000000..b0d41b7 --- /dev/null +++ b/app/src/main/java/com/info/sn/bean/gankao/CreateUserBean.java @@ -0,0 +1,53 @@ +package com.info.sn.bean.gankao; + +import java.io.Serializable; + +public class CreateUserBean implements Serializable { + private static final long serialVersionUID = -7317008486626554260L; + + public String gankaoPartnerUID; + public int gankaoUID; + public int isNew; + public String mobile; + public String gankaoUserRegAt; + + public String getGankaoPartnerUID() { + return gankaoPartnerUID; + } + + public void setGankaoPartnerUID(String gankaoPartnerUID) { + this.gankaoPartnerUID = gankaoPartnerUID; + } + + public int getGankaoUID() { + return gankaoUID; + } + + public void setGankaoUID(int gankaoUID) { + this.gankaoUID = gankaoUID; + } + + public int getIsNew() { + return isNew; + } + + public void setIsNew(int isNew) { + this.isNew = isNew; + } + + public String getMobile() { + return mobile; + } + + public void setMobile(String mobile) { + this.mobile = mobile; + } + + public String getGankaoUserRegAt() { + return gankaoUserRegAt; + } + + public void setGankaoUserRegAt(String gankaoUserRegAt) { + this.gankaoUserRegAt = gankaoUserRegAt; + } +} diff --git a/app/src/main/java/com/info/sn/bean/gankao/GankaoBaseResponse.java b/app/src/main/java/com/info/sn/bean/gankao/GankaoBaseResponse.java new file mode 100644 index 0000000..a716fc7 --- /dev/null +++ b/app/src/main/java/com/info/sn/bean/gankao/GankaoBaseResponse.java @@ -0,0 +1,15 @@ +package com.info.sn.bean.gankao; + +import java.io.Serializable; + +public class GankaoBaseResponse implements Serializable { + private static final long serialVersionUID = -2581656663382362871L; + + public int code; + public int status; + public String msg; + public long serverTime; + public String tokenOK; + public T data; + +} diff --git a/app/src/main/java/com/info/sn/bean/AppInfo.java b/app/src/main/java/com/info/sn/bean/zuoye/AppInfo.java similarity index 96% rename from app/src/main/java/com/info/sn/bean/AppInfo.java rename to app/src/main/java/com/info/sn/bean/zuoye/AppInfo.java index 2394538..a5a3e7d 100644 --- a/app/src/main/java/com/info/sn/bean/AppInfo.java +++ b/app/src/main/java/com/info/sn/bean/zuoye/AppInfo.java @@ -1,4 +1,4 @@ -package com.info.sn.bean; +package com.info.sn.bean.zuoye; import java.io.Serializable; @@ -8,7 +8,7 @@ public class AppInfo implements Serializable { private String app_name; private String app_package; private String app_version_name; - private int app_version_code; + private long app_version_code; private long app_size; private String app_desc; private String app_url; @@ -61,11 +61,11 @@ public class AppInfo implements Serializable { this.app_version_name = app_version_name; } - public int getApp_version_code() { + public long getApp_version_code() { return app_version_code; } - public void setApp_version_code(int app_version_code) { + public void setApp_version_code(long app_version_code) { this.app_version_code = app_version_code; } diff --git a/app/src/main/java/com/info/sn/bean/AppJump.java b/app/src/main/java/com/info/sn/bean/zuoye/AppJump.java similarity index 95% rename from app/src/main/java/com/info/sn/bean/AppJump.java rename to app/src/main/java/com/info/sn/bean/zuoye/AppJump.java index 738c18e..9d5da09 100644 --- a/app/src/main/java/com/info/sn/bean/AppJump.java +++ b/app/src/main/java/com/info/sn/bean/zuoye/AppJump.java @@ -1,4 +1,4 @@ -package com.info.sn.bean; +package com.info.sn.bean.zuoye; import androidx.annotation.NonNull; diff --git a/app/src/main/java/com/info/sn/bean/AppStart.java b/app/src/main/java/com/info/sn/bean/zuoye/AppStart.java similarity index 98% rename from app/src/main/java/com/info/sn/bean/AppStart.java rename to app/src/main/java/com/info/sn/bean/zuoye/AppStart.java index 7bab4b8..e6baf17 100644 --- a/app/src/main/java/com/info/sn/bean/AppStart.java +++ b/app/src/main/java/com/info/sn/bean/zuoye/AppStart.java @@ -1,4 +1,4 @@ -package com.info.sn.bean; +package com.info.sn.bean.zuoye; import java.io.Serializable; diff --git a/app/src/main/java/com/info/sn/bean/AppUploadInfo.java b/app/src/main/java/com/info/sn/bean/zuoye/AppUploadInfo.java similarity index 94% rename from app/src/main/java/com/info/sn/bean/AppUploadInfo.java rename to app/src/main/java/com/info/sn/bean/zuoye/AppUploadInfo.java index 76af4b4..a44ce73 100644 --- a/app/src/main/java/com/info/sn/bean/AppUploadInfo.java +++ b/app/src/main/java/com/info/sn/bean/zuoye/AppUploadInfo.java @@ -1,4 +1,4 @@ -package com.info.sn.bean; +package com.info.sn.bean.zuoye; import java.io.Serializable; diff --git a/app/src/main/java/com/info/sn/bean/zuoye/AppUsed.java b/app/src/main/java/com/info/sn/bean/zuoye/AppUsed.java new file mode 100644 index 0000000..bad251d --- /dev/null +++ b/app/src/main/java/com/info/sn/bean/zuoye/AppUsed.java @@ -0,0 +1,34 @@ +package com.info.sn.bean.zuoye; + +import java.io.Serializable; + +public class AppUsed implements Serializable { + private static final long serialVersionUID = -317163343719361595L; + String packages; + long useTime; + String app_name; + + public String getPackages() { + return packages; + } + + public void setPackages(String packages) { + this.packages = packages; + } + + public long getUseTime() { + return useTime; + } + + public void setUseTime(long useTime) { + this.useTime = useTime; + } + + public String getApp_name() { + return app_name; + } + + public void setApp_name(String app_name) { + this.app_name = app_name; + } +} diff --git a/app/src/main/java/com/info/sn/bean/BaseResponse.java b/app/src/main/java/com/info/sn/bean/zuoye/BaseResponse.java similarity index 94% rename from app/src/main/java/com/info/sn/bean/BaseResponse.java rename to app/src/main/java/com/info/sn/bean/zuoye/BaseResponse.java index 343e689..f711954 100644 --- a/app/src/main/java/com/info/sn/bean/BaseResponse.java +++ b/app/src/main/java/com/info/sn/bean/zuoye/BaseResponse.java @@ -1,4 +1,4 @@ -package com.info.sn.bean; +package com.info.sn.bean.zuoye; import androidx.annotation.NonNull; diff --git a/app/src/main/java/com/info/sn/bean/BrowserBean.java b/app/src/main/java/com/info/sn/bean/zuoye/BrowserBean.java similarity index 93% rename from app/src/main/java/com/info/sn/bean/BrowserBean.java rename to app/src/main/java/com/info/sn/bean/zuoye/BrowserBean.java index 2f87ddb..6d91032 100644 --- a/app/src/main/java/com/info/sn/bean/BrowserBean.java +++ b/app/src/main/java/com/info/sn/bean/zuoye/BrowserBean.java @@ -1,4 +1,4 @@ -package com.info.sn.bean; +package com.info.sn.bean.zuoye; import java.io.Serializable; diff --git a/app/src/main/java/com/info/sn/bean/BrowserLabel.java b/app/src/main/java/com/info/sn/bean/zuoye/BrowserLabel.java similarity index 95% rename from app/src/main/java/com/info/sn/bean/BrowserLabel.java rename to app/src/main/java/com/info/sn/bean/zuoye/BrowserLabel.java index f983805..9fd5cee 100644 --- a/app/src/main/java/com/info/sn/bean/BrowserLabel.java +++ b/app/src/main/java/com/info/sn/bean/zuoye/BrowserLabel.java @@ -1,4 +1,4 @@ -package com.info.sn.bean; +package com.info.sn.bean.zuoye; import java.io.Serializable; diff --git a/app/src/main/java/com/info/sn/utils/LocalAppInfo.java b/app/src/main/java/com/info/sn/bean/zuoye/LocalAppInfo.java similarity index 94% rename from app/src/main/java/com/info/sn/utils/LocalAppInfo.java rename to app/src/main/java/com/info/sn/bean/zuoye/LocalAppInfo.java index c8371ed..b3b7c5e 100644 --- a/app/src/main/java/com/info/sn/utils/LocalAppInfo.java +++ b/app/src/main/java/com/info/sn/bean/zuoye/LocalAppInfo.java @@ -1,8 +1,11 @@ -package com.info.sn.utils; +package com.info.sn.bean.zuoye; import android.graphics.drawable.Drawable; -public class LocalAppInfo { +import java.io.Serializable; + +public class LocalAppInfo implements Serializable { + private static final long serialVersionUID = -189981552730429360L; public static final int DOWNLOAD_STATUS_NORMAL = 0; public static final int DOWNLOAD_STATUS_DOWNLOADING = 1; diff --git a/app/src/main/java/com/info/sn/bean/zuoye/Response.java b/app/src/main/java/com/info/sn/bean/zuoye/Response.java new file mode 100644 index 0000000..294d64b --- /dev/null +++ b/app/src/main/java/com/info/sn/bean/zuoye/Response.java @@ -0,0 +1,11 @@ +package com.info.sn.bean.zuoye; + +import java.io.Serializable; + +public class Response implements Serializable { + private static final long serialVersionUID = -2174161788368394948L; + + public int code; + public String msg; + +} diff --git a/app/src/main/java/com/info/sn/bean/SystemSettings.java b/app/src/main/java/com/info/sn/bean/zuoye/SystemSettings.java similarity index 84% rename from app/src/main/java/com/info/sn/bean/SystemSettings.java rename to app/src/main/java/com/info/sn/bean/zuoye/SystemSettings.java index 4fe7655..00f4458 100644 --- a/app/src/main/java/com/info/sn/bean/SystemSettings.java +++ b/app/src/main/java/com/info/sn/bean/zuoye/SystemSettings.java @@ -1,6 +1,5 @@ -package com.info.sn.bean; +package com.info.sn.bean.zuoye; -import androidx.annotation.NonNull; import java.io.Serializable; @@ -8,27 +7,55 @@ public class SystemSettings implements Serializable { private static final long serialVersionUID = -7763589370400496883L; - private int setting_call; - private int setting_memory; - private String setting_usb; - private int setting_bluetooth; - private int setting_navigation; - private int setting_statusbar; - private int setting_tfmedia; - private String setting_phones; - private int setting_phone; - private int setting_camera; - private String setting_tfmedia_format; - private int setting_clock; - private int setting_recording; - private int setting_music; - private int setting_picture; - private int setting_wallpaper; - private int setting_file; - private int setting_bhtvideo; - private String setting_context; - private int setting_bht; - private int setting_hotspot; + int setting_call; + int setting_memory; + String setting_usb; + int setting_bluetooth; + int setting_navigation; + int setting_statusbar; + int setting_tfmedia; + String setting_phones; + int setting_phone; + int setting_camera; + String setting_tfmedia_format; + int setting_clock; + int setting_recording; + int setting_music; + int setting_picture; + int setting_wallpaper; + int setting_file; + int setting_bhtvideo; + String setting_context; + int setting_bht; + int setting_hotspot; + int qch_restore; + int setting_browserInput; + int dev_mode; + + public int getQch_restore() { + return qch_restore; + } + + public void setQch_restore(int qch_restore) { + this.qch_restore = qch_restore; + } + + public int getSetting_browserInput() { + return setting_browserInput; + } + + public void setSetting_browserInput(int setting_browserInput) { + this.setting_browserInput = setting_browserInput; + } + + public int getDev_mode() { + return dev_mode; + } + + public void setDev_mode(int dev_mode) { + this.dev_mode = dev_mode; + } + public int getSetting_call() { return setting_call; diff --git a/app/src/main/java/com/info/sn/bean/zuoye/UserAvatarInfo.java b/app/src/main/java/com/info/sn/bean/zuoye/UserAvatarInfo.java new file mode 100644 index 0000000..22a447c --- /dev/null +++ b/app/src/main/java/com/info/sn/bean/zuoye/UserAvatarInfo.java @@ -0,0 +1,44 @@ +package com.info.sn.bean.zuoye; + +import java.io.Serializable; + +public class UserAvatarInfo implements Serializable { + private static final long serialVersionUID = 7700643058775210597L; + + String username; + String avatar; + String gread; + int id; + + public String getUsername() { + return username; + } + + public void setUsername(String username) { + this.username = username; + } + + public String getAvatar() { + return avatar; + } + + public void setAvatar(String avatar) { + this.avatar = avatar; + } + + public String getGread() { + return gread; + } + + public void setGread(String gread) { + this.gread = gread; + } + + public int getId() { + return id; + } + + public void setId(int id) { + this.id = id; + } +} diff --git a/app/src/main/java/com/info/sn/bean/UserInfo.java b/app/src/main/java/com/info/sn/bean/zuoye/UserInfo.java similarity index 98% rename from app/src/main/java/com/info/sn/bean/UserInfo.java rename to app/src/main/java/com/info/sn/bean/zuoye/UserInfo.java index 8c11e0c..7509117 100644 --- a/app/src/main/java/com/info/sn/bean/UserInfo.java +++ b/app/src/main/java/com/info/sn/bean/zuoye/UserInfo.java @@ -1,4 +1,4 @@ -package com.info.sn.bean; +package com.info.sn.bean.zuoye; import java.io.Serializable; diff --git a/app/src/main/java/com/info/sn/utils/CommonData.java b/app/src/main/java/com/info/sn/config/CommonData.java similarity index 97% rename from app/src/main/java/com/info/sn/utils/CommonData.java rename to app/src/main/java/com/info/sn/config/CommonData.java index 66d843a..d71ae65 100644 --- a/app/src/main/java/com/info/sn/utils/CommonData.java +++ b/app/src/main/java/com/info/sn/config/CommonData.java @@ -1,4 +1,4 @@ -package com.info.sn.utils; +package com.info.sn.config; diff --git a/app/src/main/java/com/info/sn/config/Configs.java b/app/src/main/java/com/info/sn/config/Configs.java new file mode 100644 index 0000000..7935101 --- /dev/null +++ b/app/src/main/java/com/info/sn/config/Configs.java @@ -0,0 +1,13 @@ +package com.info.sn.config; + +public class Configs { + public static String isLogined = "isLogined"; + public static String AES_KEY = "0123456789ABCDEF"; + public static String HTTP_KEY = "YTM3YTAxNTJmMmZmNzkyM2E2YzIwZjlhZTc0NzNmMGI="; + public static String UserName = "USERINFO_NAME"; + public static String UserSchool = "USERINFO_SCHOOL"; + public static String UserGrade = "USERINFO_GRADE"; + public static String userDebugMode = "ZUOYEOS_DEBUG"; + public static String EnableDebug = "EnableDebug"; + public static String SP_Userinfo_json = "USERINFO_JSON"; +} diff --git a/app/src/main/java/com/info/sn/config/Scheme.java b/app/src/main/java/com/info/sn/config/Scheme.java new file mode 100644 index 0000000..9792a1e --- /dev/null +++ b/app/src/main/java/com/info/sn/config/Scheme.java @@ -0,0 +1,114 @@ +package com.info.sn.config; + +import android.app.Activity; +import android.content.Context; +import android.content.Intent; +import android.net.Uri; +import android.text.TextUtils; +import android.util.Log; + + +import com.info.sn.utils.CXAESUtil; +import com.info.sn.utils.Hash; +import com.info.sn.utils.Utils; + +import java.io.UnsupportedEncodingException; + +public class Scheme { + private static String TAG = Scheme.class.getSimpleName(); + + //激活 + public static final String Login = "gankao://loginFromPartner"; + //个人中心scheme地址 + public static final String ownCenter = "gankao://ownCenter"; + //app_id 渠道号 partnerID 都是这个 + public static final String partner_id = "colorful"; + //加密的 + public static final String key = "845a5d93669264baddc109a98493d8f930f641e65f4a7b8864aa934b3b98ccc9c24ba8454b0271576d7867aa623d30bd"; + //AI + public static final String AIzhijianshidu = "gankao://dotRead"; + public static final String AIzhijiancidian = "gankao://dotReadWords"; + public static final String Yingweizuowenpigai = ""; + public static final String Zhijianjuzifanyi = "gankao://dotReadSentences"; + public static final String AIkousuanpigai = ""; + public static final String Paozhaosouti = "gankao://photoSearch"; + public static final String Yuwenzuowenpigai = ""; + + //系统测 + public static final String YueduAI = "gankao://web?https://daoxue.gankao.com/evaluation"; + public static final String Kouyupingce = "gankao://capabilityAssessment"; + public static final String Yuedunenglice = "gankao://capabilityAssessment"; + + //同步课程 + public static final String Tongbukecheng = "gankao://courseList"; + public static final String Zhishidian = "gankao://knowlegeCourse"; + public static final String Zhuantikecheng = "gankao://zhuanTiCourse"; + public static final String Quweikecheng = "gankao://interestLessons"; + public static final String Tongbutingxie = "gankao://aiTingxie"; + public static final String Tongbushufa = "gankao://bishunCalligraphy"; + public static final String Tongbukousuan = "gankao://aiKousuan"; + public static final String Tongbulangdu = "gankao://courseRead"; + + //针对练 + public static final String Zaixianzuoti = "gankao://questionBankCenter"; + public static final String Mingxiaoshijuan = "gankao://schoolExamPaper"; + public static final String Banjizuoye = "gankao://classHomework"; + public static final String Jiucuoben = "gankao://wrongTitle"; + + //AI升学 + public static final String Youshengxiao = "gankao://web?https://lubo.gankao.com/tag/guoxue"; + public static final String Xiaoshengchu = "gankao://web?https://lubo.gankao.com/tag/xscxj"; + public static final String Aoshujingjiang = "gankao://aoshujingjiang"; + + //扩展 + public static final String Guoxue = "gankao://web?https://lubo.gankao.com/guoxue"; + public static final String Gushici = "gankao://ancientPoetry"; + public static final String Jiaoyu = "gankao://homeEducation"; + public static final String Zuowen = "gankao://selectCompositions"; + public static final String Mingzhu = "gankao://kewaiMingzhu"; + public static final String FM = "gankao://chengzhangying"; + public static final String Huyi = ""; + + + public static void openScheme(Activity context, String uri) { + if (TextUtils.isEmpty(uri)) { + return; + } + Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(uri)); + try { + context.startActivity(intent); + } catch (Exception e) { + Log.e(TAG, "openScheme: " + e.getMessage()); + } + } + + public static String getPublicSecret() { + try { + return CXAESUtil.decrypt(CXAESUtil.HEX, key); + } catch (Exception e) { + e.printStackTrace(); + return ""; + } + } + + public static String getSign(Context context) { + String device_id = Utils.getAndroid7MAC(); + String sign = "partner_id=" + partner_id + + "&" + "device_id=" + Uri.encode(device_id, "utf-8") + + "&" + "macaddr=" + Uri.encode(Utils.getAndroid10MAC(context), "utf-8") + + Uri.encode(getPublicSecret(), "utf-8"); + Log.e(TAG, "getLogin: " + sign); + return Hash.md5(sign); + } + + public static String getLogin(Context context) throws UnsupportedEncodingException { + String device_id = Utils.getAndroid7MAC(); + String login = Login + "?" + + "partner_id=" + partner_id + + "&" + "device_id=" + Uri.encode(device_id, "utf-8") + + "&" + "macaddr=" + Uri.encode(Utils.getAndroid10MAC(context), "utf-8") + + "&" + "sign=" + getSign(context); + Log.e(TAG, "getLogin: " + login); + return login; + } +} diff --git a/app/src/main/java/com/info/sn/dialog/ActivationDialog.java b/app/src/main/java/com/info/sn/dialog/ActivationDialog.java new file mode 100644 index 0000000..07fc72c --- /dev/null +++ b/app/src/main/java/com/info/sn/dialog/ActivationDialog.java @@ -0,0 +1,252 @@ +package com.info.sn.dialog; + + +import android.app.Dialog; +import android.content.Context; +import android.os.Bundle; +import android.text.TextUtils; +import android.view.View; +import android.widget.Button; +import android.widget.ImageView; +import android.widget.TextView; + +import androidx.appcompat.app.AlertDialog; + +import com.info.sn.R; + + +/** + * description:自定义dialog + */ + +public class ActivationDialog extends AlertDialog { + /** + * 显示的图片 + */ + private ImageView imageIv; + + /** + * 显示的标题 + */ + private TextView titleTv; + + /** + * 显示的消息 + */ + private TextView messageTv; + + /** + * 确认和取消按钮 + */ + private Button negtiveBn, positiveBn; + + /** + * 按钮之间的分割线 + */ + private View columnLineView; + + private Context mContext; + + public ActivationDialog(Context context) { + super(context, R.style.CustomDialog); + this.mContext = context; + } + + /** + * 都是内容数据 + */ + private String message; + private String title; + private String positive, negtive; + private int imageResId = -1; + + /** + * 底部是否只有一个按钮 + */ + private boolean isSingle = false; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.custom_dialog); + //按空白处不能取消动画 + setCanceledOnTouchOutside(false); + //初始化界面控件 + initView(); + //初始化界面数据 + refreshView(); + //初始化界面控件的事件 + initEvent(); + } + + /** + * 初始化界面的确定和取消监听器 + */ + private void initEvent() { + //设置确定按钮被点击后,向外界提供监听 + positiveBn.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + if (onClickBottomListener != null) { + onClickBottomListener.onPositiveClick(); + } + } + }); + //设置取消按钮被点击后,向外界提供监听 + negtiveBn.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + if (onClickBottomListener != null) { + onClickBottomListener.onNegtiveClick(); + } + } + }); + } + + /** + * 初始化界面控件的显示数据 + */ + private void refreshView() { + //如果用户自定了title和message + if (!TextUtils.isEmpty(title)) { + titleTv.setText(title); + titleTv.setVisibility(View.VISIBLE); + } else { + titleTv.setVisibility(View.GONE); + } + if (!TextUtils.isEmpty(message)) { + messageTv.setText(message); + } + //如果设置按钮的文字 + if (!TextUtils.isEmpty(positive)) { + positiveBn.setText(positive); + } else { + positiveBn.setText("确定"); + } + if (!TextUtils.isEmpty(negtive)) { + negtiveBn.setText(negtive); + } else { + negtiveBn.setText("取消"); + } + + if (imageResId != -1) { + imageIv.setImageResource(imageResId); + imageIv.setVisibility(View.VISIBLE); + } else { + imageIv.setVisibility(View.GONE); + } + /** + * 只显示一个按钮的时候隐藏取消按钮,回掉只执行确定的事件 + */ + if (isSingle) { + columnLineView.setVisibility(View.GONE); + negtiveBn.setVisibility(View.GONE); + } else { + negtiveBn.setVisibility(View.VISIBLE); + columnLineView.setVisibility(View.VISIBLE); + } + } + + @Override + public void show() { + super.show(); + refreshView(); + } + + /** + * 初始化界面控件 + */ + private void initView() { + negtiveBn = findViewById(R.id.negtive); + positiveBn = findViewById(R.id.positive); + titleTv = findViewById(R.id.title); + messageTv = findViewById(R.id.message); + imageIv = findViewById(R.id.image); + columnLineView = findViewById(R.id.column_line); + } + + /** + * 设置确定取消按钮的回调 + */ + private OnClickBottomListener onClickBottomListener; + + public void setOnClickBottomListener(OnClickBottomListener onClickBottomListener) { + this.onClickBottomListener = onClickBottomListener; + } + + public interface OnClickBottomListener { + /** + * 点击确定按钮事件 + */ + void onPositiveClick(); + + /** + * 点击取消按钮事件 + */ + void onNegtiveClick(); + } + + public String getMessage() { + return message; + } + + public ActivationDialog setMessage(String message) { + this.message = message; + return this; + } + + public String getTitle() { + return title; + } + + public ActivationDialog setTitle(String title) { + this.title = title; + return this; + } + + public String getPositive() { + return positive; + } + + public ActivationDialog setPositive(String positive) { + this.positive = positive; + return this; + } + + public String getNegtive() { + return negtive; + } + + public ActivationDialog setNegtive(String negtive) { + this.negtive = negtive; + return this; + } + + public ActivationDialog setNegtiveText(String negtive) { + negtiveBn.setText(negtive); + return this; + } + + public int getImageResId() { + return imageResId; + } + + public boolean isSingle() { + return isSingle; + } + + public ActivationDialog setSingle(boolean single) { + isSingle = single; + return this; + } + + public ActivationDialog setImageResId(int imageResId) { + this.imageResId = imageResId; + return this; + } + + @Override + public void dismiss() { + super.dismiss(); + } +} diff --git a/app/src/main/java/com/info/sn/view/CustomDialog.java b/app/src/main/java/com/info/sn/dialog/CustomDialog.java similarity index 93% rename from app/src/main/java/com/info/sn/view/CustomDialog.java rename to app/src/main/java/com/info/sn/dialog/CustomDialog.java index babb9bd..05ed70c 100644 --- a/app/src/main/java/com/info/sn/view/CustomDialog.java +++ b/app/src/main/java/com/info/sn/dialog/CustomDialog.java @@ -1,28 +1,26 @@ -package com.info.sn.view; +package com.info.sn.dialog; -import android.app.Dialog; import android.content.Context; import android.content.Intent; -import android.content.res.Configuration; -import android.content.res.Resources; import android.os.Bundle; import android.text.TextUtils; import android.view.View; -import android.view.WindowManager; import android.widget.Button; import android.widget.ImageView; import android.widget.TextView; +import androidx.appcompat.app.AlertDialog; + import com.info.sn.R; -import com.info.sn.activity.MainActivity; +import com.info.sn.activity.main.MainActivity; /** * description:自定义dialog */ -public class CustomDialog extends Dialog { +public class CustomDialog extends AlertDialog { /** * 显示的图片 */ @@ -171,11 +169,10 @@ public class CustomDialog extends Dialog { /** * 设置确定取消按钮的回调 */ - public OnClickBottomListener onClickBottomListener; + private OnClickBottomListener onClickBottomListener; - public CustomDialog setOnClickBottomListener(OnClickBottomListener onClickBottomListener) { + public void setOnClickBottomListener(OnClickBottomListener onClickBottomListener) { this.onClickBottomListener = onClickBottomListener; - return this; } public interface OnClickBottomListener { @@ -253,6 +250,7 @@ public class CustomDialog extends Dialog { public void dismiss() { super.dismiss(); Intent intent = new Intent(mContext, MainActivity.class); + intent.setAction(MainActivity.REFRESHACTION); intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); mContext.startActivity(intent); } diff --git a/app/src/main/java/com/info/sn/view/InfoDialog.java b/app/src/main/java/com/info/sn/dialog/InfoDialog.java similarity index 99% rename from app/src/main/java/com/info/sn/view/InfoDialog.java rename to app/src/main/java/com/info/sn/dialog/InfoDialog.java index 35dcaca..78e0472 100644 --- a/app/src/main/java/com/info/sn/view/InfoDialog.java +++ b/app/src/main/java/com/info/sn/dialog/InfoDialog.java @@ -1,4 +1,4 @@ -package com.info.sn.view; +package com.info.sn.dialog; import android.app.Dialog; import android.content.Context; diff --git a/app/src/main/java/com/info/sn/dialog/UserDebugDialog.java b/app/src/main/java/com/info/sn/dialog/UserDebugDialog.java new file mode 100644 index 0000000..8f5b942 --- /dev/null +++ b/app/src/main/java/com/info/sn/dialog/UserDebugDialog.java @@ -0,0 +1,254 @@ +package com.info.sn.dialog; + + +import android.app.AlertDialog; +import android.app.Dialog; +import android.content.Context; +import android.content.Intent; +import android.os.Bundle; +import android.text.TextUtils; +import android.view.View; +import android.view.inputmethod.InputMethodManager; +import android.widget.Button; +import android.widget.EditText; +import android.widget.ImageView; +import android.widget.TextView; + +import com.info.sn.R; +import com.info.sn.activity.main.MainActivity; + + +/** + * description:自定义dialog + */ + +public class UserDebugDialog extends AlertDialog { + + /** + * 显示的标题 + */ + private TextView titleTv; + + /** + * 确认和取消按钮 + */ + private Button negtiveBn, positiveBn; + + private EditText editText; + + + private Context mContext; + + public UserDebugDialog(Context context) { + super(context, R.style.UserDebugDialog); + this.mContext = context; + } + + /** + * 都是内容数据 + */ + private String message; + private String title; + private String positive, negtive; + private int imageResId = -1; + + /** + * 底部是否只有一个按钮 + */ + private boolean isSingle = false; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.userdebug_dialog); + //按空白处不能取消动画 + setCanceledOnTouchOutside(false); + //初始化界面控件 + initView(); + //初始化界面数据 + refreshView(); + //初始化界面控件的事件 + initEvent(); + } + + /** + * 初始化界面的确定和取消监听器 + */ + private void initEvent() { + //设置确定按钮被点击后,向外界提供监听 + positiveBn.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + if (onClickBottomListener != null) { + onClickBottomListener.onPositiveClick(); + } + } + }); + //设置取消按钮被点击后,向外界提供监听 + negtiveBn.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + if (onClickBottomListener != null) { + onClickBottomListener.onNegtiveClick(); + } + } + }); + } + + /** + * 初始化界面控件的显示数据 + */ + private void refreshView() { + //如果用户自定了title和message +// if (!TextUtils.isEmpty(title)) { +// titleTv.setText(title); +// titleTv.setVisibility(View.VISIBLE); +// } else { +// titleTv.setVisibility(View.GONE); +// } + //如果设置按钮的文字 + if (!TextUtils.isEmpty(positive)) { + positiveBn.setText(positive); + } else { + positiveBn.setText("确定"); + } + if (!TextUtils.isEmpty(negtive)) { + negtiveBn.setText(negtive); + } else { + negtiveBn.setText("取消"); + } + + /** + * 只显示一个按钮的时候隐藏取消按钮,回掉只执行确定的事件 + */ + if (isSingle) { + negtiveBn.setVisibility(View.GONE); + } else { + negtiveBn.setVisibility(View.VISIBLE); + } + } + + @Override + public void show() { + super.show(); + refreshView(); + } + + /** + * 初始化界面控件 + */ + private void initView() { + negtiveBn = findViewById(R.id.bt_cancel); + positiveBn = findViewById(R.id.bt_confirm); + titleTv = findViewById(R.id.tv_title); + editText = findViewById(R.id.editText); + } + + /** + * 设置确定取消按钮的回调 + */ + private OnClickBottomListener onClickBottomListener; + + public void setOnClickBottomListener(OnClickBottomListener onClickBottomListener) { + this.onClickBottomListener = onClickBottomListener; + } + + public interface OnClickBottomListener { + /** + * 点击确定按钮事件 + */ + void onPositiveClick(); + + /** + * 点击取消按钮事件 + */ + void onNegtiveClick(); + } + + public String getMessage() { + return message; + } + + public UserDebugDialog setMessage(String message) { + this.message = message; + return this; + } + + public String getTitle() { + return title; + } + + public UserDebugDialog setTitle(String title) { + this.title = title; + return this; + } + + public String getPositive() { + return positive; + } + + public UserDebugDialog setPositive(String positive) { + this.positive = positive; + return this; + } + + public String getNegtive() { + return negtive; + } + + public UserDebugDialog setNegtive(String negtive) { + this.negtive = negtive; + return this; + } + + public UserDebugDialog setNegtiveText(String negtive) { + negtiveBn.setText(negtive); + return this; + } + + public int getImageResId() { + return imageResId; + } + + public boolean isSingle() { + return isSingle; + } + + public UserDebugDialog setSingle(boolean single) { + isSingle = single; + return this; + } + + public UserDebugDialog setImageResId(int imageResId) { + this.imageResId = imageResId; + return this; + } + + public void showKeyboard() { + if (editText != null) { + //设置可获得焦点 + editText.setFocusable(true); + editText.setFocusableInTouchMode(true); + //请求获得焦点 + editText.requestFocus(); + //调用系统输入法 + InputMethodManager inputManager = (InputMethodManager) editText + .getContext().getSystemService(Context.INPUT_METHOD_SERVICE); + inputManager.showSoftInput(editText, 0); + } + } + + @Override + public void dismiss() { + super.dismiss(); + + } + + public String getEdittext() { + if (!TextUtils.isEmpty(editText.getText().toString())) { + return editText.getText().toString().trim(); + } else { + return ""; + } + } +} diff --git a/app/src/main/java/com/info/sn/fragment/AppletQRCodeFragment.java b/app/src/main/java/com/info/sn/fragment/AppletQRCodeFragment.java new file mode 100644 index 0000000..67b43d7 --- /dev/null +++ b/app/src/main/java/com/info/sn/fragment/AppletQRCodeFragment.java @@ -0,0 +1,137 @@ +package com.info.sn.fragment; + +import android.os.Bundle; + +import androidx.annotation.NonNull; +import androidx.fragment.app.Fragment; + +import android.text.TextUtils; +import android.util.Log; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.ImageView; + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; +import com.bumptech.glide.Glide; +import com.info.sn.R; +import com.info.sn.bean.zuoye.BaseResponse; +import com.info.sn.manager.NetInterfaceManager; +import com.trello.rxlifecycle2.LifecycleProvider; +import com.trello.rxlifecycle2.LifecycleTransformer; +import com.trello.rxlifecycle2.RxLifecycle; +import com.trello.rxlifecycle2.android.ActivityEvent; +import com.trello.rxlifecycle2.android.FragmentEvent; +import com.trello.rxlifecycle2.android.RxLifecycleAndroid; + +import io.reactivex.Observable; +import io.reactivex.Observer; +import io.reactivex.disposables.Disposable; +import io.reactivex.subjects.BehaviorSubject; + + +/** + * A simple {@link Fragment} subclass. + * Use the {@link AppletQRCodeFragment#newInstance} factory method to + * create an instance of this fragment. + */ +public class AppletQRCodeFragment extends Fragment { + // TODO: Rename parameter arguments, choose names that match + // the fragment initialization parameters, e.g. ARG_ITEM_NUMBER + private static final String ARG_PARAM1 = "param1"; + private static final String ARG_PARAM2 = "param2"; + + // TODO: Rename and change types of parameters + private String mParam1; + private String mParam2; + + private ImageView qr_code; + private String TAG = AppletQRCodeFragment.class.getSimpleName(); + + public AppletQRCodeFragment() { + // Required empty public constructor + } + + /** + * Use this factory method to create a new instance of + * this fragment using the provided parameters. + * + * @param param1 Parameter 1. + * @param param2 Parameter 2. + * @return A new instance of fragment WechatFragment. + */ + // TODO: Rename and change types and number of parameters + public static AppletQRCodeFragment newInstance(String param1, String param2) { + AppletQRCodeFragment fragment = new AppletQRCodeFragment(); + Bundle args = new Bundle(); + args.putString(ARG_PARAM1, param1); + args.putString(ARG_PARAM2, param2); + fragment.setArguments(args); + return fragment; + } + + @Override + public void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + if (getArguments() != null) { + mParam1 = getArguments().getString(ARG_PARAM1); + mParam2 = getArguments().getString(ARG_PARAM2); + } + } + + @Override + public View onCreateView(LayoutInflater inflater, ViewGroup container, + Bundle savedInstanceState) { + // Inflate the layout for this fragment + View view = inflater.inflate(R.layout.fragment_applet_qrcode, container, false); + qr_code = view.findViewById(R.id.qr_code); + getQRCodeURL(); + return view; + } + + private void getQRCodeURL() { + NetInterfaceManager.getInstance() + .getQRCodeApiControl() + .subscribe(new Observer() { + @Override + public void onSubscribe(Disposable d) { + Log.e("getQRCodeURL", "onSubscribe: "); + } + + @Override + public void onNext(BaseResponse baseResponse) { + Log.e("getQRCodeURL", "onNext: "); + if (baseResponse.code == 200) { + JSONObject jsonObject = (JSONObject) JSON.toJSON(baseResponse.data); + String url = jsonObject.getString("file"); + if (!TextUtils.isEmpty(url)) { + if (getActivity() != null && !getActivity().isDestroyed()) { + Glide.with(qr_code) + .load(url) + .dontAnimate() + .placeholder(getActivity().getDrawable(R.drawable.applet_qrcode)) + .into(qr_code); + } + } else { + qr_code.setImageDrawable(getActivity().getDrawable(R.drawable.applet_qrcode)); + } + } else { + qr_code.setImageDrawable(getActivity().getDrawable(R.drawable.applet_qrcode)); + } + } + + @Override + public void onError(Throwable e) { + Log.e("getQRCodeURL", "onError: " + e.getMessage()); + } + + @Override + public void onComplete() { + Log.e("getQRCodeURL", "onComplete: "); + } + }); + } + + +} diff --git a/app/src/main/java/com/info/sn/fragment/BaseFragmentPagerAdapter.java b/app/src/main/java/com/info/sn/fragment/BaseFragmentPagerAdapter.java new file mode 100644 index 0000000..2842c06 --- /dev/null +++ b/app/src/main/java/com/info/sn/fragment/BaseFragmentPagerAdapter.java @@ -0,0 +1,204 @@ +package com.info.sn.fragment; + +import android.util.SparseArray; + +import androidx.fragment.app.Fragment; +import androidx.fragment.app.FragmentManager; +import androidx.fragment.app.FragmentPagerAdapter; +import androidx.fragment.app.FragmentTransaction; + +import java.util.List; + +/** + * 加载显示Fragment的ViewPagerAdapter基类 + * 提供可以刷新的方法 + * + * @author Fly + * @e-mail 1285760616@qq.com + * @time 2018/3/22 + */ +public class BaseFragmentPagerAdapter extends FragmentPagerAdapter { + private List mFragmentList; + private FragmentManager mFragmentManager; + /**下面两个值用来保存Fragment的位置信息,用以判断该位置是否需要更新*/ + private SparseArray mFragmentPositionMap; + private SparseArray mFragmentPositionMapAfterUpdate; + + public BaseFragmentPagerAdapter(FragmentManager fm, List fragments) { + super(fm); + mFragmentList = fragments; + mFragmentManager = fm; + mFragmentList = fragments; + mFragmentPositionMap = new SparseArray<>(); + mFragmentPositionMapAfterUpdate = new SparseArray<>(); + setFragmentPositionMap(); + setFragmentPositionMapForUpdate(); + } + + /** + * 保存更新之前的位置信息,用的键值对结构来保存 + */ + private void setFragmentPositionMap() { + mFragmentPositionMap.clear(); + for (int i = 0; i < mFragmentList.size(); i++) { + mFragmentPositionMap.put(Long.valueOf(getItemId(i)).intValue(), String.valueOf(i)); + } + } + + /** + * 保存更新之后的位置信息,用的键值对结构来保存 + */ + private void setFragmentPositionMapForUpdate() { + mFragmentPositionMapAfterUpdate.clear(); + for (int i = 0; i < mFragmentList.size(); i++) { + mFragmentPositionMapAfterUpdate.put(Long.valueOf(getItemId(i)).intValue(), String.valueOf(i)); + } + } + + /** + * 在此方法中找到需要更新的位置返回POSITION_NONE,否则返回POSITION_UNCHANGED即可 + */ + @Override + public int getItemPosition(Object object) { + int hashCode = object.hashCode(); + //查找object在更新后的列表中的位置 + String position = mFragmentPositionMapAfterUpdate.get(hashCode); + //更新后的列表中不存在该object的位置了 + if (position == null) { + return POSITION_NONE; + } else { + //如果更新后的列表中存在该object的位置, 查找该object之前的位置并判断位置是否发生了变化 + int size = mFragmentPositionMap.size(); + for (int i = 0; i < size ; i++) { + int key = mFragmentPositionMap.keyAt(i); + if (key == hashCode) { + String index = mFragmentPositionMap.get(key); + if (position.equals(index)) { + //位置没变依然返回POSITION_UNCHANGED + return POSITION_UNCHANGED; + } else { + //位置变了 + return POSITION_NONE; + } + } + } + } + return POSITION_UNCHANGED; + } + + /** + * 将指定的Fragment替换/更新为新的Fragment + * @param oldFragment 旧Fragment + * @param newFragment 新Fragment + */ + public void replaceFragment(Fragment oldFragment, Fragment newFragment) { + int position = mFragmentList.indexOf(oldFragment); + if (position == -1) { + return; + } + //从Transaction移除旧的Fragment + removeFragmentInternal(oldFragment); + //替换List中对应的Fragment + mFragmentList.set(position, newFragment); + //刷新Adapter + notifyItemChanged(); + } + + /** + * 将指定位置的Fragment替换/更新为新的Fragment,同{@link #replaceFragment(Fragment oldFragment, Fragment newFragment)} + * @param position 旧Fragment的位置 + * @param newFragment 新Fragment + */ + public void replaceFragment(int position, Fragment newFragment) { + Fragment oldFragment = mFragmentList.get(position); + removeFragmentInternal(oldFragment); + mFragmentList.set(position, newFragment); + notifyItemChanged(); + } + + /** + * 移除指定的Fragment + * @param fragment 目标Fragment + */ + public void removeFragment(Fragment fragment) { + //先从List中移除 + mFragmentList.remove(fragment); + //然后从Transaction移除 + removeFragmentInternal(fragment); + //最后刷新Adapter + notifyItemChanged(); + } + + /** + * 移除指定位置的Fragment,同 {@link #removeFragment(Fragment fragment)} + * @param position + */ + public void removeFragment(int position) { + Fragment fragment = mFragmentList.get(position); + //然后从List中移除 + mFragmentList.remove(fragment); + //先从Transaction移除 + removeFragmentInternal(fragment); + //最后刷新Adapter + notifyItemChanged(); + } + + /** + * 添加Fragment + * @param fragment 目标Fragment + */ + public void addFragment(Fragment fragment) { + mFragmentList.add(fragment); + notifyItemChanged(); + } + + /** + * 在指定位置插入一个Fragment + * @param position 插入位置 + * @param fragment 目标Fragment + */ + public void insertFragment(int position, Fragment fragment) { + mFragmentList.add(position, fragment); + notifyItemChanged(); + } + + private void notifyItemChanged() { + //刷新之前重新收集位置信息 + setFragmentPositionMapForUpdate(); + notifyDataSetChanged(); + setFragmentPositionMap(); + } + + /** + * 从Transaction移除Fragment + * @param fragment 目标Fragment + */ + private void removeFragmentInternal(Fragment fragment) { + FragmentTransaction transaction = mFragmentManager.beginTransaction(); + transaction.remove(fragment); + transaction.commitNow(); + } + + /** + * 此方法不用position做返回值即可破解fragment tag异常的错误 + */ + @Override + public long getItemId(int position) { + // 获取当前数据的hashCode,其实这里不用hashCode用自定义的可以关联当前Item对象的唯一值也可以,只要不是直接返回position + return mFragmentList.get(position).hashCode(); + } + + @Override + public Fragment getItem(int position) { + return mFragmentList.get(position); + } + + @Override + public int getCount() { + return mFragmentList.size(); + } + + public List getFragments() { + return mFragmentList; + } +} diff --git a/app/src/main/java/com/info/sn/fragment/QRCodeFragment.java b/app/src/main/java/com/info/sn/fragment/QRCodeFragment.java new file mode 100644 index 0000000..8efadb9 --- /dev/null +++ b/app/src/main/java/com/info/sn/fragment/QRCodeFragment.java @@ -0,0 +1,87 @@ +package com.info.sn.fragment; + +import android.graphics.Bitmap; +import android.os.Bundle; + +import androidx.fragment.app.Fragment; + +import android.util.Log; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.ImageView; + +import com.info.sn.R; +import com.info.sn.config.Configs; +import com.info.sn.utils.CXAESUtil; +import com.info.sn.utils.Utils; + +import butterknife.BindView; + +/** + * A simple {@link Fragment} subclass. + * Use the {@link QRCodeFragment#newInstance} factory method to + * create an instance of this fragment. + */ +public class QRCodeFragment extends Fragment { + // TODO: Rename parameter arguments, choose names that match + // the fragment initialization parameters, e.g. ARG_ITEM_NUMBER + private static final String ARG_PARAM1 = "param1"; + private static final String ARG_PARAM2 = "param2"; + + ImageView qr_code; + + // TODO: Rename and change types of parameters + private String mParam1; + private String mParam2; + private String TAG = QRCodeFragment.class.getSimpleName(); + private View mView ; + public QRCodeFragment() { + // Required empty public constructor + } + + /** + * Use this factory method to create a new instance of + * this fragment using the provided parameters. + * + * @param param1 Parameter 1. + * @param param2 Parameter 2. + * @return A new instance of fragment QRCodeFragment. + */ + // TODO: Rename and change types and number of parameters + public static QRCodeFragment newInstance(String param1, String param2) { + QRCodeFragment fragment = new QRCodeFragment(); + Bundle args = new Bundle(); + args.putString(ARG_PARAM1, param1); + args.putString(ARG_PARAM2, param2); + fragment.setArguments(args); + return fragment; + } + + @Override + public void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + if (getArguments() != null) { + mParam1 = getArguments().getString(ARG_PARAM1); + mParam2 = getArguments().getString(ARG_PARAM2); + } + + } + + @Override + public View onCreateView(LayoutInflater inflater, ViewGroup container, + Bundle savedInstanceState) { + // Inflate the layout for this fragment + mView = inflater.inflate(R.layout.fragment_qrcode, container, false); + qr_code =mView.findViewById(R.id.qr_code); + try { + String encryptString = CXAESUtil.encrypt(Configs.AES_KEY, Utils.getSerial()); + Bitmap bitmap = Utils.createQRImage(encryptString, 300, 300); + qr_code.setImageBitmap(bitmap); + } catch (Exception e) { + Log.e(TAG, "onCreate: " + e.getMessage()); + e.printStackTrace(); + } + return mView; + } +} diff --git a/app/src/main/java/com/info/sn/jpush/ExampleApplication.java b/app/src/main/java/com/info/sn/jpush/ExampleApplication.java index 0af1579..2bbd7fb 100644 --- a/app/src/main/java/com/info/sn/jpush/ExampleApplication.java +++ b/app/src/main/java/com/info/sn/jpush/ExampleApplication.java @@ -3,6 +3,7 @@ package com.info.sn.jpush; import android.app.Application; import com.info.sn.BuildConfig; +import com.info.sn.utils.Utils; import cn.jpush.android.api.JPushInterface; diff --git a/app/src/main/java/com/info/sn/jpush/ExampleUtil.java b/app/src/main/java/com/info/sn/jpush/ExampleUtil.java index 651c151..a89100a 100644 --- a/app/src/main/java/com/info/sn/jpush/ExampleUtil.java +++ b/app/src/main/java/com/info/sn/jpush/ExampleUtil.java @@ -85,15 +85,15 @@ public class ExampleUtil { public static void showToast(final String toast, final Context context) { - new Thread(new Runnable() { - - @Override - public void run() { - Looper.prepare(); -// Toast.makeText(context, toast, Toast.LENGTH_SHORT).show(); - Looper.loop(); - } - }).start(); +// new Thread(new Runnable() { +// +// @Override +// public void run() { +// Looper.prepare(); +//// Toast.makeText(context, toast, Toast.LENGTH_SHORT).show(); +// Looper.loop(); +// } +// }).start(); } public static boolean isConnected(Context context) { diff --git a/app/src/main/java/com/info/sn/jpush/MyJPushMessageReceiver.java b/app/src/main/java/com/info/sn/jpush/MyJPushMessageReceiver.java index efdc27e..ec6b01f 100644 --- a/app/src/main/java/com/info/sn/jpush/MyJPushMessageReceiver.java +++ b/app/src/main/java/com/info/sn/jpush/MyJPushMessageReceiver.java @@ -2,8 +2,6 @@ package com.info.sn.jpush; import android.content.Context; -import com.info.sn.base.MyApplication; - import cn.jpush.android.api.CustomMessage; import cn.jpush.android.api.JPushMessage; import cn.jpush.android.service.JPushMessageReceiver; @@ -40,8 +38,5 @@ public class MyJPushMessageReceiver extends JPushMessageReceiver { @Override public void onMessage(Context context, CustomMessage customMessage) { super.onMessage(context, customMessage); -// MyApplication.getInstance().manageCustomMessage(customMessage); } - - } diff --git a/app/src/main/java/com/info/sn/jpush/MyReceiver.java b/app/src/main/java/com/info/sn/jpush/MyReceiver.java deleted file mode 100644 index 8b233ff..0000000 --- a/app/src/main/java/com/info/sn/jpush/MyReceiver.java +++ /dev/null @@ -1,959 +0,0 @@ -package com.info.sn.jpush; - -import android.annotation.SuppressLint; -import android.app.ActivityManager; -import android.app.usage.UsageStats; -import android.app.usage.UsageStatsManager; -import android.bluetooth.BluetoothAdapter; -import android.content.BroadcastReceiver; -import android.content.Context; -import android.content.Intent; -import android.content.IntentFilter; -import android.content.pm.PackageManager; -import android.os.Bundle; -import android.os.CountDownTimer; -import android.os.Environment; -import android.provider.Settings; -import android.text.TextUtils; -import android.util.Log; -import android.view.WindowManager; - -import com.alibaba.fastjson.JSON; -import com.arialyy.aria.core.Aria; -import com.arialyy.aria.core.download.DownloadEntity; -import com.info.sn.bean.BaseResponse; -import com.info.sn.network.HTTPInterface; -import com.info.sn.network.NetWorkManager; -import com.info.sn.network.api.BindDevices; -import com.info.sn.network.api.UploadScreenshot; -import com.info.sn.service.InitJpushServer; -import com.info.sn.utils.ApkUtils; -import com.info.sn.utils.CmdUtil; -import com.info.sn.utils.LogUtils; -import com.info.sn.utils.SPUtils; -import com.info.sn.utils.ServiceAliveUtils; -import com.info.sn.utils.ToastUtil; -import com.info.sn.utils.Utils; -import com.info.sn.view.CustomDialog; - -import org.json.JSONException; -import org.json.JSONObject; - -import java.io.File; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Iterator; -import java.util.List; -import java.util.SortedMap; -import java.util.TreeMap; - -import cn.jpush.android.api.JPushInterface; -import io.reactivex.Observable; -import io.reactivex.ObservableEmitter; -import io.reactivex.ObservableOnSubscribe; -import io.reactivex.Observer; -import io.reactivex.android.schedulers.AndroidSchedulers; -import io.reactivex.annotations.NonNull; -import io.reactivex.disposables.Disposable; -import io.reactivex.schedulers.Schedulers; -import okhttp3.MediaType; -import okhttp3.MultipartBody; -import okhttp3.RequestBody; - -/** - * 自定义接收器 - *

- * 如果不定义这个 Receiver,则: - * 1) 默认用户会打开主界面 - * 2) 接收不到自定义消息 - */ -public class MyReceiver extends BroadcastReceiver { - private static final String TAG = "MyReceiver"; - - @Override - public void onReceive(Context context, Intent intent) { - Bundle bundle = intent.getExtras(); - Logger.d(TAG, "[MyReceiver] onReceive - " + intent.getAction() + ", extras: " + printBundle(bundle)); - - if (JPushInterface.ACTION_REGISTRATION_ID.equals(intent.getAction())) { - String regId = bundle.getString(JPushInterface.EXTRA_REGISTRATION_ID); - Logger.d(TAG, "[MyReceiver] 接收Registration Id : " + regId); - //send the Registration Id to your server... - - } else if (JPushInterface.ACTION_MESSAGE_RECEIVED.equals(intent.getAction())) { - Logger.d(TAG, "[MyReceiver] 接收到推送下来的自定义消息: " + bundle.getString(JPushInterface.EXTRA_MESSAGE)); - processCustomMessage(context, bundle); - - } else if (JPushInterface.ACTION_NOTIFICATION_RECEIVED.equals(intent.getAction())) { - Logger.d(TAG, "[MyReceiver] 接收到推送下来的通知"); - int notifactionId = bundle.getInt(JPushInterface.EXTRA_NOTIFICATION_ID); - Logger.d(TAG, "[MyReceiver] 接收到推送下来的通知的ID: " + notifactionId); - - } else if (JPushInterface.ACTION_NOTIFICATION_OPENED.equals(intent.getAction())) { - Logger.d(TAG, "[MyReceiver] 用户点击打开了通知"); - - //打开自定义的Activity - Intent i = new Intent(context, TestActivity.class); - i.putExtras(bundle); - //i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); - i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP); - context.startActivity(i); - - } else if (JPushInterface.ACTION_RICHPUSH_CALLBACK.equals(intent.getAction())) { - Logger.d(TAG, "[MyReceiver] 用户收到到RICH PUSH CALLBACK: " + bundle.getString(JPushInterface.EXTRA_EXTRA)); - //在这里根据 JPushInterface.EXTRA_EXTRA 的内容处理代码,比如打开新的Activity, 打开一个网页等.. - - } else if (JPushInterface.ACTION_CONNECTION_CHANGE.equals(intent.getAction())) { - boolean connected = intent.getBooleanExtra(JPushInterface.EXTRA_CONNECTION_CHANGE, false); - Logger.w(TAG, "[MyReceiver]" + intent.getAction() + " connected state change to " + connected); - } else { - Logger.d(TAG, "[MyReceiver] Unhandled intent - " + intent.getAction()); - } - - - } - - // 打印所有的 intent extra 数据 - private static String printBundle(Bundle bundle) { - StringBuilder sb = new StringBuilder(); - for (String key : bundle.keySet()) { - if (key.equals(JPushInterface.EXTRA_NOTIFICATION_ID)) { - sb.append("\nkey:" + key + ", value:" + bundle.getInt(key)); - } else if (key.equals(JPushInterface.EXTRA_CONNECTION_CHANGE)) { - sb.append("\nkey:" + key + ", value:" + bundle.getBoolean(key)); - } else if (key.equals(JPushInterface.EXTRA_EXTRA)) { - if (TextUtils.isEmpty(bundle.getString(JPushInterface.EXTRA_EXTRA))) { - Logger.i(TAG, "This message has no Extra data"); - continue; - } - - try { - JSONObject json = new JSONObject(bundle.getString(JPushInterface.EXTRA_EXTRA)); - Iterator it = json.keys(); - - while (it.hasNext()) { - String myKey = it.next(); - sb.append("\nkey:" + key + ", value: [" + - myKey + " - " + json.optString(myKey) + "]"); - } - } catch (JSONException e) { - Logger.e(TAG, "Get message extra JSON error!"); - } - - } else { - sb.append("\nkey:" + key + ", value:" + bundle.get(key)); - } - } - return sb.toString(); - } - - //定义接收极光推送消息的类型。 - private static final String JIGUANG_GET_DRIVELINE = "1"; - //1.获取设备在线信息 - private static final String JIGUANG_GET_STARTTIME = "2"; - // 2.获取当前正在运行得应用和电量 - private static final String JIGUANG_USB_STATE = "3"; - // 3.数据线传输管控 - private static final String JIGUANG_TFCARD_STATE = "4"; - // 4.TF卡管控 - private static final String JIGUANG_BLUETOOTH_STATE = "5"; - // 5.蓝牙管控 - private static final String JIGUANG_BROWSER_URLPATH = "6"; - // 6.浏览器上网管控 - private static final String JIGUANG_APP_NETWORKSTATE = "7"; - // 7.应用联网管控 - private static final String JIGUANG_APP_LOCKEDSTATE = "8"; - // 8.应用锁管控 - private static final String JIGUANG_FORCE_INSTALLAPK = "9"; - // 9.强制安装应用 - private static final String JIGUANG_FORCE_UNINSTALLAPK = "10"; - // 10.强制卸载应用 - private static final String JIGUANG_BIND_DEVIVES = "11"; - // 11.绑定设备 - private static final String JIGUANG_TFMEDIA = "12"; - //12.影音格式管控 - private static final String JIGUANG_CAMRERA = "13"; - //13.摄像头管控 - private static final String JIGUANG_PHONE = "14"; - //14.电话管控管控 - private static final String JIGUANG_DISABLE_UPDATAE = "15"; - //14.电话管控管控 - private static final String JIGUANG_APP_WEBSITE = "16"; - //16.app内部网址管控 - private static final String JIGUANG_RESET_DEVICES = "17"; - //设备恢复出厂设置 - private static final String JIGUANG_BROWSER_LABEL = "18"; - //浏览器书签 - private static final String JIGUANG_APP_NET_AUTO = "19"; - //APP联网自启管控 - private static final String JIGUANG_SYSTEM_SETTING = "21"; - //系统管控 - private static final String JIGUANG_REBOOT_DEVICES = "22"; - //重启 - private static final String JIGUANG_APP_SETTING = "23"; - //获取app管控设置 - private static final String JIGUANG_FORCE_KILL = "24"; - //强制停止应用 - private static final String JIGUANG_LOCK_SCREEN = "25"; - //锁屏 - private static final String JIGUANG_SNAPSHOT = "26"; - //截图 - private static final String JIGUANG_TIME_CONTROL = "27"; - //时间管控 - - //send msg to MainActivity - private void processCustomMessage(Context context, Bundle bundle) { -// if (MainActivity.isForeground) { -// String message = bundle.getString(JPushInterface.EXTRA_MESSAGE); -// String extras = bundle.getString(JPushInterface.EXTRA_EXTRA); -// Intent msgIntent = new Intent(MainActivity.MESSAGE_RECEIVED_ACTION); -// msgIntent.putExtra(MainActivity.KEY_MESSAGE, message); -// if (!ExampleUtil.isEmpty(extras)) { -// try { -// JSONObject extraJson = new JSONObject(extras); -// if (extraJson.length() > 0) { -// msgIntent.putExtra(MainActivity.KEY_EXTRAS, extras); -// } -// } catch (JSONException e) { -// -// } -// -// } -// LocalBroadcastManager.getInstance(context).sendBroadcast(msgIntent); -// } - int sn_id = (int) SPUtils.get(context, "sn_id", -1); - int member_id = (int) SPUtils.get(context, "member_id", -1); - String message = bundle.getString(JPushInterface.EXTRA_MESSAGE); - String title = bundle.getString(JPushInterface.EXTRA_TITLE); - String type = bundle.getString(JPushInterface.EXTRA_CONTENT_TYPE); - String extras = bundle.getString(JPushInterface.EXTRA_EXTRA); -// HTTPInterface.checkDevicesInfo(context); - ToastUtil.show(extras); - - switch (message) { - case JIGUANG_GET_DRIVELINE: -// HTTPInterface.getDriveState(member_id, sn_id); - break; - case JIGUANG_GET_STARTTIME: - sendStartTime(context, extras); - break; - case JIGUANG_USB_STATE: - setUsbState(context, extras); - break; - case JIGUANG_TFCARD_STATE: - setTfcardState(context, extras); - break; - case JIGUANG_BLUETOOTH_STATE: - setBluetoothState(context, extras); - break; - case JIGUANG_BROWSER_URLPATH: -// setBrowserUrlpath(context, extras); - HTTPInterface.setBrowser(context); - break; - case JIGUANG_APP_NETWORKSTATE: - setAppNetworkstate(context, extras); - break; - case JIGUANG_APP_LOCKEDSTATE: - setAppLockedstate(context, extras); - break; - case JIGUANG_FORCE_INSTALLAPK: - HTTPInterface.getAllappPackage(context); - intallApk(context, extras); - break; - case JIGUANG_FORCE_UNINSTALLAPK: - unintallApk(context, extras); - break; - case JIGUANG_BIND_DEVIVES: - bindService(context, extras); - break; - case JIGUANG_TFMEDIA: - setTFmedia(context, extras); - break; - case JIGUANG_CAMRERA: - setCameta(context, extras); - break; - case JIGUANG_PHONE: - setPhone(context, extras); - break; - case JIGUANG_DISABLE_UPDATAE: - setAppUpdate(context, extras); - break; - case JIGUANG_APP_WEBSITE: -// HTTPInterface.getAppJump(context); - break; - case JIGUANG_REBOOT_DEVICES: - Utils.rebootDevices(context); - break; - case JIGUANG_APP_NET_AUTO: - HTTPInterface.getAppStart(context); - break; - case JIGUANG_BROWSER_LABEL: - HTTPInterface.getBrowserLabel(context); - break; - case JIGUANG_SYSTEM_SETTING: - Utils.setSystemSetting(context, extras); - break; - case JIGUANG_RESET_DEVICES: - Utils.doMasterClear(context); - break; - case JIGUANG_APP_SETTING: - HTTPInterface.getAppStart(context); - break; - case JIGUANG_FORCE_KILL: - Log.e(TAG, extras); - break; - case JIGUANG_LOCK_SCREEN: - setLock_screen(context, extras); - Log.e(TAG, extras); - break; - case JIGUANG_SNAPSHOT: - doscreenshot(context); - Log.e(TAG, extras); - break; - case JIGUANG_TIME_CONTROL: - timeControl(context, extras); - break; - } - } - - private int changeNum(int paramInt) { - return paramInt == 1 ? 0 : 1; - } - - private void setPhone(Context context, String json) { -// com.alibaba.fastjson.JSONObject jsonObject = JSON.parseObject(json); -// int setting_phone = jsonObject.getInteger("setting_phone"); -// Log.e("setting_phone", String.valueOf(setting_phone)); -// boolean qch_call_forbid = Settings.System.putInt(context.getContentResolver(), "qch_call_forbid", setting_phone); -// boolean qch_white_list_on = Settings.System.putInt(context.getContentResolver(), "qch_white_list_on", setting_phone); -// boolean qch_white_list_Array = Settings.System.putString(context.getContentResolver(), "qch_white_list_Array", "123456"); -// Log.e("SystemSetting", "qch_call_forbid---------" + setting_phone); -// Log.e("SystemSetting", "qch_call_forbid---------" + qch_call_forbid); -// Log.e("SystemSetting", "qch_call_forbid---------" + qch_white_list_on); -// Log.e("SystemSetting", "qch_call_forbid---------" + qch_white_list_Array); - HTTPInterface.getSystemSettings(context); - } - - private void setCameta(Context context, String json) { - com.alibaba.fastjson.JSONObject jsonObject = JSON.parseObject(json); - //摄像头开关 - int setting_camera = jsonObject.getInteger("setting_camera"); - Settings.System.putInt(context.getContentResolver(), "qch_app_camera", setting_camera); - ApkUtils.hideSystemSettingAPP(context, "com.mediatek.camera"); - Log.e("SystemSetting", "setting_camera---------" + setting_camera); - String cameraStatus = ""; - switch (setting_camera) { - case 1: - cameraStatus = "qch_camera_open"; - break; - case 0: - cameraStatus = "qch_camera_forbid"; - break; - default: - cameraStatus = "qch_camera_forbid"; - break; - } - Intent cameraIntent = new Intent(cameraStatus).setPackage("com.android.settings"); - context.sendBroadcast(cameraIntent); - } - - String tftype = ".png,.bmp,.jpg,.mpo,.jpeg,.gif,.tif,.tiff,.dib,.jpe,.jfif,.psd,.pdd,.rle,.dcm,.dic,.dc3,.eps,.iff,.tdi,.jpf,.jpx,.jp2,.j2c,.jpc,.jps,.j2k,.pcx,.pdp,.raw,.pns,.aac,.ac3,.aiff,.amr,.ape,.au,.fla,.flac,.imy,.m4r,.mid,.mka,.mmf,.mp2,.mp3,.mxmf,.ogg,.ra,.ts,.wma,.wv,.xmf,.m4a,.wav,.3gpp,.mp4,.3gp,.as,.asf,.avi,.dat,.f4v,.flv,.mkv,.mov,.mpg,.rmvb,.swf,.trp,.vob,.webm,.wmv,.navi,.video,.ram,.qsv,.xv,.rm,.vcd,.svcd,.mlv,.mpe,.mpeg,.m2v,.iso,.html,.htm,.txt,.xls,.doc,.docx,.docm,.pdf,.xps,.dot,.dotx,.dotm,.mht,.mhtml,.rft,.xml,.xlsx,.xlsm,.xlsb,.xltx,.xltm,.xlt,.wps,.wpt,.rtf,.et,.ett,.dps,.dpt,.wpp,.ppt,.pptx,.pptm,.pps,.pot,.potm,.ppsx,.ppsm,.odp"; - - private void setTFmedia(Context context, String json) { - com.alibaba.fastjson.JSONObject jsonObject = JSON.parseObject(json); -//影音管控开关 - int setting_tfmedia = jsonObject.getInteger("setting_tfmedia"); - Log.e("SystemSetting", "qch_tfmedia_forbid---------" + setting_tfmedia); - - if (setting_tfmedia == 0) { - Settings.System.putInt(context.getContentResolver(), "qch_tfmedia_forbid", 1); - } else { - String s = Settings.System.getString(context.getContentResolver(), "qch_tfmedia_filetypes");//影音管控 - Log.e("SystemSetting", "qch_tfmedia_filetypes old" + s); - Settings.System.putInt(context.getContentResolver(), "qch_tfmedia_forbid", 0); - boolean b = Settings.System.putString(context.getContentResolver(), "qch_tfmedia_filetypes", tftype);//影音管控 - Log.e("SystemSetting", "qch_tfmedia_filetypes---------" + b + ":" + tftype); - } - } - - private void setAppUpdate(Context context, String json) { - com.alibaba.fastjson.JSONObject jsonObject = JSON.parseObject(json); - String is_upgrade = jsonObject.getString("is_upgrade"); - String packageName = jsonObject.getString("package"); - String nowApplist = Settings.System.getString(context.getContentResolver(), "qch_app_forbid"); - List applist = new ArrayList<>(Arrays.asList(nowApplist.split(","))); - if (is_upgrade.equals("0")) { - if (applist.contains(packageName)) { - applist.remove(packageName); - } else { - Log.e("setAppUpdate", "app已经存在"); - } - } else if (is_upgrade.equals("1")) { - if (!applist.contains(packageName)) { - applist.add(packageName); - } - } - String packageString = ""; - for (String s : applist) { - if (s.equals("")) { - continue; - } - packageString += s + ","; - } - if (!packageString.equals("")) { - packageString = packageString.substring(0, packageString.length() - 1); - } - Settings.System.putString(context.getContentResolver(), "qch_app_forbid", packageString); - Log.e("setAppUpdate", Settings.System.getString(context.getContentResolver(), "qch_app_forbid")); - } - - synchronized private void sendStartTime(Context context, String jsonArray) { - HTTPInterface.updateAdminInfo(context); -// if (jsonArray.length() > 0) { -// try { -// JSONObject extra = new JSONObject(jsonArray); -// String random = extra.getString("random"); -// int battery = getSystemBattery(context); -//// HTTPInterface.sendStartTime(context, 0, getTaskPackname(context), battery, random); -// } catch (JSONException e) { -// e.printStackTrace(); -// } -// } - } - - /** - * 实时获取电量 - */ - public static int getSystemBattery(Context context) { - int level = 0; - Intent batteryInfoIntent = context.getApplicationContext().registerReceiver(null, - new IntentFilter(Intent.ACTION_BATTERY_CHANGED)); - level = batteryInfoIntent.getIntExtra("level", 0); - int batterySum = batteryInfoIntent.getIntExtra("scale", 100); - int percentBattery = 100 * level / batterySum; - LogUtils.i("getSystemBattery", "level = " + level); - LogUtils.i("getSystemBattery", "batterySum = " + batterySum); - LogUtils.i("getSystemBattery", "percent is " + percentBattery + "%"); - return percentBattery; - } - - public static String getTaskPackname(Context context) { - String currentApp = "CurrentNULL"; - if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.LOLLIPOP) { - @SuppressLint("WrongConstant") UsageStatsManager usm = (UsageStatsManager) context.getSystemService("usagestats"); - long time = System.currentTimeMillis(); - List appList = usm.queryUsageStats(UsageStatsManager.INTERVAL_DAILY, time - 1000 * 1000, time); - if (appList != null && appList.size() > 0) { - SortedMap mySortedMap = new TreeMap(); - for (UsageStats usageStats : appList) { - mySortedMap.put(usageStats.getLastTimeUsed(), usageStats); - } - if (mySortedMap != null && !mySortedMap.isEmpty()) { - currentApp = mySortedMap.get(mySortedMap.lastKey()).getPackageName(); - } - } - } else { - ActivityManager am = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE); - List tasks = am.getRunningAppProcesses(); - currentApp = tasks.get(0).processName; - } -// LogUtils.e("TAG", "Current App in foreground is: " + currentApp); - return currentApp; - } - - synchronized private void setUsbState(Context context, String jsonArray) { - if (jsonArray.length() > 0) { - try { - JSONObject extra = new JSONObject(jsonArray); - String setting_usb = extra.getString("setting_usb"); - boolean qch_usb_choose = Settings.System.putString(context.getContentResolver(), "qch_usb_choose", setting_usb); - LogUtils.e("setUsbState:", Settings.System.getString(context.getContentResolver(), "qch_usb_choose")); - String usbStatus = ""; - switch (setting_usb) { - case "usb_charge": - usbStatus = "qch_action_usb_usb_charge"; - break; - case "usb_mtp": - usbStatus = "qch_action_usb_usb_mtp"; - break; -// case "usb_midi": -// usbStatus = "qch_action_usb_usb_midi"; -// break; - default: - usbStatus = "qch_action_usb_usb_charge"; - break; - } - Intent usbIntent = new Intent(usbStatus).setPackage("com.android.settings"); - context.sendBroadcast(usbIntent); - } catch (JSONException e) { - e.printStackTrace(); - LogUtils.e("setUsbState", e.getMessage()); - } - } else { - ToastUtil.debugShow("setUsbState jsonArray is NULL"); - } - } - - synchronized private void setTfcardState(Context context, String jsonArray) { - if (jsonArray.length() > 0) { - try { - JSONObject extra = new JSONObject(jsonArray); - int is_tf = extra.getInt("setting_memory"); - boolean qch_sdcard_forbid_on = Settings.System.putInt(context.getContentResolver(), "qch_sdcard_forbid_on", changeNum(is_tf)); - if (qch_sdcard_forbid_on) { - LogUtils.e("setTfcardState:", Settings.System.getString(context.getContentResolver(), "qch_sdcard_forbid_on")); - } else { - ToastUtil.debugShow("setTfcardState failed,state:" + is_tf); - } - } catch (JSONException e) { - e.printStackTrace(); - LogUtils.e("setTfcardState", e.getMessage()); - } - } else { - ToastUtil.debugShow("setTfcardState jsonArray is NULL"); - } - } - - private BluetoothAdapter mBluetoothAdapter; - - synchronized private void setBluetoothState(Context context, String jsonArray) { - if (jsonArray.length() > 0) { - if (null == mBluetoothAdapter) { - mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();//获取默认蓝牙适配器 - } - try { - JSONObject extra = new JSONObject(jsonArray); - int is_bluetooth = extra.getInt("setting_bluetooth"); - if (is_bluetooth == 0) { - mBluetoothAdapter.disable();//设置关闭时关闭蓝牙 - } - boolean qch_bt_forbid_on = Settings.System.putInt(context.getContentResolver(), "qch_bht_forbid_on", changeNum(is_bluetooth)); - if (qch_bt_forbid_on) { - LogUtils.e("setBluetoothState:", Settings.System.getString(context.getContentResolver(), "qch_bht_forbid_on")); - } else { - ToastUtil.debugShow("setBluetoothState failed,state:" + is_bluetooth); - } - } catch (JSONException e) { - e.printStackTrace(); - LogUtils.e("setBluetoothState", e.getMessage()); - } - } else { - ToastUtil.debugShow("setBluetoothState jsonArray is NULL"); - } - } - - synchronized private void setBrowserUrlpath(Context context, String jsonArray) { - if (jsonArray.length() > 0) { - try { - JSONObject extra = new JSONObject(jsonArray); - String white = extra.getString("white"); - if (white != null && !white.equals("")) { - boolean whiteList = Settings.System.putString(context.getContentResolver(), "DeselectBrowserArray", white); - Log.e("SystemSetting", "setBrowserList-whiteList" + whiteList + ":" + white); - } else { - Settings.System.putString(context.getContentResolver(), "DeselectBrowserArray", " "); - } - Log.e("whiteList", Settings.System.getString(context.getContentResolver(), "DeselectBrowserArray")); - String black = extra.getString("black"); - if (black != null && !black.equals("")) { - boolean blackList = Settings.System.putString(context.getContentResolver(), "qch_webblack_url", black); - Log.e("SystemSetting", "setBrowserList-blackList" + blackList + ":" + black); - } else { - Settings.System.putString(context.getContentResolver(), "qch_webblack_url", " "); - } - Log.e("blackList", Settings.System.getString(context.getContentResolver(), "qch_webblack_url")); - } catch (JSONException e) { - e.printStackTrace(); - LogUtils.e("setBrowserUrlpath", e.getMessage()); - } - } else { - boolean setBrowserUrlpath = Settings.System.putString(context.getContentResolver(), "DeselectBrowserArray", "invalid"); - ToastUtil.debugShow("setBrowserUrlpath jsonArray is NULL,set default: " + setBrowserUrlpath); - } - } - - synchronized private void setAppNetworkstate(Context context, String jsonArray) { - if (jsonArray.length() > 0) { - try { - JSONObject extra = new JSONObject(jsonArray); - String package0 = extra.getString("package0"); - String package1 = extra.getString("package1"); - if (package0.length() != 0) { - boolean qch_jgy_network_allow = Settings.System.putString(context.getContentResolver(), "qch_jgy_network_allow", package0); - LogUtils.e("fht", "qch_jgy_network_allow::" + qch_jgy_network_allow + ":" + Settings.System.getString(context.getContentResolver(), "qch_jgy_network_allow")); - } else { - boolean qch_jgy_network_allow = Settings.System.putString(context.getContentResolver(), "qch_jgy_network_allow", "invalid"); - LogUtils.e("fht", "qch_jgy_network_allow::" + qch_jgy_network_allow + ":" + Settings.System.getString(context.getContentResolver(), "qch_jgy_network_allow")); - } - if (package1.length() != 0) { - boolean qch_jgy_network_disallow = Settings.System.putString(context.getContentResolver(), "qch_jgy_network_disallow", package1); - LogUtils.e("fht", "qch_jgy_network_disallow::" + qch_jgy_network_disallow + ":" + Settings.System.getString(context.getContentResolver(), "qch_jgy_network_disallow")); - } else { - boolean qch_jgy_network_disallow = Settings.System.putString(context.getContentResolver(), "qch_jgy_network_disallow", "invalid"); - LogUtils.e("fht", "qch_jgy_network_disallow::" + qch_jgy_network_disallow + ":" + Settings.System.getString(context.getContentResolver(), "qch_jgy_network_disallow")); - } - - } catch (JSONException e) { - e.printStackTrace(); - LogUtils.e("setAppNetworkstate", e.getMessage()); - } - } else { - ToastUtil.debugShow("setAppNetworkstate jsonArray is NULL"); - } - } - - synchronized private void setAppLockedstate(Context context, String jsonArray) { - if (jsonArray.length() > 0) { - try { - JSONObject extra = new JSONObject(jsonArray); - String packageName = extra.getString("package"); - int is_lock = extra.getInt("is_lock"); - ToastUtil.debugShow("收到应用锁管控消息:包名" + packageName + "is_lock_state:" + is_lock); - PackageManager pm = context.getPackageManager(); - //后台为0可能传过来null - if (is_lock == 1) { - pm.setApplicationEnabledSetting(packageName, PackageManager.COMPONENT_ENABLED_STATE_DISABLED, 0); - } else { - pm.setApplicationEnabledSetting(packageName, PackageManager.COMPONENT_ENABLED_STATE_DEFAULT, 0); - } - } catch (JSONException e) { - e.printStackTrace(); - LogUtils.e("setAppLockedstate", e.getMessage()); - } - } else { - ToastUtil.debugShow("setAppLockedstate jsonArray is NULL"); - } - - } - - //静默安装应用,使用okgo,断网会出现问题,等待修改使用aria - synchronized private void intallApk(Context context, String jsondata) { -// HTTPInterface.getAllAppPackageName(context); - - try { - JSONObject extra = new JSONObject(jsondata); - final String packages = extra.getString("package"); - ToastUtil.debugShow("收到应用安装消息:包名" + packages); - String url = extra.getString("url"); - - if (Aria.download(this).taskExists(url)) { - - List entity = Aria.download(this).getDownloadEntity(url); - for (DownloadEntity downloadEntity : entity) { - Aria.download(this).load(downloadEntity.getId()).cancel(true); - } - } - - File file = new File(Environment.getExternalStoragePublicDirectory("Download") + "/Sninfo/apk"); - file.mkdirs(); - Aria.download(this) - .load(url) - .setFilePath(file.getAbsolutePath() + "/" + packages + ".apk") - .ignoreFilePathOccupy() - .setExtendField(packages).create(); -// OkGo.get(url) -// .execute(new FileCallback() { -// @Override -// public void onSuccess(Response response) { -//// Settings.System.putString(getApplicationContext().getContentResolver(), "qch_app_forbid", "com.baidu.video"); -// ApkUtils.installApkInSilence(response.body().getAbsolutePath(), packages); -// LogUtils.e("onSuccess", "download file successful,now installing"); -// } -// -// @Override -// public void onError(Response response) { -// super.onError(response); -// LogUtils.e("manageCustomMessage", "File download Failure"); -// } -// -// @Override -// public void downloadProgress(Progress progress) { -// super.downloadProgress(progress); -// LogUtils.e("downloadProgress", "已下载:" + progress.currentSize + ",总大小:" + progress.totalSize + ",进度:" + progress.fraction + ",当前网速:" + progress.speed); -// } -// }); - Aria.download(this).resumeAllTask(); - } catch (JSONException e) { - e.printStackTrace(); - LogUtils.e("intallApk", e.getMessage()); - } - } - - - synchronized private void unintallApk(Context context, String json) { - int sn_id = (int) SPUtils.get(context, "sn_id", -1); - - try { - JSONObject object = new JSONObject(json); - String packageName = object.getString("app_package"); - ToastUtil.debugShow("收到应用卸载消息:包名" + packageName); - if (!packageName.equals("") && !packageName.equals(context.getApplicationContext().getPackageName())) { - if (!ApkUtils.isAvailable(context.getApplicationContext(), packageName)) { -// HTTPInterface.setAppuninstallInfo(sn_id, packageName); - } else { - ApkUtils.uninstallApp(context, packageName); - } - } - } catch (JSONException e) { - e.printStackTrace(); - LogUtils.e("unintallApk", e.getMessage()); - } - } - - synchronized void bindService(final Context context, String json) { - ToastUtil.debugShow("收到绑定设备请求"); - - try { -// com.alibaba.fastjson.JSONObject jsonObject= JSON.parseObject(json); -// String userName =jsonObject.getString("member_name"); -// final String id =jsonObject.getString("id"); -// String phoneNum =jsonObject.getString("member_phone"); - JSONObject object = new JSONObject(json); - String userName = object.getString("member_name"); - final String id = object.getString("id"); - String phoneNum = object.getString("member_phone"); - final CustomDialog dialog = new CustomDialog(context); - dialog.setMessage(phoneNum + "的用户请求绑定你的平板") - .setTitle("绑定请求") - .setPositive("允许") - .setNegtive("拒绝") -// .setSingle(true) - .setOnClickBottomListener(new CustomDialog.OnClickBottomListener() { - @Override - public void onPositiveClick() { - bind(context, id, 1); - dialog.dismiss(); - } - - @Override - public void onNegtiveClick() { - bind(context, id, 0); - ToastUtil.show("设备取消绑定"); - dialog.dismiss(); - } - }); - dialog.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT); - dialog.show(); - new CountDownTimer(30000, 1000) { - - @Override - public void onTick(long l) { - String value = String.valueOf((int) (l / 1000)); - dialog.setNegtiveText("拒绝" + "(" + value + ")"); - } - - @Override - public void onFinish() { - bind(context, id, 0); - dialog.dismiss(); - } - }.start(); -// AlertDialog.Builder builder = new AlertDialog.Builder(this) -// .setTitle("设备绑定") -// .setIcon(R.mipmap.ic_launcher) -// .setCancelable(false) -// .setMessage("用户:“" + userName + "”" + "\n手机:“" + phoneNum + "”" + "\n请求绑定此设备") -// .setPositiveButton("确认绑定", new DialogInterface.OnClickListener() { -// @Override -// public void onClick(DialogInterface dialogInterface, int i) { -// bind(id); -// } -// }) -// .setNegativeButton("取消", new DialogInterface.OnClickListener() { -// @Override -// public void onClick(DialogInterface dialog, int which) { -// dialog.dismiss(); -// ToastUtil.show("设备取消绑定"); -// } -// }); -// AlertDialog ad = builder.create(); -// ad.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT); -// ad.setCanceledOnTouchOutside(false); //点击外面区域不会让dialog消失 -// ad.show(); - - } catch (JSONException e) { - e.printStackTrace(); - LogUtils.e("bindService", e.getMessage()); - } - - - } - - synchronized private void bind(final Context context, String id, int type) { - - BindDevices bindDevices = NetWorkManager.getbindDevicesControl(); - bindDevices.getBindDevices(Utils.getSerial(), id, type) - .subscribeOn(Schedulers.io()) - .observeOn(AndroidSchedulers.mainThread()) - .subscribe(new Observer() { - @Override - public void onSubscribe(@NonNull Disposable d) { - - } - - @Override - public void onNext(@NonNull BaseResponse baseResponse) { - int code = baseResponse.code; - String msg = baseResponse.msg; -// Log.e("bind", baseResponse.toString()); - if (code == 200) { - ToastUtil.show("绑定成功"); - } else if (code == 301) { - ToastUtil.show(msg); - } - } - - @Override - public void onError(@NonNull Throwable e) { - Log.e("bind", e.getMessage()); - } - - @Override - public void onComplete() { - - } - }); -// OkGo.get(UrlAddress.BIND_DEVICES) -// .params("id", id) -// .params("sn", Utils.getSerial()) -// .params("type",type) -// .execute(new StringCallback() { -// @Override -// public void onSuccess(Response response) { -// String s = response.body(); -// try { -// JSONObject jsonObject = new JSONObject(s); -// int code = jsonObject.getInt("code"); -// String msg = jsonObject.getString("msg"); -// if (code == 200) { -// ToastUtil.show("绑定成功"); -// } else if (code==301){ -// ToastUtil.show(msg); -// } -// -// } catch (JSONException e) { -// e.printStackTrace(); -// } -// Intent intent = new Intent(MainActivity.REFRESHACTION); -// context.sendBroadcast(intent); -// } -// -// @Override -// public void onError(Response response) { -// super.onError(response); -// Log.e("bind", response.getException().getMessage()); -// } -// -// }); - } - - - private void setLock_screen(Context context, String extras) { - String type = "0"; - try { - JSONObject jSONObject = new JSONObject(extras); - type = jSONObject.getString("type"); - } catch (JSONException e) { - e.printStackTrace(); - } - if (!ServiceAliveUtils.isServiceAlice(InitJpushServer.class.getName())) { - context.startService(new Intent(context, InitJpushServer.class)); - } - Intent intent = new Intent(); -// intent.putExtra("name", name); - if (type.equals("1")) { - intent.setAction(InitJpushServer.LockScreenReceiver.ACTION_LOCK); - } else if (type.equals("0")) { - intent.setAction(InitJpushServer.LockScreenReceiver.ACTION_UNLOCK); - } - context.sendBroadcast(intent); - } - - - public void doscreenshot(final Context context) { - final long time = System.currentTimeMillis(); - Observable.create(new ObservableOnSubscribe() { - @Override - public void subscribe(ObservableEmitter e) throws Exception { - String filepath = context.getExternalFilesDir("db").getAbsolutePath(); - int n = CmdUtil.execute("screencap -p " + filepath + File.separator + time + ".png").code; - e.onNext(n); - } - }).subscribeOn(Schedulers.io()) - .observeOn(AndroidSchedulers.mainThread()) - .subscribe(new Observer() { - @Override - public void onSubscribe(Disposable d) { - - } - - @Override - public void onNext(Integer integer) { - if (integer == 0) { - uplaodImage(context, time); - } else { - Log.e("doss", "失败"); - } - } - - @Override - public void onError(Throwable e) { - Log.e("doss", "Throwable=" + e.getMessage()); - } - - @Override - public void onComplete() { - - } - }); - } - - private void uplaodImage(final Context context, long time) { - String filepath = context.getExternalFilesDir("db").getAbsolutePath(); -// String filepath = mContext.getFileStreamPath("screenshot").getAbsolutePath(); - //放在app内部data下面 - File file = new File(filepath + File.separator + time + ".png"); - //不要直接使用常用图片格式 - if (!file.exists()) { - Log.e("uplaodImage", "File does not exists"); - return; - } - UploadScreenshot uploadScreenshot = NetWorkManager.getUploadScreenshotControl(); - RequestBody requestFile = RequestBody.create(MediaType.parse("multipart/form-data"), file); - MultipartBody.Part body = MultipartBody.Part.createFormData("file", file.getName(), requestFile); - uploadScreenshot.uploadScreenshot(Utils.getSerial(), body) - .subscribeOn(Schedulers.io()) - .observeOn(AndroidSchedulers.mainThread()) - .subscribe(new Observer() { - @Override - public void onSubscribe(Disposable d) { - - } - - @Override - public void onNext(BaseResponse baseResponse) { - int code = baseResponse.code; - if (code == 200) { - Log.e(TAG, "onNext: " + baseResponse.msg); - } else { - Log.e(TAG, code + ": " + baseResponse.msg); - } - } - - @Override - public void onError(Throwable e) { - Log.e("uplaod", "onError: " + e.getMessage()); - } - - @Override - public void onComplete() { - - } - }); - - } - - private void timeControl(Context context, String extras) { - HTTPInterface.getTimeControl(context); - } -} diff --git a/app/src/main/java/com/info/sn/manager/AmapManager.java b/app/src/main/java/com/info/sn/manager/AmapManager.java new file mode 100644 index 0000000..c20c161 --- /dev/null +++ b/app/src/main/java/com/info/sn/manager/AmapManager.java @@ -0,0 +1,89 @@ +package com.info.sn.manager; + +import android.content.Context; +import android.util.Log; + +import com.amap.api.location.AMapLocation; +import com.amap.api.location.AMapLocationClient; +import com.amap.api.location.AMapLocationClientOption; +import com.amap.api.location.AMapLocationListener; +import com.info.sn.utils.SPUtils; + +public class AmapManager { + private static AmapManager sInstance; + private Context mContext; + public static AMapLocationClient locationClient = null; + private String TAG = AmapManager.class.getSimpleName(); + + private AmapManager(Context context) { + this.mContext = context; + } + + public static void init(Context context) { + if (sInstance == null) { + sInstance = new AmapManager(context); + } + + } + + public static AmapManager getInstance() { + if (sInstance == null) { + throw new IllegalStateException("You must be init AmapManager first"); + } + + return sInstance; + } + + public AMapLocationClient getLocationClient() { + if (null == locationClient) { + initAmap(); + } + return locationClient; + } + + public void initAmap() { + locationClient = new AMapLocationClient(mContext); + AMapLocationClientOption option = new AMapLocationClientOption(); + option.setLocationPurpose(AMapLocationClientOption.AMapLocationPurpose.SignIn); + option.setLocationMode(AMapLocationClientOption.AMapLocationMode.Hight_Accuracy); + option.setNeedAddress(true); + //获取一次定位结果: + //该方法默认为false。 + option.setOnceLocation(true); + //获取最近3s内精度最高的一次定位结果: + //设置setOnceLocationLatest(boolean b)接口为true,启动定位时SDK会返回最近3s内精度最高的一次定位结果。 + // 如果设置其为true,setOnceLocation(boolean b)接口也会被设置为true,反之不会,默认为false。 + option.setOnceLocationLatest(true); + locationClient.setLocationOption(option); + //设置定位模式为AMapLocationMode.Hight_Accuracy,高精度模式。 + //设置定位监听 + locationClient.setLocationListener(new AMapLocationListener() { + + @Override + public void onLocationChanged(AMapLocation aMapLocation) { + StringBuilder sb = new StringBuilder(); + //errCode等于0代表定位成功,其他的为定位失败,具体的可以参照官网定位错误码说明 + if (aMapLocation.getErrorCode() == 0) { + Log.e(TAG, "onLocationChanged: " + "定位成功"); + Log.e(TAG, "onLocationChanged: " + aMapLocation.getAddress()); + sb.append(aMapLocation.getAddress()).append("\n"); + SPUtils.put(mContext, "AmapAddress", aMapLocation.getAddress()); + SPUtils.put(mContext, "longitude", aMapLocation.getLongitude()); + SPUtils.put(mContext, "latitude", aMapLocation.getLatitude()); + } else { + //定位失败 + sb.append("定位失败" + "\n"); + Log.e(TAG, "onLocationChanged: " + "定位失败"); + SPUtils.put(mContext, "AmapError", String.valueOf(aMapLocation.getErrorInfo())); + } + Log.e(TAG, (String) SPUtils.get(mContext, "AmapAddress", "-")); + Log.e(TAG, (String) SPUtils.get(mContext, "AmapError", "-")); + Log.e(TAG, "amap: " + sb.toString()); + } + }); + //设置场景模式后最好调用一次stop,再调用start以保证场景模式生效 + locationClient.stopLocation(); + locationClient.startLocation(); + Log.e(TAG, "initAmap: " + "startLocation"); + } +} diff --git a/app/src/main/java/com/info/sn/manager/ControlManager.java b/app/src/main/java/com/info/sn/manager/ControlManager.java new file mode 100644 index 0000000..3dbf77c --- /dev/null +++ b/app/src/main/java/com/info/sn/manager/ControlManager.java @@ -0,0 +1,628 @@ +package com.info.sn.manager; + +import android.annotation.SuppressLint; +import android.bluetooth.BluetoothAdapter; +import android.content.Context; +import android.content.Intent; +import android.os.Build; +import android.provider.Settings; +import android.text.TextUtils; +import android.util.Log; + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; +import com.info.sn.bean.zuoye.SystemSettings; +import com.info.sn.utils.ApkUtils; +import com.info.sn.utils.JGYUtils; +import com.info.sn.utils.ToastUtil; + +import java.util.Arrays; +import java.util.HashSet; +import java.util.function.Predicate; + + +/** + * 系统管理处理 + * 所有数据 后台1是0否,底层0是1否 + * + * @author jgy02 + */ +public class ControlManager { + private static final String TAG = ControlManager.class.getSimpleName(); + + @SuppressLint("StaticFieldLeak") + private static ControlManager sInstance; + private Context mContext; + + private ControlManager(Context mContext) { + this.mContext = mContext; + } + + public static void init(Context mContext) { + if (sInstance == null) { + sInstance = new ControlManager(mContext); + } + } + + public static ControlManager getInstance() { + if (sInstance == null) { + throw new IllegalStateException("You must be init ControlUtils first"); + } + return sInstance; + } + + private static int changeNum(int status) { + return status == 0 ? 1 : 0; + } + + public void setSystemSetting(Context context, String jsonString) { + if (TextUtils.isEmpty(jsonString)) { + return; + } + SystemSettings settings = JSON.parseObject(jsonString, SystemSettings.class); + if (null != settings) { + setUSBstate(context, settings); + setPhoneList(context, settings); + setBluetooth(context, settings); + setHotspot(context, settings); + setBar(context, settings); + setCamera(context, settings); + setTF(context, settings); + setIcon(context, settings); + setCanReset(context, jsonString); + setDeveloperOptions(context, jsonString); + JGYUtils.updateForbidList(context); + } + } + + /** + * 关闭所有功能 + */ + public void setDisableSetting() { + Log.e("setDisableSetting", "Close all settings: "); + setUSBstate(1); + setPhoneList(1); + setBluetooth(1); + setHotspot(1); + setCamera(1); + setTF(1); + setIcon(1); + setWallpaper(0); + setCanReset(1); + setBrowserInput(1); + if (!DeviceManager.isDebugMode()) { + setDeveloperOptions(1); + } + } + + /** + * usb连接模式管控 + * @param mContext + * @param settings + */ + private static void setUSBstate(Context mContext, SystemSettings settings) { + //USB数据功能管控 + //仅充电:usb_charge + //MTP模式:usb_mtp + //Midi模式:usb_midi + String setting_usb = settings.getSetting_usb(); + Log.e("SystemSetting", "setting_usb:" + setting_usb); + if (!DeviceManager.isDebugMode()) { + try { + boolean qch_usb_choose = JGYUtils.putString(mContext.getContentResolver(), "qch_usb_choose", setting_usb); + Log.e("SystemSetting", "qch_usb_choose:" + qch_usb_choose); + String usbStatus = ""; + switch (setting_usb) { + case "usb_charge": + usbStatus = "qch_action_usb_usb_charge"; + break; + case "usb_mtp": + usbStatus = "qch_action_usb_usb_mtp"; + break; +// case "usb_midi": +// usbStatus = "qch_action_usb_usb_midi"; +// break; + default: + usbStatus = "qch_action_usb_usb_charge"; + break; + } + Intent usbIntent = new Intent(usbStatus).setPackage("com.android.settings"); + mContext.sendBroadcast(usbIntent); + } catch (Exception e) { + Log.e(TAG, "setUSBstate: " + e.getMessage()); + } + } + } + + /** + * usb连接模式管控 + * @param state + */ + public void setUSBstate(int state) { + //USB数据功能管控 + //仅充电:usb_charge + //MTP模式:usb_mtp + //Midi模式:usb_midi + if (!DeviceManager.isDebugMode()) { + try { + boolean qch_usb_choose = Settings.System.putString(mContext.getContentResolver(), "qch_usb_choose", "usb_charge"); + Log.e(TAG, "qch_usb_choose:" + qch_usb_choose); + String usbStatus = "qch_action_usb_usb_charge"; + Intent usbIntent = new Intent(usbStatus).setPackage("com.android.settings"); + mContext.sendBroadcast(usbIntent); + } catch (Exception e) { + Log.e(TAG, "setUSBstate: " + e.getMessage()); + } + } + } + + private static void setPhoneList(Context mContext, SystemSettings settings) { + //设置电话功能,电话白名单 + int setting_call = changeNum(settings.getSetting_call()); + boolean qch_call_forbid = JGYUtils.putInt(mContext.getContentResolver(), "qch_call_forbid", setting_call); + Log.e("SystemSetting", "qch_call_forbid: " + setting_call); + + int setting_phone = changeNum(settings.getSetting_phone()); + boolean qch_white_list_on = JGYUtils.putInt(mContext.getContentResolver(), "qch_white_list_on", setting_phone); + Log.e("SystemSetting", "qch_white_list_on: " + setting_phone); + + String setting_phones = settings.getSetting_phones(); + boolean qch_white_list_Array = JGYUtils.putString(mContext.getContentResolver(), "qch_white_list_Array", setting_phones); + Log.e("SystemSetting", "qch_white_list_Array: " + qch_white_list_Array + "=" + setting_phones); + + int setting_memory = changeNum(settings.getSetting_memory()); + boolean qch_sdcard_forbid_on = JGYUtils.putInt(mContext.getContentResolver(), "qch_sdcard_forbid_on", setting_memory); + Log.e("SystemSetting", "qch_sdcard_forbid_on: " + setting_memory); + } + + private void setPhoneList(int state) { + try { + //设置电话功能,电话白名单 + boolean qch_call_forbid = Settings.System.putInt(mContext.getContentResolver(), "qch_call_forbid", state); + Log.e(TAG, "qch_call_forbid:" + qch_call_forbid); + + boolean qch_white_list_on = Settings.System.putInt(mContext.getContentResolver(), "qch_white_list_on", state); + Log.e(TAG, "qch_white_list_on:" + qch_white_list_on); + + boolean qch_white_list_Array = Settings.System.putString(mContext.getContentResolver(), "qch_white_list_Array", ""); + // ToastTool.show("qch_call_forbid::"+setting_call+"----setting_phones::"+setting_phones+"----"+qch_white_list_Array+"---"+qch_call_forbid); + Log.e(TAG, "qch_white_list_Array:" + qch_white_list_Array + "---" + qch_white_list_Array); + + boolean qch_sdcard_forbid_on = Settings.System.putInt(mContext.getContentResolver(), "qch_sdcard_forbid_on", state); + Log.e(TAG, "qch_sdcard_forbid_on:" + qch_sdcard_forbid_on); + } catch (Exception e) { + Log.e(TAG, "setPhoneList: " + e.getMessage()); + } + } + + private static void setBluetooth(Context mContext, SystemSettings settings) { + try { + //蓝牙开关 + int setting_bht = changeNum(settings.getSetting_bht()); + //总开关 + int setting_bhtvideo = changeNum(settings.getSetting_bhtvideo()); + //蓝牙音频开关 + int setting_bluetooth = changeNum(settings.getSetting_bluetooth()); + //蓝牙传输开关 + boolean qch_bht_forbid_on = JGYUtils.putInt(mContext.getContentResolver(), "qch_bht_forbid_on", setting_bht); + //写入系统数据库 + Log.e("SystemSetting", "qch_bht_forbid_on:" + qch_bht_forbid_on); + BluetoothAdapter mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter(); + if (qch_bht_forbid_on) { + //成功 + if (null == mBluetoothAdapter) { + mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter(); + //获取默认蓝牙适配器 + } + if (setting_bht == 0) { + //蓝牙总开关开启 + String setting_context = settings.getSetting_context(); + if (setting_bhtvideo == 0) { + if (null != setting_context && !setting_context.equals("") && !setting_context.equals(" ") && !setting_context.equals("null")) { + Log.e("SystemSetting", "setting_context:" + setting_context); + JGYUtils.putString(mContext.getContentResolver(), "qch_bhtvideo_forbid_on", setting_context); + } else { + JGYUtils.putString(mContext.getContentResolver(), "qch_bhtvideo_forbid_on", "Empty"); + } + } else if (setting_bhtvideo == 1) { + JGYUtils.putString(mContext.getContentResolver(), "qch_bhtvideo_forbid_on", "Empty"); + } + JGYUtils.putInt(mContext.getContentResolver(), "qch_bt_forbid_on", setting_bluetooth); + } else { + mBluetoothAdapter.disable(); + //设置关闭时关闭蓝牙 + } + } + } catch (Exception e) { + Log.e(TAG, "setBluetooth: " + e.getMessage()); + } + } + + private void setBluetooth(int state) { + try { + boolean qch_bht_forbid_on = Settings.System.putInt(mContext.getContentResolver(), "qch_bht_forbid_on", state); + //写入系统数据库 + Log.e(TAG, "qch_bht_forbid_on:" + qch_bht_forbid_on); + BluetoothAdapter mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter(); + if (qch_bht_forbid_on) { + //成功 + if (null == mBluetoothAdapter) { + mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter(); + //获取默认蓝牙适配器 + } + //蓝牙总开关开启 + Settings.System.putString(mContext.getContentResolver(), "qch_bhtvideo_forbid_on", "Empty"); + Settings.System.putInt(mContext.getContentResolver(), "qch_bt_forbid_on", state); + mBluetoothAdapter.disable(); + //设置关闭时关闭蓝牙 + } + } catch (Exception e) { + Log.e(TAG, "setBluetooth: " + e.getMessage()); + } + } + + private static void setHotspot(Context mContext, SystemSettings settings) { + try { + int setting_hotspot = changeNum(settings.getSetting_hotspot());//热点 + if (setting_hotspot == 1) { + Intent intent = new Intent(); + intent.setAction("qch_hotspot_close"); + intent.setPackage("com.android.settings"); + mContext.sendStickyBroadcast(intent); + } + boolean qch_hotspot_forbid_on = JGYUtils.putInt(mContext.getContentResolver(), "qch_hotspot_forbid_on", setting_hotspot);//写入系统数据库 + Log.e("SystemSetting", "qch_hotspot_forbid_on:" + setting_hotspot); + Log.e("SystemSetting", "qch_hotspot_forbid_on:" + qch_hotspot_forbid_on); + } catch (Exception e) { + Log.e(TAG, "setHotspot: " + e.getMessage()); + } + } + + private void setHotspot(int state) { + try { + Intent intent = new Intent(); + intent.setAction("qch_hotspot_close"); + intent.setPackage("com.android.settings"); + mContext.sendStickyBroadcast(intent); + boolean qch_hotspot_forbid_on = Settings.System.putInt(mContext.getContentResolver(), "qch_hotspot_forbid_on", state); + Log.e(TAG, "qch_hotspot_forbid_on:" + qch_hotspot_forbid_on); + } catch (Exception e) { + Log.e(TAG, "setHotspot: " + e.getMessage()); + } + } + + private static void setBar(Context mContext, SystemSettings settings) { + //系统导航条显示开关 + int setting_navigation = changeNum(settings.getSetting_navigation()); + boolean qch_hide_navigationBar = JGYUtils.putInt(mContext.getContentResolver(), "qch_hide_NavigationBar", setting_navigation); + Log.e("SystemSetting", "qch_hide_navigationBar:" + qch_hide_navigationBar); + + String navigationStatus = ""; + switch (setting_navigation) { + case 0: + navigationStatus = "qch_show_NavigationBar"; + break; + case 1: + navigationStatus = "qch_hide_NavigationBar"; + break; + + } + Intent navIntent = new Intent(navigationStatus).setPackage("com.android.systemui"); + mContext.sendBroadcast(navIntent); + + //状态栏显示开关 + int setting_statusbar = changeNum(settings.getSetting_statusbar()); + int oldNum = JGYUtils.getInt(mContext.getContentResolver(), "qch_hide_statusBar", 0); + if (oldNum != setting_statusbar) { + boolean qch_hide_statusBar = JGYUtils.putInt(mContext.getContentResolver(), "qch_hide_statusBar", setting_statusbar); + Log.e("SystemSetting", "qch_hide_statusBar:" + qch_hide_statusBar); + String statusbarStatus = ""; + switch (setting_statusbar) { + case 0: + statusbarStatus = "qch_show_statusBar"; + break; + case 1: + statusbarStatus = "qch_hide_statusBar"; + break; + } + Intent statusIntent = new Intent(statusbarStatus).setPackage("com.android.systemui"); + mContext.sendBroadcast(statusIntent); + } + } + + private static void setCamera(Context mContext, SystemSettings settings) { + try { + //摄像头开关 + int setting_camera = changeNum(settings.getSetting_camera()); + JGYUtils.putInt(mContext.getContentResolver(), "qch_app_camera", setting_camera); +// ApkUtils.hideSystemSettingAPP(mContext, "com.mediatek.camera"); + Log.e("SystemSetting", "setting_camera:" + setting_camera); + String cameraStatus = ""; + switch (setting_camera) { + case 0: + cameraStatus = "qch_camera_open"; + break; + case 1: + cameraStatus = "qch_camera_forbid"; + break; + } + Intent cameraIntent = new Intent(cameraStatus).setPackage("com.android.settings"); + mContext.sendBroadcast(cameraIntent); + } catch (Exception e) { + Log.e(TAG, "setCamera: " + e.getMessage()); + } + } + + private void setCamera(int state) { + try { + //摄像头开关 + boolean qch_app_camera = Settings.System.putInt(mContext.getContentResolver(), "qch_app_camera", state); + Log.e(TAG, "qch_app_camera1:" + state); +// ApkUtils.hideSystemSettingAPP(mContext, "com.mediatek.camera"); + Log.e(TAG, "setting_camera---------" + qch_app_camera); + String cameraStatus = "qch_camera_forbid"; + switch (state) { + case 0: + cameraStatus = "qch_camera_open"; + break; + case 1: + cameraStatus = "qch_camera_forbid"; + break; + } + Intent cameraIntent = new Intent(cameraStatus).setPackage("com.android.settings"); + mContext.sendBroadcast(cameraIntent); + } catch (Exception e) { + Log.e(TAG, "setCamera: " + e.getMessage()); + } + } + + @SuppressLint("NewApi") + private static void setTF(Context mContext, SystemSettings settings) { + //tfmedia开关 + int setting_tfmedia = changeNum(settings.getSetting_tfmedia()); + boolean qch_tfmedia_forbid = JGYUtils.putInt(mContext.getContentResolver(), "qch_tfmedia_forbid", setting_tfmedia); + Log.e("SystemSetting", "setting_tfmedia:" + qch_tfmedia_forbid); + String tfmediaStatus = ""; + switch (setting_tfmedia) { + case 0: + tfmediaStatus = "qch_tfmedia_open"; + break; + case 1: + tfmediaStatus = "qch_tfmedia_forbid"; + break; + default: + break; + } + Intent tfmediaIntent = new Intent(tfmediaStatus).setPackage("com.android.settings"); + mContext.sendBroadcast(tfmediaIntent); + if (setting_tfmedia == 1) { + String qch_tfmedia_filetypes = settings.getSetting_tfmedia_format(); + HashSet types = new HashSet<>(Arrays.asList(qch_tfmedia_filetypes.split(","))); + types.removeIf(new Predicate() { + @Override + public boolean test(String s) { + return TextUtils.isEmpty(s); + } + }); + String typesString = String.join(",", types); + JGYUtils.putString(mContext.getContentResolver(), "qch_tfmedia_filetypes", typesString);//影音管控 + Log.e("SystemSetting", "qch_tfmedia_filetypes :" + typesString); + } else { + JGYUtils.putInt(mContext.getContentResolver(), "qch_tfmedia_forbid", 0); + } + } + + private void setTF(int state) { + try { + //tfmedia开关 +// int setting_tfmedia = 1; + boolean qch_tfmedia_forbid = Settings.System.putInt(mContext.getContentResolver(), "qch_tfmedia_forbid", state); + Log.e(TAG, "setting_tfmedia---------" + qch_tfmedia_forbid); + String tfmediaStatus = ""; + switch (state) { + case 0: + tfmediaStatus = "qch_tfmedia_open"; + break; + case 1: + tfmediaStatus = "qch_tfmedia_forbid"; + break; + } + Intent tfmediaIntent = new Intent(tfmediaStatus).setPackage("com.android.settings"); + mContext.sendBroadcast(tfmediaIntent); + if (state == 1) { + boolean qch_tfmedia_filetypes = Settings.System.putString(mContext.getContentResolver(), "qch_tfmedia_filetypes", "Empty");//影音管控 + Log.e(TAG, "qch_tfmedia_filetypes:" + qch_tfmedia_filetypes); + } else { + Settings.System.putInt(mContext.getContentResolver(), "qch_tfmedia_forbid", 0); + } + } catch (Exception e) { + Log.e(TAG, "setTF: " + e.getMessage()); + } + } + + private static void setIcon(Context mContext, SystemSettings settings) { + try { + //added:2019.12.6 + //设置5个app的开关 + //时钟 + int deskclock = changeNum(settings.getSetting_clock()); + JGYUtils.putInt(mContext.getContentResolver(), "qch_app_deskclock", deskclock); + ApkUtils.hideSystemSettingAPP(mContext, "com.android.deskclock"); + Log.e("SystemSetting", "qch_app_deskclock:" + deskclock); + //录音机 + int soundrecorder = changeNum(settings.getSetting_recording()); + JGYUtils.putInt(mContext.getContentResolver(), "qch_app_soundrecorder", soundrecorder); + ApkUtils.hideSystemSettingAPP(mContext, "com.android.soundrecorder"); + Log.e("SystemSetting", "qch_app_soundrecorder:" + soundrecorder); + //音乐 + int music = changeNum(settings.getSetting_music()); + JGYUtils.putInt(mContext.getContentResolver(), "qch_app_music", music); + ApkUtils.hideSystemSettingAPP(mContext, "com.android.music"); + Log.e("SystemSetting", "qch_app_music:" + music); + //图库 + int gallery = changeNum(settings.getSetting_picture()); + JGYUtils.putInt(mContext.getContentResolver(), "qch_app_gallery", gallery); + ApkUtils.hideSystemSettingAPP(mContext, "com.android.gallery3d"); + Log.e("SystemSetting", "qch_app_gallery:" + gallery); + //壁纸 + int wallpaper = changeNum(settings.getSetting_wallpaper()); + JGYUtils.putInt(mContext.getContentResolver(), "qch_app_wallpaper", wallpaper); + Log.e("SystemSetting", "qch_app_wallpaper:" + wallpaper); + //文件管理器 + int filemanager = changeNum(settings.getSetting_file()); + JGYUtils.putInt(mContext.getContentResolver(), "qch_app_filemanager", filemanager); + if (Build.VERSION.SDK_INT < Build.VERSION_CODES.O) { + ApkUtils.hideSystemSettingAPP(mContext, "com.mediatek.filemanager"); + } else { + ApkUtils.hideSystemSettingAPP(mContext, "com.android.documentsui"); + } + Log.e("SystemSetting", "qch_app_filemanager:" + filemanager); + } catch (Exception e) { + Log.e(TAG, "setIcon: " + e.getMessage()); + } + } + + private void setIcon(int state) { + try { + //added:2019.12.6 + //设置5个app的开关 + //时钟 +// int deskclock = 1; + Settings.System.putInt(mContext.getContentResolver(), "qch_app_deskclock", state); + ApkUtils.hideSystemSettingAPP(mContext, "com.android.deskclock"); + Log.e(TAG, "qch_app_deskclock" + state); + //录音机 +// int soundrecorder = 1; + Settings.System.putInt(mContext.getContentResolver(), "qch_app_soundrecorder", state); + ApkUtils.hideSystemSettingAPP(mContext, "com.android.soundrecorder"); + Log.e(TAG, "qch_app_soundrecorder" + state); + //音乐 +// int music = 1; + Settings.System.putInt(mContext.getContentResolver(), "qch_app_music", state); + ApkUtils.hideSystemSettingAPP(mContext, "com.android.music"); + Log.e(TAG, "qch_app_music" + state); + //图库 +// int gallery = 1; + Settings.System.putInt(mContext.getContentResolver(), "qch_app_gallery", state); + ApkUtils.hideSystemSettingAPP(mContext, "com.android.gallery3d"); + Log.e(TAG, "qch_app_gallery" + state); + //文件管理器 +// int filemanager = 1; + Settings.System.putInt(mContext.getContentResolver(), "qch_app_filemanager", state); + if (Build.VERSION.SDK_INT < Build.VERSION_CODES.O) { + ApkUtils.hideSystemSettingAPP(mContext, "com.mediatek.filemanager"); + } else { + ApkUtils.hideSystemSettingAPP(mContext, "com.android.documentsui"); + } + Log.e(TAG, "qch_app_filemanager" + state); + } catch (Exception e) { + Log.e(TAG, "setIcon: " + e.getMessage()); + } + } + + private void setWallpaper(int state) { + //壁纸 +// int wallpaper = 1; + Settings.System.putInt(mContext.getContentResolver(), "qch_app_wallpaper", state); + Log.e(TAG, "qch_app_wallpaper" + state); + } + + private static void setCanReset(Context context, String jsonString) { + JSONObject jsonObject = JSON.parseObject(jsonString); + int mode = jsonObject.getInteger("qch_restore"); + if (mode == 1) { + Settings.System.putInt(context.getContentResolver(), "qch_restore_forbid_on", 0); + } else { + Settings.System.putInt(context.getContentResolver(), "qch_restore_forbid_on", 1); + } + Log.e(TAG, "qch_restore_forbid_on:" + mode); + } + + private void setCanReset(int state) { + boolean qch_restore_forbid_on = Settings.System.putInt(mContext.getContentResolver(), "qch_restore_forbid_on", 0); + Log.e(TAG, "qch_restore_forbid_on:" + qch_restore_forbid_on); + //默认打开 + } + + /** + * 置浏览器禁止输入,默认打开 + * + * @param state + */ + private void setBrowserInput(int state) { + Settings.System.putInt(mContext.getContentResolver(), "qch_Browser_input", 0); + } + + public void setDeveloperOptions(Context context, String jsonString) { + JSONObject jsonObject = JSON.parseObject(jsonString); + int dev_mode = changeNum(jsonObject.getInteger("dev_mode")); + Log.e(TAG, "getDeveloper: " + dev_mode); + if (!DeviceManager.isDebugMode()) { + JGYUtils.putInt(context.getContentResolver(), "qch_Developeroptions", dev_mode); + if (dev_mode == 1) { + Intent intent = new Intent(); + intent.setAction("qch_developeroptions_close"); + intent.setPackage("com.android.settings"); + context.sendBroadcast(intent); + Log.e(TAG, "getDeveloper: " + "关闭开发者模式"); + ToastUtil.debugShow("关闭开发者模式"); + } else { + Log.e(TAG, "getDeveloper: " + "打开开发者模式"); + ToastUtil.debugShow("打开开发者模式"); + } + } + } + + public void setDeveloperOptions(int state) { + Log.e(TAG, "getDeveloper: " + state); + if (!DeviceManager.isDebugMode()) { + Settings.System.putInt(mContext.getContentResolver(), "qch_Developeroptions", state); + if (state == 1) { + Intent intent = new Intent(); + intent.setAction("qch_developeroptions_close"); + intent.setPackage("com.android.settings"); + mContext.sendBroadcast(intent); + Log.e(TAG, "getDeveloper: " + "关闭开发者模式"); + } else { + Log.e(TAG, "getDeveloper: " + "打开开发者模式"); +// ToastUtil.show("打开开发者模式"); + } + } + } + + /** + * 开机管控usb + */ + public void setDefaultUSBstate() { + //USB数据功能管控 + //仅充电:usb_charge + //MTP模式:usb_mtp + //Midi模式:usb_midi + String setting_usb = JGYUtils.getString(mContext.getContentResolver(), "qch_usb_choose"); + Log.e("SystemSetting", "setting_usb:" + setting_usb); + String usbStatus = ""; + if (TextUtils.isEmpty(setting_usb)) { + usbStatus = "qch_action_usb_usb_charge"; + } else { + if (!DeviceManager.isDebugMode()) { + switch (setting_usb) { + case "usb_charge": + usbStatus = "qch_action_usb_usb_charge"; + break; + case "usb_mtp": + usbStatus = "qch_action_usb_usb_mtp"; + break; +// case "usb_midi": +// usbStatus = "qch_action_usb_usb_midi"; +// break; + default: + usbStatus = "qch_action_usb_usb_charge"; + break; + } + } + } + Intent usbIntent = new Intent(usbStatus).setPackage("com.android.settings"); + mContext.sendBroadcast(usbIntent); + } + +} diff --git a/app/src/main/java/com/info/sn/manager/DeviceManager.java b/app/src/main/java/com/info/sn/manager/DeviceManager.java new file mode 100644 index 0000000..d7518cc --- /dev/null +++ b/app/src/main/java/com/info/sn/manager/DeviceManager.java @@ -0,0 +1,80 @@ +package com.info.sn.manager; + +import android.annotation.SuppressLint; +import android.content.Context; +import android.content.Intent; +import android.os.Build; + +import com.info.sn.BuildConfig; +import com.info.sn.utils.SPUtils; +import com.info.sn.utils.ToastUtil; + +public class DeviceManager { + private static final String TAG = DeviceManager.class.getSimpleName(); + + @SuppressLint("StaticFieldLeak") + private static DeviceManager sInstance; + @SuppressLint("StaticFieldLeak") + private static Context mContext; + + private DeviceManager(Context context) { + mContext = context; + } + + public static void init(Context mContext) { + if (sInstance == null) { + sInstance = new DeviceManager(mContext); + } + } + + public static DeviceManager getInstance() { + if (sInstance == null) { + throw new IllegalStateException("You must be init ControlUtils first"); + } + return sInstance; + } + + /** + * @return 是否为debug模式 + */ + public static boolean isDebugMode() { + return BuildConfig.DEBUG || (boolean) SPUtils.get(mContext, "EnableDebug", false); + } + + /** + * 重启设备 + */ + public static void rebootDevices() { + if (isDebugMode()) { + ToastUtil.show("收到重启设备推送消息"); + return; + } + Intent iReboot = new Intent(Intent.ACTION_REBOOT); + iReboot.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); + mContext.startActivity(iReboot); + } + + /** + * 重置,恢复出厂设置 + */ + synchronized public static void doMasterClear() { + if (isDebugMode()) { + ToastUtil.show("收到重置设备推送消息"); + return; + } + if (Build.VERSION.SDK_INT > Build.VERSION_CODES.N_MR1) { + Intent intent = new Intent("android.intent.action.FACTORY_RESET"); + intent.setPackage("android"); + intent.addFlags(Intent.FLAG_RECEIVER_FOREGROUND); + intent.putExtra("android.intent.extra.REASON", "MasterClearConfirm"); + intent.putExtra("android.intent.extra.WIPE_EXTERNAL_STORAGE", false); + intent.putExtra("com.android.internal.intent.extra.WIPE_ESIMS", false); + mContext.sendBroadcast(intent); + } else { + Intent intent = new Intent("android.intent.action.MASTER_CLEAR"); +// intent.setPackage("com.android.settings"); + mContext.sendBroadcast(intent); + } + } + +} diff --git a/app/src/main/java/com/info/sn/manager/MyGlideModule.java b/app/src/main/java/com/info/sn/manager/MyGlideModule.java new file mode 100644 index 0000000..6cf43a3 --- /dev/null +++ b/app/src/main/java/com/info/sn/manager/MyGlideModule.java @@ -0,0 +1,43 @@ +package com.info.sn.manager; + +import android.content.Context; + +import com.bumptech.glide.GlideBuilder; +import com.bumptech.glide.load.engine.cache.DiskLruCacheFactory; +import com.bumptech.glide.module.AppGlideModule; +import com.info.sn.utils.StorageUtils; + +/** + * Created by Administrator on 2017/2/9. + */ +@com.bumptech.glide.annotation.GlideModule +public class MyGlideModule extends AppGlideModule { + @Override + public void applyOptions(final Context context, GlideBuilder builder) { + // 设置图片的显示格式 低内存时降低图片质量 +// ActivityManager activityManager = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE); +// if (activityManager != null){ +// ActivityManager.MemoryInfo memoryInfo = new ActivityManager.MemoryInfo(); +// activityManager.getMemoryInfo(memoryInfo); +// builder.setDecodeFormat(memoryInfo.lowMemory ? DecodeFormat.PREFER_RGB_565 : DecodeFormat.PREFER_ARGB_8888); +// } +// builder.setDecodeFormat(DecodeFormat.PREFER_RGB_565); + //设置磁盘缓存目录(和创建的缓存目录相同) + String downloadDirectoryPath = StorageUtils.getFileCache(context, "imageCache"); + //设置缓存的大小为100M + int cacheSize = 100 * 1024 * 1024; + builder.setDiskCache( + new DiskLruCacheFactory(downloadDirectoryPath, cacheSize)); + } + /** + * 清单解析的开启 + * + * 这里不开启,避免添加相同的modules两次 + * @return + */ + @Override + public boolean isManifestParsingEnabled() { + return false; + } +} + diff --git a/app/src/main/java/com/info/sn/manager/NetInterfaceManager.java b/app/src/main/java/com/info/sn/manager/NetInterfaceManager.java new file mode 100644 index 0000000..4306632 --- /dev/null +++ b/app/src/main/java/com/info/sn/manager/NetInterfaceManager.java @@ -0,0 +1,270 @@ +package com.info.sn.manager; + +import android.annotation.SuppressLint; +import android.content.Context; +import android.os.Environment; + +import com.info.sn.bean.zuoye.AppInfo; +import com.info.sn.bean.zuoye.AppStart; +import com.info.sn.bean.zuoye.BaseResponse; +import com.info.sn.bean.zuoye.Response; +import com.info.sn.bean.zuoye.SystemSettings; +import com.info.sn.bean.zuoye.UserAvatarInfo; +import com.info.sn.bean.zuoye.UserInfo; +import com.info.sn.network.UrlAddress; +import com.info.sn.network.api.APPJump; +import com.info.sn.network.api.ActiveUserApi; +import com.info.sn.network.api.AddAppInstall; +import com.info.sn.network.api.AppUsedApi; +import com.info.sn.network.api.BindDevices; +import com.info.sn.network.api.Browser; +import com.info.sn.network.api.CreateUserApi; +import com.info.sn.network.api.ForceInstall; +import com.info.sn.network.api.BrowserLabel; +import com.info.sn.network.api.NewestAppUpdate; +import com.info.sn.network.api.QRCodeApi; +import com.info.sn.network.api.QueryAllApp; +import com.info.sn.network.api.QueryAppInside; +import com.info.sn.network.api.QueryProductApi; +import com.info.sn.network.api.QuerySnAppStart; +import com.info.sn.network.api.RunningApp; +import com.info.sn.network.api.SNInfoApi; +import com.info.sn.network.api.SaveSnUidApi; +import com.info.sn.network.api.ScreenLock; +import com.info.sn.network.api.ScreenState; +import com.info.sn.network.api.Setting; +import com.info.sn.network.api.SettingKT; +import com.info.sn.network.api.TimeControl; +import com.info.sn.network.api.UpdateAdminSn; +import com.info.sn.network.api.UploadScreenshot; +import com.info.sn.network.api.UserInfoControl; +import com.info.sn.utils.Utils; + +import java.io.File; +import java.util.List; +import java.util.concurrent.TimeUnit; + +import io.reactivex.Observable; +import io.reactivex.android.schedulers.AndroidSchedulers; +import io.reactivex.schedulers.Schedulers; +import okhttp3.Cache; +import okhttp3.OkHttpClient; +import retrofit2.CallAdapter; +import retrofit2.Converter; +import retrofit2.Retrofit; +import retrofit2.adapter.rxjava2.RxJava2CallAdapterFactory; +import retrofit2.converter.gson.GsonConverterFactory; + +public class NetInterfaceManager { + @SuppressLint("StaticFieldLeak") + private static NetInterfaceManager INSTANCE; + private Context mContext; + private static Retrofit mRetrofit; + private static Retrofit mGankaoRetrofit; + private static final String ROOT_URL = UrlAddress.ROOT_URL; + + private NetInterfaceManager(Context context) { + mContext = context; + if (null == mRetrofit) { + mRetrofit = new Retrofit.Builder() + .client(okHttpClient) + .baseUrl(ROOT_URL) + .addConverterFactory(gsonConverterFactory) + .addCallAdapterFactory(rxJavaCallAdapterFactory) + .build(); + } + if (null == mGankaoRetrofit) { + mGankaoRetrofit = new Retrofit.Builder() + .client(okHttpClient) + .baseUrl(UrlAddress.GANKAN_ROOT_URL) + .addConverterFactory(gsonConverterFactory) + .addCallAdapterFactory(rxJavaCallAdapterFactory) + .build(); + } + } + + public static void init(Context context) { + if (INSTANCE == null) { + INSTANCE = new NetInterfaceManager(context); + } + } + + public static NetInterfaceManager getInstance() { + if (INSTANCE == null) { + throw new IllegalStateException("You must be init NetworkManager first"); + } + return INSTANCE; + } + + private static final long cacheSize = 1024 * 1024 * 32;// 缓存文件最大限制大小20M + private static String cacheDirectory = Environment.getExternalStorageDirectory() + "/okttpcaches"; // 设置缓存文件路径 + private static Cache cache = new Cache(new File(cacheDirectory), cacheSize); // + private static final OkHttpClient okHttpClient; + private static final int timeOut = 5; + + static { + //如果无法生存缓存文件目录,检测权限使用已经加上,检测手机是否把文件读写权限禁止了 + OkHttpClient.Builder builder = new OkHttpClient.Builder(); + builder.connectTimeout(timeOut, TimeUnit.SECONDS); // 设置连接超时时间 + builder.writeTimeout(timeOut, TimeUnit.SECONDS);// 设置写入超时时间 + builder.readTimeout(timeOut, TimeUnit.SECONDS);// 设置读取数据超时时间 + builder.retryOnConnectionFailure(true);// 设置进行连接失败重试 + builder.cache(cache);// 设置缓存 + okHttpClient = builder.build(); + } + + private static CallAdapter.Factory rxJavaCallAdapterFactory = RxJava2CallAdapterFactory.create(); + private static Converter.Factory gsonConverterFactory = GsonConverterFactory.create(); + + public Observable> getsnInfoControl() { + return mRetrofit.create(SNInfoApi.class) + .getsninfo(Utils.getSerial()) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()); + } + + public Observable getsettingControl() { + return mRetrofit.create(Setting.class) + .getSetting(Utils.getSerial()) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()); + } + + public Observable> getsettingKTControl() { + return mRetrofit.create(SettingKT.class) + .getSetting(Utils.getSerial()) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()); + } + + public Observable>> getForceInstallControl() { + return mRetrofit.create(ForceInstall.class) + .getForceInstall(Utils.getSerial()) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()); + } + + public BindDevices getbindDevicesControl() { + return mRetrofit.create(BindDevices.class); + } + + public AddAppInstall getAddAppInstallControl() { + return mRetrofit.create(AddAppInstall.class); + } + + public Observable getBrowserControl() { + return mRetrofit.create(Browser.class) + .getBrowser(Utils.getSerial()) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()); + } + + public Observable getLabelControl() { + return mRetrofit.create(BrowserLabel.class) + .getLabel(Utils.getSerial()) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()); + } + + public Observable>> getAppStartControl() { + return mRetrofit.create(QuerySnAppStart.class) + .getAppStatu(Utils.getSerial()) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()); + } + + public APPJump getAppJumpControl() { + return mRetrofit.create(APPJump.class); + } + + public UpdateAdminSn getUpdateAdminSnControl() { + return mRetrofit.create(UpdateAdminSn.class); + } + + public Observable>> getQueryAllAppControl() { + return mRetrofit.create(QueryAllApp.class) + .getAllApp(Utils.getSerial()) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()); + } + + public NewestAppUpdate getNewestAppUpdateControl() { + return mRetrofit.create(NewestAppUpdate.class); + } + + public UploadScreenshot getUploadScreenshotControl() { + return mRetrofit.create(UploadScreenshot.class); + } + + public ScreenLock getScreenLockControl() { + return mRetrofit.create(ScreenLock.class); + } + + public Observable getTimeControl() { + return mRetrofit.create(TimeControl.class) + .getTimeControl(Utils.getSerial()) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()); + } + + public ScreenState setScreen() { + return mRetrofit.create(ScreenState.class); + } + + public Observable> getUserAvatarInfoControl() { + return mRetrofit.create(UserInfoControl.class) + .getUserAvatarInfo(Utils.getSerial()) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()); + } + + public Observable getSaveSnUidApiControl(String uid) { + return mRetrofit.create(SaveSnUidApi.class) + .saveSnUid(Utils.getSerial(), uid) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()); + } + + + public AppUsedApi getAppUsedControl() { + return mRetrofit.create(AppUsedApi.class); + } + + public Observable getRunningAppObservable(String json) { + return mRetrofit.create(RunningApp.class) + .sendAppInfo(Utils.getSerial(), json) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()); + } + + public Observable getQRCodeApiControl() { + return mRetrofit.create(QRCodeApi.class) + .getQRCodeApi() + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()); + } + + public Observable getAppInsideControl() { + return mRetrofit.create(QueryAppInside.class) + .getAppInside(Utils.getSerial()) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()); + } + + + //赶考 + + public CreateUserApi getCreateUserControl() { + return mGankaoRetrofit.create(CreateUserApi.class); + } + + public ActiveUserApi getActiveUserControl() { + return mGankaoRetrofit.create(ActiveUserApi.class); + } + + public QueryProductApi getQueryProductControl() { + return mGankaoRetrofit.create(QueryProductApi.class); + } + + +} diff --git a/app/src/main/java/com/info/sn/mvp/BasePresenter.java b/app/src/main/java/com/info/sn/mvp/BasePresenter.java new file mode 100644 index 0000000..965b06a --- /dev/null +++ b/app/src/main/java/com/info/sn/mvp/BasePresenter.java @@ -0,0 +1,7 @@ +package com.info.sn.mvp; + +public interface BasePresenter { + void attachView(V view); + + void detachView(); +} diff --git a/app/src/main/java/com/info/sn/mvp/BaseView.java b/app/src/main/java/com/info/sn/mvp/BaseView.java new file mode 100644 index 0000000..cae9fc5 --- /dev/null +++ b/app/src/main/java/com/info/sn/mvp/BaseView.java @@ -0,0 +1,4 @@ +package com.info.sn.mvp; + +public interface BaseView { +} diff --git a/app/src/main/java/com/info/sn/network/HTTPInterface.java b/app/src/main/java/com/info/sn/network/HTTPInterface.java index c93a6cc..95ae5f9 100644 --- a/app/src/main/java/com/info/sn/network/HTTPInterface.java +++ b/app/src/main/java/com/info/sn/network/HTTPInterface.java @@ -1,35 +1,34 @@ package com.info.sn.network; +import android.annotation.SuppressLint; import android.content.Context; import android.content.Intent; import android.content.pm.PackageInfo; import android.content.pm.PackageManager; +import android.content.pm.ResolveInfo; import android.os.Build; import android.provider.Settings; import android.text.TextUtils; import android.util.Log; import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.google.gson.Gson; import com.google.gson.JsonObject; import com.info.sn.BuildConfig; -import com.info.sn.bean.AppInfo; -import com.info.sn.bean.AppStart; -import com.info.sn.bean.BaseResponse; -import com.info.sn.bean.BrowserBean; -import com.info.sn.bean.SystemSettings; -import com.info.sn.network.api.AddAppInstall; -import com.info.sn.network.api.Browser; -import com.info.sn.network.api.ForceInstall; -import com.info.sn.network.api.Label; +import com.info.sn.Statistics.AppInformation; +import com.info.sn.Statistics.StatisticsInfo; +import com.info.sn.bean.zuoye.AppInfo; +import com.info.sn.bean.zuoye.AppStart; +import com.info.sn.bean.zuoye.AppUploadInfo; +import com.info.sn.bean.zuoye.BaseResponse; +import com.info.sn.bean.zuoye.BrowserBean; +import com.info.sn.manager.ControlManager; +import com.info.sn.manager.NetInterfaceManager; import com.info.sn.network.api.NewestAppUpdate; -import com.info.sn.network.api.QueryAllApp; -import com.info.sn.network.api.QuerySnAppStart; -import com.info.sn.network.api.Setting; -import com.info.sn.network.api.TimeControl; import com.info.sn.network.api.UpdateAdminSn; -import com.info.sn.service.InitJpushServer; +import com.info.sn.service.ManagerService; import com.info.sn.utils.ApkUtils; import com.info.sn.utils.FileUtils; import com.info.sn.utils.JGYUtils; @@ -38,8 +37,13 @@ import com.info.sn.utils.TimeUtils; import com.info.sn.utils.URLUtils; import com.info.sn.utils.Utils; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.HashSet; import java.util.List; +import io.reactivex.Observable; +import io.reactivex.ObservableOnSubscribe; import io.reactivex.Observer; import io.reactivex.android.schedulers.AndroidSchedulers; import io.reactivex.annotations.NonNull; @@ -47,17 +51,19 @@ import io.reactivex.disposables.Disposable; import io.reactivex.schedulers.Schedulers; public class HTTPInterface { + private static String TAG = HTTPInterface.class.getSimpleName(); + public static void SendAppInstall(String jsonString) { // if (packageName.equals(packages)) { // Log.e("SendAppInstall", installOrRemove + "return: " + packages); // return; // } - - AddAppInstall addAppInstall = NetWorkManager.getAddAppInstallControl(); - addAppInstall.installorRemove( - Utils.getSerial(), jsonString - ).subscribeOn(Schedulers.io()) + NetInterfaceManager.getInstance() + .getAddAppInstallControl() + .installorRemove( + Utils.getSerial(), jsonString + ).subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(new Observer() { @Override @@ -86,11 +92,11 @@ public class HTTPInterface { } - public static void setBrowser(final Context context) { - Browser browser = NetWorkManager.getBrowserControl(); - browser.getBrowser(Utils.getSerial()) - .subscribeOn(Schedulers.io()) - .observeOn(AndroidSchedulers.mainThread()) + /** + * @param context 获取浏览器黑白名单 + */ + public static void getBrowserWhiteList(final Context context) { + NetInterfaceManager.getInstance().getBrowserControl() .subscribe(new Observer() { @Override public void onSubscribe(@NonNull Disposable d) { @@ -105,28 +111,27 @@ public class HTTPInterface { //白名单 List white = JSON.parseArray(jsonObject.getString("browser"), BrowserBean.class); if (null != white && white.size() != 0) { - String s = ""; + StringBuilder s = new StringBuilder(); for (BrowserBean bean : white) { - s += bean.getAddress() + ","; + s.append(bean.getAddress()).append(","); } - boolean whiteList = Settings.System.putString(context.getContentResolver(), "DeselectBrowserArray", s); + boolean whiteList = JGYUtils.putString(context.getContentResolver(), "DeselectBrowserArray", s.toString()); Log.e("setBrowser", "setBrowserList_white:" + whiteList + ":" + white); } else { - Settings.System.putString(context.getContentResolver(), "DeselectBrowserArray", " "); + JGYUtils.putString(context.getContentResolver(), "DeselectBrowserArray", " "); } //黑名单 List black = JSON.parseArray(jsonObject.getString("browser_black"), BrowserBean.class); if (null != black && black.size() != 0) { - String s = ""; + StringBuilder s = new StringBuilder(); for (BrowserBean bean : black) { - s += bean.getAddress() + ","; + s.append(bean.getAddress()).append(","); } - boolean blackList = Settings.System.putString(context.getContentResolver(), "qch_webblack_url", s); + boolean blackList = JGYUtils.putString(context.getContentResolver(), "qch_webblack_url", s.toString()); Log.e("setBrowser", "setBrowserList_black:" + blackList + ":" + black); } else { - Settings.System.putString(context.getContentResolver(), "qch_webblack_url", " "); + JGYUtils.putString(context.getContentResolver(), "qch_webblack_url", " "); } - } } @@ -144,10 +149,7 @@ public class HTTPInterface { } public static void getBrowserLabel(final Context context) { - Label label = NetWorkManager.getLabelControl(); - label.getLabel(Utils.getSerial()) - .subscribeOn(Schedulers.io()) - .observeOn(AndroidSchedulers.mainThread()) + NetInterfaceManager.getInstance().getLabelControl() .subscribe(new Observer() { @Override public void onSubscribe(@NonNull Disposable d) { @@ -161,13 +163,10 @@ public class HTTPInterface { Gson gson = new Gson(); String data = gson.toJson(listBaseResponse.data); JsonObject jsonObject = gson.fromJson(data, JsonObject.class); - if (jsonObject.getAsJsonArray("label").size() == 0) { - return; - } - JsonObject label = jsonObject.getAsJsonArray("label").get(0).getAsJsonObject(); - String home_page = label.get("home_page").getAsString(); - Settings.System.putString(context.getContentResolver(), "homepagURL", home_page); - String label_page = label.get("label_page").getAsString(); +// JsonElement label = jsonObject.get(0).getAsJsonObject(); + String home_page = jsonObject.get("home_page").getAsString(); + JGYUtils.putString(context.getContentResolver(), "homepagURL", home_page); + String label_page = jsonObject.get("label_page").getAsString(); // Log.e("getBrowserLabel", "onNext: " + home_page); //主页 Intent homepag = new Intent("qch_app_brower_homepage"); @@ -215,32 +214,32 @@ public class HTTPInterface { @Override public void onError(@NonNull Throwable e) { Log.e("getBrowserLabel", "onError: " + e.getMessage()); + onComplete(); } @Override public void onComplete() { - + new URLUtils(context).setBrowserList(); } }); } - public static void getAppStart(final Context context) { - final QuerySnAppStart appStart = NetWorkManager.getAppStartControl(); - appStart.getAppStatu(Utils.getSerial()) - .subscribeOn(Schedulers.io()) - .observeOn(AndroidSchedulers.mainThread()) + public static void getAppStart(final Context context, List appInfoList) { + NetInterfaceManager.getInstance().getAppStartControl() .subscribe(new Observer>>() { @Override public void onSubscribe(@NonNull Disposable d) { - + Log.e("getAppStart", "onSubscribe: "); } @Override public void onNext(@NonNull BaseResponse> listBaseResponse) { + Log.e("getAppStart", "onNext: " + JSONObject.toJSONString(listBaseResponse.data)); int code = listBaseResponse.code; if (code == 200) { List list = listBaseResponse.data; setAppState(context, list); + checkPackageAndVersion(context, list, appInfoList); } else { setInvalid(context); } @@ -253,24 +252,70 @@ public class HTTPInterface { @Override public void onComplete() { - + Log.e("getAppStart", "onComplete: "); } }); } - private static void setAppState(Context context, List list) { - setAppAutoStart(context, list); + public static void setAppState(Context context, List list) { +// setAppAutoStart(context, list); setAppNetwork(context, list); - setAppNUpdate(context, list); + setAppUpdate(context, list); setAppSlide(context, list); setAppHide(context, list); - setAPPinsideBrowser(context, list); - setAPPIDJump(context, list); +// setAPPinsideBrowser(context, list); +// setAPPIDJump(context, list); + } + + private static void checkPackageAndVersion(Context context, List list, List appInfoList) { + if (list != null && appInfoList != null) { + PackageManager pm = context.getPackageManager(); + HashMap appInfoHashMap = new HashMap<>(); + for (AppInfo appInfo : appInfoList) { + appInfoHashMap.put(appInfo.getApp_package(), appInfo); + } + for (AppStart appStart : list) { + String pkg = appStart.getApp_package(); + if (appStart.getIs_upgrade() == 0) { + Log.e(TAG, "checkPackageAndVersion: " + pkg + ": 禁止升级"); + AppInfo info = appInfoHashMap.get(pkg); + PackageInfo packageInfo = null; + try { + packageInfo = pm.getPackageInfo(pkg, 0); + } catch (PackageManager.NameNotFoundException e) { + e.printStackTrace(); + } + if (packageInfo != null && info != null) { + Log.e(TAG, "checkPackageAndVersion: " + info.getApp_package()); + long onlineVersion = info.getApp_version_code(); + long appVersionCode; + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) { + appVersionCode = packageInfo.getLongVersionCode(); + } else { + appVersionCode = packageInfo.versionCode; + } + if (appVersionCode > onlineVersion && appVersionCode != 0) { + ApkUtils.uninstallApp(context, pkg); + JSONObject jsonObject = (JSONObject) JSON.toJSON(info); + FileUtils.ariaDownload(context, info.getApp_url(), jsonObject); + Log.e(TAG, "checkPackageAndVersion: " + pkg + ": 卸载"); + } else { + Log.e(TAG, "checkPackageAndVersion: " + pkg + ": 版本正常"); + } + } else { + Log.e(TAG, "checkPackageAndVersion: " + pkg + ": 未安装"); + } + } else { + Log.e(TAG, "checkPackageAndVersion: " + pkg + ": 未禁止升级"); + } + } + } + ApkUtils.addShortcut(context); } //应用自启动 - private static void setAppAutoStart(Context context, List list) { + public static void setAppAutoStart(Context context, List list) { String auto_allow = ""; String auto_not = ""; if (null != list && list.size() != 0) { @@ -289,7 +334,7 @@ public class HTTPInterface { } if (!TextUtils.isEmpty(auto_allow) && auto_allow.endsWith(",")) { auto_allow = auto_allow.substring(0, auto_allow.length() - 1); - boolean qch_app_power_on = Settings.System.putString(context.getContentResolver(), "qch_app_power_on", auto_allow); + boolean qch_app_power_on = JGYUtils.putString(context.getContentResolver(), "qch_app_power_on", auto_allow); } if (!TextUtils.isEmpty(auto_not) && auto_not.endsWith(",")) { auto_not = auto_not.substring(0, auto_not.length() - 1); @@ -317,41 +362,38 @@ public class HTTPInterface { } if (!TextUtils.isEmpty(network_allow) && network_allow.endsWith(",")) { network_allow = network_allow.substring(0, network_allow.length() - 1); - Settings.System.putString(context.getContentResolver(), "qch_jgy_network_allow", network_allow); - Log.e("fht", "not::" + network_allow); + JGYUtils.putString(context.getContentResolver(), "qch_jgy_network_allow", network_allow); + Log.e(TAG, "not::" + network_allow); } if (!TextUtils.isEmpty(network_not) && network_not.endsWith(",")) { network_not = network_not.substring(0, network_not.length() - 1); - Settings.System.putString(context.getContentResolver(), "qch_jgy_network_disallow", network_not); - Log.e("fht", "ban::" + network_not); + JGYUtils.putString(context.getContentResolver(), "qch_jgy_network_disallow", network_not); + Log.e(TAG, "ban::" + network_not); } } } //app更新 - private static void setAppNUpdate(Context context, List list) { + @SuppressLint("NewApi") + private static void setAppUpdate(Context context, List list) { if (null != list && list.size() != 0) { - String upgrade_allow = ""; - String upgrade_not = ""; + HashSet notApp = new HashSet<>(); + HashSet allowApp = new HashSet<>(); for (AppStart app : list) { int is_upgrade = app.getIs_upgrade(); String app_package = app.getApp_package(); if (is_upgrade == 0) { - upgrade_allow += app_package + ","; + notApp.add(app_package); } else { - upgrade_not += app_package + ","; + allowApp.add(app_package); } } - if (!TextUtils.isEmpty(upgrade_allow) && upgrade_allow.endsWith(",")) { - upgrade_allow = upgrade_allow.substring(0, upgrade_allow.length() - 1); - } - if (!TextUtils.isEmpty(upgrade_not) && upgrade_not.endsWith(",")) { - upgrade_not = upgrade_not.substring(0, upgrade_not.length() - 1); - } - Log.e("setAppNUpdate", "upgrade_allow: " + upgrade_allow); - Log.e("setAppNUpdate", "upgrade_allow: " + upgrade_not); - Utils.writeDisableUpdateList(context, upgrade_not.split(","), upgrade_allow.split(",")); - + String upgrade_disallow = String.join(",", notApp); + String upgrade_allow = String.join(",", allowApp); + Log.e("setAppUpdate", "upgrade_allow: " + upgrade_allow); + Log.e("setAppUpdate", "upgrade_disallow: " + upgrade_disallow); + Settings.System.putString(context.getContentResolver(), "upgrade_disallow", upgrade_disallow); + Utils.writeDisableUpdateList(context); } } @@ -378,11 +420,11 @@ public class HTTPInterface { } if (!TextUtils.isEmpty(slide_not) && slide_not.endsWith(",")) { slide_not = slide_not.substring(0, slide_not.length() - 1); - boolean writeSucceed = Settings.System.putString(context.getContentResolver(), "qch_disable_slide", slide_not); - Log.e("fht", "qch_disable_slide=" + writeSucceed + ":" + slide_not); + boolean writeSucceed = JGYUtils.putString(context.getContentResolver(), "qch_disable_slide", slide_not); + Log.e(TAG, "qch_disable_slide=" + writeSucceed + ":" + slide_not); } else { - boolean writeSucceed = Settings.System.putString(context.getContentResolver(), "qch_disable_slide", "Invalid"); - Log.e("fht", "qch_disable_slide ok=" + writeSucceed + ":" + slide_allow); + boolean writeSucceed = JGYUtils.putString(context.getContentResolver(), "qch_disable_slide", "Invalid"); + Log.e(TAG, "qch_disable_slide ok=" + writeSucceed + ":" + slide_allow); } } else { @@ -391,15 +433,18 @@ public class HTTPInterface { } //隐藏显示app + @SuppressLint("NewApi") private static void setAppHide(Context context, List list) { PackageManager pm = context.getPackageManager(); if (null != list && list.size() != 0) { + List hideAPPList = new ArrayList<>(); for (AppStart app : list) { String app_package = app.getApp_package(); int is_lock = app.getIs_lock(); try { if (is_lock == 1) { pm.setApplicationEnabledSetting(app_package, PackageManager.COMPONENT_ENABLED_STATE_DISABLED, 0); + hideAPPList.add(app_package); } else { pm.setApplicationEnabledSetting(app_package, PackageManager.COMPONENT_ENABLED_STATE_DEFAULT, 0); } @@ -407,22 +452,26 @@ public class HTTPInterface { Log.e("setAppHide", "setAppHide: " + e.getMessage()); } } + String jsonString = JSONObject.toJSONString(hideAPPList); + SPUtils.put(context, "Hide_APP_List", String.join(",", jsonString)); + JGYUtils.updateHideList(context); + Log.e(TAG, "Hide_APP_List: " + jsonString); } } //应用内网页管控 public static void setAPPinsideBrowser(Context context, List list) { - String packageList = ""; - String urlList = ""; + StringBuilder packageList = new StringBuilder(); + StringBuilder urlList = new StringBuilder(); for (AppStart app : list) { if (TextUtils.isEmpty(app.getAddress())) { - packageList += app.getApp_package() + ","; + packageList.append(app.getApp_package()).append(","); } else { - urlList += app.getApp_package() + "," + app.getAddress() + ";"; + urlList.append(app.getApp_package()).append(",").append(app.getAddress()).append(";"); } } - if (!TextUtils.isEmpty(packageList)) { + if (!TextUtils.isEmpty(packageList.toString())) { // //app内所有的网页禁止 // packageList = packageList.substring(0, packageList.length() - 1); // //去掉多余的, @@ -435,14 +484,12 @@ public class HTTPInterface { } else { sendAllweb(context); } - if (!TextUtils.isEmpty(urlList)) { + if (!TextUtils.isEmpty(urlList.toString())) { //app内单个网页地址禁止打开 - urlList = urlList.substring(0, urlList.length() - 1); - //去掉多余的; Log.e("setAppinsideWeb ", "strings:" + urlList); Intent intent = new Intent("qch_app_inside_website") .setPackage("com.android.settings"); - intent.putExtra("websitelist", urlList); + intent.putExtra("websitelist", urlList.toString()); context.sendBroadcast(intent); } else { sendwebUrl(context); @@ -450,41 +497,34 @@ public class HTTPInterface { } //应用ID管控 + @SuppressLint("NewApi") public static void setAPPIDJump(Context context, List list) { - String ids = ""; - String packages = ""; if (null != list && list.size() != 0) { + HashSet pkgs = new HashSet<>(); + HashSet idList = new HashSet<>(); for (AppStart app : list) { - String app_package = app.getApp_package(); - String id = app.getVisit(); - if (!ids.contains(id)) { - ids += id + ","; - } - if (!packages.contains(app_package)) { - packages += app_package + ","; - } + pkgs.add(app.getApp_package()); + idList.add(app.getVisit()); } + String packages = String.join(",", pkgs); + String ids = String.join(",", idList); + Log.e(TAG, "setAPPIDJump: " + packages); + Log.e(TAG, "setAPPIDJump: " + ids); if (TextUtils.isEmpty(ids)) { - Settings.System.putString(context.getContentResolver(), "qch_app_forbid_id", "Invalid"); - Settings.System.putString(context.getContentResolver(), "DeselectViewArray", "Invalid"); + JGYUtils.putString(context.getContentResolver(), "qch_app_forbid_id", "Invalid"); + JGYUtils.putString(context.getContentResolver(), "DeselectViewArray", "Invalid"); } else { - if (ids.endsWith(",")) { - ids = ids.substring(0, ids.length() - 1); - } - if (packages.endsWith(",")) { - packages = packages.substring(0, packages.length() - 1); - } - Settings.System.putString(context.getContentResolver(), "qch_app_forbid_id", packages); - Settings.System.putString(context.getContentResolver(), "DeselectViewArray", ids); + JGYUtils.putString(context.getContentResolver(), "qch_app_forbid_id", packages); + JGYUtils.putString(context.getContentResolver(), "DeselectViewArray", ids); } } } - private static void setInvalid(Context context) { - boolean qch_app_power_on = Settings.System.putString(context.getContentResolver(), "qch_app_power_on", "Invalid"); - boolean qch_jgy_network_allow = Settings.System.putString(context.getContentResolver(), "qch_jgy_network_allow", "Invalid"); - boolean qch_jgy_network_disallow = Settings.System.putString(context.getContentResolver(), "qch_jgy_network_disallow", "Invalid"); - boolean writeSucceed = Settings.System.putString(context.getContentResolver(), "qch_disable_slide", "Invalid"); + public static void setInvalid(Context context) { + boolean qch_app_power_on = JGYUtils.putString(context.getContentResolver(), "qch_app_power_on", "Invalid"); + boolean qch_jgy_network_allow = JGYUtils.putString(context.getContentResolver(), "qch_jgy_network_allow", "Invalid"); + boolean qch_jgy_network_disallow = JGYUtils.putString(context.getContentResolver(), "qch_jgy_network_disallow", "Invalid"); + boolean writeSucceed = JGYUtils.putString(context.getContentResolver(), "qch_disable_slide", "Invalid"); } private static void sendAllweb(Context context) { @@ -510,14 +550,14 @@ public class HTTPInterface { jsonObject.put("longitude", longitude); jsonObject.put("latitude", latitude); String a = jsonObject.toString(); - String b = Utils.getMachine(context); - String c = Utils.getHardware(context); - String d = Utils.getSerial(); - UpdateAdminSn updateAdminSn = NetWorkManager.getUpdateAdminSnControl(); + String machine = Utils.getMachine(context); + String hardware = Utils.getHardware(context); + Log.e(TAG, "updateAdminInfo: getHardware = " + hardware); + UpdateAdminSn updateAdminSn = NetInterfaceManager.getInstance().getUpdateAdminSnControl(); updateAdminSn.sendAdminSn(Utils.getSerial(), jsonObject.toJSONString(), - Utils.getMachine(context), - Utils.getHardware(context) + machine, + hardware ).subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(new Observer() { @@ -528,7 +568,6 @@ public class HTTPInterface { @Override public void onNext(@NonNull BaseResponse baseResponse) { -// Log.e("updateAdminInfo", "onNext: " + baseResponse.toString()); Log.e("updateAdminInfo", "onNext: " + baseResponse.msg); } @@ -545,15 +584,16 @@ public class HTTPInterface { }); } + /** + * @param context 获取所有可以安装的包名 + */ + @SuppressLint("NewApi") public static void getAllappPackage(final Context context) { - QueryAllApp queryAllApp = NetWorkManager.getQueryAllAppControl(); - queryAllApp.getAllApp(Utils.getSerial()) - .subscribeOn(Schedulers.io()) - .observeOn(AndroidSchedulers.mainThread()) + NetInterfaceManager.getInstance().getQueryAllAppControl() .subscribe(new Observer>>() { @Override public void onSubscribe(@NonNull Disposable d) { - + Log.e("getAllappPackage", "onSubscribe: "); } @Override @@ -563,14 +603,14 @@ public class HTTPInterface { Log.e("getAllappPackage", "onNext: " + listBaseResponse.msg); List appInfoList = listBaseResponse.data; if (null != appInfoList && appInfoList.size() != 0) { - String s = ""; + HashSet allAppPkg = new HashSet<>(); for (AppInfo appInfo : appInfoList) { - s += appInfo.getApp_package() + ","; + allAppPkg.add(appInfo.getApp_package()); } - if (s.endsWith(",")) { - s = s.substring(0, s.length() - 1); - } - ApkUtils.writeAppPackageList(context, s); + String allPkgSet = String.join(",", allAppPkg); + SPUtils.put(context, "only_jgy_shortcut_list", allPkgSet); + ApkUtils.writeAppPackageList(context, allPkgSet); + HTTPInterface.getAppStart(context, appInfoList); } else { ApkUtils.writeAppPackageList(context, "Invalid"); } @@ -587,16 +627,13 @@ public class HTTPInterface { @Override public void onComplete() { - + Log.e("getAllappPackage", "onComplete: "); } }); } public static void getForceInstall(final Context context) { - ForceInstall forceInstall = NetWorkManager.getForceInstallControl(); - forceInstall.getForceInstall(Utils.getSerial()) - .subscribeOn(Schedulers.io()) - .observeOn(AndroidSchedulers.mainThread()) + NetInterfaceManager.getInstance().getForceInstallControl() .subscribe(new Observer>>() { @Override public void onSubscribe(@NonNull Disposable d) { @@ -612,8 +649,8 @@ public class HTTPInterface { getForceInstallState(context, appInfos); } } else { - boolean qch_force_app = Settings.System.putString(context.getContentResolver(), "qch_force_app", "invalid"); - Log.e("fht", "qch_force_app:" + qch_force_app + ":" + "invalid"); + boolean qch_force_app = JGYUtils.putString(context.getContentResolver(), "qch_force_app", "invalid"); + Log.e(TAG, "qch_force_app:" + qch_force_app + ":" + "invalid"); } } @@ -629,14 +666,13 @@ public class HTTPInterface { }); } - private static void getForceInstallState(Context context, List list) { + @SuppressLint("NewApi") + synchronized public static void getForceInstallState(Context context, List list) { if (null != list && list.size() != 0) { - String packageList = ""; + HashSet forceAppSet = new HashSet<>(); PackageManager pm = context.getPackageManager(); for (AppInfo appInfo : list) { - if (!packageList.contains(appInfo.getApp_package())) { - packageList += appInfo.getApp_package() + ","; - } + forceAppSet.add(appInfo.getApp_package()); PackageInfo info = null; try { info = pm.getPackageInfo(appInfo.getApp_package(), 0); @@ -659,19 +695,17 @@ public class HTTPInterface { FileUtils.ariaDownload(context, appInfo.getApp_url(), jsonObject); } } - if (packageList.endsWith(",")) { - packageList = packageList.substring(0, packageList.length() - 1); - boolean qch_force_app = Settings.System.putString(context.getContentResolver(), "qch_force_app", packageList); - Log.e("fht", "qch_force_app:" + qch_force_app + ":" + packageList); - } + String packageList = String.join(",", forceAppSet); + Log.e(TAG, "getForceInstallState: " + packageList); + boolean qch_force_app = JGYUtils.putString(context.getContentResolver(), "qch_force_app", packageList); } else { - boolean qch_force_app = Settings.System.putString(context.getContentResolver(), "qch_force_app", "invalid"); - Log.e("fht", "qch_force_app:" + qch_force_app + ":" + "invalid"); + boolean qch_force_app = JGYUtils.putString(context.getContentResolver(), "qch_force_app", "invalid"); + Log.e(TAG, "getForceInstallState:" + qch_force_app + ":" + "invalid"); } } public static void checkUpdate(final Context context, String packageName, String versionCode) { - NewestAppUpdate newestAppUpdate = NetWorkManager.getNewestAppUpdateControl(); + NewestAppUpdate newestAppUpdate = NetInterfaceManager.getInstance().getNewestAppUpdateControl(); newestAppUpdate.getAppUpdate(packageName, versionCode, JGYUtils.getInstance().checkAppPlatform()) .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) @@ -737,22 +771,20 @@ public class HTTPInterface { } public static void getSystemSettings(final Context context) { - Setting setting = NetWorkManager.getsettingControl(); - setting.getSetting(Utils.getSerial()) - .subscribeOn(Schedulers.io()) - .observeOn(AndroidSchedulers.mainThread()) - .subscribe(new Observer>() { + NetInterfaceManager.getInstance().getsettingControl() + .subscribe(new Observer() { @Override public void onSubscribe(@NonNull Disposable d) { } @Override - public void onNext(@NonNull BaseResponse systemSettingsBaseResponse) { - int code = systemSettingsBaseResponse.code; + public void onNext(@NonNull BaseResponse BaseResponse) { + int code = BaseResponse.code; if (code == 200) { - SystemSettings settings = systemSettingsBaseResponse.data; - Utils.setSystemSetting(context, settings.toString()); + JSONObject jsonObject = (JSONObject) JSON.toJSON(BaseResponse.data); + Log.e("getSystemSettings", "onNext: " + jsonObject); + ControlManager.getInstance().setSystemSetting(context, jsonObject.toJSONString()); } } @@ -770,10 +802,8 @@ public class HTTPInterface { synchronized public static void getTimeControl(final Context context) { - TimeControl timeControl = NetWorkManager.getTimeControl(); - timeControl.getTimeControl(Utils.getSerial()) - .subscribeOn(Schedulers.io()) - .observeOn(AndroidSchedulers.mainThread()) + NetInterfaceManager.getInstance() + .getTimeControl() .subscribe(new Observer() { @Override public void onSubscribe(Disposable d) { @@ -782,20 +812,33 @@ public class HTTPInterface { @Override public void onNext(BaseResponse baseResponse) { + Log.e(TAG, "onNext: "); int code = baseResponse.code; if (code == 200) { JSONObject jsonObject = (JSONObject) JSON.toJSON(baseResponse.data); - String start_time = jsonObject.getString("start_time"); - String end_time = jsonObject.getString("end_time"); - TimeUtils.ContralTime c = TimeUtils.String2ContralTime(context, start_time + "-" + end_time); - if (null != c) { - Log.e("getTimeControl", "200:" + c.toString()); + JSONObject work = jsonObject.getJSONObject("work"); + String work_start_time = work.getString("start_time"); + String work_end_time = work.getString("end_time"); + JSONObject rest = jsonObject.getJSONObject("rest"); + String rest_start_time = rest.getString("start_time"); + String rest_end_time = rest.getString("end_time"); + TimeUtils.ContralTime workingTime = TimeUtils.String2WorkingTime(context, work_start_time + "-" + work_end_time); + TimeUtils.ContralTime weekTime = TimeUtils.String2WeekTime(context, rest_start_time + "-" + rest_end_time); + if (null != workingTime) { + Log.e("getTimeControl", "200:" + workingTime.toString()); + } + if (null != weekTime) { + Log.e("getTimeControl", "200:" + weekTime.toString()); } } else { TimeUtils.setEmpty(context); - TimeUtils.ContralTime c = TimeUtils.getDefaltContralTime(context); - if (null != c) { - Log.e("getTimeControl", c.toString()); + TimeUtils.ContralTime workingTime = TimeUtils.getWorkingDayContralTime(context); + if (null != workingTime) { + Log.e("getTimeControl", workingTime.toString()); + } + TimeUtils.ContralTime weekTime = TimeUtils.getWeekDayContralTime(context); + if (null != weekTime) { + Log.e("getTimeControl", weekTime.toString()); } } } @@ -808,461 +851,178 @@ public class HTTPInterface { @Override public void onComplete() { Intent intent = new Intent(); - intent.setAction(InitJpushServer.TimeChangedReceiver.ACTION_UPDATE); + intent.setAction(ManagerService.ACTION_UPDATE); context.sendBroadcast(intent); } }); } + public static void sendAppUsed(Context context) { + String statistics = Utils.getAppUsedStatistics(context); + Log.e(TAG, "sendAppUsed: " + statistics); + NetInterfaceManager.getInstance().getAppUsedControl() + .getAppUsed(Utils.getSerial(), statistics) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new Observer() { + @Override + public void onSubscribe(Disposable d) { + Log.e("sendAppUsed", "onSubscribe: "); + } - //获取设备信息接口 -// public static synchronized void checkDevicesInfo(final Handler handler) { -// OkGo.get(UrlAddress.SNINFO) -// .params("sn", Utils.getSerial()) -// .execute(new StringCallback() { -// @Override -// public void onSuccess(Response response) { -// Log.e("onSuccess", "checkDevicesInfo"); -// try { -// JSONObject bodyObject = JSON.parseObject(response.body()); -// Integer code = (bodyObject.getInteger("code")); -// String msg = bodyObject.getString("msg"); -// String data = bodyObject.getString("data"); -// UserInfo userInfo = JSON.parseObject(data, UserInfo.class); -// Message message = new Message(); -// message.obj = userInfo; -// if (code == 200) { -// message.what = 1; -// handler.sendMessage(message); -// } else if (code == -200) { -// message.what = 0; -// handler.sendMessage(message); -// } else if (code == -250) { -// ToastUtil.show(msg); -// handler.sendEmptyMessage(2); -// //设备验证 -// } -// } catch (Exception ex) { -// Log.e("checkDevicesInfo", ex.getMessage()); -// } -// } -// -// @Override -// public void onError(Response response) { -// super.onError(response); -// Log.e("onError", response.getException().toString()); -// -// } -// }); -// } -// -// public static synchronized void checkDevicesInfo(final Context context) { -// OkGo.get(UrlAddress.SNINFO) -// .params("sn", Utils.getSerial()) -// .execute(new StringCallback() { -// @Override -// public void onSuccess(Response response) { -// Log.e("onSuccess", "checkDevicesInfo"); -// try { -// JSONObject bodyObject = JSON.parseObject(response.body()); -// Integer code = (bodyObject.getInteger("code")); -// String msg = bodyObject.getString("msg"); -// String data = bodyObject.getString("data"); -// UserInfo userInfo = JSON.parseObject(data, UserInfo.class); -// if (code == 200) { -// SPUtils.put(context, "isLogined", 1); -// SPUtils.put(context, "member_id", userInfo.getMember_id()); -// SPUtils.put(context, "sn_id", userInfo.getId()); -// } else if (code == -200) { -// SPUtils.put(context, "isLogined", 0); -// -// } else if (code == -250) { -// SPUtils.put(context, "isLogined", 2); -// //设备验证 -// } -// } catch (Exception ex) { -// Log.e("checkDevicesInfo", ex.getMessage()); -// } -// } -// -// @Override -// public void onError(Response response) { -// super.onError(response); -// Log.e("onError", response.getException().toString()); -// -// } -// }); -// } -// -// @RequiresApi(api = Build.VERSION_CODES.N) -// public static void sendTimeLog(final Handler handler, UserInfo userInfo, String appname, int status, long time) { -// SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); -// Date date = new Date(System.currentTimeMillis()); -// String times = simpleDateFormat.format(date); -// OkGo.post(UrlAddress.APPLOG) -// .params("sn", Utils.getSerial()) -// .params("app_name", appname) -// .params("use_time", time) -// .params("status", status) -// .params("createtime", times) -// .execute(new StringCallback() { -// @Override -// public void onSuccess(Response response) { -// Log.e("onSuccess", "sendTimeLog"); -// try { -// JSONObject bodyObject = JSON.parseObject(response.body()); -// Log.e("onSuccess", bodyObject.toString()); -// -// Integer code = (bodyObject.getInteger("code")); -// String msg = bodyObject.getString("msg"); -// String data = bodyObject.getString("data"); -// UserInfo userInfo = JSON.parseObject(data, UserInfo.class); -// Message message = new Message(); -// message.obj = userInfo; -// if (code == 200) { -// -// } else if (code == -200) { -// -// } else if (code == -250) { -// -// } -// } catch (Exception ex) { -// Log.e("checkDevicesInfo", ex.getMessage()); -// } -// } -// -// @Override -// public void onError(Response response) { -// super.onError(response); -// Log.e("onError", response.getException().toString()); -// -// } -// }); -// } -// -// synchronized public static void checkUpdateByPackage(final Handler handler, String packageName, String versionCode) { -// OkGo.post(UrlAddress.GET_APP_UPDATE) -// .params("code", versionCode) -// .params("package", packageName) -// .execute(new StringCallback() { -// @Override -// public void onSuccess(Response response) { -// try { -// JSONObject body = JSON.parseObject(response.body()); -// int code = body.getInteger("code"); -// String msg = body.getString("msg"); -// if (code == 200) { -// Message message = new Message(); -// JSONObject data = JSON.parseObject(body.getString("data")); -// if (data != null) { -// String url = data.getString("downloadurl"); -// String newversion = data.getString("newversion"); -// String content = data.getString("content"); -// -// message.what = 200; -// Bundle bundle = new Bundle(); -// bundle.putString("url", url); -// bundle.putString("versionCode", newversion); -// bundle.putString("content", content); -// message.obj = bundle; -// } -// handler.sendMessage(message); -//// Log.e("checkUpdateSN", msg); -// } else { -// handler.sendEmptyMessage(-200); -//// Log.e("checkUpdateSN", msg); -// } -// } catch (Exception e) { -//// Log.e("checkUpdateSN", e.getMessage()); -// } -// } -// -// @Override -// public void onError(Response response) { -// super.onError(response); -// handler.sendEmptyMessage(-300); -//// Log.e("checkUpdateSN", response.getException().toString()); -// } -// }); -// } -// -// synchronized public static void checkUpdateByself(final Handler handler, String packageName, String versionCode) { -// OkGo.post(UrlAddress.GET_APP_UPDATE) -// .params("code", versionCode) -// .params("package", packageName) -// .execute(new StringCallback() { -// @Override -// public void onSuccess(Response response) { -// try { -// JSONObject body = JSON.parseObject(response.body()); -// int code = body.getInteger("code"); -// String msg = body.getString("msg"); -// if (code == 200) { -// Message message = new Message(); -// JSONObject data = JSON.parseObject(body.getString("data")); -// if (data != null) { -// String url = data.getString("downloadurl"); -// String newversion = data.getString("newversion"); -// String content = data.getString("content"); -// message.what = 300; -// Bundle bundle = new Bundle(); -// bundle.putString("url", url); -// bundle.putString("versionCode", newversion); -// bundle.putString("content", content); -// message.obj = bundle; -// } -// handler.sendMessage(message); -//// Log.e("checkUpdateSN", msg); -// } else { -// handler.sendEmptyMessage(-200); -//// Log.e("checkUpdateSN", msg); -// } -// } catch (Exception e) { -//// Log.e("checkUpdateSN", e.getMessage()); -// } -// } -// -// @Override -// public void onError(Response response) { -// super.onError(response); -// handler.sendEmptyMessage(-300); -//// Log.e("checkUpdateSN", response.getException().toString()); -// } -// }); -// } -// -// synchronized public static void setAppuninstallInfo(String sn_id, String packageName) { -// OkGo.post(UrlAddress.SET_APP_UNINSTALL_INFO) -// .params("sn_id", sn_id) -// .params("package", packageName) -// .execute(new StringCallback() { -// @Override -// public void onSuccess(Response response) { -// JSONObject object = JSON.parseObject(response.body()); -// int code = object.getInteger("code"); -// String msg = object.getString("msg"); -// LogUtils.e("setAppinstallInfo", msg); -// if (code == 200) { -// -// } else { -// -// } -// } -// -// @Override -// public void onError(Response response) { -// super.onError(response); -// LogUtils.e("setAppinstallInfo", "onError:" + response.getException()); -// -// } -// }); -// -// } -// -// synchronized public static void sendStartTime(Context context, long startTime, String packageName, int battery, String random) { -// String sn_id = (String) SPUtils.get(context, "sn_id", "-1"); -// String member_id = (String) SPUtils.get(context, "member_id", "-1"); -// OkGo.post(UrlAddress.SEND_RUNINGAPPINFO) -// .params("start_time", startTime) -// .params("package", packageName) -// .params("battery", battery) -// .params("member_id", member_id) -// .params("sn_id", sn_id) -// .params("random", random) -// .execute(new StringCallback() { -// @Override -// public void onSuccess(Response response) { -// String body = response.body(); -// LogUtils.e("sendStartTime", body); -// } -// -// @Override -// public void onError(Response response) { -// super.onError(response); -// LogUtils.e("sendStartTime", response.getException().toString()); -// -// } -// }); -// } -// -// synchronized public static void getDriveState(int member_id, int sn_id) { -// -// OkGo.post(UrlAddress.SEND_DRIVE_STATE) -// .params("member_id", member_id) -// .params("sn_id", sn_id) -// .params("status", 1) -// .execute(new StringCallback() { -// @Override -// public void onSuccess(Response response) { -// -// } -// -// @Override -// public void onError(Response response) { -// super.onError(response); -// -// } -// }); -// } -// -// synchronized public static void getAllAppPackageName(final Handler handler) { -// OkGo.post(UrlAddress.GET_ALL_PACKAGENAME) -// .params("sn", Utils.getSerial()) -// .execute(new StringCallback() { -// @Override -// public void onSuccess(Response response) { -// String s = response.body(); -// try { -// JSONObject body = JSON.parseObject(s); -// int code = body.getInteger("code"); -// String msg = body.getString("msg"); -// String data = body.getString("data"); -// if (code == 200) { -// List jsonArray = JSON.parseArray(data, JSONObject.class); -// String packageList = ""; -// for (JSONObject jsonObject : jsonArray) { -// packageList += jsonObject.getString("app_package") + ","; -// } -// if (!packageList.isEmpty()) { -// Log.e("getAllAppPackageName", packageList); -// Message message = new Message(); -// message.what = 201; -// message.obj = packageList; -// handler.sendMessage(message); -// } else { -// handler.sendEmptyMessage(202); -// } -// } -// } catch (Exception e) { -// -// } -// } -// -// @Override -// public void onError(Response response) { -// super.onError(response); -// Log.e("getAllAppPackageName", response.getException().getMessage()); -// } -// }); -// } -// -// -// synchronized public static void getAllAppPackageName(final Context context) { -// OkGo.post(UrlAddress.GET_ALL_PACKAGENAME) -// .params("sn", Utils.getSerial()) -// .execute(new StringCallback() { -// @Override -// public void onSuccess(Response response) { -// String s = response.body(); -// try { -// com.alibaba.fastjson.JSONObject body = JSON.parseObject(s); -// int code = body.getInteger("code"); -// String msg = body.getString("msg"); -// Log.e("msg", "getAllAppPackageName" + msg); -// String data = body.getString("data"); -// if (code == 200) { -// List jsonArray = JSON.parseArray(data, com.alibaba.fastjson.JSONObject.class); -// String packageList = ""; -// for (com.alibaba.fastjson.JSONObject jsonObject : jsonArray) { -// packageList += jsonObject.getString("app_package") + ","; -// } -// packageList = packageList + "com.info.sn,com.android.uiuios,com.appstore.uiui,com.uiuios.updatetools,com.jiaoguanyi.pager2,com.android.uiuios"; -// Log.e("packageList now", packageList); -// Log.e("packageList", Settings.System.getString(context.getContentResolver(), "qch_app_forbid")); -// Settings.System.putString(context.getContentResolver(), "qch_app_forbid", packageList); -// } else { -// Settings.System.putString(context.getContentResolver(), "qch_app_forbid", "com.info.sn,com.android.uiuios,com.appstore.uiui,com.uiuios.updatetools,com.jiaoguanyi.pager2,com.android.uiuios"); -// -// } -// } catch (Exception e) { -// Log.e("getAllAppPackageName", e.getMessage()); -// } -// } -// -// @Override -// public void onError(Response response) { -// super.onError(response); -// Log.e("getAllAppPackageName", response.getException().getMessage()); -// } -// }); -// } -// -// -// public static void setBrowser(final Context context) { -// OkGo.post(UrlAddress.SET_BROWSER_URL) -// .params("sn", Utils.getSerial()) -// .execute(new StringCallback() { -// @Override -// public void onSuccess(Response response) { -// try { -// JSONObject jsonObject = JSON.parseObject(response.body()); -// int code = jsonObject.getInteger("code"); -// String msg = jsonObject.getString("msg"); -// if (code == 200) { -// JSONObject data = JSON.parseObject(jsonObject.getString("data")); -// String white = data.getString("white"); -// if (white != null && !white.equals("")) { -// boolean whiteList = Settings.System.putString(context.getContentResolver(), "DeselectBrowserArray", white); -// Log.e("SystemSetting", "setBrowserList---------" + whiteList + ":" + white); -// } else { -// Settings.System.putString(context.getContentResolver(), "DeselectBrowserArray", " "); -// } -// String black = data.getString("black"); -// if (black != null && !black.equals("")) { -// boolean blackList = Settings.System.putString(context.getContentResolver(), "qch_webblack_url", black); -// Log.e("SystemSetting", "setBrowserList---------" + blackList + ":" + black); -// } else { -// Settings.System.putString(context.getContentResolver(), "qch_webblack_url", " "); -// } -// } else { -// Log.e("fht", "setBrowserList" + msg); -// } -// } catch (JSONException e) { -// Log.e("fht", "setBrowserList" + e.getMessage()); -// -// } -// } -// }); -// } -// -// public static void get_settings(final Context context) { -// OkGo.get(UrlAddress.GET_SETTINGS) -// .params("sn", Utils.getSerial()) -// .execute(new StringCallback() { -// @Override -// public void onSuccess(Response response) { -// JSONObject jsonObject = JSON.parseObject(response.body()); -// int code = jsonObject.getInteger("code"); -// if (code == 200) { -// String data = jsonObject.getString("data"); -// Utils.setSystemSetting(context, data); -// } -// } -// -// @Override -// public void onError(Response response) { -// super.onError(response); -// } -// }); -// } -// -// -// -// public static void get_forceinstall(Context context) { -// OkGo.get(UrlAddress.GET_FORCE_INSTALL) -// .params("sn", Utils.getSerial()) -// .execute(new StringCallback() { -// @Override -// public void onSuccess(Response response) { -// -// } -// -// @Override -// public void onError(Response response) { -// super.onError(response); -// } -// }); -// } + @Override + public void onNext(BaseResponse response) { + Log.e("sendAppUsed", "onNext: "); + Log.e("sendAppUsed", "onNext: " + JSONObject.toJSONString(response)); + } + @Override + public void onError(Throwable e) { + Log.e("sendAppUsed", "onError: " + e.getMessage()); + } + + @Override + public void onComplete() { + Log.e("sendAppUsed", "onComplete: "); + } + }); + } + + public static void sendRunningApp(Context context) { + String packageName = ApkUtils.getTaskPackname(context); + long time = 0; + StatisticsInfo statisticsInfo = new StatisticsInfo(context, 1); + List datalist = statisticsInfo.getShowList(); + for (AppInformation information : datalist) { + if (packageName.equals(information.getPackageName())) { + time = information.getUsedTimebyDay(); + } + } + JsonObject jsonObject = new JsonObject(); + jsonObject.addProperty("app_package", packageName); + jsonObject.addProperty("version_name", ApkUtils.getAPPVersionName(context, packageName)); + jsonObject.addProperty("start_time", time / 1000); + String jsonString = jsonObject.toString(); + Log.e(TAG, "sendRunningApp: " + jsonString); + NetInterfaceManager.getInstance().getRunningAppObservable(jsonString) + .subscribe(new Observer() { + @Override + public void onSubscribe(Disposable d) { + Log.e("sendRunningApp", "onSubscribe: "); + } + + @Override + public void onNext(BaseResponse baseResponse) { + Log.e("sendRunningApp", "onNext: " + baseResponse.msg); + } + + @Override + public void onError(Throwable e) { + Log.e("sendRunningApp", "onError: " + e.getMessage()); + } + + @Override + public void onComplete() { + Log.e("sendRunningApp", "onComplete: "); + } + }); + } + + public static void getAppInside() { + NetInterfaceManager.getInstance().getAppInsideControl() + .subscribe(new Observer() { + @Override + public void onSubscribe(Disposable d) { + Log.e("getAppInside", "onSubscribe: "); + } + + @Override + public void onNext(BaseResponse baseResponse) { + String jsonString = JSON.toJSONString(baseResponse.data); + Log.e("getAppInside", "onNext: " + jsonString); + if (baseResponse.code == 200) { + JSONObject jsonObject = JSON.parseObject(jsonString); + String ids = jsonObject.getString("ids"); + String packages = jsonObject.getString("package"); + JGYUtils.getInstance().writeDeselectIDtoSystem(ids, packages); + } else { + Log.e("getAppInside", "onNext: " + baseResponse.msg); + } + } + + @Override + public void onError(Throwable e) { + Log.e("getAppInside", "onError: " + e.getMessage()); + } + + @Override + public void onComplete() { + Log.e("getAppInside", "onComplete: "); + } + }); + } + + private static List factoryApp = new ArrayList() {{ + this.add("com.gankao.gkwxhd"); + this.add("com.jiaoguanyi.os"); + }}; + + public static void getAPPinfo(Context context) { + Observable.create((ObservableOnSubscribe>) emitter -> { + PackageManager pm = context.getPackageManager(); + List list = pm.getInstalledPackages(0); + List uploadInfos = new ArrayList<>(); + Intent intent = new Intent(Intent.ACTION_MAIN); + intent.addCategory(Intent.CATEGORY_LAUNCHER); + List appsWithLauncher = pm.queryIntentActivities(intent, 0); + HashSet pkgs = new HashSet<>(); + for (ResolveInfo info : appsWithLauncher) { + pkgs.add(info.activityInfo.packageName); + } + Log.e(TAG, "getAPPinfo: " + pkgs); + for (PackageInfo info : list) { + if (!pkgs.contains(info.packageName)) { + continue; + } +// if (((info.applicationInfo.flags & ApplicationInfo.FLAG_SYSTEM) == 1) && !factoryApp.contains(info.packageName)) { +// continue; +// } + AppUploadInfo uploadInfo = new AppUploadInfo(); + uploadInfo.setApp_package(info.packageName); + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) { + uploadInfo.setApp_version_code(info.getLongVersionCode()); + } else { + uploadInfo.setApp_version_code(info.versionCode); + } + uploadInfos.add(uploadInfo); + } + emitter.onNext(uploadInfos); + }) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new Observer>() { + @Override + public void onSubscribe(Disposable d) { + Log.e("getAPPinfo", "onSubscribe: "); + } + + @Override + public void onNext(List appUploadInfos) { + String json = JSONArray.toJSONString(appUploadInfos); + Log.e("getAPPinfo", "onNext: " + json); + HTTPInterface.SendAppInstall(json); + } + + @Override + public void onError(Throwable e) { + Log.e("getAPPinfo", "onError: " + e.getMessage()); + } + + @Override + public void onComplete() { + Log.e("getAPPinfo", "onComplete: "); + } + }); + } } diff --git a/app/src/main/java/com/info/sn/network/NetWorkManager.java b/app/src/main/java/com/info/sn/network/NetWorkManager.java deleted file mode 100644 index ea7ad6a..0000000 --- a/app/src/main/java/com/info/sn/network/NetWorkManager.java +++ /dev/null @@ -1,268 +0,0 @@ -package com.info.sn.network; - -import android.os.Environment; - -import com.info.sn.network.api.APPJump; -import com.info.sn.network.api.AddAppInstall; -import com.info.sn.network.api.Applog; -import com.info.sn.network.api.BindDevices; -import com.info.sn.network.api.Browser; -import com.info.sn.network.api.ForceInstall; -import com.info.sn.network.api.Label; -import com.info.sn.network.api.NewestAppUpdate; -import com.info.sn.network.api.QueryAllApp; -import com.info.sn.network.api.QuerySnAppStart; -import com.info.sn.network.api.SNInfo; -import com.info.sn.network.api.ScreenLock; -import com.info.sn.network.api.Setting; -import com.info.sn.network.api.TimeControl; -import com.info.sn.network.api.UpdateAdminSn; -import com.info.sn.network.api.UploadScreenshot; - -import java.io.File; -import java.util.concurrent.TimeUnit; - -import okhttp3.Cache; -import okhttp3.OkHttpClient; -import retrofit2.CallAdapter; -import retrofit2.Converter; -import retrofit2.Retrofit; -import retrofit2.adapter.rxjava2.RxJava2CallAdapterFactory; -import retrofit2.converter.gson.GsonConverterFactory; - -public class NetWorkManager { - - private static final String ROOT_URL = UrlAddress.ROOT_URL; - - private static final long cacheSize = 1024 * 1024 * 20;// 缓存文件最大限制大小20M - private static String cacheDirectory = Environment.getExternalStorageDirectory() + "/okttpcaches"; // 设置缓存文件路径 - private static Cache cache = new Cache(new File(cacheDirectory), cacheSize); // - private static final OkHttpClient client; - - static { - //如果无法生存缓存文件目录,检测权限使用已经加上,检测手机是否把文件读写权限禁止了 - OkHttpClient.Builder builder = new OkHttpClient.Builder(); - builder.connectTimeout(8, TimeUnit.SECONDS); // 设置连接超时时间 - builder.writeTimeout(8, TimeUnit.SECONDS);// 设置写入超时时间 - builder.readTimeout(8, TimeUnit.SECONDS);// 设置读取数据超时时间 - builder.retryOnConnectionFailure(true);// 设置进行连接失败重试 - builder.cache(cache);// 设置缓存 - client = builder.build(); - } - - private static CallAdapter.Factory rxJavaCallAdapterFactory = RxJava2CallAdapterFactory.create(); - private static Converter.Factory gsonConverterFactory = GsonConverterFactory.create(); - - private static SNInfo snInfoControl; - private static Applog applogControl; - private static Setting settingControl; - private static ForceInstall forceInstallControl; - private static BindDevices bindDevicesControl; - private static AddAppInstall addAppInstallControl; - private static Browser browserControl; - private static Label labelControl; - private static QuerySnAppStart appStartControl; - private static APPJump appJumpControl; - private static UpdateAdminSn updateAdminSnControl; - private static QueryAllApp queryAllAppControl; - private static NewestAppUpdate newestAppUpdateControl; - private static UploadScreenshot uploadScreenshotControl; - private static ScreenLock getScreenLockControl; - private static TimeControl getTimeControl; - - - public static SNInfo getsnInfoControl() { - if (null == snInfoControl) { - Retrofit retrofit = new Retrofit.Builder() - .client(client) - .baseUrl(ROOT_URL) - .addConverterFactory(gsonConverterFactory) - .addCallAdapterFactory(rxJavaCallAdapterFactory) - .build(); - snInfoControl = retrofit.create(SNInfo.class); - } - return snInfoControl; - } - - public static Setting getsettingControl() { - if (null == settingControl) { - Retrofit retrofit = new Retrofit.Builder() - .client(client) - .baseUrl(ROOT_URL) - .addConverterFactory(gsonConverterFactory) - .addCallAdapterFactory(rxJavaCallAdapterFactory) - .build(); - settingControl = retrofit.create(Setting.class); - } - return settingControl; - } - - public static ForceInstall getForceInstallControl() { - if (null == forceInstallControl) { - Retrofit retrofit = new Retrofit.Builder() - .client(client) - .baseUrl(ROOT_URL) - .addConverterFactory(gsonConverterFactory) - .addCallAdapterFactory(rxJavaCallAdapterFactory) - .build(); - forceInstallControl = retrofit.create(ForceInstall.class); - } - return forceInstallControl; - } - - - public static BindDevices getbindDevicesControl() { - if (null == bindDevicesControl) { - Retrofit retrofit = new Retrofit.Builder() - .client(client) - .baseUrl(ROOT_URL) - .addConverterFactory(gsonConverterFactory) - .addCallAdapterFactory(rxJavaCallAdapterFactory) - .build(); - bindDevicesControl = retrofit.create(BindDevices.class); - } - return bindDevicesControl; - } - - public static AddAppInstall getAddAppInstallControl() { - if (null == addAppInstallControl) { - Retrofit retrofit = new Retrofit.Builder() - .client(client) - .baseUrl(ROOT_URL) - .addConverterFactory(gsonConverterFactory) - .addCallAdapterFactory(rxJavaCallAdapterFactory) - .build(); - addAppInstallControl = retrofit.create(AddAppInstall.class); - } - return addAppInstallControl; - } - - public static Browser getBrowserControl() { - if (null == browserControl) { - Retrofit retrofit = new Retrofit.Builder() - .client(client) - .baseUrl(ROOT_URL) - .addConverterFactory(gsonConverterFactory) - .addCallAdapterFactory(rxJavaCallAdapterFactory) - .build(); - browserControl = retrofit.create(Browser.class); - } - return browserControl; - } - - public static Label getLabelControl() { - if (null == labelControl) { - Retrofit retrofit = new Retrofit.Builder() - .client(client) - .baseUrl(ROOT_URL) - .addConverterFactory(gsonConverterFactory) - .addCallAdapterFactory(rxJavaCallAdapterFactory) - .build(); - labelControl = retrofit.create(Label.class); - } - return labelControl; - } - - public static QuerySnAppStart getAppStartControl() { - if (null == appStartControl) { - Retrofit retrofit = new Retrofit.Builder() - .client(client) - .baseUrl(ROOT_URL) - .addConverterFactory(gsonConverterFactory) - .addCallAdapterFactory(rxJavaCallAdapterFactory) - .build(); - appStartControl = retrofit.create(QuerySnAppStart.class); - } - return appStartControl; - } - - public static APPJump getAppJumpControl() { - if (null == appJumpControl) { - Retrofit retrofit = new Retrofit.Builder() - .client(client) - .baseUrl(ROOT_URL) - .addConverterFactory(gsonConverterFactory) - .addCallAdapterFactory(rxJavaCallAdapterFactory) - .build(); - appJumpControl = retrofit.create(APPJump.class); - } - return appJumpControl; - } - - public static UpdateAdminSn getUpdateAdminSnControl() { - if (null == updateAdminSnControl) { - Retrofit retrofit = new Retrofit.Builder() - .client(client) - .baseUrl(ROOT_URL) - .addConverterFactory(gsonConverterFactory) - .addCallAdapterFactory(rxJavaCallAdapterFactory) - .build(); - updateAdminSnControl = retrofit.create(UpdateAdminSn.class); - } - return updateAdminSnControl; - } - public static QueryAllApp getQueryAllAppControl() { - if (null == queryAllAppControl) { - Retrofit retrofit = new Retrofit.Builder() - .client(client) - .baseUrl(ROOT_URL) - .addConverterFactory(gsonConverterFactory) - .addCallAdapterFactory(rxJavaCallAdapterFactory) - .build(); - queryAllAppControl = retrofit.create(QueryAllApp.class); - } - return queryAllAppControl; - } - - public static NewestAppUpdate getNewestAppUpdateControl() { - if (null == newestAppUpdateControl) { - Retrofit retrofit = new Retrofit.Builder() - .client(client) - .baseUrl(ROOT_URL) - .addConverterFactory(gsonConverterFactory) - .addCallAdapterFactory(rxJavaCallAdapterFactory) - .build(); - newestAppUpdateControl = retrofit.create(NewestAppUpdate.class); - } - return newestAppUpdateControl; - } - - public static UploadScreenshot getUploadScreenshotControl() { - if (null == uploadScreenshotControl) { - Retrofit retrofit = new Retrofit.Builder() - .client(client) - .baseUrl(ROOT_URL) - .addConverterFactory(gsonConverterFactory) - .addCallAdapterFactory(rxJavaCallAdapterFactory) - .build(); - uploadScreenshotControl = retrofit.create(UploadScreenshot.class); - } - return uploadScreenshotControl; - } - - public static ScreenLock getScreenLockControl() { - if (null == getScreenLockControl) { - Retrofit retrofit = new Retrofit.Builder() - .client(client) - .baseUrl(ROOT_URL) - .addConverterFactory(gsonConverterFactory) - .addCallAdapterFactory(rxJavaCallAdapterFactory) - .build(); - getScreenLockControl = retrofit.create(ScreenLock.class); - } - return getScreenLockControl; - } - public static TimeControl getTimeControl() { - if (null == getTimeControl) { - Retrofit retrofit = new Retrofit.Builder() - .client(client) - .baseUrl(ROOT_URL) - .addConverterFactory(gsonConverterFactory) - .addCallAdapterFactory(rxJavaCallAdapterFactory) - .build(); - getTimeControl = retrofit.create(TimeControl.class); - } - return getTimeControl; - } - -} diff --git a/app/src/main/java/com/info/sn/network/UrlAddress.java b/app/src/main/java/com/info/sn/network/UrlAddress.java index f1a2f8f..7e7c0db 100644 --- a/app/src/main/java/com/info/sn/network/UrlAddress.java +++ b/app/src/main/java/com/info/sn/network/UrlAddress.java @@ -1,44 +1,69 @@ package com.info.sn.network; public class UrlAddress { - public static final String ROOT_URL = "http://homework.uiuios.com/android/"; //主页接口 - public static final String SNINFO = ROOT_URL + "sn/getSnInfo"; + public static final String ROOT_URL = "http://homework.uiuios.com/android/"; //设备信息接口 + public static final String SNINFO = ROOT_URL + "sn/getSnInfo"; + //发送app信息 public static final String APPLOG = ROOT_URL + "App/getApplog"; - - public final static String GET_APP_UPDATE = ROOT_URL + "Update/update"; + //获取正在运行的app + public static final String RUN_NEW_APP = "app/runNewApp"; //根据包名获取更新 - public final static String SEND_RUNINGAPPINFO = ROOT_URL + "Monitoring/getAppNow"; + public final static String GET_APP_UPDATE = ROOT_URL + "Update/update"; //获取当前最顶层应用和电量 + public final static String SEND_RUNINGAPPINFO = ROOT_URL + "Monitoring/getAppNow"; + //在线状态 public final static String SEND_DRIVE_STATE = ROOT_URL + "Online/online"; - - public final static String GET_ALL_PACKAGE = ROOT_URL + "app/queryAllApp"; //获取所有应用 - public final static String BIND_DEVICES = ROOT_URL + "sn/bindSn"; + public final static String GET_ALL_PACKAGE = ROOT_URL + "app/queryAllApp"; //绑定设备消息 - public final static String GET_SETTINGS = ROOT_URL + "control/getSetting"; + public final static String BIND_DEVICES = ROOT_URL + "sn/bindSn"; //获取系统设置 - public final static String SET_BROWSER_URL = ROOT_URL + "control/getBrowser"; + public final static String GET_SETTINGS = ROOT_URL + "control/getSetting"; //浏览器网址管控 - public final static String SET_BROWSER_Label = ROOT_URL + "control/getLabel"; + public final static String SET_BROWSER_URL = ROOT_URL + "control/getBrowser"; //浏览器书签管控 - public final static String GET_FORCE_INSTALL = ROOT_URL + "app/getForceDownload"; + public final static String SET_BROWSER_Label = ROOT_URL + "control/getLabel"; //获取强制下载 - public final static String GET_APP_START = ROOT_URL + "sn/querySnAppStart"; + public final static String GET_FORCE_INSTALL = ROOT_URL + "app/getForceDownload"; //获取app管控 + public final static String GET_APP_START = ROOT_URL + "sn/querySnAppStart"; + //发app跳转管控 public final static String GET_APP_JUMP = ROOT_URL + "sn/querySnJump"; //发app跳转管控 + public final static String QUERY_APP_INSIDE = ROOT_URL + "control/queryAppInside"; + //发送卸载或者安装信息 public final static String SEND_INSTALLEDORREMOVED = ROOT_URL + "app/addAppInstall"; //发送卸载或者安装信息 public final static String UPDATE_SNINFO = ROOT_URL + "sn/updateAdminSn"; - //发送卸载或者安装信息 - public final static String GET_NEWESTAPPUPDATE = ROOT_URL + "app/newestAppUpdate"; //根据包名获取更新 - public final static String UPLOAD_SCREEN_SNAPSHOT = ROOT_URL + "sn/uploadScreenshot"; + public final static String GET_NEWESTAPPUPDATE = ROOT_URL + "app/newestAppUpdate"; //上传屏幕截图 - public final static String GET_SCREEN_LOCK = ROOT_URL + "sn/getScreenshot"; + public final static String UPLOAD_SCREEN_SNAPSHOT = ROOT_URL + "sn/uploadScreenshot"; //获取屏幕管控 - public final static String GET_TIME_CONTROL = ROOT_URL + "sn/getTimeControl"; + public final static String GET_SCREEN_LOCK = ROOT_URL + "sn/getScreenshot"; //获取时间管控 + public final static String GET_TIME_CONTROL = ROOT_URL + "sn/getTimeControl"; + //获取用户头像和信息 + public static final String GET_USER_AVATAR_INFO = "sn/getUserAvatarInfo"; + //上传设备赶考的UID + public static final String POST_USER_SAVESNUID = "sn/saveSnUid"; + //获取app使用信息 + public static final String UPLOAD_APP_USE_INFO = "sn/uploadAppUseInfo"; + //获取小程序二维码 + public static final String GET_APPLET_QRCODE = "file/getAppletQrCode"; + + + + + //赶考 + public static final String GANKAN_ROOT_URL = "https://www.gankao.com/api/service/"; + //创建/查询用户 + public static final String CREATE_USER = "createUser"; + //用户授权/激活权限 + public static final String ACTIVE_USER = "activeUser"; + //获得可用的权限产品规格 + public static final String QUERY_AVAILABLE_PRODUCT_SPECIFICATIONS = "queryAvailableProductSpecifications"; + } diff --git a/app/src/main/java/com/info/sn/network/api/APPJump.java b/app/src/main/java/com/info/sn/network/api/APPJump.java index 6692afd..5d81b40 100644 --- a/app/src/main/java/com/info/sn/network/api/APPJump.java +++ b/app/src/main/java/com/info/sn/network/api/APPJump.java @@ -1,7 +1,7 @@ package com.info.sn.network.api; -import com.info.sn.bean.AppJump; -import com.info.sn.bean.BaseResponse; +import com.info.sn.bean.zuoye.AppJump; +import com.info.sn.bean.zuoye.BaseResponse; import com.info.sn.network.UrlAddress; import java.util.List; diff --git a/app/src/main/java/com/info/sn/network/api/ActiveUserApi.java b/app/src/main/java/com/info/sn/network/api/ActiveUserApi.java new file mode 100644 index 0000000..7f957bc --- /dev/null +++ b/app/src/main/java/com/info/sn/network/api/ActiveUserApi.java @@ -0,0 +1,20 @@ +package com.info.sn.network.api; + +import com.info.sn.bean.gankao.GankaoBaseResponse; +import com.info.sn.network.UrlAddress; + +import io.reactivex.Observable; +import retrofit2.http.GET; +import retrofit2.http.Query; + +public interface ActiveUserApi { + @GET(UrlAddress + .ACTIVE_USER) + Observable activeUser( + @Query("app_id") String app_id, + @Query("timestamp") String timestamp, + @Query("token") String token, + @Query("uid") String uid, + @Query("specification_id") int specification_id + ); +} diff --git a/app/src/main/java/com/info/sn/network/api/AddAppInstall.java b/app/src/main/java/com/info/sn/network/api/AddAppInstall.java index 3060ed8..1f94337 100644 --- a/app/src/main/java/com/info/sn/network/api/AddAppInstall.java +++ b/app/src/main/java/com/info/sn/network/api/AddAppInstall.java @@ -1,6 +1,6 @@ package com.info.sn.network.api; -import com.info.sn.bean.BaseResponse; +import com.info.sn.bean.zuoye.BaseResponse; import com.info.sn.network.UrlAddress; import io.reactivex.Observable; @@ -15,5 +15,4 @@ public interface AddAppInstall { @Field("sn") String sn, @Field("app") String jsonString ); - } diff --git a/app/src/main/java/com/info/sn/network/api/AppUsedApi.java b/app/src/main/java/com/info/sn/network/api/AppUsedApi.java new file mode 100644 index 0000000..c2c189a --- /dev/null +++ b/app/src/main/java/com/info/sn/network/api/AppUsedApi.java @@ -0,0 +1,18 @@ +package com.info.sn.network.api; + +import com.info.sn.bean.zuoye.BaseResponse; +import com.info.sn.network.UrlAddress; + +import io.reactivex.Observable; +import retrofit2.http.Field; +import retrofit2.http.FormUrlEncoded; +import retrofit2.http.POST; + +public interface AppUsedApi { + @FormUrlEncoded + @POST(UrlAddress.UPLOAD_APP_USE_INFO) + Observable getAppUsed( + @Field("sn") String sn, + @Field("appInfo") String appinfo + ); +} diff --git a/app/src/main/java/com/info/sn/network/api/Applog.java b/app/src/main/java/com/info/sn/network/api/Applog.java index 25f120c..1e9c5c0 100644 --- a/app/src/main/java/com/info/sn/network/api/Applog.java +++ b/app/src/main/java/com/info/sn/network/api/Applog.java @@ -1,9 +1,8 @@ package com.info.sn.network.api; -import com.info.sn.bean.BaseResponse; +import com.info.sn.bean.zuoye.BaseResponse; import com.info.sn.network.UrlAddress; - import io.reactivex.Observable; import retrofit2.http.GET; import retrofit2.http.Query; diff --git a/app/src/main/java/com/info/sn/network/api/BindDevices.java b/app/src/main/java/com/info/sn/network/api/BindDevices.java index ac7143b..0fc1b41 100644 --- a/app/src/main/java/com/info/sn/network/api/BindDevices.java +++ b/app/src/main/java/com/info/sn/network/api/BindDevices.java @@ -1,6 +1,6 @@ package com.info.sn.network.api; -import com.info.sn.bean.BaseResponse; +import com.info.sn.bean.zuoye.BaseResponse; import com.info.sn.network.UrlAddress; import io.reactivex.Observable; diff --git a/app/src/main/java/com/info/sn/network/api/Browser.java b/app/src/main/java/com/info/sn/network/api/Browser.java index 6559a6a..8d18b89 100644 --- a/app/src/main/java/com/info/sn/network/api/Browser.java +++ b/app/src/main/java/com/info/sn/network/api/Browser.java @@ -1,6 +1,6 @@ package com.info.sn.network.api; -import com.info.sn.bean.BaseResponse; +import com.info.sn.bean.zuoye.BaseResponse; import com.info.sn.network.UrlAddress; import io.reactivex.Observable; diff --git a/app/src/main/java/com/info/sn/network/api/Label.java b/app/src/main/java/com/info/sn/network/api/BrowserLabel.java similarity index 69% rename from app/src/main/java/com/info/sn/network/api/Label.java rename to app/src/main/java/com/info/sn/network/api/BrowserLabel.java index 1b95244..dd4bd04 100644 --- a/app/src/main/java/com/info/sn/network/api/Label.java +++ b/app/src/main/java/com/info/sn/network/api/BrowserLabel.java @@ -1,19 +1,15 @@ package com.info.sn.network.api; -import com.info.sn.bean.BaseResponse; -import com.info.sn.bean.BrowserLabel; +import com.info.sn.bean.zuoye.BaseResponse; import com.info.sn.network.UrlAddress; -import java.util.List; - import io.reactivex.Observable; import retrofit2.http.GET; import retrofit2.http.Query; -public interface Label { +public interface BrowserLabel { @GET(UrlAddress.SET_BROWSER_Label) Observable getLabel( @Query("sn") String sn ); - } diff --git a/app/src/main/java/com/info/sn/network/api/CreateUserApi.java b/app/src/main/java/com/info/sn/network/api/CreateUserApi.java new file mode 100644 index 0000000..b2b2613 --- /dev/null +++ b/app/src/main/java/com/info/sn/network/api/CreateUserApi.java @@ -0,0 +1,18 @@ +package com.info.sn.network.api; + +import com.info.sn.bean.gankao.GankaoBaseResponse; +import com.info.sn.network.UrlAddress; + +import io.reactivex.Observable; +import retrofit2.http.GET; +import retrofit2.http.Query; + +public interface CreateUserApi { + @GET(UrlAddress.CREATE_USER) + Observable createUser( + @Query("app_id") String app_id, + @Query("timestamp") String timestamp, + @Query("uid") String uid, + @Query("token") String token + ); +} diff --git a/app/src/main/java/com/info/sn/network/api/ForceInstall.java b/app/src/main/java/com/info/sn/network/api/ForceInstall.java index 4cded8a..781a037 100644 --- a/app/src/main/java/com/info/sn/network/api/ForceInstall.java +++ b/app/src/main/java/com/info/sn/network/api/ForceInstall.java @@ -1,7 +1,7 @@ package com.info.sn.network.api; -import com.info.sn.bean.AppInfo; -import com.info.sn.bean.BaseResponse; +import com.info.sn.bean.zuoye.AppInfo; +import com.info.sn.bean.zuoye.BaseResponse; import com.info.sn.network.UrlAddress; import java.util.List; @@ -13,7 +13,6 @@ import retrofit2.http.Query; public interface ForceInstall { @GET(UrlAddress.GET_FORCE_INSTALL) Observable>> getForceInstall( - @Query("sn") String sn + @Query("sn")String sn ); - } diff --git a/app/src/main/java/com/info/sn/network/api/NewestAppUpdate.java b/app/src/main/java/com/info/sn/network/api/NewestAppUpdate.java deleted file mode 100644 index f770c32..0000000 --- a/app/src/main/java/com/info/sn/network/api/NewestAppUpdate.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.info.sn.network.api; - - -import com.info.sn.bean.AppInfo; -import com.info.sn.bean.BaseResponse; -import com.info.sn.network.UrlAddress; - -import io.reactivex.Observable; -import retrofit2.Response; -import retrofit2.http.GET; -import retrofit2.http.Query; - -public interface NewestAppUpdate { - @GET(UrlAddress.GET_NEWESTAPPUPDATE) - Observable> getAppUpdate( - @Query("packageName") String packageName, - @Query("versionCode") String versionCode, - @Query("type") int type - ); -} diff --git a/app/src/main/java/com/info/sn/network/api/NewestAppUpdate.kt b/app/src/main/java/com/info/sn/network/api/NewestAppUpdate.kt new file mode 100644 index 0000000..adb555a --- /dev/null +++ b/app/src/main/java/com/info/sn/network/api/NewestAppUpdate.kt @@ -0,0 +1,17 @@ +package com.info.sn.network.api + +import com.info.sn.bean.zuoye.AppInfo +import com.info.sn.bean.zuoye.BaseResponse +import com.info.sn.network.UrlAddress +import io.reactivex.Observable +import retrofit2.http.GET +import retrofit2.http.Query + +interface NewestAppUpdate { + @GET(UrlAddress.GET_NEWESTAPPUPDATE) + fun getAppUpdate( + @Query("packageName") packageName: String?, + @Query("versionCode") versionCode: String?, + @Query("type") type: Int + ): Observable?>? +} \ No newline at end of file diff --git a/app/src/main/java/com/info/sn/network/api/QRCodeApi.java b/app/src/main/java/com/info/sn/network/api/QRCodeApi.java new file mode 100644 index 0000000..ccf2e9c --- /dev/null +++ b/app/src/main/java/com/info/sn/network/api/QRCodeApi.java @@ -0,0 +1,12 @@ +package com.info.sn.network.api; + +import com.info.sn.bean.zuoye.BaseResponse; +import com.info.sn.network.UrlAddress; + +import io.reactivex.Observable; +import retrofit2.http.GET; + +public interface QRCodeApi { + @GET(UrlAddress.GET_APPLET_QRCODE) + Observable getQRCodeApi(); +} diff --git a/app/src/main/java/com/info/sn/network/api/QueryAllApp.java b/app/src/main/java/com/info/sn/network/api/QueryAllApp.java deleted file mode 100644 index 07a4ec6..0000000 --- a/app/src/main/java/com/info/sn/network/api/QueryAllApp.java +++ /dev/null @@ -1,18 +0,0 @@ -package com.info.sn.network.api; - -import com.info.sn.bean.AppInfo; -import com.info.sn.bean.BaseResponse; -import com.info.sn.network.UrlAddress; - -import java.util.List; - -import io.reactivex.Observable; -import retrofit2.http.GET; -import retrofit2.http.Query; - -public interface QueryAllApp { - @GET(UrlAddress.GET_ALL_PACKAGE) - Observable>> getAllApp( - @Query("sn") String sn - ); -} diff --git a/app/src/main/java/com/info/sn/network/api/QueryAllApp.kt b/app/src/main/java/com/info/sn/network/api/QueryAllApp.kt new file mode 100644 index 0000000..976bb24 --- /dev/null +++ b/app/src/main/java/com/info/sn/network/api/QueryAllApp.kt @@ -0,0 +1,15 @@ +package com.info.sn.network.api + +import com.info.sn.bean.zuoye.AppInfo +import com.info.sn.bean.zuoye.BaseResponse +import com.info.sn.network.UrlAddress +import io.reactivex.Observable +import retrofit2.http.GET +import retrofit2.http.Query + +interface QueryAllApp { + @GET(UrlAddress.GET_ALL_PACKAGE) + fun getAllApp( + @Query("sn") sn: String? + ): Observable?>?>? +} \ No newline at end of file diff --git a/app/src/main/java/com/info/sn/network/api/QueryAppInside.java b/app/src/main/java/com/info/sn/network/api/QueryAppInside.java new file mode 100644 index 0000000..056df51 --- /dev/null +++ b/app/src/main/java/com/info/sn/network/api/QueryAppInside.java @@ -0,0 +1,15 @@ +package com.info.sn.network.api; + +import com.info.sn.bean.zuoye.BaseResponse; +import com.info.sn.network.UrlAddress; + +import io.reactivex.Observable; +import retrofit2.http.GET; +import retrofit2.http.Query; + +public interface QueryAppInside { + @GET(UrlAddress.QUERY_APP_INSIDE) + Observable getAppInside( + @Query("sn") String sn + ); +} diff --git a/app/src/main/java/com/info/sn/network/api/QueryProductApi.java b/app/src/main/java/com/info/sn/network/api/QueryProductApi.java new file mode 100644 index 0000000..1c7d1ee --- /dev/null +++ b/app/src/main/java/com/info/sn/network/api/QueryProductApi.java @@ -0,0 +1,17 @@ +package com.info.sn.network.api; + +import com.info.sn.bean.gankao.GankaoBaseResponse; +import com.info.sn.network.UrlAddress; + +import io.reactivex.Observable; +import retrofit2.http.GET; +import retrofit2.http.Query; + +public interface QueryProductApi { + @GET(UrlAddress.QUERY_AVAILABLE_PRODUCT_SPECIFICATIONS) + Observable activeUser( + @Query("app_id") String app_id, + @Query("timestamp") String timestamp, + @Query("token") String token + ); +} diff --git a/app/src/main/java/com/info/sn/network/api/QuerySnAppStart.java b/app/src/main/java/com/info/sn/network/api/QuerySnAppStart.java index 5b46c8e..14f3e12 100644 --- a/app/src/main/java/com/info/sn/network/api/QuerySnAppStart.java +++ b/app/src/main/java/com/info/sn/network/api/QuerySnAppStart.java @@ -1,7 +1,7 @@ package com.info.sn.network.api; -import com.info.sn.bean.AppStart; -import com.info.sn.bean.BaseResponse; +import com.info.sn.bean.zuoye.AppStart; +import com.info.sn.bean.zuoye.BaseResponse; import com.info.sn.network.UrlAddress; import java.util.List; @@ -12,7 +12,8 @@ import retrofit2.http.Query; public interface QuerySnAppStart { @GET(UrlAddress.GET_APP_START) - Observable>> getAppStatu( + Observable>> + getAppStatu( @Query("sn") String sn ); } diff --git a/app/src/main/java/com/info/sn/network/api/RunningApp.java b/app/src/main/java/com/info/sn/network/api/RunningApp.java new file mode 100644 index 0000000..f80f62a --- /dev/null +++ b/app/src/main/java/com/info/sn/network/api/RunningApp.java @@ -0,0 +1,19 @@ +package com.info.sn.network.api; + + +import com.info.sn.bean.zuoye.BaseResponse; +import com.info.sn.network.UrlAddress; + +import io.reactivex.Observable; +import retrofit2.http.Field; +import retrofit2.http.FormUrlEncoded; +import retrofit2.http.POST; + +public interface RunningApp { + @FormUrlEncoded + @POST(UrlAddress.RUN_NEW_APP) + Observable sendAppInfo( + @Field("sn") String sn, + @Field("app") String app + ); +} diff --git a/app/src/main/java/com/info/sn/network/api/SNInfo.java b/app/src/main/java/com/info/sn/network/api/SNInfoApi.java similarity index 71% rename from app/src/main/java/com/info/sn/network/api/SNInfo.java rename to app/src/main/java/com/info/sn/network/api/SNInfoApi.java index 5d03f30..bb7f87d 100644 --- a/app/src/main/java/com/info/sn/network/api/SNInfo.java +++ b/app/src/main/java/com/info/sn/network/api/SNInfoApi.java @@ -1,14 +1,14 @@ package com.info.sn.network.api; -import com.info.sn.bean.BaseResponse; -import com.info.sn.bean.UserInfo; +import com.info.sn.bean.zuoye.BaseResponse; +import com.info.sn.bean.zuoye.UserInfo; import com.info.sn.network.UrlAddress; import io.reactivex.Observable; import retrofit2.http.GET; import retrofit2.http.Query; -public interface SNInfo { +public interface SNInfoApi { @GET(UrlAddress.SNINFO) Observable> getsninfo( @Query("sn") String sn diff --git a/app/src/main/java/com/info/sn/network/api/SaveSnUidApi.java b/app/src/main/java/com/info/sn/network/api/SaveSnUidApi.java new file mode 100644 index 0000000..c990880 --- /dev/null +++ b/app/src/main/java/com/info/sn/network/api/SaveSnUidApi.java @@ -0,0 +1,18 @@ +package com.info.sn.network.api; + +import com.info.sn.bean.zuoye.Response; +import com.info.sn.network.UrlAddress; + +import io.reactivex.Observable; +import retrofit2.http.Field; +import retrofit2.http.FormUrlEncoded; +import retrofit2.http.POST; + +public interface SaveSnUidApi { + @FormUrlEncoded + @POST(UrlAddress.POST_USER_SAVESNUID) + Observable saveSnUid( + @Field("sn") String sn, + @Field("uid") String uid + ); +} diff --git a/app/src/main/java/com/info/sn/network/api/ScreenLock.java b/app/src/main/java/com/info/sn/network/api/ScreenLock.java index 7c92b7f..9656520 100644 --- a/app/src/main/java/com/info/sn/network/api/ScreenLock.java +++ b/app/src/main/java/com/info/sn/network/api/ScreenLock.java @@ -1,6 +1,6 @@ package com.info.sn.network.api; -import com.info.sn.bean.BaseResponse; +import com.info.sn.bean.zuoye.BaseResponse; import com.info.sn.network.UrlAddress; import io.reactivex.Observable; @@ -10,6 +10,6 @@ import retrofit2.http.Query; public interface ScreenLock { @GET(UrlAddress.GET_SCREEN_LOCK) Observable getScreenshot( - @Query("sn") String sn + @Query("sn")String sn ); } diff --git a/app/src/main/java/com/info/sn/network/api/ScreenState.java b/app/src/main/java/com/info/sn/network/api/ScreenState.java new file mode 100644 index 0000000..952d22f --- /dev/null +++ b/app/src/main/java/com/info/sn/network/api/ScreenState.java @@ -0,0 +1,18 @@ +package com.info.sn.network.api; + +import com.info.sn.BuildConfig; +import com.info.sn.bean.zuoye.BaseResponse; + +import io.reactivex.Observable; +import retrofit2.http.Field; +import retrofit2.http.FormUrlEncoded; +import retrofit2.http.POST; + +public interface ScreenState { + @FormUrlEncoded + @POST(BuildConfig.SCREEN_URL) + Observable setScreenState( + @Field("sn")String sn , + @Field("online") int stateCode + ); +} diff --git a/app/src/main/java/com/info/sn/network/api/Setting.java b/app/src/main/java/com/info/sn/network/api/Setting.java index a910b33..3aa75a1 100644 --- a/app/src/main/java/com/info/sn/network/api/Setting.java +++ b/app/src/main/java/com/info/sn/network/api/Setting.java @@ -1,7 +1,6 @@ package com.info.sn.network.api; -import com.info.sn.bean.BaseResponse; -import com.info.sn.bean.SystemSettings; +import com.info.sn.bean.zuoye.BaseResponse; import com.info.sn.network.UrlAddress; import io.reactivex.Observable; @@ -10,7 +9,7 @@ import retrofit2.http.Query; public interface Setting { @GET(UrlAddress.GET_SETTINGS) - Observable> getSetting( + Observable getSetting( @Query("sn") String sn ); } diff --git a/app/src/main/java/com/info/sn/network/api/SettingKT.kt b/app/src/main/java/com/info/sn/network/api/SettingKT.kt new file mode 100644 index 0000000..455b4ae --- /dev/null +++ b/app/src/main/java/com/info/sn/network/api/SettingKT.kt @@ -0,0 +1,15 @@ +package com.info.sn.network.api + +import com.info.sn.bean.zuoye.BaseResponse +import com.info.sn.bean.zuoye.SystemSettings +import com.info.sn.network.UrlAddress +import io.reactivex.Observable +import retrofit2.http.GET +import retrofit2.http.Query + +interface SettingKT { + @GET(UrlAddress.GET_SETTINGS) + fun getSetting( + @Query("sn") sn: String + ): Observable> +} \ No newline at end of file diff --git a/app/src/main/java/com/info/sn/network/api/TimeControl.java b/app/src/main/java/com/info/sn/network/api/TimeControl.java index d677c5b..a6e9b35 100644 --- a/app/src/main/java/com/info/sn/network/api/TimeControl.java +++ b/app/src/main/java/com/info/sn/network/api/TimeControl.java @@ -1,6 +1,6 @@ package com.info.sn.network.api; -import com.info.sn.bean.BaseResponse; +import com.info.sn.bean.zuoye.BaseResponse; import com.info.sn.network.UrlAddress; import io.reactivex.Observable; @@ -9,7 +9,8 @@ import retrofit2.http.Query; public interface TimeControl { @GET(UrlAddress.GET_TIME_CONTROL) - Observable getTimeControl( + Observable + getTimeControl( @Query("sn") String sn ); } diff --git a/app/src/main/java/com/info/sn/network/api/UpdateAdminSn.java b/app/src/main/java/com/info/sn/network/api/UpdateAdminSn.java index ec0a1c8..255ca2c 100644 --- a/app/src/main/java/com/info/sn/network/api/UpdateAdminSn.java +++ b/app/src/main/java/com/info/sn/network/api/UpdateAdminSn.java @@ -1,6 +1,6 @@ package com.info.sn.network.api; -import com.info.sn.bean.BaseResponse; +import com.info.sn.bean.zuoye.BaseResponse; import com.info.sn.network.UrlAddress; import io.reactivex.Observable; @@ -12,10 +12,9 @@ public interface UpdateAdminSn { @FormUrlEncoded @POST(UrlAddress.UPDATE_SNINFO) Observable sendAdminSn( - @Field("sn")String sn, - @Field("address")String address, - @Field("machine")String machine, - @Field("hardware")String hardware + @Field("sn") String sn, + @Field("address") String address, + @Field("machine") String machine, + @Field("hardware") String hardware ); - } diff --git a/app/src/main/java/com/info/sn/network/api/UploadScreenshot.java b/app/src/main/java/com/info/sn/network/api/UploadScreenshot.java index 2ceaea8..d372a9e 100644 --- a/app/src/main/java/com/info/sn/network/api/UploadScreenshot.java +++ b/app/src/main/java/com/info/sn/network/api/UploadScreenshot.java @@ -1,12 +1,10 @@ package com.info.sn.network.api; -import com.info.sn.bean.BaseResponse; +import com.info.sn.bean.zuoye.BaseResponse; import com.info.sn.network.UrlAddress; import io.reactivex.Observable; import okhttp3.MultipartBody; -import retrofit2.http.Field; -import retrofit2.http.FormUrlEncoded; import retrofit2.http.Multipart; import retrofit2.http.POST; import retrofit2.http.Part; @@ -18,5 +16,5 @@ public interface UploadScreenshot { Observable uploadScreenshot( @Query("sn") String sn, @Part MultipartBody.Part file - ); + ) ; } diff --git a/app/src/main/java/com/info/sn/network/api/UserInfoApi.java b/app/src/main/java/com/info/sn/network/api/UserInfoApi.java new file mode 100644 index 0000000..9f05cac --- /dev/null +++ b/app/src/main/java/com/info/sn/network/api/UserInfoApi.java @@ -0,0 +1,18 @@ +package com.info.sn.network.api; + +import com.info.sn.bean.zuoye.BaseResponse; +import com.info.sn.bean.zuoye.UserAvatarInfo; +import com.info.sn.network.UrlAddress; + +import io.reactivex.Observable; +import retrofit2.http.Field; +import retrofit2.http.FormUrlEncoded; +import retrofit2.http.POST; + +public interface UserInfoApi { + @FormUrlEncoded + @POST(UrlAddress.GET_USER_AVATAR_INFO) + Observable> getUserAvatarInfo( + @Field("sn") String sn + ); +} diff --git a/app/src/main/java/com/info/sn/network/api/UserInfoControl.java b/app/src/main/java/com/info/sn/network/api/UserInfoControl.java new file mode 100644 index 0000000..59bbcad --- /dev/null +++ b/app/src/main/java/com/info/sn/network/api/UserInfoControl.java @@ -0,0 +1,18 @@ +package com.info.sn.network.api; + +import com.info.sn.bean.zuoye.BaseResponse; +import com.info.sn.bean.zuoye.UserAvatarInfo; +import com.info.sn.network.UrlAddress; + +import io.reactivex.Observable; +import retrofit2.http.Field; +import retrofit2.http.FormUrlEncoded; +import retrofit2.http.POST; + +public interface UserInfoControl { + @FormUrlEncoded + @POST(UrlAddress.GET_USER_AVATAR_INFO) + Observable> getUserAvatarInfo( + @Field("sn") String sn + ); +} diff --git a/app/src/main/java/com/info/sn/receiver/APKinstallReceiver.java b/app/src/main/java/com/info/sn/receiver/APKinstallReceiver.java index 827dabc..b63fdcf 100644 --- a/app/src/main/java/com/info/sn/receiver/APKinstallReceiver.java +++ b/app/src/main/java/com/info/sn/receiver/APKinstallReceiver.java @@ -1,22 +1,27 @@ package com.info.sn.receiver; +import android.annotation.SuppressLint; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.content.pm.ApplicationInfo; import android.content.pm.PackageInfo; import android.content.pm.PackageManager; +import android.content.pm.ResolveInfo; import android.os.Build; +import android.text.TextUtils; import android.util.Log; -import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONArray; -import com.info.sn.bean.AppUploadInfo; +import com.info.sn.bean.zuoye.AppUploadInfo; import com.info.sn.network.HTTPInterface; import com.info.sn.utils.ApkUtils; +import com.info.sn.utils.CacheUtils; +import com.info.sn.utils.JGYUtils; import java.util.ArrayList; import java.util.List; +import java.util.concurrent.TimeUnit; import io.reactivex.Observable; import io.reactivex.ObservableEmitter; @@ -27,65 +32,89 @@ import io.reactivex.disposables.Disposable; import io.reactivex.schedulers.Schedulers; public class APKinstallReceiver extends BroadcastReceiver { + private static String TAG = APKinstallReceiver.class.getSimpleName(); + @SuppressLint("StaticFieldLeak") + private static Context mContext; + private static NewAppListener newAppListener; - private String TAG = APKinstallReceiver.class.getSimpleName(); + static { + sendAppInfo(); + } @Override public void onReceive(final Context context, Intent intent) { + mContext = context; // TODO: This method is called when the BroadcastReceiver is receiving // an Intent broadcast. String action = intent.getAction(); - if (action.equals(Intent.ACTION_PACKAGE_ADDED) - || action.equals(Intent.ACTION_PACKAGE_REPLACED) - || action.equals(Intent.ACTION_PACKAGE_REMOVED)) { - String packageName = intent.getDataString().replace("package:", ""); - Observable.create(new ObservableOnSubscribe>() { - @Override - public void subscribe(ObservableEmitter> emitter) throws Exception { - PackageManager pm = context.getPackageManager(); - List list = pm.getInstalledPackages(0); - List uploadInfos = new ArrayList<>(); - for (PackageInfo info : list) { - if ((info.applicationInfo.flags & ApplicationInfo.FLAG_SYSTEM) == 1) { - continue; - } - AppUploadInfo uploadInfo = new AppUploadInfo(); - uploadInfo.setApp_package(info.packageName); - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) { - uploadInfo.setApp_version_code(info.getLongVersionCode()); - } else { - uploadInfo.setApp_version_code(info.versionCode); - } - uploadInfos.add(uploadInfo); - } - emitter.onNext(uploadInfos); - } - }) - .subscribeOn(Schedulers.io()) - .observeOn(AndroidSchedulers.mainThread()) - .subscribe(new Observer>() { - @Override - public void onSubscribe(Disposable d) { + ApkUtils.addShortcut(context); + JGYUtils.getInstance().cleanLauncherCache(); + Log.e(TAG, "onReceive: " + "action = " + action); + String state; + if (TextUtils.isEmpty(action)) { + Log.e(TAG, "onReceive: " + "action is empty "); + return; + } + String packageName = intent.getDataString().replace("package:", ""); + switch (action) { + case Intent.ACTION_PACKAGE_ADDED: + state = "安装了:"; + break; + case Intent.ACTION_PACKAGE_REPLACED: + cleanLauncher3Cache(); + state = "重装了:"; + break; + case Intent.ACTION_PACKAGE_REMOVED: + state = "卸载了:"; + break; + default: + state = "未知:"; + break; + } + Log.e(TAG, "sendAppInfo: " + state + packageName); + newAppListener.setNewAppListener(packageName); - } + } - @Override - public void onNext(List appUploadInfos) { - String json = JSONArray.toJSONString(appUploadInfos); - Log.e(TAG, "onNext: " + json); - HTTPInterface.SendAppInstall(json); - } - - @Override - public void onError(Throwable e) { - - } - - @Override - public void onComplete() { - - } - }); + private void cleanLauncher3Cache() { + try { + new CacheUtils().cleanApplicationUserData(mContext, "com.android.launcher3"); + } catch (Exception e) { + Log.e(TAG, "onReceive: " + e.getMessage()); + e.printStackTrace(); } } + + + public interface NewAppListener { + void setNewAppListener(String packageName); + } + + private static void sendAppInfo() { + Observable.create((ObservableEmitter emitter) -> newAppListener = emitter::onNext) + .throttleLast(5, TimeUnit.SECONDS) + .subscribe(new Observer() { + @Override + public void onSubscribe(Disposable d) { + + } + + @Override + public void onNext(String s) { + HTTPInterface.getAPPinfo(mContext); + HTTPInterface.getForceInstall(mContext); + HTTPInterface.getAllappPackage(mContext); + } + + @Override + public void onError(Throwable e) { + + } + + @Override + public void onComplete() { + Log.e(TAG, "onComplete: "); + } + }); + } } diff --git a/app/src/main/java/com/info/sn/receiver/BootReceiver.java b/app/src/main/java/com/info/sn/receiver/BootReceiver.java index 6709da3..b1d2a01 100644 --- a/app/src/main/java/com/info/sn/receiver/BootReceiver.java +++ b/app/src/main/java/com/info/sn/receiver/BootReceiver.java @@ -6,9 +6,9 @@ import android.content.Intent; import android.util.Log; import com.info.sn.service.GuardService; -import com.info.sn.service.InitJpushServer; +import com.info.sn.service.MainService; +import com.info.sn.service.ManagerService; import com.info.sn.service.MyDownloadService; -import com.info.sn.service.ScreenLockService; import com.info.sn.service.StepService; @@ -32,12 +32,11 @@ public class BootReceiver extends BroadcastReceiver { ) { // Intent i = new Intent(context, InitJpushServer.class); // context.startService(i); + context.startService(new Intent(context, MainService.class)); context.startService(new Intent(context, GuardService.class)); context.startService(new Intent(context, StepService.class)); - context.startService(new Intent(context, InitJpushServer.class)); context.startService(new Intent(context, MyDownloadService.class)); - context.startService(new Intent(context, ScreenLockService.class)); - + context.startService(new Intent(context, ManagerService.class)); } } } diff --git a/app/src/main/java/com/info/sn/receiver/MyJPushReceiver.java b/app/src/main/java/com/info/sn/receiver/MyJPushReceiver.java new file mode 100644 index 0000000..9d459cb --- /dev/null +++ b/app/src/main/java/com/info/sn/receiver/MyJPushReceiver.java @@ -0,0 +1,920 @@ +package com.info.sn.receiver; + +import android.annotation.SuppressLint; +import android.bluetooth.BluetoothAdapter; +import android.content.BroadcastReceiver; +import android.content.Context; +import android.content.Intent; +import android.content.IntentFilter; +import android.content.pm.PackageManager; +import android.os.Bundle; +import android.os.CountDownTimer; +import android.os.Environment; +import android.os.Handler; +import android.text.TextUtils; +import android.util.Log; +import android.view.Gravity; +import android.view.WindowManager; + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; +import com.arialyy.aria.core.Aria; +import com.arialyy.aria.core.download.DownloadEntity; +import com.info.sn.bean.zuoye.BaseResponse; +import com.info.sn.jpush.Logger; +import com.info.sn.manager.ControlManager; +import com.info.sn.network.HTTPInterface; +import com.info.sn.manager.NetInterfaceManager; +import com.info.sn.network.api.BindDevices; +import com.info.sn.network.api.UploadScreenshot; +import com.info.sn.service.ManagerService; +import com.info.sn.utils.ApkUtils; +import com.info.sn.utils.CacheUtils; +import com.info.sn.utils.CmdUtil; +import com.info.sn.manager.DeviceManager; +import com.info.sn.utils.JGYUtils; +import com.info.sn.utils.SPUtils; +import com.info.sn.utils.ServiceAliveUtils; +import com.info.sn.utils.ToastUtil; +import com.info.sn.utils.Utils; +import com.info.sn.dialog.CustomDialog; + +import java.io.File; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.HashSet; +import java.util.List; + +import cn.jpush.android.api.JPushInterface; +import io.reactivex.Observable; +import io.reactivex.ObservableEmitter; +import io.reactivex.ObservableOnSubscribe; +import io.reactivex.Observer; +import io.reactivex.android.schedulers.AndroidSchedulers; +import io.reactivex.annotations.NonNull; +import io.reactivex.disposables.Disposable; +import io.reactivex.schedulers.Schedulers; +import okhttp3.MediaType; +import okhttp3.MultipartBody; +import okhttp3.RequestBody; + +/** + * 自定义接收器 + *

+ * 如果不定义这个 Receiver,则: + * 1) 默认用户会打开主界面 + * 2) 接收不到自定义消息 + */ +public class MyJPushReceiver extends BroadcastReceiver { + private static final String TAG = "MyJPushReceiver"; + + //定义接收极光推送消息的类型。 + //1.获取设备在线信息 + private static final String JIGUANG_GET_DRIVELINE = "1"; + // 2.获取当前正在运行得应用和电量 + private static final String JIGUANG_GET_STARTTIME = "2"; + // 3.数据线传输管控 + private static final String JIGUANG_USB_STATE = "3"; + // 4.TF卡管控 + private static final String JIGUANG_TFCARD_STATE = "4"; + // 5.蓝牙管控 + private static final String JIGUANG_BLUETOOTH_STATE = "5"; + // 6.浏览器上网管控 + private static final String JIGUANG_BROWSER_URLPATH = "6"; + // 7.应用联网管控 + private static final String JIGUANG_APP_NETWORKSTATE = "7"; + // 8.应用锁管控 + private static final String JIGUANG_APP_LOCKEDSTATE = "8"; + // 9.强制安装应用 + private static final String JIGUANG_FORCE_INSTALLAPK = "9"; + // 10.强制卸载应用 + private static final String JIGUANG_FORCE_UNINSTALLAPK = "10"; + // 11.绑定设备 + private static final String JIGUANG_BIND_DEVIVES = "11"; + //12.影音格式管控 + private static final String JIGUANG_TFMEDIA = "12"; + //13.摄像头管控 + private static final String JIGUANG_CAMRERA = "13"; + //14.电话管控管控 + private static final String JIGUANG_PHONE = "14"; + //15.禁止升级 + private static final String JIGUANG_DISABLE_UPDATAE = "15"; + //16.app内部网址管控 + private static final String JIGUANG_APP_WEBSITE = "16"; + //设备恢复出厂设置 + private static final String JIGUANG_RESET_DEVICES = "17"; + //浏览器书签 + private static final String JIGUANG_BROWSER_LABEL = "18"; + //APP联网自启管控 + private static final String JIGUANG_APP_NET_AUTO = "19"; + //系统管控 + private static final String JIGUANG_SYSTEM_SETTING = "21"; + //重启 + private static final String JIGUANG_REBOOT_DEVICES = "22"; + //获取app管控设置 + private static final String JIGUANG_APP_SETTING = "23"; + //强制停止应用 + private static final String JIGUANG_FORCE_KILL = "24"; + //锁屏 + private static final String JIGUANG_LOCK_SCREEN = "25"; + //截图 + private static final String JIGUANG_SNAPSHOT = "26"; + //时间管控 + private static final String JIGUANG_TIME_CONTROL = "27"; + //热点管控 + private static final String JIGUANG_HOTSPOT_CONTROL = "29"; + //禁止恢复出厂设置 + private static final String JIGUANG_RESTORE_CONTROL = "30"; + //浏览器禁止输入 + private static final String JIGUANG_BROWSER_CONTROL = "32"; + //开发人员选项 + private static final String JIGUANG_DEVELOPER_CONTROL = "33"; + //清除应用缓存 + private static final String JIGUANG_CLEAN_APP_CACHE = "34"; + //几个桌面图标 + private static final String JIGUANG_APP_RECORDER = "35"; + private static final String JIGUANG_APP_FILE_MANAGER = "36"; + private static final String JIGUANG_APP_GALLERY = "37"; + private static final String JIGUANG_APP_MUSIC = "38"; + //搜题开关 + private static final String JIGUANG_SEARCH_TOPIC = "39"; + //电话白名单推送 + private static final String JIGUANG_PHONE_LIST = "49"; + + @Override + public void onReceive(Context context, Intent intent) { + Bundle bundle = intent.getExtras(); + if (JPushInterface.ACTION_REGISTRATION_ID.equals(intent.getAction())) { + String regId = bundle.getString(JPushInterface.EXTRA_REGISTRATION_ID); + Logger.d(TAG, "[MyJPushReceiver] 接收Registration Id : " + regId); + //send the Registration Id to your server... + } else if (JPushInterface.ACTION_MESSAGE_RECEIVED.equals(intent.getAction())) { + Logger.e(TAG, "[MyJPushReceiver] 接收到推送下来的自定义消息: " + bundle.getString(JPushInterface.EXTRA_MESSAGE)); + processCustomMessage(context, bundle); + } else if (JPushInterface.ACTION_NOTIFICATION_RECEIVED.equals(intent.getAction())) { + Logger.d(TAG, "[MyJPushReceiver] 接收到推送下来的通知"); + int notifactionId = bundle.getInt(JPushInterface.EXTRA_NOTIFICATION_ID); + Logger.d(TAG, "[MyJPushReceiver] 接收到推送下来的通知的ID: " + notifactionId); + } else if (JPushInterface.ACTION_NOTIFICATION_OPENED.equals(intent.getAction())) { +// Logger.d(TAG, "[MyJPushReceiver] 用户点击打开了通知"); +// //打开自定义的Activity +// Intent i = new Intent(context, TestActivity.class); +// i.putExtras(bundle); +// //i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); +// i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP); +// context.startActivity(i); + } else if (JPushInterface.ACTION_RICHPUSH_CALLBACK.equals(intent.getAction())) { + Logger.d(TAG, "[MyJPushReceiver] 用户收到到RICH PUSH CALLBACK: " + bundle.getString(JPushInterface.EXTRA_EXTRA)); + //在这里根据 JPushInterface.EXTRA_EXTRA 的内容处理代码,比如打开新的Activity, 打开一个网页等.. + } else if (JPushInterface.ACTION_CONNECTION_CHANGE.equals(intent.getAction())) { + boolean connected = intent.getBooleanExtra(JPushInterface.EXTRA_CONNECTION_CHANGE, false); + Logger.w(TAG, "[MyJPushReceiver]" + intent.getAction() + " connected state change to " + connected); + } else { + Logger.d(TAG, "[MyJPushReceiver] Unhandled intent - " + intent.getAction()); + } + } + + //send msg to MainActivityOld + private void processCustomMessage(Context context, Bundle bundle) { + String message = bundle.getString(JPushInterface.EXTRA_MESSAGE); + String title = bundle.getString(JPushInterface.EXTRA_TITLE); + String type = bundle.getString(JPushInterface.EXTRA_CONTENT_TYPE); + String extras = bundle.getString(JPushInterface.EXTRA_EXTRA); +// HTTPInterface.checkDevicesInfo(context); + Log.e(TAG, "processCustomMessage: " + message); + switch (message) { + case JIGUANG_GET_DRIVELINE: + ToastUtil.debugShow("收到推送消息: 获取在线信息"); +// HTTPInterface.getDriveState(member_id, sn_id); + break; + case JIGUANG_GET_STARTTIME: + ToastUtil.debugShow("收到推送消息: 获取运行应用"); + sendStartTime(context, extras); + break; + case JIGUANG_USB_STATE: + ToastUtil.debugShow("收到推送消息: USB连接模式管控"); + setUsbState(context, extras); + break; + case JIGUANG_TFCARD_STATE: + ToastUtil.debugShow("收到推送消息: TF卡管控"); + setTfcardState(context, extras); + break; + case JIGUANG_BLUETOOTH_STATE: + ToastUtil.debugShow("收到推送消息: 蓝牙管控"); + setBluetoothState(context, extras); + break; + case JIGUANG_BROWSER_URLPATH: + ToastUtil.debugShow("收到推送消息: 浏览器上网管控"); +// setBrowserUrlpath(context, extras); + try { + new CacheUtils().cleanApplicationUserData(context, "com.android.browser"); + } catch (Exception e) { + e.printStackTrace(); + } + HTTPInterface.getBrowserWhiteList(context); + HTTPInterface.getBrowserLabel(context); + break; + case JIGUANG_APP_NETWORKSTATE: + ToastUtil.debugShow("收到推送消息: 应用联网管控"); + setAppNetworkstate(context, extras); + HTTPInterface.getAppInside(); + break; + case JIGUANG_APP_LOCKEDSTATE: + ToastUtil.debugShow("收到推送消息: 应用锁管控"); + setAppLockedstate(context, extras); + break; + case JIGUANG_FORCE_INSTALLAPK: + ToastUtil.debugShow("收到推送消息: 强制安装应用"); + HTTPInterface.getAllappPackage(context); + HTTPInterface.getForceInstall(context); + intallApk(context, extras); + break; + case JIGUANG_FORCE_UNINSTALLAPK: + ToastUtil.debugShow("收到推送消息: 强制卸载应用"); + unintallApk(context, extras); + break; + case JIGUANG_BIND_DEVIVES: + ToastUtil.debugShow("收到推送消息: 绑定设备"); + bindService(context, extras); + break; + case JIGUANG_TFMEDIA: + ToastUtil.debugShow("收到推送消息: 影音格式管控"); + setTFmedia(context, extras); + break; + case JIGUANG_CAMRERA: + ToastUtil.debugShow("收到推送消息: 摄像头管控"); + setCameta(context, extras); + break; + case JIGUANG_PHONE: + ToastUtil.debugShow("收到推送消息: 电话管控"); + setPhone(context, extras); + break; + case JIGUANG_DISABLE_UPDATAE: + ToastUtil.debugShow("收到推送消息: 禁止升级"); + setAppUpdate(context, extras); + break; + case JIGUANG_APP_WEBSITE: + ToastUtil.debugShow("收到推送消息: app内部网址管控"); +// HTTPInterface.getAppJump(context); + break; + case JIGUANG_REBOOT_DEVICES: + ToastUtil.debugShow("收到推送消息: 重启"); + DeviceManager.rebootDevices(); + break; + case JIGUANG_APP_NET_AUTO: + ToastUtil.debugShow("收到推送消息: APP联网自启管控"); + Handler.getMain().postDelayed(new Runnable() { + @Override + public void run() { + HTTPInterface.getAllappPackage(context); + } + }, 2000); + break; + case JIGUANG_BROWSER_LABEL: + try { + new CacheUtils().cleanApplicationUserData(context, "com.android.browser"); + } catch (Exception e) { + e.printStackTrace(); + } + ToastUtil.debugShow("收到推送消息: 浏览器书签"); + HTTPInterface.getBrowserWhiteList(context); + HTTPInterface.getBrowserLabel(context); + break; + case JIGUANG_SYSTEM_SETTING: + ToastUtil.debugShow("收到推送消息: 系统管控"); + ControlManager.getInstance().setSystemSetting(context, extras); + break; + case JIGUANG_RESET_DEVICES: + ToastUtil.debugShow("收到推送消息: 设备恢复出厂设置"); + DeviceManager.doMasterClear(); + break; + case JIGUANG_APP_SETTING: + ToastUtil.debugShow("收到推送消息: 获取app管控设置"); + Handler.getMain().postDelayed(new Runnable() { + @Override + public void run() { + HTTPInterface.getAllappPackage(context); + } + }, 2000); + break; + case JIGUANG_FORCE_KILL: + ToastUtil.debugShow("收到推送消息: 强制停止应用"); + JSONObject killJSONObject = JSON.parseObject(extras); + String packages = killJSONObject.getString("app_package"); + JGYUtils.getInstance().killBackgroundProcesses(context, packages); + Log.e(TAG, extras); + break; + case JIGUANG_LOCK_SCREEN: + ToastUtil.debugShow("收到推送消息: 锁屏"); + setLock_screen(context, extras); + Log.e(TAG, extras); + break; + case JIGUANG_SNAPSHOT: + ToastUtil.debugShow("收到推送消息: 截图"); + doscreenshot(context); + Log.e(TAG, extras); + break; + case JIGUANG_TIME_CONTROL: + ToastUtil.debugShow("收到推送消息: 时间管控"); + timeControl(context, extras); + break; + case JIGUANG_HOTSPOT_CONTROL: + ToastUtil.debugShow("收到推送消息: 热点管控"); + setHotspot(context, extras); + break; + case JIGUANG_RESTORE_CONTROL: + ToastUtil.debugShow("收到推送消息: 恢复出厂设置管控"); + setRestore(context, extras); + break; + case JIGUANG_BROWSER_CONTROL: + ToastUtil.debugShow("收到推送消息: 浏览器禁止输入"); + setBrowserInput(context, extras); + break; + case JIGUANG_DEVELOPER_CONTROL: + ToastUtil.debugShow("收到推送消息: 开发人员选项"); + ControlManager.getInstance().setDeveloperOptions(context, extras); + break; + case JIGUANG_CLEAN_APP_CACHE: + ToastUtil.debugShow("收到推送消息: 清除应用缓存"); + cleanAppCache(context, extras); + break; + case JIGUANG_APP_RECORDER: + case JIGUANG_APP_FILE_MANAGER: + case JIGUANG_APP_GALLERY: + case JIGUANG_APP_MUSIC: + ToastUtil.debugShow("收到推送消息: 系统APP管控"); + hideDesktopIcon(context); + break; + case JIGUANG_SEARCH_TOPIC: + ToastUtil.debugShow("收到推送消息: 搜题开关"); + searchTopic(context, extras); + break; + case JIGUANG_PHONE_LIST: + ToastUtil.debugShow("收到推送消息: 电话白名单管控"); + setPhone(context, extras); + break; + default: + break; + } + } + + private int changeNum(int paramInt) { + return paramInt == 1 ? 0 : 1; + } + + synchronized private void sendStartTime(Context context, String jsonString) { + HTTPInterface.updateAdminInfo(context); + HTTPInterface.sendRunningApp(context); + HTTPInterface.sendAppUsed(context); + } + + synchronized private void setUsbState(Context context, String jsonString) { + if (!TextUtils.isEmpty(jsonString)) { + JSONObject jsonObject = JSON.parseObject(jsonString); + String setting_usb = jsonObject.getString("setting_usb"); + boolean qch_usb_choose = JGYUtils.putString(context.getContentResolver(), "qch_usb_choose", setting_usb); + Log.e("setUsbState:", JGYUtils.getString(context.getContentResolver(), "qch_usb_choose")); + String usbStatus = ""; + switch (setting_usb) { + case "usb_charge": + usbStatus = "qch_action_usb_usb_charge"; + break; + case "usb_mtp": + usbStatus = "qch_action_usb_usb_mtp"; + break; +// case "usb_midi": +// usbStatus = "qch_action_usb_usb_midi"; +// break; + default: + usbStatus = "qch_action_usb_usb_charge"; + break; + } + Intent usbIntent = new Intent(usbStatus).setPackage("com.android.settings"); + context.sendBroadcast(usbIntent); + } else { + ToastUtil.debugShow("setUsbState jsonString is NULL"); + } + } + + synchronized private void setTfcardState(Context context, String jsonString) { + if (!TextUtils.isEmpty(jsonString)) { + JSONObject extra = JSON.parseObject(jsonString); + int is_tf = extra.getInteger("setting_memory"); + boolean qch_sdcard_forbid_on = JGYUtils.putInt(context.getContentResolver(), "qch_sdcard_forbid_on", changeNum(is_tf)); + if (qch_sdcard_forbid_on) { + Log.e("setTfcardState:", JGYUtils.getString(context.getContentResolver(), "qch_sdcard_forbid_on")); + } else { + ToastUtil.debugShow("setTfcardState failed,state:" + is_tf); + } + } else { + ToastUtil.debugShow("setTfcardState jsonString is NULL"); + } + } + + private BluetoothAdapter mBluetoothAdapter; + + synchronized private void setBluetoothState(Context context, String jsonString) { + if (!TextUtils.isEmpty(jsonString)) { + if (null == mBluetoothAdapter) { + mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();//获取默认蓝牙适配器 + } + JSONObject extra = JSON.parseObject(jsonString); + int is_bluetooth = changeNum(extra.getInteger("setting_bluetooth")); + Log.e(TAG, "qch_bht_forbid_on:" + is_bluetooth); + try { + //写入系统数据库 + boolean qch_bht_forbid_on = JGYUtils.putInt(context.getContentResolver(), "qch_bht_forbid_on", is_bluetooth); + Log.e(TAG, "qch_bht_forbid_on:" + qch_bht_forbid_on); + BluetoothAdapter mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter(); + if (qch_bht_forbid_on) { + //成功 + if (null == mBluetoothAdapter) { + mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter(); + //获取默认蓝牙适配器 + } + //蓝牙总开关开启 + JGYUtils.putString(context.getContentResolver(), "qch_bhtvideo_forbid_on", "Empty"); + JGYUtils.putInt(context.getContentResolver(), "qch_bt_forbid_on", is_bluetooth); + //设置关闭时关闭蓝牙 + mBluetoothAdapter.disable(); + } + } catch (Exception e) { + Log.e(TAG, "setBluetooth: " + e.getMessage()); + } + } else { + ToastUtil.debugShow("setBluetoothState jsonString is NULL"); + } + } + + synchronized private void setAppNetworkstate(Context context, String jsonString) { + if (!TextUtils.isEmpty(jsonString)) { + JSONObject extra = JSON.parseObject(jsonString); + String package0 = extra.getString("package0"); + String package1 = extra.getString("package1"); + if (package0.length() != 0) { + boolean qch_jgy_network_allow = JGYUtils.putString(context.getContentResolver(), "qch_jgy_network_allow", package0); + Log.e("fht", "qch_jgy_network_allow::" + qch_jgy_network_allow + ":" + JGYUtils.getString(context.getContentResolver(), "qch_jgy_network_allow")); + } else { + boolean qch_jgy_network_allow = JGYUtils.putString(context.getContentResolver(), "qch_jgy_network_allow", "invalid"); + Log.e("fht", "qch_jgy_network_allow::" + qch_jgy_network_allow + ":" + JGYUtils.getString(context.getContentResolver(), "qch_jgy_network_allow")); + } + if (package1.length() != 0) { + boolean qch_jgy_network_disallow = JGYUtils.putString(context.getContentResolver(), "qch_jgy_network_disallow", package1); + Log.e("fht", "qch_jgy_network_disallow::" + qch_jgy_network_disallow + ":" + JGYUtils.getString(context.getContentResolver(), "qch_jgy_network_disallow")); + } else { + boolean qch_jgy_network_disallow = JGYUtils.putString(context.getContentResolver(), "qch_jgy_network_disallow", "invalid"); + Log.e("fht", "qch_jgy_network_disallow::" + qch_jgy_network_disallow + ":" + JGYUtils.getString(context.getContentResolver(), "qch_jgy_network_disallow")); + } + } else { + ToastUtil.debugShow("setAppNetworkstate jsonString is NULL"); + } + } + + synchronized private void setAppLockedstate(Context context, String jsonString) { + if (!TextUtils.isEmpty(jsonString)) { + JSONObject extra = JSON.parseObject(jsonString); + String packageName = extra.getString("package"); + int is_lock = extra.getInteger("is_lock"); + ToastUtil.debugShow("收到应用锁管控消息:包名" + packageName + "is_lock_state:" + is_lock); + PackageManager pm = context.getPackageManager(); + //后台为0可能传过来null + if (is_lock == 1) { + pm.setApplicationEnabledSetting(packageName, PackageManager.COMPONENT_ENABLED_STATE_DISABLED, 0); + } else { + pm.setApplicationEnabledSetting(packageName, PackageManager.COMPONENT_ENABLED_STATE_DEFAULT, 0); + } + } else { + ToastUtil.debugShow("setAppLockedstate jsonString is NULL"); + } + } + + //静默安装应用,使用okgo,断网会出现问题,等待修改使用aria + synchronized private void intallApk(Context context, String jsonString) { + if (TextUtils.isEmpty(jsonString)) { + return; + } +// HTTPInterface.getAllAppPackageName(context); + JSONObject extra = JSON.parseObject(jsonString); + final String packages = extra.getString("package"); + ToastUtil.debugShow("收到应用安装消息:包名" + packages); + String url = extra.getString("url"); + if (TextUtils.isEmpty(url)) { + return; + } + if (Aria.download(this).taskExists(url)) { + + List entity = Aria.download(this).getDownloadEntity(url); + for (DownloadEntity downloadEntity : entity) { + Aria.download(this).load(downloadEntity.getId()).cancel(true); + } + } + File file = new File(Environment.getExternalStoragePublicDirectory("Download") + "/Sninfo/apk"); + file.mkdirs(); + Aria.download(this) + .load(url) + .setFilePath(file.getAbsolutePath() + "/" + packages + ".apk") + .ignoreFilePathOccupy() + .setExtendField(packages).create(); + Aria.download(this).resumeAllTask(); + + } + + synchronized private void unintallApk(Context context, String jsonString) { + int sn_id = (int) SPUtils.get(context, "sn_id", -1); + JSONObject object = JSON.parseObject(jsonString); + String packageName = object.getString("app_package"); + ToastUtil.debugShow("收到应用卸载消息:包名" + packageName); + if (!packageName.equals("") && !packageName.equals(context.getApplicationContext().getPackageName())) { + if (!ApkUtils.isAvailable(context.getApplicationContext(), packageName)) { +// HTTPInterface.setAppuninstallInfo(sn_id, packageName); + } else { + ApkUtils.uninstallApp(context, packageName); + } + } + } + + synchronized void bindService(final Context context, String jsonString) { + ToastUtil.debugShow("收到绑定设备请求"); + JSONObject object = JSON.parseObject(jsonString); + String userName = object.getString("member_name"); + final String id = object.getString("id"); + String phoneNum = object.getString("member_phone"); + final CustomDialog dialog = new CustomDialog(context); + dialog.setMessage(phoneNum + "的用户请求绑定你的平板") + .setTitle("绑定请求") + .setPositive("允许") + .setNegtive("拒绝") +// .setSingle(true) + .setOnClickBottomListener(new CustomDialog.OnClickBottomListener() { + @Override + public void onPositiveClick() { + bind(context, id, 1); + dialog.dismiss(); + } + + @Override + public void onNegtiveClick() { + bind(context, id, 0); + ToastUtil.show("设备取消绑定"); + dialog.dismiss(); + } + }); + dialog.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT); + dialog.show(); + dialog.getWindow().setGravity(Gravity.CENTER); + dialog.getWindow().clearFlags(WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE | WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM); + dialog.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE); + + new CountDownTimer(30000, 1000) { + + @Override + public void onTick(long l) { + String value = String.valueOf((int) (l / 1000)); + dialog.setNegtiveText("拒绝" + "(" + value + ")"); + } + + @Override + public void onFinish() { + bind(context, id, 0); + dialog.dismiss(); + } + }.start(); + } + + synchronized private void bind(final Context context, String id, int type) { + BindDevices bindDevices = NetInterfaceManager.getInstance().getbindDevicesControl(); + bindDevices.getBindDevices(Utils.getSerial(), id, type) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new Observer() { + @Override + public void onSubscribe(@NonNull Disposable d) { + + } + + @Override + public void onNext(@NonNull BaseResponse baseResponse) { + int code = baseResponse.code; + String msg = baseResponse.msg; +// Log.e("bind", baseResponse.toString()); + if (code == 200) { + ToastUtil.show("绑定成功"); + } else if (code == 301) { + ToastUtil.show(msg); + } + } + + @Override + public void onError(@NonNull Throwable e) { + Log.e("bind", e.getMessage()); + } + + @Override + public void onComplete() { + + } + }); + } + + String tftype = ".png,.bmp,.jpg,.mpo,.jpeg,.gif,.tif,.tiff,.dib,.jpe,.jfif,.psd,.pdd,.rle,.dcm,.dic,.dc3,.eps,.iff,.tdi,.jpf,.jpx,.jp2,.j2c,.jpc,.jps,.j2k,.pcx,.pdp,.raw,.pns,.aac,.ac3,.aiff,.amr,.ape,.au,.fla,.flac,.imy,.m4r,.mid,.mka,.mmf,.mp2,.mp3,.mxmf,.ogg,.ra,.ts,.wma,.wv,.xmf,.m4a,.wav,.3gpp,.mp4,.3gp,.as,.asf,.avi,.dat,.f4v,.flv,.mkv,.mov,.mpg,.rmvb,.swf,.trp,.vob,.webm,.wmv,.navi,.video,.ram,.qsv,.xv,.rm,.vcd,.svcd,.mlv,.mpe,.mpeg,.m2v,.iso,.html,.htm,.txt,.xls,.doc,.docx,.docm,.pdf,.xps,.dot,.dotx,.dotm,.mht,.mhtml,.rft,.xml,.xlsx,.xlsm,.xlsb,.xltx,.xltm,.xlt,.wps,.wpt,.rtf,.et,.ett,.dps,.dpt,.wpp,.ppt,.pptx,.pptm,.pps,.pot,.potm,.ppsx,.ppsm,.odp"; + + @SuppressLint("NewApi") + private void setTFmedia(Context context, String jsonString) { + JSONObject jsonObject = JSON.parseObject(jsonString); + //影音管控开关 + int setting_tfmedia = jsonObject.getInteger("setting_tfmedia"); + Log.e("SystemSetting", "qch_tfmedia_forbid---------" + setting_tfmedia); + + if (setting_tfmedia == 1) { + JGYUtils.putInt(context.getContentResolver(), "qch_tfmedia_forbid", 0); + } else { + String s = JGYUtils.getString(context.getContentResolver(), "qch_tfmedia_filetypes");//影音管控 + Log.e("SystemSetting", "qch_tfmedia_filetypes old" + s); + JGYUtils.putInt(context.getContentResolver(), "qch_tfmedia_forbid", 1); + String setting_tfmedia_format = jsonObject.getString("setting_tfmedia_format"); + HashSet types = new HashSet<>(Arrays.asList(setting_tfmedia_format.split(","))); + types.removeIf(TextUtils::isEmpty); + boolean b = JGYUtils.putString(context.getContentResolver(), "qch_tfmedia_filetypes", String.join(",", types));//影音管控 + Log.e("SystemSetting", "qch_tfmedia_filetypes---------" + b + ":" + types); + } + } + + private void setCameta(Context context, String jsonString) { + JSONObject jsonObject = JSON.parseObject(jsonString); + //摄像头开关 + int setting_camera = changeNum(jsonObject.getInteger("setting_camera")); + JGYUtils.putInt(context.getContentResolver(), "qch_app_camera", setting_camera); + ApkUtils.hideSystemSettingAPP(context, "com.mediatek.camera"); + Log.e("SystemSetting", "setting_camera---------" + setting_camera); + String cameraStatus = ""; + switch (setting_camera) { + case 1: + cameraStatus = "qch_camera_open"; + break; + case 0: + cameraStatus = "qch_camera_forbid"; + break; + default: + cameraStatus = "qch_camera_forbid"; + break; + } + Intent cameraIntent = new Intent(cameraStatus).setPackage("com.android.settings"); + context.sendBroadcast(cameraIntent); + } + + private void setPhone(Context context, String jsonString) { + HTTPInterface.getSystemSettings(context); + } + + @SuppressLint("NewApi") + private void setAppUpdate(Context context, String jsonString) { + JSONObject jsonObject = JSON.parseObject(jsonString); + String is_upgrade = jsonObject.getString("is_upgrade"); + String packageName = jsonObject.getString("package"); + String nowApplist = JGYUtils.getString(context.getContentResolver(), "qch_app_forbid"); + List applist = new ArrayList<>(Arrays.asList(nowApplist.split(","))); + if (is_upgrade.equals("0")) { + if (applist.contains(packageName)) { + applist.remove(packageName); + } else { + Log.e("setAppUpdate", "app已经存在"); + } + } else if (is_upgrade.equals("1")) { + if (!applist.contains(packageName)) { + applist.add(packageName); + } + } + JGYUtils.putString(context.getContentResolver(), "qch_app_forbid", String.join(",", applist)); + Log.e("setAppUpdate", JGYUtils.getString(context.getContentResolver(), "qch_app_forbid")); + } + + private void setLock_screen(Context context, String jsonString) { + String type = "0"; + JSONObject jSONObject = JSON.parseObject(jsonString); + type = jSONObject.getString("type"); + + if (!ServiceAliveUtils.isServiceAlice(context, ManagerService.class.getName())) { + context.startService(new Intent(context, ManagerService.class)); + } + Intent intent = new Intent(); +// intent.putExtra("name", name); + if (type.equals("1")) { + intent.setAction(ManagerService.ACTION_LOCK); + } else if (type.equals("0")) { + intent.setAction(ManagerService.ACTION_UNLOCK); + } + context.sendBroadcast(intent); + } + + public void doscreenshot(final Context context) { + final long time = System.currentTimeMillis(); + Observable.create(new ObservableOnSubscribe() { + @Override + public void subscribe(ObservableEmitter e) throws Exception { + String filepath = context.getExternalFilesDir("db").getAbsolutePath(); + int n = CmdUtil.execute("screencap -p " + filepath + File.separator + time + ".png").code; + e.onNext(n); + } + }).subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new Observer() { + @Override + public void onSubscribe(Disposable d) { + + } + + @Override + public void onNext(Integer integer) { + if (integer == 0) { + uplaodImage(context, time); + } else { + Log.e("doss", "失败"); + } + } + + @Override + public void onError(Throwable e) { + Log.e("doss", "Throwable=" + e.getMessage()); + } + + @Override + public void onComplete() { + + } + }); + } + + /** + * 实时获取电量 + */ + public static int getSystemBattery(Context context) { + int level = 0; + Intent batteryInfoIntent = context.getApplicationContext().registerReceiver(null, + new IntentFilter(Intent.ACTION_BATTERY_CHANGED)); + level = batteryInfoIntent.getIntExtra("level", 0); + int batterySum = batteryInfoIntent.getIntExtra("scale", 100); + int percentBattery = 100 * level / batterySum; + Log.i("getSystemBattery", "level = " + level); + Log.i("getSystemBattery", "batterySum = " + batterySum); + Log.i("getSystemBattery", "percent is " + percentBattery + "%"); + return percentBattery; + } + + synchronized private void setBrowserUrlpath(Context context, String jsonString) { + if (!TextUtils.isEmpty(jsonString)) { + JSONObject extra = JSON.parseObject(jsonString); + String white = extra.getString("white"); + if (white != null && !white.equals("")) { + boolean whiteList = JGYUtils.putString(context.getContentResolver(), "DeselectBrowserArray", white); + Log.e("SystemSetting", "setBrowserList-whiteList" + whiteList + ":" + white); + } else { + JGYUtils.putString(context.getContentResolver(), "DeselectBrowserArray", " "); + } + Log.e("whiteList", JGYUtils.getString(context.getContentResolver(), "DeselectBrowserArray")); + String black = extra.getString("black"); + if (black != null && !black.equals("")) { + boolean blackList = JGYUtils.putString(context.getContentResolver(), "qch_webblack_url", black); + Log.e("SystemSetting", "setBrowserList-blackList" + blackList + ":" + black); + } else { + JGYUtils.putString(context.getContentResolver(), "qch_webblack_url", " "); + } + Log.e("blackList", JGYUtils.getString(context.getContentResolver(), "qch_webblack_url")); + } else { + boolean setBrowserUrlpath = JGYUtils.putString(context.getContentResolver(), "DeselectBrowserArray", "invalid"); + ToastUtil.debugShow("setBrowserUrlpath jsonString is NULL,set default: " + setBrowserUrlpath); + } + } + + + private void uplaodImage(final Context context, long time) { + String filepath = context.getExternalFilesDir("db").getAbsolutePath(); +// String filepath = mContext.getFileStreamPath("screenshot").getAbsolutePath(); + //放在app内部data下面 + File file = new File(filepath + File.separator + time + ".png"); + //不要直接使用常用图片格式 + if (!file.exists()) { + Log.e("uplaodImage", "File does not exists"); + return; + } + UploadScreenshot uploadScreenshot = NetInterfaceManager.getInstance().getUploadScreenshotControl(); + RequestBody requestFile = RequestBody.create(MediaType.parse("multipart/form-data"), file); + MultipartBody.Part body = MultipartBody.Part.createFormData("file", file.getName(), requestFile); + uploadScreenshot.uploadScreenshot(Utils.getSerial(), body) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new Observer() { + @Override + public void onSubscribe(Disposable d) { + + } + + @Override + public void onNext(BaseResponse baseResponse) { + int code = baseResponse.code; + if (code == 200) { + Log.e(TAG, "onNext: " + baseResponse.msg); + } else { + Log.e(TAG, code + ": " + baseResponse.msg); + } + } + + @Override + public void onError(Throwable e) { + Log.e("uplaod", "onError: " + e.getMessage()); + } + + @Override + public void onComplete() { + + } + }); + + } + + private void timeControl(Context context, String jsonString) { + HTTPInterface.getTimeControl(context); + } + + /** + * @param context + * @param jsonString 设置热点开关 + */ + private void setHotspot(Context context, String jsonString) { + JSONObject jsonObject = JSON.parseObject(jsonString); + int setting_hotspot = changeNum(jsonObject.getInteger("setting_hotspot"));//热点 + try { + if (setting_hotspot == 1) { + Intent intent = new Intent(); + intent.setAction("qch_hotspot_close"); + intent.setPackage("com.android.settings"); + context.sendStickyBroadcast(intent); + } + boolean qch_hotspot_forbid_on = JGYUtils.putInt(context.getContentResolver(), "qch_hotspot_forbid_on", setting_hotspot); + Log.e("SystemSetting", "qch_hotspot_forbid_on---------" + setting_hotspot); + Log.e("SystemSetting", "qch_hotspot_forbid_on---------" + qch_hotspot_forbid_on); + } catch (Exception e) { + Log.e(TAG, "setHotspot: " + e.getMessage()); + } + } + + private void setRestore(Context context, String jsonString) { + JSONObject jsonObject = JSON.parseObject(jsonString); + int mode = jsonObject.getInteger("qch_restore"); + boolean qch_restore_forbid_on = JGYUtils.putInt(context.getContentResolver(), "qch_restore_forbid_on", changeNum(mode)); + Log.e(TAG, "qch_restore_forbid_on:" + qch_restore_forbid_on); + } + + private void setBrowserInput(Context context, String jsonString) { + JSONObject jsonObject = JSON.parseObject(jsonString); + int setting_browserInput = changeNum(jsonObject.getInteger("setting_browserInput")); + JGYUtils.putInt(context.getContentResolver(), "qch_Browser_input", setting_browserInput); + } + + private void setDeveloper(Context context, String jsonString) { + JSONObject jsonObject = JSON.parseObject(jsonString); + int dev_mode = changeNum(jsonObject.getInteger("dev_mode")); + Log.e(TAG, "getDeveloper: " + dev_mode); + if (!DeviceManager.isDebugMode()) { + JGYUtils.putInt(context.getContentResolver(), "qch_Developeroptions", dev_mode); + if (dev_mode == 1) { + Intent intent = new Intent(); + intent.setAction("qch_developeroptions_close"); + intent.setPackage("com.android.settings"); + context.sendBroadcast(intent); + Log.e(TAG, "getDeveloper: " + "关闭开发者模式"); + ToastUtil.debugShow("关闭开发者模式"); + } else { + Log.e(TAG, "getDeveloper: " + "打开开发者模式"); + ToastUtil.debugShow("打开开发者模式"); + } + } + } + + private void cleanAppCache(Context context, String jsonString) { + JSONObject jsonObject = JSON.parseObject(jsonString); + String pkg = jsonObject.getString("package"); + if (TextUtils.isEmpty(pkg)) { + Log.e(TAG, "cleanAppCache: pkg is null"); + return; + } + try { + new CacheUtils().cleanApplicationUserData(context, pkg); + } catch (Exception e) { + e.printStackTrace(); + Log.e(TAG, "cleanAppCache: " + e.getMessage()); + } + } + + private void hideDesktopIcon(Context context) { + HTTPInterface.getSystemSettings(context); + } + + private void searchTopic(Context context, String jsonString) { + Log.e(TAG, "searchTopic: " + jsonString); + JSONObject jsonObject = JSON.parseObject(jsonString); + int search_topic = jsonObject.getInteger("search_topic"); + SPUtils.put(context, "search_topic", search_topic); + JGYUtils.updateForbidList(context); + } + +} diff --git a/app/src/main/java/com/info/sn/service/GuardService.java b/app/src/main/java/com/info/sn/service/GuardService.java index 0d96bc8..4a4bf49 100644 --- a/app/src/main/java/com/info/sn/service/GuardService.java +++ b/app/src/main/java/com/info/sn/service/GuardService.java @@ -13,11 +13,11 @@ import android.content.Context; import android.content.Intent; import android.content.ServiceConnection; import android.os.IBinder; +import android.util.Log; import androidx.annotation.Nullable; import com.info.sn.KeepAliveConnection; -import com.info.sn.utils.LogUtils; import com.info.sn.utils.ServiceAliveUtils; @@ -32,8 +32,8 @@ public class GuardService extends Service { private ServiceConnection mServiceConnection = new ServiceConnection() { @Override public void onServiceConnected(ComponentName componentName, IBinder iBinder) { - LogUtils.e(TAG, "GuardService:建立链接"); - boolean isServiceRunning = ServiceAliveUtils.isServiceAlice(getClass().getName()); + Log.e(TAG, "GuardService:建立链接"); + boolean isServiceRunning = ServiceAliveUtils.isServiceAlice(GuardService.this, getClass().getName()); if (!isServiceRunning) { Intent i = new Intent(GuardService.this, MyDownloadService.class); startService(i); @@ -62,6 +62,5 @@ public class GuardService extends Service { bindService(new Intent(this, StepService.class), mServiceConnection, Context.BIND_IMPORTANT); return START_STICKY; } - } diff --git a/app/src/main/java/com/info/sn/service/InitJpushServer.java b/app/src/main/java/com/info/sn/service/InitJpushServer.java deleted file mode 100644 index 3e8dceb..0000000 --- a/app/src/main/java/com/info/sn/service/InitJpushServer.java +++ /dev/null @@ -1,335 +0,0 @@ -package com.info.sn.service; - -import android.app.Service; -import android.content.BroadcastReceiver; -import android.content.Context; -import android.content.Intent; -import android.content.IntentFilter; -import android.graphics.Color; -import android.graphics.PixelFormat; -import android.os.Build; -import android.os.IBinder; -import android.provider.Settings; -import android.text.TextUtils; -import android.util.DisplayMetrics; -import android.util.Log; -import android.view.LayoutInflater; -import android.view.View; -import android.view.ViewGroup; -import android.view.WindowManager; -import android.widget.Button; -import android.widget.TextView; - -import com.alibaba.fastjson.JSON; -import com.alibaba.fastjson.JSONObject; -import com.info.sn.KeepAliveConnection; -import com.info.sn.R; -import com.info.sn.bean.BaseResponse; -import com.info.sn.network.HTTPInterface; -import com.info.sn.network.NetWorkManager; -import com.info.sn.network.api.ScreenLock; -import com.info.sn.utils.SPUtils; -import com.info.sn.utils.TimeUtils; -import com.info.sn.utils.Utils; - -import cn.jpush.android.api.JPushInterface; -import io.reactivex.Observer; -import io.reactivex.android.schedulers.AndroidSchedulers; -import io.reactivex.disposables.Disposable; -import io.reactivex.schedulers.Schedulers; - -public class InitJpushServer extends Service { - public InitJpushServer() { - - } - - @Override - public IBinder onBind(Intent intent) { - // TODO: Return the communication channel to the service. -// throw new UnsupportedOperationException("Not yet implemented"); - return new KeepAliveConnection.Stub() { - }; - } - - - @Override - public void onCreate() { - super.onCreate(); - registReceiver(); - registerTimeReceiver(); - } - - @Override - public void onDestroy() { - super.onDestroy(); - if (null != mTimeChangedReceiver) { - unregisterReceiver(mTimeChangedReceiver); - } - if (null != lockScreenReceiver) { - unregisterReceiver(lockScreenReceiver); - } - } - - @Override - public int onStartCommand(Intent intent, int flags, int startId) { - JPushInterface.init(this); -// HTTPInterface.checkDevicesInfo(InitJpushServer.this); - HTTPInterface.getAllappPackage(InitJpushServer.this); - HTTPInterface.getForceInstall(InitJpushServer.this); - HTTPInterface.checkUpdate(InitJpushServer.this); - HTTPInterface.checkUpdate(InitJpushServer.this, "com.appstore.uiui"); - getScreenLockState(); - HTTPInterface.getTimeControl(InitJpushServer.this); - return START_STICKY; - } - - private void getScreenLockState() { - ScreenLock getScreenLock = NetWorkManager.getScreenLockControl(); - getScreenLock.getScreenshot(Utils.getSerial()) - .subscribeOn(Schedulers.io()) - .observeOn(AndroidSchedulers.mainThread()) - .subscribe(new Observer() { - @Override - public void onSubscribe(Disposable d) { - - } - - @Override - public void onNext(BaseResponse baseResponse) { - int code = baseResponse.code; - if (code == 200) { - JSONObject jsonObject = (JSONObject) JSON.toJSON(baseResponse.data); - int is_screen_lock = jsonObject.getInteger("is_screen_lock"); - if (is_screen_lock == 1) { - if (!timelocked) { - showFloatingWindow("屏幕已锁定"); - } - screenlocked = true; - SPUtils.put(InitJpushServer.this, LOCK_STATE, 1); - } else { - if (!timelocked) { - hideFloatingWindow(); - } - screenlocked = false; - SPUtils.put(InitJpushServer.this, LOCK_STATE, 0); - } - } else { - if (!timelocked) { - hideFloatingWindow(); - } - screenlocked = false; - SPUtils.put(InitJpushServer.this, LOCK_STATE, 0); - } - } - - @Override - public void onError(Throwable e) { - Log.e("getScreenLockState", "onError: " + e.getMessage()); - int is_screen_lock = (int) SPUtils.get(InitJpushServer.this, LOCK_STATE, 0); - if (is_screen_lock == 1) { - if (!timelocked) { - showFloatingWindow("屏幕已锁定"); - } - screenlocked = true; - } else { - if (!timelocked) { - hideFloatingWindow(); - } - screenlocked = false; - } - } - - @Override - public void onComplete() { - - } - }); - - - } - - - private static WindowManager windowManager; - private View topView; - boolean screenlocked = false; - boolean timelocked = false; - - private static final String LOCK_STATE = "SCRENN_LOOCKED_STATE"; - - private void showFloatingWindow(String name) { - if (Settings.canDrawOverlays(this)) { - // 获取WindowManager服务 - if (null == windowManager) { - windowManager = (WindowManager) getSystemService(WINDOW_SERVICE); - } - DisplayMetrics dm = new DisplayMetrics(); - windowManager.getDefaultDisplay().getRealMetrics(dm); - int width = dm.widthPixels; // 屏幕宽度(像素) - int height = dm.heightPixels; // 屏幕高度(像素) - // 新建悬浮窗控件 - final Button button = new Button(getApplicationContext()); - button.setText("霸屏测试"); - button.setAlpha(0.9f); - button.setBackgroundColor(Color.WHITE); - button.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { -// windowManager.removeView(button); - } - }); - if (null == topView) { - topView = LayoutInflater.from(getApplicationContext()).inflate(R.layout.activity_screen_lock, null); - TextView textView = topView.findViewById(R.id.textView); - textView.setText(name); - } else { - if (topView.getTag().equals("added")) { - TextView textView = topView.findViewById(R.id.textView); - textView.setText(name); - return; - } - } -// topView.setAlpha(0.8f); - // 设置LayoutParam - WindowManager.LayoutParams layoutParams = new WindowManager.LayoutParams(); - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { - layoutParams.type = WindowManager.LayoutParams.TYPE_KEYGUARD_DIALOG; - //TYPE_SYSTEM_OVERLAY可以下滑通知栏 -// layoutParams.type = WindowManager.LayoutParams.TYPE_SYSTEM_OVERLAY; - } else { - layoutParams.type = WindowManager.LayoutParams.TYPE_PHONE; - } - layoutParams.flags |= WindowManager.LayoutParams.FLAG_BLUR_BEHIND - | WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED - | WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN; - layoutParams.format = PixelFormat.RGBA_8888; - layoutParams.width = ViewGroup.LayoutParams.MATCH_PARENT; - layoutParams.height = ViewGroup.LayoutParams.MATCH_PARENT; - //systemUiVisibility 关闭通知栏和导航栏 - layoutParams.systemUiVisibility = - View.SYSTEM_UI_FLAG_HIDE_NAVIGATION - | View.SYSTEM_UI_FLAG_IMMERSIVE - | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN; - layoutParams.x = 0; - layoutParams.y = 0; - // 将悬浮窗控件添加到WindowManager - windowManager.addView(topView, layoutParams); - topView.setTag("added"); - } - } - - private void hideFloatingWindow() { - if (null == windowManager) { - return; - } - if (null != topView) { - windowManager.removeView(topView); - topView = null; - } - } - - private LockScreenReceiver lockScreenReceiver; - - private void registReceiver() { - if (null == lockScreenReceiver) { - lockScreenReceiver = new LockScreenReceiver(); - IntentFilter filter = new IntentFilter(); - filter.setPriority(IntentFilter.SYSTEM_HIGH_PRIORITY); - filter.addAction(LockScreenReceiver.ACTION_LOCK); - filter.addAction(LockScreenReceiver.ACTION_UNLOCK); - registerReceiver(lockScreenReceiver, filter); - } - - } - - public class LockScreenReceiver extends BroadcastReceiver { - public static final String ACTION_LOCK = "LockScreenReceiver_lockscreen"; - public static final String ACTION_UNLOCK = "LockScreenReceiver_unlockscreen"; - - @Override - public void onReceive(Context context, Intent intent) { - String action = intent.getAction(); - if (TextUtils.isEmpty(action)) { - getScreenLockState(); - return; - } - if (ACTION_LOCK.equals(action)) { -// String name = intent.getStringExtra("name"); - String name = "屏幕已锁定"; - if (!timelocked) { - showFloatingWindow(name); - } - screenlocked = true; - } else if (ACTION_UNLOCK.equals(action)) { - if (!timelocked) { - hideFloatingWindow(); - } - screenlocked = false; - } - } - } - - - private TimeChangedReceiver mTimeChangedReceiver; - - //监听时间和日期变化 - public void registerTimeReceiver() { - mTimeChangedReceiver = new TimeChangedReceiver(); - IntentFilter filter = new IntentFilter(); - filter.setPriority(IntentFilter.SYSTEM_HIGH_PRIORITY); - filter.addAction(Intent.ACTION_DATE_CHANGED); - filter.addAction(Intent.ACTION_TIME_CHANGED); - filter.addAction(Intent.ACTION_TIMEZONE_CHANGED); - filter.addAction(Intent.ACTION_TIME_TICK); - filter.addAction(TimeChangedReceiver.ACTION_UPDATE); - registerReceiver(mTimeChangedReceiver, filter); - } - - public class TimeChangedReceiver extends BroadcastReceiver { - public static final String ACTION_UPDATE = "TimeChangedReceiver_update"; - - @Override - public void onReceive(Context context, Intent intent) { - if (Intent.ACTION_DATE_CHANGED.equals(intent.getAction())) { - Log.e("fht", "TimeChangedReceiver:" + "data changed"); - } else if (Intent.ACTION_TIME_CHANGED.equals(intent.getAction())) { - Log.e("fht", "TimeChangedReceiver:" + "time changed"); - } else if (Intent.ACTION_TIMEZONE_CHANGED.equals(intent.getAction())) { - Log.e("fht", "TimeChangedReceiver:" + "timezone changed"); - } else if (Intent.ACTION_TIME_TICK.equals(intent.getAction())) { - Log.e("fht", "TimeChangedReceiver:" + "time tick"); - } else if (ACTION_UPDATE.equals(intent.getAction())) { - Log.e("fht", "TimeChangedReceiver:" + "date update"); - } - long nowTime = System.currentTimeMillis(); - TimeUtils.ContralTime contralTime = TimeUtils.getDefaltContralTime(InitJpushServer.this); - if (null != contralTime) { - if (contralTime.inControlTime(nowTime)) { - if (!screenlocked) { - showFloatingWindow("管控时间:" + contralTime.toString()); - } else { - TextView textView = topView.findViewById(R.id.textView); - textView.setText("管控时间:" + contralTime.toString()); - } - timelocked = true; - } else { - getScreenLockState(); - if (!screenlocked) { - hideFloatingWindow(); - } - timelocked = false; - } - } else { - if (!screenlocked) { - hideFloatingWindow(); - } - getScreenLockState(); - timelocked = false; - } -// String packages = ForegroundAppUtil.getForegroundPackageName(context); -// if (!packages.equals("com.estrongs.android.pop")) { -// ApkUtils.openApp(context, "com.estrongs.android.pop"); -// } -// Log.e("TimeChangedReceiver", "packages:" + packages); - } - } -} diff --git a/app/src/main/java/com/info/sn/service/MainService.java b/app/src/main/java/com/info/sn/service/MainService.java new file mode 100644 index 0000000..1d21520 --- /dev/null +++ b/app/src/main/java/com/info/sn/service/MainService.java @@ -0,0 +1,305 @@ +package com.info.sn.service; + +import android.app.Service; +import android.content.Intent; +import android.content.pm.PackageManager; +import android.graphics.Bitmap; +import android.os.IBinder; +import android.os.SystemClock; +import android.util.Log; + +import com.blankj.utilcode.util.NetworkUtils; +import com.info.sn.activity.main.MainActivity; +import com.info.sn.activity.main.MainContact; +import com.info.sn.activity.main.MainPresenter; +import com.info.sn.bean.zuoye.BaseResponse; +import com.info.sn.bean.zuoye.UserInfo; +import com.info.sn.bean.gankao.AvailableProduct; +import com.info.sn.jpush.TagAliasOperatorHelper; +import com.info.sn.manager.ControlManager; +import com.info.sn.network.HTTPInterface; +import com.info.sn.utils.SPUtils; +import com.info.sn.utils.ToastUtil; +import com.info.sn.utils.Utils; +import com.trello.rxlifecycle2.LifecycleProvider; +import com.trello.rxlifecycle2.LifecycleTransformer; +import com.trello.rxlifecycle2.RxLifecycle; +import com.trello.rxlifecycle2.android.ActivityEvent; +import com.trello.rxlifecycle2.android.RxLifecycleAndroid; + +import java.util.List; +import java.util.concurrent.TimeUnit; + +import cn.jpush.android.api.JPushInterface; +import io.reactivex.Observable; +import io.reactivex.ObservableEmitter; +import io.reactivex.ObservableOnSubscribe; +import io.reactivex.Observer; +import io.reactivex.disposables.Disposable; +import io.reactivex.subjects.BehaviorSubject; + +import static com.info.sn.jpush.TagAliasOperatorHelper.ACTION_SET; +import static com.info.sn.jpush.TagAliasOperatorHelper.sequence; + +/** + * @author jgy02 + */ +public class MainService extends Service implements MainContact.MainView, NetworkUtils.OnNetworkStatusChangedListener, LifecycleProvider { + private String TAG = MainService.class.getSimpleName(); + private Start start; + private MainPresenter mPresenter = new MainPresenter(this); + + //执行所有请求的时间 + long runningTime = 0; + + //MainService上次执行时间 + long startCommandTime = 0; + + private final BehaviorSubject lifecycleSubject = BehaviorSubject.create(); + + @Override + public Observable lifecycle() { + return lifecycleSubject.hide(); + } + + @Override + public LifecycleTransformer bindUntilEvent(ActivityEvent event) { + return RxLifecycle.bindUntilEvent(lifecycleSubject, event); + } + + @Override + public LifecycleTransformer bindToLifecycle() { + return RxLifecycleAndroid.bindActivity(lifecycleSubject); + } + + private interface Start { + void onstar(long time); + } + + private ObservableOnSubscribe subscribe = new ObservableOnSubscribe() { + @Override + public void subscribe(ObservableEmitter emitter) throws Exception { + start = new Start() { + @Override + public void onstar(long time) { + emitter.onNext(time); + } + }; + } + }; + + private Observer timeObserver = new Observer() { + + @Override + public void onSubscribe(Disposable d) { + + } + + @Override + public void onNext(Long aLong) { + Log.e("TimeObserver", "onNext: $aLong"); + startCommandTime = runningTime = SystemClock.elapsedRealtime(); + mPresenter.checkUpdate(); + mPresenter.initAmap(); + mPresenter.getUserInfo(); + HTTPInterface.sendAppUsed(MainService.this); + HTTPInterface.sendRunningApp(MainService.this); + HTTPInterface.getAPPinfo(MainService.this); + startService(); + setAlias(); + } + + @Override + public void onError(Throwable e) { + + } + + @Override + public void onComplete() { + + } + }; + + @Override + public IBinder onBind(Intent intent) { + return null; + } + + @Override + public void onCreate() { + super.onCreate(); + lifecycleSubject.onNext(ActivityEvent.CREATE); + JPushInterface.init(this); + mPresenter.setProvider(this); + mPresenter.attachView(this); + NetworkUtils.registerNetworkStatusChangedListener(this); + Observable.create(subscribe) + .throttleFirst(60, TimeUnit.SECONDS) + .subscribe(timeObserver); + PackageManager packageManager = getPackageManager(); + try { +// packageManager.setApplicationEnabledSetting("com.jiaoguanyi.appstore", PackageManager.COMPONENT_ENABLED_STATE_DISABLED, 0) +// packageManager.setApplicationEnabledSetting("com.jiaoguanyi.store", PackageManager.COMPONENT_ENABLED_STATE_DISABLED, 0) + } catch (Exception e) { + Log.e(TAG, "onCreate: " + e.getMessage()); + } + ControlManager.getInstance().setDefaultUSBstate(); + } + + @Override + public int onStartCommand(Intent intent, int flags, int startId) { + JPushInterface.init(this); + if (MainActivity.isForeground) { + Log.e(TAG, "onStartCommand: MainActivity: isForeground: " + MainActivity.isForeground); + } else { + JPushInterface.init(this); + start.onstar(startCommandTime); + Log.e(TAG, "onStartCommand: " + (SystemClock.elapsedRealtime() - startCommandTime) + "ms"); + } + return START_STICKY; + } + + @Override + public void onDestroy() { + super.onDestroy(); + lifecycleSubject.onNext(ActivityEvent.DESTROY); + NetworkUtils.unregisterNetworkStatusChangedListener(this); + mPresenter.detachView(); + } + + @Override + public void onDisconnected() { + Log.e(TAG, "网络未连接"); + ToastUtil.show("网络未连接"); + } + + @Override + public void onConnected(NetworkUtils.NetworkType networkType) { + Log.e(TAG, "网络已连接"); + ToastUtil.show("网络已连接"); + Log.e(TAG, "onConnected: wifi ssid = " + Utils.getWifiSSID(this)); + SPUtils.put(this, "wifi_last_connect_time", System.currentTimeMillis()); + mPresenter.checkUpdate(); + } + + private void startService() { + startService(new Intent(this, GuardService.class)); + startService(new Intent(this, StepService.class)); + startService(new Intent(this, MyDownloadService.class)); + } + + private void setAlias() { + TagAliasOperatorHelper.TagAliasBean tagAliasBean = new TagAliasOperatorHelper.TagAliasBean(); + tagAliasBean.action = ACTION_SET; + sequence++; + tagAliasBean.alias = Utils.getSerial(); + tagAliasBean.isAliasAction = true; + TagAliasOperatorHelper.getInstance().handleAction(MainService.this, TagAliasOperatorHelper.sequence, tagAliasBean); + } + + @Override + public void checkSNFinish(int code) { + + } + + @Override + public void setGankaoUID(String gankaoUID) { + + } + + @Override + public void setAvailableProduct(List availableProductList) { + + } + + @Override + public void activeUser(int code) { + + } + + @Override + public void setQRCode(Bitmap bitmap) { + + } + + @Override + public void setInfo(BaseResponse response) { + int code = response.code; + if (code == 200) { + mPresenter.getLocked(); + } + + } + + @Override + public void setUserInfo() { + + } + + @Override + public void setLocked(int lockedStatus) { + switch (lockedStatus) { + case 0: + ControlManager.getInstance().setDisableSetting(); + break; + case 1: + break; + case 2: + ControlManager.getInstance().setDisableSetting(); + break; + default: + break; + } + mPresenter.checkUpdate(); + } + + @Override + public void onLocationChanged() { + HTTPInterface.updateAdminInfo(this); + } + + @Override + public void checkUpdateFinish() { + mPresenter.getAllApp(); + } + + @Override + public void getAllAppFinish() { + mPresenter.getAppInside(); + } + + @Override + public void setAppInside() { + mPresenter.getForceInstall(); + } + + @Override + public void setForceInstall() { + mPresenter.getSystemSettings(); + } + + @Override + public void setSystemSettings() { + mPresenter.getBrowserLabel(); + } + + @Override + public void setBrowserLabel() { + mPresenter.getBrowserWhiteList(); + } + + @Override + public void setBrowserWhiteList() { + mPresenter.getAppStart(); + } + + @Override + public void setAppStart() { + mPresenter.getTimeControl(); + } + + @Override + public void setTimeControl() { + + } +} diff --git a/app/src/main/java/com/info/sn/service/ManagerService.java b/app/src/main/java/com/info/sn/service/ManagerService.java new file mode 100644 index 0000000..d08d351 --- /dev/null +++ b/app/src/main/java/com/info/sn/service/ManagerService.java @@ -0,0 +1,461 @@ +package com.info.sn.service; + +import android.app.Service; +import android.content.BroadcastReceiver; +import android.content.Context; +import android.content.Intent; +import android.content.IntentFilter; +import android.graphics.Color; +import android.graphics.PixelFormat; +import android.os.Build; +import android.os.IBinder; +import android.provider.Settings; +import android.text.TextUtils; +import android.util.DisplayMetrics; +import android.util.Log; +import android.view.LayoutInflater; +import android.view.View; +import android.view.WindowManager; +import android.widget.Button; +import android.widget.TextView; + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; +import com.info.sn.R; +import com.info.sn.bean.zuoye.BaseResponse; +import com.info.sn.manager.ControlManager; +import com.info.sn.manager.NetInterfaceManager; +import com.info.sn.network.HTTPInterface; +import com.info.sn.receiver.APKinstallReceiver; +import com.info.sn.receiver.BootReceiver; +import com.info.sn.utils.SPUtils; +import com.info.sn.utils.TimeUtils; +import com.info.sn.utils.Utils; + +import io.reactivex.Observer; +import io.reactivex.android.schedulers.AndroidSchedulers; +import io.reactivex.disposables.Disposable; +import io.reactivex.schedulers.Schedulers; + + +/** + * @author jgy02 + */ +public class ManagerService extends Service { + private String TAG = ManagerService.class.getSimpleName(); + + public static String ACTION_LOCK = "LockScreenReceiver_lockscreen"; + public static String ACTION_UNLOCK = "LockScreenReceiver_unlockscreen"; + public static String ACTION_UPDATE = "TimeChangedReceiver_update"; + private WindowManager windowManager; + private View topView; + private boolean screenlocked = false; + private boolean timelocked = false; + + @Override + public IBinder onBind(Intent intent) { + return null; + } + + @Override + public void onCreate() { + super.onCreate(); + registLockReceiver(); + registerTimeReceiver(); + registerScreenLockReceiver(); + registAppReceive(); + registBootReceive(); + registerBatteryReceiver(); + setFloatingWindow(); + } + + @Override + public int onStartCommand(Intent intent, int flags, int startId) { + HTTPInterface.checkUpdate(this); + HTTPInterface.checkUpdate(this, "com.appstore.uiui"); + return START_STICKY; + } + + private void getScreenLockState() { + NetInterfaceManager.getInstance() + .getScreenLockControl() + .getScreenshot(Utils.getSerial()) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new Observer() { + @Override + public void onSubscribe(Disposable d) { + Log.e("getScreenLockState", "onSubscribe: "); + } + + @Override + public void onNext(BaseResponse baseResponse) { + Log.e("getScreenLockState", "onNext: "); + int code = baseResponse.code; + if (code == 200) { + JSONObject jsonObject = JSON.parseObject(JSON.toJSONString(baseResponse.data)); + int is_screen_lock = jsonObject.getInteger("is_screen_lock"); + if (is_screen_lock == 1) { + if (!timelocked) { + showFloatingWindow("屏幕已锁定"); + } + screenlocked = true; + SPUtils.put(ManagerService.this, LOCK_STATE, 1); + } else { + if (!timelocked) { + hideFloatingWindow(); + } + screenlocked = false; + SPUtils.put(ManagerService.this, LOCK_STATE, 0); + } + } else { + if (!timelocked) { + hideFloatingWindow(); + } + screenlocked = false; + SPUtils.put(ManagerService.this, LOCK_STATE, 0); + } + } + + @Override + public void onError(Throwable e) { + Log.e("getScreenLockState", "onError: "); + } + + @Override + public void onComplete() { + Log.e("getScreenLockState", "onComplete: "); + } + }); + } + + private static String LOCK_STATE = "SCRENN_LOOCKED_STATE"; + + private void showFloatingWindow(String name) { + if (Settings.canDrawOverlays(this)) { + // 获取WindowManager服务 + if (null == windowManager) { + windowManager = (WindowManager) getSystemService(WINDOW_SERVICE); + } + DisplayMetrics dm = new DisplayMetrics(); + windowManager.getDefaultDisplay().getRealMetrics(dm); + int width = dm.widthPixels; // 屏幕宽度(像素) + int height = dm.heightPixels; // 屏幕高度(像素) + // 新建悬浮窗控件 + final Button button = new Button(getApplicationContext()); + button.setText("霸屏测试"); + button.setAlpha(0.9f); + button.setBackgroundColor(Color.BLACK); + button.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { +// windowManager.removeView(button); + } + }); + if (null == topView) { + topView = LayoutInflater.from(getApplicationContext()).inflate(R.layout.activity_screen_lock, null); + TextView textView = topView.findViewById(R.id.textView); + textView.setText(name); + } else { + if ("added".equals(topView.getTag())) { + TextView textView = topView.findViewById(R.id.textView); + textView.setText(name); + return; + } + } + // topView.setAlpha(0.8f); + // 设置LayoutParam + WindowManager.LayoutParams layoutParams = new WindowManager.LayoutParams(); + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { + layoutParams.type = WindowManager.LayoutParams.TYPE_KEYGUARD_DIALOG; + //TYPE_SYSTEM_OVERLAY可以下滑通知栏 +// layoutParams.type = WindowManager.LayoutParams.TYPE_SYSTEM_OVERLAY; + } else { + layoutParams.type = WindowManager.LayoutParams.TYPE_PHONE; + } + layoutParams.flags |= WindowManager.LayoutParams.FLAG_BLUR_BEHIND + | WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED + | WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN; + layoutParams.format = PixelFormat.RGBA_8888; + layoutParams.width = WindowManager.LayoutParams.MATCH_PARENT; + layoutParams.height = WindowManager.LayoutParams.MATCH_PARENT; + //systemUiVisibility 关闭通知栏和导航栏 + layoutParams.systemUiVisibility = + View.SYSTEM_UI_FLAG_HIDE_NAVIGATION + | View.SYSTEM_UI_FLAG_IMMERSIVE + | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN; + layoutParams.x = 0; + layoutParams.y = 0; + // 将悬浮窗控件添加到WindowManager + windowManager.addView(topView, layoutParams); + topView.setTag("added"); + } + } + + private void hideFloatingWindow() { + if (null == windowManager) { + return; + } + if (null != topView) { + windowManager.removeView(topView); + topView = null; + } + } + + private LockScreenReceiver lockScreenReceiver; + + private void registLockReceiver() { + if (null == lockScreenReceiver) { + lockScreenReceiver = new LockScreenReceiver(); + IntentFilter filter = new IntentFilter(); + filter.setPriority(IntentFilter.SYSTEM_HIGH_PRIORITY); + filter.addAction(ACTION_LOCK); + filter.addAction(ACTION_UNLOCK); + registerReceiver(lockScreenReceiver, filter); + } + } + + private class LockScreenReceiver extends BroadcastReceiver { + @Override + public void onReceive(Context context, Intent intent) { + String action = intent.getAction(); + if (TextUtils.isEmpty(action)) { + getScreenLockState(); + return; + } + if (ACTION_LOCK == action) { +// String name = intent.getStringExtra("name"); + String name = "屏幕已锁定"; + if (!timelocked) { + showFloatingWindow(name); + } + screenlocked = true; + } else if (ACTION_UNLOCK == action) { + if (!timelocked) { + hideFloatingWindow(); + } + screenlocked = false; + } + } + } + + private TimeChangedReceiver mTimeChangedReceiver; + + /** + * 监听时间和日期变化 + */ + private void registerTimeReceiver() { + mTimeChangedReceiver = new TimeChangedReceiver(); + IntentFilter filter = new IntentFilter(); + filter.setPriority(IntentFilter.SYSTEM_HIGH_PRIORITY); + filter.addAction(Intent.ACTION_DATE_CHANGED); + filter.addAction(Intent.ACTION_TIME_CHANGED); + filter.addAction(Intent.ACTION_TIMEZONE_CHANGED); + filter.addAction(Intent.ACTION_TIME_TICK); + filter.addAction(ACTION_UPDATE); + registerReceiver(mTimeChangedReceiver, filter); + } + + private class TimeChangedReceiver extends BroadcastReceiver { + @Override + public void onReceive(Context context, Intent intent) { + String action = intent.getAction(); + if (Intent.ACTION_DATE_CHANGED.equals(action)) { + Log.e(TAG, "TimeChangedReceiver:" + "data changed"); + } else if (Intent.ACTION_TIME_CHANGED.equals(action)) { + Log.e(TAG, "TimeChangedReceiver:" + "time changed"); + } else if (Intent.ACTION_TIMEZONE_CHANGED.equals(action)) { + Log.e(TAG, "TimeChangedReceiver:" + "timezone changed"); + } else if (Intent.ACTION_TIME_TICK.equals(action)) { + Log.e(TAG, "TimeChangedReceiver:" + "time tick"); + setFloatingWindow(); + } else if (ACTION_UPDATE.equals(action)) { + Log.e(TAG, "TimeChangedReceiver:" + "date update"); + setFloatingWindow(); + } + + // String packages = ForegroundAppUtil.getForegroundPackageName(context); +// if (!packages.equals("com.estrongs.android.pop")) { +// ApkUtils.openApp(context, "com.estrongs.android.pop"); +// } +// Log.e("TimeChangedReceiver", "packages:" + packages); + } + } + + private void setFloatingWindow() { + TimeUtils.ContralTime workingContralTime = TimeUtils.getWorkingDayContralTime(ManagerService.this); + TimeUtils.ContralTime weekContralTime = TimeUtils.getWeekDayContralTime(ManagerService.this); +// if (null != workingContralTime) { + if (TimeUtils.inContralTime(workingContralTime, weekContralTime)) { + if (!screenlocked) { + showFloatingWindow("管控时间:\n" + TimeUtils.getNowTimeString(ManagerService.this)); + } else { + TextView textView = topView.findViewById(R.id.textView); + textView.setText("管控时间:\n" + TimeUtils.getNowTimeString(ManagerService.this)); + } + timelocked = true; + } else { + getScreenLockState(); + if (!screenlocked) { + hideFloatingWindow(); + } + timelocked = false; + } +// } else { +// if (!screenlocked) { +// hideFloatingWindow() +// } +// getScreenLockState() +// timelocked = false +// } + } + + private ScreenLockReceiver screenLockReceiver; + + private void registerScreenLockReceiver() { + if (null == screenLockReceiver) { + screenLockReceiver = new ScreenLockReceiver(); + } + IntentFilter filter = new IntentFilter(); + filter.addAction(Intent.ACTION_SCREEN_OFF); + filter.addAction(Intent.ACTION_SCREEN_ON); + filter.addAction(Intent.ACTION_USER_PRESENT); + registerReceiver(screenLockReceiver, filter); + } + + private class ScreenLockReceiver extends BroadcastReceiver { + @Override + public void onReceive(Context context, Intent intent) { + String action = intent.getAction(); + Log.e(TAG, "onReceive:" + action); + if (TextUtils.isEmpty(action)) { + Log.e(TAG, "onReceive: is NULL"); + return; + } + switch (action) { + case Intent.ACTION_USER_PRESENT: + break; + case Intent.ACTION_SCREEN_ON: + sendScreenState(1); + break; + case Intent.ACTION_SCREEN_OFF: + sendScreenState(0); + break; + default: + break; + } + } + } + + + private void sendScreenState(int stateCode) { + Log.e(TAG, "sendScreenState: code:" + stateCode); + Log.e(TAG, "sendScreenState: sn: " + Utils.getSerial()); + NetInterfaceManager.getInstance().setScreen() + .setScreenState(Utils.getSerial(), stateCode) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new Observer() { + @Override + public void onSubscribe(Disposable d) { + Log.e("sendScreenState", "onSubscribe: "); + } + + @Override + public void onNext(BaseResponse baseResponse) { + Log.e("sendScreenState", "onNext: " + baseResponse.msg); + } + + @Override + public void onError(Throwable e) { + Log.e("sendScreenState", "onError: " + e.getMessage()); + } + + @Override + public void onComplete() { + Log.e("sendScreenState", "onComplete: "); + } + }); + } + + private APKinstallReceiver apKinstallReceiver; + + private void registAppReceive() { + if (null == apKinstallReceiver) { + apKinstallReceiver = new APKinstallReceiver(); + } + IntentFilter filter = new IntentFilter(); + filter.setPriority(IntentFilter.SYSTEM_HIGH_PRIORITY); + filter.addAction(Intent.ACTION_PACKAGE_ADDED); + filter.addAction(Intent.ACTION_PACKAGE_REPLACED); + filter.addAction(Intent.ACTION_PACKAGE_REMOVED); + filter.addDataScheme("package"); + registerReceiver(apKinstallReceiver, filter); + } + + private BootReceiver bootReceiver; + + private void registBootReceive() { + if (null == bootReceiver) { + bootReceiver = new BootReceiver(); + IntentFilter filter = new IntentFilter(); + filter.setPriority(IntentFilter.SYSTEM_HIGH_PRIORITY); + filter.addAction(Intent.ACTION_USER_PRESENT); + registerReceiver(bootReceiver, filter); + } + } + + private BatteryReceiver batteryReceiver; + + private void registerBatteryReceiver() { + if (null == batteryReceiver) { + batteryReceiver = new BatteryReceiver(); + } + IntentFilter filter = new IntentFilter(); + filter.setPriority(IntentFilter.SYSTEM_HIGH_PRIORITY); + filter.addAction(Intent.ACTION_BATTERY_CHANGED); + filter.addAction(Intent.ACTION_BATTERY_LOW); + filter.addAction(Intent.ACTION_BATTERY_OKAY); + filter.addAction(Intent.ACTION_POWER_CONNECTED); + filter.addAction(Intent.ACTION_POWER_DISCONNECTED); + registerReceiver(batteryReceiver, filter); + } + + + private class BatteryReceiver extends BroadcastReceiver { + @Override + public void onReceive(Context context, Intent intent) { + String action = intent.getAction(); + if (Intent.ACTION_BATTERY_CHANGED.equals(action)) { + + } else if (Intent.ACTION_POWER_CONNECTED.equals(action) || Intent.ACTION_POWER_DISCONNECTED.equals(action)) { + ControlManager.getInstance().setDefaultUSBstate(); + } else if (Intent.ACTION_BATTERY_LOW.equals(action) || Intent.ACTION_BATTERY_OKAY.equals(action)) { + + } + } + } + + + @Override + public void onDestroy() { + super.onDestroy(); + if (null != mTimeChangedReceiver) { + unregisterReceiver(mTimeChangedReceiver); + } + if (null != lockScreenReceiver) { + unregisterReceiver(lockScreenReceiver); + } + if (null != screenLockReceiver) { + unregisterReceiver(screenLockReceiver); + } + if (null != apKinstallReceiver) { + unregisterReceiver(apKinstallReceiver); + } + if (null != bootReceiver) { + unregisterReceiver(bootReceiver); + } + } + + +} diff --git a/app/src/main/java/com/info/sn/service/MyDownloadService.java b/app/src/main/java/com/info/sn/service/MyDownloadService.java index 6b3faf7..ced25e4 100644 --- a/app/src/main/java/com/info/sn/service/MyDownloadService.java +++ b/app/src/main/java/com/info/sn/service/MyDownloadService.java @@ -23,7 +23,9 @@ import com.arialyy.aria.core.Aria; import com.arialyy.aria.core.task.DownloadTask; import com.info.sn.KeepAliveConnection; import com.info.sn.R; +import com.info.sn.activity.main.MainActivity; import com.info.sn.utils.ApkUtils; +import com.info.sn.utils.JGYUtils; import java.io.File; @@ -35,6 +37,8 @@ public class MyDownloadService extends Service { public int onStartCommand(Intent intent, int flags, int startId) { startService(new Intent(this, StepService.class)); startService(new Intent(this, GuardService.class)); + startService(new Intent(this, MainService.class)); + startService(new Intent(this, ManagerService.class)); CheckUpdate(); CheckUpdateByPackageName("com.appstore.uiui", handler); //静默升级应用市场 @@ -100,9 +104,9 @@ public class MyDownloadService extends Service { break; case 201: String apppackage = (String) msg.obj; - Log.e("handler", Settings.System.getString(getContentResolver(), "qch_app_forbid") + "?"); + Log.e("handler", JGYUtils.getString(getContentResolver(), "qch_app_forbid") + "?"); try { - Settings.System.putString(getContentResolver(), "qch_app_forbid", apppackage + "com.info.sn,com.android.uiuios,com.appstore.uiui,com.uiuios.updatetools"); + JGYUtils.putString(getContentResolver(), "qch_app_forbid", apppackage + "com.info.sn,com.android.uiuios,com.appstore.uiui,com.uiuios.updatetools"); } catch (Exception e) { Log.e("fht", e.getMessage()); } @@ -175,10 +179,9 @@ public class MyDownloadService extends Service { } } - //在这里处理任务执行中的状态,如进度进度条的刷新 @Download.onTaskRunning - protected void running(DownloadTask task) { + void running(DownloadTask task) { Log.e("aria running", "正在下载:" + task.getState() + "--" + task.getPercent() + "--" + task.getExtendField()); } @@ -188,7 +191,6 @@ public class MyDownloadService extends Service { ApkUtils.installApp(MyDownloadService.this, task.getFilePath()); Log.e("taskComplete", task.getExtendField()); Aria.download(this).load(task.getDownloadEntity().getId()).cancel(); - } } diff --git a/app/src/main/java/com/info/sn/service/RemoteService.java b/app/src/main/java/com/info/sn/service/RemoteService.java new file mode 100644 index 0000000..5d48e7b --- /dev/null +++ b/app/src/main/java/com/info/sn/service/RemoteService.java @@ -0,0 +1,79 @@ +package com.info.sn.service; + +import android.app.Service; +import android.content.Intent; +import android.os.IBinder; +import android.os.RemoteException; +import android.provider.Settings; +import android.text.TextUtils; +import android.util.Log; + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; +import com.google.gson.JsonObject; +import com.info.sn.IGetInfoInterface; +import com.info.sn.utils.JGYUtils; +import com.info.sn.utils.SPUtils; +import com.info.sn.utils.Utils; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +public class RemoteService extends Service { + private String TAG = RemoteService.class.getSimpleName(); + + public RemoteService() { + } + + @Override + public IBinder onBind(Intent intent) { + Log.e(TAG, "onBind: "); + return mBinde; + } + + @Override + public void onCreate() { + Log.e(TAG, "onCreate: "); + super.onCreate(); + } + + @Override + public int onStartCommand(Intent intent, int flags, int startId) { + Log.e(TAG, "onStartCommand: "); + return super.onStartCommand(intent, flags, startId); + } + + private IBinder mBinde = new IGetInfoInterface.Stub() { + @Override + public void basicTypes(int anInt, long aLong, boolean aBoolean, float aFloat, double aDouble, String aString) throws RemoteException { + + } + + @Override + public String getUserInfo() throws RemoteException { + String username = Settings.System.getString(getContentResolver(), "UserInfo_username"); + String avatar = Settings.System.getString(getContentResolver(), "UserInfo_avatar"); + String gread = Settings.System.getString(getContentResolver(), "UserInfo_grade"); + String gankaoUID = Settings.System.getString(getContentResolver(), "gankaoUID"); + JsonObject jsonObject = new JsonObject(); + jsonObject.addProperty("username", username); + jsonObject.addProperty("avatar", avatar); + jsonObject.addProperty("grade", gread); + jsonObject.addProperty("userid", gankaoUID); + jsonObject.addProperty("sn", Utils.getSerial()); + Log.e(TAG, "getUserInfo:" + jsonObject.toString()); + return jsonObject.toString(); + } + + @Override + public List getHideAPP() throws RemoteException { + return JGYUtils.getHideList(RemoteService.this); + } + + @Override + public List getForbidAPP() throws RemoteException { + return JGYUtils.getForbidList(RemoteService.this); + } + }; +} diff --git a/app/src/main/java/com/info/sn/service/ScreenLockService.java b/app/src/main/java/com/info/sn/service/ScreenLockService.java deleted file mode 100644 index 14b3e53..0000000 --- a/app/src/main/java/com/info/sn/service/ScreenLockService.java +++ /dev/null @@ -1,70 +0,0 @@ -package com.info.sn.service; - -import android.app.Service; -import android.content.BroadcastReceiver; -import android.content.Context; -import android.content.Intent; -import android.content.IntentFilter; -import android.os.IBinder; -import android.util.Log; - -import com.info.sn.activity.ScreenLockActivity; - -public class ScreenLockService extends Service { - - - public ScreenLockService() { - } - - @Override - public IBinder onBind(Intent intent) { - // TODO: Return the communication channel to the service. -// throw new UnsupportedOperationException("Not yet implemented"); - return null; - } - - @Override - public void onCreate() { - super.onCreate(); - registerScreenLockReceiver(); - } - - @Override - public int onStartCommand(Intent intent, int flags, int startId) { - - return START_STICKY; - } - - @Override - public void onDestroy() { - super.onDestroy(); - if (null != screenLockReceiver) { - unregisterReceiver(screenLockReceiver); - } - } - - private ScreenLockReceiver screenLockReceiver; - - public void registerScreenLockReceiver() { - if (null == screenLockReceiver) { - screenLockReceiver = new ScreenLockReceiver(); - } - IntentFilter filter = new IntentFilter(); - filter.addAction(Intent.ACTION_SCREEN_OFF); - filter.addAction(Intent.ACTION_USER_PRESENT); - registerReceiver(screenLockReceiver, filter); - } - - public static class ScreenLockReceiver extends BroadcastReceiver { - @Override - public void onReceive(Context context, Intent intent) { - String action = intent.getAction(); - Log.e("ScreenLockReceiver", "onReceive: "+action); - if (Intent.ACTION_SCREEN_OFF.equals(action)) { - Intent screenLock = new Intent(context, ScreenLockActivity.class); - screenLock.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS); -// context.startActivity(screenLock); - } - } - } -} diff --git a/app/src/main/java/com/info/sn/service/StepService.java b/app/src/main/java/com/info/sn/service/StepService.java index b33d006..61fb4ad 100644 --- a/app/src/main/java/com/info/sn/service/StepService.java +++ b/app/src/main/java/com/info/sn/service/StepService.java @@ -21,7 +21,6 @@ import androidx.annotation.Nullable; import com.info.sn.KeepAliveConnection; import com.info.sn.websocket.JWebSocketClient; -import com.info.sn.utils.LogUtils; import com.info.sn.utils.ServiceAliveUtils; import com.info.sn.utils.Utils; @@ -51,8 +50,8 @@ public class StepService extends Service { private ServiceConnection mServiceConnection = new ServiceConnection() { @Override public void onServiceConnected(ComponentName componentName, IBinder iBinder) { - LogUtils.e(TAG, "StepService:建立链接"); - boolean isServiceRunning = ServiceAliveUtils.isServiceAlice(getClass().getName()); + Log.e(TAG, "StepService:建立链接"); + boolean isServiceRunning = ServiceAliveUtils.isServiceAlice(StepService.this, getClass().getName()); if (!isServiceRunning) { Intent i = new Intent(StepService.this, MyDownloadService.class); startService(i); @@ -90,7 +89,7 @@ public class StepService extends Service { * 初始化websocket连接 */ private void initSocketClient() { - URI uri = URI.create("ws://47.107.116.173:2345"); + URI uri = URI.create("ws://39.108.116.195:2346"); // URI uri = URI.create("ws://echo.websocket.org"); // URI uri = URI.create("ws://123.207.136.134:9010/ajaxchattest"); client = new JWebSocketClient(uri) { diff --git a/app/src/main/java/com/info/sn/utils/amapUtils.java b/app/src/main/java/com/info/sn/utils/AmapUtils.java similarity index 97% rename from app/src/main/java/com/info/sn/utils/amapUtils.java rename to app/src/main/java/com/info/sn/utils/AmapUtils.java index ae9ab1b..a370c1a 100644 --- a/app/src/main/java/com/info/sn/utils/amapUtils.java +++ b/app/src/main/java/com/info/sn/utils/AmapUtils.java @@ -18,10 +18,10 @@ import java.util.Locale; * @创建时间: 2015年11月24日 上午11:46:50 * @项目名称: AMapLocationDemo2.x * @author hongming.wang - * @文件名称: amapUtils.java - * @类型名称: amapUtils + * @文件名称: AmapUtils.java + * @类型名称: AmapUtils */ -public class amapUtils { +public class AmapUtils { /** * 开始定位 */ diff --git a/app/src/main/java/com/info/sn/utils/ApkUtils.java b/app/src/main/java/com/info/sn/utils/ApkUtils.java index bbd0bce..fa2b71d 100644 --- a/app/src/main/java/com/info/sn/utils/ApkUtils.java +++ b/app/src/main/java/com/info/sn/utils/ApkUtils.java @@ -1,7 +1,11 @@ package com.info.sn.utils; +import android.annotation.SuppressLint; import android.app.Activity; +import android.app.ActivityManager; import android.app.PendingIntent; +import android.app.usage.UsageStats; +import android.app.usage.UsageStatsManager; import android.content.Context; import android.content.Intent; import android.content.pm.ApplicationInfo; @@ -36,13 +40,17 @@ import java.lang.reflect.Method; import java.util.ArrayList; import java.util.Arrays; import java.util.Enumeration; +import java.util.HashSet; import java.util.List; +import java.util.SortedMap; +import java.util.TreeMap; +import java.util.function.Predicate; import java.util.zip.ZipEntry; import java.util.zip.ZipFile; public class ApkUtils { - + private static String TAG = ApkUtils.class.getSimpleName(); public static synchronized boolean getRootAhth() { Process process = null; @@ -534,7 +542,7 @@ public class ApkUtils { update = versionCode > code; } catch (PackageManager.NameNotFoundException e) { e.printStackTrace(); -// LogUtils.e("NameNotFoundException", e.getMessage()); +// Log.e("NameNotFoundException", e.getMessage()); update = false; } return update; @@ -602,29 +610,29 @@ public class ApkUtils { int hide = 0; //后台0显示,1隐藏 try { - if (pkage.equalsIgnoreCase("com.mediatek.camera")) { - if (Settings.System.getInt(context.getContentResolver(), "qch_app_camera") == 1) { + if ("com.mediatek.camera".equalsIgnoreCase(pkage)) { + if (JGYUtils.getInt(context.getContentResolver(), "qch_app_camera") == 1) { hide = 1; } - } else if (pkage.equalsIgnoreCase("com.android.deskclock")) { - if (Settings.System.getInt(context.getContentResolver(), "qch_app_deskclock") == 1) { + } else if ("com.android.deskclock".equalsIgnoreCase(pkage)) { + if (JGYUtils.getInt(context.getContentResolver(), "qch_app_deskclock") == 1) { hide = 1; } - } else if (pkage.equalsIgnoreCase("com.android.soundrecorder")) { - if (Settings.System.getInt(context.getContentResolver(), "qch_app_soundrecorder") == 1) { + } else if ("com.android.soundrecorder".equalsIgnoreCase(pkage)) { + if (JGYUtils.getInt(context.getContentResolver(), "qch_app_soundrecorder") == 1) { hide = 1; } - } else if (pkage.equalsIgnoreCase("com.android.music")) { - if (Settings.System.getInt(context.getContentResolver(), "qch_app_music") == 1) { + } else if ("com.android.music".equalsIgnoreCase(pkage)) { + if (JGYUtils.getInt(context.getContentResolver(), "qch_app_music") == 1) { hide = 1; } - } else if (pkage.equalsIgnoreCase("com.android.gallery3d")) { - if (Settings.System.getInt(context.getContentResolver(), "qch_app_gallery") == 1) { + } else if ("com.android.gallery3d".equalsIgnoreCase(pkage)) { + if (JGYUtils.getInt(context.getContentResolver(), "qch_app_gallery") == 1) { hide = 1; } - } else if (pkage.equalsIgnoreCase("com.android.documentsui") - || pkage.equalsIgnoreCase("com.mediatek.filemanager")) { - if (Settings.System.getInt(context.getContentResolver(), "qch_app_filemanager") == 1) { + } else if ("com.android.documentsui".equalsIgnoreCase(pkage) + || "com.mediatek.filemanager".equalsIgnoreCase(pkage)) { + if (JGYUtils.getInt(context.getContentResolver(), "qch_app_filemanager") == 1) { hide = 1; } } @@ -661,75 +669,148 @@ public class ApkUtils { } } - public static void addShortcut(Context context, String packageList) { + public static void addShortcut(Context context) { + String packageList = (String) SPUtils.get(context, "only_jgy_shortcut_list", "Invalid"); if (TextUtils.isEmpty(packageList)) { + JGYUtils.putString(context.getContentResolver(), "qch_launcher_icon_app", ""); return; } + Log.e("addShortcut", "addShortcut: " + packageList); String[] stringList = packageList.split(","); - List packages = new ArrayList<>(Arrays.asList(stringList)); - String installedList = ""; + HashSet packages = new HashSet<>(Arrays.asList(stringList)); + String romapps = JGYUtils.getString(context.getContentResolver(), "jgy_customromapp"); + Log.e(TAG, "addShortcut: romapps: " + romapps); + HashSet appSet = new HashSet<>(); + if (!TextUtils.isEmpty(romapps)) { + appSet = new HashSet<>(Arrays.asList(romapps.split(","))); + packages.addAll(appSet); + } + packages.removeIf(new Predicate() { + @Override + public boolean test(String s) { + return TextUtils.isEmpty(s); + } + }); + StringBuilder installedListBuilder = new StringBuilder(); for (String s : packages) { - if (s.equals("com.jiaoguanyi.store") || s.equals("com.jiaoguanyi.appstore")) { + if ("com.jiaoguanyi.store".equals(s) || "com.jiaoguanyi.appstore".equals(s)) { continue; } + if (isSystemApp(context, s)) { + if (!appSet.contains(s)) { + continue; + } + } if (!ApkUtils.isAvailable(context, s)) { continue; } // ApkUtils.getStartActivityName(context, s); - if (!installedList.contains(s)) { - installedList += s + ","; - Log.e("addShortcut", s); + if (installedListBuilder.length() > 0) { + installedListBuilder.append(","); } + installedListBuilder.append(s); + Log.e("addShortcut", "packages: " + s); } - if (installedList.length() != 0) { - installedList = installedList.substring(0, installedList.length() - 1); - } else { - Log.e("addShortcut", installedList); - } - boolean qch_force_app = Settings.System.putString(context.getContentResolver(), "qch_launcher_icon_app", installedList); -// String old = Settings.System.getString(context.getContentResolver(), "qch_launcher_icon_app"); + String installedList = installedListBuilder.toString(); + boolean qch_force_app = JGYUtils.putString(context.getContentResolver(), "qch_launcher_icon_app", installedList); +// String old = JGYUtils.getString(context.getContentResolver(), "qch_launcher_icon_app"); // Log.e("addShortcut", old); + Log.e("addShortcut", "installedList:" + installedList); Log.e("addShortcut", "putstring:" + qch_force_app); } - + @SuppressLint("NewApi") public static void writeAppPackageList(Context context, String result) { - ApkUtils.addShortcut(context, result);//开机之后添加图标到桌面 - String appstore = "com.jiaoguanyi.appstore"; - String store = "com.jiaoguanyi.store"; - String infosn = "com.info.sn"; - String appstoreuiui = "com.appstore.uiui"; - String desktop = "com.android.uiuios"; - String jgy1 = "com.uiuios.jgy1"; - String jgy2 = "com.uiuios.jgy2"; + ApkUtils.addShortcut(context);//开机之后添加图标到桌面 + + List factoryAppList = new ArrayList() {{ + this.add("com.jiaoguanyi.appstore"); + this.add("com.jiaoguanyi.store"); + this.add("com.info.sn"); + this.add("com.appstore.uiui"); + this.add("com.android.uiuios"); + this.add("com.uiuios.jgy1"); + this.add("com.uiuios.jgy2"); + this.add("com.tt.ttutils"); + this.add("com.info.chat"); + this.add("com.info.learning"); + }}; + HashSet factoryAppSet = new HashSet<>(factoryAppList); if (!TextUtils.isEmpty(result)) { - if (!result.contains(appstore)) { - result = result + "," + appstore; - } - if (!result.contains(store)) { - result = result + "," + store; - } - if (!result.contains(jgy1)) { - result = result + "," + jgy1; - } - if (!result.contains(jgy2)) { - result = result + "," + jgy2; - } - if (!result.contains(infosn)) { - result = result + "," + infosn; - } - if (!result.contains(appstoreuiui)) { - result = result + "," + appstoreuiui; - } - if (!result.contains(desktop)) { - result = result + "," + desktop; - } - boolean qch_app_forbid = Settings.System.putString(context.getContentResolver(), "qch_app_forbid", result); - Log.e("fht", "qch_app_forbid :" + result + ":" + qch_app_forbid); + HashSet writeAppSet = new HashSet<>(Arrays.asList(result.split(","))); + writeAppSet.addAll(factoryAppSet); + String pkgString = String.join(",", writeAppSet); + Log.e("fht", "qch_app_forbid :" + result); + boolean qch_app_forbid = JGYUtils.putString(context.getContentResolver(), "qch_app_forbid", pkgString); } else { + JGYUtils.putString(context.getContentResolver(), "qch_app_forbid", String.join(",", factoryAppSet)); Log.e("fht", "writeAppPackageList is null:"); } + Utils.writeDisableUpdateList(context); } + /** + * 判断是否为系统应用 + * + * @param context 上下文 + * @param pkgName 包名 + * @return + */ + public static boolean isSystemApp(Context context, String pkgName) { + boolean isSystemApp = false; + PackageInfo pi = null; + try { + PackageManager pm = context.getPackageManager(); + pi = pm.getPackageInfo(pkgName, 0); + } catch (PackageManager.NameNotFoundException e) { + Log.e("isSystemApp: NameNotFoundException:", e.getMessage()); + } + // 是系统中已安装的应用 + if (pi != null) { + boolean isSysApp = (pi.applicationInfo.flags & ApplicationInfo.FLAG_SYSTEM) == 1; + boolean isSysUpd = (pi.applicationInfo.flags & ApplicationInfo.FLAG_UPDATED_SYSTEM_APP) == 1; + isSystemApp = isSysApp || isSysUpd; + } + return isSystemApp; + } + //通过包名获取版本号 + public static String getAPPVersionName(Context context, String packageName) { + String versionName = "0"; + + if (TextUtils.isEmpty(packageName)) { + return versionName; + } + PackageManager pm = context.getPackageManager(); + try { + PackageInfo packageInfo = pm.getPackageInfo(packageName, 0); + versionName = packageInfo.versionName; + } catch (PackageManager.NameNotFoundException e) { + e.printStackTrace(); + } + return versionName; + } + public static String getTaskPackname(Context context) { + String currentApp = "CurrentNULL"; + if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.LOLLIPOP) { + @SuppressLint("WrongConstant") UsageStatsManager usm = (UsageStatsManager) context.getSystemService("usagestats"); + long time = System.currentTimeMillis(); + List appList = usm.queryUsageStats(UsageStatsManager.INTERVAL_DAILY, time - 1000 * 1000, time); + if (appList != null && appList.size() > 0) { + SortedMap mySortedMap = new TreeMap(); + for (UsageStats usageStats : appList) { + mySortedMap.put(usageStats.getLastTimeUsed(), usageStats); + } + if (mySortedMap != null && !mySortedMap.isEmpty()) { + currentApp = mySortedMap.get(mySortedMap.lastKey()).getPackageName(); + } + } + } else { + ActivityManager am = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE); + List tasks = am.getRunningAppProcesses(); + currentApp = tasks.get(0).processName; + } +// Log.e("TAG", "Current App in foreground is: " + currentApp); + return currentApp; + } } diff --git a/app/src/main/java/com/info/sn/utils/AppsManagerUtils.java b/app/src/main/java/com/info/sn/utils/AppsManagerUtils.java index 42767f6..ba550ae 100644 --- a/app/src/main/java/com/info/sn/utils/AppsManagerUtils.java +++ b/app/src/main/java/com/info/sn/utils/AppsManagerUtils.java @@ -8,6 +8,8 @@ import android.content.pm.PackageManager; import android.content.pm.PackageManager.NameNotFoundException; import android.content.pm.ResolveInfo; +import com.info.sn.bean.zuoye.LocalAppInfo; + import java.io.File; import java.util.ArrayList; import java.util.List; diff --git a/app/src/main/java/com/info/sn/utils/CXAESUtil.java b/app/src/main/java/com/info/sn/utils/CXAESUtil.java new file mode 100644 index 0000000..379f212 --- /dev/null +++ b/app/src/main/java/com/info/sn/utils/CXAESUtil.java @@ -0,0 +1,333 @@ +package com.info.sn.utils; + +import java.io.File; +import java.io.FileInputStream; +import java.io.FileNotFoundException; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.security.InvalidAlgorithmParameterException; +import java.security.InvalidKeyException; +import java.security.NoSuchAlgorithmException; + +import javax.crypto.Cipher; +import javax.crypto.CipherInputStream; +import javax.crypto.CipherOutputStream; +import javax.crypto.NoSuchPaddingException; +import javax.crypto.spec.IvParameterSpec; +import javax.crypto.spec.SecretKeySpec; + +public class CXAESUtil { + /** + * 加解密算法/工作模式/填充方式 + */ + private static final String CIPHER_ALGORITHM = "AES/ECB/PKCS5Padding"; + public final static String HEX = "0123456789ABCDEF"; + private static final int keyLenght = 16; + private static final String defaultV = "0"; + + /** + * 加密 + * + * @param key 密钥 + * @param src 加密文本 + * @return + * @throws Exception + */ + public static String encrypt(String key, String src) { + // /src = Base64.encodeToString(src.getBytes(), Base64.DEFAULT); + byte[] rawKey = toMakekey(key, keyLenght, defaultV).getBytes();// key.getBytes(); + try { + byte[] result = encrypt(rawKey, src.getBytes("utf-8")); + // result = Base64.encode(result, Base64.DEFAULT); + return toHex(result); + } catch (Exception e) { + e.printStackTrace(); + return ""; + } + } + + /** + * 加密 + * + * @param key 密钥 + * @param src 加密文本 + * @return + * @throws Exception + */ + public static String encrypt2Java(String key, String src) throws Exception { + // /src = Base64.encodeToString(src.getBytes(), Base64.DEFAULT); + byte[] rawKey = toMakekey(key, keyLenght, defaultV).getBytes();// key.getBytes(); + byte[] result = encrypt2Java(rawKey, src.getBytes("utf-8")); + // result = Base64.encode(result, Base64.DEFAULT); + return toHex(result); + } + + /** + * 解密 + * + * @param key 密钥 + * @param encrypted 待揭秘文本 + * @return + * @throws Exception + */ + public static String decrypt(String key, String encrypted) throws Exception { + byte[] rawKey = toMakekey(key, keyLenght, defaultV).getBytes();// key.getBytes(); + byte[] enc = toByte(encrypted); + // enc = Base64.decode(enc, Base64.DEFAULT); + byte[] result = decrypt(rawKey, enc); + // /result = Base64.decode(result, Base64.DEFAULT); + return new String(result, "utf-8"); + } + + /** + * 密钥key ,默认补的数字,补全16位数,以保证安全补全至少16位长度,android和ios对接通过 + * + * @param str + * @param strLength + * @param val + * @return + */ + private static String toMakekey(String str, int strLength, String val) { + + int strLen = str.length(); + if (strLen < strLength) { + while (strLen < strLength) { + StringBuffer buffer = new StringBuffer(); + buffer.append(str).append(val); + str = buffer.toString(); + strLen = str.length(); + } + } + return str; + } + + /** + * 真正的加密过程 + * 1.通过密钥得到一个密钥专用的对象SecretKeySpec + * 2.Cipher 加密算法,加密模式和填充方式三部分或指定加密算 (可以只用写算法然后用默认的其他方式)Cipher.getInstance("AES"); + * + * @param key + * @param src + * @return + * @throws Exception + */ + private static byte[] encrypt(byte[] key, byte[] src) throws Exception { + SecretKeySpec skeySpec = new SecretKeySpec(key, "AES"); + Cipher cipher = Cipher.getInstance("AES"); + cipher.init(Cipher.ENCRYPT_MODE, skeySpec, new IvParameterSpec(new byte[cipher.getBlockSize()])); + byte[] encrypted = cipher.doFinal(src); + return encrypted; + } + + /** + * 真正的加密过程 + * + * @param key + * @param src + * @return + * @throws Exception + */ + private static byte[] encrypt2Java(byte[] key, byte[] src) throws Exception { + SecretKeySpec skeySpec = new SecretKeySpec(key, "AES"); + Cipher cipher = Cipher.getInstance(CIPHER_ALGORITHM); + cipher.init(Cipher.ENCRYPT_MODE, skeySpec, new IvParameterSpec(new byte[cipher.getBlockSize()])); + byte[] encrypted = cipher.doFinal(src); + return encrypted; + } + + /** + * 真正的解密过程 + * + * @param key + * @param encrypted + * @return + * @throws Exception + */ + private static byte[] decrypt(byte[] key, byte[] encrypted) throws Exception { + SecretKeySpec skeySpec = new SecretKeySpec(key, "AES"); + Cipher cipher = Cipher.getInstance("AES"); + cipher.init(Cipher.DECRYPT_MODE, skeySpec, new IvParameterSpec(new byte[cipher.getBlockSize()])); + byte[] decrypted = cipher.doFinal(encrypted); + return decrypted; + } + + public static String toHex(String txt) { + return toHex(txt.getBytes()); + } + + public static String fromHex(String hex) { + return new String(toByte(hex)); + } + + + /** + * 把16进制转化为字节数组 + * + * @param hexString + * @return + */ + public static byte[] toByte(String hexString) { + int len = hexString.length() / 2; + byte[] result = new byte[len]; + for (int i = 0; i < len; i++) + result[i] = Integer.valueOf(hexString.substring(2 * i, 2 * i + 2), 16).byteValue(); + return result; + } + + + /** + * 二进制转字符,转成了16进制 + * 0123456789abcdefg + * + * @param buf + * @return + */ + public static String toHex(byte[] buf) { + if (buf == null) + return ""; + StringBuffer result = new StringBuffer(2 * buf.length); + for (int i = 0; i < buf.length; i++) { + appendHex(result, buf[i]); + } + return result.toString(); + } + + private static void appendHex(StringBuffer sb, byte b) { + sb.append(HEX.charAt((b >> 4) & 0x0f)).append(HEX.charAt(b & 0x0f)); + } + + /** + * 初始化 AES Cipher + * + * @param sKey + * @param cipherMode + * @return + */ + public static Cipher initAESCipher(String sKey, int cipherMode) { + // 创建Key gen + // KeyGenerator keyGenerator = null; + Cipher cipher = null; + try { + /* + * keyGenerator = KeyGenerator.getInstance("AES"); + * keyGenerator.init(128, new SecureRandom(sKey.getBytes())); + * SecretKey secretKey = keyGenerator.generateKey(); byte[] + * codeFormat = secretKey.getEncoded(); SecretKeySpec key = new + * SecretKeySpec(codeFormat, "AES"); cipher = + * Cipher.getInstance("AES"); //初始化 cipher.init(cipherMode, key); + */ + byte[] rawKey = toMakekey(sKey, keyLenght, defaultV).getBytes(); + SecretKeySpec skeySpec = new SecretKeySpec(rawKey, "AES"); + cipher = Cipher.getInstance("AES"); + cipher.init(cipherMode, skeySpec, new IvParameterSpec(new byte[cipher.getBlockSize()])); + } catch (NoSuchAlgorithmException e) { + e.printStackTrace(); // To change body of catch statement use File | + // Settings | File Templates. + } catch (NoSuchPaddingException e) { + e.printStackTrace(); // To change body of catch statement use File | + // Settings | File Templates. + } catch (InvalidKeyException e) { + e.printStackTrace(); // To change body of catch statement use File | + // Settings | File Templates. + } catch (InvalidAlgorithmParameterException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + return cipher; + } + + /** + * 对文件进行AES加密 + * + * @param sourceFile + * @param fileType + * @param sKey + * @return + */ + public static File encryptFile(File sourceFile, String toFile, String dir, String sKey) { + // 新建临时加密文件 + File encrypfile = null; + InputStream inputStream = null; + OutputStream outputStream = null; + try { + inputStream = new FileInputStream(sourceFile); + encrypfile = new File(dir + toFile); + outputStream = new FileOutputStream(encrypfile); + Cipher cipher = initAESCipher(sKey, Cipher.ENCRYPT_MODE); + // 以加密流写入文件 + CipherInputStream cipherInputStream = new CipherInputStream(inputStream, cipher); + byte[] cache = new byte[1024]; + int nRead = 0; + while ((nRead = cipherInputStream.read(cache)) != -1) { + outputStream.write(cache, 0, nRead); + outputStream.flush(); + } + cipherInputStream.close(); + } catch (FileNotFoundException e) { + e.printStackTrace(); // To change body of catch statement use File | + // Settings | File Templates. + } catch (IOException e) { + e.printStackTrace(); // To change body of catch statement use File | + // Settings | File Templates. + } finally { + try { + inputStream.close(); + } catch (IOException e) { + e.printStackTrace(); // To change body of catch statement use + // File | Settings | File Templates. + } + try { + outputStream.close(); + } catch (IOException e) { + e.printStackTrace(); // To change body of catch statement use + // File | Settings | File Templates. + } + } + return encrypfile; + } + + /** + * AES方式解密文件 + * + * @param sourceFile + * @return + */ + public static File decryptFile(File sourceFile, String toFile, String dir, String sKey) { + File decryptFile = null; + InputStream inputStream = null; + OutputStream outputStream = null; + try { + decryptFile = new File(dir + toFile); + Cipher cipher = initAESCipher(sKey, Cipher.DECRYPT_MODE); + inputStream = new FileInputStream(sourceFile); + outputStream = new FileOutputStream(decryptFile); + CipherOutputStream cipherOutputStream = new CipherOutputStream(outputStream, cipher); + byte[] buffer = new byte[1024]; + int r; + while ((r = inputStream.read(buffer)) >= 0) { + cipherOutputStream.write(buffer, 0, r); + } + cipherOutputStream.close(); + } catch (IOException e) { + e.printStackTrace(); // To change body of catch statement use File | + // Settings | File Templates. + } finally { + try { + inputStream.close(); + } catch (IOException e) { + e.printStackTrace(); // To change body of catch statement use + // File | Settings | File Templates. + } + try { + outputStream.close(); + } catch (IOException e) { + e.printStackTrace(); // To change body of catch statement use + // File | Settings | File Templates. + } + } + return decryptFile; + } + +} diff --git a/app/src/main/java/com/info/sn/utils/CacheUtils.java b/app/src/main/java/com/info/sn/utils/CacheUtils.java new file mode 100644 index 0000000..91a4462 --- /dev/null +++ b/app/src/main/java/com/info/sn/utils/CacheUtils.java @@ -0,0 +1,136 @@ +package com.info.sn.utils; + + +import android.content.Context; +import android.content.pm.IPackageDataObserver; +import android.content.pm.IPackageManager; +import android.content.pm.IPackageStatsObserver; +import android.content.pm.PackageManager; +import android.content.pm.PackageStats; +import android.os.RemoteException; +import android.os.ServiceManager; +import android.util.Log; + +import java.lang.reflect.Method; + +public class CacheUtils { + + private static final String TAG = CacheUtils.class.getSimpleName(); + private final long MAX_WAIT_TIME = 60 * 1000; + private final long WAIT_TIME_INCR = 10 * 1000; + + /** + * 获取应用数据大小 cache + data + * + * @param context + * @param packageName + * @return + * @throws Exception + */ + + public long getApplicationCache(Context context, String packageName) throws Exception { + try { + PackageStatsObserver observer = new PackageStatsObserver(); + // wait on observer + synchronized (observer) { + Method method = PackageManager.class.getMethod("getPackageSizeInfo", new Class[] { String.class, IPackageStatsObserver.class }); + method.invoke(context.getPackageManager(), packageName, observer); +// getPm().getPackageSizeInfo(packageName, UserHandle.myUserId(), observer); + long waitTime = 0; + while ((!observer.isDone()) || (waitTime > MAX_WAIT_TIME)) { + observer.wait(WAIT_TIME_INCR); + waitTime += WAIT_TIME_INCR; + } + if (!observer.isDone()) { + throw new Exception("Timed out waiting for PackageStatsObserver.onGetStatsCompleted"); + } + } + Log.d(TAG, "toString " + observer.stats.toString()); + return observer.stats.dataSize + observer.stats.cacheSize; + } catch (RemoteException e) { + Log.w(TAG, "Failed to get handle for PackageManger Exception: " + e); + return -1; + } catch (InterruptedException e) { + Log.w(TAG, "InterruptedException :" + e); + return -1; + } + } + + /** + * 清除应用数据 + * + * @param context + * @param packageName + * @return + * @throws Exception + */ + public boolean cleanApplicationUserData(Context context, String packageName) throws Exception { + try { + PackageDataObserver observer = new PackageDataObserver(); + // wait on observer + synchronized (observer) { + Method method = PackageManager.class.getMethod("clearApplicationUserData", new Class[] { String.class, IPackageDataObserver.class }); + method.invoke(context.getPackageManager(), packageName, observer); +// getPm().deleteApplicationCacheFiles(appid, observer); + long waitTime = 0; + while (!observer.isDone() || (waitTime > MAX_WAIT_TIME)) { + observer.wait(WAIT_TIME_INCR); + waitTime += WAIT_TIME_INCR; + } + if (!observer.isDone()) { + throw new Exception("timed out waiting for PackageDataObserver.onRemoveCompleted"); + } + } + Log.d(TAG, "cleanApplicationCache " + observer.retValue); + return observer.retValue; + } catch (RemoteException e) { + Log.w(TAG, "Failed to get handle for PackageManger Exception: " + e); + return false; + } catch (InterruptedException e) { + Log.w(TAG, "InterruptedException :" + e); + return false; + } + } + + private IPackageManager getPm() { + return IPackageManager.Stub.asInterface(ServiceManager.getService("package")); + } + + class PackageDataObserver extends IPackageDataObserver.Stub { + public boolean retValue = false; + private boolean doneFlag = false; + + public void onRemoveCompleted(String packageName, boolean succeeded) throws RemoteException { + synchronized (this) { + retValue = succeeded; + doneFlag = true; + notifyAll(); + } + } + + public boolean isDone() { + return doneFlag; + } + } + + class PackageStatsObserver extends IPackageStatsObserver.Stub { + public boolean retValue = false; + public PackageStats stats; + private boolean doneFlag = false; + + public void onGetStatsCompleted(PackageStats pStats, boolean succeeded) throws RemoteException { + synchronized (this) { + retValue = succeeded; + stats = pStats; + doneFlag = true; + notifyAll(); + } + } + + public boolean isDone() { + return doneFlag; + } + } + +} + diff --git a/app/src/main/java/com/info/sn/utils/Hash.java b/app/src/main/java/com/info/sn/utils/Hash.java new file mode 100644 index 0000000..d380fa4 --- /dev/null +++ b/app/src/main/java/com/info/sn/utils/Hash.java @@ -0,0 +1,31 @@ +package com.info.sn.utils; + +import java.security.MessageDigest; +import java.security.NoSuchAlgorithmException; + +public class Hash { + + private static final char[] hexCode = "0123456789ABCDEF".toCharArray(); + + public static String md5(String input) { + byte[] bytes = new byte[0]; + try { + bytes = MessageDigest.getInstance("MD5").digest(input.getBytes()); + return printHexBinary(bytes); + } catch (NoSuchAlgorithmException e) { + e.printStackTrace(); + return ""; + } + } + + public static String printHexBinary(byte[] data) { + StringBuilder r = new StringBuilder(data.length * 2); + for (byte b : data) { + r.append(hexCode[(b >> 4) & 0xF]); + r.append(hexCode[(b & 0xF)]); + } + return r.toString(); + } +} + + diff --git a/app/src/main/java/com/info/sn/utils/JGYUtils.java b/app/src/main/java/com/info/sn/utils/JGYUtils.java index e57f044..24a0240 100644 --- a/app/src/main/java/com/info/sn/utils/JGYUtils.java +++ b/app/src/main/java/com/info/sn/utils/JGYUtils.java @@ -5,14 +5,16 @@ import android.app.ActivityManager; import android.app.ActivityManagerNative; import android.app.ActivityTaskManager; import android.content.ComponentName; +import android.content.ContentResolver; import android.content.Context; import android.content.ContextWrapper; import android.content.Intent; import android.content.IntentFilter; import android.content.pm.ApplicationInfo; -import android.content.pm.PackageInfo; import android.content.pm.PackageManager; import android.content.pm.UserInfo; +import android.net.ConnectivityManager; +import android.net.NetworkInfo; import android.net.Uri; import android.os.BatteryManager; import android.os.Build; @@ -22,20 +24,12 @@ import android.provider.Settings; import android.text.TextUtils; import android.util.Log; -import com.alibaba.fastjson.JSONArray; -import com.alibaba.fastjson.JSONObject; -import com.google.gson.JsonObject; import com.info.sn.BuildConfig; +import com.info.sn.service.RemoteService; -import java.io.File; -import java.io.FileOutputStream; -import java.io.IOException; import java.lang.reflect.Constructor; import java.lang.reflect.Field; import java.lang.reflect.Method; -import java.nio.file.Files; -import java.nio.file.Path; -import java.nio.file.Paths; import java.util.ArrayList; import java.util.Arrays; import java.util.HashMap; @@ -48,6 +42,7 @@ import static android.app.ActivityManager.RECENT_IGNORE_UNAVAILABLE; public class JGYUtils { private static final String TAG = JGYUtils.class.getSimpleName(); + @SuppressLint("StaticFieldLeak") private static JGYUtils sInstance; private Context mContext; public static int MTKPlatform = 1; @@ -90,7 +85,6 @@ public class JGYUtils { } - private int getBatteryLevel() { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { BatteryManager batteryManager = (BatteryManager) mContext.getSystemService(Context.BATTERY_SERVICE); @@ -162,23 +156,21 @@ public class JGYUtils { } - String olddeselectViewArray = Settings.System.getString(mContext.getContentResolver(), "qch_app_forbid_id"); + String olddeselectViewArray = JGYUtils.getString(mContext.getContentResolver(), "qch_app_forbid_id"); Log.e("writeDeselectIDtoSystem", "olddeselectViewArray: " + olddeselectViewArray); - Settings.System.putString(mContext.getContentResolver(), "qch_app_forbid_id", packageStringBuilder.toString()); - Settings.System.putString(mContext.getContentResolver(), "DeselectViewArray", idStringBuilder.toString()); + JGYUtils.putString(mContext.getContentResolver(), "qch_app_forbid_id", packageStringBuilder.toString()); + JGYUtils.putString(mContext.getContentResolver(), "DeselectViewArray", idStringBuilder.toString()); Log.e("writeDeselectIDtoSystem", "qch_app_forbid_id: " + packageStringBuilder.toString()); Log.e("writeDeselectIDtoSystem", "deselectViewArray: " + idStringBuilder.toString()); } else { Log.e("writeDeselectIDtoSystem", "writeDeselectIDtoSystem is null:"); - Settings.System.putString(mContext.getContentResolver(), "qch_app_forbid_id", ""); - Settings.System.putString(mContext.getContentResolver(), "DeselectViewArray", ""); + JGYUtils.putString(mContext.getContentResolver(), "qch_app_forbid_id", " "); + JGYUtils.putString(mContext.getContentResolver(), "DeselectViewArray", " "); } } - - private static void sendAllweb(Context context) { Intent intent = new Intent("qch_app_website") .setPackage("com.android.settings"); @@ -211,7 +203,10 @@ public class JGYUtils { return value; } - public void hookWebView() { + /** + * 系统应用hook使用webview + */ + public static void hookWebView() { int sdkInt = Build.VERSION.SDK_INT; try { Class factoryClass = Class.forName("android.webkit.WebViewFactory"); @@ -287,6 +282,12 @@ public class JGYUtils { } } + public void killPackage(String pkg) { + ActivityManager manager = (ActivityManager) mContext.getSystemService(Context.ACTIVITY_SERVICE); + manager.killBackgroundProcesses(pkg); + CmdUtil.execute("am force-stop " + pkg); + } + public void KillOTA() { ActivityManager manager = (ActivityManager) mContext.getSystemService(Context.ACTIVITY_SERVICE); manager.killBackgroundProcesses("com.adups.fota"); @@ -301,6 +302,32 @@ public class JGYUtils { mContext.startActivity(intent); } + public void openLauncher() { + Log.e(TAG, "openLauncher: "); + killPackage("com.android.launcher3"); + Intent intent = new Intent(); + // 为Intent设置Action、Category属性 + intent.setAction(Intent.ACTION_MAIN);// "android.intent.action.MAIN" + intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); + intent.addCategory(Intent.CATEGORY_HOME); //"android.intent.category.HOME" + mContext.startActivity(intent); + } + + public void cleanLauncherCache() { + Log.e(TAG, "cleanLauncherCache: Start"); + int cleaned = (int) SPUtils.get(mContext, "fristcleanLauncherCache", 0); + if (cleaned == 0) { + try { + new CacheUtils().cleanApplicationUserData(mContext, "com.android.launcher3"); + SPUtils.put(mContext, "fristcleanLauncherCache", 1); + Log.e(TAG, "cleanLauncherCache: end"); + } catch (Exception e) { + e.printStackTrace(); + Log.e(TAG, "cleanLauncherCache: " + e.getMessage()); + } + } + } + public int checkSNPlatform(String sn) { String secondChars = sn.substring(1, 2); if ("N".equalsIgnoreCase(secondChars)) {//MTK平台 @@ -351,6 +378,22 @@ public class JGYUtils { } } + public static String getCustomVersion() { + if (JGYUtils.getInstance().checkAppPlatform() == JGYUtils.ZhanruiPlatform) { + return Utils.getProperty("ro.build.display.id", "获取失败"); + } else { + return Utils.getProperty("ro.custom.build.version", "获取失败"); + } + } + + public static String getRomVersion() { + if (JGYUtils.getInstance().checkAppPlatform() == JGYUtils.ZhanruiPlatform) { + return Utils.getProperty("ro.build.id", "获取失败"); + } else { + return Utils.getProperty("ro.build.display.id", "获取失败"); + } + } + public void killBackgroundProcesses(Context context, String processName) { gotoLauncher(); // mIsScanning = true; @@ -452,4 +495,119 @@ public class JGYUtils { } } + public static int isWifiConnect(Context context) { + // 网络管理对象 + ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); + // 获取所有类型的链接管理对象 + NetworkInfo info = cm.getNetworkInfo(ConnectivityManager.TYPE_WIFI); + NetworkInfo.State state = info.getState(); + if (NetworkInfo.State.CONNECTED == state) { + return 1; + } + return 0; + } + + synchronized public static int getInt(ContentResolver cr, String name, int def) { + Log.i(TAG, "getInt: " + name); + return Settings.System.getInt(cr, name, def); + } + + synchronized public static int getInt(ContentResolver cr, String name) throws Settings.SettingNotFoundException { + Log.i(TAG, "getInt: " + name); + return Settings.System.getInt(cr, name); + } + + synchronized public static String getString(ContentResolver cr, String name) { + Log.i(TAG, "getString: " + name); + return Settings.System.getString(cr, name); + } + + synchronized public static boolean putInt(ContentResolver cr, String name, int value) { + Log.i(TAG, "putInt: " + "name = " + name + ", value = " + value); + return Settings.System.putInt(cr, name, value); + } + + synchronized public static boolean putString(ContentResolver cr, String name, String value) { + Log.i(TAG, "putString: " + "name = " + name + ", value = " + value); + return Settings.System.putString(cr, name, value); + } + + /** + * 获取当前进程名 + */ + public static String getCurrentProcessName(Context context) { + int pid = android.os.Process.myPid(); + String processName = ""; + ActivityManager manager = (ActivityManager) context.getSystemService + (Context.ACTIVITY_SERVICE); + for (ActivityManager.RunningAppProcessInfo process : manager.getRunningAppProcesses()) { + if (process.pid == pid) { + processName = process.processName; + } + } + return processName; + } + + public void setDefaultDesktop(Context context, String pkg, String className) { + Intent intent = new Intent("setDefaultLauncher"); + intent.putExtra("package", pkg); + intent.putExtra("className", className); + intent.setPackage("com.android.settings"); + context.sendBroadcast(intent); + } + + public static ArrayList getForbidList(Context context) { + ArrayList disableApp = new ArrayList<>(); + if ((int) SPUtils.get(context, "search_topic", 0) == 0) { + disableApp.add("拍照搜题"); + } + if (JGYUtils.getInt(context.getContentResolver(), "qch_app_camera", 0) == 1) { + disableApp.add("com.mediatek.camera"); + } + if (JGYUtils.getInt(context.getContentResolver(), "qch_app_filemanager", 0) == 1) { + disableApp.add("com.android.documentsui"); + disableApp.add("com.mediatek.filemanager"); + } + if (JGYUtils.getInt(context.getContentResolver(), "qch_app_soundrecorder", 0) == 1) { + disableApp.add("com.android.soundrecorder"); + } + if (JGYUtils.getInt(context.getContentResolver(), "qch_app_gallery", 0) == 1) { + disableApp.add("com.android.gallery3d"); + } + if (JGYUtils.getInt(context.getContentResolver(), "qch_app_music", 0) == 1) { + disableApp.add("com.android.music"); + } + Log.e(TAG, "getForbidAPP: " + disableApp); + return disableApp; + } + + private static final String UPDATE_FORBID_APP = "UPDATE_FORBID_APP"; + + public static void updateForbidList(Context context) { + Intent intent = new Intent(UPDATE_FORBID_APP); + intent.putStringArrayListExtra("forbid_app_list", getForbidList(context)); + intent.setPackage("com.jiaoguanyi.os"); + intent.setPackage("com.tt.ttutils"); + context.sendBroadcast(intent); + } + + public static ArrayList getHideList(Context context) { + String appString = (String) SPUtils.get(context, "Hide_APP_List", ""); + Log.e(TAG, "Hide_APP_List: " + appString); + if (TextUtils.isEmpty(appString)) { + return new ArrayList<>(); + } else { + return new ArrayList<>(Arrays.asList(appString.split(","))); + } + } + private static final String UPDATE_HIDE_APP = "UPDATE_HIDE_APP"; + + public static void updateHideList(Context context) { + Intent intent = new Intent(UPDATE_HIDE_APP); + intent.putStringArrayListExtra("hide_app_list", getHideList(context)); + intent.setPackage("com.jiaoguanyi.os"); + intent.setPackage("com.tt.ttutils"); + context.sendBroadcast(intent); + } + } diff --git a/app/src/main/java/com/info/sn/utils/LaunchTools.java b/app/src/main/java/com/info/sn/utils/LaunchTools.java new file mode 100644 index 0000000..13c5360 --- /dev/null +++ b/app/src/main/java/com/info/sn/utils/LaunchTools.java @@ -0,0 +1,205 @@ +package com.info.sn.utils; + +import android.annotation.SuppressLint; +import android.content.ActivityNotFoundException; +import android.content.Context; +import android.content.Intent; +import android.net.Uri; +import android.net.wifi.WifiInfo; +import android.net.wifi.WifiManager; +import android.os.Build; +import android.text.TextUtils; +import android.util.Log; + + +import com.info.sn.config.Scheme; + +import java.net.NetworkInterface; +import java.security.MessageDigest; +import java.security.NoSuchAlgorithmException; +import java.util.ArrayList; +import java.util.Collections; +import java.util.Comparator; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +public class LaunchTools { + private static String TAG = LaunchTools.class.getSimpleName(); + + public static void goGankao(Context mContext, String scheme, String str) { + try { + String _str = to(mContext, scheme, str); + android.util.Log.d("wlDebug", _str); + Uri uri = Uri.parse(_str); + Intent intent = new Intent(Intent.ACTION_VIEW, uri); + intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); + mContext.startActivity(intent); + } catch (ActivityNotFoundException e) { + + } + } + + /** + * https://gankao.yuque.com/docs/share/69e3a9b3-8a13-429c-9af2-fa7d29c46b5f#mTy5k + * + * @param mContext + * @param schemeHead + * @param str + * @return + */ + public static String to(Context mContext, String schemeHead, String str) { + Map keys = new HashMap<>();//参数集合 + String publicSecret = Scheme.getPublicSecret();//公共密钥赶考提供 + String partner_id = Scheme.partner_id;//合作渠道号赶考提供 + String device_id = getLocalMacAddress(mContext);//设备mac地址-这里自己获取mac地址即可,或者是自己的账号 +// device_id = "00:08:22:ae:70:59"; + String page = Uri.encode(str);//传入指定页面的scheme地址-需编码 + keys.put("device_id", Uri.encode(device_id));//需编码 + keys.put("partner_id", partner_id); + keys.put("page", page); + StringBuilder st = new StringBuilder(""); + List> list = new ArrayList>(keys.entrySet()); + // 通过比较器来实现参数首字母的升序排列 + Collections.sort(list, new Comparator>() { + @Override + public int compare(Map.Entry o1, Map.Entry o2) { + //进行key比较 + return o1.getKey().compareTo(o2.getKey()); + } + }); + //排序后的参数并且 + for (Map.Entry key : list) { + st = st.append(key.getKey() + "=" + key.getValue() + "&"); + } + //得到md5签名 + String sign = md5(st.toString().substring(0, st.toString().length() - 1) + publicSecret); + String _result = schemeHead + "://loginFromPartner?device_id=" + device_id + "&partner_id=" + partner_id + "&page=" + page + "&sign=" + sign; + return _result; + } + + public static String toUserCenter(Context mContext, Map keys, String str) { + String publicSecret = Scheme.getPublicSecret();//公共密钥赶考提供 + String partner_id = Scheme.partner_id;//合作渠道号赶考提供 + String device_id = getLocalMacAddress(mContext);//设备mac地址-这里自己获取mac地址即可,或者是自己的账号 +// device_id = "00:08:22:ae:70:59"; +// String page = Uri.encode(str);//传入指定页面的scheme地址-需编码 +// keys.put("device_id", Uri.encode(device_id));//需编码 +// keys.put("partner_id", partner_id); + keys.put("page", str); + StringBuilder st = new StringBuilder(""); + List> list = new ArrayList>(keys.entrySet()); + // 通过比较器来实现参数首字母的升序排列 + Collections.sort(list, new Comparator>() { + @Override + public int compare(Map.Entry o1, Map.Entry o2) { + //进行key比较 + return o1.getKey().compareTo(o2.getKey()); + } + }); + //排序后的参数并且 + for (Map.Entry key : list) { + st = st.append(key.getKey() + "=" + key.getValue() + "&"); + } + Log.e("toUserCenter", "st: " + st); + //得到md5签名 + String sign = md5(st.toString().substring(0, st.toString().length() - 1) + publicSecret); + String _result = "gankao://loginFromPartner?" + st + "sign=" + sign; + Log.e("toUserCenter", "_result: " + _result); + return _result; + } + + + /** + * https://gankao.yuque.com/docs/share/007ac4bd-7442-46a0-976b-9ad09b22d3c8#PXO8t + * + * @param params + * @return + */ + public static String getToken(HashMap params) { + List> list = new ArrayList>(params.entrySet()); + // 通过比较器来实现参数首字母的升序排列 + Collections.sort(list, new Comparator>() { + @Override + public int compare(Map.Entry o1, Map.Entry o2) { + //进行key比较 + return o1.getKey().compareTo(o2.getKey()); + } + }); + //排序后的参数并且 + StringBuilder st = new StringBuilder(""); + for (Map.Entry key : list) { + st = st.append(key.getValue()); + } + //得到md5签名 + String token = md5(st.toString() + Scheme.getPublicSecret()); + return token; + } + + + public static String md5(String string) { + if (TextUtils.isEmpty(string)) { + return ""; + } + MessageDigest md5 = null; + try { + md5 = MessageDigest.getInstance("MD5"); + byte[] bytes = md5.digest(string.getBytes()); + StringBuilder result = new StringBuilder(); + for (byte b : bytes) { + String temp = Integer.toHexString(b & 0xff); + if (temp.length() == 1) { + temp = "0" + temp; + } + result.append(temp); + } + return result.toString(); + } catch (NoSuchAlgorithmException e) { + e.printStackTrace(); + } + return ""; + } + + @SuppressLint("ObsoleteSdkInt") + public static String getLocalMacAddress(Context context) { + String mac; + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP_MR1) { + mac = getNewMac(); + } else { + WifiManager wifi = (WifiManager) context + .getSystemService(Context.WIFI_SERVICE); + WifiInfo info = wifi.getConnectionInfo(); + mac = info.getMacAddress().replace(":", ""); + } + if (mac != null) { + mac = mac.toLowerCase(); + } + return mac; + } + + private static String getNewMac() { + try { + List all = Collections.list(NetworkInterface.getNetworkInterfaces()); + for (NetworkInterface nif : all) { + if (!nif.getName().equalsIgnoreCase("wlan0")) continue; + byte[] macBytes = nif.getHardwareAddress(); + if (macBytes == null) { + return null; + } + StringBuilder res1 = new StringBuilder(); + for (byte b : macBytes) { + res1.append(String.format("%02X:", b)); + } + if (res1.length() > 0) { + res1.deleteCharAt(res1.length() - 1); + } + return res1.toString(); + } + } catch (Exception ex) { + ex.printStackTrace(); + } + return null; + } + + +} diff --git a/app/src/main/java/com/info/sn/utils/LogUtils.java b/app/src/main/java/com/info/sn/utils/LogUtils.java deleted file mode 100644 index 096241a..0000000 --- a/app/src/main/java/com/info/sn/utils/LogUtils.java +++ /dev/null @@ -1,42 +0,0 @@ -package com.info.sn.utils; - -import android.util.Log; - -import com.info.sn.BuildConfig; - -/** - * @author Administrator - */ -public class LogUtils { - static boolean isDebug = BuildConfig.DEBUG; - - public static void v(String tag, String msg) { - if (isDebug) { - Log.v(tag, msg); - } - } - - public static void d(String tag, String msg) { - if (isDebug) { - Log.d(tag, msg); - } - } - - public static void i(String tag, String msg) { - if (isDebug) { - Log.i(tag, msg); - } - } - - public static void w(String tag, String msg) { - if (isDebug) { - Log.w(tag, msg); - } - } - - public static void e(String tag, String msg) { - if (isDebug) { - Log.e(tag, msg); - } - } -} diff --git a/app/src/main/java/com/info/sn/utils/ServiceAliveUtils.java b/app/src/main/java/com/info/sn/utils/ServiceAliveUtils.java index 14db51e..cd5f584 100644 --- a/app/src/main/java/com/info/sn/utils/ServiceAliveUtils.java +++ b/app/src/main/java/com/info/sn/utils/ServiceAliveUtils.java @@ -4,13 +4,12 @@ import android.app.ActivityManager; import android.content.Context; import android.util.Log; -import com.info.sn.base.MyApplication; public class ServiceAliveUtils { - public static boolean isServiceAlice(String className) { + public static boolean isServiceAlice(Context context,String className) { boolean isServiceRunning = false; ActivityManager manager = - (ActivityManager) MyApplication.getAppContext().getSystemService(Context.ACTIVITY_SERVICE); + (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE); if (manager == null) { return false; } diff --git a/app/src/main/java/com/info/sn/utils/StorageUtils.java b/app/src/main/java/com/info/sn/utils/StorageUtils.java new file mode 100644 index 0000000..8e91d2a --- /dev/null +++ b/app/src/main/java/com/info/sn/utils/StorageUtils.java @@ -0,0 +1,124 @@ +package com.info.sn.utils; + +import android.content.Context; +import android.os.Build; +import android.os.Environment; +import android.os.storage.StorageManager; + +import java.io.File; +import java.lang.reflect.Array; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; +import java.text.DecimalFormat; + +public class StorageUtils { + + + // 获取存储空间 false 内置sd卡路径,true 外置sd卡路径 + public static File getStoragePath(Context mContext, boolean isSDcard) { + StorageManager mStorageManager = (StorageManager) mContext.getSystemService(Context.STORAGE_SERVICE); + Class storageVolumeClazz = null; + try { + storageVolumeClazz = Class.forName("android.os.storage.StorageVolume"); + Method getVolumeList = mStorageManager.getClass().getMethod("getVolumeList"); + Method getPath = storageVolumeClazz.getMethod("getPath"); + Method isRemovable = storageVolumeClazz.getMethod("isRemovable"); + Object result = getVolumeList.invoke(mStorageManager); + final int length = Array.getLength(result); + for (int i = 0; i < length; i++) { + Object storageVolumeElement = Array.get(result, i); + String path = (String) getPath.invoke(storageVolumeElement); + boolean removable = (Boolean) isRemovable.invoke(storageVolumeElement); + if (isSDcard == removable) { + File file = new File(path); + if (file.exists()) { + return file; + }else { + if (!isSDcard) { + return Environment.getExternalStorageDirectory(); + } else { + File file1 = new File("root/storage/sdcard1"); + if (file1.exists()){ + return file1; + }else { + File file2 = new File("storage/sdcard1"); + if (file2.exists()){ + return file2; + }else { + File file3 = new File("/storage/emulated/0"); + if (file3.exists()){ + return file3; + }else { + return null; + } + } + } + } + } + } + } + } catch (ClassNotFoundException e) { + e.printStackTrace(); + } catch (InvocationTargetException e) { + e.printStackTrace(); + } catch (NoSuchMethodException e) { + e.printStackTrace(); + } catch (IllegalAccessException e) { + e.printStackTrace(); + } + return null; + } + + + + public static String getFileCache(Context context, String s) { + return getExternalFilesDir(context, s).getAbsolutePath(); + } + + public static String getFileRoot(Context context) { + return getExternalFilesDir(context, "Download").getAbsolutePath(); + } + + public static File getExternalFilesDir(Context context, String s) { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.FROYO) { + File path = context.getExternalFilesDir(s); + if (path != null) { + return path; + } + } + final String cacheDir = "/Android/data/" + context.getPackageName() + "/files/" + s; + return new File(Environment.getExternalStorageDirectory().getPath() + cacheDir); + } + + + // 检测文件是否存在 + public static boolean isFileIsExists(String filePath){ + try{ + File f=new File(filePath); + if(!f.exists()){ + return false; + } + }catch (Exception e) { + return false; + } + return true; + } + + + public static String size(long size) { + if (size / (1024 * 1024) > 0) { + float tmpSize = (float) (size) / (float) (1024 * 1024 ); + DecimalFormat df = new DecimalFormat("#.##"); + return "" + df.format(tmpSize) + "GB"; + } else if (size / 1024 > 0) { + float tmpSize = (float) (size) / (float) 1024 ; + DecimalFormat df = new DecimalFormat("#.##"); + return "" + df.format(tmpSize) + "MB"; + } else if (size > 0) { + return "" + (size ) + "KB"; + } else { + return "" + (size) + "KB"; + } + } + +} diff --git a/app/src/main/java/com/info/sn/utils/TimeUtils.java b/app/src/main/java/com/info/sn/utils/TimeUtils.java index 3e9a5b9..a31e82c 100644 --- a/app/src/main/java/com/info/sn/utils/TimeUtils.java +++ b/app/src/main/java/com/info/sn/utils/TimeUtils.java @@ -2,22 +2,32 @@ package com.info.sn.utils; import android.content.Context; import android.content.Intent; +import android.nfc.Tag; +import android.os.SystemClock; import android.text.TextUtils; +import android.util.Log; import androidx.annotation.NonNull; -import com.info.sn.service.InitJpushServer; +import com.info.sn.service.ManagerService; +import java.net.DatagramPacket; +import java.net.DatagramSocket; +import java.net.InetAddress; import java.text.DateFormat; import java.text.ParseException; import java.text.SimpleDateFormat; +import java.util.Arrays; import java.util.Calendar; import java.util.Date; public class TimeUtils { + private static final String TAG = TimeUtils.class.getSimpleName(); private static DateFormat df = new SimpleDateFormat("HH:mm"); public static final String START_TIME_KEY = "START_TIME"; public static final String END_TIME_KEY = "END_TIME"; + public static final String WEEK_START_TIME_KEY = "WEEK_START_TIME"; + public static final String WEEK_END_TIME_KEY = "WEEK_END_TIME"; public static long dayTime = 60 * 60 * 24 * 1000; public static String getNowTime() { @@ -33,11 +43,12 @@ public class TimeUtils { // // } - public static ContralTime String2ContralTime(Context context, @NonNull String timeText) { + public static ContralTime String2WorkingTime(Context context, @NonNull String timeText) { DateFormat df = ContralTime.getDf(); String[] time = timeText.trim().split("-"); if (time.length != 2) { - throw new RuntimeException("Time format error!"); +// return null; + throw new RuntimeException("Time format error!" + Arrays.toString(time)); } try { SPUtils.put(context, START_TIME_KEY, time[0].trim()); @@ -59,10 +70,63 @@ public class TimeUtils { } } - public static ContralTime getDefaltContralTime(Context context) { + public static ContralTime String2WeekTime(Context context, @NonNull String timeText) { + DateFormat df = ContralTime.getDf(); + String[] time = timeText.trim().split("-"); + if (time.length != 2) { +// return null; + throw new RuntimeException("Time format error!" + Arrays.toString(time)); + } + try { + SPUtils.put(context, WEEK_START_TIME_KEY, time[0].trim()); + SPUtils.put(context, WEEK_END_TIME_KEY, time[1].trim()); + Date startDate = df.parse(time[0].trim()); + Date endDate = df.parse(time[1].trim()); + ContralTime contralTime = new ContralTime(); +// if (date1.getTime() < date2.getTime()) { + contralTime.setStartTime(df.format(startDate)); + contralTime.setEndTime(df.format(endDate)); +// } else { +// contralTime.setStartTime(df.format(date2)); +// contralTime.setEndTime(df.format(date1)); +// } + return contralTime; + } catch (ParseException e) { + e.printStackTrace(); + return null; + } + } + + public static ContralTime getWorkingDayContralTime(Context context) { String startTime = (String) SPUtils.get(context, START_TIME_KEY, "00:00"); String endTime = (String) SPUtils.get(context, END_TIME_KEY, "00:00"); - if (null == startTime || null == endTime || (startTime.equals("00:00") && endTime.equals("00:00"))) { + return getContralTime(context, startTime, endTime); + } + + public static ContralTime getWeekDayContralTime(Context context) { + String startTime = (String) SPUtils.get(context, WEEK_START_TIME_KEY, "00:00"); + String endTime = (String) SPUtils.get(context, WEEK_END_TIME_KEY, "00:00"); + return getContralTime(context, startTime, endTime); + } + + public static boolean inContralTime(ContralTime workingTime, ContralTime weekTime) { + if (inWeekDay()) { + if (weekTime == null) { + return false; + } else { + return weekTime.inControlTime(); + } + } else { + if (workingTime == null) { + return false; + } else { + return workingTime.inControlTime(); + } + } + } + + public static ContralTime getContralTime(Context context, String startTime, String endTime) { + if (null == startTime || null == endTime || ("00:00".equals(startTime) && "00:00".equals(endTime))) { return null; } else { try { @@ -79,28 +143,139 @@ public class TimeUtils { } } + public static String getNowTimeString(Context context) { + ContralTime work = getWorkingDayContralTime(context); + ContralTime week = getWeekDayContralTime(context); + StringBuilder stringBuilder = new StringBuilder(); + if (work != null) { + stringBuilder.append("周一至周五:").append(work).append("\n"); + } + if (week != null) { + stringBuilder.append("周末:").append(week); + } + return stringBuilder.toString(); + } + public static void setEmpty(Context context) { SPUtils.put(context, START_TIME_KEY, "00:00"); SPUtils.put(context, END_TIME_KEY, "00:00"); + SPUtils.put(context, WEEK_START_TIME_KEY, "00:00"); + SPUtils.put(context, WEEK_END_TIME_KEY, "00:00"); Intent intent = new Intent(); - intent.setAction(InitJpushServer.TimeChangedReceiver.ACTION_UPDATE); + intent.setAction(ManagerService.ACTION_UPDATE); context.sendBroadcast(intent); } + /** + * 获取格式化后的时间 + * + * @param time 时间戳 + * @return 时间戳格式化文本 + */ + public static String getDate(long time) { + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss"); + String finaWayDate = sdf.format(time); + Log.e(TAG, "getDate: " + finaWayDate); + return finaWayDate; + } + + /** + * 获取周几 + * + * @return 周几的数字 + */ + public static int getWeekDay() { + long time = System.currentTimeMillis(); + Log.e(TAG, "getWeekDay: " + time); + return getWeekDay(time); + } + + /** + * 获取周几 + * + * @param time 时间戳 + * @return 周几的数字 1-7 + */ + public static int getWeekDay(long time) { + getDate(time); + Calendar now = Calendar.getInstance(); + now.setTimeInMillis(time); + //一周第一天是否为星期天 + boolean isFirstSunday = (now.getFirstDayOfWeek() == Calendar.SUNDAY); + //获取周几 + int weekDay = now.get(Calendar.DAY_OF_WEEK); + //若一周第一天为星期天,则-1 + if (isFirstSunday) { + weekDay = weekDay - 1; + if (weekDay == 0) { + weekDay = 7; + } + } + return weekDay; + } + + private String[] weekDays = {"星期一", "星期二", "星期三", "星期四", "星期五", "星期六", "星期日"}; + + /** + * 获取星期几 + * + * @return 星期的文本 + */ + public String getWeekDayString() { + return weekDays[getWeekDay() - 1]; + } + + /** + * 获取星期几 + * + * @param time 时间戳 + * @return 星期的文本 + */ + public String getWeekDayString(long time) { + return weekDays[getWeekDay(time) - 1]; + } + + /** + * 是否未周末 + * + * @return 周末返回ture 工作日返回false + */ + public static boolean inWeekDay() { + long time = System.currentTimeMillis(); + return inWeekDay(time); + } + + /** + * 是否未周末 + * + * @param time 时间戳 + * @return 周末返回ture 工作日返回false + */ + public static boolean inWeekDay(long time) { + int weekDay = getWeekDay(time); + if (weekDay > 5) { + return true; + } else { + return false; + } + } + + public static void setSystemTime(long time) { + SystemClock.setCurrentTimeMillis(time); + } public static class ContralTime { - //format HH:mm - static String startTime; - static String endTime; + String startTime; + String endTime; public ContralTime() { } public ContralTime(String startT, String endT) { - startTime = startT; - endTime = endT; + this.startTime = startT; + this.endTime = endT; } public String getStartTime() { @@ -109,7 +284,7 @@ public class TimeUtils { public void setStartTime(String startT) { - startTime = startT; + this.startTime = startT; } public String getEndTime() { @@ -117,7 +292,7 @@ public class TimeUtils { } public void setEndTime(String endT) { - endTime = endT; + this.endTime = endT; } public static DateFormat getDf() { @@ -132,6 +307,11 @@ public class TimeUtils { return df.format(new Date(time)); } + public boolean inControlTime() { + long time = System.currentTimeMillis(); + return inControlTime(time); + } + public boolean inControlTime(long time) { return inControlTime(df.format(new Date(time))); } @@ -169,4 +349,218 @@ public class TimeUtils { return startTime + "\t-\t" + endTime; } } + + private static SntpClient mNtpClient; + + public static long getTimeFromNtpServer(String hostAddress) { + Log.d(TAG, "getTimeFromNtpServer()"); + if (TextUtils.isEmpty(hostAddress)) { + Log.e(TAG, "Ntp host is null."); + return -1; + } + if (mNtpClient == null) { + mNtpClient = new SntpClient(); + } + boolean isSuccessful = mNtpClient.requestTime(hostAddress, 20000); + Log.e(TAG, "requestTime:" + isSuccessful); + if (isSuccessful) { + long now = mNtpClient.getNtpTime();//now就是获取的时间 + return now; + } else { + + } + return -1; + } + + public static class SntpClient { + private static final String TAG = "SntpClient"; + + private static final int REFERENCE_TIME_OFFSET = 16; + private static final int ORIGINATE_TIME_OFFSET = 24; + private static final int RECEIVE_TIME_OFFSET = 32; + private static final int TRANSMIT_TIME_OFFSET = 40; + private static final int NTP_PACKET_SIZE = 48; + + private static final int NTP_PORT = 123; + private static final int NTP_MODE_CLIENT = 3; + private static final int NTP_VERSION = 3; + + // Number of seconds between Jan 1, 1900 and Jan 1, 1970 + // 70 years plus 17 leap days + private static final long OFFSET_1900_TO_1970 = ((365L * 70L) + 17L) * 24L * 60L * 60L; + + // system time computed from NTP server response + private long mNtpTime; + + // value of SystemClock.elapsedRealtime() corresponding to mNtpTime + private long mNtpTimeReference; + + // round trip time in milliseconds + private long mRoundTripTime; + + /** + * Sends an SNTP request to the given host and processes the response. + * + * @param host host name of the server. + * @param timeout network timeout in milliseconds. + * @return true if the transaction was successful. + */ + public boolean requestTime(String host, int timeout) { + DatagramSocket socket = null; + try { + socket = new DatagramSocket(); + socket.setSoTimeout(timeout); + InetAddress address = InetAddress.getByName(host); + byte[] buffer = new byte[NTP_PACKET_SIZE]; + DatagramPacket request = new DatagramPacket(buffer, + buffer.length, address, NTP_PORT); + + // set mode = 3 (client) and version = 3 + // mode is in low 3 bits of first byte + // version is in bits 3-5 of first byte + buffer[0] = NTP_MODE_CLIENT | (NTP_VERSION << 3); + + // get current time and write it to the request packet + long requestTime = System.currentTimeMillis(); + Log.d(TAG, "RequestTime:" + new Date(requestTime)); + long requestTicks = SystemClock.elapsedRealtime(); + writeTimeStamp(buffer, TRANSMIT_TIME_OFFSET, requestTime); + + socket.send(request); + + // read the response + DatagramPacket response = new DatagramPacket(buffer, + buffer.length); + socket.receive(response); + long responseTicks = SystemClock.elapsedRealtime(); + long responseTime = requestTime + + (responseTicks - requestTicks); + + // extract the results + long originateTime = readTimeStamp(buffer, + ORIGINATE_TIME_OFFSET); + long receiveTime = readTimeStamp(buffer, RECEIVE_TIME_OFFSET); + long transmitTime = readTimeStamp(buffer, TRANSMIT_TIME_OFFSET); + long roundTripTime = responseTicks - requestTicks + - (transmitTime - receiveTime); + // receiveTime = originateTime + transit + skew + // responseTime = transmitTime + transit - skew + // clockOffset = ((receiveTime - originateTime) + (transmitTime + // - responseTime))/2 + // = ((originateTime + transit + skew - originateTime) + + // (transmitTime - (transmitTime + transit - skew)))/2 + // = ((transit + skew) + (transmitTime - transmitTime - transit + // + skew))/2 + // = (transit + skew - transit + skew)/2 + // = (2 * skew)/2 = skew + long clockOffset = ((receiveTime - requestTime) + (transmitTime - System.currentTimeMillis())) / 2; + // if (false) Log.d(TAG, "round trip: " + roundTripTime + + // " ms"); + // if (false) Log.d(TAG, "clock offset: " + clockOffset + + // " ms"); + + // save our results - use the times on this side of the network + // latency + // (response rather than request time) + mNtpTime = System.currentTimeMillis() + clockOffset; +// mNtpTime = transmitTime; + mNtpTimeReference = responseTicks; + mRoundTripTime = roundTripTime; + } catch (Exception e) { + if (false) + Log.e(TAG, "request time failed:" + e); + e.printStackTrace(); + return false; + } finally { + if (socket != null) { + socket.close(); + } + } + + return true; + } + + /** + * Returns the time computed from the NTP transaction. + * + * @return time value computed from NTP server response. + */ + public long getNtpTime() { + return mNtpTime; + } + + /** + * Returns the reference clock value (value of + * SystemClock.elapsedRealtime()) corresponding to the NTP time. + * + * @return reference clock corresponding to the NTP time. + */ + public long getNtpTimeReference() { + return mNtpTimeReference; + } + + /** + * Returns the round trip time of the NTP transaction + * + * @return round trip time in milliseconds. + */ + public long getRoundTripTime() { + return mRoundTripTime; + } + + /** + * Reads an unsigned 32 bit big endian number from the given offset in + * the buffer. + */ + private long read32(byte[] buffer, int offset) { + byte b0 = buffer[offset]; + byte b1 = buffer[offset + 1]; + byte b2 = buffer[offset + 2]; + byte b3 = buffer[offset + 3]; + + // convert signed bytes to unsigned values + int i0 = ((b0 & 0x80) == 0x80 ? (b0 & 0x7F) + 0x80 : b0); + int i1 = ((b1 & 0x80) == 0x80 ? (b1 & 0x7F) + 0x80 : b1); + int i2 = ((b2 & 0x80) == 0x80 ? (b2 & 0x7F) + 0x80 : b2); + int i3 = ((b3 & 0x80) == 0x80 ? (b3 & 0x7F) + 0x80 : b3); + + return ((long) i0 << 24) + ((long) i1 << 16) + ((long) i2 << 8) + + (long) i3; + } + + /** + * Reads the NTP time stamp at the given offset in the buffer and + * returns it as a system time (milliseconds since January 1, 1970). + */ + private long readTimeStamp(byte[] buffer, int offset) { + long seconds = read32(buffer, offset); + long fraction = read32(buffer, offset + 4); + return ((seconds - OFFSET_1900_TO_1970) * 1000) + + ((fraction * 1000L) / 0x100000000L); + } + + /** + * Writes system time (milliseconds since January 1, 1970) as an NTP + * time stamp at the given offset in the buffer. + */ + private void writeTimeStamp(byte[] buffer, int offset, long time) { + long seconds = time / 1000L; + long milliseconds = time - seconds * 1000L; + seconds += OFFSET_1900_TO_1970; + + // write seconds in big endian format + buffer[offset++] = (byte) (seconds >> 24); + buffer[offset++] = (byte) (seconds >> 16); + buffer[offset++] = (byte) (seconds >> 8); + buffer[offset++] = (byte) (seconds >> 0); + + long fraction = milliseconds * 0x100000000L / 1000L; + // write fraction in big endian format + buffer[offset++] = (byte) (fraction >> 24); + buffer[offset++] = (byte) (fraction >> 16); + buffer[offset++] = (byte) (fraction >> 8); + // low order bits should be random data + buffer[offset++] = (byte) (Math.random() * 255.0); + } + } } diff --git a/app/src/main/java/com/info/sn/utils/ToastUtil.java b/app/src/main/java/com/info/sn/utils/ToastUtil.java index 487a787..ab36e09 100644 --- a/app/src/main/java/com/info/sn/utils/ToastUtil.java +++ b/app/src/main/java/com/info/sn/utils/ToastUtil.java @@ -1,65 +1,38 @@ package com.info.sn.utils; -import android.annotation.SuppressLint; -import android.content.Context; -import android.os.Handler; -import android.os.Looper; -import android.widget.Toast; +import android.graphics.Color; +import android.util.Log; +import android.view.Gravity; -import com.info.sn.BuildConfig; - - -/** - * Created by haoge on 2017/3/2. - */ +import com.blankj.utilcode.util.ColorUtils; +import com.blankj.utilcode.util.ToastUtils; +import com.info.sn.R; +import com.info.sn.manager.DeviceManager; public class ToastUtil { - static Handler mainHandler = new Handler(Looper.getMainLooper()); - static Toast toast; - - @SuppressLint("ShowToast") - public static void init(Context context) { - toast = Toast.makeText(context, "", Toast.LENGTH_SHORT); - debugToast = Toast.makeText(context, "", Toast.LENGTH_SHORT); - - } + private static String TAG = ToastUtil.class.getSimpleName(); public static void show(final String msg) { - mainHandler.post(new Runnable() { - @Override - public void run() { - if (toast != null) { - toast.setText(msg); - toast.show(); - } - } - }); + ToastUtils.make() + .setBgColor(ColorUtils.getColor(R.color.toast_color)) + .setTextColor(Color.WHITE) + .setGravity(Gravity.CENTER, 0, 0) + .setNotUseSystemToast() + .show(msg); } - // public static void showInCenter(String msg) { -// mainHandler.post(() -> { -// if (toast != null) { -// toast.setGravity(Gravity.CENTER, 0, 0); -// toast.setText(msg); -// toast.show(); -// } -// }); -// } - static Handler debugHandler = new Handler(Looper.getMainLooper()); - static Toast debugToast; - public static void debugShow(final String msg) { - debugHandler.post(new Runnable() { - @Override - public void run() { - if (BuildConfig.DEBUG) { - if (debugToast != null) { - debugToast.setText(msg); - debugToast.show(); - } - } - } - }); + if (DeviceManager.isDebugMode()) { + ToastUtils.make() + .setBgColor(ColorUtils.getColor(R.color.toast_color)) + .setTextColor(Color.RED) + .setGravity(Gravity.CENTER, 0, 0) + .setNotUseSystemToast() + .setDurationIsLong(true) + .show(msg); + } else { + Log.e(TAG, "debugShow: " + msg); + } } } diff --git a/app/src/main/java/com/info/sn/utils/URLUtils.java b/app/src/main/java/com/info/sn/utils/URLUtils.java index f940db2..a68d165 100644 --- a/app/src/main/java/com/info/sn/utils/URLUtils.java +++ b/app/src/main/java/com/info/sn/utils/URLUtils.java @@ -2,17 +2,16 @@ package com.info.sn.utils; import android.content.Context; import android.os.Build; -import android.provider.Settings; import android.text.TextUtils; import android.util.Log; import android.webkit.WebSettings; import java.io.IOException; import java.net.URI; -import java.net.URL; import java.util.ArrayList; import java.util.Arrays; -import java.util.List; +import java.util.HashSet; +import java.util.function.Predicate; import java.util.regex.Matcher; import java.util.regex.Pattern; @@ -31,106 +30,116 @@ import okhttp3.Response; public class URLUtils { private static String TAG = URLUtils.class.getSimpleName(); private Context mContext; - private List baseURLList = new ArrayList<>(); + private HashSet baseURLList = new HashSet<>(); public URLUtils(Context context) { this.mContext = context; } public void setBrowserList() { - String whiteList = Settings.System.getString(mContext.getContentResolver(), "DeselectBrowserArray"); - String homePage = Settings.System.getString(mContext.getContentResolver(), "homepagURL"); + String whiteList = JGYUtils.getString(mContext.getContentResolver(), "DeselectBrowserArray"); + String homePage = JGYUtils.getString(mContext.getContentResolver(), "homepagURL"); - if (TextUtils.isEmpty(whiteList)) { - Log.e(TAG, "getBrowserWhiteList: " + "whiteList is empty"); - } else { - List URLList = new ArrayList<>(Arrays.asList(whiteList.split(","))); - if (!TextUtils.isEmpty(homePage)) { - if (URLList != null && !URLList.contains(homePage)) { - URLList.add(homePage); - } + HashSet URLList = new HashSet<>(); + if (!TextUtils.isEmpty(whiteList)){ + URLList.addAll(Arrays.asList(whiteList.split(","))); + } + URLList.add("https://xdf.gankao.com"); + URLList.add("https://www.gankao.com"); + if (!TextUtils.isEmpty(homePage)) { + if (!URLList.contains(homePage)) { + URLList.add(homePage); } - Observable.create(new ObservableOnSubscribe() { - @Override - public void subscribe(ObservableEmitter emitter) throws Exception { - baseURLList.clear(); - baseURLList.addAll(URLList); - for (String url : URLList) { - if (url.startsWith("http://")) { - String noHttp = url.substring(7); + } + URLList.removeIf(new Predicate() { + @Override + public boolean test(String s) { + return TextUtils.isEmpty(s.trim()); + } + }); + Log.e(TAG, "setBrowserList: " + URLList); + Observable.create(new ObservableOnSubscribe() { + @Override + public void subscribe(ObservableEmitter emitter) throws Exception { + baseURLList.clear(); + baseURLList.addAll(URLList); + for (String url : URLList) { + if (TextUtils.isEmpty(url.trim())){ + continue; + } + if (url.startsWith("http://")) { + String noHttp = url.substring(7); + if (!baseURLList.contains(noHttp)) { + baseURLList.add(noHttp); + } + emitter.onNext(getOkHttpURL(url)); + } else if (url.startsWith("https://")) { + String noHttps = url.substring(8); + if (!baseURLList.contains(noHttps)) { + baseURLList.add(noHttps); + } + emitter.onNext(getOkHttpURL(url)); + } else { + baseURLList.add("http://" + url); + emitter.onNext(getOkHttpURL("http://" + url)); + baseURLList.add("https://" + url); + emitter.onNext(getOkHttpURL("https://" + url)); + } + Log.e(TAG, "subscribe: " + url); + } + emitter.onComplete(); + } + }).subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new Observer() { + @Override + public void onSubscribe(Disposable d) { + + } + + @Override + public void onNext(String s) { + Log.e(TAG, "onNext: " + s); + if (!baseURLList.contains(s)) { + baseURLList.add(s); + } + if (s.startsWith("http://")) { + String noHttp = s.substring(7); + Log.e(TAG, "onNext: noHttp: " + noHttp); if (!baseURLList.contains(noHttp)) { baseURLList.add(noHttp); } - emitter.onNext(getOkHttpURL(url)); - } else if (url.startsWith("https://")) { - String noHttps = url.substring(8); + } + if (s.startsWith("https://")) { + String noHttps = s.substring(8); + Log.e(TAG, "onNext: noHttps: " + noHttps); if (!baseURLList.contains(noHttps)) { baseURLList.add(noHttps); } - emitter.onNext(getOkHttpURL(url)); - } else { - baseURLList.add("http://" + url); - emitter.onNext(getOkHttpURL("http://" + url)); - baseURLList.add("https://" + url); - emitter.onNext(getOkHttpURL("https://" + url)); } - Log.e(TAG, "subscribe: " + url); } - emitter.onComplete(); - } - }).subscribeOn(Schedulers.io()) - .observeOn(AndroidSchedulers.mainThread()) - .subscribe(new Observer() { - @Override - public void onSubscribe(Disposable d) { - } + @Override + public void onError(Throwable e) { + Log.e(TAG, "onError: " + e.getMessage()); + } - @Override - public void onNext(String s) { - Log.e(TAG, "onNext: " + s); - if (!baseURLList.contains(s)) { - baseURLList.add(s); - } - if (s.startsWith("http://")) { - String noHttp = s.substring(7); - Log.e(TAG, "onNext: noHttp: " + noHttp); - if (!baseURLList.contains(noHttp)) { - baseURLList.add(noHttp); - } - } - if (s.startsWith("https://")) { - String noHttps = s.substring(8); - Log.e(TAG, "onNext: noHttps: " + noHttps); - if (!baseURLList.contains(noHttps)) { - baseURLList.add(noHttps); - } + @Override + public void onComplete() { + Log.e(TAG, "onComplete: "); + StringBuilder stringBuilder = new StringBuilder(); + for (String s : baseURLList) { + if (stringBuilder.length() > 0) { + stringBuilder.append(","); } + stringBuilder.append(s); } - - @Override - public void onError(Throwable e) { - Log.e(TAG, "onError: " + e.getMessage()); - } - - @Override - public void onComplete() { - Log.e(TAG, "onComplete: "); - StringBuilder stringBuilder = new StringBuilder(); - for (String s : baseURLList) { - if (stringBuilder.length() > 0) { - stringBuilder.append(","); - } - stringBuilder.append(s); - } - String DeselectBrowserArray = stringBuilder.toString(); - boolean write = Settings.System.putString(mContext.getContentResolver(), "DeselectBrowserArray", DeselectBrowserArray); - Log.e(TAG, "onComplete: " + "white list: " + DeselectBrowserArray); - Log.e(TAG, "onComplete: " + "write :" + write); - } - }); - } - + String DeselectBrowserArray = stringBuilder.toString(); + boolean write = JGYUtils.putString(mContext.getContentResolver(), "DeselectBrowserArray", DeselectBrowserArray); + Log.e(TAG, "onComplete: " + "white list: " + DeselectBrowserArray); + Log.e(TAG, "onComplete: " + "write :" + write); + } + }); } private String getOkHttpURL(String URL) { @@ -236,7 +245,7 @@ public class URLUtils { sb.append(c); } } - Log.e(TAG, "getUserAgent: " + sb.toString()); +// Log.e(TAG, "getUserAgent: " + sb.toString()); return sb.toString(); } } diff --git a/app/src/main/java/com/info/sn/utils/Utils.java b/app/src/main/java/com/info/sn/utils/Utils.java index 775e970..bd5935f 100644 --- a/app/src/main/java/com/info/sn/utils/Utils.java +++ b/app/src/main/java/com/info/sn/utils/Utils.java @@ -31,6 +31,7 @@ import android.net.wifi.WifiManager; import android.os.BatteryManager; import android.os.Build; import android.os.StatFs; +import android.os.SystemClock; import android.provider.Settings; import android.telephony.TelephonyManager; import android.text.TextUtils; @@ -44,8 +45,9 @@ import android.view.inputmethod.InputMethodManager; import android.widget.EditText; import android.widget.Toast; +import androidx.annotation.VisibleForTesting; + import com.alibaba.fastjson.JSON; -import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.google.zxing.BarcodeFormat; import com.google.zxing.EncodeHintType; @@ -53,14 +55,19 @@ import com.google.zxing.WriterException; import com.google.zxing.common.BitMatrix; import com.google.zxing.qrcode.QRCodeWriter; import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel; -import com.info.sn.BuildConfig; import com.info.sn.R; -import com.info.sn.bean.SystemSettings; +import com.info.sn.Statistics.AppInformation; +import com.info.sn.Statistics.StatisticsInfo; +import com.info.sn.bean.zuoye.AppUsed; +import com.info.sn.bean.zuoye.SystemSettings; +import com.info.sn.manager.DeviceManager; import java.io.BufferedReader; import java.io.File; import java.io.FileFilter; +import java.io.FileNotFoundException; import java.io.FileReader; +import java.io.IOException; import java.io.InputStreamReader; import java.io.LineNumberReader; import java.io.Reader; @@ -76,23 +83,16 @@ import java.util.Calendar; import java.util.Collections; import java.util.Date; import java.util.HashMap; +import java.util.HashSet; import java.util.List; import java.util.Map; +import java.util.function.Predicate; import java.util.regex.Pattern; - - +import static android.content.Context.WIFI_SERVICE; public class Utils { - private static final String TAG = "Utils"; - protected static Toast toast = null; - private static String oldMsg; - private static long oneTime = 0; - private static long twoTime = 0; - - - // 积分记录 达人标准次数记录 - + private static final String TAG = Utils.class.getSimpleName(); // MD5 设备地址标识 public static String getMAC(Context context) { @@ -198,7 +198,6 @@ public class Utils { return builder.toString(); } - // MD5 设备地址标识 public static String getMD5(Context context) { String WLANMAC = getMAC(context); @@ -239,7 +238,6 @@ public class Utils { return simSerialNumber; } - private static String getPesudoUniqueID() { String m_szDevIDShort = "35" + //we make this look like a valid IMEI Build.BOARD.length() % 10 + @@ -258,7 +256,6 @@ public class Utils { return m_szDevIDShort; } - // 防止连续点击 private static long lastClickTime; @@ -292,7 +289,6 @@ public class Utils { return sBuffer.toString(); } - // 根据日期取得星期几 public static String getWeek(Date date) { String[] weeks = {"星期日", "星期一", "星期二", "星期三", "星期四", "星期五", "星期六"}; @@ -305,7 +301,6 @@ public class Utils { return weeks[week_index]; } - // 非空判断 public static boolean isEmpty(String s) { if (null == s) @@ -354,12 +349,9 @@ public class Utils { } // 打开app - public static void startApp(Context context, String packageName, - String activityName) { - + public static void startApp(Context context, String packageName, String activityName) { if (TextUtils.isEmpty(packageName)) return; - try { Intent intent = null; if (TextUtils.isEmpty(activityName)) { @@ -381,10 +373,8 @@ public class Utils { } } - public static Intent getLaunchIntentForNoCategory(Context context, - String packageName) { + public static Intent getLaunchIntentForNoCategory(Context context, String packageName) { Intent intent = null; - PackageManager packageManager = context.getPackageManager(); PackageInfo packageinfo = null; try { @@ -397,9 +387,7 @@ public class Utils { } Intent resolveIntent = new Intent(Intent.ACTION_MAIN, null); resolveIntent.setPackage(packageinfo.packageName); - List resolveinfoList = packageManager - .queryIntentActivities(resolveIntent, 0); - + List resolveinfoList = packageManager.queryIntentActivities(resolveIntent, 0); ResolveInfo resolveinfo = resolveinfoList.iterator().next(); if (resolveinfo != null) { String className = resolveinfo.activityInfo.name; @@ -419,9 +407,8 @@ public class Utils { if (initSetting) { mPrefs.edit().putBoolean("init_setting", false).commit(); } - Settings.System.putInt(context.getContentResolver(), Settings.System.SCREEN_BRIGHTNESS_MODE, 0); + JGYUtils.putInt(context.getContentResolver(), Settings.System.SCREEN_BRIGHTNESS_MODE, 0); mPrefs.edit().putBoolean("first_init", false).commit(); - } catch (Exception err) { err.printStackTrace(); } @@ -476,6 +463,12 @@ public class Utils { return new String(c); } + + protected static Toast toast = null; + private static String oldMsg; + private static long oneTime = 0; + private static long twoTime = 0; + public static void showToast(Context context, String s) { if (toast == null) { toast = Toast.makeText(context, s, Toast.LENGTH_SHORT); @@ -555,7 +548,6 @@ public class Utils { return timeClick.toString(); } - public static String getVersionName(Context context) { // 获取packagemanager的实例 PackageManager packageManager = context.getPackageManager(); @@ -573,7 +565,6 @@ public class Utils { return ""; } - /** * 根据手机的分辨率从 dp 的单位 转成为 px(像素) */ @@ -590,7 +581,6 @@ public class Utils { return (int) (pxValue / scale + 0.5f); } - public static float dp2px(Resources resources, float dp) { final float scale = resources.getDisplayMetrics().density; return dp * scale + 0.5f; @@ -609,7 +599,6 @@ public class Utils { return t1; } - private static void getAdmin(Context context, ComponentName componentName) { Intent intent = new Intent(DevicePolicyManager.ACTION_ADD_DEVICE_ADMIN); intent.putExtra(DevicePolicyManager.EXTRA_DEVICE_ADMIN, componentName); @@ -642,6 +631,75 @@ public class Utils { return serial; } + /** + * @param context 获取真实的MAC地址 + * @return + */ + public static String getAndroid10MAC(Context context) { + if (Build.VERSION.SDK_INT > Build.VERSION_CODES.N_MR1) { + return getMacAddress(context); + } else { + return getAndroid7MAC(); + } + } + + @SuppressLint("HardwareIds") + @VisibleForTesting + public static String getMacAddress(Context mContext) { + WifiManager mWifiManager = (WifiManager) mContext.getSystemService(WIFI_SERVICE); + final String[] macAddresses = mWifiManager.getFactoryMacAddresses(); + String macAddress = null; + if (macAddresses != null && macAddresses.length > 0) { + macAddress = macAddresses[0]; + } + + if (TextUtils.isEmpty(macAddress)) { + String mac = getMacFromFile(); + // Add for CTCC Feature:WIFI MAC should be gotten while wifi disabled. + // Get Wifi MAC from file since we can not get it with WifiManager. + if (!TextUtils.isEmpty(mac)) { + macAddress = mac; + } else { + macAddress = "未能获取到MAC地址"; + } + } + return macAddress.toUpperCase(); + } + + /** + * Add for CTCC Feature:WIFI MAC should be gotten while wifi disabled. + * get Wifi MAC from /mnt/vendor/wifimac.txt + * + * @{ + */ + private static String MACID_FILE_PATH = "/mnt/vendor/wifimac.txt"; + + private static String getMacFromFile() { + File file = new File(MACID_FILE_PATH); + BufferedReader reader = null; + String macAddress = null; + try { + reader = new BufferedReader(new FileReader(file)); + String line; + while ((line = reader.readLine()) != null) { + macAddress = line; + break; + } + } catch (FileNotFoundException e) { + Log.w(TAG, "Mac file not exist", e); + } catch (Exception e) { + Log.w(TAG, "get mac from file caught exception", e); + } finally { + try { + if (reader != null) + reader.close(); + } catch (IOException e) { + Log.w(TAG, "reader close exception"); + } + } + return macAddress; + } + public static final long A_GB = 1073741824; public static final long A_MB = 1048576; public static final int A_KB = 1024; @@ -665,7 +723,6 @@ public class Utils { } } - public static String transferLongToDate(Long millSec) { SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); @@ -676,10 +733,6 @@ public class Utils { } -// public static String getSn() { -// return Build.SERIAL; -// } - public static Bitmap createQRImage(String content, int widthPix, int heightPix) { try { // if (content == null || "".equals(content)) { @@ -730,7 +783,6 @@ public class Utils { } catch (Exception e) { e.printStackTrace(); } - return null; } @@ -746,7 +798,6 @@ public class Utils { Log.e("isSystemApp", e.getMessage(), e); } - // 是系统中已安装的应用 if (pi != null) { boolean isSysApp = (pi.applicationInfo.flags & ApplicationInfo.FLAG_SYSTEM) == 1; @@ -759,7 +810,6 @@ public class Utils { public static Bitmap getRoundedBitmap(Bitmap mBitmap, Context context) { Bitmap bgBitmap = Bitmap.createBitmap(mBitmap.getWidth(), mBitmap.getHeight(), Bitmap.Config.ARGB_8888); - Bitmap mask = BitmapFactory.decodeResource(context.getResources(), R.drawable.mask); int width = mask.getWidth(); int height = mask.getHeight(); @@ -789,7 +839,6 @@ public class Utils { canvas2.drawBitmap(result, 0, 0, paint2); return result2; - // Canvas mCanvas = new Canvas(); // mCanvas.setBitmap(bgBitmap); // Paint mPaint = new Paint(); @@ -806,338 +855,77 @@ public class Utils { // return bgBitmap; } - private static int changeNum(int status) { - return status == 0 ? 1 : 0; - } - - public static void setSystemSetting(Context context, String data) { - if (TextUtils.isEmpty(data)) { - return; - } - SystemSettings settings = JSON.parseObject(data, SystemSettings.class); - if (null != settings) { - setPhoneList(context, settings); - setUSBstate(context, settings); - setBluetooth(context, settings); - setHotspot(context, settings); - setBar(context, settings); - setCamera(context, settings); - setTF(context, settings); - setIcon(context, settings); - } - - } - - private static void setPhoneList(Context mContext, SystemSettings settings) { - //设置电话功能,电话白名单 - int setting_call = changeNum(settings.getSetting_call()); - boolean qch_call_forbid = Settings.System.putInt(mContext.getContentResolver(), "qch_call_forbid", setting_call); - Log.e("SystemSetting", "qch_call_forbid:" + qch_call_forbid); - - int setting_phone = changeNum(settings.getSetting_phone()); - boolean qch_white_list_on = Settings.System.putInt(mContext.getContentResolver(), "qch_white_list_on", setting_phone); - Log.e("SystemSetting", "qch_white_list_on:" + qch_white_list_on); - - String setting_phones = settings.getSetting_phones(); - boolean qch_white_list_Array = Settings.System.putString(mContext.getContentResolver(), "qch_white_list_Array", setting_phones); - Log.e("SystemSetting", "qch_white_list_Array:" + qch_white_list_Array + "=" + setting_phones); - - int setting_memory = changeNum(settings.getSetting_memory()); - boolean qch_sdcard_forbid_on = Settings.System.putInt(mContext.getContentResolver(), "qch_sdcard_forbid_on", setting_memory); - Log.e("SystemSetting", "qch_sdcard_forbid_on:" + qch_sdcard_forbid_on); - } - - private static void setUSBstate(Context mContext, SystemSettings settings) { - //USB数据功能管控 - //仅充电:usb_charge - //MTP模式:usb_mtp - //Midi模式:usb_midi - String setting_usb = settings.getSetting_usb(); - Log.e("SystemSetting", "setting_usb:" + setting_usb); - if (!BuildConfig.DEBUG) { - try { - boolean qch_usb_choose = Settings.System.putString(mContext.getContentResolver(), "qch_usb_choose", setting_usb); - Log.e("SystemSetting", "qch_usb_choose:" + qch_usb_choose); - String usbStatus = ""; - switch (setting_usb) { - case "usb_charge": - usbStatus = "qch_action_usb_usb_charge"; - break; - case "usb_mtp": - usbStatus = "qch_action_usb_usb_mtp"; - break; - case "usb_midi": - usbStatus = "qch_action_usb_usb_midi"; - break; - - } - Intent usbIntent = new Intent(usbStatus).setPackage("com.android.settings"); - mContext.sendBroadcast(usbIntent); - } catch (Exception e) { - Log.e(TAG, "setUSBstate: " + e.getMessage()); - } - } - - } - - private static void setBluetooth(Context mContext, SystemSettings settings) { - try { - //蓝牙开关 - int setting_bht = changeNum(settings.getSetting_bht()); - //总开关 - int setting_bhtvideo = changeNum(settings.getSetting_bhtvideo()); - //蓝牙音频开关 - int setting_bluetooth = changeNum(settings.getSetting_bluetooth()); - //蓝牙传输开关 - boolean qch_bht_forbid_on = Settings.System.putInt(mContext.getContentResolver(), "qch_bht_forbid_on", setting_bht); - //写入系统数据库 - Log.e("SystemSetting", "qch_bht_forbid_on:" + qch_bht_forbid_on); - BluetoothAdapter mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter(); - if (qch_bht_forbid_on) { - //成功 - if (null == mBluetoothAdapter) { - mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter(); - //获取默认蓝牙适配器 - } - if (setting_bht == 0) { - //蓝牙总开关开启 - String setting_context = settings.getSetting_context(); - if (setting_bhtvideo == 0) { - if (null != setting_context && !setting_context.equals("") && !setting_context.equals(" ") && !setting_context.equals("null")) { - Log.e("SystemSetting", "setting_context:" + setting_context); - Settings.System.putString(mContext.getContentResolver(), "qch_bhtvideo_forbid_on", setting_context); - } else { - Settings.System.putString(mContext.getContentResolver(), "qch_bhtvideo_forbid_on", "Empty"); - } - } else if (setting_bhtvideo == 1) { - Settings.System.putString(mContext.getContentResolver(), "qch_bhtvideo_forbid_on", "Empty"); - } - Settings.System.putInt(mContext.getContentResolver(), "qch_bt_forbid_on", setting_bluetooth); - } else { - mBluetoothAdapter.disable(); - //设置关闭时关闭蓝牙 - } - } - } catch (Exception e) { - Log.e(TAG, "setBluetooth: " + e.getMessage()); - } - } - - private static void setHotspot(Context mContext, SystemSettings settings) { - try { - int setting_hotspot = changeNum(settings.getSetting_hotspot());//热点 - if (setting_hotspot == 1) { - Intent intent = new Intent(); - intent.setAction("qch_hotspot_close"); - intent.setPackage("com.android.settings"); - mContext.sendStickyBroadcast(intent); - } - boolean qch_hotspot_forbid_on = Settings.System.putInt(mContext.getContentResolver(), "qch_hotspot_forbid_on", setting_hotspot);//写入系统数据库 - Log.e("SystemSetting", "qch_hotspot_forbid_on:" + setting_hotspot); - Log.e("SystemSetting", "qch_hotspot_forbid_on:" + qch_hotspot_forbid_on); - } catch (Exception e) { - Log.e(TAG, "setHotspot: " + e.getMessage()); - } - } - - private static void setBar(Context mContext, SystemSettings settings) { - //系统导航条显示开关 - int setting_navigation = changeNum(settings.getSetting_navigation()); - boolean qch_hide_navigationBar = Settings.System.putInt(mContext.getContentResolver(), "qch_hide_NavigationBar", setting_navigation); - Log.e("SystemSetting", "qch_hide_navigationBar:" + qch_hide_navigationBar); - - String navigationStatus = ""; - switch (setting_navigation) { - case 0: - navigationStatus = "qch_show_NavigationBar"; - break; - case 1: - navigationStatus = "qch_hide_NavigationBar"; - break; - - } - Intent navIntent = new Intent(navigationStatus).setPackage("com.android.systemui"); - mContext.sendBroadcast(navIntent); - - - //状态栏显示开关 - int setting_statusbar = changeNum(settings.getSetting_statusbar()); - int oldNum = Settings.System.getInt(mContext.getContentResolver(), "qch_hide_statusBar", 0); - if (oldNum != setting_statusbar) { - boolean qch_hide_statusBar = Settings.System.putInt(mContext.getContentResolver(), "qch_hide_statusBar", setting_statusbar); - Log.e("SystemSetting", "qch_hide_statusBar:" + qch_hide_statusBar); - String statusbarStatus = ""; - switch (setting_statusbar) { - case 0: - statusbarStatus = "qch_show_statusBar"; - break; - case 1: - statusbarStatus = "qch_hide_statusBar"; - break; - } - Intent statusIntent = new Intent(statusbarStatus).setPackage("com.android.systemui"); - mContext.sendBroadcast(statusIntent); - } - } - - private static void setCamera(Context mContext, SystemSettings settings) { - try { - //摄像头开关 - int setting_camera = changeNum(settings.getSetting_camera()); - Settings.System.putInt(mContext.getContentResolver(), "qch_app_camera", setting_camera); -// ApkUtils.hideSystemSettingAPP(mContext, "com.mediatek.camera"); - Log.e("SystemSetting", "setting_camera:" + setting_camera); - String cameraStatus = ""; - switch (setting_camera) { - case 0: - cameraStatus = "qch_camera_open"; - break; - case 1: - cameraStatus = "qch_camera_forbid"; - break; - } - Intent cameraIntent = new Intent(cameraStatus).setPackage("com.android.settings"); - mContext.sendBroadcast(cameraIntent); - } catch (Exception e) { - Log.e(TAG, "setCamera: " + e.getMessage()); - } - } - - private static void setTF(Context mContext, SystemSettings settings) { - try { - //tfmedia开关 - int setting_tfmedia = changeNum(settings.getSetting_tfmedia()); - boolean qch_tfmedia_forbid = Settings.System.putInt(mContext.getContentResolver(), - "qch_tfmedia_forbid", setting_tfmedia); - Log.e("SystemSetting", "setting_tfmedia:" + qch_tfmedia_forbid); - String tfmediaStatus = ""; - switch (setting_tfmedia) { - case 0: - tfmediaStatus = "qch_tfmedia_open"; - break; - case 1: - tfmediaStatus = "qch_tfmedia_forbid"; - break; - } - Intent tfmediaIntent = new Intent(tfmediaStatus).setPackage("com.android.settings"); - mContext.sendBroadcast(tfmediaIntent); - if (setting_tfmedia == 1) { - JSONArray jSONArray = null; - jSONArray = JSON.parseArray(settings.getSetting_tfmedia_format()); - - int i = 0; - StringBuffer stringBuffer = new StringBuffer(); - while (!jSONArray.isEmpty()) { - stringBuffer.append(jSONArray.getString(i)); - stringBuffer.append(","); - i++; - } - stringBuffer.deleteCharAt(stringBuffer.length() - 1); - Settings.System.putString(mContext.getContentResolver(), "qch_tfmedia_filetypes", stringBuffer.toString());//影音管控 - Log.e("SystemSetting", "qch_tfmedia_filetypes---------" + stringBuffer.toString()); - - - } else { - Settings.System.putInt(mContext.getContentResolver(), "qch_tfmedia_forbid", 0); - } - } catch (Exception e) { - Log.e(TAG, "setTF: " + e.getMessage()); - } - } - - private static void setIcon(Context mContext, SystemSettings settings) { - try { - //added:2019.12.6 - //设置5个app的开关 - //时钟 - int deskclock = changeNum(settings.getSetting_clock()); - Settings.System.putInt(mContext.getContentResolver(), "qch_app_deskclock", deskclock); - ApkUtils.hideSystemSettingAPP(mContext, "com.android.deskclock"); - Log.e("SystemSetting", "qch_app_deskclock:" + deskclock); - //录音机 - int soundrecorder = changeNum(settings.getSetting_recording()); - Settings.System.putInt(mContext.getContentResolver(), "qch_app_soundrecorder", soundrecorder); - ApkUtils.hideSystemSettingAPP(mContext, "com.android.soundrecorder"); - Log.e("SystemSetting", "qch_app_soundrecorder:" + soundrecorder); - //音乐 - int music = changeNum(settings.getSetting_music()); - Settings.System.putInt(mContext.getContentResolver(), "qch_app_music", music); - ApkUtils.hideSystemSettingAPP(mContext, "com.android.music"); - Log.e("SystemSetting", "qch_app_music:" + music); - //图库 - int gallery = changeNum(settings.getSetting_picture()); - Settings.System.putInt(mContext.getContentResolver(), "qch_app_gallery", gallery); - ApkUtils.hideSystemSettingAPP(mContext, "com.android.gallery3d"); - Log.e("SystemSetting", "qch_app_gallery:" + gallery); - //壁纸 - int wallpaper = changeNum(settings.getSetting_wallpaper()); - Settings.System.putInt(mContext.getContentResolver(), "qch_app_wallpaper", wallpaper); - Log.e("SystemSetting", "qch_app_wallpaper:" + wallpaper); - //文件管理器 - int filemanager = changeNum(settings.getSetting_file()); - Settings.System.putInt(mContext.getContentResolver(), "qch_app_filemanager", filemanager); - if (Build.VERSION.SDK_INT < Build.VERSION_CODES.O) { - ApkUtils.hideSystemSettingAPP(mContext, "com.mediatek.filemanager"); - } else { - ApkUtils.hideSystemSettingAPP(mContext, "com.android.documentsui"); - } - Log.e("SystemSetting", "qch_app_filemanager:" + filemanager); - } catch (Exception e) { - Log.e(TAG, "setIcon: " + e.getMessage()); - } - } - - /** + * 更新应用白名单禁止升级 + * * @param context - * @param notList 禁止列表 - * @param allowList 允许列表 * @return */ - static synchronized public boolean writeDisableUpdateList(Context context, String[] notList, String[] allowList) { - String now = Settings.System.getString(context.getContentResolver(), "qch_app_forbid"); - String[] nowList; - List allList; - if (now == null || now.equalsIgnoreCase("")) { - allList = new ArrayList<>(); - } else { - nowList = now.split(","); - allList = new ArrayList<>(Arrays.asList(nowList));//已经写入的列表 + @SuppressLint("NewApi") + static synchronized public boolean writeDisableUpdateList(Context context) { + //允许安装的app + String now = JGYUtils.getString(context.getContentResolver(), "qch_app_forbid"); + //禁止升级的app + String upgrade_disallow = Settings.System.getString(context.getContentResolver(), "upgrade_disallow"); + //所有app + String only_jgy_shortcut_list = Settings.System.getString(context.getContentResolver(), "only_jgy_shortcut_list"); + Log.e("writeDisableUpdateList", now); + List nowList = new ArrayList<>(); + List disallowList = new ArrayList<>(); + List allList = new ArrayList<>(); + if (!TextUtils.isEmpty(now)) { + nowList = new ArrayList<>(new HashSet<>(Arrays.asList(now.trim().replaceAll(" ", "").split(",")))); } - boolean writeSucceed = false; - if (notList != null && notList.length > 0) { - for (String s : notList) { - if (ApkUtils.isAvailable(context, s)) { - allList.remove(s); - //去掉已经安装的 - } else { - if (allList.indexOf(s) == -1) { - allList.add(s); - } - //没有安装就加入进去 - //没有加入会导致安装后卸载不能再安装的情况 + if (!TextUtils.isEmpty(upgrade_disallow)) { + disallowList = new ArrayList<>(new HashSet<>(Arrays.asList(upgrade_disallow.trim().replaceAll(" ", "").split(",")))); + } + if (!TextUtils.isEmpty(only_jgy_shortcut_list)) { + allList = new ArrayList<>(new HashSet<>(Arrays.asList(only_jgy_shortcut_list.trim().replaceAll(" ", "").split(",")))); + } + Log.e("writeDisableUpdateList", "nowList: " + nowList); + Log.e("writeDisableUpdateList", "upgrade_disallow: " + disallowList); + Log.e("writeDisableUpdateList", "only_jgy_shortcut_list: " + allList); + if (allList.size() != 0) { + List finalAllList = allList; + nowList.removeIf(new Predicate() { + @Override + public boolean test(String s) { + return !finalAllList.contains(s); } - } + }); } - for (String s : allowList) { - if (allList.indexOf(s) == -1) { + + boolean writeSucceed = false; + for (String s : disallowList) { + if (ApkUtils.isAvailable(context, s)) { + if (nowList.remove(s)) { + Log.e("writeDisableUpdateList", "remove :" + s); + } else { + Log.e("writeDisableUpdateList", "remove failed:" + s); + } + //去掉已经安装的 + } else { + if (!nowList.contains(s)) { + nowList.add(s); + } + //没有安装就加入进去 + //没有加入会导致安装后卸载不能再安装的情况 + } + Log.e("writeDisableUpdateList", "nowList:" + nowList); + } + for (String s : nowList) { + if (!allList.contains(s)) { allList.add(s); //没找到元素添加到白名单 } } if (allList.size() > 0) { - String list = ""; - for (String str : allList) { - list += str + ","; - } - list = list.substring(0, list.length() - 1); - Log.e("fht", list); - writeSucceed = Settings.System.putString(context.getContentResolver(), "qch_app_forbid", list); - Log.e("fht", "qch_app_forbid:" + list); + String list = String.join(",", allList); + writeSucceed = JGYUtils.putString(context.getContentResolver(), "qch_app_forbid", list); + Log.e("writeDisableUpdateList", "qch_app_forbid:" + list); } else { - writeSucceed = Settings.System.putString(context.getContentResolver(), "qch_app_forbid", "Invalid"); + writeSucceed = JGYUtils.putString(context.getContentResolver(), "qch_app_forbid", "Invalid"); } - return writeSucceed; /*功能和应用安装白名单一样,首先会写入所有的app名单。 *如果已经安装就从白名单删除,没有安装的不用删除 @@ -1165,15 +953,14 @@ public class Utils { // IMEI = TelephonyMgr.getDeviceId(); // } else {//9.0到10.0获取 - IMEI = Settings.System.getString(context.getContentResolver(), Settings.Secure.ANDROID_ID); + IMEI = JGYUtils.getString(context.getContentResolver(), Settings.Secure.ANDROID_ID); } - Log.e("IMEI:", "IMEI: " + IMEI); +// Log.e("IMEI:", "IMEI: " + IMEI); if (null == IMEI) { return "-"; } else { return IMEI.toUpperCase(); } - } public static String getAndroiodScreenProperty(Context context) { @@ -1260,6 +1047,19 @@ public class Utils { } } + /** + * @param context + * @return 已经使用 + */ + public static long getUsedMemory(Context context) { + ActivityManager activityManager = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE); + ActivityManager.MemoryInfo memoryInfo = new ActivityManager.MemoryInfo(); + activityManager.getMemoryInfo(memoryInfo); + long freeMem = memoryInfo.totalMem - memoryInfo.availMem; +// Log.e("getHardware", "getFreeMemory: " + freeMem); + return freeMem; + } + /** * 描述:获取可用内存. * @@ -1309,12 +1109,31 @@ public class Utils { return memory * 1024; } + public static float getUse_space(Context context) { + StatFs sf = new StatFs(context.getCacheDir().getAbsolutePath()); + long availableSize = sf.getAvailableBytes(); + Log.e(TAG, "getUse_space: availableSize = " + availableSize); + long blockSize = sf.getBlockSize(); + Log.e(TAG, "getUse_space: blockSize = " + blockSize); + long totalBlocks = sf.getBlockCount(); + Log.e(TAG, "getUse_space: totalBlocks = " + totalBlocks); + return (float) 1.0 * availableSize / (blockSize * totalBlocks); + } + public static String getRemnantSize(Context context) { StatFs sf = new StatFs(context.getCacheDir().getAbsolutePath()); long availableSize = sf.getAvailableBytes(); return Formatter.formatFileSize(context, availableSize); } + public static String getUsedSize(Context context) { + StatFs sf = new StatFs(context.getCacheDir().getAbsolutePath()); + long availableSize = sf.getAvailableBytes(); + long blockSize = sf.getBlockSize(); + long totalBlocks = sf.getBlockCount(); + return Formatter.formatFileSize(context, blockSize * totalBlocks - availableSize); + } + public static String getDataTotalSize(Context context) { StatFs sf = new StatFs(context.getCacheDir().getAbsolutePath()); long blockSize = sf.getBlockSize(); @@ -1348,24 +1167,12 @@ public class Utils { } } - - public static String getMachine(Context context) { - String device = Build.MODEL;//机型 - String imei = getIMEI(context); - String system_version = Build.VERSION.RELEASE; - String firmware_version = getProperty("ro.build.display.id", "获取失败"); - String rom = getProperty("ro.custom.build.version", "获取失败"); - String screen_rate = getAndroiodScreenProperty(context); - JSONObject jsonObject = new JSONObject(); - jsonObject.put("device", device); - jsonObject.put("imei", imei); - jsonObject.put("system_version", system_version); - jsonObject.put("firmware_version", firmware_version); - jsonObject.put("rom", rom); - jsonObject.put("screen_rate", screen_rate); - return jsonObject.toJSONString(); - } - + /** + * 获取系统配置信息 + * @param key + * @param defaultValue + * @return + */ public static String getProperty(String key, String defaultValue) { String value = defaultValue; try { @@ -1379,54 +1186,87 @@ public class Utils { } } + public static String getMachine(Context context) { + String device = Build.MODEL;//机型 + String imei = getIMEI(context); + Log.e(TAG, "getMachine: " + imei); + String system_version = Build.VERSION.RELEASE; + String firmware_version = JGYUtils.getRomVersion(); + String rom = JGYUtils.getCustomVersion(); + + String screen_rate = getAndroiodScreenProperty(context); + JSONObject jsonObject = new JSONObject(); + jsonObject.put("device", device); + jsonObject.put("imei", imei); + jsonObject.put("system_version", system_version); + jsonObject.put("firmware_version", firmware_version); + jsonObject.put("rom", rom); + jsonObject.put("screen_rate", screen_rate); + return jsonObject.toJSONString(); + } + public static String getHardware(Context context) { int electric = getBattery(context); int charging = getIsCharging(context); - String memory = Formatter.formatFileSize(context, getAvailMemory(context)) + "\t 已用" + "/" + "共" + Formatter.formatFileSize(context, getTotalMemory(context)); - String storage = getRemnantSize(context) + "/" + getDataTotalSize(context); + String memory = Formatter.formatFileSize(context, getUsedMemory(context)) + "\t 已用" + "/" + "共" + Formatter.formatFileSize(context, getTotalMemory(context)); + Log.e(TAG, "getHardware: memory = " + memory); + int use_ram = (int) ((float) (1.0 * getUsedMemory(context)) / (1.0 * getTotalMemory(context)) * 100); + Log.e(TAG, "getHardware: use_ram = " + use_ram); + String storage = getUsedSize(context) + "/" + getDataTotalSize(context); + Log.e(TAG, "getHardware: storage = " + storage); + double use_space = getUse_space(context); + Log.e(TAG, "getHardware: use_space = " + use_space); + long wifi_time = (long) com.info.sn.utils.SPUtils.get(context, "wifi_last_connect_time", 0L)/1000; + Log.e(TAG, "getHardware: wifi_time" + wifi_time); int CPU = getNumCores(); JSONObject jsonObject = new JSONObject(); jsonObject.put("electric", electric); jsonObject.put("charging", charging); jsonObject.put("memory", memory); jsonObject.put("storage", storage); + jsonObject.put("is_wifi", JGYUtils.isWifiConnect(context)); jsonObject.put("CPU", CPU + "核"); + jsonObject.put("use_space", use_space); + jsonObject.put("use_ram", use_ram); + jsonObject.put("wifi_ssid", getWifiSSID(context)); + jsonObject.put("wifi_time", wifi_time); + jsonObject.put("boot_time", SystemClock.elapsedRealtime()); + Log.e(TAG, "getHardware: " + jsonObject.toJSONString()); return jsonObject.toJSONString(); } - public static void rebootDevices(Context context) { - if (BuildConfig.DEBUG) { - ToastUtil.show("收到重启设备推送消息"); - return; + public static String getWifiSSID(Context context) { + WifiManager wifiManager = (WifiManager) context.getSystemService(Context.WIFI_SERVICE); + WifiInfo wifiInfo = wifiManager.getConnectionInfo(); + if (wifiInfo != null) { + return wifiInfo.getSSID(); + } else { + return ""; } - Intent iReboot = new Intent(Intent.ACTION_REBOOT); - iReboot.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); - context.startActivity(iReboot); } - synchronized public static void doMasterClear(Context context) { - if (BuildConfig.DEBUG) { - ToastUtil.show("收到重置设备推送消息"); - return; - } - if (Build.VERSION.SDK_INT > Build.VERSION_CODES.N_MR1) { - Intent intent = new Intent("android.intent.action.FACTORY_RESET"); - intent.setPackage("android"); - intent.addFlags(Intent.FLAG_RECEIVER_FOREGROUND); - intent.putExtra("android.intent.extra.REASON", "MasterClearConfirm"); - intent.putExtra("android.intent.extra.WIPE_EXTERNAL_STORAGE", false); - intent.putExtra("com.android.internal.intent.extra.WIPE_ESIMS", false); - context.sendBroadcast(intent); - } else { - //10.0的不需要最小电量 -// if (getBatteryLevel(context) >= CommonDatas.MIN_POWER) { - Intent intent = new Intent("android.intent.action.MASTER_CLEAR"); -// intent.setPackage("com.android.settings"); - context.sendBroadcast(intent); -// } else { -// MySQLData.SetBooleanData(context, CommonDatas.IS_RESET, true); -// } + public static String getAppUsedStatistics(Context context) { + StatisticsInfo statisticsInfo = new StatisticsInfo(context, 3); + long totalTime = statisticsInfo.getTotalTime(); + int totalTimes = statisticsInfo.getTotalTimes(); + List datalist = statisticsInfo.getShowList(); + List appUsedList = new ArrayList<>(); + for (AppInformation information : datalist) { + AppUsed used = new AppUsed(); + used.setPackages(information.getPackageName()); + used.setUseTime(information.getUsedTimebyDay() / 1000); + used.setApp_name(information.getLabel()); + appUsedList.add(used); } + appUsedList.removeIf(new Predicate() { + @Override + public boolean test(AppUsed appUsed) { + return appUsed.getUseTime() == 0; + } + }); + String jsonString = JSON.toJSONString(appUsedList); + return jsonString; } + } \ No newline at end of file diff --git a/app/src/main/res/drawable-hdpi/applet_qrcode.png b/app/src/main/res/drawable-hdpi/applet_qrcode.png new file mode 100644 index 0000000..5c4fbd0 Binary files /dev/null and b/app/src/main/res/drawable-hdpi/applet_qrcode.png differ diff --git a/app/src/main/res/drawable-hdpi/main_device.png b/app/src/main/res/drawable-hdpi/main_device.png new file mode 100644 index 0000000..ca364c9 Binary files /dev/null and b/app/src/main/res/drawable-hdpi/main_device.png differ diff --git a/app/src/main/res/drawable-hdpi/main_grade.png b/app/src/main/res/drawable-hdpi/main_grade.png new file mode 100644 index 0000000..492e30d Binary files /dev/null and b/app/src/main/res/drawable-hdpi/main_grade.png differ diff --git a/app/src/main/res/drawable-hdpi/main_nickname.png b/app/src/main/res/drawable-hdpi/main_nickname.png new file mode 100644 index 0000000..6f3e046 Binary files /dev/null and b/app/src/main/res/drawable-hdpi/main_nickname.png differ diff --git a/app/src/main/res/drawable-hdpi/main_school.png b/app/src/main/res/drawable-hdpi/main_school.png new file mode 100644 index 0000000..e39b54e Binary files /dev/null and b/app/src/main/res/drawable-hdpi/main_school.png differ diff --git a/app/src/main/res/drawable-hdpi/main_search.png b/app/src/main/res/drawable-hdpi/main_search.png new file mode 100644 index 0000000..79c3cc4 Binary files /dev/null and b/app/src/main/res/drawable-hdpi/main_search.png differ diff --git a/app/src/main/res/drawable-hdpi/main_version.png b/app/src/main/res/drawable-hdpi/main_version.png new file mode 100644 index 0000000..0e9f13b Binary files /dev/null and b/app/src/main/res/drawable-hdpi/main_version.png differ diff --git a/app/src/main/res/drawable/bt_disable.xml b/app/src/main/res/drawable/bt_disable.xml new file mode 100644 index 0000000..5d03ac7 --- /dev/null +++ b/app/src/main/res/drawable/bt_disable.xml @@ -0,0 +1,13 @@ + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/bt_normnl.xml b/app/src/main/res/drawable/bt_normnl.xml new file mode 100644 index 0000000..4806f8c --- /dev/null +++ b/app/src/main/res/drawable/bt_normnl.xml @@ -0,0 +1,13 @@ + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/bt_pressed.xml b/app/src/main/res/drawable/bt_pressed.xml new file mode 100644 index 0000000..4806f8c --- /dev/null +++ b/app/src/main/res/drawable/bt_pressed.xml @@ -0,0 +1,13 @@ + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/bt_selector.xml b/app/src/main/res/drawable/bt_selector.xml new file mode 100644 index 0000000..54a214b --- /dev/null +++ b/app/src/main/res/drawable/bt_selector.xml @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/edit_background.xml b/app/src/main/res/drawable/edit_background.xml new file mode 100644 index 0000000..cff10de --- /dev/null +++ b/app/src/main/res/drawable/edit_background.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout-land/activity_main.xml b/app/src/main/res/layout-land/activity_main.xml index 2dae99e..ce276d1 100644 --- a/app/src/main/res/layout-land/activity_main.xml +++ b/app/src/main/res/layout-land/activity_main.xml @@ -5,38 +5,37 @@ android:layout_width="match_parent" android:layout_height="match_parent" android:background="#ffffff" - tools:context=".activity.MainActivity"> - + tools:context=".activity.main.MainActivity" + tools:ignore="MissingDefaultResource"> - - + app:layout_constraintTop_toBottomOf="@+id/constraintLayout"> + + + + - - + app:layout_constraintTop_toTopOf="parent" /> + app:layout_constraintTop_toBottomOf="@+id/iv_logo" + app:layout_constraintVertical_bias="0.3" /> - - - + app:layout_constraintTop_toBottomOf="@+id/qr_code"> + + + + + + app:layout_constraintTop_toTopOf="parent" + app:layout_constraintVertical_bias="0.3"> + android:layout_height="48dp"> + + - - - - - - - - - + android:layout_height="48dp" + android:layout_marginTop="8sp"> + + - - - - - - - - - + android:layout_height="48dp" + android:layout_marginTop="8sp"> + + - - - - - - - - - + android:layout_height="48dp" + android:layout_marginTop="8sp"> + + - - - - - - - - - + android:layout_height="48dp" + android:layout_marginTop="8sp"> - + + - - - - - - - +