diff --git a/app/build.gradle b/app/build.gradle index 5cf353c..8b2e426 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -16,8 +16,9 @@ android { targetSdkVersion 26 // versionCode 85 // versionName "2.0.4.6"//正式jiaoguanyi.com - versionCode 107 - versionName "2.6.9"//测试jiaoguanyi.cn + versionCode 113 + versionName "2.7.5"//测试jiaoguanyi.cn + multiDexEnabled true testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" packagingOptions { @@ -36,6 +37,9 @@ android { lintOptions { checkReleaseBuilds false } + dexOptions { + jumboMode true + } //签名 signingConfigs { debug { @@ -139,7 +143,9 @@ dependencies { implementation 'io.reactivex.rxjava2:rxandroid:2.0.1' implementation 'com.google.code.gson:gson:2.2.4' - implementation 'cn.jiguang:jpush:2.2.0' +// implementation 'cn.jiguang:jpush:2.2.0' + implementation 'cn.jiguang.sdk:jpush:3.5.6' // 此处以JPush 3.5.6 版本为例。 + implementation 'cn.jiguang.sdk:jcore:2.2.8' // 此处以JCore 2.2.8 版本为例。 implementation "com.github.yjfnypeu:UpdatePlugin:3.0.1" diff --git a/app/libs/armeabi-v7a/libjpush220.so b/app/libs/armeabi-v7a/libjpush220.so deleted file mode 100644 index b7e43a8..0000000 Binary files a/app/libs/armeabi-v7a/libjpush220.so and /dev/null differ diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 9876aeb..da820b5 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -1,28 +1,34 @@ - - + + + + + + + android:protectionLevel="signature" /> + + + - - + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + android:exported="true"> + + + + + + + + + + + + @@ -137,7 +102,8 @@ - + + @@ -149,35 +115,160 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + android:value="20f70bbeb78bad23eddd08d0" /> + - - - - - - - - - - - - - - - - - diff --git a/app/src/main/java/com/mjsheng/myappstore/MyApplication.java b/app/src/main/java/com/mjsheng/myappstore/MyApplication.java index 7a94f72..425f646 100644 --- a/app/src/main/java/com/mjsheng/myappstore/MyApplication.java +++ b/app/src/main/java/com/mjsheng/myappstore/MyApplication.java @@ -4,6 +4,8 @@ import android.app.Activity; import android.content.Context; import android.content.Intent; import android.content.res.Configuration; +import android.os.Handler; +import android.os.Message; import android.support.multidex.MultiDexApplication; import android.util.Log; @@ -21,6 +23,8 @@ import com.mjsheng.myappstore.Statistics.StatisticsInfo; import com.mjsheng.myappstore.activity.MainActivity; import com.mjsheng.myappstore.bean.FileData; import com.mjsheng.myappstore.comm.CommonDatas; +import com.mjsheng.myappstore.jpush.TagAliasOperatorHelper; +import com.mjsheng.myappstore.network.HTTPInterface; import com.mjsheng.myappstore.utils.ApkUtils; import com.mjsheng.myappstore.utils.Configure; import com.mjsheng.myappstore.utils.MySQLData; @@ -43,11 +47,15 @@ import java.util.HashMap; import java.util.LinkedList; import java.util.List; import java.util.Map; +import java.util.concurrent.TimeUnit; import java.util.logging.Level; import cn.jpush.android.api.JPushInterface; +import cn.jpush.android.api.JPushMessage; import okhttp3.Call; import okhttp3.Response; +import rx.Observable; +import rx.functions.Action1; import uk.co.chrisjenx.calligraphy.CalligraphyConfig; /** @@ -81,6 +89,7 @@ public class MyApplication extends MultiDexApplication implements Thread.Uncaugh return instance; } + @Override public void onCreate() { super.onCreate(); @@ -125,6 +134,154 @@ public class MyApplication extends MultiDexApplication implements Thread.Uncaugh } + + public void onTagOperatorResult(JPushMessage jPushMessage) { + if (jPushMessage == null) { + return; + } + String s = "tags:\t"; + int errorCode = jPushMessage.getErrorCode(); + switch (errorCode) { + case 0: + Log.e("jiguangInterface", s + "Tag绑定成功"); + break; + case 6001: + Log.e("jiguangInterface", s + "无效的设置"); + break; + case 6005: + Log.e("jiguangInterface", s + "某一个 tag 字符串不合法"); + ToastUtil.show("设备标签不合法,联系管理员修改\t" + "code:6005"); + break; + case 6006: + Log.e("jiguangInterface", s + "某一个 tag 超长"); + ToastUtil.show("设备标签过长,联系管理员修改\t" + "code:6006"); + break; + case 6007: + Log.e("jiguangInterface", s + "tags 数量超出限制"); + ToastUtil.show("设备标签数量超出限制,联系管理员修改\t" + "code:6007"); + break; + case 6008: + Log.e("jiguangInterface", s + "tag 超出总长度限制"); + ToastUtil.show("设备标签超出总长度限制,联系管理员修改\t" + "code:6008"); + break; + case 6011: + Log.e("jiguangInterface", s + "短时间内操作过于频繁"); + break; + case 6013: + Log.e("jiguangInterface", s + "用户设备时间轴异常"); + ToastUtil.show("用户设备时间轴异常,修改后重新登陆\t" + "code:6013"); + break; + case 6018: + Log.e("jiguangInterface", s + "Tags 过多"); + ToastUtil.show("设备标签数量超出限制,联系管理员修改\t" + "code:6018"); + break; + case 6021: + Log.e("jiguangInterface", s + "tags 操作正在进行中"); + break; + + //需要重新设置 + case 6002: + Log.e("jiguangInterface", s + "设置超时,请重试"); + setJpushTags(); + break; + case 6014: + Log.e("jiguangInterface", s + "服务器繁忙,建议重试"); + setJpushTags(); + break; + case 6020: + Log.e("jiguangInterface", s + "建议过一段时间再设置"); + setJpushTags(); + break; + case 6024: + Log.e("jiguangInterface", s + "服务器内部错误"); + setJpushTags(); + break; + } + } + + public static void setJpushTags() { + Log.e("jiguangInterface", "30s后重新设置tags"); + Observable.timer(30000, TimeUnit.MILLISECONDS) + .observeOn(rx.android.schedulers.AndroidSchedulers.mainThread()) + .subscribe(new Action1() { + @Override + public void call(Long aLong) { + HTTPInterface.setJpushTags(context); + } + }); + } + + + public void onAliasOperatorResult(JPushMessage jPushMessage) { + if (jPushMessage == null) { + return; + } + String s = "alias:\t"; + int errorCode = jPushMessage.getErrorCode(); + switch (errorCode) { + case 0: + Log.e("jiguangInterface", s + "Alias绑定成功"); + break; + case 6001: + Log.e("jiguangInterface", s + "无效的设置"); + break; + case 6011: + Log.e("jiguangInterface", s + "短时间内操作过于频繁"); + break; + case 6013: + Log.e("jiguangInterface", s + "用户设备时间轴异常"); + ToastUtil.show("用户设备时间轴异常,修改后重新登陆\t" + s + "code:6013"); + break; + case 6022: + Log.e("jiguangInterface", s + "alias 操作正在进行中"); + break; + + + //需要重新设置 + case 6002: + Log.e("jiguangInterface", s + "设置超时,请重试"); + setJpushAlias(); + break; + case 6014: + Log.e("jiguangInterface", s + "服务器繁忙,建议重试"); + setJpushAlias(); + break; + case 6020: + Log.e("jiguangInterface", s + "建议过一段时间再设置"); + setJpushAlias(); + break; + case 6024: + Log.e("jiguangInterface", s + "服务器内部错误"); + setJpushAlias(); + break; + + case 6017: + case 6027: + Log.e("jiguangInterface", s + "别名绑定的设备数超过限制"); + clean(); + setJpushAlias(); + break; + } + } + + public static void setJpushAlias() { + Log.e("jiguangInterface", "30s后重新设置alias"); + Observable.timer(30000, TimeUnit.MILLISECONDS) + .observeOn(rx.android.schedulers.AndroidSchedulers.mainThread()) + .subscribe(new Action1() { + @Override + public void call(Long aLong) { + JPushInterface.setAlias(context, TagAliasOperatorHelper.sequence++, Utils.getSerial()); + } + }); + } + + public void clean() { + //alias的绑定的设备超过10个,但是alias应该是一个设备对应一个,在重置设备后jpush的regid会变动,所以需要清除 + //https://docs.jiguang.cn/jpush/server/push/rest_api_v3_device/#_5 + HTTPInterface.cleanJpushAlias(Utils.getSerial()); + } + private boolean finished = false; public boolean isFinished() { diff --git a/app/src/main/java/com/mjsheng/myappstore/activity/MainActivity.java b/app/src/main/java/com/mjsheng/myappstore/activity/MainActivity.java index 6481ac3..e8a213c 100644 --- a/app/src/main/java/com/mjsheng/myappstore/activity/MainActivity.java +++ b/app/src/main/java/com/mjsheng/myappstore/activity/MainActivity.java @@ -56,6 +56,7 @@ import com.mjsheng.myappstore.bean.NetAndLaunchData; import com.mjsheng.myappstore.bean.UploadAppInfo; import com.mjsheng.myappstore.bean.UserInfo; import com.mjsheng.myappstore.comm.CommonDatas; +import com.mjsheng.myappstore.jpush.TagAliasOperatorHelper; import com.mjsheng.myappstore.network.HTTPInterface; import com.mjsheng.myappstore.network.Network; import com.mjsheng.myappstore.network.api.AppLimitApi; @@ -90,11 +91,15 @@ import java.io.IOException; import java.util.ArrayList; import java.util.HashSet; import java.util.List; +import java.util.Random; import java.util.Set; import java.util.concurrent.TimeUnit; +import cn.jpush.android.api.CustomMessage; import cn.jpush.android.api.JPushInterface; +import cn.jpush.android.api.JPushMessage; import cn.jpush.android.api.TagAliasCallback; +import cn.jpush.android.service.JPushMessageReceiver; import io.reactivex.Observer; import io.reactivex.android.schedulers.AndroidSchedulers; import io.reactivex.disposables.Disposable; @@ -105,6 +110,14 @@ import okhttp3.ResponseBody; import rx.Observable; import rx.functions.Action1; +import static com.mjsheng.myappstore.jpush.TagAliasOperatorHelper.ACTION_ADD; +import static com.mjsheng.myappstore.jpush.TagAliasOperatorHelper.ACTION_CHECK; +import static com.mjsheng.myappstore.jpush.TagAliasOperatorHelper.ACTION_CLEAN; +import static com.mjsheng.myappstore.jpush.TagAliasOperatorHelper.ACTION_DELETE; +import static com.mjsheng.myappstore.jpush.TagAliasOperatorHelper.ACTION_GET; +import static com.mjsheng.myappstore.jpush.TagAliasOperatorHelper.ACTION_SET; +import static com.mjsheng.myappstore.jpush.TagAliasOperatorHelper.TagAliasBean; +import static com.mjsheng.myappstore.jpush.TagAliasOperatorHelper.sequence; public class MainActivity extends AppCompatActivity implements NetStateChangeObserver { @@ -114,11 +127,132 @@ public class MainActivity extends AppCompatActivity implements NetStateChangeObs private final String ACTION_HrReceiver_JGY_DIS = "qch_jgy_network_disallow"; private final String ACTION_HrReceiver_JGY = "qch_jgy_network_allow"; private DownloadManager downloadManager; - public static boolean isForeground = false; private ImageView imageView; private TextView tv_devsn, tv_devmac, tv_version; private int DeviceInfo; + //jiguang + public static boolean isForeground = false; + //for receive customer msg from jpush server + private MessageReceiver mMessageReceiver; + public static final String MESSAGE_RECEIVED_ACTION = "com.jiaoguanyi.appstore.MESSAGE_RECEIVED_ACTION"; + public static final String KEY_TITLE = "title"; + public static final String KEY_MESSAGE = "message"; + public static final String KEY_EXTRAS = "extras"; + + public void registerMessageReceiver() { + mMessageReceiver = new MessageReceiver(); + IntentFilter filter = new IntentFilter(); + filter.setPriority(IntentFilter.SYSTEM_HIGH_PRIORITY); + filter.addAction(MESSAGE_RECEIVED_ACTION); + LocalBroadcastManager.getInstance(this).registerReceiver(mMessageReceiver, filter); + } + + public class MessageReceiver extends BroadcastReceiver { + @Override + public void onReceive(Context context, Intent intent) { + try { + if (MESSAGE_RECEIVED_ACTION.equals(intent.getAction())) { + String messge = intent.getStringExtra(KEY_MESSAGE); + String extras = intent.getStringExtra(KEY_EXTRAS); + StringBuilder showMsg = new StringBuilder(); + showMsg.append(KEY_MESSAGE + " : " + messge + "\n"); + if (!ExampleUtil.isEmpty(extras)) { + showMsg.append(KEY_EXTRAS + " : " + extras + "\n"); + } +// setCostomMsg(showMsg.toString()); + } + } catch (Exception e) { + } + } + } + + + public void onTagAliasAction(int i) { + Set tags = null; + String alias = null; + int action = -1; + boolean isAliasAction = false; + switch (i) { + //设置手机号码: + case 0: +// handleSetMobileNumber(); + return; + //增加tag + case 1: +// tags = getInPutTags(); + if (tags == null) { + return; + } + action = ACTION_ADD; + break; + //设置tag + case 2: +// tags = getInPutTags(); + if (tags == null) { + return; + } + action = ACTION_SET; + break; + //删除tag + case 3: +// tags = getInPutTags(); + if (tags == null) { + return; + } + action = ACTION_DELETE; + break; + //获取所有tag + case 4: + action = ACTION_GET; + break; + //清除所有tag + case 5: + action = ACTION_CLEAN; + break; + case 6: +// tags = getInPutTags(); + if (tags == null) { + return; + } + action = ACTION_CHECK; + break; + //设置alias + case 7: +// alias = getInPutAlias(); + alias = Utils.getSerial(); + if (TextUtils.isEmpty(alias)) { + return; + } + isAliasAction = true; + action = ACTION_SET; + break; + //获取alias + case 8: + isAliasAction = true; + action = ACTION_GET; + break; + //删除alias + case 9: + isAliasAction = true; + action = ACTION_DELETE; + break; + default: + return; + } + TagAliasBean tagAliasBean = new TagAliasBean(); + tagAliasBean.action = action; + sequence++; + if (isAliasAction) { + tagAliasBean.alias = alias; + } else { + tagAliasBean.tags = tags; + } + tagAliasBean.isAliasAction = isAliasAction; + TagAliasOperatorHelper.getInstance().handleAction(getApplicationContext(), sequence, tagAliasBean); + + } + @Override public void onConfigurationChanged(Configuration newConfig) { super.onConfigurationChanged(newConfig); @@ -131,9 +265,7 @@ public class MainActivity extends AppCompatActivity implements NetStateChangeObs // super.onSaveInstanceState(outState, outPersistentState); } - private class LocationReceiver extends BroadcastReceiver { - @Override public void onReceive(Context context, Intent intent) { // ToastTool.show("广播:::"+intent.getAction() + "--------" + intent.getStringExtra("package_name")); @@ -164,6 +296,7 @@ public class MainActivity extends AppCompatActivity implements NetStateChangeObs callback = new ToastCallback(this); initView(); + timerImitate(); initData(); downloadManager = DownloadService.getDownloadManager(); @@ -173,6 +306,7 @@ public class MainActivity extends AppCompatActivity implements NetStateChangeObs sendBroadcast(allIntent); } + //获取教管易版本号 synchronized private String getAPPVersionName() { PackageManager pm = getPackageManager(); @@ -229,9 +363,10 @@ public class MainActivity extends AppCompatActivity implements NetStateChangeObs Log.e("mjhsneg", "gagagag--------------------------" + Utils.getSerial()); getLockedState(); initJpush();//初始化极光推送 - setJpushTags(); + HTTPInterface.setJpushTags(this); // update();//接口更新app sendMACaddress(); + checkUpdate();//更新app Log.e("mac", com.blankj.utilcode.util.DeviceUtils.getMacAddress()); DeviceInfo = (int) SPUtils.get(this, "isLogined", 2); @@ -326,42 +461,6 @@ public class MainActivity extends AppCompatActivity implements NetStateChangeObs } - //for receive customer msg from jpush server - private MessageReceiver mMessageReceiver; - public static final String MESSAGE_RECEIVED_ACTION = "com.example.jpushdemo.MESSAGE_RECEIVED_ACTION"; - public static final String KEY_TITLE = "title"; - public static final String KEY_MESSAGE = "message"; - public static final String KEY_EXTRAS = "extras"; - - public void registerMessageReceiver() { - mMessageReceiver = new MessageReceiver(); - IntentFilter filter = new IntentFilter(); - filter.setPriority(IntentFilter.SYSTEM_HIGH_PRIORITY); - filter.addAction(MESSAGE_RECEIVED_ACTION); - LocalBroadcastManager.getInstance(this).registerReceiver(mMessageReceiver, filter); - } - - public class MessageReceiver extends BroadcastReceiver { - - @Override - public void onReceive(Context context, Intent intent) { - try { - if (MESSAGE_RECEIVED_ACTION.equals(intent.getAction())) { - String messge = intent.getStringExtra(KEY_MESSAGE); - String extras = intent.getStringExtra(KEY_EXTRAS); - StringBuilder showMsg = new StringBuilder(); - showMsg.append(KEY_MESSAGE + " : " + messge + "\n"); - if (!ExampleUtil.isEmpty(extras)) { - showMsg.append(KEY_EXTRAS + " : " + extras + "\n"); - } -// setCostomMsg(showMsg.toString()); - } - } catch (Exception e) { - } - } - } - - private boolean locked = false; public void getLockedState() { @@ -419,7 +518,6 @@ public class MainActivity extends AppCompatActivity implements NetStateChangeObs Aria.download(this).resumeAllTask(); // getForceDownload();//强制下载apk resetDevice();//恢复出厂设置 - checkUpdate();//更新app // fromNetToUpdate(); String registrationID = JPushInterface.getRegistrationID(MainActivity.this); Log.e("mjsheng", registrationID + "------------------------"); @@ -499,20 +597,23 @@ public class MainActivity extends AppCompatActivity implements NetStateChangeObs @Override protected void onStop() { - super.onStop(); } + @Override + protected void onPause() { + isForeground = false; + super.onPause(); + } @Override protected void onResume() { super.onResume(); + isForeground = true; Intent allIntent = new Intent(); allIntent.setAction(Utils.DOWNLOAD_ALLTASK_ACTION); sendBroadcast(allIntent); loadHeadImg(Configure.HTTP_TAG_HOME_PAGE_URL); - - lazyLoading(); } @@ -670,82 +771,41 @@ public class MainActivity extends AppCompatActivity implements NetStateChangeObs }); } - private void setJpushTags() { - OkGo.get(Configure.GET_DEVICES_TAGS) - .params("sn", Utils.getSerial()) - .execute(new StringCallback() { - @Override - public void onSuccess(String s, Call call, Response response) { - Log.e("fht", s); - com.alibaba.fastjson.JSONObject jsonObject = JSON.parseObject(s); - int code = jsonObject.getInteger("code"); - com.alibaba.fastjson.JSONObject data = jsonObject.getJSONObject("data"); - if (code == 200) { - String batch = data.getString("batch"); - if (batch != null && !batch.equals("")) { - Set set = new HashSet(); - set.add(batch); - JPushInterface.setTags(MainActivity.this, set, new TagAliasCallback() { - @Override - public void gotResult(int i, String s, Set set) { - if (set == null) { - Log.e("initmjsheng", "set is null"); - } else { - Log.e("initmjsheng", "set ---" + set.toString()); - } - Log.e("JPushInterface", s + "---" + i + "---"); - if (i == 0) { - Log.e("JPushInterface", "Tag绑定成功"); - } else if (i == 6001) { - Log.e("JPushInterface", "无效的设置,用户名为空"); - } else if (i == 6002) { - Log.e("JPushInterface", "设置超时,请重试"); - timerImitate(); - } else if (i == 6011) { - Log.e("JPushInterface", "短时间内操作过于频繁"); - } else if (i == 996) { - Log.e("JPushInterface", "网络连接断开"); - timerImitate(); - } - } - }); - } - } - } - - @Override - public void onError(Call call, Response response, Exception e) { - super.onError(call, response, e); - Log.e("fht", e.getMessage()); - } - }); - } private void initJpush() { - - JPushInterface.setAlias(this, Utils.getSerial(), new TagAliasCallback() { - @Override - public void gotResult(int i, String s, Set set) { - if (set == null) { - Log.e("mjhseng", "set is null"); - } else { - Log.e("mjhseng", "set ---" + set.toString()); - } - Log.e("JPushInterface", s + "---" + i + "---"); - if (i == 0) { - Log.e("JPushInterface", "JPush绑定成功"); - } else if (i == 6001) { - Log.e("JPushInterface", "无效的设置,用户名为空"); - } else if (i == 6002) { - Log.e("JPushInterface", "设置超时,请重试"); - timerImitate(); - } else if (i == 6011) { - Log.e("JPushInterface", "短时间内操作过于频繁"); - } else if (i == 996) { - Log.e("JPushInterface", "网络连接断开"); - } - } - }); + onTagAliasAction(7); + String rid = JPushInterface.getRegistrationID(getApplicationContext()); + if (!rid.isEmpty()) { +// ToastUtil.debugShow("RegId:" + rid); + Log.e("jiguang", "RegId:" + rid); + } else { +// ToastUtil.show("Get registration fail, JPush init failed!"); +// Toast.makeText(this, "Get registration fail, JPush init failed!", Toast.LENGTH_SHORT).show(); + } + JPushInterface.getAlias(this, new Random().nextInt(100)); +// JPushInterface.setAlias(this, Utils.getSerial(), new TagAliasCallback() { +// @Override +// public void gotResult(int i, String s, Set set) { +// if (set == null) { +// Log.e("mjhseng", "set is null"); +// } else { +// Log.e("mjhseng", "set ---" + set.toString()); +// } +// Log.e("JPushInterface", s + "---" + i + "---"); +// if (i == 0) { +// Log.e("JPushInterface", "JPush绑定成功"); +// } else if (i == 6001) { +// Log.e("JPushInterface", "无效的设置,用户名为空"); +// } else if (i == 6002) { +// Log.e("JPushInterface", "设置超时,请重试"); +// timerImitate(); +// } else if (i == 6011) { +// Log.e("JPushInterface", "短时间内操作过于频繁"); +// } else if (i == 996) { +// Log.e("JPushInterface", "网络连接断开"); +// } +// } +// }); } @@ -758,8 +818,7 @@ public class MainActivity extends AppCompatActivity implements NetStateChangeObs public void call(Long aLong) { Log.e("JPushInterface", "JPushInterface重新加载"); initJpush(); - setJpushTags(); - + HTTPInterface.setJpushTags(MainActivity.this); } }); } @@ -1104,7 +1163,7 @@ public class MainActivity extends AppCompatActivity implements NetStateChangeObs if ("com.jiaoguanyi.appstore".equals(forceDownloadData.getApp_package())) { Aria.download(this) .load(forceDownloadData.getApp_url()) //读取下载地址 - .setDownloadPath(PathUtils.getExternalDownloadsPath() + "/ygj/" + EncryptUtils.encryptMD5ToString("com.mjsheng.myappstore") + ".apk") + .setDownloadPath(PathUtils.getExternalDownloadsPath() + "/ygj/" + EncryptUtils.encryptMD5ToString("com.jiaoguanyi.appstore") + ".apk") .setExtendField("com.mjsheng.myappstore") .start(); //启动下载} diff --git a/app/src/main/java/com/mjsheng/myappstore/jpush/ExampleUtil.java b/app/src/main/java/com/mjsheng/myappstore/jpush/ExampleUtil.java new file mode 100644 index 0000000..9dd9c70 --- /dev/null +++ b/app/src/main/java/com/mjsheng/myappstore/jpush/ExampleUtil.java @@ -0,0 +1,132 @@ +package com.mjsheng.myappstore.jpush; + +import android.content.Context; +import android.content.pm.ApplicationInfo; +import android.content.pm.PackageInfo; +import android.content.pm.PackageManager; +import android.content.pm.PackageManager.NameNotFoundException; +import android.net.ConnectivityManager; +import android.net.NetworkInfo; +import android.os.Bundle; +import android.os.Looper; +import android.telephony.TelephonyManager; +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"; + public static final String PREFS_DAYS = "JPUSH_EXAMPLE_DAYS"; + public static final String PREFS_START_TIME = "PREFS_START_TIME"; + public static final String PREFS_END_TIME = "PREFS_END_TIME"; + public static final String KEY_APP_KEY = "JPUSH_APPKEY"; + + public static boolean isEmpty(String s) { + if (null == s) + return true; + if (s.length() == 0) + return true; + if (s.trim().length() == 0) + return true; + return false; + } + /** + * 只能以 “+” 或者 数字开头;后面的内容只能包含 “-” 和 数字。 + * */ + private final static String MOBILE_NUMBER_CHARS = "^[+0-9][-0-9]{1,}$"; + public static boolean isValidMobileNumber(String s) { + if(TextUtils.isEmpty(s)) return true; + Pattern p = Pattern.compile(MOBILE_NUMBER_CHARS); + Matcher m = p.matcher(s); + return m.matches(); + } + // 校验Tag Alias 只能是数字,英文字母和中文 + public static boolean isValidTagAndAlias(String s) { + Pattern p = Pattern.compile("^[\u4E00-\u9FA50-9a-zA-Z_!@#$&*+=.|]+$"); + Matcher m = p.matcher(s); + return m.matches(); + } + + // 取得AppKey + public static String getAppKey(Context context) { + Bundle metaData = null; + String appKey = null; + try { + ApplicationInfo ai = context.getPackageManager().getApplicationInfo( + context.getPackageName(), PackageManager.GET_META_DATA); + if (null != ai) + metaData = ai.metaData; + if (null != metaData) { + appKey = metaData.getString(KEY_APP_KEY); + if ((null == appKey) || appKey.length() != 24) { + appKey = null; + } + } + } catch (NameNotFoundException e) { + + } + return appKey; + } + + // 取得版本号 + public static String GetVersion(Context context) { + try { + PackageInfo manager = context.getPackageManager().getPackageInfo( + context.getPackageName(), 0); + return manager.versionName; + } catch (NameNotFoundException e) { + return "Unknown"; + } + } + + public static void showToast(final String toast, final Context context) + { + new Thread(new Runnable() { + + @Override + public void run() { + Looper.prepare(); +// Toast.makeText(context, toast, Toast.LENGTH_SHORT).show(); + Looper.loop(); + } + }).start(); + } + + public static boolean isConnected(Context context) { + ConnectivityManager conn = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); + NetworkInfo info = conn.getActiveNetworkInfo(); + return (info != null && info.isConnected()); + } + + public static String getImei(Context context, String imei) { + String ret = null; + try { + TelephonyManager telephonyManager = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE); + ret = telephonyManager.getDeviceId(); + } catch (Exception e) { + Logger.e(ExampleUtil.class.getSimpleName(), e.getMessage()); + } + if (isReadableASCII(ret)){ + return ret; + } else { + return imei; + } + } + + private static boolean isReadableASCII(CharSequence string){ + if (TextUtils.isEmpty(string)) return false; + try { + Pattern p = Pattern.compile("[\\x20-\\x7E]+"); + return p.matcher(string).matches(); + } catch (Throwable e){ + return true; + } + } + + public static String getDeviceId(Context context) { + return JPushInterface.getUdid(context); + } +} diff --git a/app/src/main/java/com/mjsheng/myappstore/jpush/Invalid/ExampleApplication.java b/app/src/main/java/com/mjsheng/myappstore/jpush/Invalid/ExampleApplication.java new file mode 100644 index 0000000..a45b731 --- /dev/null +++ b/app/src/main/java/com/mjsheng/myappstore/jpush/Invalid/ExampleApplication.java @@ -0,0 +1,25 @@ +package com.mjsheng.myappstore.jpush.Invalid; + +import android.app.Application; + +import com.mjsheng.myappstore.jpush.Logger; + +import cn.jpush.android.api.JPushInterface; + +/** + * For developer startup JPush SDK + * + * 一般建议在自定义 Application 类里初始化。也可以在主 Activity 里。 + */ +public class ExampleApplication extends Application { + private static final String TAG = "JIGUANG-Example"; + + @Override + public void onCreate() { + Logger.d(TAG, "[ExampleApplication] onCreate"); + super.onCreate(); + + JPushInterface.setDebugMode(true); // 设置开启日志,发布时请关闭日志 + JPushInterface.init(this); // 初始化 JPush + } +} diff --git a/app/src/main/java/com/mjsheng/myappstore/jpush/Invalid/MainActivity.java b/app/src/main/java/com/mjsheng/myappstore/jpush/Invalid/MainActivity.java new file mode 100644 index 0000000..51fc316 --- /dev/null +++ b/app/src/main/java/com/mjsheng/myappstore/jpush/Invalid/MainActivity.java @@ -0,0 +1,163 @@ +package com.mjsheng.myappstore.jpush.Invalid; + + +//public class MainActivity extends InstrumentedActivity implements OnClickListener{ +// +// private Button mInit; +// private Button mSetting; +// private Button mStopPush; +// private Button mResumePush; +// private Button mGetRid; +// private TextView mRegId; +// private EditText msgText; +// +// public static boolean isForeground = false; +// @Override +// public void onCreate(Bundle savedInstanceState) { +// super.onCreate(savedInstanceState); +// setContentView(R.layout.main); +// initView(); +// registerMessageReceiver(); // used for receive msg +// } +// +// private void initView(){ +// TextView mImei = (TextView) findViewById(R.id.tv_imei); +// String udid = ExampleUtil.getImei(getApplicationContext(), ""); +// if (null != udid) mImei.setText("IMEI: " + udid); +// +// TextView mAppKey = (TextView) findViewById(R.id.tv_appkey); +// String appKey = ExampleUtil.getAppKey(getApplicationContext()); +// if (null == appKey) appKey = "AppKey异常"; +// mAppKey.setText("AppKey: " + appKey); +// +// mRegId = (TextView) findViewById(R.id.tv_regId); +// mRegId.setText("RegId:"); +// +// String packageName = getPackageName(); +// TextView mPackage = (TextView) findViewById(R.id.tv_package); +// mPackage.setText("PackageName: " + packageName); +// +// String deviceId = ExampleUtil.getDeviceId(getApplicationContext()); +// TextView mDeviceId = (TextView) findViewById(R.id.tv_device_id); +// mDeviceId.setText("deviceId:" + deviceId); +// +// String versionName = ExampleUtil.GetVersion(getApplicationContext()); +// TextView mVersion = (TextView) findViewById(R.id.tv_version); +// mVersion.setText("Version: " + versionName); +// +// mInit = (Button)findViewById(R.id.init); +// mInit.setOnClickListener(this); +// +// mStopPush = (Button)findViewById(R.id.stopPush); +// mStopPush.setOnClickListener(this); +// +// mResumePush = (Button)findViewById(R.id.resumePush); +// mResumePush.setOnClickListener(this); +// +// mGetRid = (Button) findViewById(R.id.getRegistrationId); +// mGetRid.setOnClickListener(this); +// +// mSetting = (Button)findViewById(R.id.setting); +// mSetting.setOnClickListener(this); +// +// msgText = (EditText)findViewById(R.id.msg_rec); +// } +// +// +// @Override +// public void onClick(View v) { +// switch (v.getId()) { +// case R.id.init: +// init(); +// break; +// case R.id.setting: +// Intent intent = new Intent(MainActivity.this, PushSetActivity.class); +// startActivity(intent); +// break; +// case R.id.stopPush: +// JPushInterface.stopPush(getApplicationContext()); +// break; +// case R.id.resumePush: +// JPushInterface.resumePush(getApplicationContext()); +// break; +// case R.id.getRegistrationId: +// String rid = JPushInterface.getRegistrationID(getApplicationContext()); +// if (!rid.isEmpty()) { +// mRegId.setText("RegId:" + rid); +// } else { +// Toast.makeText(this, "Get registration fail, JPush init failed!", Toast.LENGTH_SHORT).show(); +// } +// break; +// } +// } +// +// // 初始化 JPush。如果已经初始化,但没有登录成功,则执行重新登录。 +// private void init(){ +// JPushInterface.init(getApplicationContext()); +// } +// +// +// @Override +// protected void onResume() { +// isForeground = true; +// super.onResume(); +// } +// +// +// @Override +// protected void onPause() { +// isForeground = false; +// super.onPause(); +// } +// +// +// @Override +// protected void onDestroy() { +// LocalBroadcastManager.getInstance(this).unregisterReceiver(mMessageReceiver); +// super.onDestroy(); +// } +// +// +// //for receive customer msg from jpush server +// private MessageReceiver mMessageReceiver; +// public static final String MESSAGE_RECEIVED_ACTION = "com.example.jpushdemo.MESSAGE_RECEIVED_ACTION"; +// public static final String KEY_TITLE = "title"; +// public static final String KEY_MESSAGE = "message"; +// public static final String KEY_EXTRAS = "extras"; +// +// public void registerMessageReceiver() { +// mMessageReceiver = new MessageReceiver(); +// IntentFilter filter = new IntentFilter(); +// filter.setPriority(IntentFilter.SYSTEM_HIGH_PRIORITY); +// filter.addAction(MESSAGE_RECEIVED_ACTION); +// LocalBroadcastManager.getInstance(this).registerReceiver(mMessageReceiver, filter); +// } +// +// public class MessageReceiver extends BroadcastReceiver { +// +// @Override +// public void onReceive(Context context, Intent intent) { +// try { +// if (MESSAGE_RECEIVED_ACTION.equals(intent.getAction())) { +// String messge = intent.getStringExtra(KEY_MESSAGE); +// String extras = intent.getStringExtra(KEY_EXTRAS); +// StringBuilder showMsg = new StringBuilder(); +// showMsg.append(KEY_MESSAGE + " : " + messge + "\n"); +// if (!ExampleUtil.isEmpty(extras)) { +// showMsg.append(KEY_EXTRAS + " : " + extras + "\n"); +// } +// setCostomMsg(showMsg.toString()); +// } +// } catch (Exception e){ +// } +// } +// } +// +// private void setCostomMsg(String msg){ +// if (null != msgText) { +// msgText.setText(msg); +// msgText.setVisibility(View.VISIBLE); +// } +// } + +//} \ No newline at end of file diff --git a/app/src/main/java/com/mjsheng/myappstore/jpush/Invalid/PushSetActivity.java b/app/src/main/java/com/mjsheng/myappstore/jpush/Invalid/PushSetActivity.java new file mode 100644 index 0000000..c09653e --- /dev/null +++ b/app/src/main/java/com/mjsheng/myappstore/jpush/Invalid/PushSetActivity.java @@ -0,0 +1,265 @@ +package com.mjsheng.myappstore.jpush.Invalid; + +//public class PushSetActivity extends InstrumentedActivity implements OnClickListener { +// private static final String TAG = "JIGUANG-Example"; +// +// @Override +// public void onCreate(Bundle icicle) { +// super.onCreate(icicle); +// setContentView(R.layout.push_set_dialog); +// initListener(); +// } +// +// private void initListener() { +// //增加tag +// findViewById(R.id.bt_addtag).setOnClickListener(this); +// //设置tag +// findViewById(R.id.bt_settag).setOnClickListener(this); +// //删除tag +// findViewById(R.id.bt_deletetag).setOnClickListener(this); +// //获取所有tag +// findViewById(R.id.bt_getalltag).setOnClickListener(this); +// //清除所有tag +// findViewById(R.id.bt_cleantag).setOnClickListener(this); +// //查询tag绑定状态 +// findViewById(R.id.bt_checktag).setOnClickListener(this); +// +// //设置alias +// findViewById(R.id.bt_setalias).setOnClickListener(this); +// //获取alias +// findViewById(R.id.bt_getalias).setOnClickListener(this); +// //删除alias +// findViewById(R.id.bt_deletealias).setOnClickListener(this); +// //设置手机号码 +// findViewById(R.id.bt_setmobileNumber).setOnClickListener(this); +// //StyleAddActions +// findViewById(R.id.setStyle0).setOnClickListener(this); +// //StyleBasic +// findViewById(R.id.setStyle1).setOnClickListener(this); +// //StyleCustom +// findViewById(R.id.setStyle2).setOnClickListener(this); +// //SetPushTime +// findViewById(R.id.bu_setTime).setOnClickListener(this); +// } +// +// @Override +// public void onClick(View view) { +// switch (view.getId()) { +// case R.id.setStyle0: +// setAddActionsStyle(); +// break; +// case R.id.setStyle1: +// setStyleBasic(); +// break; +// case R.id.setStyle2: +// setStyleCustom(); +// break; +// case R.id.bu_setTime: +// Intent intent = new Intent(PushSetActivity.this, SettingActivity.class); +// startActivity(intent); +// break; +// default: +// onTagAliasAction(view); +// break; +// } +// } +// +// TagAliasCallback tagAlias = new TagAliasCallback() { +// @Override +// public void gotResult(int responseCode, String alias, Set tags) { +// Log.e(TAG,"responseCode:"+responseCode+",alias:"+alias+",tags:"+tags); +// } +// }; +// +// +// /** +// * 设置通知提示方式 - 基础属性 +// */ +// private void setStyleBasic() { +// BasicPushNotificationBuilder builder = new BasicPushNotificationBuilder(PushSetActivity.this); +// builder.statusBarDrawable = R.drawable.ic_launcher; +// builder.notificationFlags = Notification.FLAG_AUTO_CANCEL; //设置为点击后自动消失 +// builder.notificationDefaults = Notification.DEFAULT_SOUND; //设置为铃声( Notification.DEFAULT_SOUND)或者震动( Notification.DEFAULT_VIBRATE) +// JPushInterface.setPushNotificationBuilder(1, builder); +// Toast.makeText(PushSetActivity.this, "Basic Builder - 1", Toast.LENGTH_SHORT).show(); +// } +// +// +// /** +// * 设置通知栏样式 - 定义通知栏Layout +// */ +// private void setStyleCustom() { +// CustomPushNotificationBuilder builder = new CustomPushNotificationBuilder(PushSetActivity.this, R.layout.customer_notitfication_layout, R.id.icon, R.id.title, R.id.text); +// builder.layoutIconDrawable = R.drawable.ic_launcher; +// builder.developerArg0 = "developerArg2"; +// JPushInterface.setPushNotificationBuilder(2, builder); +// Toast.makeText(PushSetActivity.this, "Custom Builder - 2", Toast.LENGTH_SHORT).show(); +// } +// +// @Override +// public boolean onKeyDown(int keyCode, KeyEvent event) { +// if (keyCode == KeyEvent.KEYCODE_BACK) { +// finish(); +// } +// return super.onKeyDown(keyCode, event); +// } +// +// private void setAddActionsStyle() { +// MultiActionsNotificationBuilder builder = new MultiActionsNotificationBuilder(PushSetActivity.this); +// builder.addJPushAction(R.drawable.jpush_ic_richpush_actionbar_back, "first", "my_extra1"); +// builder.addJPushAction(R.drawable.jpush_ic_richpush_actionbar_back, "second", "my_extra2"); +// builder.addJPushAction(R.drawable.jpush_ic_richpush_actionbar_back, "third", "my_extra3"); +// JPushInterface.setPushNotificationBuilder(10, builder); +// +// Toast.makeText(PushSetActivity.this, "AddActions Builder - 10", Toast.LENGTH_SHORT).show(); +// } +// +// +// /**===========================================================================**/ +// /**=========================TAG/ALIAS 相关=====================================**/ +// /**===========================================================================**/ +// +// /** +// * 处理tag/alias相关操作的点击 +// * */ +// public void onTagAliasAction(View view) { +// Set tags = null; +// String alias = null; +// int action = -1; +// boolean isAliasAction = false; +// switch (view.getId()){ +// //设置手机号码: +// case R.id.bt_setmobileNumber: +// handleSetMobileNumber(); +// return; +// //增加tag +// case R.id.bt_addtag: +// tags = getInPutTags(); +// if(tags == null){ +// return; +// } +// action = ACTION_ADD; +// break; +// //设置tag +// case R.id.bt_settag: +// tags = getInPutTags(); +// if(tags == null){ +// return; +// } +// action = ACTION_SET; +// break; +// //删除tag +// case R.id.bt_deletetag: +// tags = getInPutTags(); +// if(tags == null){ +// return; +// } +// action = ACTION_DELETE; +// break; +// //获取所有tag +// case R.id.bt_getalltag: +// action = ACTION_GET; +// break; +// //清除所有tag +// case R.id.bt_cleantag: +// action = ACTION_CLEAN; +// break; +// case R.id.bt_checktag: +// tags = getInPutTags(); +// if(tags == null){ +// return; +// } +// action = ACTION_CHECK; +// break; +// //设置alias +// case R.id.bt_setalias: +// alias = getInPutAlias(); +// if(TextUtils.isEmpty(alias)){ +// return; +// } +// isAliasAction = true; +// action = ACTION_SET; +// break; +// //获取alias +// case R.id.bt_getalias: +// isAliasAction = true; +// action = ACTION_GET; +// break; +// //删除alias +// case R.id.bt_deletealias: +// isAliasAction = true; +// action = ACTION_DELETE; +// break; +// default: +// return; +// } +// TagAliasBean tagAliasBean = new TagAliasBean(); +// tagAliasBean.action = action; +// sequence++; +// if(isAliasAction){ +// tagAliasBean.alias = alias; +// }else{ +// tagAliasBean.tags = tags; +// } +// tagAliasBean.isAliasAction = isAliasAction; +// TagAliasOperatorHelper.getInstance().handleAction(getApplicationContext(),sequence,tagAliasBean); +// } +// +// private void handleSetMobileNumber(){ +// EditText mobileEdit = (EditText) findViewById(R.id.et_mobilenumber); +// String mobileNumber = mobileEdit.getText().toString().trim(); +// if (TextUtils.isEmpty(mobileNumber)) { +// Toast.makeText(getApplicationContext(), R.string.mobilenumber_empty_guide, Toast.LENGTH_SHORT).show(); +// } +// if (!ExampleUtil.isValidMobileNumber(mobileNumber)) { +// Toast.makeText(getApplicationContext(), R.string.error_tag_gs_empty, Toast.LENGTH_SHORT).show(); +// return; +// } +// sequence++; +// TagAliasOperatorHelper.getInstance().handleAction(getApplicationContext(),sequence,mobileNumber); +// } +// /** +// * 获取输入的alias +// * */ +// private String getInPutAlias(){ +// EditText aliasEdit = (EditText) findViewById(R.id.et_alias); +// String alias = aliasEdit.getText().toString().trim(); +// if (TextUtils.isEmpty(alias)) { +// Toast.makeText(getApplicationContext(), R.string.error_alias_empty, Toast.LENGTH_SHORT).show(); +// return null; +// } +// if (!ExampleUtil.isValidTagAndAlias(alias)) { +// Toast.makeText(getApplicationContext(), R.string.error_tag_gs_empty, Toast.LENGTH_SHORT).show(); +// return null; +// } +// return alias; +// } +// /** +// * 获取输入的tags +// * */ +// private Set getInPutTags(){ +// EditText tagEdit = (EditText) findViewById(R.id.et_tag); +// String tag = tagEdit.getText().toString().trim(); +// // 检查 tag 的有效性 +// if (TextUtils.isEmpty(tag)) { +// Toast.makeText(getApplicationContext(), R.string.error_tag_empty, Toast.LENGTH_SHORT).show(); +// return null; +// } +// +// // ","隔开的多个 转换成 Set +// String[] sArray = tag.split(","); +// Set tagSet = new LinkedHashSet(); +// for (String sTagItme : sArray) { +// if (!ExampleUtil.isValidTagAndAlias(sTagItme)) { +// Toast.makeText(getApplicationContext(), R.string.error_tag_gs_empty, Toast.LENGTH_SHORT).show(); +// return null; +// } +// tagSet.add(sTagItme); +// } +// if(tagSet.isEmpty()){ +// Toast.makeText(getApplicationContext(), R.string.error_tag_empty, Toast.LENGTH_SHORT).show(); +// return null; +// } +// return tagSet; +// } +//} \ No newline at end of file diff --git a/app/src/main/java/com/mjsheng/myappstore/jpush/Invalid/SettingActivity.java b/app/src/main/java/com/mjsheng/myappstore/jpush/Invalid/SettingActivity.java new file mode 100644 index 0000000..d4b52ff --- /dev/null +++ b/app/src/main/java/com/mjsheng/myappstore/jpush/Invalid/SettingActivity.java @@ -0,0 +1,177 @@ +package com.mjsheng.myappstore.jpush.Invalid; + +//public class SettingActivity extends InstrumentedActivity implements OnClickListener { +// TimePicker startTime; +// TimePicker endTime; +// CheckBox mMonday ; +// CheckBox mTuesday ; +// CheckBox mWednesday; +// CheckBox mThursday; +// CheckBox mFriday ; +// CheckBox mSaturday; +// CheckBox mSunday ; +// Button mSetTime; +// SharedPreferences mSettings; +// Editor mEditor; +// +// @Override +// public void onCreate(Bundle icicle) { +// super.onCreate(icicle); +// setContentView(R.layout.set_push_time); +// init(); +// initListener(); +// } +// +// @Override +// public void onStart() { +// super.onStart(); +// initData(); +// } +// +// private void init(){ +// startTime = (TimePicker) findViewById(R.id.start_time); +// endTime = (TimePicker) findViewById(R.id.end_time); +// startTime.setIs24HourView(DateFormat.is24HourFormat(this)); +// endTime.setIs24HourView(DateFormat.is24HourFormat(this)); +// mSetTime = (Button)findViewById(R.id.bu_setTime); +// mMonday = (CheckBox)findViewById(R.id.cb_monday); +// mTuesday = (CheckBox)findViewById(R.id.cb_tuesday); +// mWednesday = (CheckBox)findViewById(R.id.cb_wednesday); +// mThursday = (CheckBox)findViewById(R.id.cb_thursday); +// mFriday = (CheckBox)findViewById(R.id.cb_friday); +// mSaturday = (CheckBox)findViewById(R.id.cb_saturday); +// mSunday = (CheckBox)findViewById(R.id.cb_sunday); +// } +// +// private void initListener(){ +// mSetTime.setOnClickListener(this); +// } +// +// private void initData(){ +// mSettings = getSharedPreferences(ExampleUtil.PREFS_NAME, MODE_PRIVATE); +// String days = mSettings.getString(ExampleUtil.PREFS_DAYS, ""); +// if (!TextUtils.isEmpty(days)) { +// initAllWeek(false); +// String[] sArray = days.split(","); +// for (String day : sArray) { +// setWeek(day); +// } +// } else { +// initAllWeek(true); +// } +// +// int startTimeStr = mSettings.getInt(ExampleUtil.PREFS_START_TIME, 0); +// startTime.setCurrentHour(startTimeStr); +// int endTimeStr = mSettings.getInt(ExampleUtil.PREFS_END_TIME, 23); +// endTime.setCurrentHour(endTimeStr); +// } +// +// @Override +// public void onClick(View v) { +// switch (v.getId()) { +// case R.id.bu_setTime: +// v.requestFocus(); +// v.requestFocusFromTouch(); +// setPushTime(); +// break; +// } +// } +// +// /** +// *设置允许接收通知时间 +// */ +// private void setPushTime(){ +// int startime = startTime.getCurrentHour(); +// int endtime = endTime.getCurrentHour(); +// if (startime > endtime) { +// Toast.makeText(SettingActivity.this, "开始时间不能大于结束时间", Toast.LENGTH_SHORT).show(); +// return; +// } +// StringBuffer daysSB = new StringBuffer(); +// Set days = new HashSet(); +// if (mSunday.isChecked()) { +// days.add(0); +// daysSB.append("0,"); +// } +// if (mMonday.isChecked()) { +// days.add(1); +// daysSB.append("1,"); +// } +// if (mTuesday.isChecked()) { +// days.add(2); +// daysSB.append("2,"); +// } +// if (mWednesday.isChecked()) { +// days.add(3); +// daysSB.append("3,"); +// } +// if (mThursday.isChecked()) { +// days.add(4); +// daysSB.append("4,"); +// } +// if (mFriday.isChecked()) { +// days.add(5); +// daysSB.append("5,"); +// } +// if (mSaturday.isChecked()) { +// days.add(6); +// daysSB.append("6,"); +// } +// +// +// //调用JPush api设置Push时间 +// JPushInterface.setPushTime(getApplicationContext(), days, startime, endtime); +// +// mEditor = mSettings.edit(); +// mEditor.putString(ExampleUtil.PREFS_DAYS, daysSB.toString()); +// mEditor.putInt(ExampleUtil.PREFS_START_TIME, startime); +// mEditor.putInt(ExampleUtil.PREFS_END_TIME, endtime); +// mEditor.commit(); +// Toast.makeText(SettingActivity.this, R.string.setting_su, Toast.LENGTH_SHORT).show(); +// } +// +// @Override +// public boolean onKeyDown(int keyCode, KeyEvent event) { +// if (keyCode == KeyEvent.KEYCODE_BACK){ +// finish(); +// } +// return super.onKeyDown(keyCode, event); +// } +// +// private void setWeek(String day){ +// int dayId = Integer.valueOf(day); +// switch (dayId) { +// case 0: +// mSunday.setChecked(true); +// break; +// case 1: +// mMonday.setChecked(true); +// break; +// case 2: +// mTuesday.setChecked(true); +// break; +// case 3: +// mWednesday.setChecked(true); +// break; +// case 4: +// mThursday.setChecked(true); +// break; +// case 5: +// mFriday.setChecked(true); +// break; +// case 6: +// mSaturday.setChecked(true); +// break; +// } +// } +// +// private void initAllWeek(boolean isChecked) { +// mSunday.setChecked(isChecked); +// mMonday.setChecked(isChecked); +// mTuesday.setChecked(isChecked); +// mWednesday.setChecked(isChecked); +// mThursday.setChecked(isChecked); +// mFriday.setChecked(isChecked); +// mSaturday.setChecked(isChecked); +// } +//} \ No newline at end of file diff --git a/app/src/main/java/com/mjsheng/myappstore/jpush/Invalid/TestActivity.java b/app/src/main/java/com/mjsheng/myappstore/jpush/Invalid/TestActivity.java new file mode 100644 index 0000000..4fea427 --- /dev/null +++ b/app/src/main/java/com/mjsheng/myappstore/jpush/Invalid/TestActivity.java @@ -0,0 +1,32 @@ +package com.mjsheng.myappstore.jpush.Invalid; + +import android.app.Activity; +import android.content.Intent; +import android.os.Bundle; +import android.view.ViewGroup.LayoutParams; +import android.widget.TextView; + +import cn.jpush.android.api.JPushInterface; + +public class TestActivity extends Activity { + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + TextView tv = new TextView(this); + tv.setText("用户自定义打开的Activity"); + Intent intent = getIntent(); + if (null != intent) { + Bundle bundle = getIntent().getExtras(); + String title = null; + String content = null; + if(bundle!=null){ + title = bundle.getString(JPushInterface.EXTRA_NOTIFICATION_TITLE); + content = bundle.getString(JPushInterface.EXTRA_ALERT); + } + tv.setText("Title : " + title + " " + "Content : " + content); + } + addContentView(tv, new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT)); + } + +} diff --git a/app/src/main/java/com/mjsheng/myappstore/jpush/LocalBroadcastManager.java b/app/src/main/java/com/mjsheng/myappstore/jpush/LocalBroadcastManager.java new file mode 100644 index 0000000..5465f66 --- /dev/null +++ b/app/src/main/java/com/mjsheng/myappstore/jpush/LocalBroadcastManager.java @@ -0,0 +1,263 @@ +package com.mjsheng.myappstore.jpush; + +import android.content.BroadcastReceiver; +import android.content.Context; +import android.content.Intent; +import android.content.IntentFilter; +import android.net.Uri; +import android.os.Handler; +import android.os.Message; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.Set; + +/** + * Created by efan on 2017/4/14. + */ + +public final class LocalBroadcastManager { + private static final String TAG = "JIGUANG-Example"; + private static final boolean DEBUG = false; + private final Context mAppContext; + private final HashMap> mReceivers = new HashMap>(); + private final HashMap> mActions = new HashMap>(); + private final ArrayList mPendingBroadcasts = new ArrayList(); + static final int MSG_EXEC_PENDING_BROADCASTS = 1; + private final Handler mHandler; + private static final Object mLock = new Object(); + private static LocalBroadcastManager mInstance; + + public static LocalBroadcastManager getInstance(Context context) { + Object var1 = mLock; + synchronized (mLock) { + if (mInstance == null) { + mInstance = new LocalBroadcastManager(context.getApplicationContext()); + } + + return mInstance; + } + } + + private LocalBroadcastManager(Context context) { + this.mAppContext = context; + this.mHandler = new Handler(context.getMainLooper()) { + public void handleMessage(Message msg) { + switch (msg.what) { + case 1: + LocalBroadcastManager.this.executePendingBroadcasts(); + break; + default: + super.handleMessage(msg); + } + + } + }; + } + + public void registerReceiver(BroadcastReceiver receiver, IntentFilter filter) { + HashMap var3 = this.mReceivers; + synchronized (this.mReceivers) { + ReceiverRecord entry = new ReceiverRecord(filter, receiver); + ArrayList filters = (ArrayList) this.mReceivers.get(receiver); + if (filters == null) { + filters = new ArrayList(1); + this.mReceivers.put(receiver, filters); + } + + filters.add(filter); + + for (int i = 0; i < filter.countActions(); ++i) { + String action = filter.getAction(i); + ArrayList entries = (ArrayList) this.mActions.get(action); + if (entries == null) { + entries = new ArrayList(1); + this.mActions.put(action, entries); + } + + entries.add(entry); + } + + } + } + + public void unregisterReceiver(BroadcastReceiver receiver) { + HashMap var2 = this.mReceivers; + synchronized (this.mReceivers) { + ArrayList filters = (ArrayList) this.mReceivers.remove(receiver); + if (filters != null) { + for (int i = 0; i < filters.size(); ++i) { + IntentFilter filter = (IntentFilter) filters.get(i); + + for (int j = 0; j < filter.countActions(); ++j) { + String action = filter.getAction(j); + ArrayList receivers = (ArrayList) this.mActions.get(action); + if (receivers != null) { + for (int k = 0; k < receivers.size(); ++k) { + if (((ReceiverRecord) receivers.get(k)).receiver == receiver) { + receivers.remove(k); + --k; + } + } + + if (receivers.size() <= 0) { + this.mActions.remove(action); + } + } + } + } + + } + } + } + + public boolean sendBroadcast(Intent intent) { + HashMap var2 = this.mReceivers; + synchronized (this.mReceivers) { + String action = intent.getAction(); + String type = intent.resolveTypeIfNeeded(this.mAppContext.getContentResolver()); + Uri data = intent.getData(); + String scheme = intent.getScheme(); + Set categories = intent.getCategories(); + boolean debug = (intent.getFlags() & 8) != 0; + if (debug) { + Logger.v("LocalBroadcastManager", "Resolving type " + type + " scheme " + scheme + " of intent " + intent); + } + + ArrayList entries = (ArrayList) this.mActions.get(intent.getAction()); + if (entries != null) { + if (debug) { + Logger.v("LocalBroadcastManager", "Action list: " + entries); + } + + ArrayList receivers = null; + + int i; + for (i = 0; i < entries.size(); ++i) { + ReceiverRecord receiver = (ReceiverRecord) entries.get(i); + if (debug) { + Logger.v("LocalBroadcastManager", "Matching against filter " + receiver.filter); + } + + if (receiver.broadcasting) { + if (debug) { + Logger.v("LocalBroadcastManager", " Filter\'s target already added"); + } + } else { + int match = receiver.filter.match(action, type, scheme, data, categories, "LocalBroadcastManager"); + if (match >= 0) { + if (debug) { + Logger.v("LocalBroadcastManager", " Filter matched! match=0x" + Integer.toHexString(match)); + } + + if (receivers == null) { + receivers = new ArrayList(); + } + + receivers.add(receiver); + receiver.broadcasting = true; + } else if (debug) { + String reason; + switch (match) { + case -4: + reason = "category"; + break; + case -3: + reason = "action"; + break; + case -2: + reason = "data"; + break; + case -1: + reason = "type"; + break; + default: + reason = "unknown reason"; + } + + Logger.v("LocalBroadcastManager", " Filter did not match: " + reason); + } + } + } + + if (receivers != null) { + for (i = 0; i < receivers.size(); ++i) { + ((ReceiverRecord) receivers.get(i)).broadcasting = false; + } + + this.mPendingBroadcasts.add(new BroadcastRecord(intent, receivers)); + if (!this.mHandler.hasMessages(1)) { + this.mHandler.sendEmptyMessage(1); + } + + return true; + } + } + + return false; + } + } + + public void sendBroadcastSync(Intent intent) { + if (this.sendBroadcast(intent)) { + this.executePendingBroadcasts(); + } + + } + + private void executePendingBroadcasts() { + while (true) { + BroadcastRecord[] brs = null; + HashMap i = this.mReceivers; + synchronized (this.mReceivers) { + int br = this.mPendingBroadcasts.size(); + if (br <= 0) { + return; + } + + brs = new BroadcastRecord[br]; + this.mPendingBroadcasts.toArray(brs); + this.mPendingBroadcasts.clear(); + } + + for (int var6 = 0; var6 < brs.length; ++var6) { + BroadcastRecord var7 = brs[var6]; + + for (int j = 0; j < var7.receivers.size(); ++j) { + ((ReceiverRecord) var7.receivers.get(j)).receiver.onReceive(this.mAppContext, var7.intent); + } + } + } + } + + private static class BroadcastRecord { + final Intent intent; + final ArrayList receivers; + + BroadcastRecord(Intent _intent, ArrayList _receivers) { + this.intent = _intent; + this.receivers = _receivers; + } + } + + private static class ReceiverRecord { + final IntentFilter filter; + final BroadcastReceiver receiver; + boolean broadcasting; + + ReceiverRecord(IntentFilter _filter, BroadcastReceiver _receiver) { + this.filter = _filter; + this.receiver = _receiver; + } + + public String toString() { + StringBuilder builder = new StringBuilder(128); + builder.append("Receiver{"); + builder.append(this.receiver); + builder.append(" filter="); + builder.append(this.filter); + builder.append("}"); + return builder.toString(); + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/mjsheng/myappstore/jpush/Logger.java b/app/src/main/java/com/mjsheng/myappstore/jpush/Logger.java new file mode 100644 index 0000000..010114d --- /dev/null +++ b/app/src/main/java/com/mjsheng/myappstore/jpush/Logger.java @@ -0,0 +1,40 @@ +package com.mjsheng.myappstore.jpush; + +import android.util.Log; + +/** + * Created by efan on 2017/4/13. + */ + +public class Logger { + + //设为false关闭日志 + private static final boolean LOG_ENABLE = true; + + public static void i(String tag, String msg){ + if (LOG_ENABLE){ + Log.i(tag, msg); + } + } + public static void v(String tag, String msg){ + if (LOG_ENABLE){ + Log.v(tag, msg); + } + } + public static void d(String tag, String msg){ + if (LOG_ENABLE){ + Log.d(tag, msg); + } + } + public static void w(String tag, String msg){ + if (LOG_ENABLE){ + Log.w(tag, msg); + } + } + public static void e(String tag, String msg){ + if (LOG_ENABLE){ + Log.e(tag, msg); + } + } + +} diff --git a/app/src/main/java/com/mjsheng/myappstore/jpush/MyJPushMessageReceiver.java b/app/src/main/java/com/mjsheng/myappstore/jpush/MyJPushMessageReceiver.java new file mode 100644 index 0000000..aabb4a3 --- /dev/null +++ b/app/src/main/java/com/mjsheng/myappstore/jpush/MyJPushMessageReceiver.java @@ -0,0 +1,46 @@ +package com.mjsheng.myappstore.jpush; + +import android.content.Context; + +import com.mjsheng.myappstore.MyApplication; + +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); + MyApplication.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); + MyApplication.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/mjsheng/myappstore/jpush/MyReceiver.java b/app/src/main/java/com/mjsheng/myappstore/jpush/MyReceiver.java new file mode 100644 index 0000000..7db837e --- /dev/null +++ b/app/src/main/java/com/mjsheng/myappstore/jpush/MyReceiver.java @@ -0,0 +1,129 @@ +package com.mjsheng.myappstore.jpush; + +import android.content.BroadcastReceiver; +import android.content.Context; +import android.content.Intent; +import android.os.Bundle; +import android.text.TextUtils; + +import com.mjsheng.myappstore.activity.MainActivity; + +import org.json.JSONException; +import org.json.JSONObject; + +import java.util.Iterator; + +import cn.jpush.android.api.JPushInterface; + +/** + * 自定义接收器 + * + * 如果不定义这个 Receiver,则: + * 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); + } + } +} diff --git a/app/src/main/java/com/mjsheng/myappstore/jpush/PushService.java b/app/src/main/java/com/mjsheng/myappstore/jpush/PushService.java new file mode 100644 index 0000000..1a5109b --- /dev/null +++ b/app/src/main/java/com/mjsheng/myappstore/jpush/PushService.java @@ -0,0 +1,7 @@ +package com.mjsheng.myappstore.jpush; + +import cn.jpush.android.service.JCommonService; + +public class PushService extends JCommonService { + +} diff --git a/app/src/main/java/com/mjsheng/myappstore/jpush/TagAliasOperatorHelper.java b/app/src/main/java/com/mjsheng/myappstore/jpush/TagAliasOperatorHelper.java new file mode 100644 index 0000000..bbf7b03 --- /dev/null +++ b/app/src/main/java/com/mjsheng/myappstore/jpush/TagAliasOperatorHelper.java @@ -0,0 +1,341 @@ +package com.mjsheng.myappstore.jpush; + +import android.content.Context; +import android.os.Handler; +import android.os.Message; +import android.util.Log; +import android.util.SparseArray; + +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("fht","Tag绑定成功"); + 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("fht","JPush绑定成功"); + 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/mjsheng/myappstore/network/HTTPInterface.java b/app/src/main/java/com/mjsheng/myappstore/network/HTTPInterface.java index fa77764..105404d 100644 --- a/app/src/main/java/com/mjsheng/myappstore/network/HTTPInterface.java +++ b/app/src/main/java/com/mjsheng/myappstore/network/HTTPInterface.java @@ -16,17 +16,24 @@ import com.alibaba.fastjson.JSONObject; import com.blankj.utilcode.util.LogUtils; import com.lzy.okgo.OkGo; import com.lzy.okgo.callback.StringCallback; +import com.mjsheng.myappstore.MyApplication; import com.mjsheng.myappstore.bean.UserInfo; +import com.mjsheng.myappstore.jpush.TagAliasOperatorHelper; import com.mjsheng.myappstore.utils.Configure; import com.mjsheng.myappstore.utils.SPUtils; import com.mjsheng.myappstore.utils.ToastUtil; import com.mjsheng.myappstore.utils.Utils; import java.util.Date; +import java.util.HashSet; +import java.util.Set; import okhttp3.Call; import okhttp3.Response; +import static com.mjsheng.myappstore.jpush.TagAliasOperatorHelper.ACTION_SET; +import static com.mjsheng.myappstore.jpush.TagAliasOperatorHelper.sequence; + public class HTTPInterface { private final static int requestCodeOK = 200; @@ -272,4 +279,61 @@ public class HTTPInterface { }); } + public static void setJpushTags(final Context context) { + OkGo.get(Configure.GET_DEVICES_TAGS) + .params("sn", Utils.getSerial()) + .execute(new StringCallback() { + @Override + public void onSuccess(String s, Call call, Response response) { + Log.e("fht", s); + com.alibaba.fastjson.JSONObject jsonObject = JSON.parseObject(s); + int code = jsonObject.getInteger("code"); + com.alibaba.fastjson.JSONObject data = jsonObject.getJSONObject("data"); + if (code == 200) { + String batch = data.getString("batch"); + if (batch != null && !batch.equals("")) { + Set set = new HashSet(); + set.add(batch); + TagAliasOperatorHelper.TagAliasBean tagAliasBean = new TagAliasOperatorHelper.TagAliasBean(); + tagAliasBean.action = ACTION_SET; + sequence++; +// tagAliasBean.alias = Utils.getSerial(); + tagAliasBean.tags = set; + tagAliasBean.isAliasAction = false; + TagAliasOperatorHelper.getInstance().handleAction(context, sequence, tagAliasBean); + } + } + } + + @Override + public void onError(Call call, Response response, Exception e) { + super.onError(call, response, e); + Log.e("fht", e.getMessage()); + } + }); + } + + public static void cleanJpushAlias(String alias) { + OkGo.post(Configure.DELETE_GEDEVICE_ALIAS) + .params("sn", alias) + .execute(new StringCallback() { + @Override + public void onSuccess(String s, Call call, Response response) { + String body = response.body().toString(); + if (body.equals("200")) { + Log.e("jiguangInterface", "alias清除成功"); + } else { + Log.e("jiguangInterface", "alias清除失败"); + } + } + + @Override + public void onError(Call call, Response response, Exception e) { + super.onError(call, response, e); + Log.e("fht", e.getMessage() + "???"); + } + }); + } + + } diff --git a/app/src/main/java/com/mjsheng/myappstore/receiver/MyJPushReceiver.java b/app/src/main/java/com/mjsheng/myappstore/receiver/MyJPushReceiver.java index 9ff801f..bf91002 100644 --- a/app/src/main/java/com/mjsheng/myappstore/receiver/MyJPushReceiver.java +++ b/app/src/main/java/com/mjsheng/myappstore/receiver/MyJPushReceiver.java @@ -511,6 +511,7 @@ public class MyJPushReceiver extends BroadcastReceiver { .setFilePath(PathUtils.getExternalDownloadsPath() + "/ygj/" + EncryptUtils.encryptMD5ToString("com.jiaoguanyi.store") + ".apk", true) .setExtendField("com.jiaoguanyi.store") .start(); //启动下载} + break; } } diff --git a/app/src/main/java/com/mjsheng/myappstore/server/InitJpushServer.java b/app/src/main/java/com/mjsheng/myappstore/server/InitJpushServer.java index 17b927b..1de7d68 100644 --- a/app/src/main/java/com/mjsheng/myappstore/server/InitJpushServer.java +++ b/app/src/main/java/com/mjsheng/myappstore/server/InitJpushServer.java @@ -28,6 +28,7 @@ import com.mjsheng.myappstore.bean.ForceDownloadData; import com.mjsheng.myappstore.bean.NetAndLaunchBean; import com.mjsheng.myappstore.bean.NetAndLaunchData; import com.mjsheng.myappstore.comm.CommonDatas; +import com.mjsheng.myappstore.jpush.TagAliasOperatorHelper; import com.mjsheng.myappstore.network.HTTPInterface; import com.mjsheng.myappstore.network.Network; import com.mjsheng.myappstore.network.api.AppLimitApi; @@ -63,6 +64,9 @@ import okhttp3.ResponseBody; import rx.Observable; import rx.functions.Action1; +import static com.mjsheng.myappstore.jpush.TagAliasOperatorHelper.ACTION_SET; +import static com.mjsheng.myappstore.jpush.TagAliasOperatorHelper.sequence; + /** * 作者 mjsheng * 日期 2019/3/23 16:26 @@ -94,85 +98,39 @@ public class InitJpushServer extends Service { return super.onStartCommand(intent, flags, startId); } - private void setJpushTags() { - OkGo.get(Configure.GET_DEVICES_TAGS) - .params("sn", Utils.getSerial()) - .execute(new StringCallback() { - @Override - public void onSuccess(String s, Call call, Response response) { - Log.e("fht", s); - com.alibaba.fastjson.JSONObject jsonObject = JSON.parseObject(s); - int code = jsonObject.getInteger("code"); - com.alibaba.fastjson.JSONObject data = jsonObject.getJSONObject("data"); - if (code == 200) { - String batch = data.getString("batch"); - if (batch != null && !batch.equals("")) { - Set set = new HashSet(); - set.add(batch); - JPushInterface.setTags(InitJpushServer.this, set, new TagAliasCallback() { - @Override - public void gotResult(int i, String s, Set set) { - if (set == null) { - Log.e("initmjsheng", "set is null"); - } else { - Log.e("initmjsheng", "set ---" + set.toString()); - } - Log.e("JPushInterface", s + "---" + i + "---"); - if (i == 0) { - Log.e("JPushInterface", "Tag绑定成功"); - } else if (i == 6001) { - Log.e("JPushInterface", "无效的设置,用户名为空"); - } else if (i == 6002) { - Log.e("JPushInterface", "设置超时,请重试"); - timerImitate(); - } else if (i == 6011) { - Log.e("JPushInterface", "短时间内操作过于频繁"); - } else if (i == 996) { - Log.e("JPushInterface", "网络连接断开"); - timerImitate(); - } - } - }); - } - } - } - - @Override - public void onError(Call call, Response response, Exception e) { - super.onError(call, response, e); - Log.e("fht", e.getMessage()); - } - }); - } private void initJpush() { - - JPushInterface.setAlias(this, Utils.getSerial(), new TagAliasCallback() { - @Override - public void gotResult(int i, String s, Set set) { - if (set == null) { - Log.e("initmjsheng", "set is null"); - } else { - Log.e("initmjsheng", "set ---" + set.toString()); - } - Log.e("JPushInterface", s + "---" + i + "---"); - if (i == 0) { - Log.e("JPushInterface", "JPush绑定成功"); - getNetworkState(); - sendMACaddress(); - } else if (i == 6001) { - Log.e("JPushInterface", "无效的设置,用户名为空"); - } else if (i == 6002) { - Log.e("JPushInterface", "设置超时,请重试"); - timerImitate(); - } else if (i == 6011) { - Log.e("JPushInterface", "短时间内操作过于频繁"); - } else if (i == 996) { - Log.e("JPushInterface", "网络连接断开"); - timerImitate(); - } - } - }); + TagAliasOperatorHelper.TagAliasBean tagAliasBean = new TagAliasOperatorHelper.TagAliasBean(); + tagAliasBean.action = ACTION_SET; + sequence++; + tagAliasBean.alias = Utils.getSerial(); + tagAliasBean.isAliasAction = true; + TagAliasOperatorHelper.getInstance().handleAction(getApplicationContext(), sequence, tagAliasBean); +// JPushInterface.setAlias(this, Utils.getSerial(), new TagAliasCallback() { +// @Override +// public void gotResult(int i, String s, Set set) { +// if (set == null) { +// Log.e("initmjsheng", "set is null"); +// } else { +// Log.e("initmjsheng", "set ---" + set.toString()); +// } +// Log.e("JPushInterface", s + "---" + i + "---"); +// if (i == 0) { +// Log.e("JPushInterface", "JPush绑定成功"); +// +// } else if (i == 6001) { +// Log.e("JPushInterface", "无效的设置,用户名为空"); +// } else if (i == 6002) { +// Log.e("JPushInterface", "设置超时,请重试"); +// timerImitate(); +// } else if (i == 6011) { +// Log.e("JPushInterface", "短时间内操作过于频繁"); +// } else if (i == 996) { +// Log.e("JPushInterface", "网络连接断开"); +// timerImitate(); +// } +// } +// }); } @@ -186,7 +144,10 @@ public class InitJpushServer extends Service { public void call(Long aLong) { Log.e("JPushInterface", "JPushInterface重新加载"); initJpush(); - setJpushTags(); + HTTPInterface.setJpushTags(InitJpushServer.this); + checkUpdate(); + getNetworkState(); + sendMACaddress(); } }); } @@ -470,10 +431,10 @@ public class InitJpushServer extends Service { private void getSelfDownload(List forceDownloadDataList) { for (ForceDownloadData forceDownloadData : forceDownloadDataList) { - if ("com.mjsheng.myappstore".equals(forceDownloadData.getApp_package())) { + if ("com.jiaoguanyi.appstore".equals(forceDownloadData.getApp_package())) { Aria.download(this) .load(forceDownloadData.getApp_url()) //读取下载地址 - .setDownloadPath(PathUtils.getExternalDownloadsPath() + "/ygj/" + EncryptUtils.encryptMD5ToString("com.mjsheng.myappstore") + ".apk") + .setDownloadPath(PathUtils.getExternalDownloadsPath() + "/ygj/" + EncryptUtils.encryptMD5ToString("com.jiaoguanyi.appstore") + ".apk") .setExtendField("com.mjsheng.myappstore") .start(); //启动下载} } else { @@ -733,7 +694,6 @@ public class InitJpushServer extends Service { // getForceDownload(); getSystemSetting();//从后台获取功能状态 resetDevice(); - checkUpdate(); } } } diff --git a/app/src/main/java/com/mjsheng/myappstore/utils/ApkUtils.java b/app/src/main/java/com/mjsheng/myappstore/utils/ApkUtils.java index 0f56c6b..82409ae 100644 --- a/app/src/main/java/com/mjsheng/myappstore/utils/ApkUtils.java +++ b/app/src/main/java/com/mjsheng/myappstore/utils/ApkUtils.java @@ -349,9 +349,9 @@ public class ApkUtils { Log.e("result", "" + errorMsg.toString()); //如果含有“success”认为安装成功 Log.e("installApp", successMsg.toString()); - if (!successMsg.toString().equalsIgnoreCase("success")) { - ApkUtils.install(context, new File(apkPath)); - } +// if (!successMsg.toString().equalsIgnoreCase("success")) { +// ApkUtils.install(context, new File(apkPath)); +// } return successMsg.toString().equalsIgnoreCase("success"); } diff --git a/app/src/main/java/com/mjsheng/myappstore/utils/Configure.java b/app/src/main/java/com/mjsheng/myappstore/utils/Configure.java index f5469a2..2eb9bbf 100644 --- a/app/src/main/java/com/mjsheng/myappstore/utils/Configure.java +++ b/app/src/main/java/com/mjsheng/myappstore/utils/Configure.java @@ -182,12 +182,14 @@ public class Configure { public static final String HTTP_TAG_FIRST = HTTP_TAG_HEAD_NEW + "lock/index"; - public static final String SEND_DEVICES= HTTP_TAG_HEAD_NEW + "Mac/getMac"; + public static final String SEND_DEVICES = HTTP_TAG_HEAD_NEW + "Mac/getMac"; - public static final String SEND_USEDTIME= HTTP_TAG_HEAD_NEW + "Applog/getAppLog"; + public static final String SEND_USEDTIME = HTTP_TAG_HEAD_NEW + "Applog/getAppLog"; - public static final String CHECK_UPDATE= HTTP_TAG_HEAD_NEW + "Silent/silent"; + public static final String CHECK_UPDATE = HTTP_TAG_HEAD_NEW + "Silent/silent"; //更新接口 - public static final String GET_DEVICES_TAGS= HTTP_TAG_HEAD_NEW + "Sn/getSnTag"; + public static final String GET_DEVICES_TAGS = HTTP_TAG_HEAD_NEW + "Sn/getSnTag"; + //获取设备标签 + public static final String DELETE_GEDEVICE_ALIAS = HTTP_TAG_HEAD_NEW + "Sn/deleteAliases"; }