From edf23945b5504074fc48555a7f81936e1788c6a3 Mon Sep 17 00:00:00 2001 From: Godfather <981964879@qq.com> Date: Tue, 25 Jan 2022 16:12:36 +0800 Subject: [PATCH] =?UTF-8?q?version:2.1=20fix:=E5=AE=8C=E5=96=84=E6=8E=A8?= =?UTF-8?q?=E9=80=81=20update:?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/build.gradle | 52 +- app/src/main/AndroidManifest.xml | 466 +++++--- .../aoleyun/sn/activity/CheckNetActivity.java | 11 +- .../aoleyun/sn/activity/SplashActivity.java | 9 +- .../sn/activity/{ => main}/MainActivity.java | 18 +- .../sn/activity/{ => main}/MainContact.java | 4 +- .../sn/activity/{ => main}/MainPresenter.java | 103 +- .../com/aoleyun/sn/base/BaseApplication.java | 75 +- .../com/aoleyun/sn/jpush/ExampleUtil.java | 7 +- .../sn/jpush/MyJPushMessageReceiver.java | 69 +- .../com/aoleyun/sn/jpush/MyJPushReceiver.java | 1042 +++++++++++++++++ .../java/com/aoleyun/sn/jpush/MyReceiver.java | 224 ++-- .../com/aoleyun/sn/jpush/PushService.java | 5 +- .../sn/jpush/TagAliasOperatorHelper.java | 650 +++++----- .../sn/jpush/invalid/ExampleApplication.java | 5 +- .../sn/jpush/invalid/TestActivity.java | 5 +- .../com/aoleyun/sn/network/HTTPInterface.java | 60 +- .../sn/network/NetInterfaceManager.java | 8 +- .../sn/network/api/newapi/MACAddressApi.java | 5 +- .../com/aoleyun/sn/service/MainService.java | 17 +- .../java/com/aoleyun/sn/tpush/Constants.java | 17 + .../MessageReceiver.java} | 504 +++++--- .../aoleyun/sn/tpush/common/DBOpenHelper.java | 23 + .../sn/tpush/common/NotificationService.java | 134 +++ .../aoleyun/sn/tpush/po/XGNotification.java | 83 ++ .../com/aoleyun/sn/utils/ExampleUtil.java | 4 +- .../java/com/aoleyun/sn/utils/JGYUtils.java | 15 +- .../main/res/layout-land/activity_main.xml | 2 +- .../main/res/layout-port/activity_main.xml | 2 +- app/src/main/res/mipmap-hdpi/ic_launcher.png | Bin 8461 -> 2217 bytes app/src/main/res/mipmap-mdpi/ic_launcher.png | Bin 8461 -> 2217 bytes app/src/main/res/mipmap-xhdpi/ic_launcher.png | Bin 8461 -> 2217 bytes .../main/res/mipmap-xxhdpi/ic_launcher.png | Bin 8461 -> 2217 bytes .../main/res/mipmap-xxxhdpi/ic_launcher.png | Bin 8461 -> 2217 bytes app/tpns-configs.json | 14 + build.gradle | 4 +- 36 files changed, 2692 insertions(+), 945 deletions(-) rename app/src/main/java/com/aoleyun/sn/activity/{ => main}/MainActivity.java (98%) rename app/src/main/java/com/aoleyun/sn/activity/{ => main}/MainContact.java (98%) rename app/src/main/java/com/aoleyun/sn/activity/{ => main}/MainPresenter.java (96%) create mode 100644 app/src/main/java/com/aoleyun/sn/jpush/MyJPushReceiver.java create mode 100644 app/src/main/java/com/aoleyun/sn/tpush/Constants.java rename app/src/main/java/com/aoleyun/sn/{receiver/MyJPushReceiver.java => tpush/MessageReceiver.java} (71%) create mode 100644 app/src/main/java/com/aoleyun/sn/tpush/common/DBOpenHelper.java create mode 100644 app/src/main/java/com/aoleyun/sn/tpush/common/NotificationService.java create mode 100644 app/src/main/java/com/aoleyun/sn/tpush/po/XGNotification.java create mode 100644 app/tpns-configs.json diff --git a/app/build.gradle b/app/build.gradle index 628aa0f..aa0f8a8 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -1,4 +1,5 @@ apply plugin: 'com.android.application' +apply plugin: "com.tencent.android.tpns" static def appName() { return "AoleyunDeviceInfo" @@ -60,14 +61,18 @@ android { //新平台正式 newly { flavorDimensions "default" - versionCode 10 - versionName "1.9" + versionCode 12 + versionName "2.1" /*********************************极光推送************************************/ manifestPlaceholders = [ - JPUSH_PKGNAME: "com.aoleyun.sn", - JPUSH_APPKEY : "79c64ef41b8728ad6aa29af1", //JPush上注册的包名对应的appkey. - JPUSH_CHANNEL: "developer-default", //暂时填写默认值即可. - channel_value: "newly", + XG_ACCESS_ID : "1500026372", + XG_ACCESS_KEY: "AR7A1L5M0LPH", + +// JPUSH_PKGNAME: "com.aoleyun.sn", +// JPUSH_APPKEY : "79c64ef41b8728ad6aa29af1", //JPush上注册的包名对应的appkey. +// JPUSH_CHANNEL: "developer-default", //暂时填写默认值即可. +// channel_value: "newly", + ] /*********************************极光推送end************************************/ buildConfigField "String", "ROOT_URL", '"https://led.aoleyun.cn/api/"' @@ -78,14 +83,16 @@ android { MTKnewly { flavorDimensions "default" - versionCode 1 - versionName "1.0" + versionCode 4 + versionName "1.3" /*********************************极光推送************************************/ manifestPlaceholders = [ - JPUSH_PKGNAME: "com.aoleyun.sn", - JPUSH_APPKEY : "79c64ef41b8728ad6aa29af1", //JPush上注册的包名对应的appkey. - JPUSH_CHANNEL: "developer-default", //暂时填写默认值即可. - channel_value: "newly", + XG_ACCESS_ID : "1500026372", + XG_ACCESS_KEY: "AR7A1L5M0LPH", +// JPUSH_PKGNAME: "com.aoleyun.sn", +// JPUSH_APPKEY : "79c64ef41b8728ad6aa29af1", //JPush上注册的包名对应的appkey. +// JPUSH_CHANNEL: "developer-default", //暂时填写默认值即可. +// channel_value: "newly", ] /*********************************极光推送end************************************/ buildConfigField "String", "ROOT_URL", '"https://led.aoleyun.cn/api/"' @@ -102,10 +109,12 @@ android { versionName "1.0" /*********************************极光推送************************************/ manifestPlaceholders = [ - JPUSH_PKGNAME: "com.aoleyun.sn", - JPUSH_APPKEY : "79c64ef41b8728ad6aa29af1", //JPush上注册的包名对应的appkey. - JPUSH_CHANNEL: "developer-default", //暂时填写默认值即可. - channel_value: "beta", + XG_ACCESS_ID : "1500026372", + XG_ACCESS_KEY: "AR7A1L5M0LPH", +// JPUSH_PKGNAME: "com.aoleyun.sn", +// JPUSH_APPKEY : "79c64ef41b8728ad6aa29af1", //JPush上注册的包名对应的appkey. +// JPUSH_CHANNEL: "developer-default", //暂时填写默认值即可. +// channel_value: "beta", ] /*********************************极光推送end************************************/ buildConfigField "String", "ROOT_URL", '"https://led.aoleyun.cn/api/"' @@ -320,15 +329,16 @@ dependencies { implementation 'com.github.bumptech.glide:glide:4.11.0' annotationProcessor 'com.github.bumptech.glide:compiler:4.11.0' //fastjson - implementation 'com.alibaba:fastjson:1.2.76' + implementation 'com.alibaba:fastjson:1.2.79' //极光推送 - implementation 'cn.jiguang.sdk:jpush:4.3.0' // 此处以JPush 3.5.6 版本为例。 - implementation 'cn.jiguang.sdk:jcore:2.9.0' // 此处以JCore 2.2.8 版本为例。 +// implementation 'cn.jiguang.sdk:jpush:4.3.0' // 此处以JPush 3.5.6 版本为例。 +// implementation 'cn.jiguang.sdk:jcore:2.9.0' // 此处以JCore 2.2.8 版本为例。 //高德地图定位 implementation 'com.amap.api:location:5.1.0' //MMKV - implementation 'com.tencent:mmkv-static:1.2.10' - + implementation 'com.tencent:mmkv-static:1.2.11' + //腾讯移动推送 TPNS + implementation 'com.tencent.tpns:tpns:1.3.1.1-release' //RxHttp implementation 'com.github.liujingxing.rxhttp:rxhttp:2.6.5' //implementation 'com.squareup.okhttp3:okhttp:4.9.1' //rxhttp v2.2.2版本起,需要手动依赖okhttp diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 6766443..946ce72 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -5,87 +5,108 @@ coreApp="true" android:sharedUserId="android.uid.system"> - - - - - - - - - - - - - - - - - - + - - + + - - - - - - - - - - - - - - - + + + + + + - + + + + + - + + + + + + + + + + android:maxSdkVersion="23" /> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + - + - + - + - + + @@ -216,7 +237,8 @@ - + + @@ -228,7 +250,7 @@ @@ -243,9 +265,10 @@ - + - + + @@ -268,147 +291,252 @@ android:name="android.support.FILE_PROVIDER_PATHS" android:resource="@xml/file_paths" /> + - + + + + + - - - + + + + + + + + - - - - + + + + - - - - - - - - + + + + + + + + + + + - + + + + + + - - - + + + + + + - - - + + + - + + + + + - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + - - - - + + + + + + + - - - + + + + + + + - - - + + + - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - + + - - - + + + + + + + + + + + + + + - - - + + + + + + + + + + + + - + android:name="XG_V2_ACCESS_ID" + android:value="1500026372" /> + + android:name="XG_V2_ACCESS_KEY" + android:value="AR7A1L5M0LPH" /> + - - diff --git a/app/src/main/java/com/aoleyun/sn/activity/CheckNetActivity.java b/app/src/main/java/com/aoleyun/sn/activity/CheckNetActivity.java index d294fe3..85d3750 100644 --- a/app/src/main/java/com/aoleyun/sn/activity/CheckNetActivity.java +++ b/app/src/main/java/com/aoleyun/sn/activity/CheckNetActivity.java @@ -19,6 +19,8 @@ import android.widget.Button; import android.widget.TextView; import com.aoleyun.sn.R; +import com.aoleyun.sn.activity.main.MainContact; +import com.aoleyun.sn.activity.main.MainPresenter; import com.aoleyun.sn.base.BaseActivity; import com.aoleyun.sn.service.MainService; import com.aoleyun.sn.utils.ApkUtils; @@ -33,7 +35,6 @@ import com.google.gson.JsonObject; import butterknife.BindView; import butterknife.ButterKnife; -import cn.jpush.android.api.JPushInterface; import pl.droidsonroids.gif.GifImageView; public class CheckNetActivity extends BaseActivity implements MainContact.MainView, NetworkUtils.OnNetworkStatusChangedListener { @@ -69,12 +70,12 @@ public class CheckNetActivity extends BaseActivity implements MainContact.MainVi @Override public void onDisconnected() { - Log.e("OnNetworkStatusChangedListener", "onDisconnected: "); + Log.e("OnNetworkStatusChanged", "onDisconnected: "); } @Override public void onConnected(NetworkUtils.NetworkType networkType) { - Log.e("OnNetworkStatusChangedListener", "onConnected: "); + Log.e("OnNetworkStatusChanged", "onConnected: "); timeMillis = SystemClock.elapsedRealtime(); //直接获取数据 mPresenter.getLockedState(); @@ -167,7 +168,7 @@ public class CheckNetActivity extends BaseActivity implements MainContact.MainVi @Override public void initData() { - JPushInterface.init(this); +// JPushInterface.init(this); registerMessageReceiver(); Log.e("getMacAddress", Utils.getAndroid10MAC(this)); timeMillis = SystemClock.elapsedRealtime(); @@ -219,7 +220,7 @@ public class CheckNetActivity extends BaseActivity implements MainContact.MainVi } SaveListUtils.getList(); //获取系统管控 - mPresenter.setJpushTags(); + mPresenter.setPushTags(); netWorkIsRunning = true; } else { netWorkIsRunning = false; diff --git a/app/src/main/java/com/aoleyun/sn/activity/SplashActivity.java b/app/src/main/java/com/aoleyun/sn/activity/SplashActivity.java index 62d4e3a..c7f5ad4 100644 --- a/app/src/main/java/com/aoleyun/sn/activity/SplashActivity.java +++ b/app/src/main/java/com/aoleyun/sn/activity/SplashActivity.java @@ -10,7 +10,6 @@ import android.os.Build; import android.os.Bundle; import android.os.Environment; import android.os.Handler; -import android.os.PowerManager; import android.provider.Settings; import android.util.Log; import android.view.View; @@ -25,6 +24,7 @@ import androidx.core.content.ContextCompat; import com.aoleyun.sn.BuildConfig; import com.aoleyun.sn.R; import com.aoleyun.sn.action.JGYActions; +import com.aoleyun.sn.activity.main.MainActivity; import com.aoleyun.sn.base.BaseApplication; import com.aoleyun.sn.comm.PackageNames; import com.aoleyun.sn.service.LogcatService; @@ -42,7 +42,6 @@ import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; -import cn.jpush.android.api.JPushInterface; public class SplashActivity extends AppCompatActivity { @@ -131,7 +130,7 @@ public class SplashActivity extends AppCompatActivity { // Log.i(TAG, "debugTest: iptables = " + CmdUtil.execute("iptables -L -n" ).toString()); Log.i(TAG, "debugTest: " + Utils.getAndroid10MAC(this)); - Log.i(TAG, "debugTest: " + JPushInterface.getRegistrationID(this)); +// Log.i(TAG, "debugTest: " + JPushInterface.getRegistrationID(this)); Log.i(TAG, "debugTest: " + Utils.getCustomVersion()); Log.i(TAG, "debugTest: " + BuildConfig.VERSION_NAME); Log.i(TAG, "debugTest: " + Utils.getAPPVersionName(PackageNames.APPSTORE, this)); @@ -145,8 +144,8 @@ public class SplashActivity extends AppCompatActivity { // } // ActivityManager mAm = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE); // mAm.killBackgroundProcesses("com.android.documentsui"); - BaseApplication.cleanJpushAlias(); - BaseApplication.cleanJpushTag(); +// BaseApplication.cleanJpushAlias(); +// BaseApplication.cleanJpushTag(); Log.e(TAG, "debugTest: SPUtils all " + SPUtils.getAll(this)); try { PackageManager packageManager = getPackageManager(); diff --git a/app/src/main/java/com/aoleyun/sn/activity/MainActivity.java b/app/src/main/java/com/aoleyun/sn/activity/main/MainActivity.java similarity index 98% rename from app/src/main/java/com/aoleyun/sn/activity/MainActivity.java rename to app/src/main/java/com/aoleyun/sn/activity/main/MainActivity.java index 177bb22..b162abe 100644 --- a/app/src/main/java/com/aoleyun/sn/activity/MainActivity.java +++ b/app/src/main/java/com/aoleyun/sn/activity/main/MainActivity.java @@ -1,4 +1,4 @@ -package com.aoleyun.sn.activity; +package com.aoleyun.sn.activity.main; import android.app.AlertDialog; import android.content.BroadcastReceiver; @@ -33,13 +33,13 @@ import com.aoleyun.sn.utils.SaveListUtils; import com.aoleyun.sn.utils.SysSettingUtils; import com.aoleyun.sn.utils.ToastUtil; import com.aoleyun.sn.utils.Utils; +import com.tencent.mmkv.MMKV; import java.util.concurrent.TimeUnit; import butterknife.BindView; import butterknife.ButterKnife; import butterknife.OnClick; -import cn.jpush.android.api.JPushInterface; import io.reactivex.Observable; import io.reactivex.ObservableEmitter; import io.reactivex.ObservableOnSubscribe; @@ -171,7 +171,7 @@ public class MainActivity extends BaseActivity implements MainContact.MainView, @Override public void initData() { - JPushInterface.init(this); +// JPushInterface.init(this); registerMessageReceiver(); Log.e("getMacAddress", Utils.getAndroid10MAC(this)); timeMillis = SystemClock.elapsedRealtime(); @@ -229,7 +229,7 @@ public class MainActivity extends BaseActivity implements MainContact.MainView, //设置极光推送别名 mPresenter.setJpushAlias(); //设置极光推送标签 - mPresenter.setJpushTags(); + mPresenter.setPushTags(); Log.e(TAG, "netWorkIsRunning: " + netWorkIsRunning); Log.e(TAG, "MainService.netWorkIsRunning: " + MainService.netWorkIsRunning); if (loocked) { @@ -461,8 +461,6 @@ public class MainActivity extends BaseActivity implements MainContact.MainView, @Override public void getDefaultDesktopFinish() { - netWorkIsRunning = false; - Log.e(TAG, "SettingFinished: " + (SystemClock.elapsedRealtime() - timeMillis) + " ms"); mPresenter.getPoweroffTime(); } @@ -473,7 +471,9 @@ public class MainActivity extends BaseActivity implements MainContact.MainView, @Override public void setWiFiPasswd() { - + MMKV.defaultMMKV().encode(MainPresenter.GET_SETTING_FINISH_TIME, System.currentTimeMillis()); + netWorkIsRunning = false; + Log.e(TAG, "SettingFinished: " + (SystemClock.elapsedRealtime() - timeMillis) + " ms"); } @Override @@ -595,12 +595,12 @@ public class MainActivity extends BaseActivity implements MainContact.MainView, @Override public void onDisconnected() { - Log.e("OnNetworkStatusChangedListener", "onDisconnected: "); + Log.e("OnNetworkStatusChanged", "onDisconnected: "); } @Override public void onConnected(NetworkUtils.NetworkType networkType) { - Log.e("OnNetworkStatusChangedListener", "onConnected: "); + Log.e("OnNetworkStatusChanged", "onConnected: "); timeMillis = SystemClock.elapsedRealtime(); //直接获取数据 mPresenter.getLockedState(); diff --git a/app/src/main/java/com/aoleyun/sn/activity/MainContact.java b/app/src/main/java/com/aoleyun/sn/activity/main/MainContact.java similarity index 98% rename from app/src/main/java/com/aoleyun/sn/activity/MainContact.java rename to app/src/main/java/com/aoleyun/sn/activity/main/MainContact.java index 784cbc6..f3d3e41 100644 --- a/app/src/main/java/com/aoleyun/sn/activity/MainContact.java +++ b/app/src/main/java/com/aoleyun/sn/activity/main/MainContact.java @@ -1,4 +1,4 @@ -package com.aoleyun.sn.activity; +package com.aoleyun.sn.activity.main; import android.graphics.Bitmap; import android.view.View; @@ -47,7 +47,7 @@ public class MainContact { void checkTestUpdate(); //开始 //设置极光推送标签 - void setJpushTags(); + void setPushTags(); //获取开发者选项 void getDeveloper(); //获取设备后台设置 diff --git a/app/src/main/java/com/aoleyun/sn/activity/MainPresenter.java b/app/src/main/java/com/aoleyun/sn/activity/main/MainPresenter.java similarity index 96% rename from app/src/main/java/com/aoleyun/sn/activity/MainPresenter.java rename to app/src/main/java/com/aoleyun/sn/activity/main/MainPresenter.java index a506b55..db671cd 100644 --- a/app/src/main/java/com/aoleyun/sn/activity/MainPresenter.java +++ b/app/src/main/java/com/aoleyun/sn/activity/main/MainPresenter.java @@ -1,4 +1,4 @@ -package com.aoleyun.sn.activity; +package com.aoleyun.sn.activity.main; import android.annotation.SuppressLint; import android.content.Context; @@ -32,7 +32,6 @@ import com.aoleyun.sn.bean.ForceDownloadData; import com.aoleyun.sn.bean.LogoImg; import com.aoleyun.sn.bean.NetAndLaunchBean; import com.aoleyun.sn.bean.StudentsInfo; -import com.aoleyun.sn.jpush.TagAliasOperatorHelper; import com.aoleyun.sn.network.NetInterfaceManager; import com.aoleyun.sn.network.HTTPInterface; import com.aoleyun.sn.service.MainService; @@ -46,6 +45,8 @@ import com.aoleyun.sn.utils.TimeUtils; import com.aoleyun.sn.utils.ToastUtil; import com.aoleyun.sn.utils.URLUtils; import com.aoleyun.sn.utils.Utils; +import com.tencent.android.tpush.XGIOperateCallback; +import com.tencent.android.tpush.XGPushManager; import com.tencent.mmkv.MMKV; import com.trello.rxlifecycle2.LifecycleProvider; import com.trello.rxlifecycle2.android.ActivityEvent; @@ -55,10 +56,8 @@ import java.lang.reflect.Type; import java.util.Arrays; import java.util.HashSet; import java.util.List; -import java.util.Random; import java.util.Set; -import cn.jpush.android.api.JPushInterface; import io.reactivex.Observer; import io.reactivex.android.schedulers.AndroidSchedulers; import io.reactivex.annotations.NonNull; @@ -66,8 +65,8 @@ import io.reactivex.disposables.Disposable; import io.reactivex.schedulers.Schedulers; import okhttp3.ResponseBody; -import static com.aoleyun.sn.jpush.TagAliasOperatorHelper.ACTION_SET; -import static com.aoleyun.sn.jpush.TagAliasOperatorHelper.sequence; +//import static com.aoleyun.sn.jpush.TagAliasOperatorHelper.ACTION_SET; +//import static com.aoleyun.sn.jpush.TagAliasOperatorHelper.sequence; /** * MainActivity和MainService 的 Presenter @@ -79,6 +78,8 @@ public class MainPresenter implements MainContact.Presenter { private MainContact.MainView mView; private Context mContext; + public static final String GET_SETTING_FINISH_TIME = "GET_SETTING_FINISH_TIME"; + //是否有接口请求成功 public boolean requestSucceeded = false; private final String DEFAULT_INFO = "暂无信息"; @@ -260,12 +261,18 @@ public class MainPresenter implements MainContact.Presenter { } private long lastgetLockedTime; + private long one_minute = 1000 * 60; @Override public void getLockedState() { -// if (System.currentTimeMillis() - lastgetLockedTime < 600 * 1000) { -// return; -// } + MMKV mmkv = MMKV.defaultMMKV(); + lastgetLockedTime = mmkv.decodeLong(MainPresenter.GET_SETTING_FINISH_TIME); + Log.e(TAG, "getLockedState: " + lastgetLockedTime); + if (System.currentTimeMillis() - lastgetLockedTime < one_minute) { + Log.e(TAG, "getLockedState: lastgetLockedTime = " + lastgetLockedTime); + return; + } + // lastgetLockedTime = System.currentTimeMillis(); NetInterfaceManager.getInstance() .getDevicesLockedStateObservable() @@ -553,34 +560,34 @@ public class MainPresenter implements MainContact.Presenter { @Override public void setJpushAlias() { - JPushInterface.init(mContext); - SetAlias(); - String rid = JPushInterface.getRegistrationID(mContext); - if (!TextUtils.isEmpty(rid)) { - Log.e(TAG + ":" + "setJpushAlias", "RegId:" + rid); - } - JPushInterface.getAlias(mContext, new Random().nextInt(100)); +// JPushInterface.init(mContext); +// SetAlias(); +// String rid = JPushInterface.getRegistrationID(mContext); +// if (!TextUtils.isEmpty(rid)) { +// Log.e(TAG + ":" + "setJpushAlias", "RegId:" + rid); +// } +// JPushInterface.getAlias(mContext, new Random().nextInt(100)); mView.setAliasFinish(); } - private void SetAlias() { - TagAliasOperatorHelper.TagAliasBean tagAliasBean = new TagAliasOperatorHelper.TagAliasBean(); - tagAliasBean.action = ACTION_SET; - sequence++; - tagAliasBean.alias = Utils.getSerial(); - tagAliasBean.isAliasAction = true; - TagAliasOperatorHelper.getInstance().handleAction(mContext, sequence, tagAliasBean); - } +// private void SetAlias() { +// TagAliasOperatorHelper.TagAliasBean tagAliasBean = new TagAliasOperatorHelper.TagAliasBean(); +// tagAliasBean.action = ACTION_SET; +// sequence++; +// tagAliasBean.alias = Utils.getSerial(); +// tagAliasBean.isAliasAction = true; +// TagAliasOperatorHelper.getInstance().handleAction(mContext, sequence, tagAliasBean); +// } @Override - public void setJpushTags() { + public void setPushTags() { NetInterfaceManager.getInstance() .getJpushTagsObservable() .compose(getProvider().bindUntilEvent(ActivityEvent.DESTROY)) .subscribe(new Observer() { @Override public void onSubscribe(@NonNull Disposable d) { - Log.e(TAG + ":" + "setJpushTags", "onSubscribe: "); + Log.e(TAG + ":" + "setPushTags", "onSubscribe: "); } @Override @@ -589,7 +596,7 @@ public class MainPresenter implements MainContact.Presenter { if (response.code == OK) { JsonObject jsonObject = JsonParser.parseString(new Gson().toJson(response.data)).getAsJsonObject(); String batch = jsonObject.get("batch").getAsString(); - Log.e(TAG + ":" + "setJpushTags", "onNext: " + batch); + Log.e(TAG + ":" + "setPushTags", "onNext: " + batch); if (!TextUtils.isEmpty(batch)) { mView.setTagsFinish(false); Set set = new HashSet(); @@ -604,27 +611,39 @@ public class MainPresenter implements MainContact.Presenter { } } }); - setTag(set); + Set tagsSet = new HashSet<>(set); + XGPushManager.clearAndAppendTags(mContext, "clearAndAppendTags :" + System.currentTimeMillis(), tagsSet, new XGIOperateCallback() { + @Override + public void onSuccess(Object o, int i) { + Log.e("setPushTags", "onSuccess: " + o); + } + + @Override + public void onFail(Object o, int i, String s) { + Log.e("setPushTags", "onFail: " + o); + } + }); +// setTag(set); } else { mView.setTagsFinish(true); - Log.e(TAG + ":" + "setJpushTags", "onNext: " + "batch empty"); + Log.e(TAG + ":" + "setPushTags", "onNext: " + "batch empty"); } } else { mView.setTagsFinish(true); - Log.e(TAG + ":" + "setJpushTags", "onNext: " + response.toString()); + Log.e(TAG + ":" + "setPushTags", "onNext: " + response.toString()); } } @Override public void onError(@NonNull Throwable e) { - Log.e(TAG + ":" + "setJpushTags", "onError: " + e.getMessage()); + Log.e(TAG + ":" + "setPushTags", "onError: " + e.getMessage()); mView.setTagsFinish(true); onComplete(); } @Override public void onComplete() { - Log.e(TAG + ":" + "setJpushTags", "onComplete: "); + Log.e(TAG + ":" + "setPushTags", "onComplete: "); } }); } @@ -634,14 +653,14 @@ public class MainPresenter implements MainContact.Presenter { mView.setJpushPlatformTagsFinish(); } - private void setTag(Set set) { - TagAliasOperatorHelper.TagAliasBean tagAliasBean = new TagAliasOperatorHelper.TagAliasBean(); - tagAliasBean.action = ACTION_SET; - sequence++; - tagAliasBean.tags = set; - tagAliasBean.isAliasAction = false; - TagAliasOperatorHelper.getInstance().handleAction(mContext, sequence, tagAliasBean); - } +// private void setTag(Set set) { +// TagAliasOperatorHelper.TagAliasBean tagAliasBean = new TagAliasOperatorHelper.TagAliasBean(); +// tagAliasBean.action = ACTION_SET; +// sequence++; +// tagAliasBean.tags = set; +// tagAliasBean.isAliasAction = false; +// TagAliasOperatorHelper.getInstance().handleAction(mContext, sequence, tagAliasBean); +// } @Override public void checkStoreUpdate() { @@ -2043,6 +2062,7 @@ public class MainPresenter implements MainContact.Presenter { public void getPoweroffTime() { NetInterfaceManager.getInstance() .getPoweroffTimeControl() + .compose(getProvider().bindUntilEvent(ActivityEvent.DESTROY)) .subscribe(new Observer>>() { @Override public void onSubscribe(Disposable d) { @@ -2079,6 +2099,7 @@ public class MainPresenter implements MainContact.Presenter { @Override public void getWiFiPasswd() { NetInterfaceManager.getInstance().getWiFiControl() + .compose(getProvider().bindUntilEvent(ActivityEvent.DESTROY)) .subscribe(new Observer>>() { @Override public void onSubscribe(Disposable d) { @@ -2101,11 +2122,13 @@ public class MainPresenter implements MainContact.Presenter { @Override public void onError(Throwable e) { Log.e("getWiFiPasswd", "onError: " + e.getMessage()); + onComplete(); } @Override public void onComplete() { Log.e("getWiFiPasswd", "onComplete: "); + mView.setWiFiPasswd(); } }); } diff --git a/app/src/main/java/com/aoleyun/sn/base/BaseApplication.java b/app/src/main/java/com/aoleyun/sn/base/BaseApplication.java index b292a12..09e0ab9 100644 --- a/app/src/main/java/com/aoleyun/sn/base/BaseApplication.java +++ b/app/src/main/java/com/aoleyun/sn/base/BaseApplication.java @@ -16,7 +16,6 @@ import com.aoleyun.sn.utils.WiFiUtils; import com.arialyy.aria.core.Aria; import com.arialyy.aria.core.download.DownloadEntity; import com.aoleyun.sn.BuildConfig; -import com.aoleyun.sn.jpush.TagAliasOperatorHelper; import com.aoleyun.sn.manager.AmapManager; import com.aoleyun.sn.manager.FileManager; import com.aoleyun.sn.network.NetInterfaceManager; @@ -30,6 +29,9 @@ import com.aoleyun.sn.utils.SystemUtils; import com.aoleyun.sn.utils.ToastUtil; import com.aoleyun.sn.utils.Utils; import com.aoleyun.sn.utils.XAPKUtils; +import com.tencent.android.tpush.XGIOperateCallback; +import com.tencent.android.tpush.XGPushConfig; +import com.tencent.android.tpush.XGPushManager; import com.tencent.mmkv.MMKV; import org.jetbrains.annotations.NotNull; @@ -39,8 +41,6 @@ import java.util.ArrayList; import java.util.List; import java.util.concurrent.TimeUnit; -import cn.jpush.android.api.JPushInterface; -import cn.jpush.android.api.JPushMessage; import io.reactivex.Observable; import io.reactivex.ObservableEmitter; import io.reactivex.ObservableOnSubscribe; @@ -87,6 +87,8 @@ public class BaseApplication extends MultiDexApplication { private void init() { String rootDir = MMKV.initialize(this); Log.e(TAG, "mmkv root: " + rootDir); + + tPushInit(); ToastUtil.init(this); NetInterfaceManager.init(this); JGYUtils.init(this); @@ -99,8 +101,8 @@ public class BaseApplication extends MultiDexApplication { JGYUtils.getInstance().hookWebView(); // 设置开启日志,发布时请关闭日志 - JPushInterface.setDebugMode(true); - JPushInterface.requestPermission(this); +// JPushInterface.setDebugMode(true); +// JPushInterface.requestPermission(this); //解锁设备不需要初始化 // 初始化 JPush //JPushInterface.init(this); @@ -150,6 +152,37 @@ public class BaseApplication extends MultiDexApplication { }); } + private void tPushInit() { + XGPushConfig.enableDebug(this, true); + XGPushManager.registerPush(this, new XGIOperateCallback() { + @Override + public void onSuccess(Object data, int flag) { + //token在设备卸载重装的时候有可能会变 + Log.e("TPush", "注册成功,设备token为:" + data); + List accountInfoList = new ArrayList<>(); + accountInfoList.add(new XGPushManager.AccountInfo(XGPushManager.AccountType.CUSTOM.getValue(), Utils.getSerial())); + XGPushManager.upsertAccounts(getAppContext(), accountInfoList, new XGIOperateCallback() { + @Override + public void onSuccess(Object data, int flag) { + Log.e("TPush", "onSuccess, data:" + data + ", flag:" + flag); + } + + @Override + public void onFail(Object data, int errCode, String msg) { + Log.e("TPush", "onFail, data:" + data + ", code:" + errCode + ", msg:" + msg); + } + }); + } + + @Override + public void onFail(Object data, int errCode, String msg) { + Log.e("TPush", "注册失败,错误码:" + errCode + ",错误信息:" + msg); + } + }); + + + } + private static void initAliasObservable() { Log.e(TAG, "initAliasObservable: "); Observable.create(new ObservableOnSubscribe() { @@ -232,17 +265,17 @@ public class BaseApplication extends MultiDexApplication { }); } - public void onAliasOperatorResult(JPushMessage jPushMessage) { - if (jPushMessage == null) { - return; - } - int errorCode = jPushMessage.getErrorCode(); - onAliasResult.onResult(errorCode); - } +// public void onAliasOperatorResult(JPushMessage jPushMessage) { +// if (jPushMessage == null) { +// return; +// } +// int errorCode = jPushMessage.getErrorCode(); +// onAliasResult.onResult(errorCode); +// } public static void setJpushAlias() { Log.e("jiguangInterface", "30s后重新设置alias"); - JPushInterface.setAlias(context, TagAliasOperatorHelper.sequence++, Utils.getSerial()); +// JPushInterface.setAlias(context, TagAliasOperatorHelper.sequence++, Utils.getSerial()); } private static void initTagObservable() { @@ -341,17 +374,17 @@ public class BaseApplication extends MultiDexApplication { }); } - public void onTagOperatorResult(JPushMessage jPushMessage) { - if (jPushMessage == null) { - return; - } - int errorCode = jPushMessage.getErrorCode(); - onTagResult.onResult(errorCode); - } +// public void onTagOperatorResult(JPushMessage jPushMessage) { +// if (jPushMessage == null) { +// return; +// } +// int errorCode = jPushMessage.getErrorCode(); +// onTagResult.onResult(errorCode); +// } public static void setJpushTags() { Log.e(TAG, "30s后重新设置tags"); - HTTPInterface.setJpushTags(context); + HTTPInterface.setPushTags(context); } private static OnAliasResult onAliasResult; diff --git a/app/src/main/java/com/aoleyun/sn/jpush/ExampleUtil.java b/app/src/main/java/com/aoleyun/sn/jpush/ExampleUtil.java index c7f8b57..1573fc4 100644 --- a/app/src/main/java/com/aoleyun/sn/jpush/ExampleUtil.java +++ b/app/src/main/java/com/aoleyun/sn/jpush/ExampleUtil.java @@ -15,7 +15,6 @@ import android.text.TextUtils; import java.util.regex.Matcher; import java.util.regex.Pattern; -import cn.jpush.android.api.JPushInterface; public class ExampleUtil { public static final String PREFS_NAME = "JPUSH_EXAMPLE"; @@ -126,7 +125,7 @@ public class ExampleUtil { } } - public static String getDeviceId(Context context) { - return JPushInterface.getUdid(context); - } +// public static String getDeviceId(Context context) { +// return JPushInterface.getUdid(context); +// } } diff --git a/app/src/main/java/com/aoleyun/sn/jpush/MyJPushMessageReceiver.java b/app/src/main/java/com/aoleyun/sn/jpush/MyJPushMessageReceiver.java index 1065aa0..07489b5 100644 --- a/app/src/main/java/com/aoleyun/sn/jpush/MyJPushMessageReceiver.java +++ b/app/src/main/java/com/aoleyun/sn/jpush/MyJPushMessageReceiver.java @@ -4,43 +4,40 @@ import android.content.Context; import com.aoleyun.sn.base.BaseApplication; -import cn.jpush.android.api.CustomMessage; -import cn.jpush.android.api.JPushMessage; -import cn.jpush.android.service.JPushMessageReceiver; /** * 自定义JPush message 接收器,包括操作tag/alias的结果返回(仅仅包含tag/alias新接口部分) * */ -public class MyJPushMessageReceiver extends JPushMessageReceiver { - - @Override - public void onTagOperatorResult(Context context, JPushMessage jPushMessage) { - TagAliasOperatorHelper.getInstance().onTagOperatorResult(context,jPushMessage); - super.onTagOperatorResult(context, jPushMessage); - BaseApplication.getInstance().onTagOperatorResult(jPushMessage); - } - @Override - public void onCheckTagOperatorResult(Context context, JPushMessage jPushMessage){ - TagAliasOperatorHelper.getInstance().onCheckTagOperatorResult(context,jPushMessage); - super.onCheckTagOperatorResult(context, jPushMessage); - } - @Override - public void onAliasOperatorResult(Context context, JPushMessage jPushMessage) { - TagAliasOperatorHelper.getInstance().onAliasOperatorResult(context,jPushMessage); - super.onAliasOperatorResult(context, jPushMessage); - BaseApplication.getInstance().onAliasOperatorResult(jPushMessage); - } - - @Override - public void onMobileNumberOperatorResult(Context context, JPushMessage jPushMessage) { - TagAliasOperatorHelper.getInstance().onMobileNumberOperatorResult(context,jPushMessage); - super.onMobileNumberOperatorResult(context, jPushMessage); - } - - @Override - public void onMessage(Context context, CustomMessage customMessage) { - super.onMessage(context, customMessage); - } - - -} +//public class MyJPushMessageReceiver extends JPushMessageReceiver { +// +// @Override +// public void onTagOperatorResult(Context context, JPushMessage jPushMessage) { +// TagAliasOperatorHelper.getInstance().onTagOperatorResult(context,jPushMessage); +// super.onTagOperatorResult(context, jPushMessage); +// BaseApplication.getInstance().onTagOperatorResult(jPushMessage); +// } +// @Override +// public void onCheckTagOperatorResult(Context context, JPushMessage jPushMessage){ +// TagAliasOperatorHelper.getInstance().onCheckTagOperatorResult(context,jPushMessage); +// super.onCheckTagOperatorResult(context, jPushMessage); +// } +// @Override +// public void onAliasOperatorResult(Context context, JPushMessage jPushMessage) { +// TagAliasOperatorHelper.getInstance().onAliasOperatorResult(context,jPushMessage); +// super.onAliasOperatorResult(context, jPushMessage); +// BaseApplication.getInstance().onAliasOperatorResult(jPushMessage); +// } +// +// @Override +// public void onMobileNumberOperatorResult(Context context, JPushMessage jPushMessage) { +// TagAliasOperatorHelper.getInstance().onMobileNumberOperatorResult(context,jPushMessage); +// super.onMobileNumberOperatorResult(context, jPushMessage); +// } +// +// @Override +// public void onMessage(Context context, CustomMessage customMessage) { +// super.onMessage(context, customMessage); +// } +// +// +//} diff --git a/app/src/main/java/com/aoleyun/sn/jpush/MyJPushReceiver.java b/app/src/main/java/com/aoleyun/sn/jpush/MyJPushReceiver.java new file mode 100644 index 0000000..f0d8691 --- /dev/null +++ b/app/src/main/java/com/aoleyun/sn/jpush/MyJPushReceiver.java @@ -0,0 +1,1042 @@ +package com.aoleyun.sn.jpush; + +import android.annotation.SuppressLint; +import android.content.BroadcastReceiver; +import android.content.Context; +import android.content.ContextWrapper; +import android.content.Intent; +import android.content.IntentFilter; +import android.content.pm.PackageInfo; +import android.content.pm.PackageManager; +import android.media.AudioManager; +import android.media.MediaPlayer; +import android.os.BatteryManager; +import android.os.Build; +import android.os.Bundle; +import android.os.Handler; +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.aoleyun.sn.action.JGYActions; +import com.aoleyun.sn.base.BaseApplication; +import com.aoleyun.sn.bean.BaseResponse; +import com.aoleyun.sn.bean.RemoteDebug; +import com.aoleyun.sn.R; +import com.aoleyun.sn.manager.AmapManager; +import com.aoleyun.sn.utils.CacheUtils; +import com.aoleyun.sn.utils.JGYUtils; +import com.aoleyun.sn.comm.CommonDatas; +import com.aoleyun.sn.network.NetInterfaceManager; +import com.aoleyun.sn.network.HTTPInterface; +import com.aoleyun.sn.service.MainService; +import com.aoleyun.sn.utils.ApkUtils; +import com.aoleyun.sn.utils.CmdUtil; +import com.aoleyun.sn.utils.ForegroundAppUtil; +import com.aoleyun.sn.utils.MySQLData; +import com.aoleyun.sn.utils.SPUtils; +import com.aoleyun.sn.utils.SaveListUtils; +import com.aoleyun.sn.utils.ServiceAliveUtils; +import com.aoleyun.sn.utils.ToastUtil; +import com.aoleyun.sn.utils.Utils; +import com.arialyy.aria.core.Aria; +import com.google.gson.Gson; +import com.google.gson.reflect.TypeToken; + +import java.io.File; +import java.lang.reflect.Type; +import java.util.Arrays; +import java.util.HashMap; +import java.util.HashSet; +import java.util.Map; + +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.disposables.Disposable; +import io.reactivex.schedulers.Schedulers; +import okhttp3.MediaType; +import okhttp3.MultipartBody; +import okhttp3.RequestBody; +import okhttp3.ResponseBody; + +public class MyJPushReceiver extends BroadcastReceiver { + private static final String TAG = MyJPushReceiver.class.getSimpleName(); + + //删除应用 + private final String MSG_DELETE = "1"; + //系统设置管控 + private final String MSG_SETTING = "2"; + //浏览器网址管控 + private final String MSG_BROWSER = "4"; + //app id管控 + private final String MSG_APPID = "5"; + //应用联网管控 + private final String MSG_NET_CONTROL = "6"; + //APP自启联网滑动管控 + private final String MSG_POWER_ON = "7"; + //重置 + private final String MSG_RESET = "8"; + //强制安装 + private final String MSG_INSTALL = "9"; + //解锁 + private final String MSG_LOCK = "10"; + //旧版相机管控 + private final String MSG_CAMERA = "11"; + + private final String MSG_ONEPACKAGES = "12"; + //app使用时间 + private final String GET_APP_USEDTIME = "13"; + //强制下载 + private final String GET_FORCEDOWNLOADURL = "14"; + //主页和书签管控 + private final String SET_HOMEPAG_TAG = "15"; + //app内网页管控 + private final String APP_WEBSITE = "16"; + //禁止app升级 + private final String DISABLE_APPUPDATE = "17"; + //隐藏桌面图标 + private final String HIDE_DESKTOP_ICON = "18"; + //禁止滑动 + private final String DISABLE_APP_SLIDE = "19"; + //更新引用白名单 + private final String UPDATE_INFO = "20"; + //截图 + private final String SN_SCREENSHOT = "21"; + //重启 + private final String DEVICES_REBOOT = "22"; + //获取设备详细信息 + private final String GET_DEVICES_INFO = "23"; + //霸屏 + private final String LOCK_SCREEN = "24"; + //取消霸屏 + private final String UNLOCK_SCREEN = "25"; + //结束进程 + private final String KILL_SERVER = "26"; + //时间管控 + private final String TIME_CONTROL = "27"; + //app霸屏 + private final String TOP_APP = "28"; + //开机动画 + private final String LOGO_IMG = "29"; + //默认应用 + private final String DEFAULTP_APP = "30"; + //发出声音 + private final String PLAY_SOUND = "31"; + //清除app数据 + private final String CLEAN_APP_CACHE = "32"; + //开发人员选项 + private final String DEVELOPER_OPTIONS = "33"; + //全局更新 + private final String GLOBAL_UPDATE = "34"; + //电子书包激活码 + private final String EBAG_CODE = "35"; + //更新白名单 + private final String UPDATE_WHITELIST = "36"; + //更换批次不恢复出厂 + private final String UPDATE_BATCH = "37"; + //添加wifi + private final String UPDATE_WIFI_PW = "38"; + //远程关机 + private final String DEVICES_POWEROFF = "41"; + //远程log + private final String SN_RUN_LOG = "43"; + //自定义指令 + private final String CUSTOM_ORDER = "44"; + + private Context mContext; + + private int changeNum(int paramInt) { + return paramInt == 0 ? 1 : 0; + } + + @Override + public void onReceive(Context context, Intent intent) { + mContext = context; +// Bundle bundle = intent.getExtras(); +// if (JPushInterface.ACTION_REGISTRATION_ID.equals(intent.getAction())) { +// String regId = bundle.getString(JPushInterface.EXTRA_REGISTRATION_ID); +// Log.e(TAG, "[MyReceiver] 接收Registration Id : " + regId); +// //send the Registration Id to your server... +// } else if (JPushInterface.ACTION_MESSAGE_RECEIVED.equals(intent.getAction())) { +// // ToastTool.show("[MyReceiver] 接收到推送下来的自定义消息: " + bundle.getString(JPushInterface.EXTRA_MESSAGE) +// // + "---" + bundle.getString(JPushInterface.EXTRA_TITLE) + "---" + bundle.getString(JPushInterface.EXTRA_CONTENT_TYPE) +// // + "---" + bundle.getString(JPushInterface.EXTRA_EXTRA) + "----" + bundle.getString("package_name")); +// // Log.e(TAG, "[MyReceiver] 接收到推送下来的自定义消息: " + bundle.getString(JPushInterface.EXTRA_MESSAGE) +// // + "---" + bundle.getString(JPushInterface.EXTRA_TITLE) + "---" + bundle.getString(JPushInterface.EXTRA_CONTENT_TYPE) +// // + "---" + bundle.getString(JPushInterface.EXTRA_EXTRA) + "----" + bundle.getString("package_name")); +// processCustomMessage(context, bundle);//屏蔽推送 +// } else if (JPushInterface.ACTION_NOTIFICATION_RECEIVED.equals(intent.getAction())) { +// Log.e(TAG, "[MyReceiver] 接收到推送下来的通知" + bundle.getString(JPushInterface.EXTRA_EXTRA)); +// // doDownloadAndInstall(bundle.getString(JPushInterface.EXTRA_EXTRA)); +// // Log.e(getBatteryLevel()+"-0-iweroiwerewefeerer-----------"); +// int notifactionId = bundle.getInt(JPushInterface.EXTRA_NOTIFICATION_ID); +// Log.e(TAG, "[MyReceiver] 接收到推送下来的通知的ID: " + notifactionId); +// } else if (JPushInterface.ACTION_NOTIFICATION_OPENED.equals(intent.getAction())) { +// Log.e(TAG, "[MyReceiver] 用户点击打开了通知"); +// } else if (JPushInterface.ACTION_RICHPUSH_CALLBACK.equals(intent.getAction())) { +// Log.e(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); +// Log.i(TAG, "[MyReceiver]" + intent.getAction() + " connected state change to " + connected); +// } else { +// Log.e(TAG, "[MyReceiver] Unhandled intent - " + intent.getAction()); +// } + } + +// private void processCustomMessage(final 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); +//// String package_name = bundle.getString("package_name"); +// +// Log.e(TAG, "message::" + message + "--type::" + type + "--title::" + title + "--extras::" + extras); +// switch (message) { +// default: +// break; +// case MSG_DELETE: +// ToastUtil.betaShow("收到管控:应用删除"); +// if (!TextUtils.isEmpty(title)) { +// if (SaveListUtils.getlist().contains(title)) { +// SaveListUtils.getlist().remove(title); +// } +// SaveListUtils.sendForceAPP(mContext); +// ApkUtils.UninstallAPP(mContext, title); +// } +// HTTPInterface.getAppLimit(context); +// HTTPInterface.getNetAndLaunchSetting(mContext); +// break; +// case MSG_SETTING: +// ToastUtil.betaShow("收到管控:系统设置"); +// if (!TextUtils.isEmpty(extras)) { +// JGYUtils.getInstance().SettingSysData(extras); +// } +// break; +// case MSG_BROWSER: +// ToastUtil.betaShow("收到管控:浏览器网址管控"); +// getDeselectBrowerID(); +// break; +// case MSG_APPID: +// ToastUtil.betaShow("收到管控:APP ID管控"); +// getDeselectID(); +// break; +// case MSG_NET_CONTROL: +// ToastUtil.betaShow("收到管控:应用联网管控"); +// settingNetControl(extras); +// break; +// case MSG_POWER_ON: +// ToastUtil.betaShow("收到管控:应用自启管控"); +// settingPowerOn(extras); +// break; +// case MSG_RESET: +// ToastUtil.betaShow("收到管控:设备重置"); +// Utils.doMasterClear(mContext); +// break; +// case MSG_INSTALL: +// ToastUtil.betaShow("收到管控:应用安装"); +// HTTPInterface.getAppLimit(context); +// doDownloadAndInstall(extras); +// HTTPInterface.setHideDesktopIcon(mContext); +// break; +// case MSG_LOCK: +// ToastUtil.betaShow("收到管控:设备锁定"); +// settingLock(extras); +// break; +// case MSG_CAMERA: +// ToastUtil.betaShow("收到管控:相机管控"); +// settingCamera(extras); +// break; +// case MSG_ONEPACKAGES: +// ToastUtil.betaShow("收到管控:"); +// if (BaseApplication.getInstance().isFinished()) { +// settingOneNet(extras); +// } +// break; +// case GET_APP_USEDTIME: +// ToastUtil.betaShow("收到管控:获取应用使用时间"); +// JSONObject jsonObject = JSON.parseObject(extras); +// String random = jsonObject.getString("random"); +// String sendType = jsonObject.getString("type"); +// BaseApplication.sendAppUsedTime(random, sendType); +// break; +// case GET_FORCEDOWNLOADURL: +// ToastUtil.betaShow("收到管控:应用强制安装"); +// File file = new File(JGYUtils.getInstance().getDownLoadPath()); +// if (!file.exists()) { +// file.mkdirs(); +// } +// if (TextUtils.isEmpty(extras)) { +// Log.e(TAG, "settingNetControl extras is null"); +// return; +// } +// JSONObject extra = JSON.parseObject(extras); +// String app_name = extra.getString("app_name"); +// String app_package = extra.getString("package"); +// String url = extra.getString("url"); +// int versionCode = extra.getInteger("version_code"); +// String app_id = extra.getString("app_id"); +// JSONObject packageObj = new JSONObject(); +// packageObj.put("app_name", app_name); +// packageObj.put("app_package", app_package); +// packageObj.put("app_id", app_id); +// Utils.ariaDownload(mContext, url, packageObj); +// break; +// case SET_HOMEPAG_TAG: +// Handler.getMain().postDelayed(new Runnable() { +// @Override +// public void run() { +// try { +// new CacheUtils().cleanApplicationUserData(mContext, "com.android.browser"); +// } catch (Exception e) { +// e.printStackTrace(); +// Log.e(TAG, "setHomepagtag: " + e.getMessage()); +// } +// setHomepagtag(extras); +// ToastUtil.betaShow("收到管控:浏览器主页书签设置"); +// } +// }, 2000); +// +// break; +// case APP_WEBSITE: +// ToastUtil.betaShow("收到管控:APP内部网页管控"); +// setAPPinsideWebsite(extras); +// break; +// case DISABLE_APPUPDATE: +// ToastUtil.betaShow("收到管控:应用禁止更新设置"); +// setDisableUpdateList(extras); +// break; +// case HIDE_DESKTOP_ICON: +// ToastUtil.betaShow("收到管控:隐藏应用设置"); +// Handler.getMain().postDelayed(() -> { +// //后台发送时数据库未改变,有时候可能获取到的数据时上一次的 +// Log.e(TAG, "run: HIDE_DESKTOP_ICON "); +// HTTPInterface.setHideDesktopIcon(context); +// }, 2000); +// break; +// case DISABLE_APP_SLIDE: +// ToastUtil.betaShow("收到管控:应用滑动设置"); +// setDisableSlideList(extras); +// break; +// case UPDATE_INFO: +// ToastUtil.betaShow("收到管控:更新白名单"); +// HTTPInterface.getAppLimit(context); +// break; +// case SN_SCREENSHOT: +// ToastUtil.betaShow("收到管控:设备截图"); +// screenshot(extras); +// break; +// case DEVICES_REBOOT: +// ToastUtil.betaShow("收到管控:设备重启"); +// Utils.rebootDevices(mContext); +// break; +// case GET_DEVICES_INFO: +// ToastUtil.betaShow("收到管控:获取设备信息"); +// if (MainService.mPresenter != null) { +// MainService.mPresenter.getLockedState(); +// MainService.mPresenter.sendMACAddress(); +// Log.e(TAG, "mPresenter: " + "getLockedState"); +// } else { +// Log.e(TAG, "mPresenter is NULL"); +// } +// AMapLocationClient aMapLocationClient = AmapManager.getInstance().getLocationClient(); +// aMapLocationClient.stopLocation(); +// aMapLocationClient.startLocation(); +// aMapLocationClient.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"); +// SPUtils.put(mContext, "AmapError", String.valueOf(aMapLocation.getErrorCode())); +// } +// Log.e(TAG, (String) SPUtils.get(mContext, "AmapAddress", "-")); +// Log.e(TAG, (String) SPUtils.get(mContext, "AmapError", "-")); +// Log.e(TAG, "amap: " + sb.toString()); +// HTTPInterface.updateDeviceInfo(mContext); +// } +// }); +// break; +// case LOCK_SCREEN: +// ToastUtil.betaShow("收到管控:屏幕锁定"); +// JSONObject lockJSONObject = JSON.parseObject(extras); +// String name = lockJSONObject.getString("name"); +// setLock_screen(1, context, name); +// break; +// case UNLOCK_SCREEN: +// ToastUtil.betaShow("收到管控:屏幕解锁"); +// setLock_screen(0, context, ""); +// break; +// case KILL_SERVER: +// ToastUtil.betaShow("收到管控:停止应用"); +// JSONObject killJSONObject = JSON.parseObject(extras); +// String packages = killJSONObject.getString("package_name"); +// JGYUtils.getInstance().killBackgroundProcesses(context, packages); +// break; +// case TIME_CONTROL: +// ToastUtil.betaShow("收到管控:使用时间管控"); +// getTimeControl(context, extras); +// break; +// case TOP_APP: +// ToastUtil.betaShow("收到管控:应用霸屏"); +// getTopApp(context, extras); +// break; +// case LOGO_IMG: +// ToastUtil.betaShow("收到管控:开机动画设置"); +// setBootanimation(context, extras); +// Log.e(TAG, "processCustomMessage: " + extras); +// break; +// case DEFAULTP_APP: +// ToastUtil.betaShow("收到管控:"); +// setDefalutApp(context, extras); +// break; +// case PLAY_SOUND: +// ToastUtil.betaShow("收到管控:查找设备"); +// playSound(context, extras); +// break; +// case CLEAN_APP_CACHE: +// ToastUtil.betaShow("收到管控:应用缓存清除"); +// cleanCache(context, extras); +// break; +// case DEVELOPER_OPTIONS: +// ToastUtil.betaShow("收到管控:开发人员选项管控"); +// setDeveloperoptions(extras); +// break; +// case GLOBAL_UPDATE: +// ToastUtil.betaShow("收到管控:全局更新"); +// GlobalUpdate(extras); +// break; +// case EBAG_CODE: +// ToastUtil.betaShow("收到管控:电子书包激活码"); +// setEbagCode(extras); +// JGYUtils.getInstance().killBackgroundProcesses(context, "com.jxw.launcher"); +// break; +// case UPDATE_WHITELIST: +// ToastUtil.betaShow("收到管控:更新白名单"); +// HTTPInterface.getAppLimit(mContext); +// break; +// case UPDATE_BATCH: +// ToastUtil.betaShow("收到管控:更换批次不恢复出厂设置"); +// Aria.download(this).removeAllTask(true); +// try { +// new CacheUtils().cleanApplicationUserData(mContext, "com.android.browser"); +// } catch (Exception e) { +// e.printStackTrace(); +// Log.e(TAG, "setHomepagtag: " + e.getMessage()); +// } +// if (MainService.mPresenter != null) { +// MainService.mPresenter.getLockedState(); +// Log.e("getLockedState", "mPresenter: " + "getLockedState"); +// } else { +// Log.e("getLockedState", "mPresenter is NULL"); +// } +// break; +// case UPDATE_WIFI_PW: +// HTTPInterface.getWiFiPasswd(context); +// break; +// case DEVICES_POWEROFF: +// HTTPInterface.getPoweroffTime(); +// break; +// case SN_RUN_LOG: +// recordLog(context, extras); +// break; +// case CUSTOM_ORDER: +// customOrder(context, extras); +// break; +// } +// +// } + + private void setLock_screen(int state, Context context, String name) { + if (ServiceAliveUtils.isServiceAlive(context)) { + context.startService(new Intent(context, MainService.class)); + } + Intent intent = new Intent(); + intent.putExtra("name", name); + if (state == 1) { + intent.setAction(MainService.LockScreenReceiver.action_lock); + } else if (state == 0) { + intent.setAction(MainService.LockScreenReceiver.action_unlock); + } + context.sendBroadcast(intent); + } + + private void doDownloadAndInstall(String jsonString) { + File file = new File(JGYUtils.getInstance().getDownLoadPath()); + if (!file.exists()) { + file.mkdirs(); + } + if (TextUtils.isEmpty(jsonString)) { + Log.e(TAG, "doDownloadAndInstall: extras is null"); + return; + } + JSONObject jSONObject = JSON.parseObject(jsonString); + String app_name = jSONObject.getString("app_name"); + String app_package = jSONObject.getString("bg"); + String app_url = jSONObject.getString("app_url"); + int app_version_code = jSONObject.getInteger("app_version_code"); + String app_id = jSONObject.getString("app_id"); + String MD5 = jSONObject.getString("app_md5"); + JSONObject packageObj = new JSONObject(); + packageObj.put("app_name", app_name); + packageObj.put("app_package", app_package); + packageObj.put("app_id", app_id); + packageObj.put("MD5", MD5); + Log.e(TAG, "doDownloadAndInstall: app_package:" + app_package); + Log.e(TAG, "doDownloadAndInstall: app_url:" + app_url); + SaveListUtils.addList(app_package); + SaveListUtils.sendForceAPP(mContext); + PackageManager pm = mContext.getPackageManager(); + PackageInfo packageInfo = null; + try { + packageInfo = pm.getPackageInfo(app_package, 0); + } catch (PackageManager.NameNotFoundException e) { + e.printStackTrace(); + } + if (packageInfo == null) { + Log.e(TAG, "doDownloadAndInstall: " + app_package + "未安装"); + if (!SaveListUtils.isDownLoading(app_url)) { + Log.e(TAG, "doDownloadAndInstall: " + app_package + "开始下载"); + Utils.ariaDownload(mContext, app_url, packageObj); + } + } else { + long appVersionCode; + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) { + appVersionCode = packageInfo.getLongVersionCode(); + } else { + appVersionCode = packageInfo.versionCode; + } + if (app_version_code > appVersionCode) { + if (!SaveListUtils.isDownLoading(app_url)) { + Utils.ariaDownload(mContext, app_url, packageObj); + } + } else { + Log.e(TAG, "doDownloadAndInstall: " + app_package + "已安装最新版"); + } + } + } + + private int getBatteryLevel() { + if (Build.VERSION.SDK_INT >= 21) { + return ((BatteryManager) this.mContext.getSystemService(Context.BATTERY_SERVICE)).getIntProperty(4); + } + Intent intent = (new ContextWrapper(this.mContext)).registerReceiver(null, new IntentFilter("android.intent.action.BATTERY_CHANGED")); + return intent.getIntExtra("level", -1) * 100 / intent.getIntExtra("scale", -1); + } + + private void getDeselectBrowerID() { + HTTPInterface.setBrowserBlackList(mContext);//浏览器网址管控 + } + + private void getDeselectID() { + NetInterfaceManager.getInstance().getDeselectIDApi() + .getDeselectIDApi(NetInterfaceManager.HTTP_KEY, + Utils.getSerial()) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new Observer() { + @Override + public void onSubscribe(Disposable param1Disposable) { + Log.e("getDeselectID", "onSubscribe: "); + } + + @Override + public void onNext(ResponseBody param1ResponseBody) { + String ids = ""; + String packages = ""; + try { + String responString = param1ResponseBody.string(); + Log.e("getDeselectID", "onNext: " + responString); + JSONObject jSONObject = JSON.parseObject(responString); + int code = jSONObject.getInteger("code"); + if (code == 200) { + ids = jSONObject.getJSONObject("data").getString("ids"); + packages = jSONObject.getJSONObject("data").getString("package"); + } + } catch (Exception e) { + Log.e("getDeselectID", "onNext: Exception: " + e.getMessage()); + e.printStackTrace(); + } + JGYUtils.getInstance().writeDeselectIDtoSystem(ids, packages); + } + + @Override + public void onError(Throwable param1Throwable) { + Log.e("getDeselectID", "onError: " + param1Throwable.getMessage()); + } + + @Override + public void onComplete() { + Log.e("getDeselectID", "onComplete: "); + } + }); + } + + + private void setDisableSlideList(String s) { + JSONObject jSONObject = JSON.parseObject(s); + Log.e("setDisableSlideList", "jSONObject::" + jSONObject.toString()); + String strban = jSONObject.getString("ban"); + String strnot = jSONObject.getString("not"); + String qch_disable_slide = Settings.System.getString(mContext.getApplicationContext().getContentResolver(), "qch_disable_slide"); + Log.e("fht", "qch_disable_slide::" + qch_disable_slide); + + if (!TextUtils.isEmpty(strban)) { + Settings.System.putString(mContext.getContentResolver(), "qch_disable_slide", strban); + Log.e("fht", "sendban::" + strban); + } else { + Settings.System.putString(mContext.getContentResolver(), "qch_disable_slide", "Invalid"); + } + Log.e("fht", "qch_disable_slide::" + Settings.System.getString(mContext.getApplicationContext().getContentResolver(), "qch_disable_slide")); + } + + private void setDisableUpdateList(String s) { + Log.e("setDisableUpdateList", s); + JSONObject jsonObject = JSON.parseObject(s); + String ban = jsonObject.getString("ban"); + String not = jsonObject.getString("not"); + String[] banList = ban.split(","); + String[] notList = not.split(","); + boolean b = Utils.writeDisableUpdateList(mContext, banList, notList); + HTTPInterface.getAppLimit(mContext); + } + + private void settingCamera(String s) { + if (TextUtils.isEmpty(s)) { + Intent intent = new Intent("qch_camera_forbid").setPackage("com.android.settings"); + intent.putExtra("camera_package_name", "close"); + this.mContext.sendBroadcast(intent); + Log.e(TAG, "settingNetControl extras is null"); + return; + } + JSONObject jSONObject = JSON.parseObject(s); + String s1 = jSONObject.getString("ban"); +// String str = jSONObject.optString("not"); + Log.e("settingCamera", "ban::" + s1); +// Log.e("settingCamera", "not::" + str); + if ("0".equals(s1)) { + Intent intent2 = new Intent("qch_camera_forbid").setPackage("com.android.settings"); +// intent2.putExtra("camera_package_name", s1); + this.mContext.sendBroadcast(intent2); + } else { + Intent intent1 = new Intent("qch_camera_open").setPackage("com.android.settings"); +// intent1.putExtra("camera_package_name", str); + this.mContext.sendBroadcast(intent1); + } + } + + private void settingOneNet(String s) { + if (TextUtils.isEmpty(s)) { + Log.e(TAG, "settingNetControl extras is null"); +// return; + } + JSONObject jSONObject = JSON.parseObject(s); + Log.e("settingOneNet", "jSONObject::" + jSONObject.toString()); + + String packages = jSONObject.getString("package"); + String status = jSONObject.getString("status"); + } + + private void settingNetControl(String s) { + if (TextUtils.isEmpty(s)) { + Log.e(TAG, "settingNetControl extras is null"); + } + JSONObject jSONObject = JSON.parseObject(s); + Log.e("settingNetControl", "jSONObject::" + jSONObject.toString()); + String disallow = jSONObject.getString("ban"); + String allow = jSONObject.getString("not"); + HashSet disallowApp = new HashSet<>(Arrays.asList(disallow.split(","))); + JGYUtils.setAppNetwork(mContext, disallowApp); + } + + private void settingPowerOn(String s) { + if (TextUtils.isEmpty(s)) { + Log.e(TAG, "settingPowerOn extras is null"); + return; + } + JSONObject jSONObject = JSON.parseObject(s); + String ban = jSONObject.getString("ban"); + String not = jSONObject.getString("not"); + Log.e(TAG, "settingPowerOn: qch_app_power_on = " + not); + if (TextUtils.isEmpty(not)) { + //当 qch_app_power_on 的值为空时,会造成系统所有应用断网 + Settings.System.putString(mContext.getContentResolver(), "qch_app_power_on", "Invalid"); + } else { + Settings.System.putString(mContext.getContentResolver(), "qch_app_power_on", not); + } + } + + + private void writeDeselectBrowserIDtoSystem(String s) { + boolean bool = Settings.System.putString(this.mContext.getContentResolver(), "DeselectBrowserArray", s); + Log.e("SystemSetting", "DeselectBrowserArray---------" + s); + Log.e("SystemSetting", "DeselectBrowserArray---------" + bool); + } + + private void setHomepagtag(String s) { + HTTPInterface.getHomePageBookmarks(mContext, null); + } + + private void setAPPinsideWebsite(String s) { + //禁止app内部网页访问,包名用,隔开 + HTTPInterface.getAppinsideWeb(mContext, new HTTPInterface.GetAppinsideWebCallback() { + @Override + public void onComplete() { + Log.e(TAG, "ononComplete: setAPPinsideWebsite"); + } + }); + } + + /** + * 锁定设备 + * + * @param s + */ + public void settingLock(String s) { + if (TextUtils.isEmpty(s)) { + Log.e(TAG, "settingLock extras is null"); + return; + } + JSONObject jSONObject = JSON.parseObject(s); + + int i = changeNum(jSONObject.getIntValue("lock")); + Settings.System.putInt(this.mContext.getContentResolver(), JGYActions.ACTION_QCH_UNLOCK_IPAD, i); + Log.e("SystemSetting", "qch_unlock_ipad---------" + i); + + if (getBatteryLevel() >= CommonDatas.MIN_POWER) { + Utils.doMasterClear(mContext); + } else { + MySQLData.SetBooleanData(mContext, CommonDatas.IS_RESET, true); + } + } + + public void screenshot(String s) { + JSONObject jSONObject = JSON.parseObject(s); + long createTime = jSONObject.getLong("createTime"); + if (createTime != 0) { + Log.e("createTime", String.valueOf(createTime)); + doscreenshot(createTime); + } + } + + public void doscreenshot(final long time) { + Observable.create(new ObservableOnSubscribe() { + @Override + public void subscribe(ObservableEmitter e) throws Exception { + String filepath = mContext.getExternalFilesDir("db").getAbsolutePath(); + int n = CmdUtil.execute("screencap -p " + filepath + File.separator + time + ".db").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(time); + } else { + Log.e("doss", "失败"); + } + } + + @Override + public void onError(Throwable e) { + Log.e("doss", "Throwable=" + e.getMessage()); + } + + @Override + public void onComplete() { + + } + }); + } + + private void uplaodImage(long time) { + String filepath = mContext.getExternalFilesDir("db").getAbsolutePath(); +// String filepath = mContext.getFileStreamPath("screenshot").getAbsolutePath(); + //放在app内部data下面 + File file = new File(filepath + File.separator + time + ".db"); + //不要直接使用常用图片格式 + if (!file.exists()) { + Log.e("uplaodImage", "File does not exists"); + return; + } + //设置图片格式 +// RequestBody requestFile = RequestBody.create(MediaType.parse("image/jpg"), file); + //File转RequestBody + MediaType mediaType = MediaType.Companion.parse("image/png"); + RequestBody fileBody = RequestBody.Companion.create(file, mediaType); + //设置一个file文件 + MultipartBody.Part body = MultipartBody.Part.createFormData("file", file.getName(), fileBody); + Map params = new HashMap<>(); + params.put("sn", Utils.getSerial()); + params.put("createtime", String.valueOf(time)); + NetInterfaceManager.getInstance().getScreenshotApi() + .sendScreenshot(params, body) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new Observer() { + @Override + public void onSubscribe(Disposable d) { + Log.e("uplaodImage", "onSubscribe: "); + } + + @Override + public void onNext(BaseResponse baseResponse) { + Log.e("uplaodImage", "onNext: " + baseResponse.msg); + } + + @Override + public void onError(Throwable e) { + Log.e("uplaodImage", "onError: " + e.getMessage()); + } + + @Override + public void onComplete() { + Log.e("uplaodImage", "onComplete: "); + } + }); + } + + private void getTimeControl(Context context, String extras) { + HTTPInterface.getSnTimeControl(context); + } + + private void getTopApp(Context context, String extras) { + JSONObject jsonObject = JSON.parseObject(extras); + String packageName = jsonObject.getString("app_package"); + if (TextUtils.isEmpty(packageName)) { + SPUtils.put(context, ForegroundAppUtil.TOPAPP_KEY, ""); + ForegroundAppUtil.setTopAppClass(context, ""); + } else { + SPUtils.put(context, ForegroundAppUtil.TOPAPP_KEY, packageName); + ForegroundAppUtil.setTopAppClass(context, packageName); + ForegroundAppUtil.openTopApp(context); + } + } + + private void setBootanimation(Context context, String extras) { + JSONObject jsonObject = JSONObject.parseObject(extras); + int type = jsonObject.getInteger("type"); + if (type == 1) { + String file_url = jsonObject.getString("file_url"); + String file_md5 = jsonObject.getString("file_md5"); + JGYUtils.getInstance().checkBootFile(file_url, file_md5); + } else { + JGYUtils.getInstance().removeBootanimation(); + } + } + + private void setDefalutApp(Context context, String extras) { + if (TextUtils.isEmpty(extras)) { + JGYUtils.getInstance().setDefaultDesktop(""); + } else { + JSONObject jsonObject = JSON.parseObject(extras); + String default_launcher = jsonObject.getString("default_launcher"); + if (TextUtils.isEmpty(default_launcher)) { + JGYUtils.getInstance().setDefaultDesktop(""); + SPUtils.put(context, "default_launcher", ""); + + } else { + JGYUtils.getInstance().setDefaultDesktop(default_launcher); + SPUtils.put(context, "default_launcher", default_launcher); + } + } + } + + private void playSound(Context context, String extras) { + JSONObject jsonObject = JSONObject.parseObject(extras); + defaultCallMediaPlayer(context); + } + + /** + * 播放系统默认来电铃声 + * + * @return MediaPlayer对象 + * @throws Exception + */ + MediaPlayer mediaPlayer; + + public void defaultCallMediaPlayer(Context context) { + if (mediaPlayer != null) { + mediaPlayer.stop(); + mediaPlayer.release(); + } + mediaPlayer = MediaPlayer.create(context, R.raw.test); + try { +// mediaPlayer.prepare(); + mediaPlayer.setLooping(false); + int duration = mediaPlayer.getDuration() / 1000; + Log.e(TAG, "defaultCallMediaPlayer: " + "duration: " + duration); + int loop = 0; + if (duration <= 1) { + loop = 30; + } else { + loop = (30 / duration); + } + final int[] soundCount = {0}; + int finalLoop = loop; + mediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() { + @Override + public void onCompletion(MediaPlayer mediaPlayer) { + if (soundCount[0] <= finalLoop) { + setMaxVolume(context); + mediaPlayer.start(); + soundCount[0] += 1; + Log.e(TAG, "onCompletion: " + "loop: " + finalLoop); + Log.e(TAG, "onCompletion: " + "soundCount: " + soundCount[0]); + } else { + mediaPlayer.stop(); + mediaPlayer.release(); + Log.e(TAG, "onCompletion: " + "loop: " + finalLoop); + Log.e(TAG, "onCompletion: " + "soundCount: " + soundCount[0]); + } + } + }); + mediaPlayer.setLooping(false); + setMaxVolume(context); + mediaPlayer.start(); + } catch (Exception e) { + e.printStackTrace(); + Log.e(TAG, "defaultCallMediaPlayer: " + e.getMessage()); + } + + } + + private void setMaxVolume(Context context) { + AudioManager audioManager = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE); + int ringMax = audioManager.getStreamMaxVolume(AudioManager.STREAM_RING); + int musicMax = audioManager.getStreamMaxVolume(AudioManager.STREAM_MUSIC); + int voiceMax = audioManager.getStreamMaxVolume(AudioManager.STREAM_VOICE_CALL); + audioManager.setStreamVolume(AudioManager.STREAM_RING, ringMax, 0); + audioManager.setStreamVolume(AudioManager.STREAM_VOICE_CALL, voiceMax, 0); + audioManager.setStreamVolume(AudioManager.STREAM_MUSIC, musicMax, 0); //音乐音量 + audioManager.setMode(AudioManager.MODE_IN_COMMUNICATION); + audioManager.setSpeakerphoneOn(true); + } + + + private void cleanCache(Context context, String extras) { + JSONObject jsonObject = JSONObject.parseObject(extras); + String packageName = jsonObject.getString("app_package"); + if (TextUtils.isEmpty(packageName)) { + Log.e(TAG, "cleanCache: " + "package is empty"); + } else { + try { + if (new CacheUtils().cleanApplicationUserData(context, packageName)) { + Log.e(TAG, "cleanCache: " + packageName + " success"); + } else { + Log.e(TAG, "cleanCache: " + packageName + " failed"); + } + } catch (Exception e) { + e.printStackTrace(); + Log.e(TAG, "cleanCache: " + e.getMessage()); + } + } + } + + private void setDeveloperoptions(String extras) { + JSONObject jsonObject = JSONObject.parseObject(extras); + int is_developer = jsonObject.getInteger("is_developer"); + Log.e(TAG + ":" + "getDeveloper", "onNext: " + is_developer); + Log.e(TAG, "setDeveloperoptions: " + is_developer); + JGYUtils.getInstance().setDeveloperOptions(is_developer == 0 ? 1 : 0); + } + + private void GlobalUpdate(String jsonString) { + if (TextUtils.isEmpty(jsonString)) { + throw new RuntimeException(); + } + JSONObject jsonObject = JSON.parseObject(jsonString); + String platform = jsonObject.getString("platform"); + if (JGYUtils.getInstance().isSamePlatform(platform)) { + checkAPPInstall(jsonObject); + } else { + Log.e(TAG, "GlobalUpdate: " + "应用与app平台不符合"); + } + } + + @SuppressLint("NewApi") + private void checkAPPInstall(JSONObject jsonObject) { + long version_code = jsonObject.getLong("app_version_code"); + PackageManager pm = mContext.getPackageManager(); + PackageInfo packageInfo = null; + try { + packageInfo = pm.getPackageInfo(jsonObject.getString("app_package"), 0); + } catch (PackageManager.NameNotFoundException e) { + e.printStackTrace(); + } + if (packageInfo == null || packageInfo.getLongVersionCode() < version_code) { + Utils.ariaDownload(mContext, jsonObject.getString("app_url"), jsonObject); + } else { + Log.e(TAG, "checkAPPInstall: " + "已经是最新版"); + } + } + + private void setEbagCode(String jsonString) { + JSONObject jsonObject = JSON.parseObject(jsonString); + String ebagCode = jsonObject.getString("ebagCode"); + if (TextUtils.isEmpty(ebagCode)) { + Log.e(TAG, "setEbagCode: " + "ebagCode is empty"); + } else { + SPUtils.put(mContext, "ebagCode", ebagCode); + } + } + + private void recordLog(Context context, String jsonString) { + HTTPInterface.getRunLog(context); + } + + private static final int ACTION_PULL = 1; + private static final int ACTION_DELETE = 2; + private static final int ACTION_UPGRADE = 3; + + private void customOrder(Context context, String jsonString) { + Gson gson = new Gson(); + Type type = new TypeToken() { + }.getType(); + RemoteDebug remoteDebug = gson.fromJson(jsonString, type); + if (remoteDebug != null) { + String pkg = remoteDebug.getApp_package(); + String content = remoteDebug.getContent(); + switch (remoteDebug.getType()) { + case ACTION_PULL: + Log.e(TAG, "customOrder: 唤起"); + ApkUtils.openPackage(context, pkg); + break; + case ACTION_DELETE: + Log.e(TAG, "customOrder: 删除"); + ApkUtils.UninstallAPP(context, pkg); + break; + case ACTION_UPGRADE: + Log.e(TAG, "customOrder: 更新"); + HTTPInterface.getForceDownload(context); + break; + default: + break; + } + } + } +} diff --git a/app/src/main/java/com/aoleyun/sn/jpush/MyReceiver.java b/app/src/main/java/com/aoleyun/sn/jpush/MyReceiver.java index d7f6624..b163f2a 100644 --- a/app/src/main/java/com/aoleyun/sn/jpush/MyReceiver.java +++ b/app/src/main/java/com/aoleyun/sn/jpush/MyReceiver.java @@ -1,19 +1,5 @@ package com.aoleyun.sn.jpush; -import android.content.BroadcastReceiver; -import android.content.Context; -import android.content.Intent; -import android.os.Bundle; -import android.text.TextUtils; - -import com.aoleyun.sn.activity.MainActivity; - -import org.json.JSONException; -import org.json.JSONObject; - -import java.util.Iterator; - -import cn.jpush.android.api.JPushInterface; /** * 自定义接收器 @@ -22,108 +8,108 @@ import cn.jpush.android.api.JPushInterface; * 1) 默认用户会打开主界面 * 2) 接收不到自定义消息 */ -public class MyReceiver extends BroadcastReceiver { - private static final String TAG = "JIGUANG-Example"; - - @Override - public void onReceive(Context context, Intent intent) { - try { - 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()); - } - } catch (Exception e){ - - } - - } - - // 打印所有的 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(); - } - - //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); - } - } -} +//public class MyReceiver extends BroadcastReceiver { +// private static final String TAG = "JIGUANG-Example"; +// +// @Override +// public void onReceive(Context context, Intent intent) { +// try { +// 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()); +// } +// } catch (Exception e){ +// +// } +// +// } +// +// // 打印所有的 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(); +// } +// +// //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); +// } +// } +//} diff --git a/app/src/main/java/com/aoleyun/sn/jpush/PushService.java b/app/src/main/java/com/aoleyun/sn/jpush/PushService.java index 9b6fa99..60cdff7 100644 --- a/app/src/main/java/com/aoleyun/sn/jpush/PushService.java +++ b/app/src/main/java/com/aoleyun/sn/jpush/PushService.java @@ -1,7 +1,8 @@ package com.aoleyun.sn.jpush; -import cn.jpush.android.service.JCommonService; +//import cn.jpush.android.service.JCommonService; -public class PushService extends JCommonService { +public class PushService { +// extends JCommonService { } diff --git a/app/src/main/java/com/aoleyun/sn/jpush/TagAliasOperatorHelper.java b/app/src/main/java/com/aoleyun/sn/jpush/TagAliasOperatorHelper.java index b74b21c..265095e 100644 --- a/app/src/main/java/com/aoleyun/sn/jpush/TagAliasOperatorHelper.java +++ b/app/src/main/java/com/aoleyun/sn/jpush/TagAliasOperatorHelper.java @@ -11,335 +11,333 @@ import com.aoleyun.sn.utils.ToastUtil; import java.util.Locale; import java.util.Set; -import cn.jpush.android.api.JPushInterface; -import cn.jpush.android.api.JPushMessage; /** * 处理tagalias相关的逻辑 * */ public class TagAliasOperatorHelper { - private static final String TAG = "JIGUANG-TagAliasHelper"; - public static int sequence = 1; - /**增加*/ - public static final int ACTION_ADD = 1; - /**覆盖*/ - public static final int ACTION_SET = 2; - /**删除部分*/ - public static final int ACTION_DELETE = 3; - /**删除所有*/ - public static final int ACTION_CLEAN = 4; - /**查询*/ - public static final int ACTION_GET = 5; - - public static final int ACTION_CHECK = 6; - - public static final int DELAY_SEND_ACTION = 1; - - public static final int DELAY_SET_MOBILE_NUMBER_ACTION = 2; - - private Context context; - - private static TagAliasOperatorHelper mInstance; - private TagAliasOperatorHelper(){ - } - public static TagAliasOperatorHelper getInstance(){ - if(mInstance == null){ - synchronized (TagAliasOperatorHelper.class){ - if(mInstance == null){ - mInstance = new TagAliasOperatorHelper(); - } - } - } - return mInstance; - } - public void init(Context context){ - if(context != null) { - this.context = context.getApplicationContext(); - } - } - private SparseArray setActionCache = new SparseArray(); - - public Object get(int sequence){ - return setActionCache.get(sequence); - } - public Object remove(int sequence){ - return setActionCache.get(sequence); - } - public void put(int sequence, Object tagAliasBean){ - setActionCache.put(sequence,tagAliasBean); - } - private Handler delaySendHandler = new Handler(){ - @Override - public void handleMessage(Message msg) { - switch (msg.what){ - case DELAY_SEND_ACTION: - if(msg.obj !=null && msg.obj instanceof TagAliasBean){ - Logger.i(TAG,"on delay time"); - sequence++; - TagAliasBean tagAliasBean = (TagAliasBean) msg.obj; - setActionCache.put(sequence, tagAliasBean); - if(context!=null) { - handleAction(context, sequence, tagAliasBean); - }else{ - Logger.e(TAG,"#unexcepted - context was null"); - } - }else{ - Logger.w(TAG,"#unexcepted - msg obj was incorrect"); - } - break; - case DELAY_SET_MOBILE_NUMBER_ACTION: - if(msg.obj !=null && msg.obj instanceof String) { - Logger.i(TAG, "retry set mobile number"); - sequence++; - String mobileNumber = (String) msg.obj; - setActionCache.put(sequence, mobileNumber); - if(context !=null) { - handleAction(context, sequence, mobileNumber); - }else { - Logger.e(TAG, "#unexcepted - context was null"); - } - }else{ - Logger.w(TAG,"#unexcepted - msg obj was incorrect"); - } - break; - } - } - }; - public void handleAction(Context context, int sequence, String mobileNumber){ - put(sequence,mobileNumber); - Logger.d(TAG,"sequence:"+sequence+",mobileNumber:"+mobileNumber); - JPushInterface.setMobileNumber(context,sequence,mobileNumber); - } - /** - * 处理设置tag - * */ - public void handleAction(Context context, int sequence, TagAliasBean tagAliasBean){ - init(context); - if(tagAliasBean == null){ - Logger.w(TAG,"tagAliasBean was null"); - return; - } - put(sequence,tagAliasBean); - if(tagAliasBean.isAliasAction){ - switch (tagAliasBean.action){ - case ACTION_GET: - JPushInterface.getAlias(context,sequence); - break; - case ACTION_DELETE: - JPushInterface.deleteAlias(context,sequence); - break; - case ACTION_SET: - JPushInterface.setAlias(context,sequence,tagAliasBean.alias); - break; - default: - Logger.w(TAG,"unsupport alias action type"); - return; - } - }else { - switch (tagAliasBean.action) { - case ACTION_ADD: - JPushInterface.addTags(context, sequence, tagAliasBean.tags); - break; - case ACTION_SET: - JPushInterface.setTags(context, sequence, tagAliasBean.tags); - break; - case ACTION_DELETE: - JPushInterface.deleteTags(context, sequence, tagAliasBean.tags); - break; - case ACTION_CHECK: - //一次只能check一个tag - String tag = (String)tagAliasBean.tags.toArray()[0]; - JPushInterface.checkTagBindState(context,sequence,tag); - break; - case ACTION_GET: - JPushInterface.getAllTags(context, sequence); - break; - case ACTION_CLEAN: - JPushInterface.cleanTags(context, sequence); - break; - default: - Logger.w(TAG,"unsupport tag action type"); - return; - } - } - } - private boolean RetryActionIfNeeded(int errorCode,TagAliasBean tagAliasBean){ - if(!ExampleUtil.isConnected(context)){ - Logger.w(TAG,"no network"); - return false; - } - //返回的错误码为6002 超时,6014 服务器繁忙,都建议延迟重试 - if(errorCode == 6002 || errorCode == 6014){ - Logger.d(TAG,"need retry"); - if(tagAliasBean!=null){ - Message message = new Message(); - message.what = DELAY_SEND_ACTION; - message.obj = tagAliasBean; - delaySendHandler.sendMessageDelayed(message,1000*60); - String logs =getRetryStr(tagAliasBean.isAliasAction, tagAliasBean.action,errorCode); - ExampleUtil.showToast(logs, context); - return true; - } - } - return false; - } - private boolean RetrySetMObileNumberActionIfNeeded(int errorCode, String mobileNumber){ - if(!ExampleUtil.isConnected(context)){ - Logger.w(TAG,"no network"); - return false; - } - //返回的错误码为6002 超时,6024 服务器内部错误,建议稍后重试 - if(errorCode == 6002 || errorCode == 6024){ - Logger.d(TAG,"need retry"); - Message message = new Message(); - message.what = DELAY_SET_MOBILE_NUMBER_ACTION; - message.obj = mobileNumber; - delaySendHandler.sendMessageDelayed(message,1000*60); - String str = "Failed to set mobile number due to %s. Try again after 60s."; - str = String.format(Locale.ENGLISH,str,(errorCode == 6002 ? "timeout" : "server internal error”")); - ExampleUtil.showToast(str, context); - return true; - } - return false; - - } - private String getRetryStr(boolean isAliasAction, int actionType, int errorCode){ - String str = "Failed to %s %s due to %s. Try again after 60s."; - str = String.format(Locale.ENGLISH,str,getActionStr(actionType),(isAliasAction? "alias" : " tags") ,(errorCode == 6002 ? "timeout" : "server too busy")); - return str; - } - - private String getActionStr(int actionType){ - switch (actionType){ - case ACTION_ADD: - return "add"; - case ACTION_SET: - return "set"; - case ACTION_DELETE: - return "delete"; - case ACTION_GET: - return "get"; - case ACTION_CLEAN: - return "clean"; - case ACTION_CHECK: - return "check"; - } - return "unkonw operation"; - } - public void onTagOperatorResult(Context context, JPushMessage jPushMessage) { - int sequence = jPushMessage.getSequence(); - Logger.i(TAG,"action - onTagOperatorResult, sequence:"+sequence+",tags:"+jPushMessage.getTags()); - Logger.i(TAG,"tags size:"+jPushMessage.getTags().size()); - init(context); - //根据sequence从之前操作缓存中获取缓存记录 - TagAliasBean tagAliasBean = (TagAliasBean)setActionCache.get(sequence); - if(tagAliasBean == null){ - ExampleUtil.showToast("获取缓存记录失败", context); - return; - } - if(jPushMessage.getErrorCode() == 0){ - Logger.i(TAG,"action - modify tag Success,sequence:"+sequence); - setActionCache.remove(sequence); - String logs = getActionStr(tagAliasBean.action)+" tags success"; - Logger.i(TAG,logs); - Log.e(TAG,"Tag绑定成功: " + jPushMessage.getTags()); - ToastUtil.betaShow("Tag绑定成功: " + jPushMessage.getTags()); - ExampleUtil.showToast(logs, context); - }else{ - String logs = "Failed to " + getActionStr(tagAliasBean.action)+" tags"; - if(jPushMessage.getErrorCode() == 6018){ - //tag数量超过限制,需要先清除一部分再add - logs += ", tags is exceed limit need to clean"; - } - logs += ", errorCode:" + jPushMessage.getErrorCode(); - Logger.e(TAG, logs); - if(!RetryActionIfNeeded(jPushMessage.getErrorCode(),tagAliasBean)) { - ExampleUtil.showToast(logs, context); - } - } - } - public void onCheckTagOperatorResult(Context context, JPushMessage jPushMessage){ - int sequence = jPushMessage.getSequence(); - Logger.i(TAG,"action - onCheckTagOperatorResult, sequence:"+sequence+",checktag:"+jPushMessage.getCheckTag()); - init(context); - //根据sequence从之前操作缓存中获取缓存记录 - TagAliasBean tagAliasBean = (TagAliasBean)setActionCache.get(sequence); - if(tagAliasBean == null){ - ExampleUtil.showToast("获取缓存记录失败", context); - return; - } - if(jPushMessage.getErrorCode() == 0){ - Logger.i(TAG,"tagBean:"+tagAliasBean); - setActionCache.remove(sequence); - String logs = getActionStr(tagAliasBean.action)+" tag "+jPushMessage.getCheckTag() + " bind state success,state:"+jPushMessage.getTagCheckStateResult(); - Logger.i(TAG,logs); - ExampleUtil.showToast(logs, context); - }else{ - String logs = "Failed to " + getActionStr(tagAliasBean.action)+" tags, errorCode:" + jPushMessage.getErrorCode(); - Logger.e(TAG, logs); - if(!RetryActionIfNeeded(jPushMessage.getErrorCode(),tagAliasBean)) { - ExampleUtil.showToast(logs, context); - } - } - } - public void onAliasOperatorResult(Context context, JPushMessage jPushMessage) { - int sequence = jPushMessage.getSequence(); - Logger.i(TAG,"action - onAliasOperatorResult, sequence:"+sequence+",alias:"+jPushMessage.getAlias()); - init(context); - //根据sequence从之前操作缓存中获取缓存记录 - TagAliasBean tagAliasBean = (TagAliasBean)setActionCache.get(sequence); - if(tagAliasBean == null){ - ExampleUtil.showToast("获取缓存记录失败", context); - return; - } - if(jPushMessage.getErrorCode() == 0){ - Logger.i(TAG,"action - modify alias Success,sequence:"+sequence); - setActionCache.remove(sequence); - String logs = getActionStr(tagAliasBean.action)+" alias success"; - Logger.i(TAG,logs); - Log.e(TAG,"Alias绑定成功: "+jPushMessage.getAlias()); - ToastUtil.betaShow("Alias绑定成功: "+jPushMessage.getAlias()); - ExampleUtil.showToast(logs, context); - }else{ - String logs = "Failed to " + getActionStr(tagAliasBean.action)+" alias, errorCode:" + jPushMessage.getErrorCode(); - Logger.e(TAG, logs); - if(!RetryActionIfNeeded(jPushMessage.getErrorCode(),tagAliasBean)) { - ExampleUtil.showToast(logs, context); - } - } - } - //设置手机号码回调 - public void onMobileNumberOperatorResult(Context context, JPushMessage jPushMessage) { - int sequence = jPushMessage.getSequence(); - Logger.i(TAG,"action - onMobileNumberOperatorResult, sequence:"+sequence+",mobileNumber:"+jPushMessage.getMobileNumber()); - init(context); - if(jPushMessage.getErrorCode() == 0){ - Logger.i(TAG,"action - set mobile number Success,sequence:"+sequence); - setActionCache.remove(sequence); - }else{ - String logs = "Failed to set mobile number, errorCode:" + jPushMessage.getErrorCode(); - Logger.e(TAG, logs); - if(!RetrySetMObileNumberActionIfNeeded(jPushMessage.getErrorCode(),jPushMessage.getMobileNumber())){ - ExampleUtil.showToast(logs, context); - } - } - } - public static class TagAliasBean{ - public int action; - public Set tags; - public String alias; - public boolean isAliasAction; - - @Override - public String toString() { - return "TagAliasBean{" + - "action=" + action + - ", tags=" + tags + - ", alias='" + alias + '\'' + - ", isAliasAction=" + isAliasAction + - '}'; - } - } - - +// private static final String TAG = "JIGUANG-TagAliasHelper"; +// public static int sequence = 1; +// /**增加*/ +// public static final int ACTION_ADD = 1; +// /**覆盖*/ +// public static final int ACTION_SET = 2; +// /**删除部分*/ +// public static final int ACTION_DELETE = 3; +// /**删除所有*/ +// public static final int ACTION_CLEAN = 4; +// /**查询*/ +// public static final int ACTION_GET = 5; +// +// public static final int ACTION_CHECK = 6; +// +// public static final int DELAY_SEND_ACTION = 1; +// +// public static final int DELAY_SET_MOBILE_NUMBER_ACTION = 2; +// +// private Context context; +// +// private static TagAliasOperatorHelper mInstance; +// private TagAliasOperatorHelper(){ +// } +// public static TagAliasOperatorHelper getInstance(){ +// if(mInstance == null){ +// synchronized (TagAliasOperatorHelper.class){ +// if(mInstance == null){ +// mInstance = new TagAliasOperatorHelper(); +// } +// } +// } +// return mInstance; +// } +// public void init(Context context){ +// if(context != null) { +// this.context = context.getApplicationContext(); +// } +// } +// private SparseArray setActionCache = new SparseArray(); +// +// public Object get(int sequence){ +// return setActionCache.get(sequence); +// } +// public Object remove(int sequence){ +// return setActionCache.get(sequence); +// } +// public void put(int sequence, Object tagAliasBean){ +// setActionCache.put(sequence,tagAliasBean); +// } +// private Handler delaySendHandler = new Handler(){ +// @Override +// public void handleMessage(Message msg) { +// switch (msg.what){ +// case DELAY_SEND_ACTION: +// if(msg.obj !=null && msg.obj instanceof TagAliasBean){ +// Logger.i(TAG,"on delay time"); +// sequence++; +// TagAliasBean tagAliasBean = (TagAliasBean) msg.obj; +// setActionCache.put(sequence, tagAliasBean); +// if(context!=null) { +// handleAction(context, sequence, tagAliasBean); +// }else{ +// Logger.e(TAG,"#unexcepted - context was null"); +// } +// }else{ +// Logger.w(TAG,"#unexcepted - msg obj was incorrect"); +// } +// break; +// case DELAY_SET_MOBILE_NUMBER_ACTION: +// if(msg.obj !=null && msg.obj instanceof String) { +// Logger.i(TAG, "retry set mobile number"); +// sequence++; +// String mobileNumber = (String) msg.obj; +// setActionCache.put(sequence, mobileNumber); +// if(context !=null) { +// handleAction(context, sequence, mobileNumber); +// }else { +// Logger.e(TAG, "#unexcepted - context was null"); +// } +// }else{ +// Logger.w(TAG,"#unexcepted - msg obj was incorrect"); +// } +// break; +// } +// } +// }; +// public void handleAction(Context context, int sequence, String mobileNumber){ +// put(sequence,mobileNumber); +// Logger.d(TAG,"sequence:"+sequence+",mobileNumber:"+mobileNumber); +// JPushInterface.setMobileNumber(context,sequence,mobileNumber); +// } +// /** +// * 处理设置tag +// * */ +// public void handleAction(Context context, int sequence, TagAliasBean tagAliasBean){ +// init(context); +// if(tagAliasBean == null){ +// Logger.w(TAG,"tagAliasBean was null"); +// return; +// } +// put(sequence,tagAliasBean); +// if(tagAliasBean.isAliasAction){ +// switch (tagAliasBean.action){ +// case ACTION_GET: +// JPushInterface.getAlias(context,sequence); +// break; +// case ACTION_DELETE: +// JPushInterface.deleteAlias(context,sequence); +// break; +// case ACTION_SET: +// JPushInterface.setAlias(context,sequence,tagAliasBean.alias); +// break; +// default: +// Logger.w(TAG,"unsupport alias action type"); +// return; +// } +// }else { +// switch (tagAliasBean.action) { +// case ACTION_ADD: +// JPushInterface.addTags(context, sequence, tagAliasBean.tags); +// break; +// case ACTION_SET: +// JPushInterface.setTags(context, sequence, tagAliasBean.tags); +// break; +// case ACTION_DELETE: +// JPushInterface.deleteTags(context, sequence, tagAliasBean.tags); +// break; +// case ACTION_CHECK: +// //一次只能check一个tag +// String tag = (String)tagAliasBean.tags.toArray()[0]; +// JPushInterface.checkTagBindState(context,sequence,tag); +// break; +// case ACTION_GET: +// JPushInterface.getAllTags(context, sequence); +// break; +// case ACTION_CLEAN: +// JPushInterface.cleanTags(context, sequence); +// break; +// default: +// Logger.w(TAG,"unsupport tag action type"); +// return; +// } +// } +// } +// private boolean RetryActionIfNeeded(int errorCode,TagAliasBean tagAliasBean){ +// if(!ExampleUtil.isConnected(context)){ +// Logger.w(TAG,"no network"); +// return false; +// } +// //返回的错误码为6002 超时,6014 服务器繁忙,都建议延迟重试 +// if(errorCode == 6002 || errorCode == 6014){ +// Logger.d(TAG,"need retry"); +// if(tagAliasBean!=null){ +// Message message = new Message(); +// message.what = DELAY_SEND_ACTION; +// message.obj = tagAliasBean; +// delaySendHandler.sendMessageDelayed(message,1000*60); +// String logs =getRetryStr(tagAliasBean.isAliasAction, tagAliasBean.action,errorCode); +// ExampleUtil.showToast(logs, context); +// return true; +// } +// } +// return false; +// } +// private boolean RetrySetMObileNumberActionIfNeeded(int errorCode, String mobileNumber){ +// if(!ExampleUtil.isConnected(context)){ +// Logger.w(TAG,"no network"); +// return false; +// } +// //返回的错误码为6002 超时,6024 服务器内部错误,建议稍后重试 +// if(errorCode == 6002 || errorCode == 6024){ +// Logger.d(TAG,"need retry"); +// Message message = new Message(); +// message.what = DELAY_SET_MOBILE_NUMBER_ACTION; +// message.obj = mobileNumber; +// delaySendHandler.sendMessageDelayed(message,1000*60); +// String str = "Failed to set mobile number due to %s. Try again after 60s."; +// str = String.format(Locale.ENGLISH,str,(errorCode == 6002 ? "timeout" : "server internal error”")); +// ExampleUtil.showToast(str, context); +// return true; +// } +// return false; +// +// } +// private String getRetryStr(boolean isAliasAction, int actionType, int errorCode){ +// String str = "Failed to %s %s due to %s. Try again after 60s."; +// str = String.format(Locale.ENGLISH,str,getActionStr(actionType),(isAliasAction? "alias" : " tags") ,(errorCode == 6002 ? "timeout" : "server too busy")); +// return str; +// } +// +// private String getActionStr(int actionType){ +// switch (actionType){ +// case ACTION_ADD: +// return "add"; +// case ACTION_SET: +// return "set"; +// case ACTION_DELETE: +// return "delete"; +// case ACTION_GET: +// return "get"; +// case ACTION_CLEAN: +// return "clean"; +// case ACTION_CHECK: +// return "check"; +// } +// return "unkonw operation"; +// } +// public void onTagOperatorResult(Context context, JPushMessage jPushMessage) { +// int sequence = jPushMessage.getSequence(); +// Logger.i(TAG,"action - onTagOperatorResult, sequence:"+sequence+",tags:"+jPushMessage.getTags()); +// Logger.i(TAG,"tags size:"+jPushMessage.getTags().size()); +// init(context); +// //根据sequence从之前操作缓存中获取缓存记录 +// TagAliasBean tagAliasBean = (TagAliasBean)setActionCache.get(sequence); +// if(tagAliasBean == null){ +// ExampleUtil.showToast("获取缓存记录失败", context); +// return; +// } +// if(jPushMessage.getErrorCode() == 0){ +// Logger.i(TAG,"action - modify tag Success,sequence:"+sequence); +// setActionCache.remove(sequence); +// String logs = getActionStr(tagAliasBean.action)+" tags success"; +// Logger.i(TAG,logs); +// Log.e(TAG,"Tag绑定成功: " + jPushMessage.getTags()); +// ToastUtil.betaShow("Tag绑定成功: " + jPushMessage.getTags()); +// ExampleUtil.showToast(logs, context); +// }else{ +// String logs = "Failed to " + getActionStr(tagAliasBean.action)+" tags"; +// if(jPushMessage.getErrorCode() == 6018){ +// //tag数量超过限制,需要先清除一部分再add +// logs += ", tags is exceed limit need to clean"; +// } +// logs += ", errorCode:" + jPushMessage.getErrorCode(); +// Logger.e(TAG, logs); +// if(!RetryActionIfNeeded(jPushMessage.getErrorCode(),tagAliasBean)) { +// ExampleUtil.showToast(logs, context); +// } +// } +// } +// +// public void onCheckTagOperatorResult(Context context, JPushMessage jPushMessage){ +// int sequence = jPushMessage.getSequence(); +// Logger.i(TAG,"action - onCheckTagOperatorResult, sequence:"+sequence+",checktag:"+jPushMessage.getCheckTag()); +// init(context); +// //根据sequence从之前操作缓存中获取缓存记录 +// TagAliasBean tagAliasBean = (TagAliasBean)setActionCache.get(sequence); +// if(tagAliasBean == null){ +// ExampleUtil.showToast("获取缓存记录失败", context); +// return; +// } +// if(jPushMessage.getErrorCode() == 0){ +// Logger.i(TAG,"tagBean:"+tagAliasBean); +// setActionCache.remove(sequence); +// String logs = getActionStr(tagAliasBean.action)+" tag "+jPushMessage.getCheckTag() + " bind state success,state:"+jPushMessage.getTagCheckStateResult(); +// Logger.i(TAG,logs); +// ExampleUtil.showToast(logs, context); +// }else{ +// String logs = "Failed to " + getActionStr(tagAliasBean.action)+" tags, errorCode:" + jPushMessage.getErrorCode(); +// Logger.e(TAG, logs); +// if(!RetryActionIfNeeded(jPushMessage.getErrorCode(),tagAliasBean)) { +// ExampleUtil.showToast(logs, context); +// } +// } +// } +// +// public void onAliasOperatorResult(Context context, JPushMessage jPushMessage) { +// int sequence = jPushMessage.getSequence(); +// Logger.i(TAG,"action - onAliasOperatorResult, sequence:"+sequence+",alias:"+jPushMessage.getAlias()); +// init(context); +// //根据sequence从之前操作缓存中获取缓存记录 +// TagAliasBean tagAliasBean = (TagAliasBean)setActionCache.get(sequence); +// if(tagAliasBean == null){ +// ExampleUtil.showToast("获取缓存记录失败", context); +// return; +// } +// if(jPushMessage.getErrorCode() == 0){ +// Logger.i(TAG,"action - modify alias Success,sequence:"+sequence); +// setActionCache.remove(sequence); +// String logs = getActionStr(tagAliasBean.action)+" alias success"; +// Logger.i(TAG,logs); +// Log.e(TAG,"Alias绑定成功: "+jPushMessage.getAlias()); +// ToastUtil.betaShow("Alias绑定成功: "+jPushMessage.getAlias()); +// ExampleUtil.showToast(logs, context); +// }else{ +// String logs = "Failed to " + getActionStr(tagAliasBean.action)+" alias, errorCode:" + jPushMessage.getErrorCode(); +// Logger.e(TAG, logs); +// if(!RetryActionIfNeeded(jPushMessage.getErrorCode(),tagAliasBean)) { +// ExampleUtil.showToast(logs, context); +// } +// } +// } +// //设置手机号码回调 +// public void onMobileNumberOperatorResult(Context context, JPushMessage jPushMessage) { +// int sequence = jPushMessage.getSequence(); +// Logger.i(TAG,"action - onMobileNumberOperatorResult, sequence:"+sequence+",mobileNumber:"+jPushMessage.getMobileNumber()); +// init(context); +// if(jPushMessage.getErrorCode() == 0){ +// Logger.i(TAG,"action - set mobile number Success,sequence:"+sequence); +// setActionCache.remove(sequence); +// }else{ +// String logs = "Failed to set mobile number, errorCode:" + jPushMessage.getErrorCode(); +// Logger.e(TAG, logs); +// if(!RetrySetMObileNumberActionIfNeeded(jPushMessage.getErrorCode(),jPushMessage.getMobileNumber())){ +// ExampleUtil.showToast(logs, context); +// } +// } +// } +// public static class TagAliasBean{ +// public int action; +// public Set tags; +// public String alias; +// public boolean isAliasAction; +// +// @Override +// public String toString() { +// return "TagAliasBean{" + +// "action=" + action + +// ", tags=" + tags + +// ", alias='" + alias + '\'' + +// ", isAliasAction=" + isAliasAction + +// '}'; +// } +// } } diff --git a/app/src/main/java/com/aoleyun/sn/jpush/invalid/ExampleApplication.java b/app/src/main/java/com/aoleyun/sn/jpush/invalid/ExampleApplication.java index e5b43ff..4d268d9 100644 --- a/app/src/main/java/com/aoleyun/sn/jpush/invalid/ExampleApplication.java +++ b/app/src/main/java/com/aoleyun/sn/jpush/invalid/ExampleApplication.java @@ -4,7 +4,6 @@ import android.app.Application; import com.aoleyun.sn.jpush.Logger; -import cn.jpush.android.api.JPushInterface; /** * For developer startup JPush SDK @@ -19,7 +18,7 @@ public class ExampleApplication extends Application { Logger.d(TAG, "[ExampleApplication] onCreate"); super.onCreate(); - JPushInterface.setDebugMode(true); // 设置开启日志,发布时请关闭日志 - JPushInterface.init(this); // 初始化 JPush +// JPushInterface.setDebugMode(true); // 设置开启日志,发布时请关闭日志 +// JPushInterface.init(this); // 初始化 JPush } } diff --git a/app/src/main/java/com/aoleyun/sn/jpush/invalid/TestActivity.java b/app/src/main/java/com/aoleyun/sn/jpush/invalid/TestActivity.java index 0c5205f..eaad7d1 100644 --- a/app/src/main/java/com/aoleyun/sn/jpush/invalid/TestActivity.java +++ b/app/src/main/java/com/aoleyun/sn/jpush/invalid/TestActivity.java @@ -6,7 +6,6 @@ import android.os.Bundle; import android.view.ViewGroup.LayoutParams; import android.widget.TextView; -import cn.jpush.android.api.JPushInterface; public class TestActivity extends Activity { @@ -21,8 +20,8 @@ public class TestActivity extends Activity { String title = null; String content = null; if(bundle!=null){ - title = bundle.getString(JPushInterface.EXTRA_NOTIFICATION_TITLE); - content = bundle.getString(JPushInterface.EXTRA_ALERT); +// title = bundle.getString(JPushInterface.EXTRA_NOTIFICATION_TITLE); +// content = bundle.getString(JPushInterface.EXTRA_ALERT); } tv.setText("Title : " + title + " " + "Content : " + content); } diff --git a/app/src/main/java/com/aoleyun/sn/network/HTTPInterface.java b/app/src/main/java/com/aoleyun/sn/network/HTTPInterface.java index 2b81916..b4dc691 100644 --- a/app/src/main/java/com/aoleyun/sn/network/HTTPInterface.java +++ b/app/src/main/java/com/aoleyun/sn/network/HTTPInterface.java @@ -49,6 +49,8 @@ import com.aoleyun.sn.utils.ForegroundAppUtil; import com.aoleyun.sn.utils.SPUtils; import com.aoleyun.sn.utils.TimeUtils; import com.aoleyun.sn.utils.Utils; +import com.tencent.android.tpush.XGIOperateCallback; +import com.tencent.android.tpush.XGPushManager; import com.tencent.mmkv.MMKV; import java.io.IOException; @@ -69,8 +71,8 @@ import retrofit2.Retrofit; import retrofit2.adapter.rxjava2.RxJava2CallAdapterFactory; import retrofit2.converter.gson.GsonConverterFactory; -import static com.aoleyun.sn.jpush.TagAliasOperatorHelper.ACTION_SET; -import static com.aoleyun.sn.jpush.TagAliasOperatorHelper.sequence; +//import static com.aoleyun.sn.jpush.TagAliasOperatorHelper.ACTION_SET; +//import static com.aoleyun.sn.jpush.TagAliasOperatorHelper.sequence; public class HTTPInterface { private static final String TAG = HTTPInterface.class.getSimpleName(); @@ -100,13 +102,13 @@ public class HTTPInterface { } } - synchronized public static void setJpushTags(final Context context) { + synchronized public static void setPushTags(final Context context) { NetInterfaceManager.getInstance() .getJpushTagsObservable() .subscribe(new Observer() { @Override public void onSubscribe(@NonNull Disposable d) { - Log.e(TAG + ":" + "setJpushTags", "onSubscribe: "); + Log.e(TAG + ":" + "setPushTags", "onSubscribe: "); } @Override @@ -114,7 +116,7 @@ public class HTTPInterface { if (response.code == 200) { JsonObject jsonObject = JsonParser.parseString(new Gson().toJson(response.data)).getAsJsonObject(); String batch = jsonObject.get("batch").getAsString(); - Log.e(TAG + ":" + "setJpushTags", "onNext: " + batch); + Log.e(TAG + ":" + "setPushTags", "onNext: " + batch); if (!TextUtils.isEmpty(batch)) { Set set = new HashSet(); set.add(batch); @@ -128,36 +130,48 @@ public class HTTPInterface { } } }); - setTag(context, set); + Set tagsSet = new HashSet<>(set); + XGPushManager.clearAndAppendTags(context, "clearAndAppendTags :" + System.currentTimeMillis(), tagsSet, new XGIOperateCallback() { + @Override + public void onSuccess(Object o, int i) { + Log.e("setPushTags", "onSuccess: " + o); + } + + @Override + public void onFail(Object o, int i, String s) { + Log.e("setPushTags", "onFail: " + o); + } + }); +// setTag(context, set); } else { - Log.e(TAG + ":" + "setJpushTags", "onNext: " + "batch empty"); + Log.e(TAG + ":" + "setPushTags", "onNext: " + "batch empty"); } } else { - Log.e(TAG + ":" + "setJpushTags", "onNext: " + response.toString()); + Log.e(TAG + ":" + "setPushTags", "onNext: " + response.toString()); } } @Override public void onError(@NonNull Throwable e) { - Log.e(TAG + ":" + "setJpushTags", "onError: " + e.getMessage()); + Log.e(TAG + ":" + "setPushTags", "onError: " + e.getMessage()); onComplete(); } @Override public void onComplete() { - Log.e(TAG + ":" + "setJpushTags", "onComplete: "); + Log.e(TAG + ":" + "setPushTags", "onComplete: "); } }); } - private static void setTag(Context context, Set set) { - TagAliasOperatorHelper.TagAliasBean tagAliasBean = new TagAliasOperatorHelper.TagAliasBean(); - tagAliasBean.action = ACTION_SET; - sequence++; - tagAliasBean.tags = set; - tagAliasBean.isAliasAction = false; - TagAliasOperatorHelper.getInstance().handleAction(context, sequence, tagAliasBean); - } +// private static void setTag(Context context, Set set) { +// TagAliasOperatorHelper.TagAliasBean tagAliasBean = new TagAliasOperatorHelper.TagAliasBean(); +// tagAliasBean.action = ACTION_SET; +// sequence++; +// tagAliasBean.tags = set; +// tagAliasBean.isAliasAction = false; +// TagAliasOperatorHelper.getInstance().handleAction(context, sequence, tagAliasBean); +// } public interface GetAppinsideWebCallback { void onComplete(); @@ -802,28 +816,28 @@ public class HTTPInterface { .subscribe(new Observer() { @Override public void onSubscribe(@NonNull Disposable d) { - Log.e("getAppAutoStartUpdateAndNet", "onSubscribe: "); + Log.e("getAutoUpdateAndNet", "onSubscribe: "); } @Override public void onNext(@NonNull NetAndLaunchBean netAndLaunchBean) { - Log.e("getAppAutoStartUpdateAndNet", "onNext: " + netAndLaunchBean.toString()); + Log.e("getAutoUpdateAndNet", "onNext: " + netAndLaunchBean.toString()); if (netAndLaunchBean.getCode() == 200) { JGYUtils.getInstance().setNetAndlaunch(netAndLaunchBean, appListInfos); } else { - Log.e("getAppAutoStartUpdateAndNet", "onNext: " + netAndLaunchBean.toString()); + Log.e("getAutoUpdateAndNet", "onNext: " + netAndLaunchBean.toString()); } } @Override public void onError(@NonNull Throwable e) { - Log.e("getAppAutoStartUpdateAndNet", "onError: " + e.getMessage()); + Log.e("getAutoUpdateAndNet", "onError: " + e.getMessage()); onComplete(); } @Override public void onComplete() { - Log.e("getAppAutoStartUpdateAndNet", "onComplete: "); + Log.e("getAutoUpdateAndNet", "onComplete: "); } }); } diff --git a/app/src/main/java/com/aoleyun/sn/network/NetInterfaceManager.java b/app/src/main/java/com/aoleyun/sn/network/NetInterfaceManager.java index 3f4261a..a906f5b 100644 --- a/app/src/main/java/com/aoleyun/sn/network/NetInterfaceManager.java +++ b/app/src/main/java/com/aoleyun/sn/network/NetInterfaceManager.java @@ -58,6 +58,7 @@ import com.aoleyun.sn.network.api.newapi.SnTimeControlApi; import com.aoleyun.sn.network.api.newapi.StudentsInfosApi; import com.aoleyun.sn.network.api.newapi.TopAppControlApi; import com.aoleyun.sn.network.api.newapi.UpdateDeviceInfoApi; +import com.aoleyun.sn.utils.JGYUtils; import com.aoleyun.sn.utils.MD5Util; import com.aoleyun.sn.utils.SPUtils; import com.aoleyun.sn.utils.Utils; @@ -70,7 +71,6 @@ import java.util.List; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.TimeUnit; -import cn.jpush.android.api.JPushInterface; import io.reactivex.Observable; import io.reactivex.android.schedulers.AndroidSchedulers; import io.reactivex.schedulers.Schedulers; @@ -265,7 +265,8 @@ public class NetInterfaceManager { return mRetrofit.create(MACAddressApi.class) .sendMACaddress(Utils.getSerial(), Utils.getAndroid10MAC(mContext), - JPushInterface.getRegistrationID(mContext), + "0000", +// JPushInterface.getRegistrationID(mContext), Utils.getCustomVersion(), BuildConfig.VERSION_NAME, Utils.getAPPVersionName(PackageNames.APPSTORE, mContext), @@ -277,7 +278,8 @@ public class NetInterfaceManager { Utils.getBluetoothList(), Utils.getWifiAlias(mContext), Utils.getAPPVersionName(PackageNames.BROWSER, mContext), - Utils.getAPPVersionName(PackageNames.NOTIFICATIONS, mContext) + Utils.getAPPVersionName(PackageNames.NOTIFICATIONS, mContext), + JGYUtils.getInstance().getAppPlatform() ) .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()); diff --git a/app/src/main/java/com/aoleyun/sn/network/api/newapi/MACAddressApi.java b/app/src/main/java/com/aoleyun/sn/network/api/newapi/MACAddressApi.java index 8953c51..3161d98 100644 --- a/app/src/main/java/com/aoleyun/sn/network/api/newapi/MACAddressApi.java +++ b/app/src/main/java/com/aoleyun/sn/network/api/newapi/MACAddressApi.java @@ -3,6 +3,8 @@ package com.aoleyun.sn.network.api.newapi; import com.aoleyun.sn.bean.BaseResponse; import com.aoleyun.sn.network.UrlAddress; +import java.io.File; + import io.reactivex.Observable; import retrofit2.http.Field; import retrofit2.http.FormUrlEncoded; @@ -26,6 +28,7 @@ public interface MACAddressApi { @Field("bluetooth") String bluetooth, @Field("wifi_name") String wifi_name, @Field("browser_version") String browser_version, - @Field("notice_version") String notice_version + @Field("notice_version") String notice_version, + @Field("platform") String platform ); } diff --git a/app/src/main/java/com/aoleyun/sn/service/MainService.java b/app/src/main/java/com/aoleyun/sn/service/MainService.java index 63aef82..f7bbb05 100644 --- a/app/src/main/java/com/aoleyun/sn/service/MainService.java +++ b/app/src/main/java/com/aoleyun/sn/service/MainService.java @@ -32,9 +32,9 @@ import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; import com.aoleyun.sn.R; import com.aoleyun.sn.action.JGYActions; -import com.aoleyun.sn.activity.MainActivity; -import com.aoleyun.sn.activity.MainContact; -import com.aoleyun.sn.activity.MainPresenter; +import com.aoleyun.sn.activity.main.MainActivity; +import com.aoleyun.sn.activity.main.MainContact; +import com.aoleyun.sn.activity.main.MainPresenter; import com.aoleyun.sn.bean.PoweroffBean; import com.aoleyun.sn.comm.PackageNames; import com.aoleyun.sn.receiver.BootReceiver; @@ -64,7 +64,6 @@ import java.util.HashSet; 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; @@ -210,7 +209,7 @@ public class MainService extends Service implements MainContact.MainView, Networ Intent bootIntent = new Intent(BootReceiver.BOOT_COMPLETED); bootIntent.setComponent(new ComponentName(PackageNames.APPSTORE, PackageNames.APP_STORE_BOOTRECEIVER)); sendBroadcast(bootIntent); - JPushInterface.init(this); +// JPushInterface.init(this); if (MainActivity.isForeground) { Log.e(TAG, "onStartCommand: MainService: isForeground: " + MainActivity.isForeground); } else { @@ -649,7 +648,7 @@ public class MainService extends Service implements MainContact.MainView, Networ //设置极光推送别名 mPresenter.setJpushAlias(); //设置极光推送标签 - mPresenter.setJpushTags(); + mPresenter.setPushTags(); if (loocked) { ToastUtil.betaShow("设备已上锁"); //上传APP信息 @@ -842,8 +841,6 @@ public class MainService extends Service implements MainContact.MainView, Networ @Override public void getDefaultDesktopFinish() { - netWorkIsRunning = false; - Log.e(TAG, "SettingFinished: " + (SystemClock.elapsedRealtime() - runningTime) + " ms"); mPresenter.getPoweroffTime(); } @@ -854,7 +851,9 @@ public class MainService extends Service implements MainContact.MainView, Networ @Override public void setWiFiPasswd() { - + MMKV.defaultMMKV().encode(MainPresenter.GET_SETTING_FINISH_TIME, System.currentTimeMillis()); + netWorkIsRunning = false; + Log.e(TAG, "SettingFinished: " + (SystemClock.elapsedRealtime() - runningTime) + " ms"); } @Override diff --git a/app/src/main/java/com/aoleyun/sn/tpush/Constants.java b/app/src/main/java/com/aoleyun/sn/tpush/Constants.java new file mode 100644 index 0000000..6e5d21b --- /dev/null +++ b/app/src/main/java/com/aoleyun/sn/tpush/Constants.java @@ -0,0 +1,17 @@ +package com.aoleyun.sn.tpush; + +/** + * Created by chacewang on 2019/7/5. + */ + +public class Constants { + public static final int TEST_LOCAL_NOTIFICATION = 1; + public static final int TEST_NOTIFICATION = 2; + public static final int TEST_SET_TAG = 3; + public static final int TEST_DEL_TAG = 4; + public static final int TEST_SET_ACCOUNT = 5; + public static final int TEST_DEL_ACCOUNT = 6; + + public static final String LOCAL_NOTIFICATION_TITLE = "localtest"; + public static final String TEST_TAG_NAME = "DiagnosisTag"; +} diff --git a/app/src/main/java/com/aoleyun/sn/receiver/MyJPushReceiver.java b/app/src/main/java/com/aoleyun/sn/tpush/MessageReceiver.java similarity index 71% rename from app/src/main/java/com/aoleyun/sn/receiver/MyJPushReceiver.java rename to app/src/main/java/com/aoleyun/sn/tpush/MessageReceiver.java index 4b303a5..051fa81 100644 --- a/app/src/main/java/com/aoleyun/sn/receiver/MyJPushReceiver.java +++ b/app/src/main/java/com/aoleyun/sn/tpush/MessageReceiver.java @@ -1,7 +1,7 @@ -package com.aoleyun.sn.receiver; +package com.aoleyun.sn.tpush; import android.annotation.SuppressLint; -import android.content.BroadcastReceiver; +import android.content.ContentResolver; import android.content.Context; import android.content.ContextWrapper; import android.content.Intent; @@ -17,49 +17,57 @@ import android.os.Handler; import android.provider.Settings; import android.text.TextUtils; import android.util.Log; +import android.widget.Toast; 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.aoleyun.sn.R; import com.aoleyun.sn.action.JGYActions; +import com.aoleyun.sn.base.BaseApplication; import com.aoleyun.sn.bean.BaseResponse; import com.aoleyun.sn.bean.RemoteDebug; -import com.aoleyun.sn.bean.TTAppground; -import com.arialyy.aria.core.Aria; -import com.blankj.utilcode.util.PathUtils; -import com.aoleyun.sn.R; -import com.aoleyun.sn.utils.CacheUtils; -import com.aoleyun.sn.utils.JGYUtils; -import com.aoleyun.sn.base.BaseApplication; import com.aoleyun.sn.comm.CommonDatas; import com.aoleyun.sn.manager.AmapManager; -import com.aoleyun.sn.network.NetInterfaceManager; import com.aoleyun.sn.network.HTTPInterface; +import com.aoleyun.sn.network.NetInterfaceManager; import com.aoleyun.sn.service.MainService; +import com.aoleyun.sn.tpush.common.NotificationService; +import com.aoleyun.sn.tpush.po.XGNotification; import com.aoleyun.sn.utils.ApkUtils; +import com.aoleyun.sn.utils.CacheUtils; import com.aoleyun.sn.utils.CmdUtil; import com.aoleyun.sn.utils.ForegroundAppUtil; +import com.aoleyun.sn.utils.JGYUtils; import com.aoleyun.sn.utils.MySQLData; import com.aoleyun.sn.utils.SPUtils; import com.aoleyun.sn.utils.SaveListUtils; import com.aoleyun.sn.utils.ServiceAliveUtils; import com.aoleyun.sn.utils.ToastUtil; import com.aoleyun.sn.utils.Utils; +import com.arialyy.aria.core.Aria; import com.google.gson.Gson; +import com.google.gson.JsonObject; +import com.google.gson.JsonParser; import com.google.gson.reflect.TypeToken; +import com.tencent.android.tpush.NotificationAction; +import com.tencent.android.tpush.XGPushBaseReceiver; +import com.tencent.android.tpush.XGPushClickedResult; +import com.tencent.android.tpush.XGPushRegisterResult; +import com.tencent.android.tpush.XGPushShowedResult; +import com.tencent.android.tpush.XGPushTextMessage; import java.io.File; import java.lang.reflect.Type; -import java.util.ArrayList; +import java.text.SimpleDateFormat; import java.util.Arrays; +import java.util.Calendar; import java.util.HashMap; import java.util.HashSet; -import java.util.List; import java.util.Map; -import cn.jpush.android.api.JPushInterface; import io.reactivex.Observable; import io.reactivex.ObservableEmitter; import io.reactivex.ObservableOnSubscribe; @@ -72,8 +80,12 @@ import okhttp3.MultipartBody; import okhttp3.RequestBody; import okhttp3.ResponseBody; -public class MyJPushReceiver extends BroadcastReceiver { - private static final String TAG = MyJPushReceiver.class.getSimpleName(); +public class MessageReceiver extends XGPushBaseReceiver { + public static final String UPDATE_LISTVIEW_ACTION = "com.qq.xgdemo.activity.UPDATE_LISTVIEW"; + public static final String TEST_ACTION = "com.qq.xgdemo.activity.TEST_ACTION"; + public static final String LogTag = "xg.test"; + + private static final String TAG = MessageReceiver.class.getSimpleName(); //删除应用 private final String MSG_DELETE = "1"; @@ -156,57 +168,281 @@ public class MyJPushReceiver extends BroadcastReceiver { //自定义指令 private final String CUSTOM_ORDER = "44"; - private Context mContext; + private ContentResolver mResolver; + private PackageManager mPackageManager; + + /** + * 消息透传处理 + * + * @param context + * @param message 解析自定义的 JSON + */ + @Override + public void onTextMessage(Context context, XGPushTextMessage message) { + this.mContext = context; + this.mResolver = context.getContentResolver(); + this.mPackageManager = context.getPackageManager(); + String text = "收到消息:" + message.toString(); + // 获取自定义key-value + String customContent = message.getCustomContent(); + if (customContent != null && customContent.length() != 0) { + JsonObject obj = JsonParser.parseString(customContent).getAsJsonObject(); + // key1为前台配置的key + if (!TextUtils.isEmpty(obj.get("key").getAsString())) { + String value = obj.get("key").getAsString(); + Log.d(LogTag, "get custom value:" + value); + } + // ... + } + // APP自主处理消息的过程... + Log.e(LogTag, text); + show(context, text); + processCustomMessage(context, message); + } + + /** + * 通知展示 + * + * @param context + * @param notifiShowedRlt 包含通知的内容 + */ + @Override + public void onNotificationShowedResult(Context context, XGPushShowedResult notifiShowedRlt) { + if (context == null || notifiShowedRlt == null) { + return; + } + XGNotification notific = new XGNotification(); + notific.setMsg_id(notifiShowedRlt.getMsgId()); + notific.setTitle(notifiShowedRlt.getTitle()); + notific.setContent(notifiShowedRlt.getContent()); + // notificationActionType==1为Activity,2为url,3为intent + notific.setNotificationActionType(notifiShowedRlt + .getNotificationActionType()); + // Activity,url,intent都可以通过getActivity()获得 + notific.setActivity(notifiShowedRlt.getActivity()); + notific.setUpdate_time(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss") + .format(Calendar.getInstance().getTime())); + NotificationService.getInstance(context).save(notific); + + Intent testIntent = new Intent(TEST_ACTION); + if (notifiShowedRlt.getTitle().equals(Constants.LOCAL_NOTIFICATION_TITLE)) { + testIntent.putExtra("step", Constants.TEST_LOCAL_NOTIFICATION); + } else { + testIntent.putExtra("step", Constants.TEST_NOTIFICATION); + } + context.sendBroadcast(testIntent); + + Intent viewIntent = new Intent(UPDATE_LISTVIEW_ACTION); + context.sendBroadcast(viewIntent); + show(context, "您有1条新消息, " + "通知被展示 , " + notifiShowedRlt.toString()); + Log.d(LogTag, "您有1条新消息, " + "通知被展示 , " + notifiShowedRlt.toString() + ", PushChannel:" + notifiShowedRlt.getPushChannel()); + } + + /** + * 注册回调 + * + * @param context + * @param errorCode 0 为成功,其它为错误码 + */ + @Override + public void onRegisterResult(Context context, int errorCode, XGPushRegisterResult message) { + if (context == null || message == null) { + return; + } + String text = ""; + if (errorCode == XGPushBaseReceiver.SUCCESS) { + // 在这里拿token + String token = message.getToken(); + text = "注册成功1. token:" + token; + } else { + text = message + "注册失败,错误码:" + errorCode; + } + Log.d(LogTag, text); + show(context, text); + } + + /** + * 反注册回调 + * + * @param context + * @param errorCode 0 为成功,其它为错误码 + */ + @Override + public void onUnregisterResult(Context context, int errorCode) { + if (context == null) { + return; + } + String text = ""; + if (errorCode == XGPushBaseReceiver.SUCCESS) { + text = "反注册成功"; + } else { + text = "反注册失败" + errorCode; + } + Log.d(LogTag, text); + show(context, text); + + } + + /** + * 设置标签回调 + * + * @param context + * @param errorCode 0 为成功,其它为错误码 + * @param tagName 设置的 TAG + */ + @Override + public void onSetTagResult(Context context, int errorCode, String tagName) { + if (context == null) { + return; + } + String text = ""; + if (errorCode == XGPushBaseReceiver.SUCCESS) { + text = "\"" + tagName + "\"设置成功"; + } else { + text = "\"" + tagName + "\"设置失败,错误码:" + errorCode; + } + Log.d(LogTag, text); + show(context, text); + + Intent testIntent = new Intent(TEST_ACTION); + testIntent.putExtra("step", Constants.TEST_SET_TAG); + context.sendBroadcast(testIntent); + } + + /** + * 删除标签的回调 + * + * @param context + * @param errorCode 0 为成功,其它为错误码 + * @param tagName 设置的 TAG + */ + @Override + public void onDeleteTagResult(Context context, int errorCode, String tagName) { + if (context == null) { + return; + } + String text = ""; + if (errorCode == XGPushBaseReceiver.SUCCESS) { + text = "\"" + tagName + "\"删除成功"; + } else { + text = "\"" + tagName + "\"删除失败,错误码:" + errorCode; + } + Log.d(LogTag, text); + show(context, text); + + Intent testIntent = new Intent(TEST_ACTION); + testIntent.putExtra("step", Constants.TEST_DEL_TAG); + context.sendBroadcast(testIntent); + } + + /** + * 设置账号回调 + * + * @param context + * @param errorCode 0 为成功,其它为错误码 + * @param account 设置的账号 + */ + @Override + public void onSetAccountResult(Context context, int errorCode, String account) { + Intent testIntent = new Intent(TEST_ACTION); + testIntent.putExtra("step", Constants.TEST_SET_ACCOUNT); + context.sendBroadcast(testIntent); + } + + + /** + * 删除账号回调 + * + * @param context + * @param errorCode 0 为成功,其它为错误码 + * @param account 设置的账号 + */ + @Override + public void onDeleteAccountResult(Context context, int errorCode, String account) { + Intent testIntent = new Intent(TEST_ACTION); + testIntent.putExtra("step", Constants.TEST_DEL_ACCOUNT); + context.sendBroadcast(testIntent); + } + + @Override + public void onSetAttributeResult(Context context, int i, String s) { + + } + + @Override + public void onDeleteAttributeResult(Context context, int i, String s) { + + } + + @Override + public void onQueryTagsResult(Context context, int errorCode, String data, String operateName) { + Log.i(LogTag, "action - onQueryTagsResult, errorCode:" + errorCode + ", operateName:" + operateName + ", data: " + data); + } + + /** + * 通知点击回调 actionType=1为该消息被清除,actionType=0为该消息被点击 + * + * @param context + * @param message 包含被点击通知的内容 + */ + @Override + public void onNotificationClickedResult(Context context, XGPushClickedResult message) { + if (context == null || message == null) { + return; + } + String text = ""; + if (message.getActionType() == NotificationAction.clicked.getType()) { + // 通知在通知栏被点击啦。。。。。 + // APP自己处理点击的相关动作 + // 这个动作可以在activity的onResume也能监听,请看第3点相关内容 + text = "通知被打开 :" + message; + } else if (message.getActionType() == NotificationAction.delete.getType()) { + // 通知被清除啦。。。。 + // APP自己处理通知被清除后的相关动作 + text = "通知被清除 :" + message; + } + Toast.makeText(context, "广播接收到通知被点击:" + message.toString(), + Toast.LENGTH_SHORT).show(); + // 获取自定义key-value + String customContent = message.getCustomContent(); + if (customContent != null && customContent.length() != 0) { + JsonObject obj = JsonParser.parseString(customContent).getAsJsonObject(); + // key1为前台配置的key + if (!TextUtils.isEmpty(obj.get("key").getAsString())) { + String value = obj.get("key").getAsString(); + Log.d(LogTag, "get custom value:" + value); + } + // ... + } + // APP自主处理的过程。。。 + Log.d(LogTag, text); + show(context, text); + } + + private void show(Context context, String text) { + Toast.makeText(context, text, Toast.LENGTH_SHORT).show(); + } private int changeNum(int paramInt) { return paramInt == 0 ? 1 : 0; } - @Override - public void onReceive(Context context, Intent intent) { - mContext = context; - Bundle bundle = intent.getExtras(); - - if (JPushInterface.ACTION_REGISTRATION_ID.equals(intent.getAction())) { - String regId = bundle.getString(JPushInterface.EXTRA_REGISTRATION_ID); - Log.e(TAG, "[MyReceiver] 接收Registration Id : " + regId); - //send the Registration Id to your server... - } else if (JPushInterface.ACTION_MESSAGE_RECEIVED.equals(intent.getAction())) { - // ToastTool.show("[MyReceiver] 接收到推送下来的自定义消息: " + bundle.getString(JPushInterface.EXTRA_MESSAGE) - // + "---" + bundle.getString(JPushInterface.EXTRA_TITLE) + "---" + bundle.getString(JPushInterface.EXTRA_CONTENT_TYPE) - // + "---" + bundle.getString(JPushInterface.EXTRA_EXTRA) + "----" + bundle.getString("package_name")); - // Log.e(TAG, "[MyReceiver] 接收到推送下来的自定义消息: " + bundle.getString(JPushInterface.EXTRA_MESSAGE) - // + "---" + bundle.getString(JPushInterface.EXTRA_TITLE) + "---" + bundle.getString(JPushInterface.EXTRA_CONTENT_TYPE) - // + "---" + bundle.getString(JPushInterface.EXTRA_EXTRA) + "----" + bundle.getString("package_name")); - processCustomMessage(context, bundle);//屏蔽推送 - } else if (JPushInterface.ACTION_NOTIFICATION_RECEIVED.equals(intent.getAction())) { - Log.e(TAG, "[MyReceiver] 接收到推送下来的通知" + bundle.getString(JPushInterface.EXTRA_EXTRA)); - // doDownloadAndInstall(bundle.getString(JPushInterface.EXTRA_EXTRA)); - // Log.e(getBatteryLevel()+"-0-iweroiwerewefeerer-----------"); - int notifactionId = bundle.getInt(JPushInterface.EXTRA_NOTIFICATION_ID); - Log.e(TAG, "[MyReceiver] 接收到推送下来的通知的ID: " + notifactionId); - } else if (JPushInterface.ACTION_NOTIFICATION_OPENED.equals(intent.getAction())) { - Log.e(TAG, "[MyReceiver] 用户点击打开了通知"); - } else if (JPushInterface.ACTION_RICHPUSH_CALLBACK.equals(intent.getAction())) { - Log.e(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); - Log.i(TAG, "[MyReceiver]" + intent.getAction() + " connected state change to " + connected); - } else { - Log.e(TAG, "[MyReceiver] Unhandled intent - " + intent.getAction()); + private void processCustomMessage(Context context, XGPushTextMessage message) { + if (context == null || message == null) { + return; } - } - private void processCustomMessage(final 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); - String package_name = bundle.getString("package_name"); - Log.e(TAG, "message::" + message + "--type::" + type + "--title::" + title + "--extras::" + extras); - switch (message) { + String title = message.getTitle(); + String content = message.getContent(); + JsonObject extrasJson = JsonParser.parseString(content).getAsJsonObject(); + + String extras = ""; + if (extrasJson.get("extras") != null) { + extras = extrasJson.get("extras").toString(); + } + + switch (title) { default: break; case MSG_DELETE: @@ -218,7 +454,7 @@ public class MyJPushReceiver extends BroadcastReceiver { SaveListUtils.sendForceAPP(mContext); ApkUtils.UninstallAPP(mContext, title); } - HTTPInterface.getAppLimit(context); + HTTPInterface.getAppLimit(mContext); HTTPInterface.getNetAndLaunchSetting(mContext); break; case MSG_SETTING: @@ -249,7 +485,7 @@ public class MyJPushReceiver extends BroadcastReceiver { break; case MSG_INSTALL: ToastUtil.betaShow("收到管控:应用安装"); - HTTPInterface.getAppLimit(context); + HTTPInterface.getAppLimit(mContext); doDownloadAndInstall(extras); HTTPInterface.setHideDesktopIcon(mContext); break; @@ -269,9 +505,9 @@ public class MyJPushReceiver extends BroadcastReceiver { break; case GET_APP_USEDTIME: ToastUtil.betaShow("收到管控:获取应用使用时间"); - JSONObject jsonObject = JSON.parseObject(extras); - String random = jsonObject.getString("random"); - String sendType = jsonObject.getString("type"); + JSONObject usedTimeJson = JSON.parseObject(extras); + String random = usedTimeJson.getString("random"); + String sendType = usedTimeJson.getString("type"); BaseApplication.sendAppUsedTime(random, sendType); break; case GET_FORCEDOWNLOADURL: @@ -306,7 +542,7 @@ public class MyJPushReceiver extends BroadcastReceiver { e.printStackTrace(); Log.e(TAG, "setHomepagtag: " + e.getMessage()); } - setHomepagtag(extras); + setHomepagtag(); ToastUtil.betaShow("收到管控:浏览器主页书签设置"); } }, 2000); @@ -325,7 +561,7 @@ public class MyJPushReceiver extends BroadcastReceiver { Handler.getMain().postDelayed(() -> { //后台发送时数据库未改变,有时候可能获取到的数据时上一次的 Log.e(TAG, "run: HIDE_DESKTOP_ICON "); - HTTPInterface.setHideDesktopIcon(context); + HTTPInterface.setHideDesktopIcon(mContext); }, 2000); break; case DISABLE_APP_SLIDE: @@ -334,7 +570,7 @@ public class MyJPushReceiver extends BroadcastReceiver { break; case UPDATE_INFO: ToastUtil.betaShow("收到管控:更新白名单"); - HTTPInterface.getAppLimit(context); + HTTPInterface.getAppLimit(mContext); break; case SN_SCREENSHOT: ToastUtil.betaShow("收到管控:设备截图"); @@ -384,42 +620,42 @@ public class MyJPushReceiver extends BroadcastReceiver { ToastUtil.betaShow("收到管控:屏幕锁定"); JSONObject lockJSONObject = JSON.parseObject(extras); String name = lockJSONObject.getString("name"); - setLock_screen(1, context, name); + setLock_screen(1, name); break; case UNLOCK_SCREEN: ToastUtil.betaShow("收到管控:屏幕解锁"); - setLock_screen(0, context, ""); + setLock_screen(0, ""); break; case KILL_SERVER: ToastUtil.betaShow("收到管控:停止应用"); JSONObject killJSONObject = JSON.parseObject(extras); String packages = killJSONObject.getString("package_name"); - JGYUtils.getInstance().killBackgroundProcesses(context, packages); + JGYUtils.getInstance().killBackgroundProcesses(mContext, packages); break; case TIME_CONTROL: ToastUtil.betaShow("收到管控:使用时间管控"); - getTimeControl(context, extras); + getTimeControl(extras); break; case TOP_APP: ToastUtil.betaShow("收到管控:应用霸屏"); - getTopApp(context, extras); + getTopApp(extras); break; case LOGO_IMG: ToastUtil.betaShow("收到管控:开机动画设置"); - setBootanimation(context, extras); + setBootanimation(extras); Log.e(TAG, "processCustomMessage: " + extras); break; case DEFAULTP_APP: ToastUtil.betaShow("收到管控:"); - setDefalutApp(context, extras); + setDefalutApp(extras); break; case PLAY_SOUND: ToastUtil.betaShow("收到管控:查找设备"); - playSound(context, extras); + playSound(extras); break; case CLEAN_APP_CACHE: ToastUtil.betaShow("收到管控:应用缓存清除"); - cleanCache(context, extras); + cleanCache(extras); break; case DEVELOPER_OPTIONS: ToastUtil.betaShow("收到管控:开发人员选项管控"); @@ -432,7 +668,7 @@ public class MyJPushReceiver extends BroadcastReceiver { case EBAG_CODE: ToastUtil.betaShow("收到管控:电子书包激活码"); setEbagCode(extras); - JGYUtils.getInstance().killBackgroundProcesses(context, "com.jxw.launcher"); + JGYUtils.getInstance().killBackgroundProcesses(mContext, "com.jxw.launcher"); break; case UPDATE_WHITELIST: ToastUtil.betaShow("收到管控:更新白名单"); @@ -455,24 +691,23 @@ public class MyJPushReceiver extends BroadcastReceiver { } break; case UPDATE_WIFI_PW: - HTTPInterface.getWiFiPasswd(context); + HTTPInterface.getWiFiPasswd(mContext); break; case DEVICES_POWEROFF: HTTPInterface.getPoweroffTime(); break; case SN_RUN_LOG: - recordLog(context, extras); + recordLog(extras); break; case CUSTOM_ORDER: - customOrder(context, extras); + customOrder(extras); break; } - } - private void setLock_screen(int state, Context context, String name) { - if (ServiceAliveUtils.isServiceAlive(context)) { - context.startService(new Intent(context, MainService.class)); + private void setLock_screen(int state, String name) { + if (ServiceAliveUtils.isServiceAlive(mContext)) { + mContext.startService(new Intent(mContext, MainService.class)); } Intent intent = new Intent(); intent.putExtra("name", name); @@ -481,7 +716,7 @@ public class MyJPushReceiver extends BroadcastReceiver { } else if (state == 0) { intent.setAction(MainService.LockScreenReceiver.action_unlock); } - context.sendBroadcast(intent); + mContext.sendBroadcast(intent); } private void doDownloadAndInstall(String jsonString) { @@ -509,10 +744,9 @@ public class MyJPushReceiver extends BroadcastReceiver { Log.e(TAG, "doDownloadAndInstall: app_url:" + app_url); SaveListUtils.addList(app_package); SaveListUtils.sendForceAPP(mContext); - PackageManager pm = mContext.getPackageManager(); PackageInfo packageInfo = null; try { - packageInfo = pm.getPackageInfo(app_package, 0); + packageInfo = mPackageManager.getPackageInfo(app_package, 0); } catch (PackageManager.NameNotFoundException e) { e.printStackTrace(); } @@ -541,9 +775,9 @@ public class MyJPushReceiver extends BroadcastReceiver { private int getBatteryLevel() { if (Build.VERSION.SDK_INT >= 21) { - return ((BatteryManager) this.mContext.getSystemService(Context.BATTERY_SERVICE)).getIntProperty(4); + return ((BatteryManager) mContext.getSystemService(Context.BATTERY_SERVICE)).getIntProperty(4); } - Intent intent = (new ContextWrapper(this.mContext)).registerReceiver(null, new IntentFilter("android.intent.action.BATTERY_CHANGED")); + Intent intent = (new ContextWrapper(mContext)).registerReceiver(null, new IntentFilter("android.intent.action.BATTERY_CHANGED")); return intent.getIntExtra("level", -1) * 100 / intent.getIntExtra("scale", -1); } @@ -596,26 +830,26 @@ public class MyJPushReceiver extends BroadcastReceiver { } - private void setDisableSlideList(String s) { - JSONObject jSONObject = JSON.parseObject(s); + private void setDisableSlideList(String jsonString) { + JSONObject jSONObject = JSON.parseObject(jsonString); Log.e("setDisableSlideList", "jSONObject::" + jSONObject.toString()); String strban = jSONObject.getString("ban"); String strnot = jSONObject.getString("not"); - String qch_disable_slide = Settings.System.getString(mContext.getApplicationContext().getContentResolver(), "qch_disable_slide"); + String qch_disable_slide = Settings.System.getString(mResolver, "qch_disable_slide"); Log.e("fht", "qch_disable_slide::" + qch_disable_slide); if (!TextUtils.isEmpty(strban)) { - Settings.System.putString(mContext.getContentResolver(), "qch_disable_slide", strban); + Settings.System.putString(mResolver, "qch_disable_slide", strban); Log.e("fht", "sendban::" + strban); } else { - Settings.System.putString(mContext.getContentResolver(), "qch_disable_slide", "Invalid"); + Settings.System.putString(mResolver, "qch_disable_slide", "Invalid"); } - Log.e("fht", "qch_disable_slide::" + Settings.System.getString(mContext.getApplicationContext().getContentResolver(), "qch_disable_slide")); + Log.e("fht", "qch_disable_slide::" + Settings.System.getString(mResolver, "qch_disable_slide")); } - private void setDisableUpdateList(String s) { - Log.e("setDisableUpdateList", s); - JSONObject jsonObject = JSON.parseObject(s); + private void setDisableUpdateList(String jsonString) { + Log.e("setDisableUpdateList", jsonString); + JSONObject jsonObject = JSON.parseObject(jsonString); String ban = jsonObject.getString("ban"); String not = jsonObject.getString("not"); String[] banList = ban.split(","); @@ -628,7 +862,7 @@ public class MyJPushReceiver extends BroadcastReceiver { if (TextUtils.isEmpty(s)) { Intent intent = new Intent("qch_camera_forbid").setPackage("com.android.settings"); intent.putExtra("camera_package_name", "close"); - this.mContext.sendBroadcast(intent); + mContext.sendBroadcast(intent); Log.e(TAG, "settingNetControl extras is null"); return; } @@ -640,11 +874,11 @@ public class MyJPushReceiver extends BroadcastReceiver { if ("0".equals(s1)) { Intent intent2 = new Intent("qch_camera_forbid").setPackage("com.android.settings"); // intent2.putExtra("camera_package_name", s1); - this.mContext.sendBroadcast(intent2); + mContext.sendBroadcast(intent2); } else { Intent intent1 = new Intent("qch_camera_open").setPackage("com.android.settings"); // intent1.putExtra("camera_package_name", str); - this.mContext.sendBroadcast(intent1); + mContext.sendBroadcast(intent1); } } @@ -683,20 +917,20 @@ public class MyJPushReceiver extends BroadcastReceiver { Log.e(TAG, "settingPowerOn: qch_app_power_on = " + not); if (TextUtils.isEmpty(not)) { //当 qch_app_power_on 的值为空时,会造成系统所有应用断网 - Settings.System.putString(mContext.getContentResolver(), "qch_app_power_on", "Invalid"); + Settings.System.putString(mResolver, "qch_app_power_on", "Invalid"); } else { - Settings.System.putString(mContext.getContentResolver(), "qch_app_power_on", not); + Settings.System.putString(mResolver, "qch_app_power_on", not); } } private void writeDeselectBrowserIDtoSystem(String s) { - boolean bool = Settings.System.putString(this.mContext.getContentResolver(), "DeselectBrowserArray", s); + boolean bool = Settings.System.putString(mResolver, "DeselectBrowserArray", s); Log.e("SystemSetting", "DeselectBrowserArray---------" + s); Log.e("SystemSetting", "DeselectBrowserArray---------" + bool); } - private void setHomepagtag(String s) { + private void setHomepagtag() { HTTPInterface.getHomePageBookmarks(mContext, null); } @@ -723,7 +957,7 @@ public class MyJPushReceiver extends BroadcastReceiver { JSONObject jSONObject = JSON.parseObject(s); int i = changeNum(jSONObject.getIntValue("lock")); - Settings.System.putInt(this.mContext.getContentResolver(), JGYActions.ACTION_QCH_UNLOCK_IPAD, i); + Settings.System.putInt(mResolver, JGYActions.ACTION_QCH_UNLOCK_IPAD, i); Log.e("SystemSetting", "qch_unlock_ipad---------" + i); if (getBatteryLevel() >= CommonDatas.MIN_POWER) { @@ -826,24 +1060,24 @@ public class MyJPushReceiver extends BroadcastReceiver { }); } - private void getTimeControl(Context context, String extras) { - HTTPInterface.getSnTimeControl(context); + private void getTimeControl(String extras) { + HTTPInterface.getSnTimeControl(mContext); } - private void getTopApp(Context context, String extras) { + private void getTopApp(String extras) { JSONObject jsonObject = JSON.parseObject(extras); String packageName = jsonObject.getString("app_package"); if (TextUtils.isEmpty(packageName)) { - SPUtils.put(context, ForegroundAppUtil.TOPAPP_KEY, ""); - ForegroundAppUtil.setTopAppClass(context, ""); + SPUtils.put(mContext, ForegroundAppUtil.TOPAPP_KEY, ""); + ForegroundAppUtil.setTopAppClass(mContext, ""); } else { - SPUtils.put(context, ForegroundAppUtil.TOPAPP_KEY, packageName); - ForegroundAppUtil.setTopAppClass(context, packageName); - ForegroundAppUtil.openTopApp(context); + SPUtils.put(mContext, ForegroundAppUtil.TOPAPP_KEY, packageName); + ForegroundAppUtil.setTopAppClass(mContext, packageName); + ForegroundAppUtil.openTopApp(mContext); } } - private void setBootanimation(Context context, String extras) { + private void setBootanimation(String extras) { JSONObject jsonObject = JSONObject.parseObject(extras); int type = jsonObject.getInteger("type"); if (type == 1) { @@ -855,7 +1089,7 @@ public class MyJPushReceiver extends BroadcastReceiver { } } - private void setDefalutApp(Context context, String extras) { + private void setDefalutApp(String extras) { if (TextUtils.isEmpty(extras)) { JGYUtils.getInstance().setDefaultDesktop(""); } else { @@ -863,18 +1097,18 @@ public class MyJPushReceiver extends BroadcastReceiver { String default_launcher = jsonObject.getString("default_launcher"); if (TextUtils.isEmpty(default_launcher)) { JGYUtils.getInstance().setDefaultDesktop(""); - SPUtils.put(context, "default_launcher", ""); + SPUtils.put(mContext, "default_launcher", ""); } else { JGYUtils.getInstance().setDefaultDesktop(default_launcher); - SPUtils.put(context, "default_launcher", default_launcher); + SPUtils.put(mContext, "default_launcher", default_launcher); } } } - private void playSound(Context context, String extras) { + private void playSound(String extras) { JSONObject jsonObject = JSONObject.parseObject(extras); - defaultCallMediaPlayer(context); + defaultCallMediaPlayer(mContext); } /** @@ -885,12 +1119,12 @@ public class MyJPushReceiver extends BroadcastReceiver { */ MediaPlayer mediaPlayer; - public void defaultCallMediaPlayer(Context context) { + public void defaultCallMediaPlayer(Context mContext) { if (mediaPlayer != null) { mediaPlayer.stop(); mediaPlayer.release(); } - mediaPlayer = MediaPlayer.create(context, R.raw.test); + mediaPlayer = MediaPlayer.create(mContext, R.raw.test); try { // mediaPlayer.prepare(); mediaPlayer.setLooping(false); @@ -908,7 +1142,7 @@ public class MyJPushReceiver extends BroadcastReceiver { @Override public void onCompletion(MediaPlayer mediaPlayer) { if (soundCount[0] <= finalLoop) { - setMaxVolume(context); + setMaxVolume(mContext); mediaPlayer.start(); soundCount[0] += 1; Log.e(TAG, "onCompletion: " + "loop: " + finalLoop); @@ -922,7 +1156,7 @@ public class MyJPushReceiver extends BroadcastReceiver { } }); mediaPlayer.setLooping(false); - setMaxVolume(context); + setMaxVolume(mContext); mediaPlayer.start(); } catch (Exception e) { e.printStackTrace(); @@ -931,8 +1165,8 @@ public class MyJPushReceiver extends BroadcastReceiver { } - private void setMaxVolume(Context context) { - AudioManager audioManager = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE); + private void setMaxVolume(Context mContext) { + AudioManager audioManager = (AudioManager) mContext.getSystemService(Context.AUDIO_SERVICE); int ringMax = audioManager.getStreamMaxVolume(AudioManager.STREAM_RING); int musicMax = audioManager.getStreamMaxVolume(AudioManager.STREAM_MUSIC); int voiceMax = audioManager.getStreamMaxVolume(AudioManager.STREAM_VOICE_CALL); @@ -944,14 +1178,14 @@ public class MyJPushReceiver extends BroadcastReceiver { } - private void cleanCache(Context context, String extras) { + private void cleanCache(String extras) { JSONObject jsonObject = JSONObject.parseObject(extras); String packageName = jsonObject.getString("app_package"); if (TextUtils.isEmpty(packageName)) { Log.e(TAG, "cleanCache: " + "package is empty"); } else { try { - if (new CacheUtils().cleanApplicationUserData(context, packageName)) { + if (new CacheUtils().cleanApplicationUserData(mContext, packageName)) { Log.e(TAG, "cleanCache: " + packageName + " success"); } else { Log.e(TAG, "cleanCache: " + packageName + " failed"); @@ -987,10 +1221,9 @@ public class MyJPushReceiver extends BroadcastReceiver { @SuppressLint("NewApi") private void checkAPPInstall(JSONObject jsonObject) { long version_code = jsonObject.getLong("app_version_code"); - PackageManager pm = mContext.getPackageManager(); PackageInfo packageInfo = null; try { - packageInfo = pm.getPackageInfo(jsonObject.getString("app_package"), 0); + packageInfo = mPackageManager.getPackageInfo(jsonObject.getString("app_package"), 0); } catch (PackageManager.NameNotFoundException e) { e.printStackTrace(); } @@ -1011,15 +1244,15 @@ public class MyJPushReceiver extends BroadcastReceiver { } } - private void recordLog(Context context, String jsonString) { - HTTPInterface.getRunLog(context); + private void recordLog(String jsonString) { + HTTPInterface.getRunLog(mContext); } private static final int ACTION_PULL = 1; private static final int ACTION_DELETE = 2; private static final int ACTION_UPGRADE = 3; - private void customOrder(Context context, String jsonString) { + private void customOrder(String jsonString) { Gson gson = new Gson(); Type type = new TypeToken() { }.getType(); @@ -1030,19 +1263,20 @@ public class MyJPushReceiver extends BroadcastReceiver { switch (remoteDebug.getType()) { case ACTION_PULL: Log.e(TAG, "customOrder: 唤起"); - ApkUtils.openPackage(context, pkg); + ApkUtils.openPackage(mContext, pkg); break; case ACTION_DELETE: Log.e(TAG, "customOrder: 删除"); - ApkUtils.UninstallAPP(context, pkg); + ApkUtils.UninstallAPP(mContext, pkg); break; case ACTION_UPGRADE: Log.e(TAG, "customOrder: 更新"); - HTTPInterface.getForceDownload(context); + HTTPInterface.getForceDownload(mContext); break; default: break; } } } + } diff --git a/app/src/main/java/com/aoleyun/sn/tpush/common/DBOpenHelper.java b/app/src/main/java/com/aoleyun/sn/tpush/common/DBOpenHelper.java new file mode 100644 index 0000000..a72a305 --- /dev/null +++ b/app/src/main/java/com/aoleyun/sn/tpush/common/DBOpenHelper.java @@ -0,0 +1,23 @@ +package com.aoleyun.sn.tpush.common; + +import android.content.Context; +import android.database.sqlite.SQLiteDatabase; +import android.database.sqlite.SQLiteOpenHelper; + +public class DBOpenHelper extends SQLiteOpenHelper { + + public DBOpenHelper(Context context) { + super(context, "XGExample.db", null, 1); + } + + @Override + public void onCreate(SQLiteDatabase db) { + db.execSQL("CREATE TABLE notification (id integer primary key autoincrement,msg_id varchar(64),title varchar(128),activity varchar(256),notificationActionType varchar(512),content text,update_time varchar(16))"); + } + + @Override + public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { + + } + +} diff --git a/app/src/main/java/com/aoleyun/sn/tpush/common/NotificationService.java b/app/src/main/java/com/aoleyun/sn/tpush/common/NotificationService.java new file mode 100644 index 0000000..484d97f --- /dev/null +++ b/app/src/main/java/com/aoleyun/sn/tpush/common/NotificationService.java @@ -0,0 +1,134 @@ +package com.aoleyun.sn.tpush.common; + +import android.content.ContentValues; +import android.content.Context; +import android.database.Cursor; +import android.database.sqlite.SQLiteDatabase; + +import com.aoleyun.sn.tpush.po.XGNotification; + +import java.util.ArrayList; +import java.util.List; + +public class NotificationService { + private DBOpenHelper dbOpenHelper; + private static NotificationService instance = null; + + public NotificationService(Context context) { + this.dbOpenHelper = new DBOpenHelper(context); + } + + public synchronized static NotificationService getInstance(Context ctx) { + if (null == instance) { + instance = new NotificationService(ctx); + } + return instance; + } + + public void save(XGNotification notification) { + SQLiteDatabase db = dbOpenHelper.getWritableDatabase(); + ContentValues values = new ContentValues(); + values.put("msg_id", notification.getMsg_id()); + values.put("title", notification.getTitle()); + values.put("content", notification.getContent()); + values.put("activity", notification.getActivity()); + values.put("notificationActionType", notification.getNotificationActionType()); + values.put("update_time", notification.getUpdate_time()); + db.insert("notification", null, values); + } + + public void delete(Integer id) { + SQLiteDatabase db = dbOpenHelper.getWritableDatabase(); + db.delete("notification", "id=?", new String[] { id.toString() }); + } + + public void deleteAll() { + SQLiteDatabase db = dbOpenHelper.getWritableDatabase(); + db.delete("notification", "", null); + } + + public void update(XGNotification notification) { + SQLiteDatabase db = dbOpenHelper.getWritableDatabase(); + ContentValues values = new ContentValues(); + values.put("msg_id", notification.getMsg_id()); + values.put("title", notification.getTitle()); + values.put("content", notification.getContent()); + values.put("activity", notification.getActivity()); + values.put("notificationActionType", notification.getNotificationActionType()); + values.put("update_time", notification.getUpdate_time()); + db.update("notification", values, "id=?", new String[] { notification + .getId().toString() }); + } + + public XGNotification find(Integer id) { + SQLiteDatabase db = dbOpenHelper.getReadableDatabase(); + Cursor cursor = db + .query("notification", + new String[] { "id,msg_id,title,content,activity,notificationActionType,update_time" }, + "id=?", new String[] { id.toString() }, null, null, + null, "1"); + try { + if (cursor.moveToFirst()) { + return new XGNotification(cursor.getInt(cursor + .getColumnIndex("id")), cursor.getLong(cursor + .getColumnIndex("msg_id")), cursor.getString(cursor + .getColumnIndex("title")), cursor.getString(cursor + .getColumnIndex("content")), cursor.getString(cursor + .getColumnIndex("activity")), cursor.getInt(cursor + .getColumnIndex("notificationActionType")), cursor.getString(cursor + .getColumnIndex("update_time"))); + } + return null; + } finally { + cursor.close(); + } + } + + public List getScrollData(int currentPage, int lineSize, + String msg_id) { + String firstResult = String.valueOf((currentPage - 1) * lineSize); + SQLiteDatabase db = dbOpenHelper.getReadableDatabase(); + Cursor cursor = null; + try { + if (msg_id == null || "".equals(msg_id)) { + cursor = db + .query("notification", + new String[] { "id,msg_id,title,content,activity,notificationActionType,update_time" }, + null, null, null, null, "update_time DESC", + firstResult + "," + lineSize); + } else { + cursor = db + .query("notification", + new String[] { "id,msg_id,title,content,activity,notificationActionType,update_time" }, + "msg_id like ?", new String[] { msg_id + "%" }, + null, null, "update_time DESC", firstResult + + "," + lineSize); + } + List notifications = new ArrayList(); + while (cursor.moveToNext()) { + notifications.add(new XGNotification(cursor.getInt(cursor + .getColumnIndex("id")), cursor.getLong(cursor + .getColumnIndex("msg_id")), cursor.getString(cursor + .getColumnIndex("title")), cursor.getString(cursor + .getColumnIndex("content")), cursor.getString(cursor + .getColumnIndex("activity")), cursor.getInt(cursor + .getColumnIndex("notificationActionType")), cursor.getString(cursor + .getColumnIndex("update_time")))); + } + return notifications; + } finally { + cursor.close(); + } + } + + public int getCount() { + SQLiteDatabase db = dbOpenHelper.getReadableDatabase(); + Cursor cursor = db.rawQuery("select count(*) from notification", null); + try { + cursor.moveToFirst(); + return cursor.getInt(0); + } finally { + cursor.close(); + } + } +} diff --git a/app/src/main/java/com/aoleyun/sn/tpush/po/XGNotification.java b/app/src/main/java/com/aoleyun/sn/tpush/po/XGNotification.java new file mode 100644 index 0000000..e62d20c --- /dev/null +++ b/app/src/main/java/com/aoleyun/sn/tpush/po/XGNotification.java @@ -0,0 +1,83 @@ +package com.aoleyun.sn.tpush.po; + +public class XGNotification { + private Integer id; + private Long msg_id; + private String title; + private String content; + private String activity; + private int notificationActionType; + private String update_time; + + public XGNotification() { + + } + + public XGNotification(Integer id, Long msg_id, String title, + String content, String activity, int notificationActionType, String update_time) { + super(); + this.id = id; + this.msg_id = msg_id; + this.title = title; + this.content = content; + this.activity = activity; + this.notificationActionType = notificationActionType; + this.update_time = update_time; + } + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public Long getMsg_id() { + return msg_id; + } + + public void setMsg_id(Long msg_id) { + this.msg_id = msg_id; + } + + public String getTitle() { + return title; + } + + public void setTitle(String title) { + this.title = title; + } + + public String getContent() { + return content; + } + + public void setContent(String content) { + this.content = content; + } + + public String getUpdate_time() { + return update_time; + } + + public void setUpdate_time(String update_time) { + this.update_time = update_time; + } + + public String getActivity() { + return activity; + } + + public void setActivity(String activity) { + this.activity = activity; + } + + public int getNotificationActionType() { + return notificationActionType; + } + + public void setNotificationActionType(int notificationActionType) { + this.notificationActionType = notificationActionType; + } +} diff --git a/app/src/main/java/com/aoleyun/sn/utils/ExampleUtil.java b/app/src/main/java/com/aoleyun/sn/utils/ExampleUtil.java index 920838b..b3f1480 100644 --- a/app/src/main/java/com/aoleyun/sn/utils/ExampleUtil.java +++ b/app/src/main/java/com/aoleyun/sn/utils/ExampleUtil.java @@ -23,7 +23,6 @@ import java.text.DecimalFormat; import java.util.regex.Matcher; import java.util.regex.Pattern; -import cn.jpush.android.api.JPushInterface; public class ExampleUtil { public static final String PREFS_NAME = "JPUSH_EXAMPLE"; @@ -135,7 +134,8 @@ public class ExampleUtil { } public static String getDeviceId(Context context) { - return JPushInterface.getUdid(context); +// return JPushInterface.getUdid(context); + return "0"; } public static class StorageUtils { diff --git a/app/src/main/java/com/aoleyun/sn/utils/JGYUtils.java b/app/src/main/java/com/aoleyun/sn/utils/JGYUtils.java index 3afcb7a..8deec57 100644 --- a/app/src/main/java/com/aoleyun/sn/utils/JGYUtils.java +++ b/app/src/main/java/com/aoleyun/sn/utils/JGYUtils.java @@ -89,7 +89,6 @@ import java.util.Set; import java.util.function.Predicate; import java.util.stream.Collectors; -import cn.jpush.android.api.JPushInterface; import static android.app.ActivityManager.RECENT_IGNORE_UNAVAILABLE; @@ -112,7 +111,11 @@ public class JGYUtils { } private JGYUtils(Context context) { + if (context == null) { + throw new RuntimeException("Context is NULL"); + } this.mContext = context; + } public static void init(Context context) { @@ -939,6 +942,12 @@ public class JGYUtils { this.add("com.aoleyunos.dop1"); this.add("com.aoleyunos.dop2"); this.add("com.aoleyun.info"); + this.add("com.calculator.uiui"); + this.add("com.notepad.uiui"); + this.add("com.calendar.uiui"); + this.add("com.alarmclock.uiui"); + this.add("com.uiui.videoplayer"); + }}; HashSet pkgSet = new HashSet<>(Arrays.asList(packageList.split(","))); pkgSet.addAll(packages); @@ -1838,7 +1847,8 @@ public class JGYUtils { JsonObject jsonObject = new JsonObject(); jsonObject.addProperty("sn", Utils.getSerial()); jsonObject.addProperty("mac", Utils.getAndroid10MAC(mContext)); - jsonObject.addProperty("jpush_id", JPushInterface.getRegistrationID(mContext)); +// jsonObject.addProperty("jpush_id", JPushInterface.getRegistrationID(mContext)); + jsonObject.addProperty("jpush_id", "0000"); jsonObject.addProperty("devices_version", Utils.getCustomVersion()); jsonObject.addProperty("appstore_version", BuildConfig.VERSION_NAME); jsonObject.addProperty("store_version", Utils.getAPPVersionName(PackageNames.APPSTORE, mContext)); @@ -1849,6 +1859,7 @@ public class JGYUtils { jsonObject.addProperty("LAN_ip", Utils.getIPAddress(mContext)); jsonObject.addProperty("bluetooth", Utils.getBluetoothList()); jsonObject.addProperty("wifi_name", Utils.getWifiAlias(mContext)); + jsonObject.addProperty("platform", JGYUtils.getInstance().getAppPlatform()); return jsonObject.toString(); } diff --git a/app/src/main/res/layout-land/activity_main.xml b/app/src/main/res/layout-land/activity_main.xml index 2e537cd..5516244 100644 --- a/app/src/main/res/layout-land/activity_main.xml +++ b/app/src/main/res/layout-land/activity_main.xml @@ -6,7 +6,7 @@ android:layout_height="match_parent" android:background="#ffffff" android:fitsSystemWindows="true" - tools:context=".activity.MainActivity"> + tools:context=".activity.main.MainActivity"> + tools:context=".activity.main.MainActivity"> k2(vy!W4;OB;Rktei&ii$zV>AQ`wL~DCpw4gv0_tE1gFsYJqWJov@Z{)}q?qKB1pIC*mB)z`PeOgq_4rXP?~(?@@;eCoL(sg2`Tro?4?&LW zuuRm_c0)Baz!n1DJ&5*dt|BS!LJX+qBem5|o|v=??AG?6`%Uph%j)&QMnB^0JdPFg z%I4WGV7r^?o6i9_wi$*T_S0a!5)W2+dO(Pi8zAJmiJ4$ildsmu2>RfC^R=Ou)b5w_ z9j+28L(X4V6Xu_9rsh$U_v9-Xqv?fSO#B`8R;dWy02E}Zx8XN9O;L=2U6C~HuQF+= zDSDNm&CtES?of7c?iCzr28GdNvOCdVU{&G)UctY@-HQ05NBDILON{>GEf~@LAk|=4iBpN`FdU=85&ZHXOm$bX? zKRN+i;{82f&vJw8@+az{$NkU~y#Z-Y5~3&dpJQysOTx3oN(JQoHNc=^1I>}IAO(Nn zw}kHbJWgJMm3t!-`-rD1_QpF-P zYp~K+!Fi}4<*j74JhNcFWUtslJA89JHTOmFoAL^~yI%K|fkX!=(F~fq^r3C!S&q#$ z2aJdgdc-BtMg%(zdT$JqlkS-`7f`c9ylMTRy5QOpMPH~U*lw||%eDSFNh3r0ARJ^N z0_){NIUD2<(sRtgQqIC-fzlpx_##H#}Bhd{y0;EPvz5I?BZch*B}TViAaJ6K zBmuTp`udih_9qsg2=}fe2fBHhZSj*YdtzeHWW!{LUjBp;*Aofy}9 zf$Y>xUxn=;;qAsllZy@JQ4zO1Ekc%3niQnB9Rtg8;^Vv4hIhDt%+@?zY9~#lUOv-y zIsZ^#p|VFM7eCzKmCT(ra0-=af5MA8$GxRKW`122IXkR%{b|~f?3x>V*<*`_77A+K zpf*pY)E?t7$}ZhrT{pIGV|crQ-OQwDPR|HNDZ2O7$=B$(tKiu!km6nYi#n(PLAG*s zv{)Q(D7)#RfE`=LFa0dY%KCHkj}I;m$Qy(OAK>M*XtiX{-9Yj2mjc9KqfSPY5{Eh6 z>(bOSZHp;>|Cwad0cvXL{7qc3U1IZE=4Y^KQ5k@cfKM1l>fP}}#@#$e!WBj6mqPeG zZP7`rh)mfC5!Yrk8a<|6#j(E_zP7=3{DC}7H0cXZ?Pk?sj1Q}AT;3D-szLpN>O`m! LJpAwi>|xe_;`-;c delta 7930 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 R|Kx0tlAOA1jf`d3{{XI5+i3s* diff --git a/app/src/main/res/mipmap-mdpi/ic_launcher.png b/app/src/main/res/mipmap-mdpi/ic_launcher.png index 060c9e2877cccf0efc15199a79559b0cc44858cc..bf26e08f416a30bdc677148a884b6fa7fb05e89b 100644 GIT binary patch delta 1614 zcmZ`)c~lZ;5La8)8?Q=AGm~A9JOUC(AWgs&%_CD6O)V4iNQEL-BosrywDQ7qS3JtH zaxJ{l%q&AnQ$s3yXytkvSw@)cYAU((Ui)Y7%{TMj%x`AiH}iXM&SPthw&eu)dFtzI z)=^Va(k2(vy!W4;OB;Rktei&ii$zV>AQ`wL~DCpw4gv0_tE1gFsYJqWJov@Z{)}q?qKB1pIC*mB)z`PeOgq_4rXP?~(?@@;eCoL(sg2`Tro?4?&LW zuuRm_c0)Baz!n1DJ&5*dt|BS!LJX+qBem5|o|v=??AG?6`%Uph%j)&QMnB^0JdPFg z%I4WGV7r^?o6i9_wi$*T_S0a!5)W2+dO(Pi8zAJmiJ4$ildsmu2>RfC^R=Ou)b5w_ z9j+28L(X4V6Xu_9rsh$U_v9-Xqv?fSO#B`8R;dWy02E}Zx8XN9O;L=2U6C~HuQF+= zDSDNm&CtES?of7c?iCzr28GdNvOCdVU{&G)UctY@-HQ05NBDILON{>GEf~@LAk|=4iBpN`FdU=85&ZHXOm$bX? zKRN+i;{82f&vJw8@+az{$NkU~y#Z-Y5~3&dpJQysOTx3oN(JQoHNc=^1I>}IAO(Nn zw}kHbJWgJMm3t!-`-rD1_QpF-P zYp~K+!Fi}4<*j74JhNcFWUtslJA89JHTOmFoAL^~yI%K|fkX!=(F~fq^r3C!S&q#$ z2aJdgdc-BtMg%(zdT$JqlkS-`7f`c9ylMTRy5QOpMPH~U*lw||%eDSFNh3r0ARJ^N z0_){NIUD2<(sRtgQqIC-fzlpx_##H#}Bhd{y0;EPvz5I?BZch*B}TViAaJ6K zBmuTp`udih_9qsg2=}fe2fBHhZSj*YdtzeHWW!{LUjBp;*Aofy}9 zf$Y>xUxn=;;qAsllZy@JQ4zO1Ekc%3niQnB9Rtg8;^Vv4hIhDt%+@?zY9~#lUOv-y zIsZ^#p|VFM7eCzKmCT(ra0-=af5MA8$GxRKW`122IXkR%{b|~f?3x>V*<*`_77A+K zpf*pY)E?t7$}ZhrT{pIGV|crQ-OQwDPR|HNDZ2O7$=B$(tKiu!km6nYi#n(PLAG*s zv{)Q(D7)#RfE`=LFa0dY%KCHkj}I;m$Qy(OAK>M*XtiX{-9Yj2mjc9KqfSPY5{Eh6 z>(bOSZHp;>|Cwad0cvXL{7qc3U1IZE=4Y^KQ5k@cfKM1l>fP}}#@#$e!WBj6mqPeG zZP7`rh)mfC5!Yrk8a<|6#j(E_zP7=3{DC}7H0cXZ?Pk?sj1Q}AT;3D-szLpN>O`m! LJpAwi>|xe_;`-;c delta 7930 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 R|Kx0tlAOA1jf`d3{{XI5+i3s* diff --git a/app/src/main/res/mipmap-xhdpi/ic_launcher.png b/app/src/main/res/mipmap-xhdpi/ic_launcher.png index 060c9e2877cccf0efc15199a79559b0cc44858cc..bf26e08f416a30bdc677148a884b6fa7fb05e89b 100644 GIT binary patch delta 1614 zcmZ`)c~lZ;5La8)8?Q=AGm~A9JOUC(AWgs&%_CD6O)V4iNQEL-BosrywDQ7qS3JtH zaxJ{l%q&AnQ$s3yXytkvSw@)cYAU((Ui)Y7%{TMj%x`AiH}iXM&SPthw&eu)dFtzI z)=^Va(k2(vy!W4;OB;Rktei&ii$zV>AQ`wL~DCpw4gv0_tE1gFsYJqWJov@Z{)}q?qKB1pIC*mB)z`PeOgq_4rXP?~(?@@;eCoL(sg2`Tro?4?&LW zuuRm_c0)Baz!n1DJ&5*dt|BS!LJX+qBem5|o|v=??AG?6`%Uph%j)&QMnB^0JdPFg z%I4WGV7r^?o6i9_wi$*T_S0a!5)W2+dO(Pi8zAJmiJ4$ildsmu2>RfC^R=Ou)b5w_ z9j+28L(X4V6Xu_9rsh$U_v9-Xqv?fSO#B`8R;dWy02E}Zx8XN9O;L=2U6C~HuQF+= zDSDNm&CtES?of7c?iCzr28GdNvOCdVU{&G)UctY@-HQ05NBDILON{>GEf~@LAk|=4iBpN`FdU=85&ZHXOm$bX? zKRN+i;{82f&vJw8@+az{$NkU~y#Z-Y5~3&dpJQysOTx3oN(JQoHNc=^1I>}IAO(Nn zw}kHbJWgJMm3t!-`-rD1_QpF-P zYp~K+!Fi}4<*j74JhNcFWUtslJA89JHTOmFoAL^~yI%K|fkX!=(F~fq^r3C!S&q#$ z2aJdgdc-BtMg%(zdT$JqlkS-`7f`c9ylMTRy5QOpMPH~U*lw||%eDSFNh3r0ARJ^N z0_){NIUD2<(sRtgQqIC-fzlpx_##H#}Bhd{y0;EPvz5I?BZch*B}TViAaJ6K zBmuTp`udih_9qsg2=}fe2fBHhZSj*YdtzeHWW!{LUjBp;*Aofy}9 zf$Y>xUxn=;;qAsllZy@JQ4zO1Ekc%3niQnB9Rtg8;^Vv4hIhDt%+@?zY9~#lUOv-y zIsZ^#p|VFM7eCzKmCT(ra0-=af5MA8$GxRKW`122IXkR%{b|~f?3x>V*<*`_77A+K zpf*pY)E?t7$}ZhrT{pIGV|crQ-OQwDPR|HNDZ2O7$=B$(tKiu!km6nYi#n(PLAG*s zv{)Q(D7)#RfE`=LFa0dY%KCHkj}I;m$Qy(OAK>M*XtiX{-9Yj2mjc9KqfSPY5{Eh6 z>(bOSZHp;>|Cwad0cvXL{7qc3U1IZE=4Y^KQ5k@cfKM1l>fP}}#@#$e!WBj6mqPeG zZP7`rh)mfC5!Yrk8a<|6#j(E_zP7=3{DC}7H0cXZ?Pk?sj1Q}AT;3D-szLpN>O`m! LJpAwi>|xe_;`-;c delta 7930 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 R|Kx0tlAOA1jf`d3{{XI5+i3s* diff --git a/app/src/main/res/mipmap-xxhdpi/ic_launcher.png b/app/src/main/res/mipmap-xxhdpi/ic_launcher.png index 060c9e2877cccf0efc15199a79559b0cc44858cc..bf26e08f416a30bdc677148a884b6fa7fb05e89b 100644 GIT binary patch delta 1614 zcmZ`)c~lZ;5La8)8?Q=AGm~A9JOUC(AWgs&%_CD6O)V4iNQEL-BosrywDQ7qS3JtH zaxJ{l%q&AnQ$s3yXytkvSw@)cYAU((Ui)Y7%{TMj%x`AiH}iXM&SPthw&eu)dFtzI z)=^Va(k2(vy!W4;OB;Rktei&ii$zV>AQ`wL~DCpw4gv0_tE1gFsYJqWJov@Z{)}q?qKB1pIC*mB)z`PeOgq_4rXP?~(?@@;eCoL(sg2`Tro?4?&LW zuuRm_c0)Baz!n1DJ&5*dt|BS!LJX+qBem5|o|v=??AG?6`%Uph%j)&QMnB^0JdPFg z%I4WGV7r^?o6i9_wi$*T_S0a!5)W2+dO(Pi8zAJmiJ4$ildsmu2>RfC^R=Ou)b5w_ z9j+28L(X4V6Xu_9rsh$U_v9-Xqv?fSO#B`8R;dWy02E}Zx8XN9O;L=2U6C~HuQF+= zDSDNm&CtES?of7c?iCzr28GdNvOCdVU{&G)UctY@-HQ05NBDILON{>GEf~@LAk|=4iBpN`FdU=85&ZHXOm$bX? zKRN+i;{82f&vJw8@+az{$NkU~y#Z-Y5~3&dpJQysOTx3oN(JQoHNc=^1I>}IAO(Nn zw}kHbJWgJMm3t!-`-rD1_QpF-P zYp~K+!Fi}4<*j74JhNcFWUtslJA89JHTOmFoAL^~yI%K|fkX!=(F~fq^r3C!S&q#$ z2aJdgdc-BtMg%(zdT$JqlkS-`7f`c9ylMTRy5QOpMPH~U*lw||%eDSFNh3r0ARJ^N z0_){NIUD2<(sRtgQqIC-fzlpx_##H#}Bhd{y0;EPvz5I?BZch*B}TViAaJ6K zBmuTp`udih_9qsg2=}fe2fBHhZSj*YdtzeHWW!{LUjBp;*Aofy}9 zf$Y>xUxn=;;qAsllZy@JQ4zO1Ekc%3niQnB9Rtg8;^Vv4hIhDt%+@?zY9~#lUOv-y zIsZ^#p|VFM7eCzKmCT(ra0-=af5MA8$GxRKW`122IXkR%{b|~f?3x>V*<*`_77A+K zpf*pY)E?t7$}ZhrT{pIGV|crQ-OQwDPR|HNDZ2O7$=B$(tKiu!km6nYi#n(PLAG*s zv{)Q(D7)#RfE`=LFa0dY%KCHkj}I;m$Qy(OAK>M*XtiX{-9Yj2mjc9KqfSPY5{Eh6 z>(bOSZHp;>|Cwad0cvXL{7qc3U1IZE=4Y^KQ5k@cfKM1l>fP}}#@#$e!WBj6mqPeG zZP7`rh)mfC5!Yrk8a<|6#j(E_zP7=3{DC}7H0cXZ?Pk?sj1Q}AT;3D-szLpN>O`m! LJpAwi>|xe_;`-;c delta 7930 zcmZ`;WmJ>_v)-i}lzaAus|RXu9Bjx_P^-yAHzWV=M#QJ1i|Q7z;rO> zct!zEYaS>+L`Z}SDgfmdhH^l7d7ymUJbc_xK29jFD36FJRG|Ku4h(*i3_)Tt6%u+Q z%q#y!Mwk!E4~5Ff2+Iiy%ggXc3kyKyKZ z<6tBDzt}hb4Vzqm#PfdyBLA)F6~xm^+tyCh=D!n2|2J$h7qSfCG1u}P1fmX8l9kr= zT|G7nsIoOM`n$Lqkbj#Sur~`QD&gataS#hBmU0T8C1Q1ySvZSIVv*gd4Eak=Xk7qg zLI!2SLoU+kwAf{>WwqZ#Jz0mLR(;Wa?fiM?S;~{YHKvJ;E*XyU5>k%9rYb2jQ8hQ_G(yiF7Y95&-EKw$k_%@kEWl zr`zmal`_Y_7e*jIwKo5*9dirK?LqcCa0K1I9D<8Xa9{#dAmc76BqsJ`ju0b%P^!uHhxfX$X#ayn`(p zP><$bgJyl6(3!dNBjky2WXPjRSnsfEBnuDSMvZ~nk>5WGL}3f)_BzMF6zHZk%|I4S zeGxZHGU_C~&)T?KGI+zs1{I$X0`+2!T^tDCmmWExh}7pj#~_X?UtFEWnx7nh+AJao zT4-V=ep^9YE3fO$wuO=JvyAbvC0%SGwf_phnRP^=zQNJkUkb*^_sF{BWeT`95{{4~ zEo7sF6Z(x-ifh*%&BKUmP)aoC{WJs^{F_ARzI-l#gI_jJO z*t+^fSgOlc-pveH+=)|5_+PE^Uhw5V@K;yY&RtGRYG}zyD>?3lncf>?HtC4%Ys{KY zBJXir`%8?)6{?rMc}%;VJvhx{a^i5P9!7a`v8 z5}S??E&)$Pc;D40{GDw^O`3G**@S-v;L!={iPYb~%&z?_q75~XnM)<|;va2@6bL5a zIj<(I&eo;crBjAXE&FZ{93n0l+>6;3P@c}RynlJWmYG<-huafZ=X-mZT!KXtHx=Wi zLRNnWIJQ2{J6t=IH_NeC;~G0`xqHTTOoD5e8FPO=S*xL8(Fz#zJ2yGdZzyB~aWwJl zO;{_6X%5u2)e7THFHQ=B*9*IU&uTV1kTpA~;x41a&0!{|)P5zOy^ws8s1|=pw^@7d ze>JO6+m&FGUp7$Xc~BWW3@4C@3kw5B#g5EeYks0zB1?>cgYeS#w3WB!!<9uC+2FS} zNF3qi&BYiB-)j)c(hyQZS8ORDbrlVfVi;jj*CZJrKplmzSsC;xEscZo8t3Gw#H+4R zPRPqcbeVcKIAk@vOkY{}-~9BeR0_)2jVmef zzfDFiYyYi{B?X^P3dS+vp)7sZ!Skpgt~U0-PKJke`Qlg=EdxUe!;u|OjnTFi4}|f? z#!hsVzeu)zhI3lvUZzus{ap^7Rgc%_(yz2k#8x5ZFL-w-HxXdgpo{wDUhhxbvg~{l z=E0(2Gn{$*1(@%E*NpwiO&OLOHcm0{_c5TnwE_KB3ABc@1ksEa?2=!h+?>@q zc4yod1s}~LJ_L(Nu|LT>m#0%&dI0lRxV~3L@^eg&SAOeOM2gQ`V8TJ!+uP9 z(KhRbZ`lxYP-tVPg%(pLK&%~^eepc=>)I2j>M6bNg2s_R)EXE-45D5Sx(nfm8?q)L z92K~PaW9y$1li6hJJiwRs zp@a<1N4B+G+B=UlfuW$!GSDCM;(ePEQ2`rR7L&hSN|(A9HL*o)5<}sxmjoG;b{RE5 z6sn@kISJXieRTu?Z|?WgCR>R0o$zTov2yaG7HCvO#QqSvIy7DEL1wloOxtFx`d?_I zt(%HB~s#MDC~ZS+C|35_3Ap2`W< zl@n&2M)uW-InUA6^qJ$(TBit$v!p4SxLJ0%#J6@en|7ju@x3jESo*qyX z6-@DUxfi!?@MD08JcaTqbFJ}dwW-wKQrmh}30DwrhZ{l~NfpCuL=xrd%Ru}g2mRJy zPYh3+-U+voS zPSa>w_O(UJS5(6L92CVCK~}l)mATK4Y&;GAUTg2s?HUHYO-(S-ylKafB6=!d;OJw9 z*1O!?yEFf6(rJ<;#e-Y`$%onCS5gyIzYOF@4ELLQ+lsVP=ALgsr9ls87Nr(b(4 zYW%je+NlR5JS|J3f6;=O{t!!LHuEO?we0b3H(z|7j}KBOO0gZq$dDr#RMiY6X1fyx zVHE=clffAaFri9I$m4)u@6k^&6HqNk>nO3)k$E?%M=Qiya4X<*Tm(!%P5P6>;>Dsq8_Wo#OvCI*}$6eCYA*_;`5ZKg+g$ z>;b#<%MZ+!U*OpEj7+3NrLHKxPV%;O{EB!IZi}Xi-nry_Dy+OyRA8>dkSJ_L_Kp?vYp{-dxyD9-I1&2A# ze@t=jkLQsEDv!oUMb6=RvQFr;ftIR>>IU{5N6>CZix|mungZ9OP#R{cy z0a4K466H$7$11J(n--acizK7Bn+2$A;%S8{BxMkBw#vi_hEbx3{1`TrI<5y0A?ONR zl=7%i_1COCkMfMyOsX{~Sguh-Mp@62j?l|Q<_;E~vUWCx2g#zB`5v*_*Kl@ZdTce$qJxZ^lTk(2s z@@_Ks*`Bi1{HYeDM7q^vD!|0+;dGGnTLtlVjO~K%{T2NfG@4gzuWu?Mu&9$@*m3x&A{Iq&VF6ia zA+~q+_qnZ#5La%Yfj9XG-F2@#7sjBlBS^`T36nBzf6Yy69gW0;oGYQrZ_?^T_?{0H zI^-PPx(5d!Esjd`w0rfjQlMKl;#7N1KB`m+W1mnpiDhyx7uLB0OWmuvFm0!vgB|p& z>^#3((XVi>2C?oh#+P*B<$kpu=blwFGrvYB1Y4o}Eu+J-WP?@?XY1AseWa++b+eS` z3mH+J(6M7c0j)wAuB#a8w864(tq)hoJSi~^JgWfiJDuVLX__NV-U%{AlX5IhQyL{P z{SPJCRzAvVKK}0)feSunt>fp&rTwX+yh8de+|{Lz8meI;wghjrF{f>Jgd4uP?WPxc zL@PJjTU%OzizpS4ig-M#5L`QKdPq!<3MBS{*Q2CZ$GQUvIYIBtehFyYz%D!Mj=6Se zKb!-Zw!hnTuJ>e^4An9hrPF4RBU|@Fvo*eRj#u)Ok~5x#i@rs}gBdpPWV9z}7fZ-S z7T!i9(PV3(5tPi^(MW+`ylTyiwAD8{OCY8t4~@gyEIdZ&GON5#p4&l+9NSw~ct9AW zv){#Y2`GD$p67R>st_i3;DOXR@b?W)eZv5kO#tl=!8x-+DJVYCp9L*36QdF9K`~X4 ztug1ySd$ z5*+IF)u3b_N7ME(qN8p)$GEdf+@SM*%%P_plOWzF@(SJcfxBbx6Q7kEJqna+z6==d zZLB+sbJj+c<*L8GmK~6eJGbLkquj`e;RivasGwrkgG~(yHjP;NhgD^Vz6AGhGl7bY z4eG<}v59qkpLHMFgMD6gA0ae@%kj}=l<;^jv@7`SYk60(KoSv4gni(I>ea691RD)| zye_>?mM$8f5Sg(oMjMN#O(-o)+eGy9JNZ#i!~Qt*lV9@YcH!}?y)6`7B28*i4;|; zsttvr+jh!rEK|ys@Q)EN4cS4T>Ng^e)EIS!gDA`e>eNWyTrI{BQ}N9pWce3n?C0a^ zrzdfLZ(cuZR(zMRZ@pI_4g|hnx}+1jCb!ddmdlHXhDWF3+^-RP0>xQB9ug=G#WC2wrU;338o;}76M`@`@mid#qcDNejr5>$t z`4{7m^cjLN$z_V~+(6H7%!e~-jqks1$VALyRdTy0m|nkt@P@oB4oii8XnRb`BqZ@? zGD0KRovWioNxpQ~A)8F#3uIQPz*F@uCk1oH_B$%<&$;)BqgjZ7D?#&o8WU{`Uq4kM zZk6KI91gQw=Q?!0nK`6ynmc-?1{qf{xW$n7fLo}YuMf=N>cDJdyrhz=NL!51Y6^Zp zUKccdg^WLhH0~*n&}M(Em-*sQ=C=|3bE)Z-pxlopR_BR`XkTYzq?#e?aRpVHaaC3F zUb2^{zj~Q2x+?V5sJgR>wo!U5MT53I6x|13-Q5t_uBHr~Z^(%TSP-0jPFeK3$bC4)xtI1?>-RUu~G=eGMR&LMFLRm-~7lVVX;qp^gs0T~1FB zDGxW9Dn1<+Qhb0!WcEUMLN=D_%bl^`~0Xc=x8(T@tn!sB8Tad$ASmiq+#w|ay1YkaOsxB;4ixG=4>;2dk2Jbcq z$&%*KWd?oYF8}JcHS@vsxJhq`Tul#B6$QgH<+^T!s%d-uCIrE|Y5vZmJV1G{%F5vr zNn_e$AqN3EK}4K5l#Cx-^DC6U+tP(hkuX3I2?RF-_YW$9ylTe!qutIW@YRgI&mU zpWaR6dkX1#1-!t7-(A;A4=ZASvV*sVPj!UM3IeZ1DZ1ww1*AN zC13`*HYjGJu0d{e7fkWZSFF1BnuX$B%%_p2@0wA&CG0Kb@hcfBec6{fo2tkCdDwp> zR;C#{&z;Hj{Pm4VK?pSwB**>_Bxkk6z^T@8pLcSe9x2(bjJug?v$mYvibAEF<#xXd zr=qg6J|&W=Be_%v=1ss`&$Ygz^9la^H?&3%@-9vvt@s4vG#`#!#gtC}oCAfl5)Vk! zyK!QBF8@Av$IQk~I)$~2ck|X|cFsf2Y)&#EHa6YKS4~-?cGOBb^t3AHjttp@K*OaN z3QhkPf;&y37Le~xabL~Q7+GTVj^skOKSSN|R;2t9xwE>_>de|98JJO+aoCW|=oU~j z9mpQT2Zt#y&q@B%Vf-Xfl9O7Tx-#>|9hJnLPQq+jYvWZ(t zJ+&bnE{C8Z-`D3M1{*?~S7$Ug;9rtlK1S1vwIG#QFQL4lL~>D{v@~D4%d^pN_3$Fr zmn5<^sn6)MzRmqg8?ZFzb$c|W<$40jmGoxEonn|bqCcz-$Im7RA;Sd$KQYp2(juPl zn6|U6a$uau7wdX+X$3@vL`!DvqyyY}a^~#~*J_v{LoU|rUxsL8sa07exy?O;Poq(w z;Gb4WZJJ?Mr&>G%U%wh1)P3NErNKDv202hfBWyr|VTZ}>HVk|aIBFdKwR(})-sAKv z9 z`!F5_esp|;q7%QH{3kb z#Dxi+adTc=<}vB{Rx3FJ9d$HPuTmYu<%r^9kjiXd0$az<9{&#jfv0(MMYsA;Q}Dd! z;aI&pZyEtx2?;%*=U-{~rYQ}5dYeLi;5SP(gF#q*^~wJX%Wm~V0<3L|M> zG<(SQl9z5)U%|YcUh~Vsu}-&)I)t9{Vg1erjqEw`B67d8WTrc76*-in&BnK}G>t;5 z+kf|G^FX5{(|DYKH{eN2{d7-Reyy9mud5!Hu6>xJQXY_Jsm|Ff=yvQWv8IKbuQ64o% zlwo_WuJO)Og=EtEMnf4Q947y5(8bLYrR1i?FuYO@syUD|oliyX_ep(cWIl;>KLg_Q zsewr%v_?Srn)`I z;o1sI?%B< zay<|_8-}?ci2Ip+qRc)Y3!<)C@ncwiwFQIZNvm%Ji|5lkze#0xot2=R?v5W1+z9O!JGC`BNj2}AP&Xm-Do=36Lr@*M(xfedGiG-H}0d?z_5sN%VK$_K*?`6Rn8(( z&hto&U`yp8<_me!^q6SYj8Y_Qz0v-_Rc^q=2|Y7dA7sN;Rq-&`?;N9nvpavP9N+IG zt=vOyK!cvlepZ$gUGvV!eW5|>>|5Z6muS=ejF)>h=>k2pas4*A@GE3ee@pQ%ltRA|2_qP&3yOOuuuK4Nb2Raa##TfX* ze3(+0a;U3YqxWza|L>T~Q;_brZYMP;Lm53;4rCnpxb*z@+sf5ero9;pjt;N9Qs-X5<^?DmhSdh}xMHS`)P-RZH6pL6YLk{9qu6M0N1dgucdG~Fg89!EA? zq$4PE>%YBfBoYI~_7rIRK6WT2|M5F1ofz;Z7Q}w7vrj8uJ0| z5~ywqIgKw5)U`DQ2$fHo1nV!I*51@*PPdPC*{YO&ktaH0Y;Qz#-EIWzpqIN$Y=9UE(3Ep8l(u;IE;&1E4X@!$MA|La z@etdqm3&~qz4^)1Ac+(1IvoVyXWY#wybc_?<=fb z*-S$cd__LO_n%nBo2aqmZ+Lf(gM4pO9T`EZ!IQXI^&fG`#I#`hFV>D{GZ%^fw@>7L z6c>{JQXg@>J4G5m@5uTseDgw*jU$)}d)CPeVp!F80ua_laqi)=}>9Y>F4>OcMk~Fh{V5 zup9eud(JhhOWSGj^`wi;3g#o}0P`b97q|t==aNsW#kVo8uyYK=N%O|8;}bT*e#AAU zodMzpxS5#btWoyu5lX R|Kx0tlAOA1jf`d3{{XI5+i3s* diff --git a/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png index 060c9e2877cccf0efc15199a79559b0cc44858cc..bf26e08f416a30bdc677148a884b6fa7fb05e89b 100644 GIT binary patch delta 1614 zcmZ`)c~lZ;5La8)8?Q=AGm~A9JOUC(AWgs&%_CD6O)V4iNQEL-BosrywDQ7qS3JtH zaxJ{l%q&AnQ$s3yXytkvSw@)cYAU((Ui)Y7%{TMj%x`AiH}iXM&SPthw&eu)dFtzI z)=^Va(k2(vy!W4;OB;Rktei&ii$zV>AQ`wL~DCpw4gv0_tE1gFsYJqWJov@Z{)}q?qKB1pIC*mB)z`PeOgq_4rXP?~(?@@;eCoL(sg2`Tro?4?&LW zuuRm_c0)Baz!n1DJ&5*dt|BS!LJX+qBem5|o|v=??AG?6`%Uph%j)&QMnB^0JdPFg z%I4WGV7r^?o6i9_wi$*T_S0a!5)W2+dO(Pi8zAJmiJ4$ildsmu2>RfC^R=Ou)b5w_ z9j+28L(X4V6Xu_9rsh$U_v9-Xqv?fSO#B`8R;dWy02E}Zx8XN9O;L=2U6C~HuQF+= zDSDNm&CtES?of7c?iCzr28GdNvOCdVU{&G)UctY@-HQ05NBDILON{>GEf~@LAk|=4iBpN`FdU=85&ZHXOm$bX? zKRN+i;{82f&vJw8@+az{$NkU~y#Z-Y5~3&dpJQysOTx3oN(JQoHNc=^1I>}IAO(Nn zw}kHbJWgJMm3t!-`-rD1_QpF-P zYp~K+!Fi}4<*j74JhNcFWUtslJA89JHTOmFoAL^~yI%K|fkX!=(F~fq^r3C!S&q#$ z2aJdgdc-BtMg%(zdT$JqlkS-`7f`c9ylMTRy5QOpMPH~U*lw||%eDSFNh3r0ARJ^N z0_){NIUD2<(sRtgQqIC-fzlpx_##H#}Bhd{y0;EPvz5I?BZch*B}TViAaJ6K zBmuTp`udih_9qsg2=}fe2fBHhZSj*YdtzeHWW!{LUjBp;*Aofy}9 zf$Y>xUxn=;;qAsllZy@JQ4zO1Ekc%3niQnB9Rtg8;^Vv4hIhDt%+@?zY9~#lUOv-y zIsZ^#p|VFM7eCzKmCT(ra0-=af5MA8$GxRKW`122IXkR%{b|~f?3x>V*<*`_77A+K zpf*pY)E?t7$}ZhrT{pIGV|crQ-OQwDPR|HNDZ2O7$=B$(tKiu!km6nYi#n(PLAG*s zv{)Q(D7)#RfE`=LFa0dY%KCHkj}I;m$Qy(OAK>M*XtiX{-9Yj2mjc9KqfSPY5{Eh6 z>(bOSZHp;>|Cwad0cvXL{7qc3U1IZE=4Y^KQ5k@cfKM1l>fP}}#@#$e!WBj6mqPeG zZP7`rh)mfC5!Yrk8a<|6#j(E_zP7=3{DC}7H0cXZ?Pk?sj1Q}AT;3D-szLpN>O`m! LJpAwi>|xe_;`-;c delta 7930 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 R|Kx0tlAOA1jf`d3{{XI5+i3s* diff --git a/app/tpns-configs.json b/app/tpns-configs.json new file mode 100644 index 0000000..153fd58 --- /dev/null +++ b/app/tpns-configs.json @@ -0,0 +1,14 @@ +{ + "tpns": { + "access_id": "1500026372", + "access_key": "AR7A1L5M0LPH" + }, + "com.aoleyun.sn": { + "channel": { + "enable": true + } + }, + "debug": false, + "version": "1.2.7.1-release", + "upgrade": true +} \ No newline at end of file diff --git a/build.gradle b/build.gradle index 396b405..52d43b4 100644 --- a/build.gradle +++ b/build.gradle @@ -4,13 +4,14 @@ buildscript { repositories { google() mavenCentral() + maven {url 'http://developer.huawei.com/repo/'} maven { url "https://jitpack.io" } maven { url 'http://maven.aliyun.com/nexus/content/repositories/jcenter' } maven { url "https://oss.sonatype.org/content/repositories/snapshots/" } } dependencies { classpath 'com.android.tools.build:gradle:3.6.4' - + classpath "com.tencent.android.tpns:tpnsplugin:1.8.0" // NOTE: Do not place your application dependencies here; they belong // in the individual module build.gradle files @@ -22,6 +23,7 @@ allprojects { //jcenter即将关闭 google() mavenCentral() + maven {url 'http://developer.huawei.com/repo/'} maven { url "https://jitpack.io" } maven { url 'http://maven.aliyun.com/nexus/content/repositories/jcenter' } maven { url "https://oss.sonatype.org/content/repositories/snapshots/" }