diff --git a/AndroidManifest-common.xml b/AndroidManifest-common.xml index 2a25658..cb9d48e 100644 --- a/AndroidManifest-common.xml +++ b/AndroidManifest-common.xml @@ -19,6 +19,7 @@ --> @@ -209,5 +210,149 @@ android:writePermission="android.permission.WRITE_SECURE_SETTINGS" android:exported="true" android:enabled="false" /> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/build.gradle b/build.gradle index 54e9893..1cb719b 100644 --- a/build.gradle +++ b/build.gradle @@ -28,6 +28,16 @@ android { targetSdkVersion 28 versionCode 32 versionName "1.3.2" + ndk { + //选择要添加的对应 cpu 类型的 .so 库。 + abiFilters 'armeabi', 'armeabi-v7a', 'arm64-v8a' + // 还可以添加 'x86', 'x86_64', 'mips', 'mips64' + } + manifestPlaceholders = [ + JPUSH_PKGNAME : "com.android.uiuios", + JPUSH_APPKEY : "7d1fa30dc98e1637ba79c6f0", //JPush 上注册的包名对应的 Appkey. + JPUSH_CHANNEL : "developer-default", //暂时填写默认值即可. + ] testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" vectorDrawables.useSupportLibrary = true @@ -185,6 +195,7 @@ repositories { maven { url "../../../prebuilts/fullsdk-linux/extras/android/m2repository" } mavenCentral() google() + jcenter() } dependencies { @@ -218,6 +229,10 @@ dependencies { implementation 'com.squareup.retrofit2:retrofit:2.3.0' implementation 'com.squareup.retrofit2:converter-gson:2.3.0' implementation 'com.squareup.retrofit2:adapter-rxjava2:2.3.0' + + //极光推送 + implementation 'cn.jiguang.sdk:jpush:3.8.6' // 此处以JPush 3.8.6 版本为例。 + implementation 'cn.jiguang.sdk:jcore:2.6.0' // 此处以JCore 2.6.0 版本为例。 } protobuf { diff --git a/src/com/android/uiuios/Launcher.java b/src/com/android/uiuios/Launcher.java index eba381d..cc75c35 100644 --- a/src/com/android/uiuios/Launcher.java +++ b/src/com/android/uiuios/Launcher.java @@ -27,10 +27,10 @@ import static com.android.uiuios.LauncherState.NORMAL; import static com.android.uiuios.LauncherState.OVERVIEW; import static com.android.uiuios.LauncherState.OVERVIEW_PEEK; import static com.android.uiuios.dragndrop.DragLayer.ALPHA_INDEX_LAUNCHER_LOAD; +import static com.android.uiuios.jpush.TagAliasOperatorHelper.ACTION_SET; import static com.android.uiuios.logging.LoggerUtils.newContainerTarget; import static com.android.uiuios.logging.LoggerUtils.newTarget; import static com.android.uiuios.states.RotationHelper.REQUEST_NONE; -import static com.android.uiuios.touch.ItemClickHandler.getInfoFromPackageName; import static com.android.uiuios.util.RaceConditionTracker.ENTER; import static com.android.uiuios.util.RaceConditionTracker.EXIT; @@ -68,7 +68,6 @@ import android.os.Parcelable; import android.os.Process; import android.os.StrictMode; import android.text.TextUtils; -import android.text.format.DateUtils; import android.text.method.TextKeyListener; import android.util.Log; import android.util.SparseArray; @@ -85,8 +84,6 @@ import android.view.animation.OvershootInterpolator; import android.widget.Toast; import com.android.uiuios.DropTarget.DragObject; -import com.android.uiuios.Statistics.AppInformation; -import com.android.uiuios.TTUtils.APKUtils; import com.android.uiuios.TTUtils.Utils; import com.android.uiuios.accessibility.LauncherAccessibilityDelegate; import com.android.uiuios.allapps.AllAppsContainerView; @@ -106,6 +103,9 @@ import com.android.uiuios.folder.FolderIcon; import com.android.uiuios.folder.FolderIconPreviewVerifier; import com.android.uiuios.graphics.RotationMode; import com.android.uiuios.icons.IconCache; +import com.android.uiuios.jpush.ExampleUtil; +import com.android.uiuios.jpush.LocalBroadcastManager; +import com.android.uiuios.jpush.TagAliasOperatorHelper; import com.android.uiuios.keyboard.CustomActionsPopup; import com.android.uiuios.keyboard.ViewGroupFocusHelper; import com.android.uiuios.logging.FileLog; @@ -116,7 +116,7 @@ import com.android.uiuios.model.AppLaunchTracker; import com.android.uiuios.model.ModelWriter; import com.android.uiuios.network.BaseResponse; import com.android.uiuios.network.NetWorkManager; -import com.android.uiuios.network.api.addAppLog; +import com.android.uiuios.network.api.AddAppLog; import com.android.uiuios.notification.NotificationListener; import com.android.uiuios.pageindicators.PageIndicatorDots; import com.android.uiuios.popup.PopupContainerWithArrow; @@ -164,20 +164,22 @@ import java.io.FileDescriptor; import java.io.IOException; import java.io.PrintWriter; import java.util.ArrayList; -import java.util.Arrays; import java.util.Collection; import java.util.HashMap; import java.util.HashSet; import java.util.List; +import java.util.Random; import java.util.function.Predicate; import androidx.annotation.Nullable; +import cn.jpush.android.api.JPushInterface; import io.reactivex.Observer; import io.reactivex.android.schedulers.AndroidSchedulers; import io.reactivex.disposables.Disposable; import io.reactivex.schedulers.Schedulers; +import static com.android.uiuios.jpush.TagAliasOperatorHelper.sequence; /** * Default launcher application. */ @@ -315,6 +317,8 @@ public class Launcher extends BaseDraggingActivity implements LauncherExterns, private DeviceProfile mStableDeviceProfile; private RotationMode mRotationMode = RotationMode.NORMAL; + public static boolean isForeground = false; + @Override protected void onCreate(Bundle savedInstanceState) { RaceConditionTracker.onEvent(ON_CREATE_EVT, ENTER); @@ -445,6 +449,53 @@ public class Launcher extends BaseDraggingActivity implements LauncherExterns, } } }); + registerMessageReceiver(); // used for receive msg + JPushInterface.init(this); + TagAliasOperatorHelper.TagAliasBean tagAliasBean = new TagAliasOperatorHelper.TagAliasBean(); + tagAliasBean.action = ACTION_SET; + sequence++; + tagAliasBean.alias = Utils.getSerial(); + tagAliasBean.isAliasAction = true; + TagAliasOperatorHelper.getInstance().handleAction(this, sequence, tagAliasBean); + String rid = JPushInterface.getRegistrationID(this); + if (!TextUtils.isEmpty(rid)) { + Log.e("setJpushAlias", "RegId:" + rid); + } + JPushInterface.getAlias(this, new Random().nextInt(100)); + } + + //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"); + } + } + } catch (Exception e){ + } + } } private void SetWallPaper() { @@ -1076,7 +1127,7 @@ public class Launcher extends BaseDraggingActivity implements LauncherExterns, } else { appVersionCode = appInfo.versionCode; } - addAppLog appLog = NetWorkManager.getapplogControl(); + AddAppLog appLog = NetWorkManager.getInstance().getapplogControl(); String sn = Utils.getSerial(); appLog.addLog(sn, packageName, appVersionCode, System.currentTimeMillis() / 1000, 2) .subscribeOn(Schedulers.io()) @@ -1177,6 +1228,10 @@ public class Launcher extends BaseDraggingActivity implements LauncherExterns, TraceHelper.endSection("ON_RESUME"); RaceConditionTracker.onEvent(ON_RESUME_EVT, EXIT); + isForeground = true; + MyApplication.getInstance().setAppPackageName(BuildConfig.APPLICATION_ID); + MyApplication.getInstance().setOnClickTime(System.currentTimeMillis()); + } @Override @@ -1191,6 +1246,7 @@ public class Launcher extends BaseDraggingActivity implements LauncherExterns, if (mLauncherCallbacks != null) { mLauncherCallbacks.onPause(); } + isForeground = false; } @Override @@ -1699,6 +1755,7 @@ public class Launcher extends BaseDraggingActivity implements LauncherExterns, if (mLauncherCallbacks != null) { mLauncherCallbacks.onDestroy(); } + LocalBroadcastManager.getInstance(this).unregisterReceiver(mMessageReceiver); } public LauncherAccessibilityDelegate getAccessibilityDelegate() { diff --git a/src/com/android/uiuios/MyApplication.java b/src/com/android/uiuios/MyApplication.java index 9fb1a06..70d9a23 100644 --- a/src/com/android/uiuios/MyApplication.java +++ b/src/com/android/uiuios/MyApplication.java @@ -3,6 +3,10 @@ package com.android.uiuios; import android.app.Application; import android.content.Context; +import com.android.uiuios.network.NetWorkManager; + +import cn.jpush.android.api.JPushInterface; + public class MyApplication extends Application { private static MyApplication app; @@ -14,7 +18,13 @@ public class MyApplication extends Application { public void onCreate() { super.onCreate(); app = this; + initJPush(); + NetWorkManager.init(this); + } + private void initJPush(){ + JPushInterface.setDebugMode(BuildConfig.DEBUG); // 设置开启日志,发布时请关闭日志 + JPushInterface.init(this); } private String appPackageName; diff --git a/src/com/android/uiuios/TTUtils/APKUtils.java b/src/com/android/uiuios/TTUtils/APKUtils.java index 585db06..64d2556 100644 --- a/src/com/android/uiuios/TTUtils/APKUtils.java +++ b/src/com/android/uiuios/TTUtils/APKUtils.java @@ -4,6 +4,7 @@ import android.content.Context; import android.content.pm.ApplicationInfo; import android.content.pm.PackageInfo; import android.content.pm.PackageManager; +import android.text.TextUtils; import android.util.Log; public class APKUtils { @@ -28,4 +29,23 @@ public class APKUtils { } return isSystemApp; } + + //获取教管易版本号 + public static String getAPPVersionName(Context context, String packageName) { + String versionName = "0"; + + if (TextUtils.isEmpty(packageName)) { + return versionName; + } + PackageManager pm = context.getPackageManager(); + try { + PackageInfo packageInfo = pm.getPackageInfo(packageName, 0); + versionName = packageInfo.versionName; + } catch (PackageManager.NameNotFoundException e) { + e.printStackTrace(); + } + return versionName; + } + + } diff --git a/src/com/android/uiuios/jpush/ExampleApplication.java b/src/com/android/uiuios/jpush/ExampleApplication.java new file mode 100644 index 0000000..d80860a --- /dev/null +++ b/src/com/android/uiuios/jpush/ExampleApplication.java @@ -0,0 +1,22 @@ +package com.android.uiuios.jpush; + +import android.app.Application; +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/src/com/android/uiuios/jpush/ExampleUtil.java b/src/com/android/uiuios/jpush/ExampleUtil.java new file mode 100644 index 0000000..d052cfb --- /dev/null +++ b/src/com/android/uiuios/jpush/ExampleUtil.java @@ -0,0 +1,133 @@ +package com.android.uiuios.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 android.widget.Toast; + +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/src/com/android/uiuios/jpush/LocalBroadcastManager.java b/src/com/android/uiuios/jpush/LocalBroadcastManager.java new file mode 100644 index 0000000..d462e30 --- /dev/null +++ b/src/com/android/uiuios/jpush/LocalBroadcastManager.java @@ -0,0 +1,263 @@ +package com.android.uiuios.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/src/com/android/uiuios/jpush/Logger.java b/src/com/android/uiuios/jpush/Logger.java new file mode 100644 index 0000000..cc79a1e --- /dev/null +++ b/src/com/android/uiuios/jpush/Logger.java @@ -0,0 +1,40 @@ +package com.android.uiuios.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.e(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/src/com/android/uiuios/jpush/MyReceiver.java b/src/com/android/uiuios/jpush/MyReceiver.java new file mode 100644 index 0000000..b465da8 --- /dev/null +++ b/src/com/android/uiuios/jpush/MyReceiver.java @@ -0,0 +1,182 @@ +package com.android.uiuios.jpush; + +import android.content.BroadcastReceiver; +import android.content.Context; +import android.content.Intent; +import android.os.Bundle; +import android.text.TextUtils; + +import com.android.uiuios.Launcher; +import com.android.uiuios.MyApplication; +import com.android.uiuios.TTUtils.APKUtils; +import com.android.uiuios.network.BaseResponse; +import com.android.uiuios.network.NetWorkManager; +import com.google.gson.Gson; +import com.google.gson.JsonObject; + +import org.json.JSONException; +import org.json.JSONObject; + +import java.util.Iterator; + +import cn.jpush.android.api.JPushInterface; +import io.reactivex.Observer; +import io.reactivex.disposables.Disposable; + +/** + * 自定义接收器 + *

+ * 如果不定义这个 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_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(); + } + + private static final String SEND_RUNNING_APP = "2"; + + //send msg to MainActivity + private void processCustomMessage(Context context, Bundle bundle) { +// if (Launcher.isForeground) { +// String message = bundle.getString(JPushInterface.EXTRA_MESSAGE); +// String extras = bundle.getString(JPushInterface.EXTRA_EXTRA); +// Intent msgIntent = new Intent(Launcher.MESSAGE_RECEIVED_ACTION); +// msgIntent.putExtra(Launcher.KEY_MESSAGE, message); +// if (!ExampleUtil.isEmpty(extras)) { +// try { +// JSONObject extraJson = new JSONObject(extras); +// if (extraJson.length() > 0) { +// msgIntent.putExtra(Launcher.KEY_EXTRAS, extras); +// } +// } catch (JSONException e) { +// +// } +// +// } +// LocalBroadcastManager.getInstance(context).sendBroadcast(msgIntent); +// } + + 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); + + switch (message) { + case SEND_RUNNING_APP: + sendRunningApp(context); + break; + default: + break; + } + + + } + + private void sendRunningApp(Context context) { + String packageName = MyApplication.getInstance().getAppPackageName(); + long time = MyApplication.getInstance().getOnClickTime(); + JsonObject jsonObject = new JsonObject(); + jsonObject.addProperty("app_package", packageName); + jsonObject.addProperty("version_name", APKUtils.getAPPVersionName(context,packageName)); + jsonObject.addProperty("start_time", time); + String jsonString = jsonObject.toString(); + NetWorkManager.getInstance().getRunningAppObservable(jsonString) + .subscribe(new Observer() { + @Override + public void onSubscribe(Disposable d) { + + } + + @Override + public void onNext(BaseResponse baseResponse) { + + } + + @Override + public void onError(Throwable e) { + + } + + @Override + public void onComplete() { + + } + }); + } +} diff --git a/src/com/android/uiuios/jpush/PushMessageReceiver.java b/src/com/android/uiuios/jpush/PushMessageReceiver.java new file mode 100644 index 0000000..0d36417 --- /dev/null +++ b/src/com/android/uiuios/jpush/PushMessageReceiver.java @@ -0,0 +1,143 @@ +package com.android.uiuios.jpush; + +import android.content.Context; +import android.content.Intent; +import android.os.Bundle; +import android.util.Log; + +import com.android.uiuios.Launcher; + +import org.json.JSONException; +import org.json.JSONObject; + +import cn.jpush.android.api.CmdMessage; +import cn.jpush.android.api.CustomMessage; +import cn.jpush.android.api.JPushInterface; +import cn.jpush.android.api.JPushMessage; +import cn.jpush.android.api.NotificationMessage; +import cn.jpush.android.service.JPushMessageReceiver; + +public class PushMessageReceiver extends JPushMessageReceiver{ + private static final String TAG = "PushMessageReceiver"; + @Override + public void onMessage(Context context, CustomMessage customMessage) { + Log.e(TAG,"[onMessage] "+customMessage); + super.onMessage(context,customMessage); +// processCustomMessage(context,customMessage); + } + + @Override + public void onNotifyMessageOpened(Context context, NotificationMessage message) { + Log.e(TAG,"[onNotifyMessageOpened] "+message); + try{ + //打开自定义的Activity + Intent i = new Intent(context, TestActivity.class); + Bundle bundle = new Bundle(); + bundle.putString(JPushInterface.EXTRA_NOTIFICATION_TITLE,message.notificationTitle); + bundle.putString(JPushInterface.EXTRA_ALERT,message.notificationContent); + 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); + }catch (Throwable throwable){ + + } + } + + @Override + public void onMultiActionClicked(Context context, Intent intent) { + Log.e(TAG, "[onMultiActionClicked] 用户点击了通知栏按钮"); + String nActionExtra = intent.getExtras().getString(JPushInterface.EXTRA_NOTIFICATION_ACTION_EXTRA); + + //开发者根据不同 Action 携带的 extra 字段来分配不同的动作。 + if(nActionExtra==null){ + Log.d(TAG,"ACTION_NOTIFICATION_CLICK_ACTION nActionExtra is null"); + return; + } + if (nActionExtra.equals("my_extra1")) { + Log.e(TAG, "[onMultiActionClicked] 用户点击通知栏按钮一"); + } else if (nActionExtra.equals("my_extra2")) { + Log.e(TAG, "[onMultiActionClicked] 用户点击通知栏按钮二"); + } else if (nActionExtra.equals("my_extra3")) { + Log.e(TAG, "[onMultiActionClicked] 用户点击通知栏按钮三"); + } else { + Log.e(TAG, "[onMultiActionClicked] 用户点击通知栏按钮未定义"); + } + } + + @Override + public void onNotifyMessageArrived(Context context, NotificationMessage message) { + Log.e(TAG,"[onNotifyMessageArrived] "+message); + } + + @Override + public void onNotifyMessageDismiss(Context context, NotificationMessage message) { + Log.e(TAG,"[onNotifyMessageDismiss] "+message); + } + + @Override + public void onRegister(Context context, String registrationId) { + Log.e(TAG,"[onRegister] "+registrationId); + } + + @Override + public void onConnected(Context context, boolean isConnected) { + Log.e(TAG,"[onConnected] "+isConnected); + } + + @Override + public void onCommandResult(Context context, CmdMessage cmdMessage) { + Log.e(TAG,"[onCommandResult] "+cmdMessage); + } + + @Override + public void onTagOperatorResult(Context context,JPushMessage jPushMessage) { + TagAliasOperatorHelper.getInstance().onTagOperatorResult(context,jPushMessage); + super.onTagOperatorResult(context, 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); + } + + @Override + public void onMobileNumberOperatorResult(Context context, JPushMessage jPushMessage) { + TagAliasOperatorHelper.getInstance().onMobileNumberOperatorResult(context,jPushMessage); + super.onMobileNumberOperatorResult(context, jPushMessage); + } + + //send msg to MainActivity + private void processCustomMessage(Context context, CustomMessage customMessage) { + if (Launcher.isForeground) { + String message = customMessage.message; + String extras = customMessage.extra; + Intent msgIntent = new Intent(Launcher.MESSAGE_RECEIVED_ACTION); + msgIntent.putExtra(Launcher.KEY_MESSAGE, message); + if (!ExampleUtil.isEmpty(extras)) { + try { + JSONObject extraJson = new JSONObject(extras); + if (extraJson.length() > 0) { + msgIntent.putExtra(Launcher.KEY_EXTRAS, extras); + } + } catch (JSONException e) { + + } + + } + LocalBroadcastManager.getInstance(context).sendBroadcast(msgIntent); + } + } + + @Override + public void onNotificationSettingsCheck(Context context, boolean isOn, int source) { + super.onNotificationSettingsCheck(context, isOn, source); + Log.e(TAG,"[onNotificationSettingsCheck] isOn:"+isOn+",source:"+source); + } + +} diff --git a/src/com/android/uiuios/jpush/PushService.java b/src/com/android/uiuios/jpush/PushService.java new file mode 100644 index 0000000..3722aea --- /dev/null +++ b/src/com/android/uiuios/jpush/PushService.java @@ -0,0 +1,8 @@ +package com.android.uiuios.jpush; + + +import cn.jpush.android.service.JCommonService; + +public class PushService extends JCommonService { + +} diff --git a/src/com/android/uiuios/jpush/TagAliasOperatorHelper.java b/src/com/android/uiuios/jpush/TagAliasOperatorHelper.java new file mode 100644 index 0000000..fd4eefc --- /dev/null +++ b/src/com/android/uiuios/jpush/TagAliasOperatorHelper.java @@ -0,0 +1,338 @@ +package com.android.uiuios.jpush; + +import android.content.Context; +import android.os.Handler; +import android.os.Message; +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); + 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); + 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; + 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/src/com/android/uiuios/jpush/TestActivity.java b/src/com/android/uiuios/jpush/TestActivity.java new file mode 100644 index 0000000..c1781a5 --- /dev/null +++ b/src/com/android/uiuios/jpush/TestActivity.java @@ -0,0 +1,32 @@ +package com.android.uiuios.jpush; + +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/src/com/android/uiuios/network/BaseResponse.java b/src/com/android/uiuios/network/BaseResponse.java index ec7ee97..76ff69d 100644 --- a/src/com/android/uiuios/network/BaseResponse.java +++ b/src/com/android/uiuios/network/BaseResponse.java @@ -13,13 +13,10 @@ public class BaseResponse implements Serializable { public String msg; public T data; + @NonNull @Override public String toString() { - return "{\n" +// - "\tcode=" + code + "\n" +// - "\tmsg='" + msg + "\'\n" +// - "\tdata=" + data + "\n" +// - '}'; + return "{" + "code:" + code + "," + "msg:" + msg + "," + "data:" + data + "," + '}'; } } \ No newline at end of file diff --git a/src/com/android/uiuios/network/NetWorkManager.java b/src/com/android/uiuios/network/NetWorkManager.java index 449cf04..c65f98e 100644 --- a/src/com/android/uiuios/network/NetWorkManager.java +++ b/src/com/android/uiuios/network/NetWorkManager.java @@ -1,12 +1,18 @@ package com.android.uiuios.network; +import android.content.Context; import android.os.Environment; -import com.android.uiuios.network.api.addAppLog; +import com.android.uiuios.TTUtils.Utils; +import com.android.uiuios.network.api.AddAppLog; +import com.android.uiuios.network.api.RunningApp; import java.io.File; import java.util.concurrent.TimeUnit; +import io.reactivex.Observable; +import io.reactivex.android.schedulers.AndroidSchedulers; +import io.reactivex.schedulers.Schedulers; import okhttp3.Cache; import okhttp3.OkHttpClient; import retrofit2.CallAdapter; @@ -16,40 +22,69 @@ import retrofit2.adapter.rxjava2.RxJava2CallAdapterFactory; import retrofit2.converter.gson.GsonConverterFactory; public class NetWorkManager { + private static NetWorkManager sInstance; + private Context mContext; + private static Retrofit mRetrofit; + + private NetWorkManager(Context context) { + this.mContext = context; + if (null == mRetrofit) { + mRetrofit = new Retrofit.Builder() + .client(okHttpClient) + .baseUrl(ROOT_URL) + .addConverterFactory(gsonConverterFactory) + .addCallAdapterFactory(rxJavaCallAdapterFactory) + .build(); + } + } + + public static void init(Context context) { + if (sInstance == null) { + sInstance = new NetWorkManager(context); + } + + } + + public static NetWorkManager getInstance() { + if (sInstance == null) { + throw new IllegalStateException("You must be init NetworkManager first"); + } + return sInstance; + } private static final String ROOT_URL = URLPath.ROOT_URL; - private static final long cacheSize = 1024 * 1024 * 20;// 缓存文件最大限制大小20M + private static final long CACHE_SIZE = 1024 * 1024 * 32;// 缓存文件最大限制大小20M private static String cacheDirectory = Environment.getExternalStorageDirectory() + "/okttpcaches"; // 设置缓存文件路径 - private static Cache cache = new Cache(new File(cacheDirectory), cacheSize); // - private static final OkHttpClient client; + private static Cache cache = new Cache(new File(cacheDirectory), CACHE_SIZE); // + private static final OkHttpClient okHttpClient; + private static final int TIME_OUT = 5; static { //如果无法生存缓存文件目录,检测权限使用已经加上,检测手机是否把文件读写权限禁止了 OkHttpClient.Builder builder = new OkHttpClient.Builder(); - builder.connectTimeout(8, TimeUnit.SECONDS); // 设置连接超时时间 - builder.writeTimeout(8, TimeUnit.SECONDS);// 设置写入超时时间 - builder.readTimeout(8, TimeUnit.SECONDS);// 设置读取数据超时时间 + builder.connectTimeout(TIME_OUT, TimeUnit.SECONDS); // 设置连接超时时间 + builder.writeTimeout(TIME_OUT, TimeUnit.SECONDS);// 设置写入超时时间 + builder.readTimeout(TIME_OUT, TimeUnit.SECONDS);// 设置读取数据超时时间 builder.retryOnConnectionFailure(true);// 设置进行连接失败重试 builder.cache(cache);// 设置缓存 - client = builder.build(); + okHttpClient = builder.build(); } private static CallAdapter.Factory rxJavaCallAdapterFactory = RxJava2CallAdapterFactory.create(); private static Converter.Factory gsonConverterFactory = GsonConverterFactory.create(); - private static addAppLog applogControl; - public static addAppLog getapplogControl() { - if (null == applogControl) { - Retrofit retrofit = new Retrofit.Builder() - .client(client) - .baseUrl(ROOT_URL) - .addConverterFactory(gsonConverterFactory) - .addCallAdapterFactory(rxJavaCallAdapterFactory) - .build(); - applogControl = retrofit.create(addAppLog.class); - } - return applogControl; + public AddAppLog getapplogControl() { + return mRetrofit.create(AddAppLog.class); } + + public Observable getRunningAppObservable(String json) { + return mRetrofit.create(RunningApp.class) + .sendAppInfo(Utils.getSerial(),json) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()); + } + + } diff --git a/src/com/android/uiuios/network/URLPath.java b/src/com/android/uiuios/network/URLPath.java index 3ecfb3c..d143ccd 100644 --- a/src/com/android/uiuios/network/URLPath.java +++ b/src/com/android/uiuios/network/URLPath.java @@ -1,6 +1,7 @@ package com.android.uiuios.network; public class URLPath { - public static final String ROOT_URL = "http://homework.uiuios.com/android/app/"; - public static final String APP_LOG = ROOT_URL+"addAppLog"; + public static final String ROOT_URL = "http://homework.uiuios.com/android/"; + public static final String APP_LOG = "app/addAppLog"; + public static final String RUN_NEW_APP = "app/runNewApp"; } diff --git a/src/com/android/uiuios/network/api/addAppLog.java b/src/com/android/uiuios/network/api/AddAppLog.java similarity index 95% rename from src/com/android/uiuios/network/api/addAppLog.java rename to src/com/android/uiuios/network/api/AddAppLog.java index ade1f70..873e7bd 100644 --- a/src/com/android/uiuios/network/api/addAppLog.java +++ b/src/com/android/uiuios/network/api/AddAppLog.java @@ -8,7 +8,7 @@ import retrofit2.http.Field; import retrofit2.http.FormUrlEncoded; import retrofit2.http.POST; -public interface addAppLog { +public interface AddAppLog { @FormUrlEncoded @POST(URLPath.APP_LOG) Observable addLog( diff --git a/src/com/android/uiuios/network/api/RunningApp.java b/src/com/android/uiuios/network/api/RunningApp.java new file mode 100644 index 0000000..9a174e9 --- /dev/null +++ b/src/com/android/uiuios/network/api/RunningApp.java @@ -0,0 +1,18 @@ +package com.android.uiuios.network.api; + +import com.android.uiuios.network.BaseResponse; +import com.android.uiuios.network.URLPath; + +import io.reactivex.Observable; +import retrofit2.http.Field; +import retrofit2.http.FormUrlEncoded; +import retrofit2.http.POST; + +public interface RunningApp { + @FormUrlEncoded + @POST(URLPath.RUN_NEW_APP) + Observable sendAppInfo( + @Field("sn") String sn, + @Field("app") String app + ); +} diff --git a/src/com/android/uiuios/touch/ItemClickHandler.java b/src/com/android/uiuios/touch/ItemClickHandler.java index 6d53368..47f3e15 100644 --- a/src/com/android/uiuios/touch/ItemClickHandler.java +++ b/src/com/android/uiuios/touch/ItemClickHandler.java @@ -60,7 +60,7 @@ import com.android.uiuios.folder.Folder; import com.android.uiuios.folder.FolderIcon; import com.android.uiuios.network.BaseResponse; import com.android.uiuios.network.NetWorkManager; -import com.android.uiuios.network.api.addAppLog; +import com.android.uiuios.network.api.AddAppLog; import com.android.uiuios.testing.TestProtocol; import com.android.uiuios.util.PackageManagerHelper; import com.android.uiuios.views.FloatingIconView; @@ -138,7 +138,7 @@ public class ItemClickHandler { // HTTPInterface.sendTimeLog(handler, userInfo, ((ShortcutInfo) tag).title.toString(), 1, 0); SendOpenApp(packageName); } - + //写入正在运行的app的包名和时间 MyApplication.getInstance().setAppPackageName(packageName); MyApplication.getInstance().setOnClickTime(System.currentTimeMillis()); } else if (tag instanceof FolderInfo) { @@ -199,7 +199,7 @@ public class ItemClickHandler { } else { appVersionCode = appInfo.versionCode; } - addAppLog appLog = NetWorkManager.getapplogControl(); + AddAppLog appLog = NetWorkManager.getInstance().getapplogControl(); String sn = Utils.getSerial(); appLog.addLog(sn, packageName, appVersionCode, System.currentTimeMillis()/1000, 1) .subscribeOn(Schedulers.io())