Compare commits
9 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 62efcef486 | |||
| 0e10b3e50f | |||
| 1c05b322e4 | |||
| 9a6bbc7e43 | |||
| 3f0347c2a8 | |||
| 01cd24d2ba | |||
| dbbeff14ae | |||
| 2631d7136c | |||
| ee43e522f8 |
4
.gitmodules
vendored
4
.gitmodules
vendored
@ -1,4 +0,0 @@
|
||||
[submodule "libraries/LGLibrary"]
|
||||
path = libraries/LGLibrary
|
||||
url = git@gitlab.ghzhushou.com:client/client-common.git
|
||||
branch = master
|
||||
@ -1,8 +0,0 @@
|
||||
### Ver 3.0
|
||||
* x
|
||||
|
||||
### Ver 2.6
|
||||
* xx
|
||||
|
||||
### Ver 2.5
|
||||
* 此处写本次更新所做的业务和代码修改
|
||||
12
README.md
12
README.md
@ -2,7 +2,8 @@
|
||||
|
||||
### 多渠道打包配置
|
||||
* 使用[ApkChannelPackage](https://github.com/ltlovezh/ApkChannelPackage)的方案
|
||||
* 正式打包命令:请使用./gradlew channelRelease打包渠道包
|
||||
|
||||
* 正式打包命令:请使用./gradlew channelPubRelease打包渠道包
|
||||
|
||||
### 混淆配置
|
||||
* 配置文件:Android默认配置+proguard-rules.txt等
|
||||
@ -18,10 +19,5 @@
|
||||
* 修改``gradle.properties``文件将各种key填入其中,实现统一管理
|
||||
* 通过gradle文件内的resValue/buildConfigField/manifestPlaceHolder方式实现编译期间修改,具体情况请参考``./build.gradle``和``./app/build.gradle``配置
|
||||
|
||||
### 拉取代码步骤
|
||||
1. 拉取主项目代码: `git clone -b master git@gitlab.ghzhushou.com:halo/assistant-android.git`
|
||||
2. 初始化公用类库: `git submodule init && git submodule update`
|
||||
|
||||
### submodule管理方式(只拉取master)
|
||||
* 拉取子模块代码:`git submodule foreach git pull origin master`
|
||||
* 提交代码,需要cd到submodule文件夹去做修改
|
||||
### Ver 2.5
|
||||
* 此处写本次更新所做的业务和代码修改
|
||||
|
||||
@ -2,7 +2,6 @@ apply plugin: 'com.android.application'
|
||||
|
||||
apply plugin: 'com.neenbedankt.android-apt'
|
||||
|
||||
apply plugin: 'kotlin-android' // kotlin
|
||||
//tinker插件
|
||||
//apply plugin: 'com.tencent.tinker.patch'
|
||||
|
||||
@ -24,7 +23,7 @@ android {
|
||||
|
||||
javaCompileOptions {
|
||||
annotationProcessorOptions {
|
||||
arguments = [ eventBusIndex : 'com.gh.EventBusIndex' ]
|
||||
arguments = [ eventBusIndex : 'com.bandeng.MyEventBusIndex' ]
|
||||
}
|
||||
}
|
||||
|
||||
@ -77,6 +76,22 @@ android {
|
||||
}
|
||||
}
|
||||
|
||||
buildTypes {
|
||||
debug {
|
||||
debuggable true
|
||||
minifyEnabled false
|
||||
zipAlignEnabled false
|
||||
versionNameSuffix "-debug"
|
||||
}
|
||||
release {
|
||||
debuggable false
|
||||
minifyEnabled true
|
||||
zipAlignEnabled true
|
||||
shrinkResources true
|
||||
signingConfig signingConfigs.release
|
||||
}
|
||||
}
|
||||
|
||||
buildTypes {
|
||||
debug {
|
||||
debuggable true
|
||||
@ -109,7 +124,7 @@ android {
|
||||
productFlavors {
|
||||
// public release host
|
||||
pub {
|
||||
buildConfigField "String", "HOST", "\"${HOST}\""
|
||||
buildConfigField "String", "API_HOST", "\"${API_HOST}\""
|
||||
buildConfigField "String", "USER_HOST", "\"${USER_HOST}\""
|
||||
buildConfigField "String", "COMMENT_HOST", "\"${COMMENT_HOST}\""
|
||||
buildConfigField "String", "LIBAO_HOST", "\"${LIBAO_HOST}\""
|
||||
@ -118,7 +133,7 @@ android {
|
||||
}
|
||||
// internal dev host
|
||||
dev {
|
||||
buildConfigField "String", "HOST", "\"${DEV_HOST}\""
|
||||
buildConfigField "String", "API_HOST", "\"${DEV_API_HOST}\""
|
||||
buildConfigField "String", "USER_HOST", "\"${DEV_USER_HOST}\""
|
||||
buildConfigField "String", "COMMENT_HOST", "\"${DEV_COMMENT_HOST}\""
|
||||
buildConfigField "String", "LIBAO_HOST", "\"${DEV_LIBAO_HOST}\""
|
||||
@ -143,7 +158,7 @@ channel {
|
||||
|
||||
apt {
|
||||
arguments {
|
||||
eventBusIndex "com.gh.EventBusIndex"
|
||||
eventBusIndex "com.bandeng.MyEventBusIndex"
|
||||
}
|
||||
}
|
||||
|
||||
@ -207,17 +222,16 @@ dependencies {
|
||||
// provided libs.tinker_anno
|
||||
// compile libs.tinker_lib
|
||||
|
||||
compile libs.weiboSDK
|
||||
|
||||
compile libs.eventbus
|
||||
apt libs.eventbusApt
|
||||
compile project(':libraries:LGLibrary')
|
||||
// compile project(':libraries:EventBus')
|
||||
compile project(':libraries:MiPush')
|
||||
compile project(':libraries:MTA')
|
||||
compile project(':libraries:QQShare')
|
||||
compile project(':libraries:TalkingData')
|
||||
compile project(':libraries:UmengPush')
|
||||
compile project(':libraries:WechatShare')
|
||||
compile project(':libraries:WeiboShare')
|
||||
compile project(':libraries:iosched')
|
||||
|
||||
}
|
||||
|
||||
@ -117,10 +117,6 @@
|
||||
<init>(java.lang.Throwable);
|
||||
}
|
||||
|
||||
# weiboSdk
|
||||
-keep class com.sina.weibo.sdk.** { *; }
|
||||
-dontwarn android.webkit.WebView
|
||||
-dontwarn android.webkit.WebViewClient
|
||||
|
||||
# app models
|
||||
-keep class com.gh.common.view.** {*;}
|
||||
|
||||
@ -0,0 +1,13 @@
|
||||
package com.gh.gamecenter;
|
||||
|
||||
import android.app.Application;
|
||||
import android.test.ApplicationTestCase;
|
||||
|
||||
/**
|
||||
* <a href="http://d.android.com/tools/testing/testing_android.html">Testing Fundamentals</a>
|
||||
*/
|
||||
public class ApplicationTest extends ApplicationTestCase<Application> {
|
||||
public ApplicationTest() {
|
||||
super(Application.class);
|
||||
}
|
||||
}
|
||||
@ -52,33 +52,28 @@
|
||||
android:allowBackup = "true"
|
||||
android:icon = "@drawable/logo"
|
||||
android:label = "@string/app_name"
|
||||
android:theme = "@style/AppCompatTheme.APP" >
|
||||
android:theme = "@style/AppCompatTheme" >
|
||||
|
||||
<!--android:launchMode = "singleTask"-->
|
||||
<activity
|
||||
android:name = "com.gh.gamecenter.SplashScreenActivity"
|
||||
android:configChanges = "keyboardHidden|orientation|screenSize"
|
||||
android:noHistory = "true"
|
||||
android:screenOrientation = "portrait"
|
||||
android:theme = "@style/AppGuideTheme" >
|
||||
android:theme = "@style/AppGuideTheme"
|
||||
android:uiOptions = "splitActionBarWhenNarrow" >
|
||||
<intent-filter >
|
||||
<action android:name = "android.intent.action.MAIN" />
|
||||
|
||||
<category android:name = "android.intent.category.LAUNCHER" />
|
||||
</intent-filter >
|
||||
</activity >
|
||||
|
||||
<activity
|
||||
android:name = "com.gh.gamecenter.MainActivity"
|
||||
android:launchMode = "singleTask"
|
||||
android:launchMode = "singleTop"
|
||||
android:screenOrientation = "portrait"
|
||||
android:windowSoftInputMode = "stateAlwaysHidden|adjustResize" />
|
||||
|
||||
<activity
|
||||
android:name = "com.gh.gamecenter.DownloadManagerActivity"
|
||||
android:launchMode = "singleTask"
|
||||
android:screenOrientation = "portrait" />
|
||||
|
||||
<activity
|
||||
android:name = "com.gh.gamecenter.ViewImageActivity"
|
||||
android:theme = "@android:style/Theme.Black.NoTitleBar.Fullscreen" />
|
||||
@ -104,7 +99,7 @@
|
||||
<activity
|
||||
android:name = "com.gh.gamecenter.NewsSearchActivity"
|
||||
android:screenOrientation = "portrait"
|
||||
android:windowSoftInputMode = "stateHidden" />
|
||||
android:windowSoftInputMode="stateHidden"/>
|
||||
<activity
|
||||
android:name = "com.gh.gamecenter.GameNewsActivity"
|
||||
android:screenOrientation = "portrait" />
|
||||
@ -126,7 +121,7 @@
|
||||
<activity
|
||||
android:name = "com.gh.gamecenter.LibaoActivity"
|
||||
android:screenOrientation = "portrait"
|
||||
android:windowSoftInputMode = "stateHidden" />
|
||||
android:windowSoftInputMode="stateHidden"/>
|
||||
<activity
|
||||
android:name = "com.gh.gamecenter.LibaoDetailActivity"
|
||||
android:screenOrientation = "portrait" />
|
||||
@ -174,7 +169,8 @@
|
||||
android:screenOrientation = "portrait" />
|
||||
<activity
|
||||
android:name = "com.gh.gamecenter.SuggestionActivity"
|
||||
android:screenOrientation = "portrait" />
|
||||
android:screenOrientation = "portrait"
|
||||
android:windowSoftInputMode = "stateHidden|adjustResize" />
|
||||
<activity
|
||||
android:name = "com.gh.gamecenter.VoteActivity"
|
||||
android:screenOrientation = "portrait"
|
||||
@ -182,35 +178,7 @@
|
||||
<activity
|
||||
android:name = "com.gh.gamecenter.ToolBoxActivity"
|
||||
android:screenOrientation = "portrait"
|
||||
android:windowSoftInputMode = "stateHidden" />
|
||||
|
||||
<activity
|
||||
android:name = "com.gh.gamecenter.WeiBoShareActivity"
|
||||
android:screenOrientation = "portrait"
|
||||
android:windowSoftInputMode = "stateHidden" />
|
||||
|
||||
<activity
|
||||
android:name = "com.gh.gamecenter.InstallActivity"
|
||||
android:screenOrientation = "portrait" />
|
||||
<activity
|
||||
android:name = "com.gh.gamecenter.LoginActivity"
|
||||
android:screenOrientation = "portrait"
|
||||
android:windowSoftInputMode = "stateHidden" />
|
||||
|
||||
<activity
|
||||
android:name = "com.gh.gamecenter.UserInfoActivity"
|
||||
android:screenOrientation = "portrait" />
|
||||
|
||||
<activity
|
||||
android:name = "com.gh.gamecenter.UserAreaActivity"
|
||||
android:screenOrientation = "portrait" />
|
||||
|
||||
<!--非全屏+ScrollView+adjustResize-->
|
||||
|
||||
<activity
|
||||
android:name = "com.gh.gamecenter.UserInfoEditActivity"
|
||||
android:screenOrientation = "portrait"
|
||||
android:windowSoftInputMode = "stateHidden" />
|
||||
android:windowSoftInputMode="stateHidden"/>
|
||||
<activity
|
||||
android:name = "com.gh.gamecenter.SkipActivity"
|
||||
android:theme = "@style/Theme.AppCompat.Light.Fullscreen.Transparent" >
|
||||
@ -223,10 +191,6 @@
|
||||
</intent-filter >
|
||||
</activity >
|
||||
|
||||
<activity
|
||||
android:name = ".CommonActivity"
|
||||
android:screenOrientation = "portrait" />
|
||||
|
||||
<receiver android:name = "com.gh.gamecenter.receiver.InstallAndUninstallReceiver" >
|
||||
<intent-filter >
|
||||
<action android:name = "android.intent.action.PACKAGE_ADDED" />
|
||||
@ -271,6 +235,8 @@
|
||||
</intent-filter >
|
||||
</receiver >
|
||||
|
||||
<service android:name = "com.gh.download.DownloadService" />
|
||||
|
||||
<service android:name = "com.gh.gamecenter.statistics.AppStaticService" />
|
||||
|
||||
</application >
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
BIN
app/src/main/assets/scan_receiver.gif
Normal file
BIN
app/src/main/assets/scan_receiver.gif
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 544 KiB |
@ -10,15 +10,16 @@ import android.support.v4.util.ArrayMap;
|
||||
import android.text.TextUtils;
|
||||
import android.util.Log;
|
||||
|
||||
import com.bandeng.MyEventBusIndex;
|
||||
import com.facebook.drawee.backends.pipeline.Fresco;
|
||||
import com.gh.EventBusIndex;
|
||||
import com.gh.common.constant.Config;
|
||||
import com.gh.common.util.DataUtils;
|
||||
import com.gh.common.util.HttpsUtils;
|
||||
import com.gh.common.util.StringUtils;
|
||||
import com.gh.common.util.TokenUtils;
|
||||
import com.gh.common.util.Utils;
|
||||
import com.gh.gamecenter.BuildConfig;
|
||||
import com.leon.channel.helper.ChannelReaderUtil;
|
||||
import com.lightgame.utils.Utils;
|
||||
import com.umeng.message.IUmengRegisterCallback;
|
||||
import com.umeng.message.PushAgent;
|
||||
import com.umeng.message.UTrack;
|
||||
@ -71,6 +72,20 @@ public class AppController extends Application {
|
||||
objectMap.remove(key);
|
||||
}
|
||||
|
||||
public static String getProcessName(Context cxt, int pid) {
|
||||
ActivityManager am = (ActivityManager) cxt.getSystemService(Context.ACTIVITY_SERVICE);
|
||||
List<RunningAppProcessInfo> runningApps = am.getRunningAppProcesses();
|
||||
if (runningApps == null) {
|
||||
return null;
|
||||
}
|
||||
for (RunningAppProcessInfo procInfo : runningApps) {
|
||||
if (procInfo.pid == pid) {
|
||||
return procInfo.processName;
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
public static synchronized AppController getInstance() {
|
||||
return mInstance;
|
||||
}
|
||||
@ -79,16 +94,11 @@ public class AppController extends Application {
|
||||
return mChannel;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void attachBaseContext(Context base) {
|
||||
super.attachBaseContext(base);
|
||||
MultiDex.install(this);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onCreate() {
|
||||
super.onCreate();
|
||||
|
||||
MultiDex.install(this);
|
||||
mInstance = this;
|
||||
|
||||
//TODO 强烈不建议开发阶段开启这个Handler,必须处理错误
|
||||
@ -117,6 +127,8 @@ public class AppController extends Application {
|
||||
// throw new RuntimeException("test again");
|
||||
// }
|
||||
|
||||
HttpsUtils.initHttpsUrlConnection(this);
|
||||
|
||||
// if (BuildConfig.DEBUG) {
|
||||
// Stetho.initializeWithDefaults(this);
|
||||
// }
|
||||
@ -126,12 +138,9 @@ public class AppController extends Application {
|
||||
* 可以从{@link GHPushMessageReceiver#onCommandResult(Context, MiPushCommandMessage)}
|
||||
* 的{@link MiPushCommandMessage} 对象参数中获取注册信息
|
||||
*/
|
||||
try {
|
||||
if (shouldInit()) {
|
||||
MiPushClient.registerPush(this, Config.MIPUSH_APPID, Config.MIPUSH_APPKEY);
|
||||
}
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
if (shouldInit()) {
|
||||
MiPushClient.registerPush(this, Config.MIPUSH_APPID, Config.MIPUSH_APPKEY);
|
||||
|
||||
}
|
||||
|
||||
if (BuildConfig.DEBUG) {
|
||||
@ -155,41 +164,37 @@ public class AppController extends Application {
|
||||
Logger.setLogger(this, newLogger);
|
||||
}
|
||||
|
||||
try {
|
||||
//友盟推送
|
||||
final PushAgent pushAgent = PushAgent.getInstance(this);
|
||||
pushAgent.setAppkeyAndSecret(Config.UMENG_APPKEY, Config.UMENG_MESSAGE_SECRET);
|
||||
//友盟推送
|
||||
final PushAgent pushAgent = PushAgent.getInstance(this);
|
||||
pushAgent.setAppkeyAndSecret(Config.UMENG_APPKEY, Config.UMENG_MESSAGE_SECRET);
|
||||
|
||||
//注册推送服务,每次调用register方法都会回调该接口
|
||||
pushAgent.register(new IUmengRegisterCallback() {
|
||||
//注册推送服务,每次调用register方法都会回调该接口
|
||||
pushAgent.register(new IUmengRegisterCallback() {
|
||||
|
||||
@Override
|
||||
public void onSuccess(String deviceToken) {
|
||||
//注册成功会返回device token
|
||||
Utils.log("deviceToken::" + deviceToken);
|
||||
@Override
|
||||
public void onSuccess(String deviceToken) {
|
||||
//注册成功会返回device token
|
||||
Utils.log("deviceToken::" + deviceToken);
|
||||
|
||||
//设置别名
|
||||
pushAgent.addExclusiveAlias(TokenUtils.getDeviceId(getApplicationContext()),
|
||||
"GHDID", new UTrack.ICallBack() {
|
||||
@Override
|
||||
public void onMessage(boolean b, String s) {
|
||||
Utils.log(StringUtils.buildString("ExclusiveAlias::", String.valueOf(b), "==", s));
|
||||
//设置别名
|
||||
pushAgent.addExclusiveAlias(TokenUtils.getDeviceId(getApplicationContext()),
|
||||
"GHDID", new UTrack.ICallBack() {
|
||||
@Override
|
||||
public void onMessage(boolean b, String s) {
|
||||
Utils.log(StringUtils.buildString("ExclusiveAlias::", String.valueOf(b), "==", s));
|
||||
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onFailure(String s, String s1) {
|
||||
Utils.log("deviceToken::" + "注册失败");
|
||||
}
|
||||
});
|
||||
@Override
|
||||
public void onFailure(String s, String s1) {
|
||||
Utils.log("deviceToken::" + "注册失败");
|
||||
}
|
||||
});
|
||||
|
||||
// 友盟推送数据处理
|
||||
pushAgent.setNotificationClickHandler(new GHUmengNotificationClickHandler());
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
// 友盟推送数据处理
|
||||
pushAgent.setNotificationClickHandler(new GHUmengNotificationClickHandler());
|
||||
|
||||
// // 监听屏幕状态广播
|
||||
// if (shouldInit()) {
|
||||
@ -209,9 +214,9 @@ public class AppController extends Application {
|
||||
// }
|
||||
// }
|
||||
|
||||
// 启用EventBus3.0加速功能
|
||||
EventBus.builder().addIndex(new EventBusIndex()).installDefaultEventBus();
|
||||
}
|
||||
// 启用EventBus3.0加速功能
|
||||
EventBus.builder().addIndex(new MyEventBusIndex()).installDefaultEventBus();
|
||||
}
|
||||
|
||||
private boolean shouldInit() {
|
||||
ActivityManager am = ((ActivityManager) getSystemService(Context.ACTIVITY_SERVICE));
|
||||
@ -227,18 +232,4 @@ public class AppController extends Application {
|
||||
return false;
|
||||
}
|
||||
|
||||
// public static String getProcessName(Context cxt, int pid) {
|
||||
// ActivityManager am = (ActivityManager) cxt.getSystemService(Context.ACTIVITY_SERVICE);
|
||||
// List<RunningAppProcessInfo> runningApps = am.getRunningAppProcesses();
|
||||
// if (runningApps == null) {
|
||||
// return null;
|
||||
// }
|
||||
// for (RunningAppProcessInfo procInfo : runningApps) {
|
||||
// if (procInfo.pid == pid) {
|
||||
// return procInfo.processName;
|
||||
// }
|
||||
// }
|
||||
// return null;
|
||||
// }
|
||||
|
||||
}
|
||||
|
||||
51
app/src/main/java/com/gh/base/AppControllerLike.java
Normal file
51
app/src/main/java/com/gh/base/AppControllerLike.java
Normal file
@ -0,0 +1,51 @@
|
||||
//package com.gh.base;
|
||||
//
|
||||
//
|
||||
//import android.annotation.TargetApi;
|
||||
//import android.app.Application;
|
||||
//import android.content.Context;
|
||||
//import android.content.Intent;
|
||||
//import android.os.Build;
|
||||
//import android.support.multidex.MultiDex;
|
||||
//
|
||||
//import com.tencent.tinker.lib.listener.DefaultPatchListener;
|
||||
//import com.tencent.tinker.lib.listener.PatchListener;
|
||||
//import com.tencent.tinker.lib.patch.AbstractPatch;
|
||||
//import com.tencent.tinker.lib.patch.UpgradePatch;
|
||||
//import com.tencent.tinker.lib.reporter.DefaultLoadReporter;
|
||||
//import com.tencent.tinker.lib.reporter.DefaultPatchReporter;
|
||||
//import com.tencent.tinker.lib.reporter.LoadReporter;
|
||||
//import com.tencent.tinker.lib.reporter.PatchReporter;
|
||||
//import com.tencent.tinker.lib.tinker.TinkerInstaller;
|
||||
//import com.tencent.tinker.loader.app.DefaultApplicationLike;
|
||||
//
|
||||
//public class AppControllerLike extends DefaultApplicationLike {
|
||||
//
|
||||
// public AppControllerLike(Application application, int tinkerFlags, boolean tinkerLoadVerifyFlag,
|
||||
// long applicationStartElapsedTime, long applicationStartMillisTime,
|
||||
// Intent tinkerResultIntent) {
|
||||
// super(application, tinkerFlags, tinkerLoadVerifyFlag, applicationStartElapsedTime,
|
||||
// applicationStartMillisTime, tinkerResultIntent);
|
||||
// }
|
||||
//
|
||||
// @Override
|
||||
// public void onBaseContextAttached(Context base) {
|
||||
// super.onBaseContextAttached(base);
|
||||
// MultiDex.install(base);
|
||||
//
|
||||
// LoadReporter loadReporter = new DefaultLoadReporter(getApplication());
|
||||
// PatchReporter patchReporter = new DefaultPatchReporter(getApplication());
|
||||
// PatchListener patchListener = new DefaultPatchListener(getApplication());
|
||||
// AbstractPatch upgradePatchProcessor = new UpgradePatch();
|
||||
//
|
||||
// TinkerInstaller.install(this, loadReporter, patchReporter, patchListener,
|
||||
// AppTinkerResultService.class, upgradePatchProcessor);
|
||||
//// TinkerInstaller.install(this);
|
||||
// }
|
||||
//
|
||||
// @TargetApi(Build.VERSION_CODES.ICE_CREAM_SANDWICH)
|
||||
// public void registerActivityLifecycleCallbacks(Application.ActivityLifecycleCallbacks callback) {
|
||||
// getApplication().registerActivityLifecycleCallbacks(callback);
|
||||
// }
|
||||
//
|
||||
//}
|
||||
29
app/src/main/java/com/gh/base/AppTinkerResultService.java
Normal file
29
app/src/main/java/com/gh/base/AppTinkerResultService.java
Normal file
@ -0,0 +1,29 @@
|
||||
//package com.gh.base;
|
||||
//
|
||||
//import com.gh.common.util.Utils;
|
||||
//import com.tencent.tinker.lib.service.DefaultTinkerResultService;
|
||||
//import com.tencent.tinker.lib.service.PatchResult;
|
||||
//import com.tencent.tinker.lib.util.TinkerServiceInternals;
|
||||
//
|
||||
//import java.io.File;
|
||||
//
|
||||
//
|
||||
//public class AppTinkerResultService extends DefaultTinkerResultService {
|
||||
//
|
||||
// @Override
|
||||
// public void onPatchResult(PatchResult result) {
|
||||
// if (result == null) {
|
||||
// return;
|
||||
// }
|
||||
// Utils.log(result);
|
||||
//
|
||||
// //first, we want to kill the recover process
|
||||
// TinkerServiceInternals.killTinkerPatchServiceProcess(getApplicationContext());
|
||||
//
|
||||
// if (result.isSuccess) {
|
||||
// Utils.log("Tinkder Success");
|
||||
// deleteRawPatchFile(new File(result.rawPatchFilePath));
|
||||
// }
|
||||
// }
|
||||
//
|
||||
//}
|
||||
@ -5,15 +5,15 @@ import android.app.PendingIntent;
|
||||
import android.content.Context;
|
||||
import android.content.Intent;
|
||||
import android.content.SharedPreferences;
|
||||
import android.preference.PreferenceManager;
|
||||
import android.os.Looper;
|
||||
import android.util.Log;
|
||||
import android.widget.Toast;
|
||||
|
||||
import com.gh.common.constant.Config;
|
||||
import com.gh.common.util.AppManager;
|
||||
import com.gh.common.util.DataCollectionUtils;
|
||||
import com.gh.common.util.FileUtils;
|
||||
import com.gh.gamecenter.SplashScreenActivity;
|
||||
import com.lightgame.download.FileUtils;
|
||||
import com.lightgame.utils.AppManager;
|
||||
import com.lightgame.utils.RuntimeUtils;
|
||||
import com.tencent.stat.StatService;
|
||||
|
||||
import java.io.File;
|
||||
@ -27,12 +27,12 @@ import java.util.Locale;
|
||||
public class AppUncaughtHandler implements UncaughtExceptionHandler {
|
||||
|
||||
private UncaughtExceptionHandler mDefaultHandler;
|
||||
private Context mContext;
|
||||
private AppController mAppController;
|
||||
|
||||
public AppUncaughtHandler(Context context) {
|
||||
public AppUncaughtHandler(AppController appController) {
|
||||
// 获取系统默认的UncaughtException处理器
|
||||
mDefaultHandler = Thread.getDefaultUncaughtExceptionHandler();
|
||||
mContext = context;
|
||||
mAppController = appController;
|
||||
}
|
||||
|
||||
@Override
|
||||
@ -41,11 +41,13 @@ public class AppUncaughtHandler implements UncaughtExceptionHandler {
|
||||
// 如果用户没有处理则让系统默认的异常处理器来处理
|
||||
mDefaultHandler.uncaughtException(thread, ex);
|
||||
} else {
|
||||
RuntimeUtils.getInstance().runOnUiThread(new Runnable() {
|
||||
AppController.MAIN_EXECUTOR.execute(new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
Toast.makeText(mContext.getApplicationContext(),
|
||||
Looper.prepare();
|
||||
Toast.makeText(mAppController.getApplicationContext(),
|
||||
"\"光环助手\"发生错误", Toast.LENGTH_SHORT).show();
|
||||
Looper.loop();
|
||||
}
|
||||
});
|
||||
try {
|
||||
@ -55,17 +57,19 @@ public class AppUncaughtHandler implements UncaughtExceptionHandler {
|
||||
}
|
||||
|
||||
// 防止重复奔溃,导致助手一直重启,20秒内不做处理
|
||||
SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(mContext);
|
||||
SharedPreferences sp = mAppController.getApplicationContext().getSharedPreferences(
|
||||
Config.PREFERENCE, Context.MODE_PRIVATE);
|
||||
long time = sp.getLong("last_restart_time", 0);
|
||||
if (System.currentTimeMillis() - time > 20 * 1000) {
|
||||
sp.edit().putLong("last_restart_time", System.currentTimeMillis()).apply();
|
||||
Intent intent = new Intent(mContext, SplashScreenActivity.class);
|
||||
Intent intent = new Intent(mAppController.getApplicationContext(), SplashScreenActivity.class);
|
||||
intent.setAction(Intent.ACTION_MAIN);
|
||||
intent.addCategory(Intent.CATEGORY_LAUNCHER);
|
||||
PendingIntent restartIntent = PendingIntent.getActivity(mContext, 0, intent,
|
||||
PendingIntent restartIntent = PendingIntent.getActivity(
|
||||
mAppController.getApplicationContext(), 0, intent,
|
||||
PendingIntent.FLAG_UPDATE_CURRENT);
|
||||
// 退出程序并重启
|
||||
AlarmManager mgr = (AlarmManager) mContext.getSystemService(Context.ALARM_SERVICE);
|
||||
AlarmManager mgr = (AlarmManager) mAppController.getSystemService(Context.ALARM_SERVICE);
|
||||
mgr.set(AlarmManager.RTC, System.currentTimeMillis() + 1000, restartIntent); // 1秒钟后重启应用
|
||||
}
|
||||
AppManager.getInstance().finishAllActivity();
|
||||
@ -91,15 +95,15 @@ public class AppUncaughtHandler implements UncaughtExceptionHandler {
|
||||
String errorMsg = Log.getStackTraceString(ex);
|
||||
|
||||
// MTA主动上传错误
|
||||
// StatService.reportError(mContext.getApplicationContext(), errorMsg);
|
||||
StatService.reportException(mContext, ex);
|
||||
// StatService.reportError(mAppController.getApplicationContext(), errorMsg);
|
||||
StatService.reportException(mAppController, ex);
|
||||
|
||||
// 上传错误数据
|
||||
DataCollectionUtils.uploadError(mContext, errorMsg);
|
||||
DataCollectionUtils.uploadError(mAppController, errorMsg);
|
||||
|
||||
// 保存到本地
|
||||
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd-HH-mm-ss", Locale.getDefault());
|
||||
File file = new File(FileUtils.getLogPath(mContext.getApplicationContext(),
|
||||
File file = new File(FileUtils.getLogPath(mAppController.getApplicationContext(),
|
||||
format.format(new Date()) + "_gh_assist" + ".log"));
|
||||
FileWriter writer = null;
|
||||
try {
|
||||
|
||||
@ -1,22 +1,28 @@
|
||||
package com.gh.base;
|
||||
|
||||
import android.content.Context;
|
||||
import android.os.Build;
|
||||
import android.os.Bundle;
|
||||
import android.view.View;
|
||||
import android.view.View.OnClickListener;
|
||||
import android.view.ViewGroup.LayoutParams;
|
||||
import android.widget.LinearLayout;
|
||||
import android.widget.TextView;
|
||||
import android.widget.Toast;
|
||||
|
||||
import com.gh.common.constant.Config;
|
||||
import com.gh.common.util.AppManager;
|
||||
import com.gh.common.util.DataUtils;
|
||||
import com.gh.common.util.DialogUtils;
|
||||
import com.gh.common.util.DisplayUtils;
|
||||
import com.gh.common.util.FileUtils;
|
||||
import com.gh.common.util.PackageUtils;
|
||||
import com.gh.common.util.RunningUtils;
|
||||
import com.gh.common.util.ShareUtils;
|
||||
import com.gh.download.DownloadManager;
|
||||
import com.gh.gamecenter.R;
|
||||
import com.gh.gamecenter.eventbus.EBShowDialog;
|
||||
import com.lightgame.download.FileUtils;
|
||||
import com.lightgame.utils.AppManager;
|
||||
import com.gh.gamecenter.listener.OnCallBackListener;
|
||||
import com.readystatesoftware.systembartint.SystemBarTintManager.SystemBarConfig;
|
||||
|
||||
import org.greenrobot.eventbus.EventBus;
|
||||
@ -30,7 +36,7 @@ import butterknife.ButterKnife;
|
||||
import static com.gh.common.util.EntranceUtils.KEY_DATA;
|
||||
import static com.gh.common.util.EntranceUtils.KEY_ENTRANCE;
|
||||
|
||||
public abstract class BaseActivity extends BaseAppCompatToolBarActivity {
|
||||
public abstract class BaseActivity extends BaseAppCompatToolBarActivity implements OnCallBackListener {
|
||||
|
||||
protected String mEntrance;
|
||||
private boolean mIsPause;
|
||||
@ -61,17 +67,24 @@ public abstract class BaseActivity extends BaseAppCompatToolBarActivity {
|
||||
|
||||
ButterKnife.bind(this);
|
||||
|
||||
View back = findViewById(R.id.actionbar_rl_back);
|
||||
if (back != null)
|
||||
back.setOnClickListener(new OnClickListener() {
|
||||
@Override
|
||||
public void onClick(View v) {
|
||||
finish();
|
||||
}
|
||||
});
|
||||
View reuse_actionbar = findViewById(R.id.reuse_actionbar);
|
||||
if (reuse_actionbar != null) {
|
||||
int actionbar_height = getSharedPreferences(Config.PREFERENCE, Context.MODE_PRIVATE)
|
||||
.getInt("actionbar_height", DisplayUtils.dip2px(getApplicationContext(), 55));
|
||||
LinearLayout.LayoutParams lparams = new LinearLayout.LayoutParams(LayoutParams.MATCH_PARENT, actionbar_height);
|
||||
reuse_actionbar.setLayoutParams(lparams);
|
||||
|
||||
findViewById(R.id.actionbar_rl_back).setOnClickListener(
|
||||
new OnClickListener() {
|
||||
@Override
|
||||
public void onClick(View v) {
|
||||
finish();
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
protected void initTitle(String title) {
|
||||
protected void init(String title) {
|
||||
TextView actionbar_tv_title = (TextView) findViewById(R.id.actionbar_tv_title);
|
||||
actionbar_tv_title.setText(title);
|
||||
// setNavigationTitle(title);
|
||||
@ -150,4 +163,24 @@ public abstract class BaseActivity extends BaseAppCompatToolBarActivity {
|
||||
DownloadManager.getInstance(this).initGameMap();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void loadDone() {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void loadDone(Object obj) {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void loadError() {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void loadEmpty() {
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
325
app/src/main/java/com/gh/base/BaseAppCompatActivity.java
Normal file
325
app/src/main/java/com/gh/base/BaseAppCompatActivity.java
Normal file
@ -0,0 +1,325 @@
|
||||
package com.gh.base;
|
||||
|
||||
import android.app.Activity;
|
||||
import android.content.Context;
|
||||
import android.content.Intent;
|
||||
import android.net.Uri;
|
||||
import android.os.Bundle;
|
||||
import android.support.v4.app.Fragment;
|
||||
import android.support.v4.app.FragmentManager;
|
||||
import android.support.v4.app.FragmentTransaction;
|
||||
import android.view.View;
|
||||
|
||||
import com.gh.common.util.AppDebugConfig;
|
||||
import com.gh.common.util.AppManager;
|
||||
import com.gh.common.util.Util_System_Keyboard;
|
||||
import com.gh.gamecenter.R;
|
||||
|
||||
|
||||
/**
|
||||
* @author CsHeng
|
||||
*/
|
||||
public abstract class BaseAppCompatActivity extends BaseAppCompatActivityLog implements FragmentNavigationDelegate,
|
||||
OnBackPressedListener {
|
||||
|
||||
protected static final String ARGS_FRAGMENT_NAME = "frgName";
|
||||
protected static final String ARGS_FRAGMENT_BUNDLE = "frgBundle";
|
||||
protected View mContentView;
|
||||
|
||||
protected static Intent clearTop(Context context, Class<? extends Activity> cls) {
|
||||
final Intent intent = getReorderToFrontIntent(context, cls);
|
||||
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
|
||||
return intent;
|
||||
}
|
||||
|
||||
protected static Intent getReorderToFrontIntent(Context context, Class<? extends Activity> cls) {
|
||||
final Intent intent = new Intent(context, cls);
|
||||
intent.addFlags(Intent.FLAG_ACTIVITY_BROUGHT_TO_FRONT);
|
||||
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
|
||||
return intent;
|
||||
}
|
||||
|
||||
protected static void showActivity(Context context, Class<? extends Activity> cls) {
|
||||
final Intent intent = getReorderToFrontIntent(context, cls);
|
||||
context.startActivity(intent);
|
||||
}
|
||||
|
||||
protected static void startFragmentForResult(Context context, Class<? extends Activity> activity,
|
||||
Class<? extends Fragment> fragment, Bundle bundle, int requestCode) {
|
||||
if (context instanceof Activity) {
|
||||
((Activity) context).startActivityForResult(getFragmentIntent(context, activity, fragment, bundle),
|
||||
requestCode);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 根据传进来的fragment class和bundle extra来决定跳转到哪一个fragment
|
||||
*
|
||||
* @param context
|
||||
* @param fragment fragment.getCanonicalName()
|
||||
* @param bundle fragment的构造参数
|
||||
* @return
|
||||
*/
|
||||
protected static Intent getFragmentIntent(Context context, Class<? extends Activity> activity,
|
||||
Class<? extends Fragment> fragment, Bundle bundle) {
|
||||
final Intent intent = getReorderToFrontIntent(context, activity);
|
||||
intent.putExtra(ARGS_FRAGMENT_NAME, fragment.getCanonicalName());
|
||||
intent.putExtra(ARGS_FRAGMENT_BUNDLE, bundle);
|
||||
return intent;
|
||||
}
|
||||
|
||||
protected static void startFragment(Context context, Class<? extends Activity> activity,
|
||||
Class<? extends Fragment> fragment) {
|
||||
startFragment(context, activity, fragment, null);
|
||||
}
|
||||
|
||||
/**
|
||||
* 启动Fragment
|
||||
*
|
||||
* @param context
|
||||
* @param fragment
|
||||
* @param bundle
|
||||
*/
|
||||
protected static void startFragment(Context context, Class<? extends Activity> activity,
|
||||
Class<? extends Fragment> fragment, Bundle bundle) {
|
||||
context.startActivity(getFragmentIntent(context, activity, fragment, bundle));
|
||||
}
|
||||
|
||||
private void handleRedirectFromUri(Uri uri) {
|
||||
try {
|
||||
if (AppDebugConfig.IS_DEBUG) {
|
||||
AppDebugConfig.logMethodWithParams(this, uri, uri.getHost(), uri.getPath(), uri.getEncodedQuery());
|
||||
}
|
||||
// switch (uri.getPath()) {
|
||||
// case SchemeConstants.PATH_OPEN_GAME: {
|
||||
// /**
|
||||
// * 对于联运游戏:传入的game_id为0,game_url为对应的游戏链接,aid传联运游戏的aid
|
||||
// * 对于非联运游戏:传入非联运游戏的game_id,game_url不传,aid传0
|
||||
// */
|
||||
// GameModel game = new GameModel();
|
||||
// int gameId = Integer.parseInt(uri.getQueryParameter(SchemeConstants.PARAMS_GAMEID));
|
||||
// game.setId(gameId);
|
||||
//// if (AppDebugConfig.IS_DEBUG) {
|
||||
//// int debugId = 1049;
|
||||
//// game.setId(debugId);
|
||||
//// }
|
||||
// if (gameId == 0) {
|
||||
// // cooperate
|
||||
// int aid = Integer.parseInt(uri.getQueryParameter(SchemeConstants.PARAMS_AID));
|
||||
// game.setAid(aid);
|
||||
// String gameUrl = uri.getQueryParameter(SchemeConstants.PARAMS_GAMEURL);
|
||||
// game.setUrl(gameUrl);
|
||||
// }
|
||||
// ApiRequester.requestGameDetail(this, game);
|
||||
//
|
||||
// break;
|
||||
// }
|
||||
// case SchemeConstants.PATH_OPEN_ARTICLE: {
|
||||
//
|
||||
// String url = uri.getQueryParameter(SchemeConstants.PARAMS_ARTICLE_URL);
|
||||
// String title = uri.getQueryParameter(SchemeConstants.PARAMS_ARTICLE_TITLE);
|
||||
//
|
||||
// if (!TextUtils.isEmpty(url) && !TextUtils.isEmpty(title)) {
|
||||
// Bundle args = new Bundle();
|
||||
// args.putString(Fragment_Browser_Web.ARGS_URL, url);
|
||||
// args.putString(Fragment_Browser_Web.ARGS_TITLE, getString(R.string.title_article_detail));
|
||||
// CommonActivity.startFragment(this, Fragment_Browser_Web.class, args);
|
||||
// }
|
||||
//
|
||||
// break;
|
||||
// }
|
||||
// default:
|
||||
// break;
|
||||
// }
|
||||
} catch (Exception e) {
|
||||
if (AppDebugConfig.IS_DEBUG) {
|
||||
// Debug_SDK.e(e);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean onHandleBackPressed() {
|
||||
onBackPressed();
|
||||
return true;
|
||||
}
|
||||
|
||||
protected boolean handleBackPressed() {
|
||||
if (AppDebugConfig.IS_DEBUG) {
|
||||
AppDebugConfig.logMethodWithParams(this);
|
||||
}
|
||||
final Fragment curFragment = getTopFragment();
|
||||
if (curFragment instanceof OnBackPressedListener &&
|
||||
((OnBackPressedListener) curFragment).onHandleBackPressed()) {
|
||||
return true;
|
||||
}
|
||||
if (popFragment()) {
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
public Fragment getTopFragment() {
|
||||
return getSupportFragmentManager().findFragmentById(R.id.layout_activity_content);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onCreate(Bundle savedInstanceState) {
|
||||
super.onCreate(savedInstanceState);
|
||||
final int layoutId = getLayoutId();
|
||||
if (layoutId != 0) {
|
||||
mContentView = getLayoutInflater().inflate(layoutId, null);
|
||||
setContentView(mContentView);
|
||||
}
|
||||
if (savedInstanceState == null) {
|
||||
handleRedirectIntent(getIntent());
|
||||
}
|
||||
AppManager.getInstance().addActivity(this);
|
||||
}
|
||||
|
||||
protected abstract int getLayoutId();
|
||||
|
||||
/**
|
||||
* 1、判断当前是否存在某Fragment,例如下载管理器已经在栈中,则不重新启动,而将其带到最上层 (FindFragmentWithTag)
|
||||
* 2、支持URI调用?
|
||||
* 是否需要重新导向到其他Activity
|
||||
*/
|
||||
protected void handleRedirectIntent(Intent intent) {
|
||||
try {
|
||||
if (AppDebugConfig.IS_DEBUG) {
|
||||
AppDebugConfig.logMethodWithParams(this, intent.toUri(Intent.URI_INTENT_SCHEME));
|
||||
}
|
||||
|
||||
// 1、根据从网页抓取到的Intent跳转进来,处理custom uri
|
||||
// final Uri uri = intent.getData();
|
||||
// if (uri != null && SchemeConstants.SCHEME_FFSS.equals(uri.getScheme())) {
|
||||
// handleRedirectFromUri(uri);
|
||||
// return;
|
||||
// }
|
||||
//
|
||||
// // 2、根据序列化的数据来重新构建Fragment实例,若没有,则是旧的形式来决定传参
|
||||
// final String fragmentName = intent.getStringExtra(ARGS_FRAGMENT_NAME);
|
||||
// if (AppDebugConfig.IS_DEBUG) {
|
||||
// AppDebugConfig.logMethodWithParams(this, fragmentName);
|
||||
// }
|
||||
// if (!TextUtils.isEmpty(fragmentName)) {
|
||||
// final Bundle args = intent.getBundleExtra(ARGS_FRAGMENT_BUNDLE);
|
||||
// final Fragment fragment = Fragment.instantiate(this, fragmentName, args);
|
||||
// if (fragment instanceof DialogFragment) {
|
||||
// ((DialogFragment) fragment).show(getSupportFragmentManager(), fragmentName);
|
||||
// } else {
|
||||
// getSupportFragmentManager().beginTransaction().replace(R.id.layout_activity_content, fragment)
|
||||
// .commitAllowingStateLoss();
|
||||
// }
|
||||
// }
|
||||
} catch (Throwable e) {
|
||||
if (AppDebugConfig.IS_DEBUG) {
|
||||
AppDebugConfig.logMethodWithParams(this, e);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onDestroy() {
|
||||
super.onDestroy();
|
||||
AppManager.getInstance().finishActivity(this);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void addFragment(Fragment fragment) {
|
||||
getSupportFragmentManager().beginTransaction().add(R.id.layout_activity_content, fragment)
|
||||
.addToBackStack(fragment.toString()).commitAllowingStateLoss();
|
||||
Util_System_Keyboard.hideSoftKeyboard(this);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void replaceFragment(Fragment toReplace) {
|
||||
final FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
|
||||
ft.replace(R.id.layout_activity_content, toReplace).addToBackStack(toReplace.toString());
|
||||
ft.commitAllowingStateLoss();
|
||||
Util_System_Keyboard.hideSoftKeyboard(this);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void removeFragment(Fragment toRemove) {
|
||||
final FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
|
||||
ft.replace(R.id.layout_activity_content, toRemove).addToBackStack(toRemove.toString());
|
||||
ft.commitAllowingStateLoss();
|
||||
Util_System_Keyboard.hideSoftKeyboard(this);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void showFragment(Fragment toShow) {
|
||||
final FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
|
||||
ft.show(toShow).addToBackStack(toShow.toString());
|
||||
ft.commitAllowingStateLoss();
|
||||
Util_System_Keyboard.hideSoftKeyboard(this);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void hideFragment(Fragment toHide) {
|
||||
final FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
|
||||
ft.show(toHide).addToBackStack(toHide.toString());
|
||||
ft.commitAllowingStateLoss();
|
||||
Util_System_Keyboard.hideSoftKeyboard(this);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean popFragment() {
|
||||
if (AppDebugConfig.IS_DEBUG) {
|
||||
AppDebugConfig.logMethodWithParams(this, getSupportFragmentManager().getBackStackEntryCount());
|
||||
}
|
||||
final int backStackCount = getSupportFragmentManager().getBackStackEntryCount();
|
||||
if (backStackCount > 0) {
|
||||
Util_System_Keyboard.hideSoftKeyboard(this);
|
||||
getSupportFragmentManager().popBackStack();
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void popFragmentToBase() {
|
||||
getSupportFragmentManager().popBackStack(null, FragmentManager.POP_BACK_STACK_INCLUSIVE);
|
||||
}
|
||||
|
||||
/**
|
||||
* forward ActivityResultListener to fragments this activity hosts
|
||||
*
|
||||
* @param requestCode
|
||||
* @param resultCode
|
||||
* @param data
|
||||
*/
|
||||
@Override
|
||||
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
|
||||
super.onActivityResult(requestCode, resultCode, data);
|
||||
if (AppDebugConfig.IS_DEBUG) {
|
||||
AppDebugConfig.logMethodWithParams(this, requestCode, resultCode, data);
|
||||
}
|
||||
final Fragment fragment = getTopFragment();
|
||||
if (fragment != null) {
|
||||
fragment.onActivityResult(requestCode, resultCode, data);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onBackPressed() {
|
||||
if (AppDebugConfig.IS_DEBUG) {
|
||||
AppDebugConfig.logMethodWithParams(this);
|
||||
}
|
||||
if (handleBackPressed()) {
|
||||
return;
|
||||
}
|
||||
// default finish activity
|
||||
Util_System_Keyboard.hideSoftKeyboard(this);
|
||||
finish();
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onNewIntent(Intent intent) {
|
||||
super.onNewIntent(intent);
|
||||
setIntent(intent);
|
||||
handleRedirectIntent(intent);
|
||||
}
|
||||
|
||||
}
|
||||
94
app/src/main/java/com/gh/base/BaseAppCompatActivityLog.java
Normal file
94
app/src/main/java/com/gh/base/BaseAppCompatActivityLog.java
Normal file
@ -0,0 +1,94 @@
|
||||
package com.gh.base;
|
||||
|
||||
import android.os.Bundle;
|
||||
import android.support.v7.app.AppCompatActivity;
|
||||
|
||||
import com.gh.common.util.AppDebugConfig;
|
||||
|
||||
|
||||
/**
|
||||
* @author: CsHeng (csheng1204[at]gmail[dot]com)
|
||||
* Date: 13-7-25
|
||||
* Time: 下午8:42
|
||||
*/
|
||||
public class BaseAppCompatActivityLog extends AppCompatActivity {
|
||||
|
||||
@Override
|
||||
protected void onCreate(Bundle savedInstanceState) {
|
||||
super.onCreate(savedInstanceState);
|
||||
if (AppDebugConfig.IS_DEBUG) {
|
||||
AppDebugConfig.logMethodName(this);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onStop() {
|
||||
super.onStop();
|
||||
if (AppDebugConfig.IS_DEBUG) {
|
||||
AppDebugConfig.logMethodName(this);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onDestroy() {
|
||||
super.onDestroy();
|
||||
if (AppDebugConfig.IS_DEBUG) {
|
||||
AppDebugConfig.logMethodName(this);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onSaveInstanceState(Bundle outState) {
|
||||
super.onSaveInstanceState(outState);
|
||||
if (AppDebugConfig.IS_DEBUG) {
|
||||
AppDebugConfig.logMethodName(this);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onLowMemory() {
|
||||
super.onLowMemory();
|
||||
if (AppDebugConfig.IS_DEBUG) {
|
||||
AppDebugConfig.logMethodName(this);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onPause() {
|
||||
super.onPause();
|
||||
try {
|
||||
if (AppDebugConfig.IS_DEBUG) {
|
||||
AppDebugConfig.logMethodName(this);
|
||||
}
|
||||
} catch (Throwable e) {
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onResume() {
|
||||
super.onResume();
|
||||
try {
|
||||
if (AppDebugConfig.IS_DEBUG) {
|
||||
AppDebugConfig.logMethodName(this);
|
||||
}
|
||||
} catch (Throwable e) {
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onStart() {
|
||||
super.onStart();
|
||||
if (AppDebugConfig.IS_DEBUG) {
|
||||
AppDebugConfig.logMethodName(this);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onRestoreInstanceState(Bundle savedInstanceState) {
|
||||
super.onRestoreInstanceState(savedInstanceState);
|
||||
if (AppDebugConfig.IS_DEBUG) {
|
||||
AppDebugConfig.logMethodName(this);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
@ -1,19 +1,14 @@
|
||||
package com.gh.base;
|
||||
|
||||
import android.annotation.TargetApi;
|
||||
import android.graphics.Color;
|
||||
import android.os.Build;
|
||||
import android.os.Bundle;
|
||||
import android.support.v7.widget.Toolbar;
|
||||
import android.view.MenuItem;
|
||||
import android.view.View;
|
||||
import android.view.Window;
|
||||
import android.view.WindowManager;
|
||||
|
||||
import com.gh.gamecenter.R;
|
||||
import com.lightgame.BaseAppCompatActivity;
|
||||
import com.lightgame.ToolbarContainer;
|
||||
import com.lightgame.ToolbarController;
|
||||
import com.readystatesoftware.systembartint.SystemBarTintManager;
|
||||
|
||||
import java.lang.reflect.Field;
|
||||
@ -22,14 +17,13 @@ import java.lang.reflect.Method;
|
||||
/**
|
||||
* Created by csheng on 15-10-12.
|
||||
*/
|
||||
@ToolbarContainer
|
||||
public abstract class BaseAppCompatToolBarActivity extends BaseAppCompatActivity implements ToolbarController {
|
||||
|
||||
private Toolbar mToolbar;
|
||||
private SystemBarTintManager mTintManager;
|
||||
|
||||
// TODO 获取沉浸栏管理,要进行版本判断或者判断是否为空
|
||||
public SystemBarTintManager getTintManager() {
|
||||
protected SystemBarTintManager getTintManager() {
|
||||
return mTintManager;
|
||||
}
|
||||
|
||||
@ -44,13 +38,8 @@ public abstract class BaseAppCompatToolBarActivity extends BaseAppCompatActivity
|
||||
private void initToolbar() {
|
||||
mToolbar = (Toolbar) findViewById(R.id.toolbar_navigation);
|
||||
if (mToolbar != null) {
|
||||
// mToolbar.setTitle("");
|
||||
mToolbar.setTitle("");
|
||||
setSupportActionBar(mToolbar);
|
||||
mToolbar.addView(View.inflate(this, R.layout.reuse_actionbar, null));
|
||||
getSupportActionBar().setHomeButtonEnabled(false);
|
||||
// getSupportActionBar().setDisplayHomeAsUpEnabled(false);
|
||||
// getSupportActionBar().setDisplayShowHomeEnabled(false);
|
||||
// getSupportActionBar().setDisplayOptions();
|
||||
}
|
||||
}
|
||||
|
||||
@ -108,7 +97,6 @@ public abstract class BaseAppCompatToolBarActivity extends BaseAppCompatActivity
|
||||
}
|
||||
}
|
||||
|
||||
@TargetApi(Build.VERSION_CODES.KITKAT)
|
||||
protected void setTranslucentStatus(boolean status) {
|
||||
Window window = getWindow();
|
||||
WindowManager.LayoutParams winParams = window.getAttributes();
|
||||
@ -134,16 +122,12 @@ public abstract class BaseAppCompatToolBarActivity extends BaseAppCompatActivity
|
||||
|
||||
@Override
|
||||
public void setNavigationTitle(int res) {
|
||||
if (mToolbar != null) {
|
||||
mToolbar.setTitle(res);
|
||||
}
|
||||
mToolbar.setTitle(res);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setNavigationTitle(CharSequence res) {
|
||||
if (mToolbar != null) {
|
||||
mToolbar.setTitle(res);
|
||||
}
|
||||
mToolbar.setTitle(res);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@ -1,397 +1,394 @@
|
||||
//package com.gh.base;
|
||||
//
|
||||
//import android.content.Intent;
|
||||
//import android.os.Bundle;
|
||||
//import android.support.v4.content.ContextCompat;
|
||||
//import android.support.v7.widget.RecyclerView;
|
||||
//import android.text.TextUtils;
|
||||
//import android.view.View;
|
||||
//import android.widget.ImageView;
|
||||
//import android.widget.LinearLayout;
|
||||
//import android.widget.ProgressBar;
|
||||
//import android.widget.RelativeLayout;
|
||||
//import android.widget.TextView;
|
||||
//
|
||||
//import com.gh.common.constant.Config;
|
||||
//import com.gh.common.util.ApkActiveUtils;
|
||||
//import com.gh.common.util.DataUtils;
|
||||
//import com.gh.common.util.DialogUtils;
|
||||
//import com.gh.common.util.DisplayUtils;
|
||||
//import com.gh.common.util.GameUtils;
|
||||
//import com.gh.common.util.NetworkUtils;
|
||||
//import com.gh.common.util.PackageUtils;
|
||||
//import com.gh.common.util.ShareUtils;
|
||||
//import com.gh.common.view.DownloadDialog;
|
||||
//import com.gh.download.DownloadManager;
|
||||
//import com.gh.gamecenter.DownloadManagerActivity;
|
||||
//import com.gh.gamecenter.R;
|
||||
//import com.gh.gamecenter.entity.ApkEntity;
|
||||
//import com.gh.gamecenter.entity.GameEntity;
|
||||
//import com.gh.gamecenter.eventbus.EBDownloadStatus;
|
||||
//import com.gh.gamecenter.eventbus.EBPackage;
|
||||
//import com.gh.gamecenter.manager.PackageManager;
|
||||
//import com.lightgame.download.DataWatcher;
|
||||
//import com.lightgame.download.DownloadEntity;
|
||||
//import com.lightgame.download.FileUtils;
|
||||
//import com.tencent.tauth.Tencent;
|
||||
//
|
||||
//import org.greenrobot.eventbus.Subscribe;
|
||||
//import org.greenrobot.eventbus.ThreadMode;
|
||||
//
|
||||
///**
|
||||
// * Created by Administrator on 2016/9/19.
|
||||
// * 游戏详情、新闻详情基类(控制底部下载栏)
|
||||
// */
|
||||
//public abstract class BaseDetailActivity extends BaseActivity implements View.OnClickListener {
|
||||
//
|
||||
// protected TextView actionbar_tv_title;
|
||||
// protected RecyclerView detail_rv_show;
|
||||
// protected LinearLayout detail_ll_bottom;
|
||||
// protected TextView detail_tv_download;
|
||||
// protected ProgressBar detail_pb_progressbar;
|
||||
// protected TextView detail_tv_per;
|
||||
// protected LinearLayout reuse_ll_loading;
|
||||
// protected LinearLayout reuse_no_connection;
|
||||
// protected LinearLayout reuse_none_data;
|
||||
// protected TextView reuse_tv_none_data;
|
||||
// protected ImageView iv_share;
|
||||
//
|
||||
// protected GameEntity gameEntity;
|
||||
// protected DownloadEntity mDownloadEntity;
|
||||
//
|
||||
// protected String name;
|
||||
// protected String title;
|
||||
// protected String downloadAddWord;
|
||||
// protected String downloadOffText;
|
||||
//
|
||||
// private DataWatcher dataWatcher = new DataWatcher() {
|
||||
// @Override
|
||||
// public void onDataChanged(DownloadEntity downloadEntity) {
|
||||
// if (gameEntity != null && gameEntity.getApk().size() == 1) {
|
||||
// String url = gameEntity.getApk().get(0).getUrl();
|
||||
// if (url.equals(downloadEntity.getUrl())) {
|
||||
// if (!"pause".equals(DownloadManager.getInstance(BaseDetailActivity.this).
|
||||
// getStatus(downloadEntity.getUrl()))) {
|
||||
// mDownloadEntity = downloadEntity;
|
||||
// invalidate();
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
// };
|
||||
//
|
||||
// @Override
|
||||
// protected int getLayoutId() {
|
||||
// return R.layout.activity_detail;
|
||||
// }
|
||||
//
|
||||
// //接收QQ或者QQ空间分享回调
|
||||
// @Override
|
||||
// protected void onActivityResult(int requestCode, int resultCode, Intent data) {
|
||||
// super.onActivityResult(requestCode, resultCode, data);
|
||||
//
|
||||
// if (requestCode == com.tencent.connect.common.Constants.REQUEST_QQ_SHARE
|
||||
// || requestCode == com.tencent.connect.common.Constants.REQUEST_QZONE_SHARE) {
|
||||
// Tencent.onActivityResultData(requestCode, resultCode, data, ShareUtils.getInstance(this).QqShareListener);
|
||||
// }
|
||||
//
|
||||
// }
|
||||
//
|
||||
// @Override
|
||||
// protected void onCreate(Bundle savedInstanceState) {
|
||||
// super.onCreate(savedInstanceState);
|
||||
//
|
||||
// // 添加分享图标
|
||||
// iv_share = new ImageView(this);
|
||||
// iv_share.setImageResource(R.drawable.ic_share);
|
||||
// iv_share.setOnClickListener(this);
|
||||
// iv_share.setVisibility(View.GONE);
|
||||
// iv_share.setPadding(DisplayUtils.dip2px(this, 13), DisplayUtils.dip2px(this, 11)
|
||||
// , DisplayUtils.dip2px(this, 11), DisplayUtils.dip2px(this, 13));
|
||||
// RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(
|
||||
// DisplayUtils.dip2px(this, 48), DisplayUtils.dip2px(this, 48));
|
||||
// params.addRule(RelativeLayout.CENTER_VERTICAL);
|
||||
// params.addRule(RelativeLayout.ALIGN_PARENT_RIGHT);
|
||||
// RelativeLayout reuse_actionbar = (RelativeLayout) mContentView.findViewById(
|
||||
// R.id.reuse_actionbar);
|
||||
// reuse_actionbar.addView(iv_share, params);
|
||||
//
|
||||
// actionbar_tv_title = (TextView) findViewById(R.id.actionbar_tv_title);
|
||||
// detail_rv_show = (RecyclerView) findViewById(R.id.detail_rv_show);
|
||||
// detail_ll_bottom = (LinearLayout) findViewById(R.id.detail_ll_bottom);
|
||||
// detail_tv_download = (TextView) findViewById(R.id.detail_tv_download);
|
||||
// detail_pb_progressbar = (ProgressBar) findViewById(R.id.detail_pb_progressbar);
|
||||
// detail_tv_per = (TextView) findViewById(R.id.detail_tv_per);
|
||||
// reuse_ll_loading = (LinearLayout) findViewById(R.id.reuse_ll_loading);
|
||||
// reuse_no_connection = (LinearLayout) findViewById(R.id.reuse_no_connection);
|
||||
// reuse_none_data = (LinearLayout) findViewById(R.id.reuse_none_data);
|
||||
// reuse_tv_none_data = (TextView) findViewById(R.id.reuse_tv_none_data);
|
||||
//
|
||||
// detail_ll_bottom.setOnClickListener(this);
|
||||
// detail_tv_download.setOnClickListener(this);
|
||||
// detail_pb_progressbar.setOnClickListener(this);
|
||||
// detail_tv_per.setOnClickListener(this);
|
||||
// reuse_no_connection.setOnClickListener(this);
|
||||
//
|
||||
// }
|
||||
//
|
||||
// @Override
|
||||
// protected void onPause() {
|
||||
// super.onPause();
|
||||
// DownloadManager.getInstance(this).removeObserver(dataWatcher);
|
||||
// }
|
||||
//
|
||||
// @Override
|
||||
// protected void onResume() {
|
||||
// super.onResume();
|
||||
// if (gameEntity != null
|
||||
// && gameEntity.getApk() != null
|
||||
// && gameEntity.getApk().size() == 1) {
|
||||
// initDownload(true);
|
||||
// }
|
||||
// DownloadManager.getInstance(this).addObserver(dataWatcher);
|
||||
// }
|
||||
//
|
||||
// protected void initDownload(boolean isCheck) {
|
||||
// if (Config.isShow(this)) {
|
||||
// detail_ll_bottom.setVisibility(View.VISIBLE);
|
||||
// detail_rv_show.setPadding(0, 0, 0,
|
||||
// DisplayUtils.dip2px(getApplicationContext(), 60));
|
||||
// } else {
|
||||
// detail_ll_bottom.setVisibility(View.GONE);
|
||||
// detail_rv_show.setPadding(0, 0, 0, 0);
|
||||
// }
|
||||
// if (gameEntity != null && "光环助手".equals(gameEntity.getName())) {
|
||||
// detail_ll_bottom.setVisibility(View.GONE);
|
||||
// detail_rv_show.setPadding(0, 0, 0, 0);
|
||||
// } else if (gameEntity == null || gameEntity.getApk().isEmpty()) {
|
||||
// detail_tv_download.setVisibility(View.VISIBLE);
|
||||
// detail_pb_progressbar.setVisibility(View.GONE);
|
||||
// detail_tv_per.setVisibility(View.GONE);
|
||||
// if (TextUtils.isEmpty(downloadOffText)) {
|
||||
// detail_tv_download.setText("暂无下载");
|
||||
// } else {
|
||||
// detail_tv_download.setText(downloadOffText);
|
||||
// }
|
||||
// detail_tv_download.setBackgroundResource(R.drawable.game_item_btn_pause_style);
|
||||
// detail_tv_download.setTextColor(0xFF999999);
|
||||
// detail_tv_download.setClickable(false);
|
||||
// } else {
|
||||
// detail_tv_download.setVisibility(View.VISIBLE);
|
||||
// detail_pb_progressbar.setVisibility(View.GONE);
|
||||
// detail_tv_per.setVisibility(View.GONE);
|
||||
// boolean isInstalled = false;
|
||||
// if (gameEntity.getApk() != null && gameEntity.getApk().size() == 1
|
||||
// && PackageManager.isInstalled(gameEntity.getApk().get(0).getPackageName())) {
|
||||
// isInstalled = true;
|
||||
// }
|
||||
// if (isInstalled) {
|
||||
// if (PackageManager.isCanUpdate(gameEntity.getId(), gameEntity.getApk().get(0).getPackageName())) {
|
||||
// if (TextUtils.isEmpty(downloadAddWord)) {
|
||||
// detail_tv_download.setBackgroundResource(
|
||||
// R.drawable.game_item_btn_download_style);
|
||||
// detail_tv_download.setText(String.format("更新《%s》",
|
||||
// gameEntity.getName()));
|
||||
// } else {
|
||||
// detail_tv_download.setBackgroundResource(
|
||||
// R.drawable.game_item_btn_download_style);
|
||||
// detail_tv_download.setText(String.format("更新《%s》%s",
|
||||
// gameEntity.getName(), downloadAddWord));
|
||||
// }
|
||||
// } else {
|
||||
// if (gameEntity.getTag() != null && gameEntity.getTag().size() != 0
|
||||
// && !TextUtils.isEmpty(gameEntity.getApk().get(0).getGhVersion())
|
||||
// && !PackageUtils.isSignature(this, gameEntity.getApk().get(0).getPackageName())) {
|
||||
// if (TextUtils.isEmpty(downloadAddWord)) {
|
||||
// detail_tv_download.setBackgroundResource(
|
||||
// R.drawable.game_item_btn_plugin_style);
|
||||
// detail_tv_download.setText(String.format("插件化《%s》",
|
||||
// gameEntity.getName()));
|
||||
// } else {
|
||||
// detail_tv_download.setBackgroundResource(
|
||||
// R.drawable.game_item_btn_plugin_style);
|
||||
// detail_tv_download.setText(String.format("插件化《%s》%s",
|
||||
// gameEntity.getName(), downloadAddWord));
|
||||
// }
|
||||
// } else {
|
||||
// if (TextUtils.isEmpty(downloadAddWord)) {
|
||||
// detail_tv_download.setBackgroundResource(
|
||||
// R.drawable.game_item_btn_launch_style);
|
||||
// detail_tv_download.setText(String.format("启动《%s》",
|
||||
// gameEntity.getName()));
|
||||
// } else {
|
||||
// detail_tv_download.setBackgroundResource(
|
||||
// R.drawable.game_item_btn_launch_style);
|
||||
// detail_tv_download.setText(String.format("启动《%s》%s",
|
||||
// gameEntity.getName(), downloadAddWord));
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
// } else {
|
||||
// String status = GameUtils.getDownloadBtnText(this, gameEntity);
|
||||
//
|
||||
// switch (status) {
|
||||
// case "插件化":
|
||||
// detail_tv_download.setBackgroundResource(R.drawable.game_item_btn_plugin_style);
|
||||
// break;
|
||||
// case "打开":
|
||||
// detail_tv_download.setBackgroundResource(R.drawable.game_item_btn_launch_style);
|
||||
// break;
|
||||
// default:
|
||||
// detail_tv_download.setBackgroundResource(R.drawable.game_item_btn_download_style);
|
||||
// break;
|
||||
// }
|
||||
//
|
||||
// if (TextUtils.isEmpty(downloadAddWord)) {
|
||||
// detail_tv_download.setText(String.format(status + "《%s》",
|
||||
// gameEntity.getName()));
|
||||
// } else {
|
||||
// detail_tv_download.setText(String.format(status + "《%s》%s",
|
||||
// gameEntity.getName(), downloadAddWord));
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
// if (isCheck && gameEntity != null
|
||||
// && gameEntity.getApk() != null
|
||||
// && gameEntity.getApk().size() == 1) {
|
||||
// String url = gameEntity.getApk().get(0).getUrl();
|
||||
// DownloadEntity downloadEntity = DownloadManager.getInstance(getApplicationContext()).get(url);
|
||||
// if (downloadEntity != null) {
|
||||
// mDownloadEntity = downloadEntity;
|
||||
// detail_tv_download.setVisibility(View.GONE);
|
||||
// detail_pb_progressbar.setVisibility(View.VISIBLE);
|
||||
// detail_tv_per.setVisibility(View.VISIBLE);
|
||||
// invalidate();
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
//
|
||||
// private void invalidate() {
|
||||
// detail_pb_progressbar.setProgress((int) (mDownloadEntity.getPercent() * 10));
|
||||
// detail_tv_per.setTextColor(0xFFFFFFFF);
|
||||
// switch (mDownloadEntity.getStatus()) {
|
||||
// case downloading:
|
||||
// case pause:
|
||||
// case timeout:
|
||||
// case neterror:
|
||||
// case waiting:
|
||||
// detail_tv_per.setText("下载中");
|
||||
// break;
|
||||
// case done:
|
||||
// detail_tv_per.setText("安装");
|
||||
// if (mDownloadEntity.isPluggable()
|
||||
// && PackageManager.isInstalled(mDownloadEntity.getPackageName())) {
|
||||
// detail_pb_progressbar.setProgressDrawable(ContextCompat.getDrawable(this, R.drawable.progressbar_plugin_radius_style));
|
||||
// } else {
|
||||
// detail_pb_progressbar.setProgressDrawable(ContextCompat.getDrawable(this, R.drawable.progressbar_normal_radius_style));
|
||||
// }
|
||||
// break;
|
||||
// case cancel:
|
||||
// case hijack:
|
||||
// case notfound:
|
||||
// initDownload(false);
|
||||
// break;
|
||||
// default:
|
||||
// break;
|
||||
// }
|
||||
// }
|
||||
//
|
||||
// // 接收下载被删除消息
|
||||
// @Subscribe(threadMode = ThreadMode.MAIN)
|
||||
// public void onEvent(EBDownloadStatus status) {
|
||||
// if ("delete".equals(status.getStatus())
|
||||
// && gameEntity != null
|
||||
// && gameEntity.getApk() != null
|
||||
// && gameEntity.getApk().size() == 1) {
|
||||
// String url = gameEntity.getApk().get(0).getUrl();
|
||||
// if (url.equals(status.getUrl())) {
|
||||
// initDownload(false);
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
//
|
||||
// // 接受安装、卸载消息
|
||||
// @Subscribe(threadMode = ThreadMode.MAIN)
|
||||
// public void onEventMainThread(EBPackage busFour) {
|
||||
// if (gameEntity != null
|
||||
// && gameEntity.getApk() != null
|
||||
// && gameEntity.getApk().size() > 0) {
|
||||
// for (ApkEntity apkEntity : gameEntity.getApk()) {
|
||||
// String packageName = apkEntity.getPackageName();
|
||||
// if (packageName.equals(busFour.getPackageName())) {
|
||||
// ApkActiveUtils.filterHideApk(gameEntity);
|
||||
// initDownload(false);
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
//
|
||||
// @Override
|
||||
// public void onClick(View v) {
|
||||
// if (v == detail_tv_download) {
|
||||
// if (gameEntity != null && !gameEntity.getApk().isEmpty()) {
|
||||
// if (gameEntity.getApk().size() == 1) {
|
||||
// if (NetworkUtils.isWifiConnected(this)) {
|
||||
// download();
|
||||
// } else {
|
||||
// DialogUtils.showDownloadDialog(this, new DialogUtils.ConfirmListener() {
|
||||
// @Override
|
||||
// public void onConfirm() {
|
||||
// download();
|
||||
// }
|
||||
// });
|
||||
// }
|
||||
// } else {
|
||||
// DownloadDialog.getInstance(this).showPopupWindow(v, gameEntity, mEntrance, name + ":" + title);
|
||||
// }
|
||||
// } else {
|
||||
// toast("稍等片刻~!游戏正在上传中...");
|
||||
// }
|
||||
// } else if (v == detail_pb_progressbar || v == detail_tv_per) {
|
||||
// String str = detail_tv_per.getText().toString();
|
||||
// if ("下载中".equals(str)) {
|
||||
// DownloadManagerActivity.startDownloadManagerActivity(this, gameEntity.getApk().get(0).getUrl()
|
||||
// , mEntrance + "+(" + name + "[" + title + "])");
|
||||
// } else if ("安装".equals(str)) {
|
||||
// PackageUtils.launchSetup(this, mDownloadEntity.getPath());
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
//
|
||||
// private void download() {
|
||||
// String str = detail_tv_download.getText().toString();
|
||||
// if (str.contains("启动")) {
|
||||
// DataUtils.onGameLaunchEvent(this, gameEntity.getName(), gameEntity.getApk().get(0).getPlatform(), name);
|
||||
//
|
||||
// PackageUtils.launchApplicationByPackageName(this, gameEntity.getApk().get(0).getPackageName());
|
||||
// } else {
|
||||
// String method;
|
||||
// if (str.contains("更新")) {
|
||||
// method = "更新";
|
||||
// } else if (str.contains("插件化")) {
|
||||
// method = "插件化";
|
||||
// } else {
|
||||
// method = "下载";
|
||||
// }
|
||||
// ApkEntity apkEntity = gameEntity.getApk().get(0);
|
||||
// String msg = FileUtils.isCanDownload(this, apkEntity.getSize());
|
||||
// if (TextUtils.isEmpty(msg)) {
|
||||
// DataUtils.onGameDownloadEvent(this, gameEntity.getName(), apkEntity.getPlatform(), mEntrance, "下载开始");
|
||||
//
|
||||
// DownloadManager.createDownload(this, apkEntity, gameEntity, method, mEntrance, name + ":" + title);
|
||||
//
|
||||
// detail_tv_download.setVisibility(View.GONE);
|
||||
// detail_pb_progressbar.setVisibility(View.VISIBLE);
|
||||
// detail_tv_per.setVisibility(View.VISIBLE);
|
||||
// detail_pb_progressbar.setProgress(0);
|
||||
// detail_tv_per.setText("0.0%");
|
||||
//
|
||||
//// DownloadManager.getInstance(BaseDetailActivity.this).putStatus(apkEntity.getUrl(), "downloading");
|
||||
// } else {
|
||||
// toast(msg);
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
//
|
||||
//}
|
||||
//>>>>>>> b239407c25cb85374c0f50c257411b4b98e10e77
|
||||
package com.gh.base;
|
||||
|
||||
import android.content.Intent;
|
||||
import android.os.Bundle;
|
||||
import android.support.v7.widget.RecyclerView;
|
||||
import android.text.TextUtils;
|
||||
import android.view.View;
|
||||
import android.widget.ImageView;
|
||||
import android.widget.LinearLayout;
|
||||
import android.widget.ProgressBar;
|
||||
import android.widget.RelativeLayout;
|
||||
import android.widget.TextView;
|
||||
|
||||
import com.gh.common.constant.Config;
|
||||
import com.gh.common.util.ApkActiveUtils;
|
||||
import com.gh.common.util.DataUtils;
|
||||
import com.gh.common.util.DialogUtils;
|
||||
import com.gh.common.util.DisplayUtils;
|
||||
import com.gh.common.util.FileUtils;
|
||||
import com.gh.common.util.GameUtils;
|
||||
import com.gh.common.util.NetworkUtils;
|
||||
import com.gh.common.util.PackageUtils;
|
||||
import com.gh.common.util.ShareUtils;
|
||||
import com.gh.common.view.DownloadDialog;
|
||||
import com.gh.download.DataWatcher;
|
||||
import com.gh.download.DownloadEntity;
|
||||
import com.gh.download.DownloadManager;
|
||||
import com.gh.gamecenter.DownloadManagerActivity;
|
||||
import com.gh.gamecenter.R;
|
||||
import com.gh.gamecenter.entity.ApkEntity;
|
||||
import com.gh.gamecenter.entity.GameEntity;
|
||||
import com.gh.gamecenter.eventbus.EBDownloadStatus;
|
||||
import com.gh.gamecenter.eventbus.EBPackage;
|
||||
import com.gh.gamecenter.manager.PackageManager;
|
||||
import com.tencent.tauth.Tencent;
|
||||
|
||||
import org.greenrobot.eventbus.Subscribe;
|
||||
import org.greenrobot.eventbus.ThreadMode;
|
||||
|
||||
/**
|
||||
* Created by Administrator on 2016/9/19.
|
||||
* 游戏详情、新闻详情基类(控制底部下载栏)
|
||||
*/
|
||||
public abstract class BaseDetailActivity extends BaseActivity implements View.OnClickListener {
|
||||
|
||||
protected TextView actionbar_tv_title;
|
||||
protected RecyclerView detail_rv_show;
|
||||
protected LinearLayout detail_ll_bottom;
|
||||
protected TextView detail_tv_download;
|
||||
protected ProgressBar detail_pb_progressbar;
|
||||
protected TextView detail_tv_per;
|
||||
protected LinearLayout reuse_ll_loading;
|
||||
protected LinearLayout reuse_no_connection;
|
||||
protected LinearLayout reuse_none_data;
|
||||
protected TextView reuse_tv_none_data;
|
||||
protected ImageView iv_share;
|
||||
|
||||
protected GameEntity gameEntity;
|
||||
protected DownloadEntity mDownloadEntity;
|
||||
|
||||
protected String name;
|
||||
protected String title;
|
||||
protected String downloadAddWord;
|
||||
protected String downloadOffText;
|
||||
|
||||
private DataWatcher dataWatcher = new DataWatcher() {
|
||||
@Override
|
||||
public void onDataChanged(DownloadEntity downloadEntity) {
|
||||
if (gameEntity != null && gameEntity.getApk().size() == 1) {
|
||||
String url = gameEntity.getApk().get(0).getUrl();
|
||||
if (url.equals(downloadEntity.getUrl())) {
|
||||
if (!"pause".equals(DownloadManager.getInstance(BaseDetailActivity.this).
|
||||
getStatus(downloadEntity.getUrl()))) {
|
||||
mDownloadEntity = downloadEntity;
|
||||
invalidate();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
@Override
|
||||
protected int getLayoutId() {
|
||||
return R.layout.activity_detail;
|
||||
}
|
||||
|
||||
//接收QQ或者QQ空间分享回调
|
||||
@Override
|
||||
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
|
||||
super.onActivityResult(requestCode, resultCode, data);
|
||||
|
||||
if (requestCode == com.tencent.connect.common.Constants.REQUEST_QQ_SHARE
|
||||
|| requestCode == com.tencent.connect.common.Constants.REQUEST_QZONE_SHARE) {
|
||||
Tencent.onActivityResultData(requestCode, resultCode, data, ShareUtils.getInstance(this).QqShareListener);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onCreate(Bundle savedInstanceState) {
|
||||
super.onCreate(savedInstanceState);
|
||||
|
||||
// View contentView = View.inflate(this, R.layout.activity_detail, null);
|
||||
|
||||
// 添加分享图标
|
||||
iv_share = new ImageView(this);
|
||||
iv_share.setImageResource(R.drawable.ic_share);
|
||||
iv_share.setOnClickListener(this);
|
||||
iv_share.setVisibility(View.GONE);
|
||||
iv_share.setPadding(DisplayUtils.dip2px(this, 13), DisplayUtils.dip2px(this, 11)
|
||||
, DisplayUtils.dip2px(this, 11), DisplayUtils.dip2px(this, 13));
|
||||
RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(
|
||||
DisplayUtils.dip2px(this, 48), DisplayUtils.dip2px(this, 48));
|
||||
params.addRule(RelativeLayout.CENTER_VERTICAL);
|
||||
params.addRule(RelativeLayout.ALIGN_PARENT_RIGHT);
|
||||
RelativeLayout reuse_actionbar = (RelativeLayout) mContentView.findViewById(
|
||||
R.id.reuse_actionbar);
|
||||
reuse_actionbar.addView(iv_share, params);
|
||||
|
||||
// init(contentView);
|
||||
|
||||
actionbar_tv_title = (TextView) findViewById(R.id.actionbar_tv_title);
|
||||
detail_rv_show = (RecyclerView) findViewById(R.id.detail_rv_show);
|
||||
detail_ll_bottom = (LinearLayout) findViewById(R.id.detail_ll_bottom);
|
||||
detail_tv_download = (TextView) findViewById(R.id.detail_tv_download);
|
||||
detail_pb_progressbar = (ProgressBar) findViewById(R.id.detail_pb_progressbar);
|
||||
detail_tv_per = (TextView) findViewById(R.id.detail_tv_per);
|
||||
reuse_ll_loading = (LinearLayout) findViewById(R.id.reuse_ll_loading);
|
||||
reuse_no_connection = (LinearLayout) findViewById(R.id.reuse_no_connection);
|
||||
reuse_none_data = (LinearLayout) findViewById(R.id.reuse_none_data);
|
||||
reuse_tv_none_data = (TextView) findViewById(R.id.reuse_tv_none_data);
|
||||
|
||||
detail_ll_bottom.setOnClickListener(this);
|
||||
detail_tv_download.setOnClickListener(this);
|
||||
detail_pb_progressbar.setOnClickListener(this);
|
||||
detail_tv_per.setOnClickListener(this);
|
||||
reuse_no_connection.setOnClickListener(this);
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onPause() {
|
||||
super.onPause();
|
||||
DownloadManager.getInstance(this).removeObserver(dataWatcher);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onResume() {
|
||||
super.onResume();
|
||||
if (gameEntity != null
|
||||
&& gameEntity.getApk() != null
|
||||
&& gameEntity.getApk().size() == 1) {
|
||||
initDownload(true);
|
||||
}
|
||||
DownloadManager.getInstance(this).addObserver(dataWatcher);
|
||||
}
|
||||
|
||||
protected void initDownload(boolean isCheck) {
|
||||
if (Config.isShow(this)) {
|
||||
detail_ll_bottom.setVisibility(View.VISIBLE);
|
||||
detail_rv_show.setPadding(0, 0, 0,
|
||||
DisplayUtils.dip2px(getApplicationContext(), 60));
|
||||
} else {
|
||||
detail_ll_bottom.setVisibility(View.GONE);
|
||||
detail_rv_show.setPadding(0, 0, 0, 0);
|
||||
}
|
||||
if (gameEntity != null && "光环助手".equals(gameEntity.getName())) {
|
||||
detail_ll_bottom.setVisibility(View.GONE);
|
||||
detail_rv_show.setPadding(0, 0, 0, 0);
|
||||
} else if (gameEntity == null || gameEntity.getApk().isEmpty()) {
|
||||
detail_tv_download.setVisibility(View.VISIBLE);
|
||||
detail_pb_progressbar.setVisibility(View.GONE);
|
||||
detail_tv_per.setVisibility(View.GONE);
|
||||
if (TextUtils.isEmpty(downloadOffText)) {
|
||||
detail_tv_download.setText("暂无下载");
|
||||
} else {
|
||||
detail_tv_download.setText(downloadOffText);
|
||||
}
|
||||
detail_tv_download.setBackgroundResource(R.drawable.game_item_btn_pause_style);
|
||||
detail_tv_download.setTextColor(0xFF999999);
|
||||
detail_tv_download.setClickable(false);
|
||||
} else {
|
||||
detail_tv_download.setVisibility(View.VISIBLE);
|
||||
detail_pb_progressbar.setVisibility(View.GONE);
|
||||
detail_tv_per.setVisibility(View.GONE);
|
||||
boolean isInstalled = false;
|
||||
if (gameEntity.getApk() != null && gameEntity.getApk().size() == 1
|
||||
&& PackageManager.isInstalled(gameEntity.getApk().get(0).getPackageName())) {
|
||||
isInstalled = true;
|
||||
}
|
||||
if (isInstalled) {
|
||||
if (PackageManager.isCanUpdate(gameEntity.getId(), gameEntity.getApk().get(0).getPackageName())) {
|
||||
if (TextUtils.isEmpty(downloadAddWord)) {
|
||||
detail_tv_download.setBackgroundResource(
|
||||
R.drawable.game_item_btn_download_style);
|
||||
detail_tv_download.setText(String.format("更新《%s》",
|
||||
gameEntity.getName()));
|
||||
} else {
|
||||
detail_tv_download.setBackgroundResource(
|
||||
R.drawable.game_item_btn_download_style);
|
||||
detail_tv_download.setText(String.format("更新《%s》%s",
|
||||
gameEntity.getName(), downloadAddWord));
|
||||
}
|
||||
} else {
|
||||
if (gameEntity.getTag() != null && gameEntity.getTag().size() != 0
|
||||
&& !TextUtils.isEmpty(gameEntity.getApk().get(0).getGhVersion())
|
||||
&& !PackageUtils.isSignature(this, gameEntity.getApk().get(0).getPackageName())) {
|
||||
if (TextUtils.isEmpty(downloadAddWord)) {
|
||||
detail_tv_download.setBackgroundResource(
|
||||
R.drawable.game_item_btn_plugin_style);
|
||||
detail_tv_download.setText(String.format("插件化《%s》",
|
||||
gameEntity.getName()));
|
||||
} else {
|
||||
detail_tv_download.setBackgroundResource(
|
||||
R.drawable.game_item_btn_plugin_style);
|
||||
detail_tv_download.setText(String.format("插件化《%s》%s",
|
||||
gameEntity.getName(), downloadAddWord));
|
||||
}
|
||||
} else {
|
||||
if (TextUtils.isEmpty(downloadAddWord)) {
|
||||
detail_tv_download.setBackgroundResource(
|
||||
R.drawable.game_item_btn_launch_style);
|
||||
detail_tv_download.setText(String.format("启动《%s》",
|
||||
gameEntity.getName()));
|
||||
} else {
|
||||
detail_tv_download.setBackgroundResource(
|
||||
R.drawable.game_item_btn_launch_style);
|
||||
detail_tv_download.setText(String.format("启动《%s》%s",
|
||||
gameEntity.getName(), downloadAddWord));
|
||||
}
|
||||
}
|
||||
}
|
||||
} else {
|
||||
String status = GameUtils.getDownloadBtnText(this, gameEntity);
|
||||
if ("插件化".equals(status)) {
|
||||
detail_tv_download.setBackgroundResource(R.drawable.game_item_btn_plugin_style);
|
||||
} else if ("打开".equals(status)) {
|
||||
detail_tv_download.setBackgroundResource(R.drawable.game_item_btn_launch_style);
|
||||
} else {
|
||||
detail_tv_download.setBackgroundResource(R.drawable.game_item_btn_download_style);
|
||||
}
|
||||
|
||||
if (TextUtils.isEmpty(downloadAddWord)) {
|
||||
detail_tv_download.setText(String.format(status + "《%s》",
|
||||
gameEntity.getName()));
|
||||
} else {
|
||||
detail_tv_download.setText(String.format(status + "《%s》%s",
|
||||
gameEntity.getName(), downloadAddWord));
|
||||
}
|
||||
}
|
||||
}
|
||||
if (isCheck && gameEntity != null
|
||||
&& gameEntity.getApk() != null
|
||||
&& gameEntity.getApk().size() == 1) {
|
||||
String url = gameEntity.getApk().get(0).getUrl();
|
||||
DownloadEntity downloadEntity = DownloadManager.getInstance(getApplicationContext()).get(url);
|
||||
if (downloadEntity != null) {
|
||||
mDownloadEntity = downloadEntity;
|
||||
detail_tv_download.setVisibility(View.GONE);
|
||||
detail_pb_progressbar.setVisibility(View.VISIBLE);
|
||||
detail_tv_per.setVisibility(View.VISIBLE);
|
||||
invalidate();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void invalidate() {
|
||||
detail_pb_progressbar.setProgress((int) (mDownloadEntity.getPercent() * 10));
|
||||
detail_tv_per.setTextColor(0xFFFFFFFF);
|
||||
switch (mDownloadEntity.getStatus()) {
|
||||
case downloading:
|
||||
case pause:
|
||||
case timeout:
|
||||
case neterror:
|
||||
case waiting:
|
||||
detail_tv_per.setText("下载中");
|
||||
break;
|
||||
case done:
|
||||
detail_tv_per.setText("安装");
|
||||
if (mDownloadEntity.isPluggable()
|
||||
&& PackageManager.isInstalled(mDownloadEntity.getPackageName())) {
|
||||
detail_pb_progressbar.setProgressDrawable(getResources().getDrawable(R.drawable.progressbar_plugin_radius_style));
|
||||
} else {
|
||||
detail_pb_progressbar.setProgressDrawable(getResources().getDrawable(R.drawable.progressbar_normal_radius_style));
|
||||
}
|
||||
break;
|
||||
case cancel:
|
||||
case hijack:
|
||||
case notfound:
|
||||
initDownload(false);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
// 接收下载被删除消息
|
||||
@Subscribe(threadMode = ThreadMode.MAIN)
|
||||
public void onEvent(EBDownloadStatus status) {
|
||||
if ("delete".equals(status.getStatus())
|
||||
&& gameEntity != null
|
||||
&& gameEntity.getApk() != null
|
||||
&& gameEntity.getApk().size() == 1) {
|
||||
String url = gameEntity.getApk().get(0).getUrl();
|
||||
if (url.equals(status.getUrl())) {
|
||||
initDownload(false);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// 接受安装、卸载消息
|
||||
@Subscribe(threadMode = ThreadMode.MAIN)
|
||||
public void onEventMainThread(EBPackage busFour) {
|
||||
if (gameEntity != null
|
||||
&& gameEntity.getApk() != null
|
||||
&& gameEntity.getApk().size() > 0) {
|
||||
for (ApkEntity apkEntity : gameEntity.getApk()) {
|
||||
String packageName = apkEntity.getPackageName();
|
||||
if (packageName.equals(busFour.getPackageName())) {
|
||||
ApkActiveUtils.filterHideApk(gameEntity);
|
||||
initDownload(false);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onClick(View v) {
|
||||
if (v == detail_tv_download) {
|
||||
if (gameEntity != null && !gameEntity.getApk().isEmpty()) {
|
||||
if (gameEntity.getApk().size() == 1) {
|
||||
if (NetworkUtils.isWifiConnected(this)) {
|
||||
download();
|
||||
} else {
|
||||
DialogUtils.showDownloadDialog(this, new DialogUtils.ConfirmListener() {
|
||||
@Override
|
||||
public void onConfirm() {
|
||||
download();
|
||||
}
|
||||
});
|
||||
}
|
||||
} else {
|
||||
DownloadDialog.getInstance(this).showPopupWindow(v, gameEntity, mEntrance, name + ":" + title);
|
||||
}
|
||||
} else {
|
||||
toast("稍等片刻~!游戏正在上传中...");
|
||||
}
|
||||
} else if (v == detail_pb_progressbar || v == detail_tv_per) {
|
||||
String str = detail_tv_per.getText().toString();
|
||||
if ("下载中".equals(str)) {
|
||||
DownloadManagerActivity.startDownloadManagerActivity(this, gameEntity.getApk().get(0).getUrl()
|
||||
, mEntrance + "+(" + name + "[" + title + "])");
|
||||
} else if ("安装".equals(str)) {
|
||||
PackageUtils.launchSetup(this, mDownloadEntity.getPath());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void download() {
|
||||
String str = detail_tv_download.getText().toString();
|
||||
if (str.contains("启动")) {
|
||||
DataUtils.onGameLaunchEvent(this, gameEntity.getName(), gameEntity.getApk().get(0).getPlatform(), name);
|
||||
|
||||
PackageUtils.launchApplicationByPackageName(this, gameEntity.getApk().get(0).getPackageName());
|
||||
} else {
|
||||
String method;
|
||||
if (str.contains("更新")) {
|
||||
method = "更新";
|
||||
} else if (str.contains("插件化")) {
|
||||
method = "插件化";
|
||||
} else {
|
||||
method = "下载";
|
||||
}
|
||||
ApkEntity apkEntity = gameEntity.getApk().get(0);
|
||||
String msg = FileUtils.isCanDownload(this, apkEntity.getSize());
|
||||
if (TextUtils.isEmpty(msg)) {
|
||||
DataUtils.onGameDownloadEvent(this, gameEntity.getName(), apkEntity.getPlatform(), mEntrance, "下载开始");
|
||||
|
||||
DownloadManager.createDownload(this, apkEntity, gameEntity, method, mEntrance, name + ":" + title);
|
||||
|
||||
detail_tv_download.setVisibility(View.GONE);
|
||||
detail_pb_progressbar.setVisibility(View.VISIBLE);
|
||||
detail_tv_per.setVisibility(View.VISIBLE);
|
||||
detail_pb_progressbar.setProgress(0);
|
||||
detail_tv_per.setText("0.0%");
|
||||
|
||||
DownloadManager.getInstance(BaseDetailActivity.this).putStatus(apkEntity.getUrl(), "downloading");
|
||||
} else {
|
||||
toast(msg);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
100
app/src/main/java/com/gh/base/BaseFragment.java
Normal file
100
app/src/main/java/com/gh/base/BaseFragment.java
Normal file
@ -0,0 +1,100 @@
|
||||
package com.gh.base;
|
||||
|
||||
import android.os.Bundle;
|
||||
import android.support.annotation.Nullable;
|
||||
import android.support.v4.app.Fragment;
|
||||
import android.view.LayoutInflater;
|
||||
import android.view.View;
|
||||
import android.view.ViewGroup;
|
||||
import android.widget.Toast;
|
||||
|
||||
import com.gh.common.util.EntranceUtils;
|
||||
import com.gh.gamecenter.listener.OnCallBackListener;
|
||||
|
||||
import org.greenrobot.eventbus.EventBus;
|
||||
|
||||
import butterknife.ButterKnife;
|
||||
|
||||
/**
|
||||
* Created by LGT on 2016/9/4.
|
||||
* Fragment 基类
|
||||
*/
|
||||
public class BaseFragment extends Fragment implements OnCallBackListener {
|
||||
|
||||
protected View view;
|
||||
|
||||
protected boolean isEverpause;
|
||||
|
||||
protected String mEntrance;
|
||||
|
||||
protected void init(int layout) {
|
||||
view = View.inflate(getActivity(), layout, null);
|
||||
|
||||
ButterKnife.bind(this, view);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onCreate(@Nullable Bundle savedInstanceState) {
|
||||
super.onCreate(savedInstanceState);
|
||||
mEntrance = getActivity().getIntent().getStringExtra(EntranceUtils.KEY_ENTRANCE);
|
||||
isEverpause = false;
|
||||
EventBus.getDefault().register(this);
|
||||
}
|
||||
|
||||
@Nullable
|
||||
@Override
|
||||
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container,
|
||||
@Nullable Bundle savedInstanceState) {
|
||||
if (container != null) {
|
||||
container.removeView(view);
|
||||
}
|
||||
return view;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onResume() {
|
||||
super.onResume();
|
||||
isEverpause = false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onPause() {
|
||||
super.onPause();
|
||||
isEverpause = true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onDestroy() {
|
||||
super.onDestroy();
|
||||
EventBus.getDefault().unregister(this);
|
||||
}
|
||||
|
||||
public void toast(String msg) {
|
||||
Toast.makeText(getContext(), msg, Toast.LENGTH_SHORT).show();
|
||||
}
|
||||
|
||||
public boolean isEverpause() {
|
||||
return isEverpause;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void loadDone() {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void loadDone(Object obj) {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void loadError() {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void loadEmpty() {
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
206
app/src/main/java/com/gh/base/BaseFragmentActivity.java
Normal file
206
app/src/main/java/com/gh/base/BaseFragmentActivity.java
Normal file
@ -0,0 +1,206 @@
|
||||
//package com.gh.base;
|
||||
//
|
||||
//import android.annotation.TargetApi;
|
||||
//import android.content.Context;
|
||||
//import android.graphics.Color;
|
||||
//import android.os.Build;
|
||||
//import android.os.Bundle;
|
||||
//import android.support.v4.app.FragmentActivity;
|
||||
//import android.view.*;
|
||||
//import android.view.View.OnClickListener;
|
||||
//import android.view.ViewGroup.LayoutParams;
|
||||
//import android.widget.*;
|
||||
//import butterknife.ButterKnife;
|
||||
//import com.gh.common.constant.Config;
|
||||
//import com.gh.common.util.*;
|
||||
//import com.gh.download.DownloadManager;
|
||||
//import com.gh.gamecenter.R;
|
||||
//import com.gh.gamecenter.eventbus.EBShowDialog;
|
||||
//import com.readystatesoftware.systembartint.SystemBarTintManager;
|
||||
//import com.readystatesoftware.systembartint.SystemBarTintManager.SystemBarConfig;
|
||||
//import de.greenrobot.event.EventBus;
|
||||
//
|
||||
//import java.lang.reflect.Field;
|
||||
//import java.lang.reflect.Method;
|
||||
//import java.util.ArrayList;
|
||||
//
|
||||
//public class BaseFragmentActivity extends FragmentActivity {
|
||||
//
|
||||
// protected String mEntrance;
|
||||
//
|
||||
// private boolean isPause;
|
||||
//
|
||||
// @Override
|
||||
// protected void onCreate(Bundle savedInstanceState) {
|
||||
// super.onCreate(savedInstanceState);
|
||||
// AppManager.getInstance().addActivity(this);
|
||||
// EventBus.getDefault().register(this);
|
||||
// mEntrance = getIntent().getStringExtra("mEntrance");
|
||||
// if (getIntent().getBundleExtra("data") != null) {
|
||||
// mEntrance = getIntent().getBundleExtra("data").getString("mEntrance");
|
||||
// }
|
||||
// }
|
||||
//
|
||||
// public void init(View contentView, String title) {
|
||||
// init(contentView);
|
||||
// TextView actionbar_tv_title = (TextView) findViewById(R.id.actionbar_tv_title);
|
||||
// actionbar_tv_title.setText(title);
|
||||
// }
|
||||
//
|
||||
// public void init(View contentView) {
|
||||
// if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
|
||||
// setTheme(R.style.AppTheme);
|
||||
// setTranslucentStatus(true);
|
||||
// SystemBarTintManager tintManager = new SystemBarTintManager(this);
|
||||
// tintManager.setStatusBarTintEnabled(true);
|
||||
// if (Build.MANUFACTURER.equals("Meizu") || Build.MANUFACTURER.equals("Xiaomi")) {
|
||||
// tintManager.setStatusBarTintColor(Color.WHITE);
|
||||
// } else {
|
||||
// tintManager.setStatusBarTintColor(Color.BLACK);
|
||||
// }
|
||||
// SystemBarConfig config = tintManager.getConfig();
|
||||
// contentView.setPadding(0, config.getPixelInsetTop(false), 0,
|
||||
// config.getPixelInsetBottom());
|
||||
//
|
||||
// if (Build.MANUFACTURER.equals("Meizu")) {
|
||||
// try {
|
||||
// Window window = getWindow();
|
||||
// if (window != null) {
|
||||
// WindowManager.LayoutParams lp = window.getAttributes();
|
||||
// Field darkFlag = WindowManager.LayoutParams.class.getDeclaredField("MEIZU_FLAG_DARK_STATUS_BAR_ICON");
|
||||
// Field meizuFlags = WindowManager.LayoutParams.class.getDeclaredField("meizuFlags");
|
||||
// darkFlag.setAccessible(true);
|
||||
// meizuFlags.setAccessible(true);
|
||||
// int bit = darkFlag.getInt(null);
|
||||
// int value = meizuFlags.getInt(lp);
|
||||
// value |= bit;
|
||||
// meizuFlags.setInt(lp, value);
|
||||
// window.setAttributes(lp);
|
||||
// }
|
||||
// } catch (Exception e) {
|
||||
// e.printStackTrace();
|
||||
// }
|
||||
// } else if (Build.MANUFACTURER.equals("Xiaomi")) {
|
||||
// try {
|
||||
// Window window = getWindow();
|
||||
// if (window != null) {
|
||||
// Class<?> clazz = window.getClass();
|
||||
// Class layoutParams = Class.forName("android.view.MiuiWindowManager$LayoutParams");
|
||||
// Field field = layoutParams.getField("EXTRA_FLAG_STATUS_BAR_DARK_MODE");
|
||||
// int darkModeFlag = field.getInt(layoutParams);
|
||||
// Method extraFlagField = clazz.getMethod("setExtraFlags", int.class, int.class);
|
||||
// extraFlagField.invoke(window, darkModeFlag, darkModeFlag);
|
||||
// }
|
||||
// } catch (Exception e) {
|
||||
// e.printStackTrace();
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
//
|
||||
// setContentView(contentView);
|
||||
//
|
||||
// ButterKnife.bind(this);
|
||||
//
|
||||
// int actionbar_height = getSharedPreferences(Config.PREFERENCE,
|
||||
// Context.MODE_PRIVATE).getInt("actionbar_height",
|
||||
// DisplayUtils.dip2px(getApplicationContext(), 48));
|
||||
//
|
||||
// RelativeLayout reuse_actionbar = (RelativeLayout) findViewById(R.id.reuse_actionbar);
|
||||
// LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(
|
||||
// LayoutParams.MATCH_PARENT, actionbar_height);
|
||||
// reuse_actionbar.setLayoutParams(params);
|
||||
//
|
||||
// findViewById(R.id.actionbar_rl_back).setOnClickListener(
|
||||
// new OnClickListener() {
|
||||
// @Override
|
||||
// public void onClick(View v) {
|
||||
// finish();
|
||||
// }
|
||||
// });
|
||||
// }
|
||||
//
|
||||
// public void toast(String msg) {
|
||||
// Toast.makeText(this, msg, Toast.LENGTH_SHORT).show();
|
||||
// }
|
||||
//
|
||||
// public void toast(int msg) {
|
||||
// Toast.makeText(this, msg, Toast.LENGTH_SHORT).show();
|
||||
// }
|
||||
//
|
||||
// @TargetApi(19)
|
||||
// protected void setTranslucentStatus(boolean status) {
|
||||
// Window window = getWindow();
|
||||
// WindowManager.LayoutParams winParams = window.getAttributes();
|
||||
// final int bits = WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS;
|
||||
// if (status) {
|
||||
// winParams.flags |= bits;
|
||||
// } else {
|
||||
// winParams.flags &= ~bits;
|
||||
// }
|
||||
// window.setAttributes(winParams);
|
||||
// }
|
||||
//
|
||||
// //如果是游戏分享,newsTitle默认为空
|
||||
// public void showShare(String url, String gameName, String icon, String newsTitle, ArrayList<String> tag) {
|
||||
//
|
||||
// //判断是否是官方版
|
||||
// boolean isPlugin = false;
|
||||
// if (tag != null) {
|
||||
// for (String s : tag) {
|
||||
// if (!"官方版".equals(s)) {
|
||||
// isPlugin = true;
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
//
|
||||
// ShareUtils.getInstance(this).showShareWindows(new View(this), url, gameName, icon, newsTitle, isPlugin, true);
|
||||
//
|
||||
// if (newsTitle == null) {
|
||||
// DataUtils.onEvent(this, "内容分享", gameName);
|
||||
// } else {
|
||||
// DataUtils.onEvent(this, "内容分享", newsTitle);
|
||||
// }
|
||||
// }
|
||||
//
|
||||
// public void onEventMainThread(final EBShowDialog showDialog) {
|
||||
// if (!isPause && this.getClass().getName().equals(RunningUtils.getTopActivity(this))) {
|
||||
// if ("hijack".equals(showDialog.getType())) {
|
||||
// DialogUtils.showQqSessionDialog(this, null);// 建议用户联系客服
|
||||
// } else if ("plugin".equals(showDialog.getType())) {
|
||||
// DialogUtils.showPluginDialog(this, new DialogUtils.ConfirmListener() {
|
||||
// @Override
|
||||
// public void onConfirm() {
|
||||
// if (FileUtils.isEmptyFile(showDialog.getPath())) {
|
||||
// Toast.makeText(BaseFragmentActivity.this, "解析包出错(可能被误删了),请重新下载", Toast.LENGTH_SHORT).show();
|
||||
// } else {
|
||||
// startActivity(PackageUtils.getUninstallIntent(BaseFragmentActivity.this, showDialog.getPath()));
|
||||
// }
|
||||
// }
|
||||
// });
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
//
|
||||
// @Override
|
||||
// protected void onDestroy() {
|
||||
// super.onDestroy();
|
||||
// EventBus.getDefault().unregister(this);
|
||||
// AppManager.getInstance().finishActivity(this);
|
||||
// }
|
||||
//
|
||||
// @Override
|
||||
// protected void onPause() {
|
||||
// super.onPause();
|
||||
// DataUtils.onPause(this);
|
||||
// isPause = true;
|
||||
// }
|
||||
//
|
||||
// @Override
|
||||
// protected void onResume() {
|
||||
// super.onResume();
|
||||
// DataUtils.onResume(this);
|
||||
// isPause = false;
|
||||
// DownloadManager.getInstance(this).initGameMap();
|
||||
// }
|
||||
//
|
||||
//}
|
||||
@ -1,23 +0,0 @@
|
||||
package com.gh.base;
|
||||
|
||||
import android.support.v7.widget.RecyclerView;
|
||||
import android.view.View;
|
||||
|
||||
import butterknife.ButterKnife;
|
||||
|
||||
/**
|
||||
* 目前仅提供butterknife bind方法
|
||||
*
|
||||
* @author CsHeng
|
||||
* @Date 16/06/2017
|
||||
* @Time 9:55 AM
|
||||
*/
|
||||
|
||||
public abstract class BaseRecyclerViewHolder extends RecyclerView.ViewHolder {
|
||||
|
||||
public BaseRecyclerViewHolder(View itemView) {
|
||||
super(itemView);
|
||||
ButterKnife.bind(this, itemView);
|
||||
}
|
||||
|
||||
}
|
||||
@ -0,0 +1,26 @@
|
||||
package com.gh.base;
|
||||
|
||||
import android.support.v4.app.Fragment;
|
||||
|
||||
/**
|
||||
* @author CsHeng
|
||||
* @Date 15-9-29
|
||||
* @Time 上午10:24
|
||||
*/
|
||||
public interface FragmentNavigationDelegate {
|
||||
|
||||
void addFragment(Fragment toAdd);
|
||||
|
||||
void replaceFragment(Fragment toReplace);
|
||||
|
||||
void removeFragment(Fragment toRemove);
|
||||
|
||||
void showFragment(Fragment toShow);
|
||||
|
||||
void hideFragment(Fragment toHide);
|
||||
|
||||
boolean popFragment();
|
||||
|
||||
void popFragmentToBase();
|
||||
|
||||
}
|
||||
@ -17,10 +17,10 @@ import android.widget.RemoteViews;
|
||||
|
||||
import com.gh.common.util.AppDebugConfig;
|
||||
import com.gh.common.util.EntranceUtils;
|
||||
import com.lightgame.download.FileUtils;
|
||||
import com.gh.common.util.FileUtils;
|
||||
import com.gh.common.util.PackageUtils;
|
||||
import com.gh.common.util.TokenUtils;
|
||||
import com.lightgame.utils.Utils;
|
||||
import com.gh.common.util.Utils;
|
||||
import com.gh.gamecenter.BuildConfig;
|
||||
import com.gh.gamecenter.R;
|
||||
import com.xiaomi.mipush.sdk.ErrorCode;
|
||||
@ -99,55 +99,50 @@ public class GHPushMessageReceiver extends PushMessageReceiver {
|
||||
if ("ALL".equals(channel) || channel.equalsIgnoreCase(packageChannel)) {
|
||||
String type = jsonObject.getString(KEY_TYPE);
|
||||
Utils.log("type = " + type);
|
||||
JSONArray jsonArray;
|
||||
ArrayMap<String, Boolean> map;
|
||||
switch (type) {
|
||||
case "NEWS":
|
||||
// 新闻推送
|
||||
jsonArray = jsonObject.getJSONArray("package");
|
||||
map = getInstalledMapFromLocal(context);
|
||||
for (int i = 0; i < jsonArray.length(); i++) {
|
||||
Boolean b = map.get(jsonArray.getString(i));
|
||||
if (b != null) {
|
||||
// 显示推送的消息
|
||||
showNotification(context, jsonObject, 0);
|
||||
break;
|
||||
}
|
||||
if ("NEWS".equals(type)) {
|
||||
// 新闻推送
|
||||
JSONArray jsonArray = jsonObject.getJSONArray("package");
|
||||
ArrayMap<String, Boolean> map = getInstalledMapFromLocal(context);
|
||||
for (int i = 0; i < jsonArray.length(); i++) {
|
||||
Boolean b = map.get(jsonArray.getString(i));
|
||||
if (b != null) {
|
||||
// 显示推送的消息
|
||||
showNotification(context, jsonObject, 0);
|
||||
break;
|
||||
}
|
||||
break;
|
||||
case "PLUGIN_UPDATE":
|
||||
// 插件更新推送
|
||||
jsonArray = jsonObject.getJSONArray("apk");
|
||||
map = getInstalledMapFromLocal(context);
|
||||
for (int i = 0; i < jsonArray.length(); i++) {
|
||||
JSONObject apk = jsonArray.getJSONObject(i);
|
||||
String packageName = apk.getString("package");
|
||||
Boolean b = map.get(packageName);
|
||||
if (b != null) {
|
||||
// 判断是否gh_version是否相同
|
||||
String gh_version = (String) PackageUtils
|
||||
.getMetaData(context, packageName, "gh_version");
|
||||
if (gh_version != null) {
|
||||
gh_version = gh_version.substring(2);
|
||||
// 判断gh_version是否相同
|
||||
if (gh_version.equals(apk.getString("gh_version"))) {
|
||||
// 判断version是否相同
|
||||
String version = PackageUtils.getVersionByPackage(context, packageName);
|
||||
if (apk.getString("version").equals(version)) {
|
||||
// 版本相同,无需显示插件更新,继续查看是否有可更新的游戏包
|
||||
continue;
|
||||
}
|
||||
}
|
||||
} else if ("PLUGIN_UPDATE".equals(type)) {
|
||||
// 插件更新推送
|
||||
JSONArray jsonArray = jsonObject.getJSONArray("apk");
|
||||
ArrayMap<String, Boolean> map = getInstalledMapFromLocal(context);
|
||||
for (int i = 0; i < jsonArray.length(); i++) {
|
||||
JSONObject apk = jsonArray.getJSONObject(i);
|
||||
String packageName = apk.getString("package");
|
||||
Boolean b = map.get(packageName);
|
||||
if (b != null) {
|
||||
// 判断是否gh_version是否相同
|
||||
String gh_version = (String) PackageUtils
|
||||
.getMetaData(context, packageName, "gh_version");
|
||||
if (gh_version != null) {
|
||||
gh_version = gh_version.substring(2);
|
||||
// 判断gh_version是否相同
|
||||
if (gh_version.equals(apk.getString("gh_version"))) {
|
||||
// 判断version是否相同
|
||||
String version = PackageUtils.getVersionByPackage(context, packageName);
|
||||
if (apk.getString("version").equals(version)) {
|
||||
// 版本相同,无需显示插件更新,继续查看是否有可更新的游戏包
|
||||
continue;
|
||||
}
|
||||
}
|
||||
// 显示推送的消息
|
||||
showNotification(context, jsonObject, 1);
|
||||
break;
|
||||
}
|
||||
// 显示推送的消息
|
||||
showNotification(context, jsonObject, 1);
|
||||
break;
|
||||
}
|
||||
break;
|
||||
case "NEW_GAME":
|
||||
// 新游推送
|
||||
showNotification(context, jsonObject, 2);
|
||||
}
|
||||
} else if ("NEW_GAME".equals(type)) {
|
||||
// 新游推送
|
||||
showNotification(context, jsonObject, 2);
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -259,24 +254,18 @@ public class GHPushMessageReceiver extends PushMessageReceiver {
|
||||
bundle.putString(KEY_ENTRANCE, ENTRANCE_MIPUSH);
|
||||
String type = response.getString(KEY_TYPE);
|
||||
String target = response.getString(KEY_TARGET);
|
||||
|
||||
switch (type) {
|
||||
case HOST_ARTICLE:
|
||||
bundle.putString(KEY_TO, "NewsDetailActivity");
|
||||
bundle.putString(KEY_NEWSID, target);
|
||||
break;
|
||||
case HOST_GAME:
|
||||
bundle.putString(KEY_TO, "GameDetailActivity");
|
||||
bundle.putString(KEY_GAMEID, target);
|
||||
break;
|
||||
case HOSt_COLUMN:
|
||||
bundle.putString(KEY_TO, "SubjectActivity");
|
||||
bundle.putString(KEY_ID, target);
|
||||
break;
|
||||
case HOST_WEB:
|
||||
bundle.putString(KEY_TO, "WebActivity");
|
||||
bundle.putString(KEY_URL, target);
|
||||
break;
|
||||
if (HOST_ARTICLE.equals(type)) {
|
||||
bundle.putString(KEY_TO, "NewsDetailActivity");
|
||||
bundle.putString(KEY_NEWSID, target);
|
||||
} else if (HOST_GAME.equals(type)) {
|
||||
bundle.putString(KEY_TO, "GameDetailActivity");
|
||||
bundle.putString(KEY_GAMEID, target);
|
||||
} else if (HOSt_COLUMN.equals(type)) {
|
||||
bundle.putString(KEY_TO, "SubjectActivity");
|
||||
bundle.putString(KEY_ID, target);
|
||||
} else if (HOST_WEB.equals(type)) {
|
||||
bundle.putString(KEY_TO, "WebActivity");
|
||||
bundle.putString(KEY_URL, target);
|
||||
}
|
||||
EntranceUtils.jumpActivity(context, bundle);
|
||||
} catch (JSONException e) {
|
||||
|
||||
@ -24,23 +24,18 @@ public class GHUmengNotificationClickHandler extends UmengNotificationClickHandl
|
||||
bundle.putString(EntranceUtils.KEY_ENTRANCE, EntranceUtils.ENTRANCE_UMENG);
|
||||
String type = response.getString(EntranceUtils.KEY_TYPE);
|
||||
String target = response.getString(EntranceUtils.KEY_TARGET);
|
||||
switch (type) {
|
||||
case EntranceUtils.HOST_ARTICLE:
|
||||
bundle.putString(EntranceUtils.KEY_TO, "NewsDetailActivity");
|
||||
bundle.putString(EntranceUtils.KEY_NEWSID, target);
|
||||
break;
|
||||
case EntranceUtils.HOST_GAME:
|
||||
bundle.putString(EntranceUtils.KEY_TO, "GameDetailActivity");
|
||||
bundle.putString(EntranceUtils.KEY_GAMEID, target);
|
||||
break;
|
||||
case EntranceUtils.HOSt_COLUMN:
|
||||
bundle.putString(EntranceUtils.KEY_TO, "SubjectActivity");
|
||||
bundle.putString(EntranceUtils.KEY_ID, target);
|
||||
break;
|
||||
case EntranceUtils.HOST_WEB:
|
||||
bundle.putString(EntranceUtils.KEY_TO, "WebActivity");
|
||||
bundle.putString(EntranceUtils.KEY_URL, target);
|
||||
break;
|
||||
if (EntranceUtils.HOST_ARTICLE.equals(type)) {
|
||||
bundle.putString(EntranceUtils.KEY_TO, "NewsDetailActivity");
|
||||
bundle.putString(EntranceUtils.KEY_NEWSID, target);
|
||||
} else if (EntranceUtils.HOST_GAME.equals(type)) {
|
||||
bundle.putString(EntranceUtils.KEY_TO, "GameDetailActivity");
|
||||
bundle.putString(EntranceUtils.KEY_GAMEID, target);
|
||||
} else if (EntranceUtils.HOSt_COLUMN.equals(type)) {
|
||||
bundle.putString(EntranceUtils.KEY_TO, "SubjectActivity");
|
||||
bundle.putString(EntranceUtils.KEY_ID, target);
|
||||
} else if (EntranceUtils.HOST_WEB.equals(type)) {
|
||||
bundle.putString(EntranceUtils.KEY_TO, "WebActivity");
|
||||
bundle.putString(EntranceUtils.KEY_URL, target);
|
||||
}
|
||||
EntranceUtils.jumpActivity(context, bundle);
|
||||
} catch (JSONException e) {
|
||||
|
||||
275
app/src/main/java/com/gh/base/HomeFragment.java
Normal file
275
app/src/main/java/com/gh/base/HomeFragment.java
Normal file
@ -0,0 +1,275 @@
|
||||
package com.gh.base;
|
||||
|
||||
import android.content.Intent;
|
||||
import android.os.Bundle;
|
||||
import android.support.annotation.Nullable;
|
||||
import android.support.v4.app.Fragment;
|
||||
import android.view.LayoutInflater;
|
||||
import android.view.View;
|
||||
import android.view.ViewGroup;
|
||||
import android.view.animation.AlphaAnimation;
|
||||
import android.view.animation.Animation;
|
||||
import android.view.animation.ScaleAnimation;
|
||||
import android.widget.LinearLayout;
|
||||
import android.widget.TextView;
|
||||
|
||||
import com.gh.common.constant.Config;
|
||||
import com.gh.common.util.DataCollectionUtils;
|
||||
import com.gh.common.util.DataUtils;
|
||||
import com.gh.common.util.DisplayUtils;
|
||||
import com.gh.common.util.EntranceUtils;
|
||||
import com.gh.download.DownloadManager;
|
||||
import com.gh.gamecenter.ConcernActivity;
|
||||
import com.gh.gamecenter.DownloadManagerActivity;
|
||||
import com.gh.gamecenter.R;
|
||||
import com.gh.gamecenter.SearchActivity;
|
||||
import com.gh.gamecenter.eventbus.EBDownloadStatus;
|
||||
import com.gh.gamecenter.eventbus.EBReuse;
|
||||
import com.gh.gamecenter.manager.PackageManager;
|
||||
|
||||
import org.greenrobot.eventbus.EventBus;
|
||||
import org.greenrobot.eventbus.Subscribe;
|
||||
import org.greenrobot.eventbus.ThreadMode;
|
||||
|
||||
import java.util.ArrayList;
|
||||
|
||||
|
||||
/**
|
||||
* Created by LGT on 2016/9/9.
|
||||
* 工具栏 搜索控制
|
||||
*/
|
||||
public class HomeFragment extends Fragment implements View.OnClickListener, SearchBarHint {
|
||||
|
||||
protected View view;
|
||||
|
||||
private TextView downloadHint;
|
||||
private TextView searchHint;
|
||||
|
||||
private AlphaAnimation mAlphaAnimation;
|
||||
|
||||
private ArrayList<String> hintList;
|
||||
private int hintIndex;
|
||||
|
||||
@Override
|
||||
public void onCreate(@Nullable Bundle savedInstanceState) {
|
||||
super.onCreate(savedInstanceState);
|
||||
|
||||
if (savedInstanceState != null) {
|
||||
hintList = savedInstanceState.getStringArrayList("hint");
|
||||
}
|
||||
|
||||
hintIndex = 0;
|
||||
|
||||
view = View.inflate(getActivity(), R.layout.fragment_home, null);
|
||||
|
||||
// SharedPreferences sp = getActivity().getSharedPreferences(
|
||||
// Config.PREFERENCE, Context.MODE_PRIVATE);
|
||||
LinearLayout home_actionbar = (LinearLayout) view.findViewById(R.id.home_actionbar);
|
||||
LinearLayout.LayoutParams lparams = new LinearLayout.LayoutParams(
|
||||
LinearLayout.LayoutParams.MATCH_PARENT, DisplayUtils.dip2px(getActivity(), 55));
|
||||
|
||||
// if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
|
||||
// int top = DisplayUtils.getStatusBarHeight(getResources());
|
||||
// home_actionbar.setPadding(0, top, 0, 0);
|
||||
// lparams.height += top;
|
||||
// }
|
||||
home_actionbar.setLayoutParams(lparams);
|
||||
|
||||
initActionBar();
|
||||
|
||||
final ScaleAnimation scaleAnimation = new ScaleAnimation(0.4f, 1.0f, 0.4f, 1.0f
|
||||
, Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f);
|
||||
scaleAnimation.setDuration(500);
|
||||
|
||||
mAlphaAnimation = new AlphaAnimation(1f, 0.2f);
|
||||
mAlphaAnimation.setDuration(300);
|
||||
mAlphaAnimation.setStartOffset(5000);
|
||||
|
||||
scaleAnimation.setAnimationListener(new Animation.AnimationListener() {
|
||||
@Override
|
||||
public void onAnimationStart(Animation animation) {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onAnimationEnd(Animation animation) {
|
||||
if (mAlphaAnimation != null) {
|
||||
searchHint.setAnimation(mAlphaAnimation);
|
||||
mAlphaAnimation.start();
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onAnimationRepeat(Animation animation) {
|
||||
|
||||
}
|
||||
});
|
||||
|
||||
mAlphaAnimation.setAnimationListener(new Animation.AnimationListener() {
|
||||
@Override
|
||||
public void onAnimationStart(Animation animation) {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onAnimationEnd(Animation animation) {
|
||||
// 切换数据
|
||||
if (hintIndex > hintList.size() - 1) {
|
||||
hintIndex = 0;
|
||||
}
|
||||
searchHint.setHint(hintList.get(hintIndex));
|
||||
hintIndex++;
|
||||
|
||||
if (scaleAnimation != null) {
|
||||
searchHint.setAnimation(scaleAnimation);
|
||||
scaleAnimation.start();
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onAnimationRepeat(Animation animation) {
|
||||
|
||||
}
|
||||
});
|
||||
|
||||
if (hintList != null && hintList.size() > 0) {
|
||||
if (hintList.size() > 1) {
|
||||
searchHint.setAnimation(mAlphaAnimation);
|
||||
} else {
|
||||
String hint = hintList.get(0);
|
||||
searchHint.setHint(hint);
|
||||
}
|
||||
}
|
||||
|
||||
EventBus.getDefault().register(this);
|
||||
}
|
||||
|
||||
@Nullable
|
||||
@Override
|
||||
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container,
|
||||
@Nullable Bundle savedInstanceState) {
|
||||
if (container != null) {
|
||||
container.removeView(view);
|
||||
}
|
||||
return view;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onSaveInstanceState(Bundle outState) {
|
||||
super.onSaveInstanceState(outState);
|
||||
if (hintList != null && !hintList.isEmpty()) {
|
||||
outState.putStringArrayList("hint", hintList);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onDestroy() {
|
||||
super.onDestroy();
|
||||
EventBus.getDefault().unregister(this);
|
||||
}
|
||||
|
||||
private void initActionBar() {
|
||||
view.findViewById(R.id.actionbar_rl_download).setOnClickListener(this);
|
||||
view.findViewById(R.id.actionbar_iv_search).setOnClickListener(this);
|
||||
view.findViewById(R.id.actionbar_notification).setOnClickListener(this);
|
||||
view.findViewById(R.id.actionbar_search_rl).setOnClickListener(this);
|
||||
|
||||
if (Config.isShow(getActivity())) {
|
||||
view.findViewById(R.id.actionbar_rl_download).setVisibility(View.VISIBLE);
|
||||
} else {
|
||||
view.findViewById(R.id.actionbar_rl_download).setVisibility(View.GONE);
|
||||
}
|
||||
|
||||
downloadHint = (TextView) view.findViewById(R.id.action_tip);
|
||||
int updateSize = PackageManager.getUpdateListSize();
|
||||
int downloadSize = DownloadManager.getInstance(getActivity()).getAll().size();
|
||||
if (downloadSize != 0) {
|
||||
downloadHint.setVisibility(View.VISIBLE);
|
||||
downloadHint.setText(String.valueOf(downloadSize));
|
||||
} else if (updateSize != 0) {
|
||||
downloadHint.setVisibility(View.VISIBLE);
|
||||
downloadHint.setText(String.valueOf(updateSize));
|
||||
} else {
|
||||
downloadHint.setVisibility(View.GONE);
|
||||
}
|
||||
|
||||
searchHint = (TextView) view.findViewById(R.id.actionbar_search_input);
|
||||
searchHint.setOnClickListener(this);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onClick(View v) {
|
||||
final int id = v.getId();
|
||||
if (id == R.id.actionbar_rl_download) {
|
||||
DataUtils.onEvent(getActivity(), "主页", "下载图标");
|
||||
DataCollectionUtils.uploadClick(getActivity(), "下载图标", "主页");
|
||||
|
||||
DownloadManagerActivity.startDownloadManagerActivity(getContext(), null, "(工具栏)");
|
||||
} else if (id == R.id.actionbar_iv_search) {
|
||||
DataUtils.onEvent(getActivity(), "主页", "搜索图标");
|
||||
DataCollectionUtils.uploadClick(getActivity(), "搜索图标", "主页");
|
||||
|
||||
Intent intent = new Intent(getActivity(), SearchActivity.class);
|
||||
intent.putExtra("clicked", true);
|
||||
intent.putExtra("hint", searchHint.getHint().toString());
|
||||
intent.putExtra(EntranceUtils.KEY_ENTRANCE, "(工具栏)");
|
||||
startActivity(intent);
|
||||
} else if (id == R.id.actionbar_search_input || id == R.id.actionbar_search_rl) {
|
||||
DataUtils.onEvent(getActivity(), "主页", "搜索框");
|
||||
DataCollectionUtils.uploadClick(getActivity(), "搜索框", "主页");
|
||||
|
||||
Intent intent = new Intent(getActivity(), SearchActivity.class);
|
||||
intent.putExtra("clicked", false);
|
||||
intent.putExtra("hint", searchHint.getHint().toString());
|
||||
intent.putExtra(EntranceUtils.KEY_ENTRANCE, "(工具栏)");
|
||||
startActivity(intent);
|
||||
} else if (id == R.id.actionbar_notification) {
|
||||
DataUtils.onEvent(getActivity(), "主页", "关注图标");
|
||||
DataCollectionUtils.uploadClick(getActivity(), "关注图标", "主页");
|
||||
|
||||
Intent intent = new Intent(getActivity(), ConcernActivity.class);
|
||||
intent.putExtra(EntranceUtils.KEY_ENTRANCE, "(工具栏)");
|
||||
startActivity(intent);
|
||||
}
|
||||
}
|
||||
|
||||
// 打开下载按钮事件
|
||||
@Subscribe(threadMode = ThreadMode.MAIN)
|
||||
public void onEventMainThread(EBReuse reuse) {
|
||||
if ("Refresh".equals(reuse.getType())) {
|
||||
if (Config.isShow(getActivity())) {
|
||||
view.findViewById(R.id.actionbar_rl_download).setVisibility(View.VISIBLE);
|
||||
} else {
|
||||
view.findViewById(R.id.actionbar_rl_download).setVisibility(View.GONE);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Subscribe(threadMode = ThreadMode.MAIN)
|
||||
public void onEventMainThread(EBDownloadStatus status) {
|
||||
int updateSize = PackageManager.getUpdateListSize();
|
||||
int downloadSize = DownloadManager.getInstance(getActivity()).getAll().size();
|
||||
if (downloadSize != 0) {
|
||||
downloadHint.setVisibility(View.VISIBLE);
|
||||
downloadHint.setText(String.valueOf(downloadSize));
|
||||
} else if (updateSize != 0) {
|
||||
downloadHint.setVisibility(View.VISIBLE);
|
||||
downloadHint.setText(String.valueOf(updateSize));
|
||||
} else {
|
||||
downloadHint.setVisibility(View.GONE);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setHint(ArrayList<String> hint) {
|
||||
if (hint != null && hint.size() > 0) {
|
||||
hintList = hint;
|
||||
if (hint.size() == 1 && searchHint != null) {
|
||||
searchHint.setHint(hintList.get(0));
|
||||
} else if (mAlphaAnimation != null && searchHint != null) {
|
||||
searchHint.setAnimation(mAlphaAnimation);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
9
app/src/main/java/com/gh/base/OnBackPressedListener.java
Normal file
9
app/src/main/java/com/gh/base/OnBackPressedListener.java
Normal file
@ -0,0 +1,9 @@
|
||||
package com.gh.base;
|
||||
|
||||
/**
|
||||
* Forward activity onBackPressed() events to fragment
|
||||
* (If nested fragments need this, just forward again)
|
||||
*/
|
||||
public interface OnBackPressedListener {
|
||||
public boolean onHandleBackPressed();
|
||||
}
|
||||
@ -1,48 +1,48 @@
|
||||
//package com.gh.base;
|
||||
//
|
||||
//import java.io.Serializable;
|
||||
//
|
||||
//public enum SuggestionType implements Serializable {
|
||||
//
|
||||
// FEEDBACK("普通反馈", 1),
|
||||
// SUGGESTION("功能建议", 2),
|
||||
// CRASH("发生闪退", 3),
|
||||
// GAME("游戏问题", 4),
|
||||
// COLLECT("游戏收录", 5),
|
||||
// POST("文章投稿", 6);
|
||||
//
|
||||
// private String mName;
|
||||
// private int mIndex;
|
||||
//
|
||||
// private SuggestionType(String name, int index) {
|
||||
// mName = name;
|
||||
// mIndex = index;
|
||||
// }
|
||||
//
|
||||
// public static String getName(int index) {
|
||||
// for (SuggestionType c : SuggestionType.values()) {
|
||||
// if (c.mIndex == index) {
|
||||
// return c.mName;
|
||||
// }
|
||||
// }
|
||||
// return "";
|
||||
// }
|
||||
//
|
||||
// public static int getIndex(String name) {
|
||||
// for (SuggestionType c : SuggestionType.values()) {
|
||||
// if (c.mName == name) {
|
||||
// return c.mIndex;
|
||||
// }
|
||||
// }
|
||||
// return -1;
|
||||
// }
|
||||
//
|
||||
// public int getIndex() {
|
||||
// return mIndex;
|
||||
// }
|
||||
//
|
||||
// public String getName() {
|
||||
// return mName;
|
||||
// }
|
||||
//
|
||||
//}
|
||||
package com.gh.base;
|
||||
|
||||
import java.io.Serializable;
|
||||
|
||||
public enum SuggestionType implements Serializable {
|
||||
|
||||
FEEDBACK("普通反馈", 1),
|
||||
SUGGESTION("功能建议", 2),
|
||||
CRASH("发生闪退", 3),
|
||||
GAME("游戏问题", 4),
|
||||
COLLECT("游戏收录", 5),
|
||||
POST("文章投稿", 6);
|
||||
|
||||
private String mName;
|
||||
private int mIndex;
|
||||
|
||||
private SuggestionType(String name, int index) {
|
||||
mName = name;
|
||||
mIndex = index;
|
||||
}
|
||||
|
||||
public static String getName(int index) {
|
||||
for (SuggestionType c : SuggestionType.values()) {
|
||||
if (c.mIndex == index) {
|
||||
return c.mName;
|
||||
}
|
||||
}
|
||||
return "";
|
||||
}
|
||||
|
||||
public static int getIndex(String name) {
|
||||
for (SuggestionType c : SuggestionType.values()) {
|
||||
if (c.mName == name) {
|
||||
return c.mIndex;
|
||||
}
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
|
||||
public int getIndex() {
|
||||
return mIndex;
|
||||
}
|
||||
|
||||
public String getName() {
|
||||
return mName;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
17
app/src/main/java/com/gh/base/ToolbarController.java
Normal file
17
app/src/main/java/com/gh/base/ToolbarController.java
Normal file
@ -0,0 +1,17 @@
|
||||
package com.gh.base;
|
||||
|
||||
import android.support.annotation.StringRes;
|
||||
import android.support.v7.widget.Toolbar;
|
||||
|
||||
/**
|
||||
* Created by csheng on 15-10-12.
|
||||
*/
|
||||
public interface ToolbarController {
|
||||
|
||||
void setNavigationTitle(@StringRes int res);
|
||||
|
||||
void setNavigationTitle(CharSequence res);
|
||||
|
||||
Toolbar getToolBar();
|
||||
|
||||
}
|
||||
@ -1,162 +0,0 @@
|
||||
package com.gh.base.fragment;
|
||||
|
||||
import android.os.Bundle;
|
||||
import android.support.annotation.LayoutRes;
|
||||
import android.support.annotation.Nullable;
|
||||
import android.support.annotation.StringRes;
|
||||
import android.support.v4.app.Fragment;
|
||||
import android.support.v7.widget.Toolbar;
|
||||
import android.view.LayoutInflater;
|
||||
import android.view.View;
|
||||
import android.view.ViewGroup;
|
||||
import android.widget.Toast;
|
||||
|
||||
import com.gh.base.OnRequestCallBackListener;
|
||||
import com.gh.common.util.EntranceUtils;
|
||||
import com.gh.gamecenter.eventbus.EBMiPush;
|
||||
import com.lightgame.ToolbarController;
|
||||
import com.lightgame.utils.RuntimeUtils;
|
||||
|
||||
import org.greenrobot.eventbus.EventBus;
|
||||
import org.greenrobot.eventbus.Subscribe;
|
||||
import org.greenrobot.eventbus.ThreadMode;
|
||||
|
||||
import butterknife.ButterKnife;
|
||||
|
||||
/**
|
||||
* Created by LGT on 2016/9/4.
|
||||
* Fragment 基类
|
||||
*/
|
||||
public abstract class BaseFragment<T> extends Fragment implements OnRequestCallBackListener<T>,
|
||||
View.OnClickListener, ToolbarController {
|
||||
|
||||
// TODO private view
|
||||
protected View view;
|
||||
|
||||
protected boolean isEverPause;
|
||||
|
||||
protected String mEntrance;
|
||||
|
||||
@LayoutRes
|
||||
protected abstract int getLayoutId();
|
||||
|
||||
/**
|
||||
* 责任链,谁处理了就返回true,否则返回super.handleOnClick(View view)
|
||||
*
|
||||
* @return
|
||||
*/
|
||||
protected boolean handleOnClick(View view) {
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onClick(View v) {
|
||||
handleOnClick(v);
|
||||
}
|
||||
|
||||
protected void initView(View view) {
|
||||
}
|
||||
|
||||
protected void postRunnable(Runnable runnable) {
|
||||
RuntimeUtils.getInstance().runOnUiThread(runnable);
|
||||
}
|
||||
|
||||
protected void postDelayedRunnable(Runnable runnable, long delayMillis) {
|
||||
RuntimeUtils.getInstance().runOnUiThread(runnable, delayMillis);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setNavigationTitle(@StringRes int res) {
|
||||
if (getActivity() instanceof ToolbarController) {
|
||||
((ToolbarController) getActivity()).setNavigationTitle(res);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setNavigationTitle(CharSequence res) {
|
||||
if (getActivity() instanceof ToolbarController) {
|
||||
((ToolbarController) getActivity()).setNavigationTitle(res);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public Toolbar getToolBar() {
|
||||
if (getActivity() instanceof ToolbarController) {
|
||||
return ((ToolbarController) getActivity()).getToolBar();
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onCreate(@Nullable Bundle savedInstanceState) {
|
||||
super.onCreate(savedInstanceState);
|
||||
mEntrance = getActivity().getIntent().getStringExtra(EntranceUtils.KEY_ENTRANCE);
|
||||
isEverPause = false;
|
||||
EventBus.getDefault().register(this);
|
||||
view = View.inflate(getContext(), getLayoutId(), null);
|
||||
ButterKnife.bind(this, view);
|
||||
initView(view);
|
||||
}
|
||||
|
||||
//TODO 尴尬,必须的有subscribe才能register
|
||||
@Subscribe(threadMode = ThreadMode.BACKGROUND)
|
||||
public void onDummyEvent(EBMiPush push) {
|
||||
//
|
||||
}
|
||||
|
||||
@Nullable
|
||||
@Override
|
||||
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
|
||||
if (container != null) {
|
||||
container.removeView(view);
|
||||
}
|
||||
return view;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onResume() {
|
||||
super.onResume();
|
||||
isEverPause = false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onPause() {
|
||||
super.onPause();
|
||||
isEverPause = true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onDestroy() {
|
||||
super.onDestroy();
|
||||
EventBus.getDefault().unregister(this);
|
||||
}
|
||||
|
||||
public void toast(String msg) {
|
||||
Toast.makeText(getContext(), msg, Toast.LENGTH_SHORT).show();
|
||||
}
|
||||
|
||||
public boolean isEverPause() {
|
||||
return isEverPause;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void loadDone() {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void loadDone(Object obj) {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void loadError() {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void loadEmpty() {
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
@ -1,125 +0,0 @@
|
||||
/**
|
||||
* project: OPlay
|
||||
* <p/>
|
||||
* <p/>
|
||||
* ========================================================================
|
||||
* amend date amend user amend reason
|
||||
* 2013-3-6 CsHeng
|
||||
*/
|
||||
|
||||
package com.gh.base.fragment;
|
||||
|
||||
import android.content.Intent;
|
||||
import android.os.Bundle;
|
||||
import android.support.annotation.IdRes;
|
||||
import android.support.annotation.LayoutRes;
|
||||
import android.support.annotation.Nullable;
|
||||
import android.support.v4.app.Fragment;
|
||||
import android.support.v4.view.PagerAdapter;
|
||||
import android.support.v4.view.ViewPager;
|
||||
import android.view.View;
|
||||
|
||||
import com.lightgame.adapter.BaseFragmentPagerAdapter;
|
||||
import com.lightgame.config.CommonDebug;
|
||||
import com.lightgame.view.DoubleTapTextView;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* ViewPager 配合RadioGroup实现双切换<br/>
|
||||
* 记得自己控制onCreateView返回和radioGroup里面radiobutton个数,Viewpager的布局<br/>
|
||||
*
|
||||
* @author CsHeng
|
||||
* @date 2013-3-6
|
||||
*/
|
||||
public abstract class BaseFragment_ViewPager extends BaseFragment implements DoubleTapTextView.OnDoubleTapListener {
|
||||
|
||||
protected static final String ARGS_INDEX = "index";
|
||||
protected int mCheckedIndex = 0;
|
||||
protected PagerAdapter mAdapter;
|
||||
protected List<Fragment> mFragmentsList;
|
||||
protected ViewPager mViewPager;
|
||||
|
||||
@LayoutRes
|
||||
protected abstract int getLayoutId();
|
||||
|
||||
@IdRes
|
||||
protected abstract int getViewPagerId();
|
||||
|
||||
protected abstract void initFragmentList(List<Fragment> fragments);
|
||||
|
||||
@Override
|
||||
public void onCreate(Bundle savedInstanceState) {
|
||||
super.onCreate(savedInstanceState);
|
||||
mFragmentsList = new ArrayList<>();
|
||||
initFragmentList(mFragmentsList);
|
||||
mAdapter = BaseFragmentPagerAdapter.newInstance(getChildFragmentManager(), mFragmentsList);
|
||||
final Bundle args = getArguments();
|
||||
if (args != null) {
|
||||
mCheckedIndex = args.getInt(ARGS_INDEX);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
|
||||
super.onViewCreated(view, savedInstanceState);
|
||||
mViewPager = (ViewPager) view.findViewById(getViewPagerId());
|
||||
mViewPager.setOffscreenPageLimit(mFragmentsList.size());
|
||||
mViewPager.setAdapter(mAdapter);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onActivityCreated(Bundle savedInstanceState) {
|
||||
super.onActivityCreated(savedInstanceState);
|
||||
if (mCheckedIndex < mFragmentsList.size()) {
|
||||
mViewPager.setCurrentItem(mCheckedIndex, false);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onSaveInstanceState(Bundle outState) {
|
||||
super.onSaveInstanceState(outState);
|
||||
if (getArguments() != null) {
|
||||
getArguments().putInt(ARGS_INDEX, mCheckedIndex);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onDestroyView() {
|
||||
super.onDestroyView();
|
||||
if (mViewPager != null) {
|
||||
mViewPager.setAdapter(null);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onDestroy() {
|
||||
super.onDestroy();
|
||||
if (mFragmentsList != null) {
|
||||
mFragmentsList.clear();
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean onDoubleTap() {
|
||||
final Fragment fragment = mFragmentsList.get(mViewPager.getCurrentItem());
|
||||
return fragment instanceof DoubleTapTextView.OnDoubleTapListener && ((DoubleTapTextView.OnDoubleTapListener)
|
||||
fragment).onDoubleTap();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onActivityResult(int requestCode, int resultCode, Intent data) {
|
||||
super.onActivityResult(requestCode, resultCode, data);
|
||||
if (CommonDebug.IS_DEBUG) {
|
||||
CommonDebug.logMethodWithParams(this, requestCode, resultCode, data);
|
||||
}
|
||||
List<Fragment> fragments = getChildFragmentManager().getFragments();
|
||||
if (fragments != null) {
|
||||
Fragment curFragment = fragments.get(mViewPager.getCurrentItem());
|
||||
curFragment.onActivityResult(requestCode, resultCode, data);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
@ -1,109 +0,0 @@
|
||||
/**
|
||||
* project: OPlay
|
||||
* <p/>
|
||||
* <p/>
|
||||
* ========================================================================
|
||||
* amend date amend user amend reason
|
||||
* 2013-3-6 CsHeng
|
||||
*/
|
||||
|
||||
package com.gh.base.fragment;
|
||||
|
||||
import android.os.Bundle;
|
||||
import android.support.annotation.IdRes;
|
||||
import android.support.annotation.Nullable;
|
||||
import android.support.v4.view.ViewPager;
|
||||
import android.view.View;
|
||||
import android.view.ViewGroup;
|
||||
import android.widget.Checkable;
|
||||
|
||||
|
||||
/**
|
||||
* ViewPager 配合ViewGroup Checkable实现双切换<br/>
|
||||
* 记得自己控制onCreateView返回和ViewGroup里面Checkable个数,ViewPager的布局<br/>
|
||||
*
|
||||
* @author CsHeng
|
||||
* @date 2013-3-6
|
||||
* @update 2014-09-29
|
||||
*/
|
||||
public abstract class BaseFragment_ViewPager_Checkable extends BaseFragment_ViewPager implements
|
||||
ViewPager.OnPageChangeListener {
|
||||
|
||||
protected ViewGroup mCheckableGroup;
|
||||
|
||||
@IdRes
|
||||
protected abstract int getCheckableGroupId();
|
||||
|
||||
protected boolean getSmoothScroll() {
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
|
||||
super.onViewCreated(view, savedInstanceState);
|
||||
mCheckableGroup = (ViewGroup) view.findViewById(getCheckableGroupId());
|
||||
for (int i = 0, size = mCheckableGroup.getChildCount(); i < size; i++) {
|
||||
mCheckableGroup.getChildAt(i).setOnClickListener(this);
|
||||
}
|
||||
mViewPager.addOnPageChangeListener(this);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onDestroyView() {
|
||||
super.onDestroyView();
|
||||
mViewPager.removeOnPageChangeListener(this);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onActivityCreated(Bundle savedInstanceState) {
|
||||
super.onActivityCreated(savedInstanceState);
|
||||
checkIndex(mCheckedIndex);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onPageSelected(int index) {
|
||||
onPageChanged(index);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onPageScrollStateChanged(int state) {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
protected boolean handleOnClick(View view) {
|
||||
final int toCheck = mCheckableGroup.indexOfChild(view);
|
||||
if (toCheck != -1) {
|
||||
mViewPager.setCurrentItem(toCheck, getSmoothScroll());
|
||||
return true;
|
||||
}
|
||||
return super.handleOnClick(view);
|
||||
}
|
||||
|
||||
protected void checkIndex(int index) {
|
||||
final int childCount = mCheckableGroup.getChildCount();
|
||||
if (index < childCount && mCheckedIndex < childCount) {
|
||||
final View toChecked = mCheckableGroup.getChildAt(index);
|
||||
if (toChecked instanceof Checkable) {
|
||||
((Checkable) toChecked).setChecked(true);
|
||||
}
|
||||
if (index != mCheckedIndex) {
|
||||
final View checkedChild = mCheckableGroup.getChildAt(mCheckedIndex);
|
||||
if (checkedChild instanceof Checkable) {
|
||||
((Checkable) checkedChild).setChecked(false);
|
||||
}
|
||||
}
|
||||
mCheckedIndex = index;
|
||||
}
|
||||
}
|
||||
|
||||
protected void onPageChanged(int index) {
|
||||
checkIndex(index);
|
||||
}
|
||||
|
||||
}
|
||||
@ -3,28 +3,22 @@ package com.gh.common.constant;
|
||||
|
||||
import android.content.Context;
|
||||
import android.content.SharedPreferences;
|
||||
import android.preference.PreferenceManager;
|
||||
|
||||
import com.gh.gamecenter.BuildConfig;
|
||||
|
||||
public class Config {
|
||||
|
||||
public static final String HOST = BuildConfig.HOST;
|
||||
public static final String API_HOST = BuildConfig.API_HOST;
|
||||
public static final String USER_HOST = BuildConfig.USER_HOST;
|
||||
public static final String COMMENT_HOST = BuildConfig.COMMENT_HOST;
|
||||
public static final String DATA_HOST = BuildConfig.DATA_HOST;
|
||||
public static final String LIBAO_HOST = BuildConfig.LIBAO_HOST;
|
||||
public static final String MESSAGE_HOST = BuildConfig.MESSAGE_HOST;
|
||||
|
||||
/**
|
||||
* 需要配置的请使用{@link PreferenceManager#getDefaultSharedPreferences(Context)}
|
||||
*/
|
||||
// @Deprecated
|
||||
// public static final String PREFERENCE = "ghzhushou";
|
||||
public static final String PREFERENCE = "ghzhushou";
|
||||
|
||||
// Third-Party confs
|
||||
public static final String WECHAT_APPID = BuildConfig.WECHAT_APPID;
|
||||
public static final String WECHAT_SECRET = BuildConfig.WECHAT_SECRET;
|
||||
public static final String TENCENT_APPID = BuildConfig.TENCENT_APPID;
|
||||
public static final String WEIBO_APPKEY = BuildConfig.WEIBO_APPKEY;
|
||||
public static final String MIPUSH_APPID = BuildConfig.MIPUSH_APPID;
|
||||
@ -35,7 +29,7 @@ public class Config {
|
||||
public static final String UMENG_MESSAGE_SECRET = BuildConfig.UMENG_MESSAGE_SECRET;
|
||||
|
||||
public static boolean isShow(Context context) {
|
||||
SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(context);
|
||||
SharedPreferences sp = context.getSharedPreferences(Config.PREFERENCE, Context.MODE_PRIVATE);
|
||||
return sp.getBoolean("isShow", true);
|
||||
}
|
||||
|
||||
|
||||
@ -2,9 +2,19 @@ package com.gh.common.constant;
|
||||
|
||||
public class Constants {
|
||||
|
||||
public static final int CONTINUE_DOWNLOAD_TASK = 0x123;
|
||||
public static final int PAUSE_DOWNLOAD_TASK = 0x124;
|
||||
public static final int DOWNLOAD_ROLL = 0x125;
|
||||
public static final int SEND_NEWS_FEEDBACK = 0x126;
|
||||
public static final int SEND_COMMENT_FEEDBACK = 0x127;
|
||||
|
||||
public static final String KEY_DOWNLOAD_ENTRY = "key_download_entry";
|
||||
public static final String KEY_DOWNLOAD_ACTION = "key_download_action";
|
||||
|
||||
public static final int MAX_DOWNLOAD_THREAD_SIZE = 3;
|
||||
public static final int MAX_DOWNLOADING_SIZE = 3;
|
||||
public static final long SPEED_CHECK_INTERVAL = 1000;//速度监测频率
|
||||
|
||||
//手机号码匹配规则
|
||||
public static final String REGEX_MOBILE = "^((13[0-9])|(15[^4,\\D])|(18[0,5-9]))\\d{8}$";
|
||||
public static final String REGEX_ACCOUNT = "^[a-zA-Z_]\\w{5,17}$";
|
||||
|
||||
143
app/src/main/java/com/gh/common/util/AppManager.java
Normal file
143
app/src/main/java/com/gh/common/util/AppManager.java
Normal file
@ -0,0 +1,143 @@
|
||||
package com.gh.common.util;
|
||||
|
||||
import android.app.Activity;
|
||||
import android.content.Context;
|
||||
import android.content.Intent;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
import java.util.Stack;
|
||||
|
||||
/**
|
||||
* 应用程序Activity管理类:用于Activity和Intent相关的管理
|
||||
*
|
||||
* @author CsHeng
|
||||
* @version 1.0
|
||||
*/
|
||||
public class AppManager {
|
||||
|
||||
private static AppManager mInstance;
|
||||
private Stack<Activity> mActivityStack;
|
||||
|
||||
private AppManager() {
|
||||
mActivityStack = new Stack<>();
|
||||
}
|
||||
|
||||
/**
|
||||
* 单一实例
|
||||
*/
|
||||
public static AppManager getInstance() {
|
||||
if (mInstance == null) {
|
||||
mInstance = new AppManager();
|
||||
}
|
||||
return mInstance;
|
||||
}
|
||||
|
||||
public boolean isEmpty() {
|
||||
return mActivityStack.isEmpty();
|
||||
}
|
||||
|
||||
/**
|
||||
* 添加Activity到堆栈
|
||||
*/
|
||||
public void addActivity(Activity activity) {
|
||||
mActivityStack.add(activity);
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取当前Activity(堆栈中最后一个压入的)
|
||||
*/
|
||||
public Activity currentActivity() {
|
||||
return mActivityStack.lastElement();
|
||||
}
|
||||
|
||||
/**
|
||||
* 结束当前Activity(堆栈中最后一个压入的)
|
||||
*/
|
||||
public void finishActivity() {
|
||||
final Activity activity = mActivityStack.lastElement();
|
||||
finishActivity(activity);
|
||||
}
|
||||
|
||||
/**
|
||||
* 结束指定的Activity
|
||||
*/
|
||||
public void finishActivity(Activity activity) {
|
||||
if (activity != null) {
|
||||
mActivityStack.remove(activity);
|
||||
activity.finish();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 结束指定类名的Activity
|
||||
*/
|
||||
public void finishActivity(Class<?> cls) {
|
||||
for (Activity activity : mActivityStack) {
|
||||
if (activity.getClass().equals(cls)) {
|
||||
finishActivity(activity);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public boolean isOnStack(Activity activity) {
|
||||
return mActivityStack.contains(activity);
|
||||
}
|
||||
|
||||
public Intent[] getStartIntents(Intent... intent) {
|
||||
List<Intent> intentList = getCurrentIntents();
|
||||
if (intentList != null) {
|
||||
Collections.addAll(intentList, intent);
|
||||
return intentList.toArray(new Intent[intentList.size()]);
|
||||
}
|
||||
return intent;
|
||||
}
|
||||
|
||||
public List<Intent> getCurrentIntents() {
|
||||
List<Intent> intentList = new ArrayList<>();
|
||||
for (Activity activity : mActivityStack) {
|
||||
intentList.add(activity.getIntent());
|
||||
}
|
||||
return intentList;
|
||||
}
|
||||
|
||||
/**
|
||||
* 退出应用程序
|
||||
*/
|
||||
public void appExit(Context context) {
|
||||
try {
|
||||
finishAllActivity();
|
||||
/* Need Permission */
|
||||
// ActivityManager activityMgr= (ActivityManager)
|
||||
// context.getSystemService(Context.ACTIVITY_SERVICE);
|
||||
// activityMgr.restartPackage(context.getPackageName());
|
||||
// activityMgr.killBackgroundProcesses(context.getPackageName());
|
||||
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 结束所有Activity
|
||||
*/
|
||||
public void finishAllActivity() {
|
||||
for (Activity activity : mActivityStack) {
|
||||
activity.finish();
|
||||
}
|
||||
mActivityStack.clear();
|
||||
try {
|
||||
android.os.Process.killProcess(android.os.Process.myPid());
|
||||
} catch (Exception e) {
|
||||
}
|
||||
}
|
||||
|
||||
public void destroy() {
|
||||
if (mActivityStack != null) {
|
||||
mActivityStack.clear();
|
||||
}
|
||||
mInstance = null;
|
||||
}
|
||||
|
||||
}
|
||||
@ -1,34 +0,0 @@
|
||||
package com.gh.common.util;
|
||||
|
||||
import android.content.Context;
|
||||
import android.content.Intent;
|
||||
|
||||
import com.gh.gamecenter.LoginActivity;
|
||||
|
||||
/**
|
||||
* Created by khy on 28/06/17.
|
||||
*/
|
||||
|
||||
public class CheckLoginUtils {
|
||||
|
||||
public static void checkLogin(final Context context, OnLoggenInListener listener) {
|
||||
String token = "";
|
||||
if (token == null) {
|
||||
DialogUtils.showWarningDialog(context, "登录提示", "需要登录才能使用该功能喔!", "取消", "快速登录",
|
||||
new DialogUtils.ConfirmListener() {
|
||||
@Override
|
||||
public void onConfirm() {
|
||||
Intent intent = LoginActivity.getIntent(context);
|
||||
context.startActivity(intent);
|
||||
}
|
||||
}, null);
|
||||
} else {
|
||||
listener.onLoggedIn();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
public interface OnLoggenInListener {
|
||||
void onLoggedIn();
|
||||
}
|
||||
}
|
||||
@ -5,21 +5,19 @@ import android.content.Context;
|
||||
import android.graphics.Color;
|
||||
import android.support.v4.content.ContextCompat;
|
||||
import android.text.TextUtils;
|
||||
import android.view.Gravity;
|
||||
import android.view.View;
|
||||
import android.view.ViewGroup;
|
||||
import android.view.Window;
|
||||
import android.widget.ImageView;
|
||||
import android.widget.LinearLayout;
|
||||
import android.widget.TextView;
|
||||
|
||||
import com.gh.gamecenter.CommentDetailActivity;
|
||||
import com.gh.gamecenter.MessageDetailActivity;
|
||||
import com.gh.gamecenter.R;
|
||||
import com.gh.gamecenter.adapter.OnCommentCallBackListener;
|
||||
import com.gh.gamecenter.adapter.MessageDetailAdapter;
|
||||
import com.gh.gamecenter.db.CommentDao;
|
||||
import com.gh.gamecenter.db.VoteDao;
|
||||
import com.gh.gamecenter.db.info.VoteInfo;
|
||||
import com.gh.gamecenter.entity.CommentEntity;
|
||||
import com.lightgame.utils.Utils;
|
||||
|
||||
import org.json.JSONException;
|
||||
import org.json.JSONObject;
|
||||
@ -31,8 +29,6 @@ import java.util.Date;
|
||||
import java.util.List;
|
||||
import java.util.Locale;
|
||||
|
||||
import retrofit2.HttpException;
|
||||
|
||||
/**
|
||||
* Created by khy on 2017/3/22.
|
||||
*/
|
||||
@ -69,17 +65,17 @@ public class CommentUtils {
|
||||
}
|
||||
}
|
||||
|
||||
public static void showReportDialog(final CommentEntity commentEntity, final Context context,
|
||||
final OnCommentCallBackListener listener, final String newsId) {
|
||||
public static void showReportDialog(final CommentEntity commentEntity, final Context mContext
|
||||
, final MessageDetailAdapter.OnCommentCallBackListener mCallBackListener, final String newsId) {
|
||||
|
||||
CommentDao commentDao = new CommentDao(context);
|
||||
CommentDao commentDao = new CommentDao(mContext);
|
||||
|
||||
final Dialog dialog = new Dialog(context);
|
||||
final Dialog dialog = new Dialog(mContext);
|
||||
|
||||
LinearLayout container = new LinearLayout(context);
|
||||
LinearLayout container = new LinearLayout(mContext);
|
||||
container.setOrientation(LinearLayout.VERTICAL);
|
||||
container.setBackgroundColor(Color.WHITE);
|
||||
container.setPadding(0, DisplayUtils.dip2px(context, 12), 0, DisplayUtils.dip2px(context, 12));
|
||||
container.setPadding(0, DisplayUtils.dip2px(mContext, 12), 0, DisplayUtils.dip2px(mContext, 12));
|
||||
|
||||
List<String> dialogType = new ArrayList<>();
|
||||
|
||||
@ -95,16 +91,16 @@ public class CommentUtils {
|
||||
}
|
||||
|
||||
for (String s : dialogType) {
|
||||
final TextView reportTv = new TextView(context);
|
||||
final TextView reportTv = new TextView(mContext);
|
||||
reportTv.setText(s);
|
||||
reportTv.setTextSize(17);
|
||||
reportTv.setTextColor(ContextCompat.getColor(context, R.color.title));
|
||||
reportTv.setTextColor(ContextCompat.getColor(mContext, R.color.title));
|
||||
reportTv.setBackgroundResource(R.drawable.textview_white_style);
|
||||
int widthPixels = context.getResources().getDisplayMetrics().widthPixels;
|
||||
int widthPixels = mContext.getResources().getDisplayMetrics().widthPixels;
|
||||
reportTv.setLayoutParams(new LinearLayout.LayoutParams((widthPixels * 9) / 10,
|
||||
LinearLayout.LayoutParams.WRAP_CONTENT));
|
||||
reportTv.setPadding(DisplayUtils.dip2px(context, 20), DisplayUtils.dip2px(context, 12),
|
||||
0, DisplayUtils.dip2px(context, 12));
|
||||
reportTv.setPadding(DisplayUtils.dip2px(mContext, 20), DisplayUtils.dip2px(mContext, 12),
|
||||
0, DisplayUtils.dip2px(mContext, 12));
|
||||
container.addView(reportTv);
|
||||
|
||||
reportTv.setOnClickListener(new View.OnClickListener() {
|
||||
@ -113,33 +109,23 @@ public class CommentUtils {
|
||||
dialog.cancel();
|
||||
switch (reportTv.getText().toString()) {
|
||||
case "回复":
|
||||
CheckLoginUtils.checkLogin(context, new CheckLoginUtils.OnLoggenInListener() {
|
||||
@Override
|
||||
public void onLoggedIn() {
|
||||
if (listener != null) {
|
||||
listener.onCommentCallback(commentEntity);
|
||||
} else if (!TextUtils.isEmpty(newsId)) {
|
||||
context.startActivity(MessageDetailActivity.getMessageDetailIntent(context, commentEntity, newsId));
|
||||
} else {
|
||||
Utils.toast(context, "缺少关键属性");
|
||||
}
|
||||
}
|
||||
});
|
||||
break;
|
||||
case "复制":
|
||||
LibaoUtils.copyLink(commentEntity.getContent(), context);
|
||||
break;
|
||||
case "举报":
|
||||
CheckLoginUtils.checkLogin(context, new CheckLoginUtils.OnLoggenInListener() {
|
||||
@Override
|
||||
public void onLoggedIn() {
|
||||
showReportTypeDialog(commentEntity, context);
|
||||
}
|
||||
});
|
||||
if (mCallBackListener != null) {
|
||||
mCallBackListener.showSoftInput(commentEntity);
|
||||
} else if (!TextUtils.isEmpty(newsId)) {
|
||||
mContext.startActivity(MessageDetailActivity.getMessageDetailIntent(mContext, commentEntity, newsId));
|
||||
} else {
|
||||
Utils.toast(mContext, "缺少关键属性");
|
||||
}
|
||||
|
||||
break;
|
||||
case "复制":
|
||||
LibaoUtils.copyLink(commentEntity.getContent(), mContext);
|
||||
break;
|
||||
case "举报":
|
||||
showReportTypeDialog(commentEntity, mContext);
|
||||
break;
|
||||
case "查看对话":
|
||||
context.startActivity(CommentDetailActivity.getCommentDetailIntent(context, commentEntity.getId()));
|
||||
mContext.startActivity(CommentDetailActivity.getCommentDetailIntent(mContext, commentEntity.getId()));
|
||||
break;
|
||||
}
|
||||
}
|
||||
@ -208,66 +194,5 @@ public class CommentUtils {
|
||||
reportTypeDialog.show();
|
||||
}
|
||||
|
||||
public static void initVote(final Context context, final CommentEntity commentEntity, final VoteDao voteDao,
|
||||
final TextView commentLikeCountTv, final ImageView commentLikeIv, final OnVoteListener listener) {
|
||||
CheckLoginUtils.checkLogin(context, new CheckLoginUtils.OnLoggenInListener() {
|
||||
@Override
|
||||
public void onLoggedIn() {
|
||||
if (commentLikeCountTv.getCurrentTextColor() == ContextCompat.getColor(context, R.color.theme)) {
|
||||
Utils.toast(context, "已经点过赞啦!");
|
||||
return;
|
||||
}
|
||||
commentEntity.setVote(commentEntity.getVote() + 1);
|
||||
commentLikeCountTv.setTextColor(ContextCompat.getColor(context, R.color.theme));
|
||||
commentLikeIv.setImageResource(R.drawable.ic_like_select);
|
||||
commentLikeCountTv.setText(String.valueOf(commentEntity.getVote()));
|
||||
commentLikeCountTv.setVisibility(View.VISIBLE);
|
||||
|
||||
PostCommentUtils.addCommentVoto(context, commentEntity.getId(), true,
|
||||
new PostCommentUtils.PostCommentListener() {
|
||||
@Override
|
||||
public void postSuccess(JSONObject response) {
|
||||
voteDao.add(new VoteInfo(commentEntity.getId()));
|
||||
if (listener != null) {
|
||||
listener.onVote();
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void postFailed(Throwable e) {
|
||||
|
||||
commentEntity.setVote(commentEntity.getVote() - 1);
|
||||
commentLikeCountTv.setTextColor(ContextCompat.getColor(context, R.color.hint));
|
||||
commentLikeIv.setImageResource(R.drawable.ic_like_unselect);
|
||||
commentLikeCountTv.setText(String.valueOf(commentEntity.getVote()));
|
||||
if (commentEntity.getVote() == 0) {
|
||||
commentLikeCountTv.setVisibility(View.GONE);
|
||||
} else {
|
||||
commentLikeCountTv.setVisibility(View.VISIBLE);
|
||||
}
|
||||
|
||||
if (e instanceof HttpException) {
|
||||
HttpException exception = (HttpException) e;
|
||||
if (exception.code() == 403) {
|
||||
try {
|
||||
String detail = new JSONObject(exception.response().errorBody().string()).getString("detail");
|
||||
if (detail.equals("voted")) {
|
||||
Utils.toast(context, "已经点过赞啦!");
|
||||
}
|
||||
} catch (Exception ex) {
|
||||
ex.printStackTrace();
|
||||
}
|
||||
return;
|
||||
}
|
||||
}
|
||||
Utils.toast(context, "网络异常,点赞失败");
|
||||
}
|
||||
});
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
public interface OnVoteListener {
|
||||
void onVote();
|
||||
}
|
||||
}
|
||||
|
||||
@ -25,33 +25,28 @@ public class ConcernContentUtils {
|
||||
int index = 0;
|
||||
for (int i = 0, size = (int) Math.ceil(list.size() / 3.0f); i < size; i++) {
|
||||
int type = count % 3;
|
||||
LinearLayout ll;
|
||||
switch (type) {
|
||||
case 0:
|
||||
ll = new LinearLayout(context);
|
||||
ll.setOrientation(LinearLayout.HORIZONTAL);
|
||||
for (int j = 0; j < 3; j++) {
|
||||
ll.addView(getImageView(context, list, entrance, index, width, 0));
|
||||
index += 1;
|
||||
}
|
||||
linearLayout.addView(ll);
|
||||
count -= 3;
|
||||
break;
|
||||
case 1:
|
||||
linearLayout.addView(getImageView(context, list, entrance, index, width, 1));
|
||||
count -= 1;
|
||||
if (type == 0) {
|
||||
LinearLayout ll = new LinearLayout(context);
|
||||
ll.setOrientation(LinearLayout.HORIZONTAL);
|
||||
for (int j = 0; j < 3; j++) {
|
||||
ll.addView(getImageView(context, list, entrance, index, width, 0));
|
||||
index += 1;
|
||||
break;
|
||||
case 2:
|
||||
ll = new LinearLayout(context);
|
||||
ll.setOrientation(LinearLayout.HORIZONTAL);
|
||||
for (int j = 0; j < 2; j++) {
|
||||
ll.addView(getImageView(context, list, entrance, index, width, 2));
|
||||
index += 1;
|
||||
}
|
||||
linearLayout.addView(ll);
|
||||
count -= 2;
|
||||
break;
|
||||
}
|
||||
linearLayout.addView(ll);
|
||||
count -= 3;
|
||||
} else if (type == 1) {
|
||||
linearLayout.addView(getImageView(context, list, entrance, index, width, 1));
|
||||
count -= 1;
|
||||
index += 1;
|
||||
} else if (type == 2) {
|
||||
LinearLayout ll = new LinearLayout(context);
|
||||
ll.setOrientation(LinearLayout.HORIZONTAL);
|
||||
for (int j = 0; j < 2; j++) {
|
||||
ll.addView(getImageView(context, list, entrance, index, width, 2));
|
||||
index += 1;
|
||||
}
|
||||
linearLayout.addView(ll);
|
||||
count -= 2;
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -59,39 +54,34 @@ public class ConcernContentUtils {
|
||||
private static SimpleDraweeView getImageView(final Context context, final List<String> list, final String entrance,
|
||||
final int position, int width, int type) {
|
||||
SimpleDraweeView imageView;
|
||||
LinearLayout.LayoutParams lparams;
|
||||
switch (type) {
|
||||
case 0:
|
||||
imageView = new SimpleDraweeView(context);
|
||||
lparams = new LinearLayout.LayoutParams(
|
||||
0, width / 3 - DisplayUtils.dip2px(context, 4));
|
||||
lparams.setMargins(DisplayUtils.dip2px(context, 2), 0,
|
||||
DisplayUtils.dip2px(context, 2), DisplayUtils.dip2px(context, 4));
|
||||
lparams.weight = 1;
|
||||
imageView.setLayoutParams(lparams);
|
||||
ImageUtils.Companion.getInstance().display(context.getResources(), imageView,
|
||||
ScalingUtils.ScaleType.CENTER_CROP, list.get(position));
|
||||
break;
|
||||
case 1:
|
||||
imageView = new SimpleDraweeView(context);
|
||||
lparams = new LinearLayout.LayoutParams(width, width / 2);
|
||||
lparams.setMargins(DisplayUtils.dip2px(context, 2), 0,
|
||||
DisplayUtils.dip2px(context, 2), DisplayUtils.dip2px(context, 4));
|
||||
imageView.setLayoutParams(lparams);
|
||||
ImageUtils.Companion.getInstance().display(context.getResources(), imageView,
|
||||
ScalingUtils.ScaleType.CENTER_CROP, list.get(position));
|
||||
break;
|
||||
default:
|
||||
imageView = new SimpleDraweeView(context);
|
||||
lparams = new LinearLayout.LayoutParams(
|
||||
0, width / 2 - DisplayUtils.dip2px(context, 4));
|
||||
lparams.setMargins(DisplayUtils.dip2px(context, 2), 0,
|
||||
DisplayUtils.dip2px(context, 2), DisplayUtils.dip2px(context, 4));
|
||||
lparams.weight = 1;
|
||||
imageView.setLayoutParams(lparams);
|
||||
ImageUtils.Companion.getInstance().display(context.getResources(), imageView,
|
||||
ScalingUtils.ScaleType.CENTER_CROP, list.get(position));
|
||||
break;
|
||||
if (type == 0) {
|
||||
imageView = new SimpleDraweeView(context);
|
||||
LinearLayout.LayoutParams lparams = new LinearLayout.LayoutParams(
|
||||
0, width / 3 - DisplayUtils.dip2px(context, 4));
|
||||
lparams.setMargins(DisplayUtils.dip2px(context, 2), 0,
|
||||
DisplayUtils.dip2px(context, 2), DisplayUtils.dip2px(context, 4));
|
||||
lparams.weight = 1;
|
||||
imageView.setLayoutParams(lparams);
|
||||
ImageUtils.getInstance().display(context.getResources(), imageView,
|
||||
ScalingUtils.ScaleType.CENTER_CROP, list.get(position));
|
||||
} else if (type == 1) {
|
||||
imageView = new SimpleDraweeView(context);
|
||||
LinearLayout.LayoutParams lparams = new LinearLayout.LayoutParams(width, width / 2);
|
||||
lparams.setMargins(DisplayUtils.dip2px(context, 2), 0,
|
||||
DisplayUtils.dip2px(context, 2), DisplayUtils.dip2px(context, 4));
|
||||
imageView.setLayoutParams(lparams);
|
||||
ImageUtils.getInstance().display(context.getResources(), imageView,
|
||||
ScalingUtils.ScaleType.CENTER_CROP, list.get(position));
|
||||
} else {
|
||||
imageView = new SimpleDraweeView(context);
|
||||
LinearLayout.LayoutParams lparams = new LinearLayout.LayoutParams(
|
||||
0, width / 2 - DisplayUtils.dip2px(context, 4));
|
||||
lparams.setMargins(DisplayUtils.dip2px(context, 2), 0,
|
||||
DisplayUtils.dip2px(context, 2), DisplayUtils.dip2px(context, 4));
|
||||
lparams.weight = 1;
|
||||
imageView.setLayoutParams(lparams);
|
||||
ImageUtils.getInstance().display(context.getResources(), imageView,
|
||||
ScalingUtils.ScaleType.CENTER_CROP, list.get(position));
|
||||
}
|
||||
imageView.setOnClickListener(new View.OnClickListener() {
|
||||
@Override
|
||||
|
||||
81
app/src/main/java/com/gh/common/util/ConcernUtils.java
Normal file
81
app/src/main/java/com/gh/common/util/ConcernUtils.java
Normal file
@ -0,0 +1,81 @@
|
||||
package com.gh.common.util;
|
||||
|
||||
import android.content.Context;
|
||||
|
||||
import com.gh.gamecenter.eventbus.EBReuse;
|
||||
import com.gh.gamecenter.retrofit.Response;
|
||||
import com.gh.gamecenter.retrofit.RetrofitManager;
|
||||
|
||||
import org.greenrobot.eventbus.EventBus;
|
||||
import org.json.JSONArray;
|
||||
|
||||
import okhttp3.MediaType;
|
||||
import okhttp3.RequestBody;
|
||||
import okhttp3.ResponseBody;
|
||||
import retrofit2.HttpException;
|
||||
import rx.Observable;
|
||||
import rx.functions.Func1;
|
||||
import rx.schedulers.Schedulers;
|
||||
|
||||
/**
|
||||
* Created by khy on 2016/8/24.
|
||||
* croncern 工具类
|
||||
*/
|
||||
public class ConcernUtils {
|
||||
|
||||
public static void postConcernGameId(final Context context, final String gameId) {
|
||||
TokenUtils.getToken(context, true)
|
||||
.flatMap(new Func1<String, Observable<ResponseBody>>() {
|
||||
@Override
|
||||
public Observable<ResponseBody> call(String token) {
|
||||
JSONArray params = new JSONArray();
|
||||
params.put(gameId);
|
||||
RequestBody body = RequestBody.create(MediaType.parse("application/json"), params.toString());
|
||||
return RetrofitManager.getUser().postConcern(token, body);
|
||||
}
|
||||
}).subscribeOn(Schedulers.io())
|
||||
.observeOn(Schedulers.io())
|
||||
.subscribe(new Response<ResponseBody>());
|
||||
}
|
||||
|
||||
public static void deleteConcernData(final Context context, final String gameId) {
|
||||
TokenUtils.getToken(context, true)
|
||||
.flatMap(new Func1<String, Observable<ResponseBody>>() {
|
||||
@Override
|
||||
public Observable<ResponseBody> call(String token) {
|
||||
return RetrofitManager.getUser().deleteConcern(token, gameId);
|
||||
}
|
||||
}).subscribeOn(Schedulers.io())
|
||||
.observeOn(Schedulers.io())
|
||||
.subscribe(new Response<ResponseBody>());
|
||||
}
|
||||
|
||||
public static void updateConcernData(final Context context, final JSONArray data) {
|
||||
TokenUtils.getToken(context, true)
|
||||
.flatMap(new Func1<String, Observable<ResponseBody>>() {
|
||||
@Override
|
||||
public Observable<ResponseBody> call(String token) {
|
||||
RequestBody body = RequestBody.create(MediaType.parse("application/json"),
|
||||
data.toString());
|
||||
return RetrofitManager.getUser().putConcern(token, body);
|
||||
}
|
||||
})
|
||||
.subscribeOn(Schedulers.io())
|
||||
.observeOn(Schedulers.io())
|
||||
.subscribe(new Response<ResponseBody>() {
|
||||
@Override
|
||||
public void onResponse(ResponseBody response) {
|
||||
super.onResponse(response);
|
||||
EventBus.getDefault().post(new EBReuse("UpdateConcernSuccess"));
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onFailure(HttpException e) {
|
||||
super.onFailure(e);
|
||||
EventBus.getDefault().post(new EBReuse("UpdateConcernFailure"));
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@ -1,63 +0,0 @@
|
||||
package com.gh.common.util
|
||||
|
||||
import android.content.Context
|
||||
import com.gh.gamecenter.eventbus.EBReuse
|
||||
import com.gh.gamecenter.retrofit.Response
|
||||
import com.gh.gamecenter.retrofit.RetrofitManager
|
||||
import okhttp3.MediaType
|
||||
import okhttp3.RequestBody
|
||||
import okhttp3.ResponseBody
|
||||
import org.greenrobot.eventbus.EventBus
|
||||
import org.json.JSONArray
|
||||
import retrofit2.HttpException
|
||||
import rx.schedulers.Schedulers
|
||||
|
||||
/**
|
||||
* Created by khy on 2016/8/24.
|
||||
* croncern 工具类
|
||||
*/
|
||||
object ConcernUtils {
|
||||
|
||||
fun postConcernGameId(context: Context, gameId: String) {
|
||||
TokenUtils.getToken(context, true)
|
||||
.flatMap { token ->
|
||||
val params = JSONArray()
|
||||
params.put(gameId)
|
||||
val body = RequestBody.create(MediaType.parse("application/json"), params.toString())
|
||||
RetrofitManager.getUser().postConcern(token, body)
|
||||
}.subscribeOn(Schedulers.io())
|
||||
.observeOn(Schedulers.io())
|
||||
.subscribe(Response<ResponseBody>())
|
||||
}
|
||||
|
||||
fun deleteConcernData(context: Context, gameId: String) {
|
||||
TokenUtils.getToken(context, true)
|
||||
.flatMap { token -> RetrofitManager.getUser().deleteConcern(token, gameId) }.subscribeOn(Schedulers.io())
|
||||
.observeOn(Schedulers.io())
|
||||
.subscribe(Response<ResponseBody>())
|
||||
}
|
||||
|
||||
fun updateConcernData(context: Context, data: JSONArray) {
|
||||
TokenUtils.getToken(context, true)
|
||||
.flatMap { token ->
|
||||
val body = RequestBody.create(MediaType.parse("application/json"),
|
||||
data.toString())
|
||||
RetrofitManager.getUser().putConcern(token, body)
|
||||
}
|
||||
.subscribeOn(Schedulers.io())
|
||||
.observeOn(Schedulers.io())
|
||||
.subscribe(object : Response<ResponseBody>() {
|
||||
override fun onResponse(response: ResponseBody) {
|
||||
super.onResponse(response)
|
||||
EventBus.getDefault().post(EBReuse("UpdateConcernSuccess"))
|
||||
}
|
||||
|
||||
override fun onFailure(e: HttpException) {
|
||||
super.onFailure(e)
|
||||
EventBus.getDefault().post(EBReuse("UpdateConcernFailure"))
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@ -3,7 +3,7 @@ package com.gh.common.util;
|
||||
import android.content.Context;
|
||||
import android.os.Build;
|
||||
|
||||
import com.lightgame.download.DownloadEntity;
|
||||
import com.gh.download.DownloadEntity;
|
||||
import com.gh.gamecenter.db.info.ConcernInfo;
|
||||
import com.gh.gamecenter.entity.GameEntity;
|
||||
import com.gh.gamecenter.entity.NewsDetailEntity;
|
||||
|
||||
@ -3,10 +3,9 @@ package com.gh.common.util;
|
||||
import android.content.Context;
|
||||
|
||||
import com.gh.base.AppController;
|
||||
import com.lightgame.download.DownloadEntity;
|
||||
import com.gh.download.DownloadEntity;
|
||||
import com.gh.gamecenter.retrofit.Response;
|
||||
import com.gh.gamecenter.retrofit.RetrofitManager;
|
||||
import com.lightgame.utils.Utils;
|
||||
|
||||
import org.json.JSONObject;
|
||||
|
||||
|
||||
@ -36,7 +36,7 @@ public class DataUtils {
|
||||
if (!debug) {
|
||||
TCAgent.init(context, Config.TD_APPID, channel);
|
||||
//TODO 去除为了测试MTA的问题,这个版本不启用
|
||||
TCAgent.setReportUncaughtExceptions(true);
|
||||
// TCAgent.setReportUncaughtExceptions(true);
|
||||
}
|
||||
|
||||
// 打开debug开关,可查看mta上报日志或错误
|
||||
|
||||
@ -1,256 +0,0 @@
|
||||
package com.gh.common.util;
|
||||
|
||||
import android.content.Intent;
|
||||
import android.support.v4.content.ContextCompat;
|
||||
import android.text.TextUtils;
|
||||
import android.view.View;
|
||||
|
||||
import com.gh.common.constant.Config;
|
||||
import com.gh.common.view.DownloadDialog;
|
||||
import com.gh.download.DownloadManager;
|
||||
import com.gh.gamecenter.DownloadManagerActivity;
|
||||
import com.gh.gamecenter.R;
|
||||
import com.gh.gamecenter.adapter.viewholder.DetailViewHolder;
|
||||
import com.gh.gamecenter.entity.ApkEntity;
|
||||
import com.gh.gamecenter.entity.GameEntity;
|
||||
import com.gh.gamecenter.manager.PackageManager;
|
||||
import com.lightgame.download.DownloadEntity;
|
||||
import com.lightgame.download.FileUtils;
|
||||
import com.lightgame.utils.Utils;
|
||||
|
||||
/**
|
||||
* Created by khy on 27/06/17.
|
||||
* 详情下载工具类
|
||||
*/
|
||||
|
||||
public class DetailDownloadUtils {
|
||||
|
||||
public static void detailInitDownload(DetailViewHolder viewHolder, boolean isCheck) {
|
||||
if (Config.isShow(viewHolder.context)) {
|
||||
viewHolder.downloadBottom.setVisibility(View.VISIBLE);
|
||||
} else {
|
||||
viewHolder.downloadBottom.setVisibility(View.GONE);
|
||||
}
|
||||
if (viewHolder.gameEntity != null && "光环助手".equals(viewHolder.gameEntity.getName())) {
|
||||
viewHolder.downloadBottom.setVisibility(View.GONE);
|
||||
} else if (viewHolder.gameEntity == null || viewHolder.gameEntity.getApk().isEmpty()) {
|
||||
viewHolder.downloadTv.setVisibility(View.VISIBLE);
|
||||
viewHolder.downloadPb.setVisibility(View.GONE);
|
||||
viewHolder.downloadPer.setVisibility(View.GONE);
|
||||
if (TextUtils.isEmpty(viewHolder.downloadOffText)) {
|
||||
viewHolder.downloadTv.setText("暂无下载");
|
||||
} else {
|
||||
viewHolder.downloadTv.setText(viewHolder.downloadOffText);
|
||||
}
|
||||
viewHolder.downloadTv.setBackgroundResource(R.drawable.game_item_btn_pause_style);
|
||||
viewHolder.downloadTv.setTextColor(0xFF999999);
|
||||
viewHolder.downloadTv.setClickable(false);
|
||||
} else {
|
||||
viewHolder.downloadTv.setVisibility(View.VISIBLE);
|
||||
viewHolder.downloadPb.setVisibility(View.GONE);
|
||||
viewHolder.downloadPer.setVisibility(View.GONE);
|
||||
boolean isInstalled = false;
|
||||
if (viewHolder.gameEntity.getApk() != null && viewHolder.gameEntity.getApk().size() == 1
|
||||
&& PackageManager.isInstalled(viewHolder.gameEntity.getApk().get(0).getPackageName())) {
|
||||
isInstalled = true;
|
||||
}
|
||||
if (isInstalled) {
|
||||
if (PackageManager.isCanUpdate(viewHolder.gameEntity.getId(), viewHolder.gameEntity.getApk().get(0).getPackageName())) {
|
||||
if (viewHolder.isNewsDetail) {
|
||||
viewHolder.downloadTv.setText("更新");
|
||||
} else if (TextUtils.isEmpty(viewHolder.downloadAddWord)) {
|
||||
viewHolder.downloadTv.setText(String.format("更新《%s》",
|
||||
viewHolder.gameEntity.getName()));
|
||||
} else {
|
||||
viewHolder.downloadTv.setText(String.format("更新《%s》%s",
|
||||
viewHolder.gameEntity.getName(), viewHolder.downloadAddWord));
|
||||
}
|
||||
viewHolder.downloadTv.setBackgroundResource(
|
||||
R.drawable.game_item_btn_download_style);
|
||||
} else {
|
||||
if (viewHolder.gameEntity.getTag() != null && viewHolder.gameEntity.getTag().size() != 0
|
||||
&& !TextUtils.isEmpty(viewHolder.gameEntity.getApk().get(0).getGhVersion())
|
||||
&& !PackageUtils.isSignature(viewHolder.context, viewHolder.gameEntity.getApk().get(0).getPackageName())) {
|
||||
if (viewHolder.isNewsDetail) {
|
||||
viewHolder.downloadTv.setText("插件化");
|
||||
} else if (TextUtils.isEmpty(viewHolder.downloadAddWord)) {
|
||||
viewHolder.downloadTv.setText(String.format("插件化《%s》",
|
||||
viewHolder.gameEntity.getName()));
|
||||
} else {
|
||||
viewHolder.downloadTv.setText(String.format("插件化《%s》%s",
|
||||
viewHolder.gameEntity.getName(), viewHolder.downloadAddWord));
|
||||
}
|
||||
viewHolder.downloadTv.setBackgroundResource(
|
||||
R.drawable.game_item_btn_plugin_style);
|
||||
} else {
|
||||
if (viewHolder.isNewsDetail) {
|
||||
viewHolder.downloadTv.setText("启动");
|
||||
} else if (TextUtils.isEmpty(viewHolder.downloadAddWord)) {
|
||||
viewHolder.downloadTv.setText(String.format("启动《%s》",
|
||||
viewHolder.gameEntity.getName()));
|
||||
} else {
|
||||
viewHolder.downloadTv.setText(String.format("启动《%s》%s",
|
||||
viewHolder.gameEntity.getName(), viewHolder.downloadAddWord));
|
||||
}
|
||||
viewHolder.downloadTv.setBackgroundResource(
|
||||
R.drawable.game_item_btn_launch_style);
|
||||
}
|
||||
}
|
||||
} else {
|
||||
String status = GameUtils.getDownloadBtnText(viewHolder.context, viewHolder.gameEntity);
|
||||
switch (status) {
|
||||
case "插件化":
|
||||
viewHolder.downloadTv.setBackgroundResource(R.drawable.game_item_btn_plugin_style);
|
||||
break;
|
||||
case "打开":
|
||||
viewHolder.downloadTv.setBackgroundResource(R.drawable.game_item_btn_launch_style);
|
||||
break;
|
||||
default:
|
||||
viewHolder.downloadTv.setBackgroundResource(R.drawable.game_item_btn_download_style);
|
||||
break;
|
||||
}
|
||||
|
||||
if (viewHolder.isNewsDetail) {
|
||||
viewHolder.downloadTv.setText(status);
|
||||
} else if (TextUtils.isEmpty(viewHolder.downloadAddWord)) {
|
||||
viewHolder.downloadTv.setText(String.format(status + "《%s》",
|
||||
viewHolder.gameEntity.getName()));
|
||||
} else {
|
||||
viewHolder.downloadTv.setText(String.format(status + "《%s》%s",
|
||||
viewHolder.gameEntity.getName(), viewHolder.downloadAddWord));
|
||||
}
|
||||
}
|
||||
}
|
||||
if (isCheck && viewHolder.gameEntity != null
|
||||
&& viewHolder.gameEntity.getApk() != null
|
||||
&& viewHolder.gameEntity.getApk().size() == 1) {
|
||||
String url = viewHolder.gameEntity.getApk().get(0).getUrl();
|
||||
DownloadEntity downloadEntity = DownloadManager.getInstance(viewHolder.context).getDownloadEntityByUrl(url);
|
||||
if (downloadEntity != null) {
|
||||
viewHolder.downloadEntity = downloadEntity;
|
||||
viewHolder.downloadTv.setVisibility(View.GONE);
|
||||
viewHolder.downloadPb.setVisibility(View.VISIBLE);
|
||||
viewHolder.downloadPer.setVisibility(View.VISIBLE);
|
||||
detailInvalidate(viewHolder);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public static void detailInvalidate(DetailViewHolder viewHolder) {
|
||||
viewHolder.downloadPb.setProgress((int) (viewHolder.downloadEntity.getPercent() * 10));
|
||||
viewHolder.downloadPer.setTextColor(0xFFFFFFFF);
|
||||
DownloadEntity downloadEntity = viewHolder.downloadEntity;
|
||||
switch (downloadEntity.getStatus()) {
|
||||
case downloading:
|
||||
case pause:
|
||||
case timeout:
|
||||
case neterror:
|
||||
case waiting:
|
||||
viewHolder.downloadPer.setText("下载中");
|
||||
break;
|
||||
case done:
|
||||
viewHolder.downloadPer.setText("安装");
|
||||
if (downloadEntity.isPluggable()
|
||||
&& PackageManager.isInstalled(downloadEntity.getPackageName())) {
|
||||
viewHolder.downloadPb.setProgressDrawable(ContextCompat.getDrawable(viewHolder.context, R.drawable.progressbar_plugin_radius_style));
|
||||
} else {
|
||||
viewHolder.downloadPb.setProgressDrawable(ContextCompat.getDrawable(viewHolder.context, R.drawable.progressbar_normal_radius_style));
|
||||
}
|
||||
break;
|
||||
case cancel:
|
||||
case hijack:
|
||||
case notfound:
|
||||
detailInitDownload(viewHolder, false);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
public static class OnDetailDownloadClickListener implements View.OnClickListener {
|
||||
private DetailViewHolder mViewHolder;
|
||||
private GameEntity mGameEntity;
|
||||
private DownloadEntity mDownloadEntity;
|
||||
private String mEntrance;
|
||||
private String mName;
|
||||
private String mTitle;
|
||||
|
||||
public OnDetailDownloadClickListener(DetailViewHolder viewHolder, String entrance, String name, String title) {
|
||||
mViewHolder = viewHolder;
|
||||
mGameEntity = viewHolder.gameEntity;
|
||||
mDownloadEntity = viewHolder.downloadEntity;
|
||||
mEntrance = entrance;
|
||||
mName = name;
|
||||
mTitle = title;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onClick(View v) {
|
||||
if (v == mViewHolder.downloadTv) {
|
||||
if (mGameEntity != null && !mGameEntity.getApk().isEmpty()) {
|
||||
if (mGameEntity.getApk().size() == 1) {
|
||||
if (NetworkUtils.isWifiConnected(mViewHolder.context)) {
|
||||
download();
|
||||
} else {
|
||||
DialogUtils.showDownloadDialog(mViewHolder.context, new DialogUtils.ConfirmListener() {
|
||||
@Override
|
||||
public void onConfirm() {
|
||||
download();
|
||||
}
|
||||
});
|
||||
}
|
||||
} else {
|
||||
DownloadDialog.getInstance(mViewHolder.context)
|
||||
.showPopupWindow(v, mGameEntity, mEntrance, mName + ":" + mTitle);
|
||||
}
|
||||
} else {
|
||||
Utils.toast(mViewHolder.context, "稍等片刻~!游戏正在上传中...");
|
||||
}
|
||||
} else if (v == mViewHolder.downloadPb || v == mViewHolder.downloadPer) {
|
||||
String str = mViewHolder.downloadPer.getText().toString();
|
||||
if ("下载中".equals(str)) {
|
||||
Intent intent = DownloadManagerActivity.getDownloadMangerIntent(mViewHolder.context,
|
||||
mGameEntity.getApk().get(0).getUrl(), mEntrance + "("+ mName +"[" + mTitle + "])");
|
||||
mViewHolder.context.startActivity(intent);
|
||||
} else if ("安装".equals(str)) {
|
||||
PackageUtils.launchSetup(mViewHolder.context, mDownloadEntity.getPath());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void download() {
|
||||
String str = mViewHolder.downloadTv.getText().toString();
|
||||
if (str.contains("启动")) {
|
||||
DataUtils.onGameLaunchEvent(mViewHolder.context, mGameEntity.getName(), mGameEntity.getApk().get(0).getPlatform(), mName);
|
||||
|
||||
PackageUtils.launchApplicationByPackageName(mViewHolder.context, mGameEntity.getApk().get(0).getPackageName());
|
||||
} else {
|
||||
String method;
|
||||
if (str.contains("更新")) {
|
||||
method = "更新";
|
||||
} else if (str.contains("插件化")) {
|
||||
method = "插件化";
|
||||
} else {
|
||||
method = "下载";
|
||||
}
|
||||
ApkEntity apkEntity = mGameEntity.getApk().get(0);
|
||||
String msg = FileUtils.isCanDownload(mViewHolder.context, apkEntity.getSize());
|
||||
if (TextUtils.isEmpty(msg)) {
|
||||
DataUtils.onGameDownloadEvent(mViewHolder.context, mGameEntity.getName(), apkEntity.getPlatform(), mEntrance, "下载开始");
|
||||
|
||||
DownloadManager.createDownload(mViewHolder.context, apkEntity, mGameEntity, method, mEntrance, mName + ":" + mTitle);
|
||||
|
||||
mViewHolder.downloadTv.setVisibility(View.GONE);
|
||||
mViewHolder.downloadPb.setVisibility(View.VISIBLE);
|
||||
mViewHolder.downloadPer.setVisibility(View.VISIBLE);
|
||||
mViewHolder.downloadPb.setProgress(0);
|
||||
mViewHolder.downloadPer.setText("0.0%");
|
||||
|
||||
// DownloadManager.getInstance(mViewHolder.context).putStatus(apkEntity.getUrl(), "downloading");
|
||||
} else {
|
||||
Utils.toast(mViewHolder.context, msg);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -8,17 +8,12 @@ import android.content.pm.ApplicationInfo;
|
||||
import android.content.pm.PackageInfo;
|
||||
import android.graphics.Bitmap;
|
||||
import android.os.Handler;
|
||||
import android.support.v4.content.ContextCompat;
|
||||
import android.support.v7.app.AlertDialog;
|
||||
import android.text.Html;
|
||||
import android.text.Spanned;
|
||||
import android.text.TextPaint;
|
||||
import android.view.Display;
|
||||
import android.view.Gravity;
|
||||
import android.view.View;
|
||||
import android.view.Window;
|
||||
import android.view.WindowManager;
|
||||
import android.widget.Button;
|
||||
import android.widget.ImageView;
|
||||
import android.widget.LinearLayout;
|
||||
import android.widget.TextView;
|
||||
@ -330,9 +325,6 @@ public class DialogUtils {
|
||||
public static void showWarningDialog(Context context, String title, CharSequence msg, String cancel, String confirm,
|
||||
final ConfirmListener cmListener, final CancelListener clListener) {
|
||||
|
||||
showAlertDialog(context, title, msg, confirm, cancel, cmListener, clListener);
|
||||
if (true) return; // TODO TEST
|
||||
|
||||
if (isShow) {
|
||||
return;
|
||||
}
|
||||
@ -400,10 +392,6 @@ public class DialogUtils {
|
||||
}, null);
|
||||
}
|
||||
|
||||
public static void showDownloadDialog(Context context, ConfirmListener listener, CancelListener cancelListener){
|
||||
showWarningDialog(context, "下载提示", "您当前使用的网络为2G/3G/4G,开始下载将会消耗移动流量,确定下载?", "取消", "确定", listener, cancelListener);
|
||||
}
|
||||
|
||||
public static void showDownloadDialog(Context context, ConfirmListener listener) {
|
||||
showWarningDialog(context, "下载提示", "您当前使用的网络为2G/3G/4G,开始下载将会消耗移动流量,确定下载?", listener);
|
||||
}
|
||||
@ -446,102 +434,6 @@ public class DialogUtils {
|
||||
disclaimerDialog.show();
|
||||
}
|
||||
|
||||
/**
|
||||
* Material Design 风格弹窗
|
||||
*
|
||||
* @param context
|
||||
* @param title 标题
|
||||
* @param message 内容
|
||||
* @param positive 确认按钮文本
|
||||
* @param negative 取消按钮文本
|
||||
* @param cmListener 确认按钮监听
|
||||
* @param clListener 取消按钮监听
|
||||
*/
|
||||
|
||||
public static void showAlertDialog(Context context, String title, CharSequence message
|
||||
, String positive, String negative, final ConfirmListener cmListener, final CancelListener clListener) {
|
||||
|
||||
AlertDialog alertDialog = new AlertDialog.Builder(context, R.style.GhAlertDialog)
|
||||
.setTitle(title)
|
||||
.setMessage(message)
|
||||
.setPositiveButton(positive, new DialogInterface.OnClickListener() {
|
||||
@Override
|
||||
public void onClick(DialogInterface dialog, int which) {
|
||||
if (cmListener != null) {
|
||||
cmListener.onConfirm();
|
||||
}
|
||||
}
|
||||
})
|
||||
.setNegativeButton(negative, new DialogInterface.OnClickListener() {
|
||||
@Override
|
||||
public void onClick(DialogInterface dialog, int which) {
|
||||
if (clListener != null) {
|
||||
clListener.onCancel();
|
||||
}
|
||||
}
|
||||
})
|
||||
.create();
|
||||
alertDialog.show();
|
||||
|
||||
TextView mesage = (TextView) alertDialog.findViewById(android.R.id.message);
|
||||
Button positiveBtn = alertDialog.getButton(android.app.AlertDialog.BUTTON_POSITIVE);
|
||||
Button negativeBtn = alertDialog.getButton(android.app.AlertDialog.BUTTON_NEGATIVE);
|
||||
|
||||
positiveBtn.setTextSize(13);
|
||||
positiveBtn.setTextColor(ContextCompat.getColor(context, R.color.theme));
|
||||
negativeBtn.setTextSize(13);
|
||||
negativeBtn.setTextColor(ContextCompat.getColor(context, R.color.theme));
|
||||
if (mesage != null) {
|
||||
mesage.setTextSize(13);
|
||||
mesage.setTextColor(ContextCompat.getColor(context, R.color.title));
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* 特殊:验证手机号码
|
||||
*/
|
||||
|
||||
public static void checkPhoneNumDialog(Context context, CharSequence message, final ConfirmListener cmListener) {
|
||||
String s = message.toString();
|
||||
String sub1 = s.substring(0, 3);
|
||||
String sub2 = s.substring(3, 7);
|
||||
String sub3 = s.substring(7, 11);
|
||||
String phoneNum = StringUtils.buildString(sub1, " - ", sub2, " - ", sub3);
|
||||
|
||||
AlertDialog alertDialog = new AlertDialog.Builder(context, R.style.GhAlertDialog)
|
||||
.setTitle("请确定手机号:")
|
||||
.setMessage(phoneNum)
|
||||
.setPositiveButton("确认", new DialogInterface.OnClickListener() {
|
||||
@Override
|
||||
public void onClick(DialogInterface dialog, int which) {
|
||||
if (cmListener != null) {
|
||||
cmListener.onConfirm();
|
||||
}
|
||||
}
|
||||
})
|
||||
.setNegativeButton("取消", null)
|
||||
.create();
|
||||
alertDialog.show();
|
||||
|
||||
TextView mesage = (TextView) alertDialog.findViewById(android.R.id.message);
|
||||
Button positiveBtn = alertDialog.getButton(android.app.AlertDialog.BUTTON_POSITIVE);
|
||||
Button negativeBtn = alertDialog.getButton(android.app.AlertDialog.BUTTON_NEGATIVE);
|
||||
|
||||
positiveBtn.setTextSize(13);
|
||||
positiveBtn.setTextColor(ContextCompat.getColor(context, R.color.theme));
|
||||
negativeBtn.setTextSize(13);
|
||||
negativeBtn.setTextColor(ContextCompat.getColor(context, R.color.theme));
|
||||
if (mesage != null) {
|
||||
mesage.setGravity(Gravity.CENTER);
|
||||
mesage.setTextSize(24);
|
||||
mesage.setTextColor(ContextCompat.getColor(context, R.color.title));
|
||||
TextPaint tp = mesage.getPaint();
|
||||
tp.setFakeBoldText(true);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
public interface ConfirmListener {
|
||||
void onConfirm();
|
||||
}
|
||||
|
||||
@ -3,7 +3,6 @@ package com.gh.common.util;
|
||||
import android.content.Context;
|
||||
import android.graphics.Color;
|
||||
import android.os.Message;
|
||||
import android.support.v4.content.ContextCompat;
|
||||
import android.support.v4.util.ArrayMap;
|
||||
import android.support.v7.widget.RecyclerView;
|
||||
import android.text.TextUtils;
|
||||
@ -12,18 +11,16 @@ import android.widget.TextView;
|
||||
import android.widget.Toast;
|
||||
|
||||
import com.gh.common.constant.Config;
|
||||
import com.gh.common.constant.Constants;
|
||||
import com.gh.common.view.DownloadDialog;
|
||||
import com.gh.download.DownloadEntity;
|
||||
import com.gh.download.DownloadManager;
|
||||
import com.gh.download.DownloadStatus;
|
||||
import com.gh.gamecenter.DownloadManagerActivity;
|
||||
import com.gh.gamecenter.R;
|
||||
import com.gh.gamecenter.adapter.viewholder.GameViewHolder;
|
||||
import com.gh.gamecenter.entity.ApkEntity;
|
||||
import com.gh.gamecenter.entity.GameEntity;
|
||||
import com.gh.gamecenter.manager.PackageManager;
|
||||
import com.lightgame.download.DownloadConfig;
|
||||
import com.lightgame.download.DownloadEntity;
|
||||
import com.lightgame.download.DownloadStatus;
|
||||
import com.lightgame.download.FileUtils;
|
||||
|
||||
import java.util.concurrent.LinkedBlockingQueue;
|
||||
|
||||
@ -66,15 +63,10 @@ public class DownloadItemUtils {
|
||||
} else {
|
||||
if (!queue.contains(platform)) {
|
||||
queue.offer(platform);
|
||||
if (AppDebugConfig.IS_DEBUG) {
|
||||
AppDebugConfig.logMethodWithParams(DownloadItemUtils.class, queue.size(), gameEntity.getBrief(), downloadEntity.getPlatform(), index);
|
||||
}
|
||||
// 有两个平台同时下载的时候启用
|
||||
if (queue.size() == 2) {
|
||||
//TODO fuck this
|
||||
Message msg = Message.obtain();
|
||||
msg.obj = downloadEntity.getName();
|
||||
msg.what = DownloadConfig.DOWNLOAD_ROLL;
|
||||
msg.what = Constants.DOWNLOAD_ROLL;
|
||||
DownloadManager.getInstance(context).sendMessageDelayed(msg, 3000);
|
||||
}
|
||||
}
|
||||
@ -94,7 +86,7 @@ public class DownloadItemUtils {
|
||||
public static void updateItem(Context context, GameEntity gameEntity, GameViewHolder holder, boolean isShowPlatform) {
|
||||
|
||||
// 控制是否显示下载按钮
|
||||
if (!Config.isShow(context) || context.getString(R.string.app_name).equals(gameEntity.getName())) {
|
||||
if (!Config.isShow(context) || "光环助手".equals(gameEntity.getName())) {
|
||||
holder.gameDownloadBtn.setVisibility(View.GONE);
|
||||
} else {
|
||||
holder.gameDownloadBtn.setVisibility(View.VISIBLE);
|
||||
@ -106,6 +98,13 @@ public class DownloadItemUtils {
|
||||
holder.gameLibaoIcon.setVisibility(View.GONE);
|
||||
}
|
||||
|
||||
// LibaoDao libaoDao = new LibaoDao(context);
|
||||
// if (libaoDao.isExist(gameEntity.getId())) {
|
||||
// holder.gameLibaoIcon.setVisibility(View.VISIBLE);
|
||||
// } else {
|
||||
//
|
||||
// }
|
||||
|
||||
if (gameEntity.getApk() == null || gameEntity.getApk().isEmpty()) {
|
||||
holder.gameDes.setVisibility(View.VISIBLE);
|
||||
holder.gameProgressbar.setVisibility(View.GONE);
|
||||
@ -116,21 +115,18 @@ public class DownloadItemUtils {
|
||||
} else if (gameEntity.getApk().size() == 1) {
|
||||
updateNormalItem(context, holder, gameEntity, isShowPlatform);
|
||||
} else {
|
||||
// updateNormalItem(context, holder, gameEntity, isShowPlatform);
|
||||
updatePluginItem(context, holder, gameEntity, isShowPlatform);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
// 更新正常的条目,只有一个apk包
|
||||
static void updateNormalItem(Context context, GameViewHolder holder, GameEntity gameEntity,
|
||||
boolean isShowPlatform) {
|
||||
|
||||
final ArrayMap<String, DownloadEntity> entryMap = gameEntity.getEntryMap();
|
||||
final ApkEntity apkEntity = gameEntity.getApk().get(0);
|
||||
public static void updateNormalItem(Context context, GameViewHolder holder, GameEntity gameEntity,
|
||||
boolean isShowPlatform) {
|
||||
|
||||
ArrayMap<String, DownloadEntity> entryMap = gameEntity.getEntryMap();
|
||||
if (entryMap != null && !entryMap.isEmpty()) {
|
||||
DownloadEntity downloadEntity = entryMap.get(apkEntity.getPlatform());
|
||||
DownloadEntity downloadEntity = entryMap.get(gameEntity.getApk().get(0).getPlatform());
|
||||
if (downloadEntity != null) {
|
||||
// 更改进度条和提示文本的状态
|
||||
changeStatus(context, holder, downloadEntity, isShowPlatform, true);
|
||||
@ -143,22 +139,37 @@ public class DownloadItemUtils {
|
||||
holder.gameInfo.setVisibility(View.GONE);
|
||||
|
||||
holder.gameDownloadBtn.setTextColor(Color.WHITE);
|
||||
|
||||
final String packageName = apkEntity.getPackageName();
|
||||
|
||||
if (gameEntity.isPluggable()) {
|
||||
holder.gameDownloadBtn.setText("插件化");
|
||||
setwhat(context, holder, apkEntity, packageName);
|
||||
} else if (PackageManager.isInstalled(packageName)) {
|
||||
if (PackageManager.isCanUpdate(gameEntity.getId(), packageName)) {
|
||||
DownloadEntity downloadEntity = DownloadManager.getInstance(context).getByPackage(
|
||||
gameEntity.getApk().get(0).getPackageName());
|
||||
if (downloadEntity == null
|
||||
|| downloadEntity.getUrl().equals(gameEntity.getApk().get(0).getUrl())) {
|
||||
holder.gameDownloadBtn.setClickable(true);
|
||||
holder.gameDownloadBtn.setBackgroundResource(R.drawable.game_item_btn_plugin_style);
|
||||
} else {
|
||||
holder.gameDownloadBtn.setClickable(false);
|
||||
holder.gameDownloadBtn.setBackgroundResource(R.drawable.game_item_btn_pause_up);
|
||||
}
|
||||
} else if (PackageManager.isInstalled(gameEntity.getApk().get(0).getPackageName())) {
|
||||
if (PackageManager.isCanUpdate(gameEntity.getId(), gameEntity.getApk().get(0).getPackageName())) {
|
||||
holder.gameDownloadBtn.setText("更新");
|
||||
holder.gameDownloadBtn.setBackgroundResource(R.drawable.game_item_btn_download_style);
|
||||
} else {
|
||||
if (gameEntity.getTag() != null && gameEntity.getTag().size() != 0
|
||||
&& !TextUtils.isEmpty(apkEntity.getGhVersion())
|
||||
&& !PackageUtils.isSignature(context, packageName)) {
|
||||
&& !TextUtils.isEmpty(gameEntity.getApk().get(0).getGhVersion())
|
||||
&& !PackageUtils.isSignature(context, gameEntity.getApk().get(0).getPackageName())) {
|
||||
holder.gameDownloadBtn.setText("插件化");
|
||||
setwhat(context, holder, apkEntity, packageName);
|
||||
DownloadEntity downloadEntity = DownloadManager.getInstance(context).getByPackage(
|
||||
gameEntity.getApk().get(0).getPackageName());
|
||||
if (downloadEntity == null
|
||||
|| downloadEntity.getUrl().equals(gameEntity.getApk().get(0).getUrl())) {
|
||||
holder.gameDownloadBtn.setClickable(true);
|
||||
holder.gameDownloadBtn.setBackgroundResource(R.drawable.game_item_btn_plugin_style);
|
||||
} else {
|
||||
holder.gameDownloadBtn.setClickable(false);
|
||||
holder.gameDownloadBtn.setBackgroundResource(R.drawable.game_item_btn_pause_up);
|
||||
}
|
||||
} else {
|
||||
holder.gameDownloadBtn.setText("启动");
|
||||
holder.gameDownloadBtn.setBackgroundResource(R.drawable.game_item_btn_launch_style);
|
||||
@ -170,28 +181,9 @@ public class DownloadItemUtils {
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 这个干什么鬼?
|
||||
*
|
||||
* @param context
|
||||
* @param holder
|
||||
* @param apkEntity
|
||||
* @param packageName
|
||||
*/
|
||||
public static void setwhat(Context context, GameViewHolder holder, ApkEntity apkEntity, String packageName) {
|
||||
DownloadEntity downloadEntity = DownloadManager.getInstance(context).getDownloadEntityByPackageName(packageName);
|
||||
if (downloadEntity == null || downloadEntity.getUrl().equals(apkEntity.getUrl())) {
|
||||
holder.gameDownloadBtn.setClickable(true);
|
||||
holder.gameDownloadBtn.setBackgroundResource(R.drawable.game_item_btn_plugin_style);
|
||||
} else {
|
||||
holder.gameDownloadBtn.setClickable(false);
|
||||
holder.gameDownloadBtn.setBackgroundResource(R.drawable.game_item_btn_pause_up);
|
||||
}
|
||||
}
|
||||
|
||||
// 更新插件的条目,有多个apk包
|
||||
static void updatePluginItem(Context context, GameViewHolder holder, GameEntity gameEntity,
|
||||
boolean isShowPlatform) {
|
||||
public static void updatePluginItem(Context context, GameViewHolder holder, GameEntity gameEntity,
|
||||
boolean isShowPlatform) {
|
||||
|
||||
GameUtils.setDownloadBtnStatus(context, gameEntity, holder.gameDownloadBtn);
|
||||
|
||||
@ -226,7 +218,8 @@ public class DownloadItemUtils {
|
||||
holder.gameProgressbar.setVisibility(View.VISIBLE);
|
||||
holder.gameInfo.setVisibility(View.VISIBLE);
|
||||
|
||||
String platform = PlatformUtils.getInstance(context).getPlatformName(downloadEntity.getPlatform());
|
||||
String platform = PlatformUtils.getInstance(context)
|
||||
.getPlatformName(downloadEntity.getPlatform());
|
||||
|
||||
DownloadStatus status = downloadEntity.getStatus();
|
||||
if (status.equals(DownloadStatus.downloading)) {
|
||||
@ -246,7 +239,7 @@ public class DownloadItemUtils {
|
||||
if (isNormal) {
|
||||
holder.gameDownloadBtn.setText("下载中");
|
||||
holder.gameDownloadBtn.setBackgroundResource(R.drawable.game_item_btn_downloading_style);
|
||||
holder.gameDownloadBtn.setTextColor(ContextCompat.getColorStateList(context, R.color.text_downloading_style));
|
||||
holder.gameDownloadBtn.setTextColor(context.getResources().getColorStateList(R.color.text_downloading_style));
|
||||
}
|
||||
} else if (status.equals(DownloadStatus.waiting)) {
|
||||
holder.gameProgressbar.setProgress((int) (downloadEntity.getPercent() * 10));
|
||||
@ -260,7 +253,7 @@ public class DownloadItemUtils {
|
||||
if (isNormal) {
|
||||
holder.gameDownloadBtn.setText("下载中");
|
||||
holder.gameDownloadBtn.setBackgroundResource(R.drawable.game_item_btn_downloading_style);
|
||||
holder.gameDownloadBtn.setTextColor(ContextCompat.getColorStateList(context, R.color.text_downloading_style));
|
||||
holder.gameDownloadBtn.setTextColor(context.getResources().getColorStateList(R.color.text_downloading_style));
|
||||
}
|
||||
} else if (status.equals(DownloadStatus.pause)
|
||||
|| status.equals(DownloadStatus.timeout)
|
||||
@ -276,7 +269,7 @@ public class DownloadItemUtils {
|
||||
if (isNormal) {
|
||||
holder.gameDownloadBtn.setText("下载中");
|
||||
holder.gameDownloadBtn.setBackgroundResource(R.drawable.game_item_btn_downloading_style);
|
||||
holder.gameDownloadBtn.setTextColor(ContextCompat.getColorStateList(context, R.color.text_downloading_style));
|
||||
holder.gameDownloadBtn.setTextColor(context.getResources().getColorStateList(R.color.text_downloading_style));
|
||||
}
|
||||
} else if (status.equals(DownloadStatus.done)) {
|
||||
holder.gameProgressbar.setProgress(1000);
|
||||
@ -335,55 +328,48 @@ public class DownloadItemUtils {
|
||||
final String location) {
|
||||
|
||||
String str = downloadBtn.getText().toString();
|
||||
switch (str) {
|
||||
case "下载":
|
||||
if (NetworkUtils.isWifiConnected(context)) {
|
||||
download(context, gameEntity, downloadBtn, entrance, location);
|
||||
} else {
|
||||
DialogUtils.showDownloadDialog(context, new DialogUtils.ConfirmListener() {
|
||||
@Override
|
||||
public void onConfirm() {
|
||||
download(context, gameEntity, downloadBtn, entrance, location);
|
||||
}
|
||||
});
|
||||
}
|
||||
break;
|
||||
case "插件化":
|
||||
if (NetworkUtils.isWifiConnected(context)) {
|
||||
plugin(context, gameEntity, downloadBtn, entrance, location);
|
||||
} else {
|
||||
DialogUtils.showDownloadDialog(context, new DialogUtils.ConfirmListener() {
|
||||
@Override
|
||||
public void onConfirm() {
|
||||
plugin(context, gameEntity, downloadBtn, entrance, location);
|
||||
}
|
||||
});
|
||||
}
|
||||
break;
|
||||
case "安装":
|
||||
install(context, gameEntity, position, adapter);
|
||||
break;
|
||||
case "启动":
|
||||
DataUtils.onGameLaunchEvent(context, gameEntity.getName(), gameEntity.getApk().get(0).getPlatform(), location);
|
||||
if ("下载".equals(str)) {
|
||||
if (NetworkUtils.isWifiConnected(context)) {
|
||||
download(context, gameEntity, downloadBtn, entrance, location);
|
||||
} else {
|
||||
DialogUtils.showDownloadDialog(context, new DialogUtils.ConfirmListener() {
|
||||
@Override
|
||||
public void onConfirm() {
|
||||
download(context, gameEntity, downloadBtn, entrance, location);
|
||||
}
|
||||
});
|
||||
}
|
||||
} else if ("插件化".equals(str)) {
|
||||
if (NetworkUtils.isWifiConnected(context)) {
|
||||
plugin(context, gameEntity, downloadBtn, entrance, location);
|
||||
} else {
|
||||
DialogUtils.showDownloadDialog(context, new DialogUtils.ConfirmListener() {
|
||||
@Override
|
||||
public void onConfirm() {
|
||||
plugin(context, gameEntity, downloadBtn, entrance, location);
|
||||
}
|
||||
});
|
||||
}
|
||||
} else if ("安装".equals(str)) {
|
||||
install(context, gameEntity, position, adapter);
|
||||
} else if ("启动".equals(str)) {
|
||||
DataUtils.onGameLaunchEvent(context, gameEntity.getName(), gameEntity.getApk().get(0).getPlatform(), location);
|
||||
|
||||
PackageUtils.launchApplicationByPackageName(context, gameEntity.getApk().get(0).getPackageName());
|
||||
break;
|
||||
case "下载中":
|
||||
context.startActivity(
|
||||
DownloadManagerActivity.getDownloadMangerIntent(context, gameEntity.getApk().get(0).getUrl(), entrance + "+(" + location.split(":")[0] + ")"));
|
||||
break;
|
||||
case "更新":
|
||||
if (NetworkUtils.isWifiConnected(context)) {
|
||||
update(context, gameEntity, entrance, location);
|
||||
} else {
|
||||
DialogUtils.showDownloadDialog(context, new DialogUtils.ConfirmListener() {
|
||||
@Override
|
||||
public void onConfirm() {
|
||||
update(context, gameEntity, entrance, location);
|
||||
}
|
||||
});
|
||||
}
|
||||
break;
|
||||
PackageUtils.launchApplicationByPackageName(context, gameEntity.getApk().get(0).getPackageName());
|
||||
} else if ("下载中".equals(str)) {
|
||||
context.startActivity(
|
||||
DownloadManagerActivity.getDownloadMangerIntent(context, gameEntity.getApk().get(0).getUrl(), entrance + "+(" + location.split(":")[0] + ")"));
|
||||
} else if ("更新".equals(str)) {
|
||||
if (NetworkUtils.isWifiConnected(context)) {
|
||||
update(context, gameEntity, entrance, location);
|
||||
} else {
|
||||
DialogUtils.showDownloadDialog(context, new DialogUtils.ConfirmListener() {
|
||||
@Override
|
||||
public void onConfirm() {
|
||||
update(context, gameEntity, entrance, location);
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -402,16 +388,19 @@ public class DownloadItemUtils {
|
||||
|
||||
downloadBtn.setText("下载中");
|
||||
downloadBtn.setBackgroundResource(R.drawable.game_item_btn_downloading_style);
|
||||
downloadBtn.setTextColor(ContextCompat.getColorStateList(context, R.color.text_downloading_style));
|
||||
downloadBtn.setTextColor(context.getResources().getColorStateList(R.color.text_downloading_style));
|
||||
|
||||
// DownloadManager.getInstance(context).putStatus(gameEntity.getApk().get(0).getUrl(), "downloading");
|
||||
DownloadManager.getInstance(context).putStatus(gameEntity.getApk().get(0).getUrl(), "downloading");
|
||||
} else {
|
||||
Toast.makeText(context, msg, Toast.LENGTH_SHORT).show();
|
||||
}
|
||||
}
|
||||
|
||||
//插件化
|
||||
private static void plugin(Context context, GameEntity gameEntity, TextView downloadBtn, String entrance,
|
||||
private static void plugin(Context context,
|
||||
GameEntity gameEntity,
|
||||
TextView downloadBtn,
|
||||
String entrance,
|
||||
String location) {
|
||||
String msg = FileUtils.isCanDownload(context, gameEntity.getApk().get(0).getSize());
|
||||
if (TextUtils.isEmpty(msg)) {
|
||||
@ -422,26 +411,27 @@ public class DownloadItemUtils {
|
||||
|
||||
downloadBtn.setText("下载中");
|
||||
downloadBtn.setBackgroundResource(R.drawable.game_item_btn_downloading_style);
|
||||
downloadBtn.setTextColor(ContextCompat.getColorStateList(context, R.color.text_downloading_style));
|
||||
downloadBtn.setTextColor(context.getResources().getColorStateList(R.color.text_downloading_style));
|
||||
|
||||
// DownloadManager.getInstance(context).putStatus(gameEntity.getApk().get(0).getUrl(), "downloading");
|
||||
DownloadManager.getInstance(context).putStatus(gameEntity.getApk().get(0).getUrl(), "downloading");
|
||||
} else {
|
||||
Toast.makeText(context, msg, Toast.LENGTH_SHORT).show();
|
||||
}
|
||||
}
|
||||
|
||||
//安装
|
||||
private static void install(final Context context, GameEntity gameEntity, int position,
|
||||
private static void install(final Context context,
|
||||
GameEntity gameEntity,
|
||||
int position,
|
||||
RecyclerView.Adapter<? extends RecyclerView.ViewHolder> adapter) {
|
||||
ApkEntity apkEntity = gameEntity.getApk().get(0);
|
||||
DownloadEntity downloadEntity = DownloadManager.getInstance(context).getDownloadEntityByUrl(apkEntity.getUrl());
|
||||
DownloadEntity downloadEntity = DownloadManager.getInstance(context).get(gameEntity.getApk().get(0).getUrl());
|
||||
if (downloadEntity != null) {
|
||||
final String path = downloadEntity.getPath();
|
||||
if (FileUtils.isEmptyFile(path)) {
|
||||
Toast.makeText(context, "解析包出错(可能被误删了),请重新下载", Toast.LENGTH_SHORT).show();
|
||||
DownloadManager.getInstance(context).cancel(downloadEntity.getUrl());
|
||||
if (gameEntity.getEntryMap() != null) {
|
||||
gameEntity.getEntryMap().remove(apkEntity.getPlatform());
|
||||
gameEntity.getEntryMap().remove(gameEntity.getApk().get(0).getPlatform());
|
||||
}
|
||||
adapter.notifyItemChanged(position);
|
||||
} else {
|
||||
@ -451,7 +441,10 @@ public class DownloadItemUtils {
|
||||
}
|
||||
|
||||
//更新
|
||||
private static void update(Context context, GameEntity gameEntity, String entrance, String location) {
|
||||
private static void update(Context context,
|
||||
GameEntity gameEntity,
|
||||
String entrance,
|
||||
String location) {
|
||||
DataUtils.onGameUpdateEvent(context, gameEntity.getName(), gameEntity.getApk().get(0).getPlatform(), "下载开始");
|
||||
DownloadManager.createDownload(context, gameEntity, "更新", entrance, location);
|
||||
}
|
||||
|
||||
383
app/src/main/java/com/gh/common/util/FileUtils.java
Normal file
383
app/src/main/java/com/gh/common/util/FileUtils.java
Normal file
@ -0,0 +1,383 @@
|
||||
package com.gh.common.util;
|
||||
|
||||
import android.content.Context;
|
||||
import android.os.Environment;
|
||||
import android.os.StatFs;
|
||||
import android.os.StrictMode;
|
||||
|
||||
import org.json.JSONObject;
|
||||
|
||||
import java.io.ByteArrayInputStream;
|
||||
import java.io.ByteArrayOutputStream;
|
||||
import java.io.DataInputStream;
|
||||
import java.io.DataOutputStream;
|
||||
import java.io.File;
|
||||
import java.io.FileInputStream;
|
||||
import java.io.FileOutputStream;
|
||||
import java.io.IOException;
|
||||
import java.io.InputStream;
|
||||
import java.net.HttpURLConnection;
|
||||
import java.net.URL;
|
||||
import java.util.UUID;
|
||||
|
||||
/**
|
||||
* @author guanchao wen
|
||||
* @email shuwoom.wgc@gmail.com
|
||||
* @modify hzh 2016/03/16
|
||||
* @update 2015-7-29下午2:26:02
|
||||
*/
|
||||
public class FileUtils {
|
||||
|
||||
private final static String TEST_FILE_NAME = System.currentTimeMillis() + ".log";
|
||||
|
||||
public static String getDownloadPath(Context context, String name) {
|
||||
return getDownloadDir(context) + File.separator + name;
|
||||
}
|
||||
|
||||
public static String getDownloadDir(Context context) {
|
||||
String dir = null;
|
||||
if (isMounted()) {
|
||||
String baseDir = Environment.getExternalStorageDirectory().getAbsolutePath();
|
||||
dir = checkDir(baseDir + File.separator + "gh-download");
|
||||
File file = new File(dir + File.separator + TEST_FILE_NAME);
|
||||
if (!file.exists()) {
|
||||
try {
|
||||
if (!file.createNewFile()) {
|
||||
// cannot create file
|
||||
Utils.log("cannot create file");
|
||||
dir = null;
|
||||
}
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
// cannot create file
|
||||
Utils.log("cannot create file");
|
||||
dir = null;
|
||||
}
|
||||
}
|
||||
}
|
||||
if (dir == null) {
|
||||
String baseDir = context.getFilesDir().getAbsolutePath();
|
||||
dir = checkDir(baseDir + File.separator + "gh-download");
|
||||
try {
|
||||
Runtime.getRuntime().exec("chmod 755 " + dir);
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
return dir;
|
||||
}
|
||||
|
||||
public static boolean isMounted() {
|
||||
return Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED);
|
||||
}
|
||||
|
||||
private static String checkDir(String dir) {
|
||||
File directory = new File(dir);
|
||||
if (directory.exists() && !directory.isDirectory()) {
|
||||
directory.delete();
|
||||
}
|
||||
if (!directory.exists()) {
|
||||
directory.mkdirs();
|
||||
}
|
||||
return dir;
|
||||
}
|
||||
|
||||
public static String getLogPath(Context context, String name) {
|
||||
return checkDir(getDir(context, "log")) + File.separator + name;
|
||||
}
|
||||
|
||||
public static String getDir(Context context, String dir) {
|
||||
if (isMounted()) {
|
||||
// /storage/emulated/0/Android/data/包名/files
|
||||
File file = context.getExternalFilesDir(null);
|
||||
if (file != null) {
|
||||
return file.getAbsolutePath() + File.separator + dir;
|
||||
}
|
||||
}
|
||||
// /data/data/包名/files
|
||||
return context.getFilesDir().getAbsolutePath() + File.separator + dir;
|
||||
}
|
||||
|
||||
public static String getPlatformPicDir(Context context) {
|
||||
return checkDir(getDir(context, "PlatformPic"));
|
||||
}
|
||||
|
||||
public static void deleteFile(String savePath) {
|
||||
File file = new File(savePath);
|
||||
if (file.exists()) {
|
||||
file.delete();
|
||||
}
|
||||
}
|
||||
|
||||
public static void deleteFolder(File folder) {
|
||||
if (folder != null) {
|
||||
if (folder.isDirectory()) {
|
||||
for (File file : folder.listFiles()) {
|
||||
if (file.isDirectory()) {
|
||||
deleteFolder(file);
|
||||
} else {
|
||||
file.delete();
|
||||
}
|
||||
}
|
||||
}
|
||||
folder.delete();
|
||||
}
|
||||
}
|
||||
|
||||
public static boolean isEmptyFile(String path) {
|
||||
File file = new File(path);
|
||||
return !(file.exists() && file.length() != 0);
|
||||
}
|
||||
|
||||
public static String isCanDownload(Context context, String size) {
|
||||
String msg = null;
|
||||
String packageSizeStr = "";
|
||||
for (int i = 0; i < size.length(); i++) {
|
||||
if ((size.charAt(i) >= 48 && size.charAt(i) <= 57) || size.charAt(i) == 46) {
|
||||
packageSizeStr += size.charAt(i);
|
||||
}
|
||||
}
|
||||
float packageSize = 0;
|
||||
if (packageSizeStr.length() != 0) {
|
||||
packageSize = Float.valueOf(packageSizeStr);
|
||||
}
|
||||
float freeSpace = getFreeSpaceByPath(getDownloadDir(context));
|
||||
if (freeSpace < packageSize) {
|
||||
msg = "手机存储空间不足,无法进行下载!";
|
||||
}
|
||||
return msg;
|
||||
}
|
||||
|
||||
// 返回剩余空间 单位MB
|
||||
@SuppressWarnings("deprecation")
|
||||
public static float getFreeSpaceByPath(String path) {
|
||||
StatFs statfs = new StatFs(path);
|
||||
long blockSize = statfs.getBlockSize();
|
||||
long availableBlocks = statfs.getAvailableBlocks();
|
||||
|
||||
return availableBlocks * blockSize / 1024f / 1024f;
|
||||
}
|
||||
|
||||
// 下载文件
|
||||
public static int downloadFile(String url, String savePath) {
|
||||
DataInputStream dis = null;
|
||||
FileOutputStream fos = null;
|
||||
try {
|
||||
HttpURLConnection connection = (HttpURLConnection) new URL(url).openConnection();
|
||||
connection.setRequestMethod("GET");
|
||||
connection.setConnectTimeout(5 * 1000);
|
||||
connection.setReadTimeout(5 * 1000);
|
||||
connection.connect();
|
||||
int code = connection.getResponseCode();
|
||||
if (code == 200) {
|
||||
dis = new DataInputStream(connection.getInputStream());
|
||||
File file = new File(savePath);
|
||||
if (file.exists()) {
|
||||
file.delete();
|
||||
}
|
||||
file.createNewFile();
|
||||
fos = new FileOutputStream(file);
|
||||
byte[] buffer = new byte[1024];
|
||||
int len;
|
||||
while ((len = dis.read(buffer)) != -1) {
|
||||
fos.write(buffer, 0, len);
|
||||
}
|
||||
fos.flush();
|
||||
}
|
||||
return code;
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
} finally {
|
||||
if (fos != null) {
|
||||
try {
|
||||
fos.close();
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
if (dis != null) {
|
||||
try {
|
||||
dis.close();
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
|
||||
// 上传文件
|
||||
public static JSONObject uploadFile(String url, String filePath, String token) {
|
||||
String end = "\r\n";
|
||||
String twoHyphens = "--";
|
||||
String boundary = UUID.randomUUID().toString().replaceAll("-", "").substring(0, 16);
|
||||
try {
|
||||
HttpURLConnection connection = (HttpURLConnection) new URL(url).openConnection();
|
||||
/*
|
||||
* Output to the connection. Default is false, set to true because
|
||||
* post method must write something to the connection
|
||||
*/
|
||||
connection.setDoOutput(true);
|
||||
// Read from the connection. Default is true.
|
||||
connection.setDoInput(true);
|
||||
// Post cannot use caches
|
||||
connection.setUseCaches(false);
|
||||
// Set the post method. Default is GET
|
||||
connection.setRequestMethod("POST");
|
||||
connection.setConnectTimeout(5 * 1000);
|
||||
connection.setReadTimeout(5 * 1000);
|
||||
// 设置请求属性
|
||||
connection.setRequestProperty("Connection", "Keep-Alive");
|
||||
connection.setRequestProperty("Charset", "UTF-8");
|
||||
connection.setRequestProperty("Content-Type", "multipart/form-data;boundary=" + boundary);
|
||||
if (token != null) {
|
||||
connection.setRequestProperty("TOKEN", token);
|
||||
}
|
||||
// 设置StrictMode 否则HTTPURLConnection连接失败,因为这是在主进程中进行网络连接
|
||||
StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder()
|
||||
.detectDiskReads().detectDiskWrites().detectNetwork()
|
||||
.penaltyLog().build());
|
||||
File file = new File(filePath);
|
||||
if (file.exists()) {
|
||||
Utils.log("name = " + file.getName());
|
||||
Utils.log("length = " + file.length());
|
||||
}
|
||||
// 设置DataOutputStream,getOutputStream中默认调用connect()
|
||||
DataOutputStream dos = new DataOutputStream(connection.getOutputStream()); // output
|
||||
// to the connection
|
||||
dos.writeBytes(twoHyphens + boundary + end);
|
||||
dos.writeBytes("Content-Disposition: form-data; "
|
||||
+ "name=\"Filedata\";filename=\"" + file.getName() + "\"" + end);
|
||||
dos.writeBytes(end);
|
||||
// 取得文件的FileInputStream
|
||||
FileInputStream fStream = new FileInputStream(file);
|
||||
// 设置每次写入8192bytes
|
||||
int bufferSize = 8192;
|
||||
byte[] buffer = new byte[bufferSize]; // 8k
|
||||
int length;
|
||||
// 从文件读取数据至缓冲区
|
||||
while ((length = fStream.read(buffer)) != -1) {
|
||||
// 将资料写入DataOutputStream中
|
||||
dos.write(buffer, 0, length);
|
||||
}
|
||||
dos.writeBytes(end);
|
||||
dos.writeBytes(twoHyphens + boundary + twoHyphens + end);
|
||||
// 关闭流,写入的东西自动生成Http正文
|
||||
fStream.close();
|
||||
// 关闭DataOutputStream
|
||||
dos.flush();
|
||||
dos.close();
|
||||
|
||||
InputStream inputStream;
|
||||
try {
|
||||
inputStream = connection.getInputStream();
|
||||
} catch (IOException ioe) {
|
||||
inputStream = connection.getErrorStream();
|
||||
}
|
||||
int ch;
|
||||
StringBuffer b = new StringBuffer();
|
||||
while ((ch = inputStream.read()) != -1) {
|
||||
b.append((char) ch);
|
||||
}
|
||||
// 显示网页响应内容
|
||||
Utils.log("content = " + b.toString().trim());
|
||||
|
||||
int statusCode = connection.getResponseCode();
|
||||
Utils.log("statusCode = " + statusCode);
|
||||
if (statusCode == 200) {
|
||||
// {"icon":"http:\/\/gh-test-1.oss-cn-qingdao.aliyuncs.com\/pic\/57e4f4d58a3200042d29492f.jpg"}
|
||||
JSONObject response = new JSONObject(b.toString().trim());
|
||||
response.put("statusCode", 200);
|
||||
return response;
|
||||
} else if (statusCode == 403) {
|
||||
JSONObject response = new JSONObject(b.toString().trim());
|
||||
response.put("statusCode", 403);
|
||||
return response;
|
||||
} else if (statusCode == 401) {
|
||||
JSONObject response = new JSONObject();
|
||||
response.put("statusCode", 401);
|
||||
return response;
|
||||
}
|
||||
} catch (Exception e) {
|
||||
// 显示异常信息
|
||||
e.printStackTrace();
|
||||
Utils.log("Fail:" + e);
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
// 读取文件,返回byte[]
|
||||
public static byte[] readFile(File file) {
|
||||
if (file == null) {
|
||||
return null;
|
||||
}
|
||||
FileInputStream fis = null;
|
||||
ByteArrayOutputStream bos = null;
|
||||
try {
|
||||
fis = new FileInputStream(file);
|
||||
bos = new ByteArrayOutputStream();
|
||||
byte[] buffer = new byte[2048];
|
||||
int len;
|
||||
while ((len = fis.read(buffer)) != -1) {
|
||||
bos.write(buffer, 0, len);
|
||||
}
|
||||
bos.flush();
|
||||
return bos.toByteArray();
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
} finally {
|
||||
if (fis != null) {
|
||||
try {
|
||||
fis.close();
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
if (bos != null) {
|
||||
try {
|
||||
bos.close();
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
// 根据byte[],保存文件
|
||||
public static void saveFile(File file, byte[] data) {
|
||||
if (file == null || data == null) {
|
||||
return;
|
||||
}
|
||||
ByteArrayInputStream bis = null;
|
||||
FileOutputStream fos = null;
|
||||
try {
|
||||
bis = new ByteArrayInputStream(data);
|
||||
fos = new FileOutputStream(file);
|
||||
byte[] buffer = new byte[2048];
|
||||
int len;
|
||||
while ((len = bis.read(buffer)) != -1) {
|
||||
fos.write(buffer, 0, len);
|
||||
}
|
||||
fos.flush();
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
} finally {
|
||||
if (bis != null) {
|
||||
try {
|
||||
bis.close();
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
if (fos != null) {
|
||||
try {
|
||||
fos.close();
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
@ -2,17 +2,16 @@ package com.gh.common.util;
|
||||
|
||||
import android.content.Context;
|
||||
import android.graphics.Color;
|
||||
import android.text.TextUtils;
|
||||
import android.widget.TextView;
|
||||
|
||||
import com.gh.download.DownloadEntity;
|
||||
import com.gh.download.DownloadManager;
|
||||
import com.gh.download.DownloadStatus;
|
||||
import com.gh.gamecenter.R;
|
||||
import com.gh.gamecenter.entity.ApkEntity;
|
||||
import com.gh.gamecenter.entity.GameEntity;
|
||||
import com.gh.gamecenter.entity.GameUpdateEntity;
|
||||
import com.gh.gamecenter.manager.PackageManager;
|
||||
import com.lightgame.download.DownloadEntity;
|
||||
import com.lightgame.download.DownloadStatus;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
@ -68,7 +67,7 @@ public class GameUtils {
|
||||
DownloadEntity downloadEntity;
|
||||
Object gh_id;
|
||||
for (ApkEntity apkEntity : gameEntity.getApk()) {
|
||||
downloadEntity = DownloadManager.getInstance(context).getDownloadEntityByUrl(apkEntity.getUrl());
|
||||
downloadEntity = DownloadManager.getInstance(context).get(apkEntity.getUrl());
|
||||
if (downloadEntity != null) {
|
||||
if (downloadEntity.getStatus().equals(DownloadStatus.done)) {
|
||||
doneCount++;
|
||||
@ -83,9 +82,7 @@ public class GameUtils {
|
||||
}
|
||||
if (PackageManager.isInstalled(apkEntity.getPackageName())) {
|
||||
gh_id = PackageUtils.getMetaData(context, apkEntity.getPackageName(), "gh_id");
|
||||
if (gameEntity.getTag() != null && gameEntity.getTag().size() != 0
|
||||
&& !TextUtils.isEmpty(apkEntity.getGhVersion())
|
||||
&& !PackageUtils.isSignature(context, apkEntity.getPackageName())) {
|
||||
if (!PackageUtils.isSignature(context, apkEntity.getPackageName())) { // TODO 外层判断插件化逻辑与多平台弹窗不一致
|
||||
pluginCount++;
|
||||
} else if (gh_id == null || gh_id.equals(gameEntity.getId())) {
|
||||
installCount++;
|
||||
|
||||
@ -1,291 +0,0 @@
|
||||
package com.gh.common.util;
|
||||
|
||||
import android.app.Activity;
|
||||
import android.content.Context;
|
||||
import android.content.Intent;
|
||||
import android.widget.Toast;
|
||||
|
||||
import com.gh.common.constant.Config;
|
||||
import com.lightgame.utils.RuntimeUtils;
|
||||
import com.lightgame.utils.Utils;
|
||||
import com.sina.weibo.sdk.WbSdk;
|
||||
import com.sina.weibo.sdk.auth.AuthInfo;
|
||||
import com.sina.weibo.sdk.auth.Oauth2AccessToken;
|
||||
import com.sina.weibo.sdk.auth.WbAuthListener;
|
||||
import com.sina.weibo.sdk.auth.WbConnectErrorMessage;
|
||||
import com.sina.weibo.sdk.auth.sso.SsoHandler;
|
||||
import com.tencent.mm.sdk.openapi.IWXAPI;
|
||||
import com.tencent.mm.sdk.openapi.SendAuth;
|
||||
import com.tencent.mm.sdk.openapi.WXAPIFactory;
|
||||
import com.tencent.tauth.IUiListener;
|
||||
import com.tencent.tauth.Tencent;
|
||||
import com.tencent.tauth.UiError;
|
||||
|
||||
import org.json.JSONException;
|
||||
import org.json.JSONObject;
|
||||
|
||||
import java.io.ByteArrayOutputStream;
|
||||
import java.io.InputStream;
|
||||
import java.net.HttpURLConnection;
|
||||
import java.net.URL;
|
||||
import java.text.SimpleDateFormat;
|
||||
|
||||
/**
|
||||
* Created by khy on 14/06/17.
|
||||
* <p>
|
||||
* 获取第三方登录数据
|
||||
*/
|
||||
|
||||
public class GetLoginDataUtils {
|
||||
|
||||
private static GetLoginDataUtils instance;
|
||||
|
||||
private Context mContext;
|
||||
private OnLoginDataListener mLoginListener; //登录成功回调
|
||||
|
||||
private Tencent mTencent;
|
||||
private IWXAPI mIWXAPI;
|
||||
private SsoHandler mSsoHandler;
|
||||
|
||||
private Oauth2AccessToken mAccessToken; // weibo
|
||||
public static final String SCOPE =
|
||||
"email,direct_messages_read,direct_messages_write,"
|
||||
+ "friendships_groups_read,friendships_groups_write,statuses_to_me_read,"
|
||||
+ "follow_app_official_microblog," + "invitation_write"; // weiboCode
|
||||
|
||||
private GetLoginDataUtils(Context context) {
|
||||
mContext = context.getApplicationContext();
|
||||
mTencent = Tencent.createInstance(Config.TENCENT_APPID, mContext); //初始化QQ分享
|
||||
|
||||
mIWXAPI = WXAPIFactory.createWXAPI(mContext, Config.WECHAT_APPID, true); //初始化微信分享
|
||||
|
||||
WbSdk.install(context, new AuthInfo(mContext, Config.WEIBO_APPKEY, "http://www.sina.com", SCOPE));
|
||||
|
||||
Utils.log(GetLoginDataUtils.class.getSimpleName(), "initLogin");
|
||||
}
|
||||
|
||||
public static GetLoginDataUtils getInstance(Context context) {
|
||||
if (instance == null) {
|
||||
instance = new GetLoginDataUtils(context);
|
||||
}
|
||||
return instance;
|
||||
}
|
||||
|
||||
//QQ登录回调处理
|
||||
public IUiListener QqLoginListener = new IUiListener() {
|
||||
@Override
|
||||
public void onComplete(Object o) {
|
||||
Toast.makeText(mContext, "登录成功", Toast.LENGTH_SHORT).show();
|
||||
Utils.log(GetLoginDataUtils.class.getSimpleName(), "QQ 登录成功");
|
||||
if (o instanceof JSONObject) {
|
||||
JSONObject jsonObject = (JSONObject) o;
|
||||
String s = jsonObject.toString();
|
||||
Utils.log(GetLoginDataUtils.class.getSimpleName(), "QQLoginComplete::" + s);
|
||||
try {
|
||||
mTencent.setOpenId(jsonObject.getString("openid"));
|
||||
mTencent.setAccessToken(jsonObject.getString("access_token"), jsonObject.getString("expires_in"));
|
||||
|
||||
JSONObject content = new JSONObject();
|
||||
content.put("openid", jsonObject.getString("openid"));
|
||||
content.put("access_token_expire", Utils.getTime(mContext) + jsonObject.getLong("expires_in"));
|
||||
content.put("access_token", jsonObject.getString("access_token"));
|
||||
if (mLoginListener != null) {
|
||||
mLoginListener.OnLoginData(jsonObject, LoginUtils.LoginTag.qq);// QQ 登录回调
|
||||
}
|
||||
|
||||
} catch (JSONException e) {
|
||||
Utils.log(GetLoginDataUtils.class.getSimpleName(), "QQ登录数据回调异常::" + e.toString());
|
||||
e.printStackTrace();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
// QQToken qqToken = mTencent.getQQToken();
|
||||
// UserInfo userInfo = new UserInfo(mContext, qqToken);
|
||||
// userInfo.getUserInfo(new IUiListener() { // 获取QQ用户信息
|
||||
// @Override
|
||||
// public void onComplete(Object o) {
|
||||
// Utils.log(GetLoginDataUtils.class.getSimpleName(), "QQUserInfo::" + o.toString());
|
||||
// }
|
||||
//
|
||||
// @Override
|
||||
// public void onError(UiError uiError) {
|
||||
// Utils.log(GetLoginDataUtils.class.getSimpleName(), "QQUserInfoUiError::" + uiError.errorDetail + "==" + uiError.errorMessage + "==" + uiError.errorCode);
|
||||
// }
|
||||
//
|
||||
// @Override
|
||||
// public void onCancel() {
|
||||
// Utils.log(GetLoginDataUtils.class.getSimpleName(), "QQUserInfoonCancel");
|
||||
// }
|
||||
// });
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onError(UiError uiError) {
|
||||
Toast.makeText(mContext, "登录失败", Toast.LENGTH_SHORT).show();
|
||||
Utils.log(GetLoginDataUtils.class.getSimpleName(), "QQ 登录失败");
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onCancel() {
|
||||
Toast.makeText(mContext, "登录取消", Toast.LENGTH_SHORT).show();
|
||||
Utils.log(GetLoginDataUtils.class.getSimpleName(), "QQ 登录取消");
|
||||
}
|
||||
};
|
||||
|
||||
public void onQQCallback(int requestCode, int resultCode, Intent data) {
|
||||
Tencent.onActivityResultData(requestCode, resultCode, data, QqLoginListener);
|
||||
}
|
||||
|
||||
// QQ登录
|
||||
public void QQLogin(OnLoginDataListener listener, Activity activity) {
|
||||
mLoginListener = listener;
|
||||
if (mTencent != null && !mTencent.isSessionValid()) {
|
||||
Utils.log(GetLoginDataUtils.class.getSimpleName(), "QQLogin");
|
||||
mTencent.login(activity, "all", QqLoginListener);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// 微信登录
|
||||
public void WCLogin(OnLoginDataListener listener) {
|
||||
mLoginListener = listener;
|
||||
if (mIWXAPI != null) {
|
||||
boolean register = mIWXAPI.registerApp(Config.WECHAT_APPID);
|
||||
|
||||
SendAuth.Req req = new SendAuth.Req();
|
||||
req.scope = "snsapi_userinfo";
|
||||
req.state = "光环助手";
|
||||
boolean b = mIWXAPI.sendReq(req);
|
||||
Utils.log(GetLoginDataUtils.class.getSimpleName(), "微信注册状态::" + register + "\n 发送状态::" + b);
|
||||
}
|
||||
}
|
||||
|
||||
public void WCLofinCallBack(JSONObject content) {
|
||||
mLoginListener.OnLoginData(content, LoginUtils.LoginTag.wechat);
|
||||
}
|
||||
|
||||
public void onWeiboCallback(int requestCode, int resultCode, Intent data) {
|
||||
if (mSsoHandler != null) {
|
||||
mSsoHandler.authorizeCallBack(requestCode, resultCode, data);
|
||||
}
|
||||
}
|
||||
// 微博登录
|
||||
public void WeiBoLogin(OnLoginDataListener listener, Activity context) {
|
||||
mSsoHandler = new SsoHandler(context);
|
||||
mLoginListener = listener;
|
||||
mSsoHandler.authorizeClientSso(new SelfWbAuthListener());
|
||||
// 第一次启动本应用,AccessToken 不可用
|
||||
mAccessToken = AccessTokenKeeper.readAccessToken(mContext);
|
||||
|
||||
// if (mAccessToken.isSessionValid()) {
|
||||
// updateTokenView(true);
|
||||
// }
|
||||
}
|
||||
|
||||
// 微博登录回调处理
|
||||
private class SelfWbAuthListener implements WbAuthListener {
|
||||
|
||||
@Override
|
||||
public void onSuccess(final Oauth2AccessToken token) {
|
||||
RuntimeUtils.getInstance().runOnUiThread(new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
mAccessToken = token;
|
||||
if (mAccessToken.isSessionValid()) {
|
||||
// 显示 Token
|
||||
// updateTokenView(false);
|
||||
// 保存 Token 到 SharedPreferences
|
||||
AccessTokenKeeper.writeAccessToken(mContext, mAccessToken);
|
||||
Toast.makeText(mContext, "授权成功", Toast.LENGTH_SHORT).show();
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
JSONObject content = new JSONObject();
|
||||
try {
|
||||
content.put("uid", token.getUid());
|
||||
content.put("access_token", token.getToken());
|
||||
content.put("access_token_expire", Utils.getTime(mContext) + token.getExpiresTime());
|
||||
content.put("refresh_token", token.getRefreshToken());
|
||||
// content.put("refresh_token_expire", ""); // TODO refresh_token 好像没有有效期
|
||||
if (mLoginListener != null) {
|
||||
mLoginListener.OnLoginData(content, LoginUtils.LoginTag.qq);// QQ 登录回调
|
||||
}
|
||||
} catch (JSONException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
|
||||
// AppController.MAIN_EXECUTOR.execute(new Runnable() {
|
||||
// @Override
|
||||
// public void run() {
|
||||
// getWeiBoUserInfo(token.getToken(), token.getUid());
|
||||
// }
|
||||
// });
|
||||
}
|
||||
|
||||
@Override
|
||||
public void cancel() {
|
||||
Toast.makeText(mContext, "取消授权", Toast.LENGTH_LONG).show();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onFailure(WbConnectErrorMessage errorMessage) {
|
||||
Toast.makeText(mContext, errorMessage.getErrorMessage(), Toast.LENGTH_LONG).show();
|
||||
}
|
||||
}
|
||||
|
||||
//微博 获取用户信息
|
||||
private void getWeiBoUserInfo(String accessToken, String uid) {
|
||||
String path = "https://api.weibo.com/2/users/show.json?access_token=" + accessToken + "&uid=" + uid;
|
||||
Utils.log(GetLoginDataUtils.class.getSimpleName(), "getWeiBoUserInfo-url::" + path);
|
||||
|
||||
try {
|
||||
URL url = new URL(path);
|
||||
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
|
||||
conn.setConnectTimeout(5000);
|
||||
conn.setRequestMethod("GET");
|
||||
conn.setDoInput(true);
|
||||
int code = conn.getResponseCode();
|
||||
ByteArrayOutputStream baos = new ByteArrayOutputStream();
|
||||
byte[] buffer = new byte[1024];
|
||||
int len;
|
||||
Utils.log(GetLoginDataUtils.class.getSimpleName(), "getWeiBoUserInfo-RequestCode::" + code);
|
||||
if (code == 200) {
|
||||
InputStream is = conn.getInputStream();
|
||||
while ((len = is.read(buffer)) != -1) {
|
||||
baos.write(buffer, 0, len);
|
||||
}
|
||||
String str = new String(baos.toByteArray());
|
||||
Utils.log(GetLoginDataUtils.class.getSimpleName(), "getWeiBoUserInfo-Body::" + str);
|
||||
}
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 微博显示当前 Token 信息。
|
||||
*
|
||||
* @param hasExisted 配置文件中是否已存在 token 信息并且合法
|
||||
*/
|
||||
private void updateTokenView(boolean hasExisted) {
|
||||
String date = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss").format(
|
||||
new java.util.Date(mAccessToken.getExpiresTime()));
|
||||
String format = "Token:%1$s \\n有效期:%2$s";
|
||||
String token = String.format(format, mAccessToken.getToken(), date);
|
||||
Utils.log(GetLoginDataUtils.class.getSimpleName(), "::WB_TOKEN::" + token);
|
||||
String message = String.format(format, mAccessToken.getToken(), date);
|
||||
if (hasExisted) {
|
||||
message = "Token 仍在有效期内,无需再次登录。" + "\n" + message;
|
||||
}
|
||||
Utils.log(GetLoginDataUtils.class.getSimpleName(), "::WB_MESSAGE::" + message);
|
||||
}
|
||||
|
||||
// 登录成功回调
|
||||
public interface OnLoginDataListener {
|
||||
void OnLoginData(JSONObject content, LoginUtils.LoginTag loginTag);
|
||||
}
|
||||
|
||||
}
|
||||
125
app/src/main/java/com/gh/common/util/HttpsUtils.java
Normal file
125
app/src/main/java/com/gh/common/util/HttpsUtils.java
Normal file
@ -0,0 +1,125 @@
|
||||
package com.gh.common.util;
|
||||
|
||||
import android.content.Context;
|
||||
|
||||
import com.gh.gamecenter.R;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.io.InputStream;
|
||||
import java.net.URL;
|
||||
import java.security.KeyStore;
|
||||
import java.security.cert.Certificate;
|
||||
import java.security.cert.CertificateException;
|
||||
import java.security.cert.CertificateFactory;
|
||||
import java.security.cert.X509Certificate;
|
||||
|
||||
import javax.net.ssl.HostnameVerifier;
|
||||
import javax.net.ssl.HttpsURLConnection;
|
||||
import javax.net.ssl.SSLContext;
|
||||
import javax.net.ssl.SSLSession;
|
||||
import javax.net.ssl.SSLSocketFactory;
|
||||
import javax.net.ssl.TrustManager;
|
||||
import javax.net.ssl.TrustManagerFactory;
|
||||
import javax.net.ssl.X509TrustManager;
|
||||
|
||||
import okhttp3.internal.tls.OkHostnameVerifier;
|
||||
|
||||
/**
|
||||
* Created by khy on 2016/10/8.
|
||||
*/
|
||||
public class HttpsUtils {
|
||||
|
||||
private static final TrustManager[] TRUST_MANAGERS = new TrustManager[]{
|
||||
new X509TrustManager() {
|
||||
@Override
|
||||
public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public X509Certificate[] getAcceptedIssuers() {
|
||||
return new X509Certificate[0];
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
private static final HostnameVerifier HOSTNAME_VERIFIER = new HostnameVerifier() {
|
||||
@Override
|
||||
public boolean verify(String hostname, SSLSession session) {
|
||||
return true;
|
||||
}
|
||||
};
|
||||
|
||||
private static SSLSocketFactory mSSLSocketFactory;
|
||||
private static HostnameVerifier mHostnameVerifier;
|
||||
|
||||
public static void initHttpsUrlConnection(Context context) {
|
||||
try {
|
||||
SSLContext sslContext = SSLContext.getInstance("TLS");
|
||||
|
||||
KeyStore keyStore = getHttpsKeyStore(context);
|
||||
if (keyStore != null) {
|
||||
String algorithm = TrustManagerFactory.getDefaultAlgorithm();
|
||||
TrustManagerFactory tmf = TrustManagerFactory.getInstance(algorithm);
|
||||
tmf.init(keyStore);
|
||||
sslContext.init(null, tmf.getTrustManagers(), null);
|
||||
|
||||
mHostnameVerifier = OkHostnameVerifier.INSTANCE;
|
||||
} else {
|
||||
sslContext.init(null, TRUST_MANAGERS, null);
|
||||
|
||||
mHostnameVerifier = HOSTNAME_VERIFIER;
|
||||
}
|
||||
mSSLSocketFactory = sslContext.getSocketFactory();
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
private static KeyStore getHttpsKeyStore(Context context) {
|
||||
InputStream is = null;
|
||||
try {
|
||||
is = context.getResources().openRawResource(R.raw.cacert);
|
||||
//读取证书
|
||||
CertificateFactory certificateFactory = CertificateFactory.getInstance("X.509");
|
||||
certificateFactory.generateCertificate(is);
|
||||
Certificate certificate = certificateFactory.generateCertificate(is);
|
||||
//创建一个证书库,并将证书导入证书库
|
||||
KeyStore keyStore = KeyStore.getInstance(KeyStore.getDefaultType());
|
||||
keyStore.load(null, null);
|
||||
keyStore.setCertificateEntry("trust", certificate);
|
||||
return keyStore;
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
} finally {
|
||||
if (is != null) {
|
||||
try {
|
||||
is.close();
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
public static HttpsURLConnection getHttpsURLConnection(URL url) throws Exception {
|
||||
HttpsURLConnection httpsURLConnection = (HttpsURLConnection) url.openConnection();
|
||||
if (mSSLSocketFactory == null || mHostnameVerifier == null) {
|
||||
SSLContext sslContext = SSLContext.getInstance("TLS");
|
||||
sslContext.init(null, TRUST_MANAGERS, null);
|
||||
mSSLSocketFactory = sslContext.getSocketFactory();
|
||||
|
||||
mHostnameVerifier = HOSTNAME_VERIFIER;
|
||||
}
|
||||
httpsURLConnection.setSSLSocketFactory(mSSLSocketFactory);
|
||||
httpsURLConnection.setHostnameVerifier(mHostnameVerifier);
|
||||
return httpsURLConnection;
|
||||
}
|
||||
|
||||
}
|
||||
117
app/src/main/java/com/gh/common/util/ImageUtils.java
Normal file
117
app/src/main/java/com/gh/common/util/ImageUtils.java
Normal file
@ -0,0 +1,117 @@
|
||||
package com.gh.common.util;
|
||||
|
||||
import android.content.Context;
|
||||
import android.content.res.Resources;
|
||||
import android.graphics.drawable.Animatable;
|
||||
import android.graphics.drawable.ColorDrawable;
|
||||
import android.net.Uri;
|
||||
import android.support.v4.content.ContextCompat;
|
||||
import android.view.ViewGroup;
|
||||
|
||||
import com.facebook.common.executors.CallerThreadExecutor;
|
||||
import com.facebook.drawee.backends.pipeline.Fresco;
|
||||
import com.facebook.drawee.controller.BaseControllerListener;
|
||||
import com.facebook.drawee.controller.ControllerListener;
|
||||
import com.facebook.drawee.drawable.ScalingUtils;
|
||||
import com.facebook.drawee.generic.GenericDraweeHierarchyBuilder;
|
||||
import com.facebook.drawee.view.SimpleDraweeView;
|
||||
import com.facebook.imagepipeline.datasource.BaseBitmapDataSubscriber;
|
||||
import com.facebook.imagepipeline.image.ImageInfo;
|
||||
import com.facebook.imagepipeline.request.ImageRequest;
|
||||
import com.facebook.imagepipeline.request.ImageRequestBuilder;
|
||||
import com.gh.gamecenter.R;
|
||||
|
||||
public class ImageUtils {
|
||||
|
||||
private static ImageUtils singleton;
|
||||
|
||||
public static ImageUtils getInstance() {
|
||||
if (singleton == null) {
|
||||
synchronized (ImageUtils.class) {
|
||||
if (singleton == null) {
|
||||
singleton = new ImageUtils();
|
||||
return singleton;
|
||||
}
|
||||
}
|
||||
}
|
||||
return singleton;
|
||||
}
|
||||
|
||||
// 自适应图片宽高
|
||||
public void display(final SimpleDraweeView simpleDraweeView, String url, final int width) {
|
||||
ControllerListener<ImageInfo> listener = new BaseControllerListener<ImageInfo>() {
|
||||
@Override
|
||||
public void onFinalImageSet(String id, ImageInfo imageInfo, Animatable animatable) {
|
||||
if (imageInfo == null) {
|
||||
return;
|
||||
}
|
||||
ViewGroup.LayoutParams layoutParams = simpleDraweeView.getLayoutParams();
|
||||
float scale = (float) imageInfo.getHeight() / (float) imageInfo.getWidth();
|
||||
layoutParams.height = (int) (width * scale);
|
||||
simpleDraweeView.setLayoutParams(layoutParams);
|
||||
}
|
||||
};
|
||||
simpleDraweeView.setController(Fresco.newDraweeControllerBuilder()
|
||||
.setUri(url)
|
||||
.setControllerListener(listener)
|
||||
.build());
|
||||
}
|
||||
|
||||
// 设置缩放类型,设置按压状态下的叠加图
|
||||
public void display(Resources resources, SimpleDraweeView simpleDraweeView,
|
||||
ScalingUtils.ScaleType scaleType, String url) {
|
||||
final Context context = simpleDraweeView.getContext();
|
||||
simpleDraweeView.setHierarchy(new GenericDraweeHierarchyBuilder(resources)
|
||||
.setFadeDuration(500)
|
||||
.setPressedStateOverlay(new ColorDrawable(ContextCompat.getColor(context, R.color.pressed_bg)))
|
||||
.setPlaceholderImage(R.drawable.ocupy2, ScalingUtils.ScaleType.CENTER)
|
||||
.setBackground(new ColorDrawable(ContextCompat.getColor(context, R.color.placeholder_bg)))
|
||||
.setActualImageScaleType(scaleType)
|
||||
.build());
|
||||
// simpleDraweeView.setImageURI(url);
|
||||
display(simpleDraweeView, url);
|
||||
}
|
||||
|
||||
public static void display(SimpleDraweeView simpleDraweeView, String url) {
|
||||
// if (url.startsWith("http://image.ghzs666.com") && url.endsWith(".jpg")) {
|
||||
// url = url + "?x-oss-process=image/format,webp";
|
||||
// }
|
||||
simpleDraweeView.setImageURI(url);
|
||||
}
|
||||
|
||||
// 设置占位符
|
||||
public void display(Resources resources, SimpleDraweeView simpleDraweeView, String url, int placeholderImage) {
|
||||
final Context context = simpleDraweeView.getContext();
|
||||
simpleDraweeView.setHierarchy(new GenericDraweeHierarchyBuilder(resources)
|
||||
.setFadeDuration(500)
|
||||
.setPressedStateOverlay(new ColorDrawable(ContextCompat.getColor(context, R.color.pressed_bg)))
|
||||
.setBackground(new ColorDrawable(ContextCompat.getColor(context, R.color.placeholder_bg)))
|
||||
.setPlaceholderImage(placeholderImage)
|
||||
.build());
|
||||
// simpleDraweeView.setImageURI(url);
|
||||
display(simpleDraweeView, url);
|
||||
}
|
||||
|
||||
// 图片下载监听和设置低高分辨率图片
|
||||
public void display(SimpleDraweeView simpleDraweeView, String url, String lowUrl,
|
||||
ControllerListener<? super ImageInfo> listener) {
|
||||
simpleDraweeView.setController(Fresco.newDraweeControllerBuilder()
|
||||
.setImageRequest(ImageRequest.fromUri(url))
|
||||
.setControllerListener(listener)
|
||||
.setLowResImageRequest(ImageRequest.fromUri(lowUrl)) // 低分辨率图片
|
||||
.build());
|
||||
}
|
||||
|
||||
// 获取bitmap
|
||||
public void display(Context context, String url, BaseBitmapDataSubscriber dataSubscriber) {
|
||||
ImageRequest imageRequest = ImageRequestBuilder
|
||||
.newBuilderWithSource(Uri.parse(url))
|
||||
.setProgressiveRenderingEnabled(true)
|
||||
.build();
|
||||
|
||||
Fresco.getImagePipeline()
|
||||
.fetchDecodedImage(imageRequest, context)
|
||||
.subscribe(dataSubscriber, CallerThreadExecutor.getInstance());
|
||||
}
|
||||
|
||||
}
|
||||
@ -1,111 +0,0 @@
|
||||
package com.gh.common.util
|
||||
|
||||
import android.content.Context
|
||||
import android.content.res.Resources
|
||||
import android.graphics.drawable.Animatable
|
||||
import android.graphics.drawable.ColorDrawable
|
||||
import android.net.Uri
|
||||
import android.support.v4.content.ContextCompat
|
||||
import com.facebook.common.executors.CallerThreadExecutor
|
||||
import com.facebook.drawee.backends.pipeline.Fresco
|
||||
import com.facebook.drawee.controller.BaseControllerListener
|
||||
import com.facebook.drawee.controller.ControllerListener
|
||||
import com.facebook.drawee.drawable.ScalingUtils
|
||||
import com.facebook.drawee.generic.GenericDraweeHierarchyBuilder
|
||||
import com.facebook.drawee.view.SimpleDraweeView
|
||||
import com.facebook.imagepipeline.datasource.BaseBitmapDataSubscriber
|
||||
import com.facebook.imagepipeline.image.ImageInfo
|
||||
import com.facebook.imagepipeline.request.ImageRequest
|
||||
import com.facebook.imagepipeline.request.ImageRequestBuilder
|
||||
import com.gh.gamecenter.R
|
||||
|
||||
class ImageUtils {
|
||||
|
||||
// 自适应图片宽高
|
||||
fun display(simpleDraweeView: SimpleDraweeView, url: String, width: Int) {
|
||||
val listener = object : BaseControllerListener<ImageInfo>() {
|
||||
override fun onFinalImageSet(id: String?, imageInfo: ImageInfo?, animatable: Animatable?) {
|
||||
if (imageInfo == null) {
|
||||
return
|
||||
}
|
||||
val layoutParams = simpleDraweeView.layoutParams
|
||||
val scale = imageInfo.height.toFloat() / imageInfo.width.toFloat()
|
||||
layoutParams.height = (width * scale).toInt()
|
||||
simpleDraweeView.layoutParams = layoutParams
|
||||
}
|
||||
}
|
||||
simpleDraweeView.controller = Fresco.newDraweeControllerBuilder()
|
||||
.setUri(url)
|
||||
.setControllerListener(listener)
|
||||
.build()
|
||||
}
|
||||
|
||||
// 设置缩放类型,设置按压状态下的叠加图
|
||||
fun display(resources: Resources, simpleDraweeView: SimpleDraweeView,
|
||||
scaleType: ScalingUtils.ScaleType, url: String) {
|
||||
val context = simpleDraweeView.context
|
||||
simpleDraweeView.hierarchy = GenericDraweeHierarchyBuilder(resources)
|
||||
.setFadeDuration(500)
|
||||
.setPressedStateOverlay(ColorDrawable(ContextCompat.getColor(context, R.color.pressed_bg)))
|
||||
.setPlaceholderImage(R.drawable.occupy2, ScalingUtils.ScaleType.CENTER)
|
||||
.setBackground(ColorDrawable(ContextCompat.getColor(context, R.color.placeholder_bg)))
|
||||
.setActualImageScaleType(scaleType)
|
||||
.build()
|
||||
// simpleDraweeView.setImageURI(url);
|
||||
display(simpleDraweeView, url)
|
||||
}
|
||||
|
||||
// 设置占位符
|
||||
fun display(resources: Resources, simpleDraweeView: SimpleDraweeView, url: String, placeholderImage: Int) {
|
||||
val context = simpleDraweeView.context
|
||||
simpleDraweeView.hierarchy = GenericDraweeHierarchyBuilder(resources)
|
||||
.setFadeDuration(500)
|
||||
.setPressedStateOverlay(ColorDrawable(ContextCompat.getColor(context, R.color.pressed_bg)))
|
||||
.setBackground(ColorDrawable(ContextCompat.getColor(context, R.color.placeholder_bg)))
|
||||
.setPlaceholderImage(placeholderImage)
|
||||
.build()
|
||||
// simpleDraweeView.setImageURI(url);
|
||||
display(simpleDraweeView, url)
|
||||
}
|
||||
|
||||
// 图片下载监听和设置低高分辨率图片
|
||||
fun display(simpleDraweeView: SimpleDraweeView, url: String, lowUrl: String,
|
||||
listener: ControllerListener<in ImageInfo>) {
|
||||
simpleDraweeView.controller = Fresco.newDraweeControllerBuilder()
|
||||
.setImageRequest(ImageRequest.fromUri(url))
|
||||
.setControllerListener(listener)
|
||||
.setLowResImageRequest(ImageRequest.fromUri(lowUrl)) // 低分辨率图片
|
||||
.build()
|
||||
}
|
||||
|
||||
// 获取bitmap
|
||||
fun display(context: Context, url: String, dataSubscriber: BaseBitmapDataSubscriber) {
|
||||
val imageRequest = ImageRequestBuilder
|
||||
.newBuilderWithSource(Uri.parse(url))
|
||||
.setProgressiveRenderingEnabled(true)
|
||||
.build()
|
||||
|
||||
Fresco.getImagePipeline()
|
||||
.fetchDecodedImage(imageRequest, context)
|
||||
.subscribe(dataSubscriber, CallerThreadExecutor.getInstance())
|
||||
}
|
||||
|
||||
companion object {
|
||||
|
||||
fun getInstance(): ImageUtils {
|
||||
return Inner.anotherSingle
|
||||
}
|
||||
|
||||
private object Inner {
|
||||
val anotherSingle = ImageUtils()
|
||||
}
|
||||
|
||||
fun display(simpleDraweeView: SimpleDraweeView, url: String) {
|
||||
// if (url.startsWith("http://image.ghzs666.com") && url.endsWith(".jpg")) {
|
||||
// url = url + "?x-oss-process=image/format,webp";
|
||||
// }
|
||||
simpleDraweeView.setImageURI(url)
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
@ -4,8 +4,6 @@ import android.content.Context;
|
||||
import android.provider.Settings;
|
||||
import android.text.TextUtils;
|
||||
|
||||
import com.lightgame.utils.Util_System_Phone_State;
|
||||
|
||||
import java.io.File;
|
||||
import java.io.FileOutputStream;
|
||||
import java.io.IOException;
|
||||
|
||||
@ -1,5 +1,6 @@
|
||||
package com.gh.common.util;
|
||||
|
||||
import android.app.Activity;
|
||||
import android.content.ClipboardManager;
|
||||
import android.content.Context;
|
||||
import android.content.Intent;
|
||||
@ -28,7 +29,6 @@ import com.gh.gamecenter.geetest.GeetestUtils;
|
||||
import com.gh.gamecenter.retrofit.JSONObjectResponse;
|
||||
import com.gh.gamecenter.retrofit.Response;
|
||||
import com.gh.gamecenter.retrofit.RetrofitManager;
|
||||
import com.lightgame.utils.Utils;
|
||||
|
||||
import org.greenrobot.eventbus.EventBus;
|
||||
import org.json.JSONException;
|
||||
@ -215,7 +215,7 @@ public class LibaoUtils {
|
||||
});
|
||||
}
|
||||
|
||||
public static void initLibaoBtn(final Context context, final TextView libaoBtn, final LibaoEntity libaoEntity, final LibaoDao libaoDao,
|
||||
public static void initLibaoBtn(final Activity activity, final TextView libaoBtn, final LibaoEntity libaoEntity, final LibaoDao libaoDao,
|
||||
final boolean isInstallRequired, final LibaoDetailAdapter adapter, final String entrance) {
|
||||
|
||||
libaoBtn.setTextColor(Color.WHITE);
|
||||
@ -257,7 +257,8 @@ public class LibaoUtils {
|
||||
int[][] states2 = new int[2][];
|
||||
states2[0] = new int[]{android.R.attr.state_pressed};
|
||||
states2[1] = new int[]{};
|
||||
int[] colors2 = new int[]{Color.WHITE, Color.parseColor("#ffb13c")};
|
||||
int[] colors2 = new int[]{Color.WHITE,
|
||||
Color.parseColor("#ffb13c")};
|
||||
ColorStateList sl2 = new ColorStateList(states2, colors2);
|
||||
libaoBtn.setText("已淘号");
|
||||
libaoBtn.setBackgroundResource(R.drawable.libao_taoed_style);
|
||||
@ -275,194 +276,171 @@ public class LibaoUtils {
|
||||
libaoBtn.setOnClickListener(new View.OnClickListener() {
|
||||
@Override
|
||||
public void onClick(View v) {
|
||||
CheckLoginUtils.checkLogin(context, new CheckLoginUtils.OnLoggenInListener() {
|
||||
@Override
|
||||
public void onLoggedIn() {
|
||||
// 领取限制
|
||||
if ("领取".equals(libaoBtn.getText().toString()) || "淘号".equals(libaoBtn.getText().toString())) {
|
||||
if (isInstallRequired && !isAppInstalled(context, libaoEntity.getPackageName())) {
|
||||
String platform;
|
||||
if (TextUtils.isEmpty(libaoEntity.getPlatform())) {
|
||||
platform = "";
|
||||
} else {
|
||||
platform = PlatformUtils.getInstance(context)
|
||||
.getPlatformName(libaoEntity.getPlatform()) + "版";
|
||||
// 领取限制
|
||||
if ("领取".equals(libaoBtn.getText().toString()) || "淘号".equals(libaoBtn.getText().toString())) {
|
||||
if (isInstallRequired && !isAppInstalled(libaoBtn.getContext(), libaoEntity.getPackageName())) {
|
||||
String platform;
|
||||
if (TextUtils.isEmpty(libaoEntity.getPlatform())) {
|
||||
platform = "";
|
||||
} else {
|
||||
platform = PlatformUtils.getInstance(libaoBtn.getContext())
|
||||
.getPlatformName(libaoEntity.getPlatform()) + "版";
|
||||
}
|
||||
|
||||
DialogUtils.showWarningDialog(libaoBtn.getContext(), "条件不符",
|
||||
Html.fromHtml("请先" + "<font color=\"#06D0A8\">"
|
||||
+ "安装《" + libaoEntity.getGame().getName() + "》 "
|
||||
+ platform + "</font>"), "关闭", "立即安装"
|
||||
, new DialogUtils.ConfirmListener() {
|
||||
@Override
|
||||
public void onConfirm() {
|
||||
adapter.openDownload();
|
||||
}
|
||||
}, null);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
switch (libaoBtn.getText().toString()) {
|
||||
case "未开始":
|
||||
Utils.toast(libaoBtn.getContext(), "还没到开始领取时间");
|
||||
break;
|
||||
case "查看":
|
||||
Intent intent = LibaoDetailActivity.getLibaoDetailIntent(libaoEntity, libaoBtn, entrance);
|
||||
libaoBtn.getContext().startActivity(intent);
|
||||
break;
|
||||
case "领取":
|
||||
libaoLing(activity, libaoBtn, libaoEntity, adapter, isInstallRequired, libaoDao, null, entrance);
|
||||
break;
|
||||
case "淘号":
|
||||
postLibaoTao(libaoBtn.getContext(), libaoEntity.getId(), true, new PostLibaoListener() {
|
||||
@Override
|
||||
public void postSucced(Object response) {
|
||||
|
||||
JSONObject responseBody = (JSONObject) response;
|
||||
Utils.log("postLibaoTao=====" + responseBody);
|
||||
String libaoCode = null;
|
||||
try {
|
||||
libaoCode = responseBody.getString("code");
|
||||
} catch (JSONException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
|
||||
DialogUtils.showWarningDialog(context, "条件不符",
|
||||
Html.fromHtml("请先" + "<font color=\"#06D0A8\">"
|
||||
+ "安装《" + libaoEntity.getGame().getName() + "》 "
|
||||
+ platform + "</font>"), "关闭", "立即安装"
|
||||
if (TextUtils.isEmpty(libaoCode)) {
|
||||
try {
|
||||
String detail = responseBody.getString("detail");
|
||||
if ("maintaining".equals(detail)) {
|
||||
Utils.toast(libaoBtn.getContext(), "网络状态异常,请稍后再试");
|
||||
} else if ("fail to compete".equals(detail)) {
|
||||
Utils.toast(libaoBtn.getContext(), "淘号失败,稍后重试");
|
||||
} else {
|
||||
Utils.toast(libaoBtn.getContext(), "淘号异常");
|
||||
}
|
||||
} catch (JSONException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
Utils.toast(libaoBtn.getContext(), "淘号成功");
|
||||
|
||||
libaoEntity.setStatus("taoed");
|
||||
|
||||
LibaoInfo libaoInfo = LibaoInfo.createLibaoInfo(libaoEntity);
|
||||
libaoInfo.setCode(libaoCode);
|
||||
libaoInfo.setTime(Utils.getTime(libaoBtn.getContext()));
|
||||
libaoDao.add(libaoInfo);
|
||||
|
||||
EventBus.getDefault().post(new EBReuse("libaoChanged"));
|
||||
|
||||
adapter.initLibaoDao();
|
||||
adapter.notifyDataSetChanged();
|
||||
|
||||
final String finalLibaoCode = libaoCode;
|
||||
DialogUtils.showWarningDialog(libaoBtn.getContext(), "淘号成功", Html.fromHtml("礼包码:"
|
||||
+ "<font color=\"#ffb13c\">" + libaoCode + "</font>" +
|
||||
"<br/>淘号礼包不保证可用,请尽快进入游戏尝试兑换")
|
||||
, "关闭", " 复制礼包码"
|
||||
, new DialogUtils.ConfirmListener() {
|
||||
@Override
|
||||
public void onConfirm() {
|
||||
adapter.openDownload();
|
||||
copyLink(finalLibaoCode, libaoBtn.getContext());
|
||||
|
||||
if (isInstallRequired) {
|
||||
libaoBtn.postDelayed(new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
lunningAppDialog(libaoBtn.getContext()
|
||||
, Html.fromHtml("礼包码:"
|
||||
+ "<font color=\"#ffb13c\">" + finalLibaoCode + "</font>"
|
||||
+ " 复制成功"
|
||||
+ "<br/>淘号礼包不保证可用,请尽快进入游戏尝试兑换"), libaoEntity);
|
||||
}
|
||||
}, 300);
|
||||
}
|
||||
}
|
||||
}, null);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
switch (libaoBtn.getText().toString()) {
|
||||
case "未开始":
|
||||
Utils.toast(context, "还没到开始领取时间");
|
||||
break;
|
||||
case "查看":
|
||||
Intent intent = LibaoDetailActivity.getIntent(context, libaoEntity, entrance);
|
||||
context.startActivity(intent);
|
||||
break;
|
||||
case "领取":
|
||||
libaoLing(context, libaoBtn, libaoEntity, adapter, isInstallRequired, libaoDao, null, entrance);
|
||||
break;
|
||||
case "淘号":
|
||||
postLibaoTao(context, libaoEntity.getId(), true, new PostLibaoListener() {
|
||||
@Override
|
||||
public void postSucced(Object response) {
|
||||
@Override
|
||||
public void postFailed(Throwable error) {
|
||||
Utils.log("---" + error.toString());
|
||||
|
||||
JSONObject responseBody = (JSONObject) response;
|
||||
Utils.log("postLibaoTao=====" + responseBody);
|
||||
String libaoCode = null;
|
||||
if (error instanceof HttpException) {
|
||||
HttpException exception = (HttpException) error;
|
||||
if (exception.code() == 403) {
|
||||
try {
|
||||
libaoCode = responseBody.getString("code");
|
||||
} catch (JSONException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
JSONObject errorJson = new JSONObject(exception.response().errorBody().string());
|
||||
String detail = errorJson.getString("detail");
|
||||
Utils.toast(libaoBtn.getContext(), "返回::" + detail);
|
||||
if ("coming".equals(detail)) {
|
||||
Utils.toast(libaoBtn.getContext(), "礼包领取时间未开始");
|
||||
} else if ("finish".equals(detail)) {
|
||||
Utils.toast(libaoBtn.getContext(), "礼包领取时间已结束");
|
||||
} else if ("fetched".equals(detail)) {
|
||||
Utils.toast(libaoBtn.getContext(), "你已领过这个礼包了");
|
||||
getCunHaoXiang(libaoBtn.getContext(), true);
|
||||
|
||||
if (TextUtils.isEmpty(libaoCode)) {
|
||||
try {
|
||||
String detail = responseBody.getString("detail");
|
||||
switch (detail) {
|
||||
case "maintaining":
|
||||
Utils.toast(context, "网络状态异常,请稍后再试");
|
||||
break;
|
||||
case "fail to compete":
|
||||
Utils.toast(context, "淘号失败,稍后重试");
|
||||
break;
|
||||
default:
|
||||
Utils.toast(context, "淘号异常");
|
||||
break;
|
||||
}
|
||||
} catch (JSONException e) {
|
||||
e.printStackTrace();
|
||||
int[][] states2 = new int[2][];
|
||||
states2[0] = new int[]{android.R.attr.state_pressed};
|
||||
states2[1] = new int[]{};
|
||||
int[] colors2 = new int[]{Color.WHITE,
|
||||
Color.parseColor("#ffb13c")};
|
||||
ColorStateList sl2 = new ColorStateList(states2, colors2);
|
||||
libaoBtn.setText("已淘号");
|
||||
libaoBtn.setBackgroundResource(R.drawable.libao_taoed_style);
|
||||
libaoBtn.setTextColor(sl2);
|
||||
libaoEntity.setStatus("taoed");
|
||||
} else if ("try tao".equals(detail) || "used up".equals(detail)) {
|
||||
DialogUtils.showHintDialog(libaoBtn.getContext(), "礼包已领光"
|
||||
, "手速不够快,礼包已经被抢光了,十分抱歉", "知道了");
|
||||
} else if ("maintaining".equals(detail)) {
|
||||
Utils.toast(libaoBtn.getContext(), "网络状态异常,请稍后再试");
|
||||
} else if ("fail to compete".equals(detail)) {
|
||||
Utils.toast(libaoBtn.getContext(), "淘号失败,稍后重试");
|
||||
} else {
|
||||
Utils.toast(libaoBtn.getContext(), "操作失败");
|
||||
}
|
||||
return;
|
||||
} catch (Exception ex) {
|
||||
ex.printStackTrace();
|
||||
Utils.toast(libaoBtn.getContext(), "礼包处理异常" + ex.toString());
|
||||
}
|
||||
|
||||
Utils.toast(context, "淘号成功");
|
||||
|
||||
libaoEntity.setStatus("taoed");
|
||||
|
||||
LibaoInfo libaoInfo = LibaoInfo.createLibaoInfo(libaoEntity);
|
||||
libaoInfo.setCode(libaoCode);
|
||||
libaoInfo.setTime(Utils.getTime(context));
|
||||
libaoDao.add(libaoInfo);
|
||||
|
||||
EventBus.getDefault().post(new EBReuse("libaoChanged"));
|
||||
|
||||
adapter.initLibaoDao();
|
||||
adapter.notifyDataSetChanged();
|
||||
|
||||
final String finalLibaoCode = libaoCode;
|
||||
DialogUtils.showWarningDialog(context, "淘号成功", Html.fromHtml("礼包码:"
|
||||
+ "<font color=\"#ffb13c\">" + libaoCode + "</font>" +
|
||||
"<br/>淘号礼包不保证可用,请尽快进入游戏尝试兑换")
|
||||
, "关闭", " 复制礼包码"
|
||||
, new DialogUtils.ConfirmListener() {
|
||||
@Override
|
||||
public void onConfirm() {
|
||||
copyLink(finalLibaoCode, context);
|
||||
|
||||
if (isInstallRequired) {
|
||||
libaoBtn.postDelayed(new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
lunningAppDialog(context
|
||||
, Html.fromHtml("礼包码:"
|
||||
+ "<font color=\"#ffb13c\">" + finalLibaoCode + "</font>"
|
||||
+ " 复制成功"
|
||||
+ "<br/>淘号礼包不保证可用,请尽快进入游戏尝试兑换"), libaoEntity);
|
||||
}
|
||||
}, 300);
|
||||
}
|
||||
}
|
||||
}, null);
|
||||
return;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void postFailed(Throwable error) {
|
||||
Utils.log("---" + error.toString());
|
||||
|
||||
if (error instanceof HttpException) {
|
||||
HttpException exception = (HttpException) error;
|
||||
if (exception.code() == 403) {
|
||||
try {
|
||||
JSONObject errorJson = new JSONObject(exception.response().errorBody().string());
|
||||
String detail = errorJson.getString("detail");
|
||||
Utils.toast(context, "返回::" + detail);
|
||||
switch (detail) {
|
||||
case "coming":
|
||||
Utils.toast(context, "礼包领取时间未开始");
|
||||
break;
|
||||
case "finish":
|
||||
Utils.toast(context, "礼包领取时间已结束");
|
||||
break;
|
||||
case "fetched":
|
||||
Utils.toast(context, "你已领过这个礼包了");
|
||||
getCunHaoXiang(context, true);
|
||||
|
||||
int[][] states2 = new int[2][];
|
||||
states2[0] = new int[]{android.R.attr.state_pressed};
|
||||
states2[1] = new int[]{};
|
||||
int[] colors2 = new int[]{Color.WHITE,
|
||||
Color.parseColor("#ffb13c")};
|
||||
ColorStateList sl2 = new ColorStateList(states2, colors2);
|
||||
libaoBtn.setText("已淘号");
|
||||
libaoBtn.setBackgroundResource(R.drawable.libao_taoed_style);
|
||||
libaoBtn.setTextColor(sl2);
|
||||
libaoEntity.setStatus("taoed");
|
||||
break;
|
||||
case "try tao":
|
||||
case "used up":
|
||||
DialogUtils.showHintDialog(context, "礼包已领光"
|
||||
, "手速不够快,礼包已经被抢光了,十分抱歉", "知道了");
|
||||
break;
|
||||
case "maintaining":
|
||||
Utils.toast(context, "网络状态异常,请稍后再试");
|
||||
break;
|
||||
case "fail to compete":
|
||||
Utils.toast(context, "淘号失败,稍后重试");
|
||||
break;
|
||||
default:
|
||||
Utils.toast(context, "操作失败");
|
||||
break;
|
||||
|
||||
}
|
||||
} catch (Exception ex) {
|
||||
ex.printStackTrace();
|
||||
Utils.toast(context, "礼包处理异常" + ex.toString());
|
||||
}
|
||||
return;
|
||||
}
|
||||
}
|
||||
Utils.toast(context, "发生异常");
|
||||
}
|
||||
});
|
||||
break;
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
Utils.toast(libaoBtn.getContext(), "发生异常");
|
||||
}
|
||||
});
|
||||
break;
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
private static void libaoLing(final Context context, final TextView libaoBtn, final LibaoEntity libaoEntity, final LibaoDetailAdapter adapter,
|
||||
private static void libaoLing(final Activity activity, final TextView libaoBtn, final LibaoEntity libaoEntity, final LibaoDetailAdapter adapter,
|
||||
final boolean isInstallRequired, final LibaoDao libaoDao, String captchaCode, final String entrance) {
|
||||
|
||||
if (BuildConfig.DEBUG) {
|
||||
Log.e("LIBAO", "context? " + context + libaoBtn.getContext());
|
||||
}
|
||||
|
||||
postLibaoLing(context, libaoEntity.getId(), true, new PostLibaoListener() {
|
||||
postLibaoLing(libaoBtn.getContext(), libaoEntity.getId(), true, new PostLibaoListener() {
|
||||
@Override
|
||||
public void postSucced(Object response) {
|
||||
|
||||
@ -476,7 +454,7 @@ public class LibaoUtils {
|
||||
}
|
||||
|
||||
if (TextUtils.isEmpty(libaoCode)) {
|
||||
Utils.toast(context, "领取异常");
|
||||
Utils.toast(libaoBtn.getContext(), "领取异常");
|
||||
return;
|
||||
}
|
||||
libaoEntity.setAvailable(libaoEntity.getAvailable() - 1);
|
||||
@ -484,7 +462,7 @@ public class LibaoUtils {
|
||||
libaoEntity.setStatus("linged");
|
||||
|
||||
LibaoInfo libaoInfo = LibaoInfo.createLibaoInfo(libaoEntity);
|
||||
libaoInfo.setTime(Utils.getTime(context));
|
||||
libaoInfo.setTime(Utils.getTime(libaoBtn.getContext()));
|
||||
libaoInfo.setCode(libaoCode);
|
||||
libaoDao.add(libaoInfo);
|
||||
|
||||
@ -494,19 +472,19 @@ public class LibaoUtils {
|
||||
adapter.notifyDataSetChanged();
|
||||
|
||||
final String finalLibaoCode = libaoCode;
|
||||
DialogUtils.showWarningDialog(context, "领取成功", Html.fromHtml("礼包码:"
|
||||
DialogUtils.showWarningDialog(libaoBtn.getContext(), "领取成功", Html.fromHtml("礼包码:"
|
||||
+ "<font color=\"#00B7FA\">" + libaoCode + "</font>" +
|
||||
"<br/>请尽快使用,礼包码将于60分钟后进入淘号池")
|
||||
, "关闭", " 复制礼包码"
|
||||
, new DialogUtils.ConfirmListener() {
|
||||
@Override
|
||||
public void onConfirm() {
|
||||
copyLink(finalLibaoCode, context);
|
||||
copyLink(finalLibaoCode, libaoBtn.getContext());
|
||||
if (isInstallRequired) {
|
||||
libaoBtn.postDelayed(new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
lunningAppDialog(context
|
||||
lunningAppDialog(libaoBtn.getContext()
|
||||
, Html.fromHtml("礼包码:"
|
||||
+ "<font color=\"#00B7FA\">" + finalLibaoCode + "</font>"
|
||||
+ " 复制成功" + "<br/>请尽快进入游戏兑换"), libaoEntity);
|
||||
@ -529,68 +507,66 @@ public class LibaoUtils {
|
||||
JSONObject errorJson = new JSONObject(string);
|
||||
String detail = errorJson.getString("detail");
|
||||
|
||||
switch (detail) {
|
||||
case "coming":
|
||||
Utils.toast(context, "礼包领取时间未开始");
|
||||
break;
|
||||
case "finish":
|
||||
Utils.toast(context, "礼包领取时间已结束");
|
||||
break;
|
||||
case "fetched":
|
||||
Utils.toast(context, "你已领过这个礼包了");
|
||||
int countdown = 0;
|
||||
if (errorJson.toString().contains("countdown")) {
|
||||
countdown = errorJson.getInt("countdown");
|
||||
}
|
||||
if (countdown > 0 && countdown < 60 * 10) {
|
||||
EventBus.getDefault().post(new EBUISwitch(REFRESH_LIBAO_TIME, countdown));
|
||||
} else {
|
||||
getCunHaoXiang(context, true);
|
||||
}
|
||||
if ("coming".equals(detail)) {
|
||||
Utils.toast(libaoBtn.getContext(), "礼包领取时间未开始");
|
||||
} else if ("finish".equals(detail)) {
|
||||
Utils.toast(libaoBtn.getContext(), "礼包领取时间已结束");
|
||||
} else if ("fetched".equals(detail)) {
|
||||
Utils.toast(libaoBtn.getContext(), "你已领过这个礼包了");
|
||||
int countdown = 0;
|
||||
if (errorJson.toString().contains("countdown")) {
|
||||
countdown = errorJson.getInt("countdown");
|
||||
}
|
||||
if (countdown > 0 && countdown < 60 * 10) {
|
||||
EventBus.getDefault().post(new EBUISwitch(REFRESH_LIBAO_TIME, countdown));
|
||||
} else {
|
||||
getCunHaoXiang(libaoBtn.getContext(), true);
|
||||
}
|
||||
|
||||
int[][] states = new int[2][];
|
||||
states[0] = new int[]{android.R.attr.state_pressed};
|
||||
states[1] = new int[]{};
|
||||
int[] colors = new int[]{Color.WHITE,
|
||||
Color.parseColor("#06D0A8")};
|
||||
ColorStateList sl = new ColorStateList(states, colors);
|
||||
libaoBtn.setText("已领取");
|
||||
libaoBtn.setBackgroundResource(R.drawable.libao_linged_style);
|
||||
libaoBtn.setTextColor(sl);
|
||||
int[][] states = new int[2][];
|
||||
states[0] = new int[]{android.R.attr.state_pressed};
|
||||
states[1] = new int[]{};
|
||||
int[] colors = new int[]{Color.WHITE,
|
||||
Color.parseColor("#06D0A8")};
|
||||
ColorStateList sl = new ColorStateList(states, colors);
|
||||
libaoBtn.setText("已领取");
|
||||
libaoBtn.setBackgroundResource(R.drawable.libao_linged_style);
|
||||
libaoBtn.setTextColor(sl);
|
||||
|
||||
libaoEntity.setStatus("linged");
|
||||
break;
|
||||
case "try tao":
|
||||
case "used up":
|
||||
DialogUtils.showHintDialog(context, "礼包已领光"
|
||||
, "手速不够快,礼包已经被抢光了,十分抱歉", "知道了");
|
||||
libaoEntity.setStatus("used_up");
|
||||
initLibaoBtn(context, libaoBtn, libaoEntity, libaoDao, isInstallRequired, adapter, entrance);
|
||||
break;
|
||||
case "maintaining":
|
||||
Utils.toast(context, "网络状态异常,请稍后再试");
|
||||
break;
|
||||
default:
|
||||
Utils.toast(context, "操作失败");
|
||||
break;
|
||||
libaoEntity.setStatus("linged");
|
||||
} else if ("try tao".equals(detail) || "used up".equals(detail)) {
|
||||
DialogUtils.showHintDialog(libaoBtn.getContext(), "礼包已领光"
|
||||
, "手速不够快,礼包已经被抢光了,十分抱歉", "知道了");
|
||||
libaoEntity.setStatus("used_up");
|
||||
initLibaoBtn(activity, libaoBtn, libaoEntity, libaoDao, isInstallRequired, adapter, entrance);
|
||||
|
||||
} else if ("maintaining".equals(detail)) {
|
||||
Utils.toast(libaoBtn.getContext(), "网络状态异常,请稍后再试");
|
||||
} else {
|
||||
Utils.toast(libaoBtn.getContext(), "操作失败");
|
||||
}
|
||||
} catch (Exception ex) {
|
||||
ex.printStackTrace();
|
||||
Utils.toast(context, "礼包处理异常");
|
||||
Utils.toast(libaoBtn.getContext(), "礼包处理异常");
|
||||
}
|
||||
return;
|
||||
} else if (exception.code() == 412) {
|
||||
// 需要验证
|
||||
GeetestUtils.getInstance().showDialog(context, new GeetestListener() {
|
||||
|
||||
if (BuildConfig.DEBUG) {
|
||||
Log.e("LIBAO", "context? " + libaoBtn.getContext() + activity);
|
||||
}
|
||||
|
||||
GeetestUtils.getInstance().showDialog(activity, new GeetestListener() {
|
||||
@Override
|
||||
public void onVerified(String captcha) {
|
||||
libaoLing(context, libaoBtn, libaoEntity, adapter, isInstallRequired, libaoDao, captcha, entrance);
|
||||
libaoLing(activity, libaoBtn, libaoEntity, adapter, isInstallRequired, libaoDao, captcha, entrance);
|
||||
}
|
||||
});
|
||||
return;
|
||||
}
|
||||
}
|
||||
Utils.toast(context, "发生异常");
|
||||
Utils.toast(libaoBtn.getContext(), "发生异常");
|
||||
}
|
||||
}, captchaCode);
|
||||
}
|
||||
@ -636,8 +612,8 @@ public class LibaoUtils {
|
||||
|
||||
|
||||
// 合并List<LibaoStatusEntity> 和 List<LibaoEntity> 并检查重复领取的礼包
|
||||
public static void initLiBaoEntity(LibaoDao libaoDao, List<LibaoStatusEntity> statusList,
|
||||
List<LibaoEntity> libaoEntities, Context mContext) {
|
||||
public static void initLiBaoEntity(LibaoDao libaoDao, List<LibaoStatusEntity> statusList
|
||||
, List<LibaoEntity> mLibaoList, Context mContext) {
|
||||
|
||||
for (LibaoInfo libaoInfo : libaoDao.getAll()) {
|
||||
for (LibaoStatusEntity libaoStatusEntity : statusList) {
|
||||
@ -659,13 +635,16 @@ public class LibaoUtils {
|
||||
}
|
||||
}
|
||||
|
||||
for (LibaoEntity libaoEntity : libaoEntities) {
|
||||
for (LibaoEntity libaoEntity : mLibaoList) {
|
||||
for (LibaoStatusEntity libaoStatusEntity : statusList) {
|
||||
if (libaoEntity.getId().equals(libaoStatusEntity.getId())) {
|
||||
libaoEntity.setAvailable(libaoStatusEntity.getAvailable());
|
||||
libaoEntity.setTotal(libaoStatusEntity.getTotal());
|
||||
|
||||
String beforeStatus = libaoStatusEntity.getBeforeStatus();
|
||||
if (TextUtils.isEmpty(beforeStatus)) {
|
||||
beforeStatus = libaoStatusEntity.getStatus();
|
||||
}
|
||||
int repeat = libaoEntity.getRepeat();
|
||||
if (repeat > 0
|
||||
&& libaoDao.isCanLing(libaoEntity.getId(), mContext)
|
||||
|
||||
@ -1,154 +0,0 @@
|
||||
package com.gh.common.util;
|
||||
|
||||
import android.content.Context;
|
||||
|
||||
import com.gh.gamecenter.entity.LoginResponseEntity;
|
||||
import com.gh.gamecenter.retrofit.JSONObjectResponse;
|
||||
import com.gh.gamecenter.retrofit.Response;
|
||||
import com.gh.gamecenter.retrofit.RetrofitManager;
|
||||
import com.lightgame.utils.Utils;
|
||||
|
||||
import org.json.JSONException;
|
||||
import org.json.JSONObject;
|
||||
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
|
||||
import okhttp3.MediaType;
|
||||
import okhttp3.RequestBody;
|
||||
import retrofit2.HttpException;
|
||||
import rx.Observable;
|
||||
import rx.android.schedulers.AndroidSchedulers;
|
||||
import rx.schedulers.Schedulers;
|
||||
|
||||
/**
|
||||
* Created by khy on 7/07/17.
|
||||
*/
|
||||
|
||||
public class LoginUtils {
|
||||
|
||||
public enum LoginTag {
|
||||
qq, wechat, weibo, phone
|
||||
}
|
||||
|
||||
// 获取验证码
|
||||
public static void getPhoneCaptcha(final Context context, String phoneNum, final onCaptchaCallBackListener listener) {
|
||||
Map<String, String> params = new HashMap<>();
|
||||
params.put("mobile", phoneNum);
|
||||
RequestBody body = RequestBody.create(MediaType.parse("application/json"),
|
||||
new JSONObject(params).toString());
|
||||
RetrofitManager
|
||||
.getUser()
|
||||
.loginByCaptcha(body)
|
||||
.subscribeOn(Schedulers.io())
|
||||
.observeOn(AndroidSchedulers.mainThread())
|
||||
.subscribe(new JSONObjectResponse() {
|
||||
@Override
|
||||
public void onResponse(JSONObject response) {
|
||||
super.onResponse(response);
|
||||
try {
|
||||
listener.onCaptcha(response.getString("service_id"));
|
||||
} catch (JSONException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onFailure(HttpException e) {
|
||||
super.onFailure(e);
|
||||
int code = e.code();
|
||||
switch (code) {
|
||||
case 40001:
|
||||
Utils.toast(context, "缺少mobile参数");
|
||||
break;
|
||||
case 40002:
|
||||
Utils.toast(context, "mobile格式错误");
|
||||
break;
|
||||
case 40003:
|
||||
Utils.toast(context, "一分钟内已发送过验证码");
|
||||
break;
|
||||
default:
|
||||
Utils.toast(context, "未知错误");
|
||||
break;
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
// 登录前,做好body判断
|
||||
public static void login(final Context context, RequestBody body, final LoginTag loginTag,
|
||||
final onLoginCallBackListener listener) {
|
||||
|
||||
Observable<LoginResponseEntity> observable;
|
||||
|
||||
if (loginTag == LoginTag.weibo) {
|
||||
observable = RetrofitManager.getUser().loginByWeibo(body);
|
||||
} else if (loginTag == LoginTag.qq){
|
||||
observable = RetrofitManager.getUser().loginByQQ(body);
|
||||
} else if (loginTag == LoginTag.wechat) {
|
||||
observable = RetrofitManager.getUser().loginByWechat(body);
|
||||
} else {
|
||||
observable = RetrofitManager.getUser().loginByMobile(body);
|
||||
}
|
||||
|
||||
observable
|
||||
.subscribeOn(Schedulers.io())
|
||||
.observeOn(AndroidSchedulers.mainThread())
|
||||
.subscribe(new Response<LoginResponseEntity>() {
|
||||
@Override
|
||||
public void onResponse(LoginResponseEntity response) {
|
||||
super.onResponse(response);
|
||||
listener.onLogin(response, loginTag);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onFailure(HttpException e) {
|
||||
super.onFailure(e);
|
||||
int code = e.code();
|
||||
switch (code) {
|
||||
case 40000:
|
||||
Utils.toast(context,"参数错误或不完整");
|
||||
case 40004:
|
||||
Utils.toast(context,"缺少mobile参数");
|
||||
break;
|
||||
case 40005:
|
||||
Utils.toast(context,"缺少code参数");
|
||||
break;
|
||||
case 40006:
|
||||
Utils.toast(context,"缺少service_id参数");
|
||||
break;
|
||||
case 40007:
|
||||
Utils.toast(context,"服务已超时");
|
||||
break;
|
||||
case 40008:
|
||||
Utils.toast(context,"验证码已超时");
|
||||
break;
|
||||
case 40009:
|
||||
Utils.toast(context,"验证码错误");
|
||||
break;
|
||||
case 40010:
|
||||
Utils.toast(context,"登录授权失败");
|
||||
break;
|
||||
case 40011:
|
||||
Utils.toast(context,"缺少token参数");
|
||||
break;
|
||||
case 40012:
|
||||
Utils.toast(context,"令牌已过期");
|
||||
break;
|
||||
default:
|
||||
Utils.toast(context,"未知错误");
|
||||
break;
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
public interface onCaptchaCallBackListener {
|
||||
void onCaptcha(String serviceId);
|
||||
}
|
||||
|
||||
public interface onLoginCallBackListener {
|
||||
void onLogin(LoginResponseEntity entity, LoginTag loginTag);
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,66 @@
|
||||
package com.gh.common.util;
|
||||
|
||||
import android.content.Context;
|
||||
import android.support.v7.widget.LinearLayoutManager;
|
||||
import android.support.v7.widget.RecyclerView;
|
||||
import android.view.View;
|
||||
import android.view.ViewGroup;
|
||||
|
||||
/**
|
||||
* Created by khy on 2016/8/22.
|
||||
* RecyclerView 自适应高度
|
||||
*/
|
||||
public class MeasureHeightLayoutManager extends LinearLayoutManager {
|
||||
|
||||
private int[] mMeasuredDimension = new int[1];
|
||||
|
||||
public MeasureHeightLayoutManager(Context context) {
|
||||
super(context);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onMeasure(RecyclerView.Recycler recycler, RecyclerView.State state,
|
||||
int widthSpec, int heightSpec) {
|
||||
|
||||
final int heightSize = View.MeasureSpec.getSize(heightSpec);
|
||||
|
||||
int height = 0;
|
||||
for (int i = 0; i < getItemCount(); i++) {
|
||||
try {
|
||||
measureScrapChild(recycler, i,
|
||||
View.MeasureSpec.makeMeasureSpec(i, View.MeasureSpec.UNSPECIFIED),
|
||||
View.MeasureSpec.makeMeasureSpec(i, View.MeasureSpec.UNSPECIFIED),
|
||||
mMeasuredDimension);
|
||||
height = height + mMeasuredDimension[0];
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
if (height > heightSize) {
|
||||
super.onMeasure(recycler, state, widthSpec, heightSpec);
|
||||
} else {
|
||||
setMeasuredDimension(View.MeasureSpec.getSize(widthSpec), height);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
private void measureScrapChild(RecyclerView.Recycler recycler, int position, int widthSpec,
|
||||
int heightSpec, int[] measuredDimension) throws Exception {
|
||||
View view = recycler.getViewForPosition(position);
|
||||
if (view.getVisibility() == View.GONE) {
|
||||
measuredDimension[0] = 0;
|
||||
return;
|
||||
}
|
||||
super.measureChildWithMargins(view, 0, 0);
|
||||
RecyclerView.LayoutParams p = (RecyclerView.LayoutParams) view.getLayoutParams();
|
||||
int childHeightSpec = ViewGroup.getChildMeasureSpec(
|
||||
heightSpec,
|
||||
getPaddingTop() + getPaddingBottom() + getDecoratedTop(view) + getDecoratedBottom(view),
|
||||
p.height);
|
||||
|
||||
view.measure(0, childHeightSpec);
|
||||
measuredDimension[0] = getDecoratedMeasuredHeight(view) + p.bottomMargin + p.topMargin;
|
||||
recycler.recycleView(view);
|
||||
}
|
||||
|
||||
}
|
||||
@ -26,7 +26,6 @@ import android.widget.TextView;
|
||||
|
||||
import com.gh.common.constant.Config;
|
||||
import com.gh.gamecenter.R;
|
||||
import com.lightgame.utils.Utils;
|
||||
import com.tencent.connect.share.QQShare;
|
||||
import com.tencent.mm.sdk.openapi.IWXAPI;
|
||||
import com.tencent.mm.sdk.openapi.SendMessageToWX;
|
||||
|
||||
@ -24,20 +24,16 @@ public class NewsUtils {
|
||||
* 根据新闻类型获取标签背景资源
|
||||
*/
|
||||
public static int getDrawableIdByType(String type) {
|
||||
switch (type) {
|
||||
case "活动":
|
||||
case "高阶":
|
||||
return R.drawable.textview_red_up;
|
||||
case "公告":
|
||||
case "中期":
|
||||
return R.drawable.textview_orange_up;
|
||||
case "新游":
|
||||
return R.drawable.textview_green_up;
|
||||
case "热门":
|
||||
case "置顶":
|
||||
return R.drawable.textview_all_red_up;
|
||||
default:
|
||||
return R.drawable.textview_blue_up;
|
||||
if ("活动".equals(type) || "高阶".equals(type)) {
|
||||
return R.drawable.textview_red_up;
|
||||
} else if ("公告".equals(type) || "中期".equals(type)) {
|
||||
return R.drawable.textview_orange_up;
|
||||
} else if ("新游".equals(type)) {
|
||||
return R.drawable.textview_green_up;
|
||||
} else if ("热门".equals(type) || "置顶".equals(type)) {
|
||||
return R.drawable.textview_all_red_up;
|
||||
} else {
|
||||
return R.drawable.textview_blue_up;
|
||||
}
|
||||
}
|
||||
|
||||
@ -90,25 +86,18 @@ public class NewsUtils {
|
||||
}
|
||||
|
||||
textView.setTextColor(Color.WHITE);
|
||||
switch (type) {
|
||||
case "活动":
|
||||
textView.setBackgroundResource(R.drawable.textview_orange_style);
|
||||
break;
|
||||
case "公告":
|
||||
textView.setBackgroundResource(R.drawable.textview_red_style);
|
||||
break;
|
||||
case "评测":
|
||||
textView.setBackgroundResource(R.drawable.textview_red_style);
|
||||
break;
|
||||
case "杂谈":
|
||||
textView.setBackgroundResource(R.drawable.textview_orange_style);
|
||||
break;
|
||||
case "专题":
|
||||
textView.setBackgroundResource(R.drawable.textview_blue_style);
|
||||
break;
|
||||
default:
|
||||
textView.setBackgroundResource(R.drawable.textview_blue_style);
|
||||
break;
|
||||
if ("活动".equals(type)) {
|
||||
textView.setBackgroundResource(R.drawable.textview_orange_style);
|
||||
} else if ("公告".equals(type)) {
|
||||
textView.setBackgroundResource(R.drawable.textview_red_style);
|
||||
} else if ("评测".equals(type)) {
|
||||
textView.setBackgroundResource(R.drawable.textview_red_style);
|
||||
} else if ("杂谈".equals(type)) {
|
||||
textView.setBackgroundResource(R.drawable.textview_orange_style);
|
||||
} else if ("专题".equals(type)) {
|
||||
textView.setBackgroundResource(R.drawable.textview_blue_style);
|
||||
} else {
|
||||
textView.setBackgroundResource(R.drawable.textview_blue_style);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
116
app/src/main/java/com/gh/common/util/NotificationUtils.java
Normal file
116
app/src/main/java/com/gh/common/util/NotificationUtils.java
Normal file
@ -0,0 +1,116 @@
|
||||
package com.gh.common.util;
|
||||
|
||||
import android.app.Notification;
|
||||
import android.app.NotificationManager;
|
||||
import android.app.PendingIntent;
|
||||
import android.content.Context;
|
||||
import android.content.Intent;
|
||||
import android.support.v4.app.NotificationCompat;
|
||||
|
||||
import com.gh.download.DownloadEntity;
|
||||
import com.gh.download.DownloadManager;
|
||||
import com.gh.download.DownloadStatus;
|
||||
import com.gh.gamecenter.R;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* Created by LGT on 2016/10/10.
|
||||
*/
|
||||
public class NotificationUtils {
|
||||
|
||||
public static final String ACTION_INSTALL = "com.gh.gamecenter.INSTALL";
|
||||
public static final String ACTION_DOWNLOAD = "com.gh.gamecenter.DOWNLOAD";
|
||||
|
||||
// 快传传输完成消息
|
||||
public static void showKuaiChuanDoneNotification(Context context, String apkPath, String apkName, String packName) {
|
||||
NotificationManager manager = getNotificationManager(context);
|
||||
Intent intent = new Intent();
|
||||
intent.putExtra("path", apkPath);
|
||||
intent.setAction(ACTION_INSTALL);
|
||||
PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 0x321,
|
||||
intent, PendingIntent.FLAG_UPDATE_CURRENT);
|
||||
String title = "接收完成,点击立即安装";
|
||||
String text = apkName;
|
||||
|
||||
Notification notification = new NotificationCompat.Builder(context)
|
||||
.setSmallIcon(R.drawable.logo)
|
||||
.setTicker(title)
|
||||
.setContentTitle(text)
|
||||
.setContentText(title)
|
||||
.setContentIntent(pendingIntent).build();
|
||||
notification.flags |= Notification.FLAG_AUTO_CANCEL; // // FLAG_AUTO_CANCEL表明当通知被用户点击时,通知将被清除。
|
||||
manager.notify(packName, 0x321, notification);
|
||||
}
|
||||
|
||||
private static NotificationManager getNotificationManager(Context context) {
|
||||
return (NotificationManager) context.getApplicationContext().getSystemService(Context.NOTIFICATION_SERVICE);
|
||||
}
|
||||
|
||||
public static void showDownloadDoneNotification(Context context, DownloadEntity downloadEntity, int flag) {
|
||||
NotificationManager manager = getNotificationManager(context);
|
||||
Intent intent = new Intent();
|
||||
intent.putExtra("path", downloadEntity.getPath());
|
||||
intent.setAction(ACTION_INSTALL);
|
||||
PendingIntent pendingIntent = PendingIntent.getBroadcast(context, flag,
|
||||
intent, PendingIntent.FLAG_UPDATE_CURRENT);
|
||||
String text;
|
||||
String title;
|
||||
if (downloadEntity.isPluggable()) {
|
||||
title = "下载完成,点击继续插件化";
|
||||
text = downloadEntity.getName() + " - "
|
||||
+ PlatformUtils.getInstance(context).getPlatformName(downloadEntity.getPlatform());
|
||||
} else {
|
||||
if (downloadEntity.isPlugin()) {
|
||||
text = downloadEntity.getName()
|
||||
+ " - " + PlatformUtils.getInstance(context).getPlatformName(downloadEntity.getPlatform());
|
||||
} else {
|
||||
text = downloadEntity.getName();
|
||||
}
|
||||
title = "下载完成,点击立即安装";
|
||||
}
|
||||
Notification notification = new NotificationCompat.Builder(context)
|
||||
.setSmallIcon(R.drawable.logo)
|
||||
.setTicker(title)
|
||||
.setContentTitle(text)
|
||||
.setContentText(title)
|
||||
.setContentIntent(pendingIntent).build();
|
||||
// notification.defaults = Notification.DEFAULT_SOUND;// 添加系统默认声音
|
||||
notification.flags |= Notification.FLAG_AUTO_CANCEL; // // FLAG_AUTO_CANCEL表明当通知被用户点击时,通知将被清除。
|
||||
manager.notify(flag, notification);
|
||||
}
|
||||
|
||||
public static void showDownloadingNotification(Context context) {
|
||||
NotificationManager manager = getNotificationManager(context);
|
||||
int downloadingSize = 0;
|
||||
List<DownloadEntity> all = DownloadManager.getInstance(context).getAll();
|
||||
if (all != null) {
|
||||
for (DownloadEntity entity : all) {
|
||||
if (entity.getStatus().equals(DownloadStatus.downloading)
|
||||
|| entity.getStatus().equals(DownloadStatus.waiting)
|
||||
|| entity.getStatus().equals(DownloadStatus.pause)
|
||||
|| entity.getStatus().equals(DownloadStatus.timeout)
|
||||
|| entity.getStatus().equals(DownloadStatus.neterror)) {
|
||||
downloadingSize++;
|
||||
}
|
||||
}
|
||||
}
|
||||
if (downloadingSize == 0) {
|
||||
manager.cancel(0x123);
|
||||
} else {
|
||||
Intent intent = new Intent();
|
||||
intent.setAction(ACTION_DOWNLOAD);
|
||||
PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 0x123, intent, PendingIntent.FLAG_UPDATE_CURRENT);
|
||||
Notification notification = new NotificationCompat.Builder(context)
|
||||
.setSmallIcon(R.drawable.logo)
|
||||
.setTicker("点击查看详情")
|
||||
.setContentTitle("你有" + downloadingSize + "个游戏正在下载中")
|
||||
.setContentText("点击查看详情")
|
||||
.setContentIntent(pendingIntent).build();
|
||||
// notification.defaults = Notification.DEFAULT_SOUND;// 添加系统默认声音
|
||||
notification.flags |= Notification.FLAG_NO_CLEAR; // 通知无法手动清除
|
||||
manager.notify(0x123, notification);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
@ -57,7 +57,7 @@ public class PackageUtils {
|
||||
return metaDate.get(name);
|
||||
}
|
||||
} catch (NameNotFoundException e) {
|
||||
// e.printStackTrace();
|
||||
e.printStackTrace();
|
||||
}
|
||||
return null;
|
||||
}
|
||||
@ -91,10 +91,12 @@ public class PackageUtils {
|
||||
private static String[] parseSignature(byte[] signature) {
|
||||
String[] ret = null;
|
||||
try {
|
||||
CertificateFactory certFactory = CertificateFactory.getInstance("X.509");
|
||||
X509Certificate cert = (X509Certificate) certFactory.generateCertificate(
|
||||
new ByteArrayInputStream(signature));
|
||||
ret = new String[]{cert.getPublicKey().toString(), cert.getSerialNumber().toString()};
|
||||
CertificateFactory certFactory = CertificateFactory
|
||||
.getInstance("X.509");
|
||||
X509Certificate cert = (X509Certificate) certFactory
|
||||
.generateCertificate(new ByteArrayInputStream(signature));
|
||||
ret = new String[]{cert.getPublicKey().toString(),
|
||||
cert.getSerialNumber().toString()};
|
||||
} catch (CertificateException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
@ -157,8 +159,8 @@ public class PackageUtils {
|
||||
*/
|
||||
public static Intent getUninstallIntent(Context context, String path) {
|
||||
Intent uninstallIntent = new Intent();
|
||||
uninstallIntent.setAction(Intent.ACTION_DELETE);
|
||||
uninstallIntent.addCategory(Intent.CATEGORY_DEFAULT);
|
||||
uninstallIntent.setAction("android.intent.action.DELETE");
|
||||
uninstallIntent.addCategory("android.intent.category.DEFAULT");
|
||||
String packageName = getPackageNameByPath(context, path);
|
||||
uninstallIntent.setData(Uri.parse("package:" + packageName));
|
||||
InstallUtils.getInstance(context).addUninstall(packageName);
|
||||
@ -170,7 +172,8 @@ public class PackageUtils {
|
||||
*/
|
||||
public static String getPackageNameByPath(Context context, String path) {
|
||||
PackageManager packageManager = context.getApplicationContext().getPackageManager();
|
||||
PackageInfo info = packageManager.getPackageArchiveInfo(path, PackageManager.GET_ACTIVITIES);
|
||||
PackageInfo info = packageManager.getPackageArchiveInfo(path,
|
||||
PackageManager.GET_ACTIVITIES);
|
||||
if (info != null) {
|
||||
ApplicationInfo appInfo = info.applicationInfo;
|
||||
return appInfo.packageName;
|
||||
|
||||
@ -28,10 +28,5 @@ public class PatternUtils {
|
||||
return matcher.matches();
|
||||
}
|
||||
|
||||
public static boolean isPhoneNum(String phone) {
|
||||
Matcher matcher = Patterns.PHONE.matcher(phone);
|
||||
return matcher.matches();
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
@ -8,7 +8,6 @@ import android.support.v4.util.ArrayMap;
|
||||
import android.text.TextUtils;
|
||||
|
||||
import com.gh.base.AppController;
|
||||
import com.lightgame.download.FileUtils;
|
||||
import com.gh.gamecenter.R;
|
||||
import com.gh.gamecenter.entity.PlatformEntity;
|
||||
import com.gh.gamecenter.eventbus.EBReuse;
|
||||
|
||||
@ -6,7 +6,6 @@ import com.gh.gamecenter.entity.CommentEntity;
|
||||
import com.gh.gamecenter.retrofit.JSONObjectResponse;
|
||||
import com.gh.gamecenter.retrofit.Response;
|
||||
import com.gh.gamecenter.retrofit.RetrofitManager;
|
||||
import com.lightgame.utils.Utils;
|
||||
|
||||
import org.json.JSONObject;
|
||||
|
||||
|
||||
@ -5,9 +5,6 @@ import android.content.Intent;
|
||||
import android.net.Uri;
|
||||
import android.text.TextUtils;
|
||||
|
||||
import com.lightgame.utils.Util_System_ClipboardManager;
|
||||
import com.lightgame.utils.Utils;
|
||||
|
||||
/**
|
||||
* Created by khy on 2017/3/30.
|
||||
*/
|
||||
|
||||
@ -12,7 +12,6 @@ import com.google.zxing.WriterException;
|
||||
import com.google.zxing.common.BitMatrix;
|
||||
import com.google.zxing.qrcode.QRCodeWriter;
|
||||
import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel;
|
||||
import com.lightgame.utils.Utils;
|
||||
|
||||
import java.io.File;
|
||||
import java.io.FileOutputStream;
|
||||
|
||||
@ -1,12 +1,11 @@
|
||||
package com.gh.common.util;
|
||||
|
||||
import android.Manifest;
|
||||
import android.app.ActivityManager;
|
||||
import android.app.ActivityManager.RunningAppProcessInfo;
|
||||
import android.app.ActivityManager.RunningTaskInfo;
|
||||
import android.content.ComponentName;
|
||||
import android.content.Context;
|
||||
import android.support.annotation.RequiresPermission;
|
||||
import android.os.Looper;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
@ -15,9 +14,9 @@ public class RunningUtils {
|
||||
/**
|
||||
* 判断当前应用程序处于前台还是后台
|
||||
*/
|
||||
@RequiresPermission(Manifest.permission.GET_TASKS)
|
||||
public static boolean isApplicationBroughtToBackground(Context context) {
|
||||
ActivityManager am = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
|
||||
ActivityManager am = (ActivityManager) context
|
||||
.getSystemService(Context.ACTIVITY_SERVICE);
|
||||
List<RunningTaskInfo> tasks = am.getRunningTasks(1);
|
||||
if (!tasks.isEmpty()) {
|
||||
ComponentName topActivity = tasks.get(0).topActivity;
|
||||
@ -33,8 +32,10 @@ public class RunningUtils {
|
||||
* 判断当前应用程序处于前台还是后台
|
||||
*/
|
||||
public static boolean isBackground(Context context) {
|
||||
ActivityManager activityManager = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
|
||||
List<RunningAppProcessInfo> appProcesses = activityManager.getRunningAppProcesses();
|
||||
ActivityManager activityManager = (ActivityManager) context
|
||||
.getSystemService(Context.ACTIVITY_SERVICE);
|
||||
List<RunningAppProcessInfo> appProcesses = activityManager
|
||||
.getRunningAppProcesses();
|
||||
for (RunningAppProcessInfo appProcess : appProcesses) {
|
||||
if (appProcess.processName.equals(context.getPackageName())) {
|
||||
if (appProcess.importance == RunningAppProcessInfo.IMPORTANCE_BACKGROUND) {
|
||||
@ -50,7 +51,6 @@ public class RunningUtils {
|
||||
/**
|
||||
* 判断当前topactivity是否与传入的相同
|
||||
*/
|
||||
@RequiresPermission(Manifest.permission.GET_TASKS)
|
||||
public static boolean isEqualsTop(Context context, String activityName) {
|
||||
ActivityManager activityManager = (ActivityManager) context
|
||||
.getSystemService(Context.ACTIVITY_SERVICE);
|
||||
@ -66,7 +66,6 @@ public class RunningUtils {
|
||||
/**
|
||||
* 判断当前baseActivity是否与传入的相同
|
||||
*/
|
||||
@RequiresPermission(Manifest.permission.GET_TASKS)
|
||||
public static boolean isEqualsBase(Context context, String activityName) {
|
||||
ActivityManager activityManager = (ActivityManager) context
|
||||
.getSystemService(Context.ACTIVITY_SERVICE);
|
||||
@ -82,7 +81,6 @@ public class RunningUtils {
|
||||
/**
|
||||
* 判断应用是否正在运行
|
||||
*/
|
||||
@RequiresPermission(Manifest.permission.GET_TASKS)
|
||||
public static boolean isRunning(Context context) {
|
||||
ActivityManager activityManager = (ActivityManager) context
|
||||
.getSystemService(Context.ACTIVITY_SERVICE);
|
||||
@ -99,7 +97,6 @@ public class RunningUtils {
|
||||
/**
|
||||
* 获取当前baseActivity
|
||||
*/
|
||||
@RequiresPermission(Manifest.permission.GET_TASKS)
|
||||
public static String getBaseActivity(Context context) {
|
||||
ActivityManager activityManager = (ActivityManager) context
|
||||
.getSystemService(Context.ACTIVITY_SERVICE);
|
||||
@ -115,7 +112,6 @@ public class RunningUtils {
|
||||
/**
|
||||
* 获取当前topActivity
|
||||
*/
|
||||
@RequiresPermission(Manifest.permission.GET_TASKS)
|
||||
public static String getTopActivity(Context context) {
|
||||
ActivityManager activityManager = (ActivityManager) context
|
||||
.getSystemService(Context.ACTIVITY_SERVICE);
|
||||
@ -129,4 +125,17 @@ public class RunningUtils {
|
||||
return null;
|
||||
}
|
||||
|
||||
//TODO 未经测试代码
|
||||
public static void runOnUI(Context context, Runnable runnable) {
|
||||
if (isInUiThread()) {
|
||||
Looper.prepare();
|
||||
runnable.run();
|
||||
Looper.loop();
|
||||
}
|
||||
}
|
||||
|
||||
public static boolean isInUiThread() {
|
||||
return Looper.myLooper() == Looper.getMainLooper();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
81
app/src/main/java/com/gh/common/util/RuntimeUtils.java
Normal file
81
app/src/main/java/com/gh/common/util/RuntimeUtils.java
Normal file
@ -0,0 +1,81 @@
|
||||
package com.gh.common.util;
|
||||
|
||||
import android.content.Context;
|
||||
import android.os.Handler;
|
||||
import android.os.Looper;
|
||||
import android.widget.Toast;
|
||||
|
||||
/**
|
||||
* @author CsHeng
|
||||
* @Date 31/05/2017
|
||||
* @Time 9:58 AM
|
||||
*/
|
||||
|
||||
public class RuntimeUtils {
|
||||
|
||||
private static final byte[] LOCK = new byte[0];
|
||||
|
||||
private static RuntimeUtils sInstance;
|
||||
|
||||
private Handler mHandler;
|
||||
|
||||
private RuntimeUtils() {
|
||||
mHandler = new Handler(Looper.getMainLooper());
|
||||
}
|
||||
|
||||
public static RuntimeUtils getInstance() {
|
||||
if (sInstance == null) {
|
||||
synchronized (LOCK) {
|
||||
if (sInstance == null) {
|
||||
sInstance = new RuntimeUtils();
|
||||
}
|
||||
}
|
||||
}
|
||||
return sInstance;
|
||||
}
|
||||
|
||||
public static boolean isOnUIThread() {
|
||||
return Looper.myLooper() == Looper.getMainLooper();
|
||||
}
|
||||
|
||||
public void runOnUiThread(Runnable runnable) {
|
||||
if (runnable == null) {
|
||||
throw new IllegalArgumentException("Runnable should not be null");
|
||||
}
|
||||
mHandler.post(runnable);
|
||||
}
|
||||
|
||||
public void runOnUiThread(Runnable runnable, long delayMillis) {
|
||||
if (runnable == null || delayMillis < 0) {
|
||||
throw new IllegalArgumentException("Runnable should not be null and Delaymillis should not be negative");
|
||||
}
|
||||
mHandler.postDelayed(runnable, delayMillis);
|
||||
}
|
||||
|
||||
public void toast(final Context context, final CharSequence message) {
|
||||
runOnUiThread(new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
Toast.makeText(context, message, Toast.LENGTH_SHORT).show();
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
public void toastLong(final Context context, final CharSequence message) {
|
||||
runOnUiThread(new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
Toast.makeText(context, message, Toast.LENGTH_LONG).show();
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
public Handler getHandler() {
|
||||
return mHandler;
|
||||
}
|
||||
|
||||
public void removeRunnable() {
|
||||
mHandler.removeCallbacksAndMessages(null);
|
||||
}
|
||||
|
||||
}
|
||||
@ -31,9 +31,6 @@ import com.facebook.imagepipeline.image.CloseableImage;
|
||||
import com.gh.common.constant.Config;
|
||||
import com.gh.gamecenter.R;
|
||||
import com.gh.gamecenter.WeiBoShareActivity;
|
||||
import com.lightgame.utils.Utils;
|
||||
import com.sina.weibo.sdk.WbSdk;
|
||||
import com.sina.weibo.sdk.auth.AuthInfo;
|
||||
import com.tencent.connect.share.QQShare;
|
||||
import com.tencent.connect.share.QzoneShare;
|
||||
import com.tencent.mm.sdk.openapi.IWXAPI;
|
||||
@ -50,8 +47,6 @@ import java.io.ByteArrayOutputStream;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
import static com.gh.common.util.GetLoginDataUtils.SCOPE;
|
||||
|
||||
/**
|
||||
* Created by khy on 2016/9/4.
|
||||
*/
|
||||
@ -87,24 +82,23 @@ public class ShareUtils {
|
||||
public IUiListener QqShareListener = new IUiListener() {
|
||||
@Override
|
||||
public void onComplete(Object o) {
|
||||
Utils.toast(mContext, mContext.getString(R.string.share_success_hint));
|
||||
Utils.toast(mContext, "分享成功");
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onError(UiError uiError) {
|
||||
Utils.toast(mContext, mContext.getString(R.string.share_fail_hint));
|
||||
Utils.toast(mContext, "分享失败");
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onCancel() {
|
||||
Utils.toast(mContext, mContext.getString(R.string.share_cancel_hint));
|
||||
Utils.toast(mContext, "分享已取消");
|
||||
}
|
||||
};
|
||||
|
||||
private ShareUtils(Context context) {
|
||||
mTencent = Tencent.createInstance(Config.TENCENT_APPID, context); //初始化QQ分享
|
||||
mIWXAPI = WXAPIFactory.createWXAPI(context, Config.WECHAT_APPID); //初始化微信分享
|
||||
WbSdk.install(context,new AuthInfo(context, Config.WEIBO_APPKEY, "http://www.sina.com", SCOPE));
|
||||
mContext = context;
|
||||
}
|
||||
|
||||
@ -210,7 +204,7 @@ public class ShareUtils {
|
||||
|
||||
//QQ分享
|
||||
private void qqSahre() {
|
||||
Utils.toast(mContext, mContext.getString(R.string.share_skip));
|
||||
Utils.toast(mContext, "分享跳转中...");
|
||||
Bundle params = new Bundle();
|
||||
|
||||
String title;
|
||||
@ -252,7 +246,7 @@ public class ShareUtils {
|
||||
|
||||
//微信好友分享
|
||||
private void wechatSahre() {
|
||||
Utils.toast(mContext, mContext.getString(R.string.share_skip));
|
||||
Utils.toast(mContext, "分享跳转中...");
|
||||
WXWebpageObject webpage = new WXWebpageObject();
|
||||
WXMediaMessage msg = new WXMediaMessage(webpage);
|
||||
webpage.webpageUrl = shareUrl;
|
||||
@ -299,7 +293,7 @@ public class ShareUtils {
|
||||
}
|
||||
|
||||
private void loadBitMap(final String iconUrl, final WXMediaMessage msg, final SendMessageToWX.Req req) {
|
||||
ImageUtils.Companion.getInstance().display(mContext, iconUrl, new BaseBitmapDataSubscriber() {
|
||||
ImageUtils.getInstance().display(mContext, iconUrl, new BaseBitmapDataSubscriber() {
|
||||
@Override
|
||||
protected void onNewResultImpl(Bitmap bitmap) {
|
||||
Bitmap compressBp = compressBitmap(bitmap);
|
||||
@ -364,7 +358,7 @@ public class ShareUtils {
|
||||
|
||||
//QQ空间分享
|
||||
private void qZoneSahre() {
|
||||
Utils.toast(mContext, mContext.getString(R.string.share_skip));
|
||||
Utils.toast(mContext, "分享跳转中...");
|
||||
Bundle params = new Bundle();
|
||||
|
||||
String title;
|
||||
@ -410,7 +404,7 @@ public class ShareUtils {
|
||||
|
||||
//微信朋友圈分享
|
||||
private void wechatMomentsSahre() {
|
||||
Utils.toast(mContext, mContext.getString(R.string.share_skip));
|
||||
Utils.toast(mContext, "分享跳转中...");
|
||||
WXWebpageObject webpage = new WXWebpageObject();
|
||||
WXMediaMessage msg = new WXMediaMessage(webpage);
|
||||
|
||||
|
||||
@ -1,84 +0,0 @@
|
||||
package com.gh.common.util;
|
||||
|
||||
import android.app.Activity;
|
||||
import android.graphics.Rect;
|
||||
import android.os.Build;
|
||||
import android.view.View;
|
||||
import android.view.ViewTreeObserver;
|
||||
import android.widget.FrameLayout;
|
||||
|
||||
/**
|
||||
* 用于解决因为沉浸式状态栏时键盘不遮挡输入框
|
||||
*/
|
||||
public class SoftInputHidWidgetUtils {
|
||||
private View mChildOfContent;
|
||||
private int usableHeightPrevious;
|
||||
private FrameLayout.LayoutParams frameLayoutParams;
|
||||
private int contentHeight;
|
||||
private boolean isfirst = true;
|
||||
private int statusBarHeight;
|
||||
|
||||
public static void assistActivity(Activity activity) {
|
||||
if (Build.VERSION.SDK_INT >= 19) {
|
||||
new SoftInputHidWidgetUtils(activity);
|
||||
}
|
||||
}
|
||||
|
||||
private SoftInputHidWidgetUtils(Activity activity) {
|
||||
statusBarHeight = getStatusBarHeight(activity);
|
||||
FrameLayout content = (FrameLayout)activity.findViewById(android.R.id.content);
|
||||
mChildOfContent = content.getChildAt(0);
|
||||
|
||||
//界面出现变动都会调用这个监听事件
|
||||
mChildOfContent.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
|
||||
public void onGlobalLayout() {
|
||||
if (isfirst) {
|
||||
contentHeight = mChildOfContent.getHeight();//兼容华为等机型
|
||||
isfirst = false;
|
||||
}
|
||||
possiblyResizeChildOfContent();
|
||||
}
|
||||
});
|
||||
|
||||
frameLayoutParams = (FrameLayout.LayoutParams) mChildOfContent.getLayoutParams();
|
||||
}
|
||||
|
||||
//重新调整跟布局的高度
|
||||
private void possiblyResizeChildOfContent() {
|
||||
|
||||
int usableHeightNow = computeUsableHeight();
|
||||
//当前可见高度和上一次可见高度不一致 布局变动
|
||||
if (usableHeightNow != usableHeightPrevious) {
|
||||
int usableHeightSansKeyboard = mChildOfContent.getRootView().getHeight();
|
||||
int heightDifference = usableHeightSansKeyboard - usableHeightNow;
|
||||
if (heightDifference > (usableHeightSansKeyboard / 4)) {
|
||||
// keyboard probably just became visible
|
||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT){
|
||||
frameLayoutParams.height = usableHeightSansKeyboard - heightDifference + statusBarHeight;
|
||||
} else {
|
||||
frameLayoutParams.height = usableHeightSansKeyboard - heightDifference;
|
||||
}
|
||||
} else {
|
||||
frameLayoutParams.height = contentHeight;
|
||||
}
|
||||
mChildOfContent.requestLayout();
|
||||
usableHeightPrevious = usableHeightNow;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取改变之后界面的可用高度(可以为开发者显示内容的高度)
|
||||
* @return
|
||||
*/
|
||||
private int computeUsableHeight() {
|
||||
Rect r = new Rect();
|
||||
mChildOfContent.getWindowVisibleDisplayFrame(r);//获取到的rect就是界面除去标题栏、除去软键盘挡住部分,所剩下的域
|
||||
return (r.bottom - r.top);
|
||||
}
|
||||
|
||||
public static int getStatusBarHeight(Activity activity) {
|
||||
//获取状态栏的高度
|
||||
int resourceId = activity.getResources().getIdentifier("status_bar_height", "dimen", "android");
|
||||
return activity.getResources().getDimensionPixelSize(resourceId);
|
||||
}
|
||||
}
|
||||
@ -23,78 +23,78 @@ public class TimestampUtils {
|
||||
|
||||
private static void initIntervalMap() {
|
||||
intervalMap = new ArrayMap<>();
|
||||
intervalMap.put("^" + Config.HOST + "index/slides" + "$", 5);
|
||||
intervalMap.put("^" + Config.HOST + "game/chajian" + "$", 10);
|
||||
intervalMap.put("^" + Config.HOST + "game/tuijian" + "$", 15);
|
||||
intervalMap.put("^" + Config.HOST + "game/.+/detail" + "$", 20);
|
||||
intervalMap.put("^" + Config.HOST + "game/.+/digest" + "$", 25);
|
||||
intervalMap.put("^" + Config.HOST + "game/remenkapai" + "$", 30);
|
||||
intervalMap.put("^" + Config.HOST + "game/.+/news_digest" + "$", 35);
|
||||
intervalMap.put("^" + Config.HOST + "game/column/.+\\?page=.+" + "$", 40);
|
||||
intervalMap.put("^" + Config.HOST + "support/package/.+/game/digest" + "$", 45);
|
||||
intervalMap.put("^" + Config.HOST + "game/danjiyouxi\\?limit=20\\&offset=.+" + "$", 50);
|
||||
intervalMap.put("^" + Config.HOST + "news/.+/digest" + "$", 55);
|
||||
intervalMap.put("^" + Config.HOST + "news/.+/detail" + "$", 60);
|
||||
intervalMap.put("^" + Config.HOST + "news/.+/suggestion" + "$", 65);
|
||||
intervalMap.put("^" + Config.HOST + "game/.+/news\\?limit=3" + "$", 70);
|
||||
intervalMap.put("^" + Config.HOST + "zixun/zixun\\?limit=20\\&offset=.+" + "$", 75);
|
||||
intervalMap.put("^" + Config.HOST + "game/.+/news\\?limit=20\\&offset=.+" + "$", 80);
|
||||
intervalMap.put("^" + Config.HOST + "zixun/yuanchuang\\?limit=20\\&offset=.+" + "$", 85);
|
||||
intervalMap.put("^" + Config.HOST + "news\\?type_group=.+\\&offset=.+\\&limit=20" + "$", 90);
|
||||
intervalMap.put("^" + Config.HOST + "zixun/guanzhu\\?key=.+\\&limit=20\\&offset=.+" + "$", 95);
|
||||
intervalMap.put("^" + Config.HOST + "game/.+/news\\?limit=20\\&offset=.+\\&type=.+" + "$", 100);
|
||||
intervalMap.put("^" + Config.HOST + "zixun/guanzhu\\?game_id=.+\\&limit=20\\&offset=.+" + "$", 105);
|
||||
intervalMap.put("^" + Config.HOST + "search/news\\?game_id=.+\\&keyword=.+\\&page=.+\\&limit=20" + "$", 110);
|
||||
intervalMap.put("^" + Config.HOST + "search/game\\?keyword=.+" + "$", 115);
|
||||
intervalMap.put("^" + Config.HOST + "support/setting/platform" + "$", 120);
|
||||
intervalMap.put("^" + Config.HOST + "update/package/.+" + "$", 125);
|
||||
intervalMap.put("^" + Config.HOST + "update/game/.+/package/.+" + "$", 130);
|
||||
intervalMap.put("^" + Config.API_HOST + "index/slides" + "$", 5);
|
||||
intervalMap.put("^" + Config.API_HOST + "game/chajian" + "$", 10);
|
||||
intervalMap.put("^" + Config.API_HOST + "game/tuijian" + "$", 15);
|
||||
intervalMap.put("^" + Config.API_HOST + "game/.+/detail" + "$", 20);
|
||||
intervalMap.put("^" + Config.API_HOST + "game/.+/digest" + "$", 25);
|
||||
intervalMap.put("^" + Config.API_HOST + "game/remenkapai" + "$", 30);
|
||||
intervalMap.put("^" + Config.API_HOST + "game/.+/news_digest" + "$", 35);
|
||||
intervalMap.put("^" + Config.API_HOST + "game/column/.+\\?page=.+" + "$", 40);
|
||||
intervalMap.put("^" + Config.API_HOST + "support/package/.+/game/digest" + "$", 45);
|
||||
intervalMap.put("^" + Config.API_HOST + "game/danjiyouxi\\?limit=20\\&offset=.+" + "$", 50);
|
||||
intervalMap.put("^" + Config.API_HOST + "news/.+/digest" + "$", 55);
|
||||
intervalMap.put("^" + Config.API_HOST + "news/.+/detail" + "$", 60);
|
||||
intervalMap.put("^" + Config.API_HOST + "news/.+/suggestion" + "$", 65);
|
||||
intervalMap.put("^" + Config.API_HOST + "game/.+/news\\?limit=3" + "$", 70);
|
||||
intervalMap.put("^" + Config.API_HOST + "zixun/zixun\\?limit=20\\&offset=.+" + "$", 75);
|
||||
intervalMap.put("^" + Config.API_HOST + "game/.+/news\\?limit=20\\&offset=.+" + "$", 80);
|
||||
intervalMap.put("^" + Config.API_HOST + "zixun/yuanchuang\\?limit=20\\&offset=.+" + "$", 85);
|
||||
intervalMap.put("^" + Config.API_HOST + "news\\?type_group=.+\\&offset=.+\\&limit=20" + "$", 90);
|
||||
intervalMap.put("^" + Config.API_HOST + "zixun/guanzhu\\?key=.+\\&limit=20\\&offset=.+" + "$", 95);
|
||||
intervalMap.put("^" + Config.API_HOST + "game/.+/news\\?limit=20\\&offset=.+\\&type=.+" + "$", 100);
|
||||
intervalMap.put("^" + Config.API_HOST + "zixun/guanzhu\\?game_id=.+\\&limit=20\\&offset=.+" + "$", 105);
|
||||
intervalMap.put("^" + Config.API_HOST + "search/news\\?game_id=.+\\&keyword=.+\\&page=.+\\&limit=20" + "$", 110);
|
||||
intervalMap.put("^" + Config.API_HOST + "search/game\\?keyword=.+" + "$", 115);
|
||||
intervalMap.put("^" + Config.API_HOST + "support/setting/platform" + "$", 120);
|
||||
intervalMap.put("^" + Config.API_HOST + "update/package/.+" + "$", 125);
|
||||
intervalMap.put("^" + Config.API_HOST + "update/game/.+/package/.+" + "$", 130);
|
||||
intervalMap.put("^" + Config.COMMENT_HOST + "article/.+/comment\\?limit=10\\&offset=.+" + "$", 135);
|
||||
intervalMap.put("^" + Config.COMMENT_HOST + "article/.+/comment\\?order=hot\\&limit=10\\&offset=.+" + "$", 140);
|
||||
}
|
||||
|
||||
private static void initCDMap() {
|
||||
cdMap = new ArrayMap<>();
|
||||
cdMap.put("^" + Config.HOST + "index/slides" + "$", Constants.GAME_CD);
|
||||
cdMap.put("^" + Config.HOST + "game/chajian" + "$", Constants.GAME_CD);
|
||||
cdMap.put("^" + Config.HOST + "game/tuijian" + "$", Constants.GAME_CD);
|
||||
cdMap.put("^" + Config.HOST + "game/.+/detail" + "$", Constants.GAME_CD);
|
||||
cdMap.put("^" + Config.HOST + "game/.+/digest" + "$", Constants.GAME_CD);
|
||||
cdMap.put("^" + Config.HOST + "game/remenkapai" + "$", Constants.GAME_CD);
|
||||
cdMap.put("^" + Config.HOST + "game/.+/news_digest" + "$", Constants.GAME_CD);
|
||||
cdMap.put("^" + Config.HOST + "game/column/.+\\?page=.+" + "$", Constants.GAME_CD);
|
||||
cdMap.put("^" + Config.HOST + "support/package/.+/game/digest" + "$", Constants.GAME_CD);
|
||||
cdMap.put("^" + Config.HOST + "game/danjiyouxi\\?limit=20\\&offset=.+" + "$", Constants.GAME_CD);
|
||||
cdMap.put("^" + Config.HOST + "news/.+/digest" + "$", Constants.NEWS_CD);
|
||||
cdMap.put("^" + Config.HOST + "news/.+/detail" + "$", Constants.NEWS_CD);
|
||||
cdMap.put("^" + Config.HOST + "news/.+/suggestion" + "$", Constants.NEWS_CD);
|
||||
cdMap.put("^" + Config.HOST + "game/.+/news\\?limit=3" + "$", Constants.NEWS_CD);
|
||||
cdMap.put("^" + Config.HOST + "zixun/zixun\\?limit=20\\&offset=.+" + "$", Constants.NEWS_CD);
|
||||
cdMap.put("^" + Config.HOST + "game/.+/news\\?limit=20\\&offset=.+" + "$", Constants.NEWS_CD);
|
||||
cdMap.put("^" + Config.HOST + "zixun/yuanchuang\\?limit=10\\&offset=.+" + "$", Constants.NEWS_CD);
|
||||
cdMap.put("^" + Config.HOST + "news\\?type_group=.+\\&offset=.+\\&limit=20" + "$", Constants.NEWS_CD);
|
||||
cdMap.put("^" + Config.HOST + "zixun/guanzhu\\?key=.+\\&limit=20\\&offset=.+" + "$", Constants.NEWS_CD);
|
||||
cdMap.put("^" + Config.HOST + "game/.+/news\\?limit=20\\&offset=.+\\&type=.+" + "$", Constants.NEWS_CD);
|
||||
cdMap.put("^" + Config.HOST + "zixun/guanzhu\\?game_id=.+\\&limit=20\\&offset=.+" + "$", Constants.NEWS_CD);
|
||||
cdMap.put("^" + Config.HOST + "search/news\\?game_id=.+\\&keyword=.+\\&page=.+\\&limit=20" + "$", Constants.NEWS_CD);
|
||||
cdMap.put("^" + Config.HOST + "search/game\\?keyword=.+" + "$", Constants.SEARCH_CD);
|
||||
cdMap.put("^" + Config.HOST + "support/setting/platform" + "$", Constants.PLATFORM_CD);
|
||||
cdMap.put("^" + Config.HOST + "update/package/.+" + "$", Constants.UPDATE_CD);
|
||||
cdMap.put("^" + Config.HOST + "update/game/.+/package/.+" + "$", Constants.UPDATE_CD);
|
||||
cdMap.put("^" + Config.API_HOST + "index/slides" + "$", Constants.GAME_CD);
|
||||
cdMap.put("^" + Config.API_HOST + "game/chajian" + "$", Constants.GAME_CD);
|
||||
cdMap.put("^" + Config.API_HOST + "game/tuijian" + "$", Constants.GAME_CD);
|
||||
cdMap.put("^" + Config.API_HOST + "game/.+/detail" + "$", Constants.GAME_CD);
|
||||
cdMap.put("^" + Config.API_HOST + "game/.+/digest" + "$", Constants.GAME_CD);
|
||||
cdMap.put("^" + Config.API_HOST + "game/remenkapai" + "$", Constants.GAME_CD);
|
||||
cdMap.put("^" + Config.API_HOST + "game/.+/news_digest" + "$", Constants.GAME_CD);
|
||||
cdMap.put("^" + Config.API_HOST + "game/column/.+\\?page=.+" + "$", Constants.GAME_CD);
|
||||
cdMap.put("^" + Config.API_HOST + "support/package/.+/game/digest" + "$", Constants.GAME_CD);
|
||||
cdMap.put("^" + Config.API_HOST + "game/danjiyouxi\\?limit=20\\&offset=.+" + "$", Constants.GAME_CD);
|
||||
cdMap.put("^" + Config.API_HOST + "news/.+/digest" + "$", Constants.NEWS_CD);
|
||||
cdMap.put("^" + Config.API_HOST + "news/.+/detail" + "$", Constants.NEWS_CD);
|
||||
cdMap.put("^" + Config.API_HOST + "news/.+/suggestion" + "$", Constants.NEWS_CD);
|
||||
cdMap.put("^" + Config.API_HOST + "game/.+/news\\?limit=3" + "$", Constants.NEWS_CD);
|
||||
cdMap.put("^" + Config.API_HOST + "zixun/zixun\\?limit=20\\&offset=.+" + "$", Constants.NEWS_CD);
|
||||
cdMap.put("^" + Config.API_HOST + "game/.+/news\\?limit=20\\&offset=.+" + "$", Constants.NEWS_CD);
|
||||
cdMap.put("^" + Config.API_HOST + "zixun/yuanchuang\\?limit=10\\&offset=.+" + "$", Constants.NEWS_CD);
|
||||
cdMap.put("^" + Config.API_HOST + "news\\?type_group=.+\\&offset=.+\\&limit=20" + "$", Constants.NEWS_CD);
|
||||
cdMap.put("^" + Config.API_HOST + "zixun/guanzhu\\?key=.+\\&limit=20\\&offset=.+" + "$", Constants.NEWS_CD);
|
||||
cdMap.put("^" + Config.API_HOST + "game/.+/news\\?limit=20\\&offset=.+\\&type=.+" + "$", Constants.NEWS_CD);
|
||||
cdMap.put("^" + Config.API_HOST + "zixun/guanzhu\\?game_id=.+\\&limit=20\\&offset=.+" + "$", Constants.NEWS_CD);
|
||||
cdMap.put("^" + Config.API_HOST + "search/news\\?game_id=.+\\&keyword=.+\\&page=.+\\&limit=20" + "$", Constants.NEWS_CD);
|
||||
cdMap.put("^" + Config.API_HOST + "search/game\\?keyword=.+" + "$", Constants.SEARCH_CD);
|
||||
cdMap.put("^" + Config.API_HOST + "support/setting/platform" + "$", Constants.PLATFORM_CD);
|
||||
cdMap.put("^" + Config.API_HOST + "update/package/.+" + "$", Constants.UPDATE_CD);
|
||||
cdMap.put("^" + Config.API_HOST + "update/game/.+/package/.+" + "$", Constants.UPDATE_CD);
|
||||
cdMap.put("^" + Config.COMMENT_HOST + "article/.+/comment\\?limit=10\\&offset=.+" + "$", Constants.COMMENT_CD);
|
||||
cdMap.put("^" + Config.COMMENT_HOST + "article/.+/comment\\?order=hot\\&limit=10\\&offset=.+" + "$", Constants.COMMENT_CD);
|
||||
cdMap.put("^" + Config.HOST + "device/.+/concern" + "$", 0);
|
||||
cdMap.put("^" + Config.HOST + "device/.+/concern/.+" + "$", 0);
|
||||
cdMap.put("^" + Config.HOST + "stat/download" + "$", 0);
|
||||
cdMap.put("^" + Config.HOST + "disclaimer" + "$", 0);
|
||||
cdMap.put("^" + Config.HOST + "search/game/default" + "$", 0);
|
||||
cdMap.put("^" + Config.HOST + "support/upgrade\\?version=.+\\&channel=.+" + "$", 0);
|
||||
cdMap.put("^" + Config.HOST + "support/time/current" + "$", 0);
|
||||
cdMap.put("^" + Config.HOST + "support/setting/ui" + "$", 0);
|
||||
cdMap.put("^" + Config.HOST + "support/download_status\\?version=.+\\&channel=.+" + "$", 0);
|
||||
cdMap.put("^" + Config.HOST + "support/suggestion" + "$", 0);
|
||||
cdMap.put("^" + Config.HOST + "game/.+/serverInfo" + "$", 0);
|
||||
cdMap.put("^" + Config.HOST + "support/package/unused\\?skip=.+" + "$", 0);
|
||||
cdMap.put("^" + Config.API_HOST + "device/.+/concern" + "$", 0);
|
||||
cdMap.put("^" + Config.API_HOST + "device/.+/concern/.+" + "$", 0);
|
||||
cdMap.put("^" + Config.API_HOST + "stat/download" + "$", 0);
|
||||
cdMap.put("^" + Config.API_HOST + "disclaimer" + "$", 0);
|
||||
cdMap.put("^" + Config.API_HOST + "search/game/default" + "$", 0);
|
||||
cdMap.put("^" + Config.API_HOST + "support/upgrade\\?version=.+\\&channel=.+" + "$", 0);
|
||||
cdMap.put("^" + Config.API_HOST + "support/time/current" + "$", 0);
|
||||
cdMap.put("^" + Config.API_HOST + "support/setting/ui" + "$", 0);
|
||||
cdMap.put("^" + Config.API_HOST + "support/download_status\\?version=.+\\&channel=.+" + "$", 0);
|
||||
cdMap.put("^" + Config.API_HOST + "support/suggestion" + "$", 0);
|
||||
cdMap.put("^" + Config.API_HOST + "game/.+/serverInfo" + "$", 0);
|
||||
cdMap.put("^" + Config.API_HOST + "support/package/unused\\?skip=.+" + "$", 0);
|
||||
}
|
||||
|
||||
/*
|
||||
|
||||
@ -6,17 +6,15 @@ import android.content.SharedPreferences.Editor;
|
||||
import android.net.wifi.WifiManager;
|
||||
import android.os.Build;
|
||||
import android.os.Environment;
|
||||
import android.preference.PreferenceManager;
|
||||
import android.provider.Settings;
|
||||
import android.text.TextUtils;
|
||||
|
||||
import com.gh.common.constant.Config;
|
||||
import com.gh.gamecenter.BuildConfig;
|
||||
import com.gh.gamecenter.retrofit.JSONObjectResponse;
|
||||
import com.gh.gamecenter.retrofit.Response;
|
||||
import com.gh.gamecenter.retrofit.RetrofitManager;
|
||||
import com.gh.gamecenter.retrofit.StringResponse;
|
||||
import com.lightgame.utils.Util_System_Phone_State;
|
||||
import com.lightgame.utils.Utils;
|
||||
import com.tencent.stat.StatConfig;
|
||||
|
||||
import org.json.JSONException;
|
||||
@ -60,14 +58,14 @@ public class TokenUtils {
|
||||
if (!TextUtils.isEmpty(mac) || !":::::".equals(mac)) {
|
||||
params.put("MAC", mac);
|
||||
} else {
|
||||
SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(context);
|
||||
SharedPreferences sp = context.getSharedPreferences(Config.PREFERENCE, Context.MODE_PRIVATE);
|
||||
sp.edit().putBoolean("isUploadMac", false).apply();
|
||||
}
|
||||
String mid = StatConfig.getMid(context);
|
||||
if (!TextUtils.isEmpty(mid) || !"0".equals(mid)) {
|
||||
params.put("MTA_ID", mid);
|
||||
} else {
|
||||
SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(context);
|
||||
SharedPreferences sp = context.getSharedPreferences(Config.PREFERENCE, Context.MODE_PRIVATE);
|
||||
sp.edit().putBoolean("isUploadMid", false).apply();
|
||||
}
|
||||
RequestBody body = RequestBody.create(MediaType.parse("application/json"), new JSONObject(params).toString());
|
||||
@ -100,7 +98,7 @@ public class TokenUtils {
|
||||
|
||||
//将uuid存到sp
|
||||
private static void saveSharedPreferences(Context context, String device_id) {
|
||||
SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(context);
|
||||
SharedPreferences sp = context.getSharedPreferences(Config.PREFERENCE, Context.MODE_PRIVATE);
|
||||
SharedPreferences.Editor edit = sp.edit();
|
||||
edit.putString("uuid", device_id);
|
||||
edit.apply();
|
||||
@ -156,7 +154,7 @@ public class TokenUtils {
|
||||
public static synchronized Observable<String> getToken(final Context context, boolean isCheck) {
|
||||
String token = null;
|
||||
if (isCheck) {
|
||||
SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(context);
|
||||
SharedPreferences sp = context.getSharedPreferences(Config.PREFERENCE, Context.MODE_PRIVATE);
|
||||
token = sp.getString("token", null);
|
||||
if (token != null) {
|
||||
long expire = sp.getLong("token_expire", 0) * 1000 - 10 * 1000;
|
||||
@ -178,7 +176,7 @@ public class TokenUtils {
|
||||
public Observable<String> call(ResponseBody responseBody) {
|
||||
String value = null;
|
||||
try {
|
||||
SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(context);
|
||||
SharedPreferences sp = context.getSharedPreferences(Config.PREFERENCE, Context.MODE_PRIVATE);
|
||||
Editor editor = sp.edit();
|
||||
JSONObject response = new JSONObject(responseBody.string());
|
||||
editor.putString("user_name", response.getString("name"));
|
||||
@ -211,7 +209,7 @@ public class TokenUtils {
|
||||
|
||||
// 获取服务器时间
|
||||
public static synchronized void getTime(Context context) {
|
||||
final SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(context);
|
||||
final SharedPreferences sp = context.getSharedPreferences(Config.PREFERENCE, Context.MODE_PRIVATE);
|
||||
RetrofitManager.getApi().getTime()
|
||||
.subscribeOn(Schedulers.io())
|
||||
.observeOn(AndroidSchedulers.mainThread())
|
||||
@ -234,7 +232,7 @@ public class TokenUtils {
|
||||
|
||||
//读取SharedPreferences的uuid
|
||||
private static String loadSharedPreferences(Context context, boolean isCheck) {
|
||||
SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(context);
|
||||
SharedPreferences sp = context.getSharedPreferences(Config.PREFERENCE, Context.MODE_PRIVATE);
|
||||
String uuid = sp.getString("uuid", null);
|
||||
if (isCheck) {
|
||||
return uuid;
|
||||
@ -306,7 +304,7 @@ public class TokenUtils {
|
||||
|
||||
// 检查设备信息是否已经上传完整
|
||||
public static synchronized void checkDeviceInfo(Context context, String token) {
|
||||
final SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(context);
|
||||
final SharedPreferences sp = context.getSharedPreferences(Config.PREFERENCE, Context.MODE_PRIVATE);
|
||||
final HashMap<String, String> params = new HashMap<>();
|
||||
if (!sp.getBoolean("isUploadExtra", false)) {
|
||||
params.put("MANUFACTURER", Build.MANUFACTURER);
|
||||
|
||||
@ -0,0 +1,123 @@
|
||||
package com.gh.common.util;
|
||||
|
||||
import android.content.ClipData;
|
||||
import android.content.ClipDescription;
|
||||
import android.content.ClipboardManager;
|
||||
import android.content.Context;
|
||||
import android.os.Build;
|
||||
|
||||
/**
|
||||
* 剪切板使用(暂时只支持文字剪切)
|
||||
*/
|
||||
public class Util_System_ClipboardManager {
|
||||
|
||||
/**
|
||||
* 保存文字到剪切板中
|
||||
*
|
||||
* @param str
|
||||
* @return
|
||||
*/
|
||||
public static boolean setText(Context context, String str) {
|
||||
|
||||
if (context == null) {
|
||||
return false;
|
||||
}
|
||||
Context appliactionContext = null;
|
||||
try {
|
||||
appliactionContext = context.getApplicationContext();
|
||||
} catch (Exception e) {
|
||||
}
|
||||
if (appliactionContext == null) {
|
||||
return false;
|
||||
}
|
||||
|
||||
// 如果当前设备的android-sdk 版本号小于11
|
||||
if (Build.VERSION.SDK_INT < 11) {
|
||||
try {
|
||||
android.text.ClipboardManager clipManager = (android.text.ClipboardManager) appliactionContext
|
||||
.getSystemService(Context.CLIPBOARD_SERVICE);
|
||||
clipManager.setText(str);
|
||||
return true;
|
||||
} catch (Exception e) {
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
// 如果当前设备的android-sdk 版本号大于等于11
|
||||
else {
|
||||
try {
|
||||
ClipboardManager clipManager = (ClipboardManager) appliactionContext
|
||||
.getSystemService(Context.CLIPBOARD_SERVICE);
|
||||
ClipData clip = ClipData.newPlainText("simple text", str);
|
||||
clipManager.setPrimaryClip(clip);
|
||||
return true;
|
||||
} catch (Exception e) {
|
||||
}
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取剪切版中的文字,如果有的话
|
||||
*
|
||||
* @param context
|
||||
* @return
|
||||
*/
|
||||
public static String getText(Context context) {
|
||||
if (context == null) {
|
||||
return null;
|
||||
}
|
||||
Context appliactionContext = null;
|
||||
try {
|
||||
appliactionContext = context.getApplicationContext();
|
||||
} catch (Exception e) {
|
||||
}
|
||||
if (appliactionContext == null) {
|
||||
return null;
|
||||
}
|
||||
|
||||
// 如果当前设备的android-sdk 版本号小于11
|
||||
if (Build.VERSION.SDK_INT < 11) {
|
||||
try {
|
||||
android.text.ClipboardManager clipManager = (android.text.ClipboardManager) appliactionContext
|
||||
.getSystemService(Context.CLIPBOARD_SERVICE);
|
||||
if (clipManager.hasText()) {
|
||||
return clipManager.getText().toString();
|
||||
}
|
||||
} catch (Exception e) {
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
// 如果当前设备的android-sdk 版本号大于等于11
|
||||
else {
|
||||
try {
|
||||
ClipboardManager clipManager = (ClipboardManager) appliactionContext
|
||||
.getSystemService(Context.CLIPBOARD_SERVICE);
|
||||
|
||||
if (clipManager.hasPrimaryClip()) {
|
||||
|
||||
// 如果剪切版中的是文字
|
||||
if (clipManager.getPrimaryClipDescription().hasMimeType(ClipDescription.MIMETYPE_TEXT_PLAIN)) {
|
||||
StringBuilder sb = new StringBuilder();
|
||||
ClipData clipData = clipManager.getPrimaryClip();
|
||||
for (int i = 0; i < clipData.getItemCount(); ++i) {
|
||||
sb.append(clipData.getItemAt(i).getText());
|
||||
|
||||
// ClipData.Item item = clipData.getItemAt(i);
|
||||
// CharSequence str = item.coerceToText(MainActivity.this);
|
||||
// resultString += str;
|
||||
}
|
||||
if (sb != null) {
|
||||
return sb.toString();
|
||||
}
|
||||
}
|
||||
}
|
||||
} catch (Exception e) {
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
@ -0,0 +1,73 @@
|
||||
package com.gh.common.util;
|
||||
|
||||
import android.app.Activity;
|
||||
import android.content.Context;
|
||||
import android.os.IBinder;
|
||||
import android.view.View;
|
||||
import android.view.inputmethod.InputMethodManager;
|
||||
import android.widget.EditText;
|
||||
|
||||
/**
|
||||
* @author: CsHeng (csheng1204[at]gmail[dot]com)
|
||||
* Date: 13-5-28
|
||||
* Time: 上午11:04
|
||||
*/
|
||||
public class Util_System_Keyboard {
|
||||
|
||||
/**
|
||||
* 显示键盘,使用postDelayed效果更加~
|
||||
*
|
||||
* @param context
|
||||
* @param edt
|
||||
*/
|
||||
public static void showSoftKeyboard(Context context, EditText edt) {
|
||||
if (context == null || edt == null) return;
|
||||
final InputMethodManager imm = (InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE);
|
||||
imm.showSoftInput(edt, 0);
|
||||
}
|
||||
|
||||
/**
|
||||
* 隐藏键盘
|
||||
*
|
||||
* @param context
|
||||
* @param edt
|
||||
*/
|
||||
public static void hideSoftKeyboard(Context context, EditText edt) {
|
||||
if (context == null || edt == null) return;
|
||||
final InputMethodManager imm = (InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE);
|
||||
imm.hideSoftInputFromWindow(edt.getWindowToken(), 0);
|
||||
}
|
||||
|
||||
/**
|
||||
* 隐藏键盘,使用Ibinder
|
||||
*
|
||||
* @param context
|
||||
* @param binder
|
||||
*/
|
||||
public static void hideSoftKeyboardByIBinder(Context context, IBinder binder) {
|
||||
if (context == null || binder == null) {
|
||||
return;
|
||||
}
|
||||
final InputMethodManager imm = (InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE);
|
||||
imm.hideSoftInputFromWindow(binder, 0);
|
||||
}
|
||||
|
||||
/**
|
||||
* 利用Activity获取到当前界面focus,利用IBinder隐藏键盘
|
||||
*
|
||||
* @param activity
|
||||
*/
|
||||
public static void hideSoftKeyboard(Activity activity) {
|
||||
if (activity != null) {
|
||||
final View view = activity.getCurrentFocus();
|
||||
if (view != null) {
|
||||
final IBinder binder = view.getWindowToken();
|
||||
if (binder != null) {
|
||||
final InputMethodManager imm = (InputMethodManager) activity.getApplicationContext()
|
||||
.getSystemService(Context.INPUT_METHOD_SERVICE);
|
||||
imm.hideSoftInputFromWindow(binder, 0);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
154
app/src/main/java/com/gh/common/util/Util_System_Permission.java
Normal file
154
app/src/main/java/com/gh/common/util/Util_System_Permission.java
Normal file
@ -0,0 +1,154 @@
|
||||
package com.gh.common.util;
|
||||
|
||||
import android.Manifest;
|
||||
import android.content.Context;
|
||||
import android.content.pm.PackageManager;
|
||||
import android.os.Build;
|
||||
import android.os.Build.VERSION_CODES;
|
||||
|
||||
/**
|
||||
* 权限工具
|
||||
*
|
||||
* @author CsHeng
|
||||
*/
|
||||
public class Util_System_Permission {
|
||||
|
||||
/**
|
||||
* 检查是否具有写入外部存储卡的权限
|
||||
*
|
||||
* @param context
|
||||
* @return
|
||||
*/
|
||||
public static boolean isWith_WRITE_EXTERNAL_STORAGE_Permission(Context context) {
|
||||
try {
|
||||
|
||||
// Util_SDK_Compatibility.getSDKLevel();
|
||||
int sdkLevel = Build.VERSION.SDK_INT;
|
||||
|
||||
if (sdkLevel < VERSION_CODES.DONUT) {
|
||||
return true;
|
||||
}
|
||||
|
||||
return isWithPermission(context, Manifest.permission.WRITE_EXTERNAL_STORAGE);
|
||||
} catch (Throwable e) {
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* 是否具有相应权限
|
||||
*
|
||||
* @param context
|
||||
* @param permissionName
|
||||
* @return
|
||||
*/
|
||||
public static boolean isWithPermission(Context context, String permissionName) {
|
||||
try {
|
||||
if (context.checkCallingOrSelfPermission(permissionName) == PackageManager.PERMISSION_DENIED) {
|
||||
return false;
|
||||
}
|
||||
} catch (Throwable e) {
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* 检查是否具有联网INTERNET权限
|
||||
*
|
||||
* @param context
|
||||
* @return
|
||||
*/
|
||||
public static boolean isWith_INTERNET_Permission(Context context) {
|
||||
return isWithPermission(context, Manifest.permission.INTERNET);
|
||||
}
|
||||
|
||||
/**
|
||||
* 检查是否具有获取手机信息READ_PHONE_STATE权限
|
||||
*
|
||||
* @param context
|
||||
* @return
|
||||
*/
|
||||
public static boolean isWith_READ_PHONE_STATE_Permission(Context context) {
|
||||
return isWithPermission(context, Manifest.permission.READ_PHONE_STATE);
|
||||
}
|
||||
|
||||
/**
|
||||
* 检查是否具有ACCESS_NETWORK_STATE权限
|
||||
*
|
||||
* @param context
|
||||
* @return
|
||||
*/
|
||||
public static boolean isWith_ACCESS_NETWORK_STATE_Permission(Context context) {
|
||||
return isWithPermission(context, Manifest.permission.ACCESS_NETWORK_STATE);
|
||||
}
|
||||
|
||||
/**
|
||||
* 检查是否具有ACCESS_FINE_LOCATION权限
|
||||
*
|
||||
* @param context
|
||||
* @return
|
||||
*/
|
||||
public static boolean isWith_ACCESS_FINE_LOCATION_Permission(Context context) {
|
||||
return isWithPermission(context, Manifest.permission.ACCESS_FINE_LOCATION);
|
||||
}
|
||||
|
||||
/**
|
||||
* 检查是否具有ACCESS_COARSE_LOCATION权限
|
||||
*
|
||||
* @param context
|
||||
* @return
|
||||
*/
|
||||
public static boolean isWith_ACCESS_COARSE_LOCATION_Permission(Context context) {
|
||||
return isWithPermission(context, Manifest.permission.ACCESS_COARSE_LOCATION);
|
||||
}
|
||||
|
||||
/**
|
||||
* 检查是否具有ACCESS_WIFI_STATE权限
|
||||
*
|
||||
* @param context
|
||||
* @return
|
||||
*/
|
||||
public static boolean isWith_ACCESS_WIFI_STATE_Permission(Context context) {
|
||||
return isWithPermission(context, Manifest.permission.ACCESS_WIFI_STATE);
|
||||
}
|
||||
|
||||
/**
|
||||
* 检查是否具有创建快捷方式的权限。
|
||||
*
|
||||
* @param context
|
||||
* @return
|
||||
*/
|
||||
public static boolean isWith_INSTALL_SHORTCUT_Permission(Context context) {
|
||||
return isWithPermission(context, "com.android.launcher.permission.INSTALL_SHORTCUT");
|
||||
}
|
||||
|
||||
/**
|
||||
* 检查是否具有添加系统浏览器书签的权限
|
||||
*
|
||||
* @param context
|
||||
* @return
|
||||
*/
|
||||
public static boolean isWith_WRITE_HISTORY_BOOKMARKS(Context context) {
|
||||
return isWithPermission(context, "com.android.browser.permission.WRITE_HISTORY_BOOKMARKS");
|
||||
}
|
||||
|
||||
/**
|
||||
* 检查是否具有SYSTEM_ALERT_WINDOW方法
|
||||
*
|
||||
* @param context
|
||||
* @return
|
||||
*/
|
||||
public static boolean isWith_SYSTEM_ALERT_WINDOW_Permission(Context context) {
|
||||
return isWithPermission(context, Manifest.permission.SYSTEM_ALERT_WINDOW);
|
||||
}
|
||||
|
||||
/**
|
||||
* 检查是否具有GET_TASK方法
|
||||
*
|
||||
* @param context
|
||||
* @return
|
||||
*/
|
||||
public static boolean isWith_GET_TASK_Permission(Context context) {
|
||||
return isWithPermission(context, Manifest.permission.GET_TASKS);
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,183 @@
|
||||
/**
|
||||
* project: CompanyPortalApp
|
||||
* <p/>
|
||||
* <p/>
|
||||
* ========================================================================
|
||||
* amend date amend user amend reason
|
||||
* 2012-2-14 CsHeng
|
||||
*/
|
||||
|
||||
package com.gh.common.util;
|
||||
|
||||
import android.content.Context;
|
||||
import android.content.pm.PackageManager.NameNotFoundException;
|
||||
import android.net.ConnectivityManager;
|
||||
import android.net.NetworkInfo;
|
||||
import android.net.wifi.WifiInfo;
|
||||
import android.net.wifi.WifiManager;
|
||||
import android.os.Build;
|
||||
import android.telephony.TelephonyManager;
|
||||
import android.text.format.Formatter;
|
||||
import android.util.Log;
|
||||
|
||||
import java.net.InetAddress;
|
||||
import java.net.NetworkInterface;
|
||||
import java.net.SocketException;
|
||||
import java.util.Enumeration;
|
||||
import java.util.Locale;
|
||||
|
||||
/**
|
||||
* 读取手机信息工具类
|
||||
*
|
||||
* @author CsHeng
|
||||
* @date 2012-2-14
|
||||
* @date 2015-9-6 update by yxf getImei
|
||||
*/
|
||||
public class Util_System_Phone_State {
|
||||
|
||||
public static String getMac(Context context) {
|
||||
try {
|
||||
if (Util_System_Permission.isWith_ACCESS_WIFI_STATE_Permission(context)) {
|
||||
WifiManager wifi = (WifiManager) context.getApplicationContext().getSystemService(Context.WIFI_SERVICE);
|
||||
WifiInfo info = wifi.getConnectionInfo();
|
||||
String str = info.getMacAddress();
|
||||
if (str != null) {
|
||||
str = str.trim();
|
||||
return str;
|
||||
}
|
||||
}
|
||||
} catch (Throwable e) {
|
||||
}
|
||||
return "";
|
||||
}
|
||||
|
||||
public static String getLocalIpAddress() {
|
||||
try {
|
||||
for (Enumeration<NetworkInterface> en = NetworkInterface
|
||||
.getNetworkInterfaces(); en.hasMoreElements(); ) {
|
||||
NetworkInterface intf = en.nextElement();
|
||||
for (Enumeration<InetAddress> enumIpAddr = intf
|
||||
.getInetAddresses(); enumIpAddr.hasMoreElements(); ) {
|
||||
InetAddress inetAddress = enumIpAddr.nextElement();
|
||||
if (!inetAddress.isLoopbackAddress()) {
|
||||
return inetAddress.getHostAddress();
|
||||
}
|
||||
}
|
||||
}
|
||||
} catch (SocketException ex) {
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
public static String getss(Context context) {
|
||||
String ipString = null;
|
||||
try {
|
||||
WifiManager wifiManager = (WifiManager) context.getApplicationContext().getSystemService(Context.WIFI_SERVICE);
|
||||
WifiInfo wifiInfo = wifiManager.getConnectionInfo();
|
||||
int ipAddress = wifiInfo.getIpAddress();
|
||||
ipString = String.format(Locale.getDefault(),
|
||||
"%d.%d.%d.%d",
|
||||
(ipAddress & 0xff),
|
||||
(ipAddress >> 8 & 0xff),
|
||||
(ipAddress >> 16 & 0xff),
|
||||
(ipAddress >> 24 & 0xff));
|
||||
} catch (Exception e) {
|
||||
}
|
||||
return ipString;
|
||||
}
|
||||
|
||||
public static String getLocalIpAddressNum() {
|
||||
try {
|
||||
for (Enumeration<NetworkInterface> en = NetworkInterface.getNetworkInterfaces(); en.hasMoreElements(); ) {
|
||||
NetworkInterface intf = en.nextElement();
|
||||
for (Enumeration<InetAddress> enumIpAddr = intf.getInetAddresses(); enumIpAddr.hasMoreElements(); ) {
|
||||
InetAddress inetAddress = enumIpAddr.nextElement();
|
||||
if (!inetAddress.isLoopbackAddress()) {
|
||||
String ip = Formatter.formatIpAddress(inetAddress.hashCode());
|
||||
if (AppDebugConfig.IS_DEBUG) {
|
||||
Log.i(Util_System_Phone_State.class.getSimpleName(), "***** IP=" + ip);
|
||||
}
|
||||
return ip;
|
||||
}
|
||||
}
|
||||
}
|
||||
} catch (SocketException ex) {
|
||||
if (AppDebugConfig.IS_DEBUG) {
|
||||
Log.e(Util_System_Phone_State.class.getSimpleName(), ex.toString());
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
//这里如果IMEI返回为NULL,我们用15个0代替
|
||||
public static String getImei(Context c) {
|
||||
final String original = getTelephonyManager(c).getDeviceId();
|
||||
return original == null ? "000000000000000" : original;
|
||||
}
|
||||
|
||||
private static TelephonyManager getTelephonyManager(Context context) {
|
||||
return (TelephonyManager) context.getApplicationContext().getSystemService(Context.TELEPHONY_SERVICE);
|
||||
}
|
||||
|
||||
public static String getImsi(Context c) {
|
||||
final String imsi = getTelephonyManager(c).getSubscriberId();
|
||||
return imsi == null ? "" : imsi;
|
||||
}
|
||||
|
||||
public static String getSIMId(Context c) {
|
||||
return getTelephonyManager(c).getSimSerialNumber();
|
||||
}
|
||||
|
||||
public static String getDeviceId(Context c) {
|
||||
return getTelephonyManager(c).getDeviceId();
|
||||
}
|
||||
|
||||
public static String getDeviceName() {
|
||||
final String deviceName = android.os.Build.MODEL + ","
|
||||
+ android.os.Build.VERSION.SDK_INT + ","
|
||||
+ android.os.Build.VERSION.RELEASE;
|
||||
return deviceName;
|
||||
}
|
||||
|
||||
public static int getAppVersionCode(Context c) {
|
||||
try {
|
||||
return c.getPackageManager().getPackageInfo(c.getPackageName(), 0).versionCode;
|
||||
} catch (NameNotFoundException e) {
|
||||
e.printStackTrace();
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
|
||||
public static String getAppVersionName(Context c) {
|
||||
try {
|
||||
return c.getPackageManager().getPackageInfo(c.getPackageName(), 0).versionName;
|
||||
} catch (NameNotFoundException e) {
|
||||
e.printStackTrace();
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
public static String getPackageVersionName(Context ctx, String pn) {
|
||||
try {
|
||||
return ctx.getPackageManager().getPackageInfo(pn, 0).versionName;
|
||||
} catch (NameNotFoundException e) {
|
||||
return "";
|
||||
}
|
||||
}
|
||||
|
||||
public static String getDevideInfo() {
|
||||
return Build.MANUFACTURER + " " + Build.MODEL + " " + Build.VERSION.RELEASE;
|
||||
}
|
||||
|
||||
public static boolean isNetworkConnected(Context context) {
|
||||
try {
|
||||
final ConnectivityManager connectivityManager = (ConnectivityManager)
|
||||
context.getSystemService(Context.CONNECTIVITY_SERVICE);
|
||||
final NetworkInfo activeNetworkInfo = connectivityManager.getActiveNetworkInfo();
|
||||
return activeNetworkInfo != null;
|
||||
} catch (Exception e) {
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
}
|
||||
99
app/src/main/java/com/gh/common/util/Util_Window.java
Normal file
99
app/src/main/java/com/gh/common/util/Util_Window.java
Normal file
@ -0,0 +1,99 @@
|
||||
package com.gh.common.util;
|
||||
|
||||
import android.graphics.PixelFormat;
|
||||
import android.os.Build;
|
||||
import android.view.View;
|
||||
import android.view.Window;
|
||||
import android.view.WindowManager;
|
||||
|
||||
/**
|
||||
* Created by csheng on 15-10-14.
|
||||
*/
|
||||
public class Util_Window {
|
||||
|
||||
/**
|
||||
* set status bar color
|
||||
* //TODO View的两个标识会导致输入法无法resize,找解决方案
|
||||
* 解决方案:xml配置根视图要加android:fitsSystemWindows = "true"
|
||||
*
|
||||
* @param window
|
||||
* @param color
|
||||
*/
|
||||
public static void initStatusBarColor(Window window, int color) {
|
||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
|
||||
// clear FLAG_TRANSLUCENT_STATUS flag:
|
||||
window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
|
||||
// add FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS flag to the window
|
||||
window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
|
||||
// finally change the color
|
||||
window.setStatusBarColor(color);
|
||||
|
||||
window.getDecorView()
|
||||
.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_STABLE | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN);
|
||||
}
|
||||
}
|
||||
|
||||
public static void enableAutoWakelock(Window window) {
|
||||
// auto handle wake lock
|
||||
window.addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
|
||||
|
||||
// 网页中的视频,上屏幕的时候,可能出现闪烁的情况,需要如下设置:Activity在onCreate时需要设置:
|
||||
window.setFormat(PixelFormat.TRANSLUCENT);
|
||||
}
|
||||
|
||||
public static void enableHardware(Window window) {
|
||||
// open hardware accelerate
|
||||
try {
|
||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
|
||||
window.setFlags(WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED,
|
||||
WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED);
|
||||
}
|
||||
} catch (Exception e) {
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Detects and toggles immersive mode (also known as "hidey bar" mode).
|
||||
*/
|
||||
public static void toggleHideYBar(Window window) {
|
||||
|
||||
// The UI options currently enabled are represented by a bitfield.
|
||||
// getSystemUiVisibility() gives us that bitfield.
|
||||
int uiOptions = 0;
|
||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
|
||||
uiOptions = window.getDecorView().getSystemUiVisibility();
|
||||
}
|
||||
int newUiOptions = uiOptions;
|
||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
|
||||
boolean isImmersiveModeEnabled =
|
||||
((uiOptions | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY) == uiOptions);
|
||||
}
|
||||
|
||||
// Navigation bar hiding: Backwards compatible to ICS.
|
||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH) {
|
||||
newUiOptions ^= View.SYSTEM_UI_FLAG_HIDE_NAVIGATION;
|
||||
}
|
||||
|
||||
// Status bar hiding: Backwards compatible to Jellybean
|
||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
|
||||
newUiOptions ^= View.SYSTEM_UI_FLAG_FULLSCREEN;
|
||||
}
|
||||
|
||||
// Immersive mode: Backward compatible to KitKat.
|
||||
// Note that this flag doesn't do anything by itself, it only augments the behavior
|
||||
// of HIDE_NAVIGATION and FLAG_FULLSCREEN. For the purposes of this sample
|
||||
// all three flags are being toggled together.
|
||||
// Note that there are two immersive mode UI flags, one of which is referred to as "sticky".
|
||||
// Sticky immersive mode differs in that it makes the navigation and status bars
|
||||
// semi-transparent, and the UI flag does not get cleared when the user interacts with
|
||||
// the screen.
|
||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
|
||||
newUiOptions ^= View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY;
|
||||
}
|
||||
|
||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
|
||||
window.getDecorView().setSystemUiVisibility(newUiOptions);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
97
app/src/main/java/com/gh/common/util/Utils.java
Normal file
97
app/src/main/java/com/gh/common/util/Utils.java
Normal file
@ -0,0 +1,97 @@
|
||||
package com.gh.common.util;
|
||||
|
||||
import android.content.Context;
|
||||
import android.content.SharedPreferences;
|
||||
import android.util.Log;
|
||||
import android.view.View;
|
||||
import android.view.inputmethod.InputMethodManager;
|
||||
import android.widget.EditText;
|
||||
|
||||
import com.gh.common.constant.Config;
|
||||
import com.gh.gamecenter.R;
|
||||
|
||||
import java.lang.reflect.Field;
|
||||
|
||||
public class Utils {
|
||||
|
||||
private static final boolean DEBUG = true;
|
||||
private final static String TAG = "result";
|
||||
|
||||
public static void log(String msg) {
|
||||
log(TAG, msg);
|
||||
}
|
||||
|
||||
public static void log(String tag, String msg) {
|
||||
log(Log.ERROR, tag, msg);
|
||||
}
|
||||
|
||||
private static void log(int priority, String tag, String msg) {
|
||||
if (DEBUG) {
|
||||
Log.println(priority, tag, msg);
|
||||
}
|
||||
}
|
||||
|
||||
public static void log(Object obj) {
|
||||
log(TAG, obj.getClass().getSimpleName() + ":" + obj.toString());
|
||||
}
|
||||
|
||||
public static void log(String tag, Object obj) {
|
||||
log(Log.ERROR, tag, obj.getClass().getSimpleName() + ":" + obj.toString());
|
||||
}
|
||||
|
||||
private static void log(int priority, String tag, Object obj) {
|
||||
if (DEBUG) {
|
||||
Log.println(priority, tag, obj.getClass().getSimpleName() + ":" + obj.toString());
|
||||
}
|
||||
}
|
||||
|
||||
public static void toast(Context context, String text) {
|
||||
RuntimeUtils.getInstance().toast(context, text);
|
||||
}
|
||||
|
||||
/*
|
||||
* 获取服务器时间
|
||||
*/
|
||||
public static long getTime(Context context) {
|
||||
SharedPreferences sp = context.getSharedPreferences(Config.PREFERENCE, Context.MODE_PRIVATE);
|
||||
long serverTime = sp.getLong("server_time", 0);
|
||||
long clientTime = sp.getLong("client_time", 0);
|
||||
if (serverTime == 0 || clientTime == 0) {
|
||||
return System.currentTimeMillis() / 1000;
|
||||
} else {
|
||||
return serverTime + (System.currentTimeMillis() / 1000 - clientTime);
|
||||
}
|
||||
}
|
||||
|
||||
public static void hideSoftInput(Context context, EditText editText) {
|
||||
InputMethodManager imm = (InputMethodManager) context
|
||||
.getSystemService(Context.INPUT_METHOD_SERVICE);
|
||||
imm.hideSoftInputFromWindow(editText.getWindowToken(), 0);
|
||||
}
|
||||
|
||||
public static void showSoftInput(Context context, EditText editText) {
|
||||
InputMethodManager imm = (InputMethodManager) context
|
||||
.getSystemService(Context.INPUT_METHOD_SERVICE);
|
||||
imm.showSoftInput(editText, InputMethodManager.SHOW_FORCED);
|
||||
}
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
public static <T extends View> T getView(View view, int id) {
|
||||
return (T) view.findViewById(id);
|
||||
}
|
||||
|
||||
public static int getId(String name) {
|
||||
try {
|
||||
Class<?> arrayClass = R.id.class;
|
||||
for (Field field : arrayClass.getFields()) {
|
||||
if (field.getName().equals(name)) {
|
||||
return field.getInt(name);
|
||||
}
|
||||
}
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
|
||||
}
|
||||
@ -4,7 +4,6 @@ import android.content.Context;
|
||||
import android.content.res.TypedArray;
|
||||
import android.graphics.Canvas;
|
||||
import android.graphics.drawable.Drawable;
|
||||
import android.support.v4.content.ContextCompat;
|
||||
import android.util.AttributeSet;
|
||||
import android.widget.RelativeLayout;
|
||||
|
||||
@ -48,25 +47,25 @@ public class CardRelativeLayout extends RelativeLayout {
|
||||
}
|
||||
|
||||
if (isTran) {
|
||||
mLeftDrawable = ContextCompat.getDrawable(context, R.drawable.frame_tran_left);
|
||||
topDrawable = ContextCompat.getDrawable(context, R.drawable.frame_tran_top);
|
||||
mRightDrawable = ContextCompat.getDrawable(context, R.drawable.frame_tran_right);
|
||||
bottomDrawable = ContextCompat.getDrawable(context, R.drawable.frame_tran_bottom);
|
||||
mLeftDrawable = getResources().getDrawable(R.drawable.frame_tran_left);
|
||||
topDrawable = getResources().getDrawable(R.drawable.frame_tran_top);
|
||||
mRightDrawable = getResources().getDrawable(R.drawable.frame_tran_right);
|
||||
bottomDrawable = getResources().getDrawable(R.drawable.frame_tran_bottom);
|
||||
|
||||
leftTopDrawable = ContextCompat.getDrawable(context, R.drawable.frame_tran_left_top_square);
|
||||
rightTopDrawable = ContextCompat.getDrawable(context, R.drawable.frame_tran_right_top_square);
|
||||
leftBottomDrawable = ContextCompat.getDrawable(context, R.drawable.frame_tran_left_bottom_square);
|
||||
rightBottomDrawable = ContextCompat.getDrawable(context, R.drawable.frame_tran_right_bottom_square);
|
||||
leftTopDrawable = getResources().getDrawable(R.drawable.frame_tran_left_top_square);
|
||||
rightTopDrawable = getResources().getDrawable(R.drawable.frame_tran_right_top_square);
|
||||
leftBottomDrawable = getResources().getDrawable(R.drawable.frame_tran_left_bottom_square);
|
||||
rightBottomDrawable = getResources().getDrawable(R.drawable.frame_tran_right_bottom_square);
|
||||
} else {
|
||||
mLeftDrawable = ContextCompat.getDrawable(context, R.drawable.frame_left);
|
||||
topDrawable = ContextCompat.getDrawable(context, R.drawable.frame_top);
|
||||
mRightDrawable = ContextCompat.getDrawable(context, R.drawable.frame_right);
|
||||
bottomDrawable = ContextCompat.getDrawable(context, R.drawable.frame_bottom);
|
||||
mLeftDrawable = getResources().getDrawable(R.drawable.frame_left);
|
||||
topDrawable = getResources().getDrawable(R.drawable.frame_top);
|
||||
mRightDrawable = getResources().getDrawable(R.drawable.frame_right);
|
||||
bottomDrawable = getResources().getDrawable(R.drawable.frame_bottom);
|
||||
|
||||
leftTopDrawable = ContextCompat.getDrawable(context, R.drawable.frame_left_top_square);
|
||||
rightTopDrawable = ContextCompat.getDrawable(context, R.drawable.frame_right_top_square);
|
||||
leftBottomDrawable = ContextCompat.getDrawable(context, R.drawable.frame_left_bottom_square);
|
||||
rightBottomDrawable = ContextCompat.getDrawable(context, R.drawable.frame_right_bottom_square);
|
||||
leftTopDrawable = getResources().getDrawable(R.drawable.frame_left_top_square);
|
||||
rightTopDrawable = getResources().getDrawable(R.drawable.frame_right_top_square);
|
||||
leftBottomDrawable = getResources().getDrawable(R.drawable.frame_left_bottom_square);
|
||||
rightBottomDrawable = getResources().getDrawable(R.drawable.frame_right_bottom_square);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@ -2,7 +2,6 @@ package com.gh.common.view;
|
||||
|
||||
import android.content.Context;
|
||||
import android.content.SharedPreferences;
|
||||
import android.preference.PreferenceManager;
|
||||
import android.support.v4.view.ViewPager;
|
||||
import android.support.v4.view.ViewPager.OnPageChangeListener;
|
||||
import android.view.Gravity;
|
||||
@ -16,12 +15,16 @@ import android.widget.LinearLayout.LayoutParams;
|
||||
import android.widget.PopupWindow;
|
||||
import android.widget.TextView;
|
||||
|
||||
import com.gh.common.constant.Config;
|
||||
import com.gh.common.util.DisplayUtils;
|
||||
import com.gh.common.util.PackageUtils;
|
||||
import com.gh.common.util.PlatformUtils;
|
||||
import com.gh.common.util.Utils;
|
||||
import com.gh.download.DataWatcher;
|
||||
import com.gh.download.DownloadEntity;
|
||||
import com.gh.download.DownloadManager;
|
||||
import com.gh.download.DownloadStatus;
|
||||
import com.gh.gamecenter.R;
|
||||
import com.gh.gamecenter.adapter.OnCollectionCallBackListener;
|
||||
import com.gh.gamecenter.adapter.PlatformPagerAdapter;
|
||||
import com.gh.gamecenter.entity.ApkEntity;
|
||||
import com.gh.gamecenter.entity.GameCollectionEntity;
|
||||
@ -29,11 +32,8 @@ import com.gh.gamecenter.entity.GameEntity;
|
||||
import com.gh.gamecenter.eventbus.EBDownloadStatus;
|
||||
import com.gh.gamecenter.eventbus.EBPackage;
|
||||
import com.gh.gamecenter.eventbus.EBReuse;
|
||||
import com.gh.gamecenter.listener.OnCollectionCallBackListener;
|
||||
import com.gh.gamecenter.manager.PackageManager;
|
||||
import com.lightgame.download.DataWatcher;
|
||||
import com.lightgame.download.DownloadEntity;
|
||||
import com.lightgame.download.DownloadStatus;
|
||||
import com.lightgame.utils.Utils;
|
||||
|
||||
import org.greenrobot.eventbus.EventBus;
|
||||
import org.greenrobot.eventbus.Subscribe;
|
||||
@ -119,7 +119,7 @@ public class DownloadDialog implements OnCollectionCallBackListener {
|
||||
this.entrance = entrance;
|
||||
this.location = location;
|
||||
|
||||
SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(mContext);
|
||||
SharedPreferences sp = mContext.getSharedPreferences(Config.PREFERENCE, Context.MODE_PRIVATE);
|
||||
row = sp.getInt("download_box_row", 3);
|
||||
column = sp.getInt("download_box_column", 3);
|
||||
|
||||
@ -213,7 +213,7 @@ public class DownloadDialog implements OnCollectionCallBackListener {
|
||||
String packageName;
|
||||
Object gh_id;
|
||||
for (ApkEntity apkEntity : apkList) {
|
||||
downloadEntity = DownloadManager.getInstance(mContext).getDownloadEntityByUrl(apkEntity.getUrl());
|
||||
downloadEntity = DownloadManager.getInstance(mContext).get(apkEntity.getUrl());
|
||||
if (downloadEntity == null) {
|
||||
packageName = apkEntity.getPackageName();
|
||||
if (PackageManager.isInstalled(packageName)) {
|
||||
@ -334,11 +334,11 @@ public class DownloadDialog implements OnCollectionCallBackListener {
|
||||
int count = apkList.size();
|
||||
int vpHeight;
|
||||
if (count <= 3) {
|
||||
vpHeight = 90;
|
||||
vpHeight = 88;
|
||||
} else if (count <= 6) {
|
||||
vpHeight = 150;
|
||||
vpHeight = 148;
|
||||
} else {
|
||||
vpHeight = 210;
|
||||
vpHeight = 208;
|
||||
}
|
||||
ViewGroup.LayoutParams layoutParams = viewPager.getLayoutParams();
|
||||
layoutParams.height = DisplayUtils.dip2px(mContext, vpHeight);
|
||||
@ -399,7 +399,7 @@ public class DownloadDialog implements OnCollectionCallBackListener {
|
||||
if (collectionAdapter != null) {
|
||||
collectionAdapter.removeDownloadEntityByUrl(url);
|
||||
}
|
||||
// DownloadManager.getInstance(mContext).putStatus(url, "delete");
|
||||
DownloadManager.getInstance(mContext).putStatus(url, "delete");
|
||||
}
|
||||
}
|
||||
|
||||
@ -421,11 +421,11 @@ public class DownloadDialog implements OnCollectionCallBackListener {
|
||||
int count = gameCollectionEntity.getSaveApkEntity().size();
|
||||
int vpHeight;
|
||||
if (count <= 3) {
|
||||
vpHeight = 82;
|
||||
vpHeight = 80;
|
||||
} else if (count <= 6) {
|
||||
vpHeight = 142;
|
||||
vpHeight = 140;
|
||||
} else {
|
||||
vpHeight = 202;
|
||||
vpHeight = 200;
|
||||
}
|
||||
|
||||
ViewGroup.LayoutParams layoutParams = collectionViewPager.getLayoutParams();
|
||||
|
||||
@ -1,62 +1,62 @@
|
||||
//package com.gh.common.view;
|
||||
//
|
||||
//import android.content.Context;
|
||||
//import android.support.v7.widget.LinearLayoutManager;
|
||||
//import android.support.v7.widget.RecyclerView;
|
||||
//import android.view.View;
|
||||
//import android.view.ViewGroup;
|
||||
//
|
||||
///**
|
||||
// * Created by khy on 2017/3/30.
|
||||
// */
|
||||
//public class MeasureLinearLayoutManager extends LinearLayoutManager {
|
||||
// int height;
|
||||
// private int[] mMeasuredDimension = new int[1];
|
||||
//
|
||||
// public MeasureLinearLayoutManager(Context context) {
|
||||
// super(context);
|
||||
// }
|
||||
//
|
||||
// @Override
|
||||
// public void onMeasure(RecyclerView.Recycler recycler, RecyclerView.State state,
|
||||
// int widthSpec, int heightSpec) {
|
||||
// super.onMeasure(recycler, state, widthSpec, heightSpec);
|
||||
// height = 0;
|
||||
//
|
||||
// try {
|
||||
// for (int i = 0; i < getItemCount(); i++) {
|
||||
// measureScrapChild(recycler, i,
|
||||
// View.MeasureSpec.makeMeasureSpec(i, View.MeasureSpec.UNSPECIFIED),
|
||||
// View.MeasureSpec.makeMeasureSpec(i, View.MeasureSpec.UNSPECIFIED),
|
||||
// mMeasuredDimension);
|
||||
// height = height + mMeasuredDimension[0];
|
||||
// }
|
||||
// } catch (Exception e) {
|
||||
// e.printStackTrace();
|
||||
// }
|
||||
//
|
||||
// }
|
||||
//
|
||||
// private void measureScrapChild(RecyclerView.Recycler recycler, int position, int widthSpec,
|
||||
// int heightSpec, int[] measuredDimension) throws Exception {
|
||||
// View view = recycler.getViewForPosition(position);
|
||||
// if (view.getVisibility() == View.GONE) {
|
||||
// measuredDimension[0] = 0;
|
||||
// return;
|
||||
// }
|
||||
// super.measureChildWithMargins(view, 0, 0);
|
||||
// RecyclerView.LayoutParams p = (RecyclerView.LayoutParams) view.getLayoutParams();
|
||||
// int childHeightSpec = ViewGroup.getChildMeasureSpec(
|
||||
// heightSpec,
|
||||
// getPaddingTop() + getPaddingBottom() + getDecoratedTop(view) + getDecoratedBottom(view),
|
||||
// p.height);
|
||||
//
|
||||
// view.measure(0, childHeightSpec);
|
||||
// measuredDimension[0] = getDecoratedMeasuredHeight(view) + p.bottomMargin + p.topMargin;
|
||||
// recycler.recycleView(view);
|
||||
// }
|
||||
//
|
||||
// public int getRvHeight() {
|
||||
// return height;
|
||||
// }
|
||||
//}
|
||||
package com.gh.common.view;
|
||||
|
||||
import android.content.Context;
|
||||
import android.support.v7.widget.LinearLayoutManager;
|
||||
import android.support.v7.widget.RecyclerView;
|
||||
import android.view.View;
|
||||
import android.view.ViewGroup;
|
||||
|
||||
/**
|
||||
* Created by khy on 2017/3/30.
|
||||
*/
|
||||
public class MeasureLinearLayoutManager extends LinearLayoutManager {
|
||||
int height;
|
||||
private int[] mMeasuredDimension = new int[1];
|
||||
|
||||
public MeasureLinearLayoutManager(Context context) {
|
||||
super(context);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onMeasure(RecyclerView.Recycler recycler, RecyclerView.State state,
|
||||
int widthSpec, int heightSpec) {
|
||||
super.onMeasure(recycler, state, widthSpec, heightSpec);
|
||||
height = 0;
|
||||
|
||||
try {
|
||||
for (int i = 0; i < getItemCount(); i++) {
|
||||
measureScrapChild(recycler, i,
|
||||
View.MeasureSpec.makeMeasureSpec(i, View.MeasureSpec.UNSPECIFIED),
|
||||
View.MeasureSpec.makeMeasureSpec(i, View.MeasureSpec.UNSPECIFIED),
|
||||
mMeasuredDimension);
|
||||
height = height + mMeasuredDimension[0];
|
||||
}
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
private void measureScrapChild(RecyclerView.Recycler recycler, int position, int widthSpec,
|
||||
int heightSpec, int[] measuredDimension) throws Exception {
|
||||
View view = recycler.getViewForPosition(position);
|
||||
if (view.getVisibility() == View.GONE) {
|
||||
measuredDimension[0] = 0;
|
||||
return;
|
||||
}
|
||||
super.measureChildWithMargins(view, 0, 0);
|
||||
RecyclerView.LayoutParams p = (RecyclerView.LayoutParams) view.getLayoutParams();
|
||||
int childHeightSpec = ViewGroup.getChildMeasureSpec(
|
||||
heightSpec,
|
||||
getPaddingTop() + getPaddingBottom() + getDecoratedTop(view) + getDecoratedBottom(view),
|
||||
p.height);
|
||||
|
||||
view.measure(0, childHeightSpec);
|
||||
measuredDimension[0] = getDecoratedMeasuredHeight(view) + p.bottomMargin + p.topMargin;
|
||||
recycler.recycleView(view);
|
||||
}
|
||||
|
||||
public int getRvHeight() {
|
||||
return height;
|
||||
}
|
||||
}
|
||||
|
||||
@ -0,0 +1,40 @@
|
||||
package com.gh.common.view;
|
||||
|
||||
import android.content.Context;
|
||||
import android.support.v4.view.ViewPager;
|
||||
import android.util.AttributeSet;
|
||||
import android.view.MotionEvent;
|
||||
|
||||
/**
|
||||
* Created by khy on 2017/2/24.
|
||||
* 控制是否可以左右滑动
|
||||
*/
|
||||
public class NoScrollableViewPager extends ViewPager {
|
||||
|
||||
private boolean isScrollable;
|
||||
|
||||
public NoScrollableViewPager(Context context) {
|
||||
super(context);
|
||||
isScrollable = true;
|
||||
}
|
||||
|
||||
public NoScrollableViewPager(Context context, AttributeSet attrs) {
|
||||
super(context, attrs);
|
||||
isScrollable = true;
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean onInterceptTouchEvent(MotionEvent ev) {
|
||||
return isScrollable && super.onInterceptTouchEvent(ev);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean onTouchEvent(MotionEvent ev) {
|
||||
return isScrollable && super.onTouchEvent(ev);
|
||||
}
|
||||
|
||||
public void setScrollable(boolean scrollable) {
|
||||
isScrollable = scrollable;
|
||||
}
|
||||
}
|
||||
@ -1,164 +0,0 @@
|
||||
package com.gh.common.view;
|
||||
|
||||
import android.content.Context;
|
||||
import android.graphics.Bitmap;
|
||||
import android.graphics.BitmapFactory;
|
||||
import android.graphics.Canvas;
|
||||
import android.graphics.Color;
|
||||
import android.graphics.Paint;
|
||||
import android.util.AttributeSet;
|
||||
import android.view.View;
|
||||
|
||||
import com.gh.gamecenter.R;
|
||||
|
||||
/**
|
||||
* Created by khy on 22/06/17.
|
||||
*
|
||||
* 光环快传-扫描雷达动画
|
||||
*/
|
||||
|
||||
public class RadarView extends View {
|
||||
|
||||
private Context mContext;
|
||||
private boolean isSearching = false;// 标识是否处于扫描状态,默认为不在扫描状态
|
||||
private Paint mPaint;// 画笔
|
||||
private Bitmap mScanBmp;// 执行扫描运动的图片
|
||||
private int mOffsetArgs = 0;// 扫描运动偏移量参数
|
||||
private int mWidth, mHeight;// 宽高
|
||||
int mCx, mCy;// x、y轴中心点
|
||||
int mOutsideRadius, mInsideRadius;// 外、内圆半径
|
||||
|
||||
public RadarView(Context context, AttributeSet attrs, int defStyleAttr) {
|
||||
super(context, attrs, defStyleAttr);
|
||||
init(context);
|
||||
}
|
||||
|
||||
public RadarView(Context context, AttributeSet attrs) {
|
||||
super(context, attrs);
|
||||
init(context);
|
||||
}
|
||||
|
||||
public RadarView(Context context) {
|
||||
super(context);
|
||||
init(context);
|
||||
}
|
||||
|
||||
/**
|
||||
* TODO<提前初始化好需要使用的对象,避免在绘制过程中多次初始化>
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
private void init(Context context) {
|
||||
mPaint = new Paint();
|
||||
this.mContext = context;
|
||||
}
|
||||
|
||||
/**
|
||||
* 测量视图及其内容,以确定所测量的宽度和高度(测量获取控件尺寸).
|
||||
*/
|
||||
@Override
|
||||
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
|
||||
// TODO Auto-generated method stub
|
||||
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
|
||||
|
||||
// 获取控件区域宽高
|
||||
if (mWidth == 0 || mHeight == 0) {
|
||||
final int minimumWidth = getSuggestedMinimumWidth();
|
||||
final int minimumHeight = getSuggestedMinimumHeight();
|
||||
mWidth = resolveMeasured(widthMeasureSpec, minimumWidth);
|
||||
mHeight = resolveMeasured(heightMeasureSpec, minimumHeight);
|
||||
mScanBmp = Bitmap.createScaledBitmap(BitmapFactory.decodeResource(
|
||||
mContext.getResources(), R.drawable.radar_scan_img), mWidth, mWidth, false);
|
||||
|
||||
// 获取x/y轴中心点
|
||||
mCx = mWidth / 2;
|
||||
mCy = mHeight / 2;
|
||||
|
||||
// 计算内、外半径
|
||||
mOutsideRadius = mWidth / 2;// 外圆的半径
|
||||
mInsideRadius = mWidth / 4 / 2;// 内圆的半径,除最外层,其它圆的半径=层数*insideRadius
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 绘制视图--从外部向内部绘制
|
||||
*/
|
||||
@Override
|
||||
protected void onDraw(Canvas canvas) {
|
||||
super.onDraw(canvas);
|
||||
// 开始绘制最外层的圆
|
||||
mPaint.setAntiAlias(true);// 设置抗锯齿
|
||||
mPaint.setStyle(Paint.Style.FILL);// 设置填充样式
|
||||
mPaint.setColor(0xff327BD7);// 设置画笔颜色
|
||||
// 1.开始绘制圆形
|
||||
canvas.drawCircle(mCx, mCy, mOutsideRadius, mPaint);
|
||||
|
||||
// 开始绘制内3圆
|
||||
mPaint.setStyle(Paint.Style.STROKE);
|
||||
mPaint.setColor(Color.WHITE);
|
||||
canvas.drawCircle(mCx, mCy, mInsideRadius * 3, mPaint);
|
||||
|
||||
// 开始绘制内2圆
|
||||
canvas.drawCircle(mCx, mCy, mInsideRadius * 2, mPaint);
|
||||
|
||||
// 开始绘制内1圆
|
||||
canvas.drawCircle(mCx, mCy, mInsideRadius * 1, mPaint);
|
||||
|
||||
// 2.开始绘制对角线
|
||||
canvas.drawLine(0, mCy, mWidth, mCy, mPaint);// 绘制0°~180°对角线
|
||||
canvas.drawLine(mCx, mHeight , mCx, 0,
|
||||
mPaint);// 绘制90°~270°对角线
|
||||
|
||||
// 3.绘制扫描扇形图
|
||||
canvas.save();// 用来保存Canvas的状态.save之后,可以调用Canvas的平移、放缩、旋转、错切、裁剪等操作.
|
||||
|
||||
if (isSearching) {// 判断是否处于扫描
|
||||
canvas.rotate(mOffsetArgs, mCx, mCy);// 绘制旋转角度,参数一:角度;参数二:x中心;参数三:y中心.
|
||||
canvas.drawBitmap(mScanBmp, mCx - mScanBmp.getWidth() / 2, mCy
|
||||
- mScanBmp.getHeight() / 2, null);// 绘制Bitmap扫描图片效果
|
||||
mOffsetArgs += 3;
|
||||
} else {
|
||||
canvas.drawBitmap(mScanBmp, mCx - mScanBmp.getWidth() / 2, mCy
|
||||
- mScanBmp.getHeight() / 2, null);
|
||||
}
|
||||
|
||||
mPaint.setStyle(Paint.Style.FILL);
|
||||
mPaint.setColor(Color.WHITE);
|
||||
canvas.drawCircle(mCx, mCy, mInsideRadius/4, mPaint);
|
||||
|
||||
if (isSearching)
|
||||
this.invalidate();
|
||||
}
|
||||
|
||||
/**
|
||||
* TODO<设置扫描状态>
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public void setSearching(boolean status) {
|
||||
this.isSearching = status;
|
||||
this.invalidate();
|
||||
}
|
||||
|
||||
/**
|
||||
* TODO<解析获取控件宽高>
|
||||
*
|
||||
* @return int
|
||||
*/
|
||||
private int resolveMeasured(int measureSpec, int desired) {
|
||||
int result = 0;
|
||||
int specSize = MeasureSpec.getSize(measureSpec);
|
||||
switch (MeasureSpec.getMode(measureSpec)) {
|
||||
case MeasureSpec.UNSPECIFIED:
|
||||
result = desired;
|
||||
break;
|
||||
case MeasureSpec.AT_MOST:
|
||||
result = Math.min(specSize, desired);
|
||||
break;
|
||||
case MeasureSpec.EXACTLY:
|
||||
default:
|
||||
result = specSize;
|
||||
}
|
||||
return result;
|
||||
}
|
||||
}
|
||||
@ -1,49 +0,0 @@
|
||||
package com.gh.common.view;
|
||||
|
||||
import android.content.Context;
|
||||
import android.content.res.TypedArray;
|
||||
import android.util.AttributeSet;
|
||||
|
||||
import com.gh.gamecenter.R;
|
||||
|
||||
import cn.trinea.android.view.autoscrollviewpager.AutoScrollViewPager;
|
||||
|
||||
/**
|
||||
* @author CsHeng
|
||||
* @Date 17/06/2017
|
||||
* @Time 12:24 PM
|
||||
*/
|
||||
|
||||
public class ScaleAutoScrollViewPager extends AutoScrollViewPager {
|
||||
|
||||
private boolean mMeasureByHeight = false; // default width
|
||||
private float mScale = 1f;// default square
|
||||
|
||||
public ScaleAutoScrollViewPager(Context context) {
|
||||
super(context);
|
||||
}
|
||||
|
||||
public ScaleAutoScrollViewPager(Context context, AttributeSet set) {
|
||||
super(context, set);
|
||||
TypedArray a = context.obtainStyledAttributes(set, R.styleable.ScaleView);
|
||||
int enumV = a.getInt(R.styleable.ScaleView_measureBy, 0);
|
||||
mScale = a.getFloat(R.styleable.ScaleView_fractionValue, mScale);
|
||||
if (enumV != 0) {
|
||||
mMeasureByHeight = true;
|
||||
}
|
||||
a.recycle();
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
|
||||
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
|
||||
int width = MeasureSpec.getSize(widthMeasureSpec);
|
||||
int height = MeasureSpec.getSize(heightMeasureSpec);
|
||||
if (mMeasureByHeight) {
|
||||
setMeasuredDimension((int) (height * mScale), height);
|
||||
} else {
|
||||
setMeasuredDimension(width, (int) (width * mScale));
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
@ -1,63 +0,0 @@
|
||||
package com.gh.common.view;
|
||||
|
||||
import android.content.Context;
|
||||
import android.content.res.TypedArray;
|
||||
import android.util.AttributeSet;
|
||||
|
||||
import com.facebook.drawee.view.SimpleDraweeView;
|
||||
import com.gh.gamecenter.R;
|
||||
|
||||
/**
|
||||
* @author CsHeng
|
||||
* @Date 17/06/2017
|
||||
* @Time 2:46 PM
|
||||
*/
|
||||
|
||||
public class ScaleSimpleDraweeView extends SimpleDraweeView {
|
||||
|
||||
private boolean mMeasureByHeight = false; // default width
|
||||
|
||||
private float mFraction = 1f;// default square
|
||||
|
||||
public ScaleSimpleDraweeView(Context context) {
|
||||
super(context);
|
||||
}
|
||||
|
||||
public ScaleSimpleDraweeView(Context context, AttributeSet attrs) {
|
||||
super(context, attrs);
|
||||
init(context, attrs);
|
||||
}
|
||||
|
||||
public ScaleSimpleDraweeView(Context context, AttributeSet attrs, int defStyle) {
|
||||
super(context, attrs, defStyle);
|
||||
init(context, attrs);
|
||||
}
|
||||
|
||||
public ScaleSimpleDraweeView(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
|
||||
super(context, attrs, defStyleAttr, defStyleRes);
|
||||
init(context, attrs);
|
||||
}
|
||||
|
||||
public void init(Context context, AttributeSet attrs) {
|
||||
TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.ScaleView);
|
||||
int enumV = a.getInt(R.styleable.ScaleView_measureBy, 0);
|
||||
mFraction = a.getFloat(R.styleable.ScaleView_fractionValue, mFraction);
|
||||
if (enumV != 0) {
|
||||
mMeasureByHeight = true;
|
||||
}
|
||||
a.recycle();
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
|
||||
int width = MeasureSpec.getSize(widthMeasureSpec);
|
||||
int height = MeasureSpec.getSize(heightMeasureSpec);
|
||||
if (mMeasureByHeight) {
|
||||
setMeasuredDimension((int) (height * mFraction), height);
|
||||
} else {
|
||||
setMeasuredDimension(width, (int) (width * mFraction));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
87
app/src/main/java/com/gh/download/DBHelper.java
Normal file
87
app/src/main/java/com/gh/download/DBHelper.java
Normal file
@ -0,0 +1,87 @@
|
||||
package com.gh.download;
|
||||
|
||||
import android.content.Context;
|
||||
import android.database.sqlite.SQLiteDatabase;
|
||||
|
||||
import com.gh.common.util.Utils;
|
||||
import com.j256.ormlite.android.apptools.OrmLiteSqliteOpenHelper;
|
||||
import com.j256.ormlite.dao.Dao;
|
||||
import com.j256.ormlite.support.ConnectionSource;
|
||||
import com.j256.ormlite.table.TableUtils;
|
||||
|
||||
public class DBHelper extends OrmLiteSqliteOpenHelper {
|
||||
|
||||
private static final String DB_NAME = "gh_download.db";
|
||||
private static final int VERSION = 3;
|
||||
private static DBHelper mInstance;
|
||||
/**
|
||||
* downloadDao ,每张表对应一个
|
||||
*/
|
||||
private Dao<DownloadEntity, String> downloadDao;
|
||||
|
||||
private DBHelper(Context context) {
|
||||
super(context, DB_NAME, null, VERSION);
|
||||
}
|
||||
|
||||
/**
|
||||
* 单例获取该Helper
|
||||
*
|
||||
* @param context
|
||||
* @return
|
||||
*/
|
||||
public static synchronized DBHelper getInstance(Context context) {
|
||||
context = context.getApplicationContext();
|
||||
if (mInstance == null) {
|
||||
synchronized (DBHelper.class) {
|
||||
if (mInstance == null) {
|
||||
mInstance = new DBHelper(context);
|
||||
}
|
||||
}
|
||||
}
|
||||
return mInstance;
|
||||
}
|
||||
|
||||
public Dao<DownloadEntity, String> getDownloadDao() {
|
||||
try {
|
||||
if (downloadDao == null) {
|
||||
downloadDao = getDao(DownloadEntity.class);
|
||||
}
|
||||
} catch (java.sql.SQLException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
return downloadDao;
|
||||
} @Override
|
||||
public void onCreate(SQLiteDatabase database, ConnectionSource connectionSource) {
|
||||
try {
|
||||
Utils.log("ormlite_test", "onCreate ====================");
|
||||
TableUtils.createTable(connectionSource, DownloadEntity.class);
|
||||
} catch (java.sql.SQLException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onUpgrade(SQLiteDatabase database,
|
||||
ConnectionSource connectionSource,
|
||||
int oldVersion,
|
||||
int newVersion) {
|
||||
try {
|
||||
TableUtils.dropTable(connectionSource, DownloadEntity.class, true);
|
||||
onCreate(database, connectionSource);
|
||||
} catch (java.sql.SQLException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* 释放资源
|
||||
*/
|
||||
@Override
|
||||
public void close() {
|
||||
super.close();
|
||||
downloadDao = null;
|
||||
}
|
||||
|
||||
}
|
||||
56
app/src/main/java/com/gh/download/DataChanger.java
Normal file
56
app/src/main/java/com/gh/download/DataChanger.java
Normal file
@ -0,0 +1,56 @@
|
||||
package com.gh.download;
|
||||
|
||||
import java.util.Collections;
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
import java.util.Observable;
|
||||
|
||||
|
||||
public class DataChanger extends Observable {
|
||||
|
||||
private static DataChanger mInstance;
|
||||
private final Map<String, DownloadTask> mDownloadingTasks;//当前正在下载的任务队列
|
||||
private final Map<String, DownloadEntity> mDownloadEntries;//包含所有下载任务的任务队列
|
||||
|
||||
private DataChanger() {
|
||||
mDownloadingTasks = Collections.synchronizedMap(new HashMap<String, DownloadTask>());
|
||||
mDownloadEntries = Collections.synchronizedMap(new HashMap<String, DownloadEntity>());
|
||||
}
|
||||
|
||||
public static DataChanger getInstance() {
|
||||
if (mInstance == null) {
|
||||
mInstance = new DataChanger();
|
||||
}
|
||||
return mInstance;
|
||||
}
|
||||
|
||||
public synchronized void notifyDataChanged(DownloadEntity entry) {
|
||||
if (entry != null) {
|
||||
if (getDownloadEntries().get(entry.getUrl()) != null) {
|
||||
getDownloadEntries().put(entry.getUrl(), entry);
|
||||
}
|
||||
setChanged();
|
||||
notifyObservers(entry);
|
||||
}
|
||||
}
|
||||
|
||||
public Map<String, DownloadEntity> getDownloadEntries() {
|
||||
synchronized (mDownloadEntries) {
|
||||
return mDownloadEntries;
|
||||
}
|
||||
}
|
||||
|
||||
public synchronized void pauseDownloadingTasks(String url) {
|
||||
DownloadTask downloadTask = getDownloadingTasks().remove(url);
|
||||
if (downloadTask != null) {
|
||||
downloadTask.pause();
|
||||
}
|
||||
}
|
||||
|
||||
public Map<String, DownloadTask> getDownloadingTasks() {
|
||||
synchronized (mDownloadingTasks) {
|
||||
return mDownloadingTasks;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
18
app/src/main/java/com/gh/download/DataWatcher.java
Normal file
18
app/src/main/java/com/gh/download/DataWatcher.java
Normal file
@ -0,0 +1,18 @@
|
||||
package com.gh.download;
|
||||
|
||||
import java.util.Observable;
|
||||
import java.util.Observer;
|
||||
|
||||
|
||||
public abstract class DataWatcher implements Observer {
|
||||
|
||||
@Override
|
||||
public void update(Observable observable, Object data) {
|
||||
if (data != null && data instanceof DownloadEntity) {
|
||||
onDataChanged((DownloadEntity) data);
|
||||
}
|
||||
}
|
||||
|
||||
public abstract void onDataChanged(DownloadEntity downloadEntity);
|
||||
|
||||
}
|
||||
80
app/src/main/java/com/gh/download/DownloadDao.java
Normal file
80
app/src/main/java/com/gh/download/DownloadDao.java
Normal file
@ -0,0 +1,80 @@
|
||||
package com.gh.download;
|
||||
|
||||
import android.content.Context;
|
||||
import android.database.SQLException;
|
||||
|
||||
import com.j256.ormlite.dao.Dao;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
public class DownloadDao {
|
||||
|
||||
private static Dao<DownloadEntity, String> downloadDaoOpe;
|
||||
private static DBHelper helper;
|
||||
private static DownloadDao mInstance;
|
||||
|
||||
private DownloadDao(Context context) throws java.sql.SQLException {
|
||||
try {
|
||||
helper = DBHelper.getInstance(context);
|
||||
downloadDaoOpe = helper.getDownloadDao();
|
||||
} catch (SQLException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
public static DownloadDao getInstance(Context context) {
|
||||
helper = DBHelper.getInstance(context);
|
||||
try {
|
||||
if (mInstance == null) {
|
||||
synchronized (DownloadDao.class) {
|
||||
if (mInstance == null) {
|
||||
mInstance = new DownloadDao(context);
|
||||
}
|
||||
}
|
||||
}
|
||||
} catch (java.sql.SQLException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
return mInstance;
|
||||
}
|
||||
|
||||
public void newOrUpdate(DownloadEntity entry) {
|
||||
try {
|
||||
if (DownloadStatus.cancel.equals(entry.getStatus())) {
|
||||
downloadDaoOpe.delete(entry);
|
||||
} else {
|
||||
downloadDaoOpe.createOrUpdate(entry);
|
||||
}
|
||||
} catch (java.sql.SQLException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
public DownloadEntity get(String url) {
|
||||
try {
|
||||
return downloadDaoOpe.queryForId(url);
|
||||
} catch (java.sql.SQLException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
public List<DownloadEntity> getAll() {
|
||||
List<DownloadEntity> list = null;
|
||||
try {
|
||||
list = downloadDaoOpe.queryForAll();
|
||||
} catch (java.sql.SQLException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
return list;
|
||||
}
|
||||
|
||||
public void delete(String url) {
|
||||
try {
|
||||
downloadDaoOpe.deleteById(url);
|
||||
} catch (java.sql.SQLException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
368
app/src/main/java/com/gh/download/DownloadEntity.java
Normal file
368
app/src/main/java/com/gh/download/DownloadEntity.java
Normal file
@ -0,0 +1,368 @@
|
||||
package com.gh.download;
|
||||
|
||||
import com.gh.common.util.EntranceUtils;
|
||||
import com.j256.ormlite.field.DataType;
|
||||
import com.j256.ormlite.field.DatabaseField;
|
||||
import com.j256.ormlite.table.DatabaseTable;
|
||||
|
||||
import java.io.Serializable;
|
||||
import java.util.HashMap;
|
||||
|
||||
@DatabaseTable(tableName = "download")
|
||||
public class DownloadEntity implements Serializable {
|
||||
|
||||
/**
|
||||
*
|
||||
*/
|
||||
private static final long serialVersionUID = 1L;
|
||||
|
||||
@DatabaseField(id = true, columnName = "url")
|
||||
private String url;
|
||||
|
||||
@DatabaseField(columnName = "name")
|
||||
private String name;
|
||||
|
||||
@DatabaseField(columnName = "status")
|
||||
private DownloadStatus status;
|
||||
|
||||
@DatabaseField(columnName = "path")
|
||||
private String path;
|
||||
|
||||
@DatabaseField(columnName = "progress")
|
||||
private long progress;
|
||||
|
||||
@DatabaseField(columnName = "size")
|
||||
private long size;
|
||||
|
||||
@DatabaseField(columnName = "percent")
|
||||
private double percent;
|
||||
|
||||
@DatabaseField(columnName = "speed")
|
||||
private long speed;
|
||||
|
||||
@DatabaseField(columnName = "meta", dataType = DataType.SERIALIZABLE)
|
||||
private HashMap<String, String> meta;//其他
|
||||
|
||||
public String getGameId() {
|
||||
if (meta != null) {
|
||||
return meta.get("gameId");
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
public void setGameId(String gameId) {
|
||||
if (meta == null) {
|
||||
meta = new HashMap<>();
|
||||
}
|
||||
meta.put("gameId", gameId);
|
||||
}
|
||||
|
||||
public String getPackageName() {
|
||||
if (meta != null) {
|
||||
return meta.get("packageName");
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
public void setPackageName(String packageName) {
|
||||
if (meta == null) {
|
||||
meta = new HashMap<>();
|
||||
}
|
||||
meta.put("packageName", packageName);
|
||||
}
|
||||
|
||||
public String getETag() {
|
||||
if (meta != null) {
|
||||
return meta.get("ETag");
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
public void setETag(String ETag) {
|
||||
if (meta == null) {
|
||||
meta = new HashMap<>();
|
||||
}
|
||||
meta.put("ETag", ETag);
|
||||
}
|
||||
|
||||
public boolean isUpdate() {
|
||||
if (meta != null) {
|
||||
if ("true".equals(meta.get("isUpdate"))) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
public void setUpdate(boolean update) {
|
||||
if (meta == null) {
|
||||
meta = new HashMap<>();
|
||||
}
|
||||
meta.put("isUpdate", String.valueOf(update));
|
||||
}
|
||||
|
||||
public boolean isPlugin() {
|
||||
if (meta != null) {
|
||||
if ("true".equals(meta.get("isPlugin"))) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
public void setPlugin(boolean plugin) {
|
||||
if (meta == null) {
|
||||
meta = new HashMap<>();
|
||||
}
|
||||
meta.put("isPlugin", String.valueOf(plugin));
|
||||
}
|
||||
|
||||
public boolean isPluggable() {
|
||||
if (meta != null) {
|
||||
if ("true".equals(meta.get("isPluggable"))) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
public void setPluggable(boolean pluggable) {
|
||||
if (meta == null) {
|
||||
meta = new HashMap<>();
|
||||
}
|
||||
meta.put("isPluggable", String.valueOf(pluggable));
|
||||
}
|
||||
|
||||
public boolean isReset() {
|
||||
if (meta != null) {
|
||||
if ("true".equals(meta.get("isReset"))) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
public void setReset(boolean reset) {
|
||||
if (meta == null) {
|
||||
meta = new HashMap<>();
|
||||
}
|
||||
meta.put("isReset", String.valueOf(reset));
|
||||
}
|
||||
|
||||
public boolean isChange() {
|
||||
if (meta != null) {
|
||||
if ("true".equals(meta.get("isChange"))) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
public void setChange(boolean change) {
|
||||
if (meta == null) {
|
||||
meta = new HashMap<>();
|
||||
}
|
||||
meta.put("isChange", String.valueOf(change));
|
||||
}
|
||||
|
||||
public String getPlatform() {
|
||||
if (meta != null) {
|
||||
return meta.get("platform");
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
public void setPlatform(String platform) {
|
||||
if (meta == null) {
|
||||
meta = new HashMap<>();
|
||||
}
|
||||
meta.put("platform", platform);
|
||||
}
|
||||
|
||||
public String getIcon() {
|
||||
if (meta != null) {
|
||||
return meta.get("icon");
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
public void setIcon(String icon) {
|
||||
if (meta == null) {
|
||||
meta = new HashMap<>();
|
||||
}
|
||||
meta.put("icon", icon);
|
||||
}
|
||||
|
||||
public String getEntrance() {
|
||||
if (meta != null) {
|
||||
return meta.get(EntranceUtils.KEY_ENTRANCE);
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
public void setEntrance(String entrance) {
|
||||
if (meta == null) {
|
||||
meta = new HashMap<>();
|
||||
}
|
||||
meta.put(EntranceUtils.KEY_ENTRANCE, entrance);
|
||||
}
|
||||
|
||||
public String getLocation() {
|
||||
if (meta != null) {
|
||||
return meta.get("location");
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
public void setLocation(String location) {
|
||||
if (meta == null) {
|
||||
meta = new HashMap<>();
|
||||
}
|
||||
meta.put("location", location);
|
||||
}
|
||||
|
||||
public long getSpeed() {
|
||||
return speed;
|
||||
}
|
||||
|
||||
public void setSpeed(long speed) {
|
||||
this.speed = speed;
|
||||
}
|
||||
|
||||
public String getError() {
|
||||
if (meta != null) {
|
||||
return meta.get("error");
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
public void setError(String error) {
|
||||
if (meta == null) {
|
||||
meta = new HashMap<>();
|
||||
}
|
||||
meta.put("error", error);
|
||||
}
|
||||
|
||||
public long getStart() {
|
||||
if (meta != null) {
|
||||
String start = meta.get("start");
|
||||
if (start == null) {
|
||||
return 0;
|
||||
}
|
||||
return Long.valueOf(start);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
public void setStart(long start) {
|
||||
if (meta == null) {
|
||||
meta = new HashMap<>();
|
||||
}
|
||||
meta.put("start", String.valueOf(start));
|
||||
}
|
||||
|
||||
public long getEnd() {
|
||||
if (meta != null) {
|
||||
String end = meta.get("end");
|
||||
if (end == null) {
|
||||
return 0;
|
||||
}
|
||||
return Long.valueOf(end);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
public void setEnd(long end) {
|
||||
if (meta == null) {
|
||||
meta = new HashMap<>();
|
||||
}
|
||||
meta.put("end", String.valueOf(end));
|
||||
}
|
||||
|
||||
public long getInstalled() {
|
||||
if (meta != null) {
|
||||
String installed = meta.get("installed");
|
||||
if (installed == null) {
|
||||
return 0;
|
||||
}
|
||||
return Integer.valueOf(installed);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
public void setInstalled(int installed) {
|
||||
if (meta == null) {
|
||||
meta = new HashMap<>();
|
||||
}
|
||||
meta.put("installed", String.valueOf(installed));
|
||||
}
|
||||
|
||||
public HashMap<String, String> getMeta() {
|
||||
return meta;
|
||||
}
|
||||
|
||||
public void setMeta(HashMap<String, String> meta) {
|
||||
if (this.meta != null) {
|
||||
this.meta.putAll(meta);
|
||||
} else {
|
||||
this.meta = meta;
|
||||
}
|
||||
}
|
||||
|
||||
public double getPercent() {
|
||||
return percent;
|
||||
}
|
||||
|
||||
public void setPercent(double percent) {
|
||||
this.percent = percent;
|
||||
}
|
||||
|
||||
public String getName() {
|
||||
return name;
|
||||
}
|
||||
|
||||
public void setName(String name) {
|
||||
this.name = name;
|
||||
}
|
||||
|
||||
public DownloadStatus getStatus() {
|
||||
return status;
|
||||
}
|
||||
|
||||
public void setStatus(DownloadStatus status) {
|
||||
this.status = status;
|
||||
}
|
||||
|
||||
public String getUrl() {
|
||||
return url;
|
||||
}
|
||||
|
||||
public void setUrl(String url) {
|
||||
this.url = url;
|
||||
}
|
||||
|
||||
public String getPath() {
|
||||
return path;
|
||||
}
|
||||
|
||||
public void setPath(String path) {
|
||||
this.path = path;
|
||||
}
|
||||
|
||||
public long getProgress() {
|
||||
return progress;
|
||||
}
|
||||
|
||||
public void setProgress(long progress) {
|
||||
this.progress = progress;
|
||||
}
|
||||
|
||||
public long getSize() {
|
||||
return size;
|
||||
}
|
||||
|
||||
public void setSize(long size) {
|
||||
this.size = size;
|
||||
}
|
||||
|
||||
}
|
||||
31
app/src/main/java/com/gh/download/DownloadListener.java
Normal file
31
app/src/main/java/com/gh/download/DownloadListener.java
Normal file
@ -0,0 +1,31 @@
|
||||
package com.gh.download;
|
||||
|
||||
|
||||
/**
|
||||
* @author Stay
|
||||
* @version create time:Sep 23, 2014 5:52:11 PM
|
||||
*/
|
||||
public interface DownloadListener {
|
||||
|
||||
/**
|
||||
* 更新每一次下载的大小
|
||||
*
|
||||
* @param downloadedSize
|
||||
*/
|
||||
void onProgressChanged(long length, int downloadedSize);
|
||||
|
||||
/**
|
||||
* 更新任务下载状态
|
||||
*
|
||||
* @param status
|
||||
*/
|
||||
void onStatusChanged(DownloadStatus status);
|
||||
|
||||
/**
|
||||
* 更新任务下载状态
|
||||
*
|
||||
* @param status
|
||||
*/
|
||||
void onStatusChanged(DownloadStatus status, String error);
|
||||
|
||||
}
|
||||
@ -4,179 +4,74 @@ import android.content.Context;
|
||||
import android.content.Intent;
|
||||
import android.content.SharedPreferences;
|
||||
import android.os.Handler;
|
||||
import android.os.Looper;
|
||||
import android.os.Message;
|
||||
import android.preference.PreferenceManager;
|
||||
import android.support.v4.util.ArrayMap;
|
||||
import android.widget.Toast;
|
||||
|
||||
import com.gh.common.util.AppDebugConfig;
|
||||
import com.gh.common.constant.Config;
|
||||
import com.gh.common.constant.Constants;
|
||||
import com.gh.common.util.DataCollectionUtils;
|
||||
import com.gh.common.util.DialogUtils;
|
||||
import com.gh.common.util.FileUtils;
|
||||
import com.gh.common.util.MD5Utils;
|
||||
import com.gh.common.util.PackageUtils;
|
||||
import com.gh.common.util.Utils;
|
||||
import com.gh.gamecenter.entity.ApkEntity;
|
||||
import com.gh.gamecenter.entity.GameEntity;
|
||||
import com.gh.gamecenter.eventbus.EBDownloadStatus;
|
||||
import com.gh.gamecenter.manager.PackageManager;
|
||||
import com.lightgame.download.ConnectionUtils;
|
||||
import com.lightgame.download.DataChanger;
|
||||
import com.lightgame.download.DataWatcher;
|
||||
import com.lightgame.download.DownloadConfig;
|
||||
import com.lightgame.download.DownloadDao;
|
||||
import com.lightgame.download.DownloadEntity;
|
||||
import com.lightgame.download.DownloadService;
|
||||
import com.lightgame.download.DownloadStatus;
|
||||
import com.lightgame.download.DownloadStatusListener;
|
||||
import com.lightgame.download.DownloadStatusManager;
|
||||
import com.lightgame.download.FileUtils;
|
||||
import com.lightgame.utils.Utils;
|
||||
|
||||
import org.greenrobot.eventbus.EventBus;
|
||||
|
||||
import java.io.File;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.Map.Entry;
|
||||
import java.util.concurrent.LinkedBlockingQueue;
|
||||
|
||||
import static android.os.Build.MANUFACTURER;
|
||||
|
||||
public class DownloadManager implements DownloadStatusListener {
|
||||
public class DownloadManager {
|
||||
|
||||
private static DownloadManager mInstance;
|
||||
|
||||
private Context mContext;
|
||||
private Handler mHandler;
|
||||
private Context context;
|
||||
private Handler handler;
|
||||
|
||||
private ArrayMap<String, Long> lastTimeMap;
|
||||
private ArrayMap<String, LinkedBlockingQueue<String>> platformMap;
|
||||
private ArrayMap<String, ArrayMap<String, DownloadEntity>> gameMap;
|
||||
|
||||
/**
|
||||
* TODO change to {@link DownloadStatus}
|
||||
*/
|
||||
private ArrayMap<String, String> statusMap;
|
||||
private ArrayMap<String, DownloadEntity> downloadingMap;
|
||||
|
||||
private DownloadDao mDownloadDao;
|
||||
|
||||
@Override
|
||||
public void onTaskCancelled(DownloadEntity entity) {
|
||||
EBDownloadStatus status = new EBDownloadStatus("delete", entity.getName(),
|
||||
entity.getPlatform(), entity.getUrl(), entity.getPackageName());
|
||||
status.setPluggable(entity.isPluggable());
|
||||
EventBus.getDefault().post(status);
|
||||
|
||||
DownloadNotification.showDownloadingNotification(mContext);
|
||||
|
||||
DownloadManager.getInstance(mContext).putStatus(entity.getUrl(), "delete");
|
||||
|
||||
downloadingMap.remove(entity.getUrl());
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onTaskAdded(DownloadEntity entity) {
|
||||
EventBus.getDefault().post(new EBDownloadStatus("download"));
|
||||
|
||||
DownloadNotification.showDownloadingNotification(mContext);
|
||||
|
||||
downloadingMap.put(entity.getUrl(), entity);
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onTaskError(DownloadEntity entity) {
|
||||
DownloadNotification.showDownloadingNotification(mContext);
|
||||
downloadingMap.remove(entity.getUrl());
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onTaskStatusChanged(DownloadEntity entity) {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onTaskDone(DownloadEntity entity) {
|
||||
DownloadNotification.showDownloadingNotification(mContext);
|
||||
DownloadNotification.showDownloadDoneNotification(mContext, entity);
|
||||
downloadingMap.remove(entity.getUrl());
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onTaskPaused(DownloadEntity entity) {
|
||||
|
||||
}
|
||||
|
||||
private DownloadManager(Context context) {
|
||||
mContext = context.getApplicationContext();
|
||||
mDownloadDao = DownloadDao.getInstance(mContext);
|
||||
|
||||
//TODO unregister this
|
||||
DownloadStatusManager.getInstance().registerTaskStatusListener(this);
|
||||
|
||||
// 只有下载模块需要这坨东西,因此移动到这里初始化
|
||||
ConnectionUtils.initHttpsUrlConnection(context);
|
||||
|
||||
// DownloadNotification.showDownloadingNotification(mContext);
|
||||
this.context = context;
|
||||
|
||||
lastTimeMap = new ArrayMap<>();
|
||||
platformMap = new ArrayMap<>();
|
||||
gameMap = new ArrayMap<>();
|
||||
statusMap = new ArrayMap<>();
|
||||
downloadingMap = new ArrayMap<>();
|
||||
|
||||
mHandler = new Handler(Looper.getMainLooper()) {
|
||||
handler = new Handler(context.getMainLooper()) {
|
||||
@Override
|
||||
public void handleMessage(Message msg) {
|
||||
String url = (String) msg.obj;
|
||||
switch (msg.what) {
|
||||
case DownloadConfig.CONTINUE_DOWNLOAD_TASK:
|
||||
if (System.currentTimeMillis() - lastTimeMap.get(url) >= 1000) {
|
||||
resume(url);
|
||||
}
|
||||
break;
|
||||
case DownloadConfig.PAUSE_DOWNLOAD_TASK:
|
||||
if (System.currentTimeMillis() - lastTimeMap.get(url) >= 1000) {
|
||||
pause(url);
|
||||
}
|
||||
break;
|
||||
case DownloadConfig.DOWNLOAD_ROLL:
|
||||
LinkedBlockingQueue<String> queue = platformMap.get(url);
|
||||
if (queue.size() > 1) {
|
||||
queue.offer(queue.poll());
|
||||
Message message = Message.obtain();
|
||||
message.obj = url;
|
||||
message.what = DownloadConfig.DOWNLOAD_ROLL;
|
||||
sendMessageDelayed(message, 3000);
|
||||
}
|
||||
break;
|
||||
if (msg.what == Constants.CONTINUE_DOWNLOAD_TASK) {
|
||||
String url = (String) msg.obj;
|
||||
if (System.currentTimeMillis() - lastTimeMap.get(url) >= 1000) {
|
||||
resume(url);
|
||||
}
|
||||
} else if (msg.what == Constants.PAUSE_DOWNLOAD_TASK) {
|
||||
String url = (String) msg.obj;
|
||||
if (System.currentTimeMillis() - lastTimeMap.get(url) >= 1000) {
|
||||
pause(url);
|
||||
}
|
||||
} else if (msg.what == Constants.DOWNLOAD_ROLL) {
|
||||
String name = (String) msg.obj;
|
||||
LinkedBlockingQueue<String> queue = platformMap.get(name);
|
||||
if (queue.size() > 1) {
|
||||
queue.offer(queue.poll());
|
||||
Message message = Message.obtain();
|
||||
message.obj = name;
|
||||
message.what = Constants.DOWNLOAD_ROLL;
|
||||
sendMessageDelayed(message, 3000);
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
List<DownloadEntity> list = getAll();
|
||||
for (DownloadEntity downloadEntity : list) {
|
||||
statusMap.put(downloadEntity.getUrl(), downloadEntity.getStatus().name());
|
||||
if (!DownloadStatus.done.equals(downloadEntity.getStatus())) {
|
||||
downloadingMap.put(downloadEntity.getUrl(), downloadEntity);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
public ArrayMap<String, DownloadEntity> getDownloadingMap() {
|
||||
return downloadingMap;
|
||||
}
|
||||
|
||||
public static DownloadManager getInstance(Context context) {
|
||||
if (mInstance == null) {
|
||||
synchronized (DownloadManager.class) {
|
||||
if (mInstance == null) {
|
||||
mInstance = new DownloadManager(context.getApplicationContext());
|
||||
}
|
||||
}
|
||||
}
|
||||
return mInstance;
|
||||
}
|
||||
|
||||
public static void createDownload(Context context,
|
||||
@ -195,8 +90,8 @@ public class DownloadManager implements DownloadStatusListener {
|
||||
String location) {
|
||||
|
||||
// 安装指引
|
||||
if ("Huawei".equalsIgnoreCase(MANUFACTURER) || "Oppo".equalsIgnoreCase(MANUFACTURER)) {
|
||||
SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(context);
|
||||
if (android.os.Build.MANUFACTURER.equalsIgnoreCase("Huawei") || "Oppo".equalsIgnoreCase(android.os.Build.MANUFACTURER)) {
|
||||
SharedPreferences sp = context.getSharedPreferences(Config.PREFERENCE, Context.MODE_PRIVATE);
|
||||
final SharedPreferences.Editor edit = sp.edit();
|
||||
if (sp.getBoolean("InstallHint" + PackageUtils.getVersionName(context), true)) {
|
||||
DialogUtils.showInstallHintDialog(context,
|
||||
@ -234,16 +129,7 @@ public class DownloadManager implements DownloadStatusListener {
|
||||
downloadEntity.setPluggable(true);
|
||||
}
|
||||
downloadEntity.setPlugin(gameEntity.getTag() != null && gameEntity.getTag().size() != 0);
|
||||
|
||||
DownloadManager.getInstance(context).add(downloadEntity);
|
||||
|
||||
if (AppDebugConfig.IS_DEBUG) {
|
||||
AppDebugConfig.logMethodWithParams(DownloadManager.class, apkEntity.getUrl(), downloadEntity.getUrl(), method, entrance, location);
|
||||
}
|
||||
|
||||
//TODO remove
|
||||
DownloadManager.getInstance(context).putStatus(downloadEntity.getUrl(), "downloading");
|
||||
|
||||
DownloadManager.getInstance(context.getApplicationContext()).add(downloadEntity);
|
||||
// 收集下载数据
|
||||
DataCollectionUtils.uploadDownload(context, downloadEntity, "开始");
|
||||
}
|
||||
@ -259,27 +145,32 @@ public class DownloadManager implements DownloadStatusListener {
|
||||
checkDownloadEntryRecordValidate(url);
|
||||
if (isFileCompleted(url)) {
|
||||
downloadEntity.setStatus(DownloadStatus.done);
|
||||
DataChanger.INSTANCE.notifyDataChanged(downloadEntity);
|
||||
DataChanger.getInstance().notifyDataChanged(downloadEntity);
|
||||
} else if (!isTaskDownloading(url)) {
|
||||
mContext.startService(getIntent(downloadEntity, DownloadStatus.add));
|
||||
context.startService(getIntent(downloadEntity, DownloadStatus.add));
|
||||
}
|
||||
put(url, System.currentTimeMillis());
|
||||
putStatus(url, DownloadStatus.downloading.name());
|
||||
}
|
||||
Utils.log(DownloadManager.class.getSimpleName(), "add");
|
||||
}
|
||||
|
||||
public static DownloadManager getInstance(Context context) {
|
||||
if (mInstance == null) {
|
||||
mInstance = new DownloadManager(context.getApplicationContext());
|
||||
}
|
||||
return mInstance;
|
||||
}
|
||||
|
||||
/**
|
||||
* 根据url到本地sqlite数据库中查找并获取该文件的保存路径, 并检查改路径下文件是否存在,不存在则删除该条无效记录
|
||||
*
|
||||
* @param url 下载任务的标识url
|
||||
*/
|
||||
private boolean checkDownloadEntryRecordValidate(String url) {
|
||||
DownloadEntity entry = getDownloadEntityByUrl(url);
|
||||
DownloadEntity entry = get(url);
|
||||
if (entry != null && ((int) entry.getPercent()) != 0) {
|
||||
File file = new File(entry.getPath());
|
||||
if (!file.exists()) {
|
||||
mDownloadDao.delete(url);
|
||||
DownloadDao.getInstance(context).delete(url);
|
||||
Utils.log(DownloadManager.class.getSimpleName(), "文件不存在,删除该条无效数据库记录!");
|
||||
return true;
|
||||
}
|
||||
@ -294,18 +185,20 @@ public class DownloadManager implements DownloadStatusListener {
|
||||
* @return
|
||||
*/
|
||||
public boolean isFileCompleted(String url) {
|
||||
DownloadEntity entry = getDownloadEntityByUrl(url);
|
||||
DownloadEntity entry = get(url);
|
||||
|
||||
if (entry != null && entry.getPercent() == 100) {
|
||||
Utils.log(DownloadManager.class.getSimpleName(), "文件已经下载完成!");
|
||||
return true;
|
||||
if (entry != null) {
|
||||
if (entry.getPercent() == 100) {
|
||||
Utils.log(DownloadManager.class.getSimpleName(), "文件已经下载完成!");
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
public boolean isTaskDownloading(String url) {
|
||||
if (DataChanger.INSTANCE.getDownloadingTasks().get(url) != null) {
|
||||
if (DataChanger.getInstance().getDownloadingTasks().get(url) != null) {
|
||||
Utils.log(DownloadManager.class.getSimpleName(), url + "正在下载!");
|
||||
return true;
|
||||
}
|
||||
@ -313,9 +206,9 @@ public class DownloadManager implements DownloadStatusListener {
|
||||
}
|
||||
|
||||
private Intent getIntent(DownloadEntity entry, DownloadStatus status) {
|
||||
Intent service = new Intent(mContext, DownloadService.class);
|
||||
service.putExtra(DownloadConfig.KEY_DOWNLOAD_ENTRY, entry);
|
||||
service.putExtra(DownloadConfig.KEY_DOWNLOAD_ACTION, status.name());
|
||||
Intent service = new Intent(context, DownloadService.class);
|
||||
service.putExtra(Constants.KEY_DOWNLOAD_ENTRY, entry);
|
||||
service.putExtra(Constants.KEY_DOWNLOAD_ACTION, status.name());
|
||||
return service;
|
||||
}
|
||||
|
||||
@ -325,23 +218,8 @@ public class DownloadManager implements DownloadStatusListener {
|
||||
* @param url 下载链接
|
||||
* @return null表示下载列表中不存在该任务,否则返回下载任务
|
||||
*/
|
||||
public DownloadEntity getDownloadEntityByUrl(String url) {
|
||||
return mDownloadDao.get(url);
|
||||
}
|
||||
|
||||
/**
|
||||
* 根据包名获取某一个下载任务
|
||||
*
|
||||
* @param packageName 包名
|
||||
* @return null表示下载列表中不存在该任务,否则返回下载任务
|
||||
*/
|
||||
public DownloadEntity getDownloadEntityByPackageName(String packageName) {
|
||||
for (DownloadEntity downloadEntity : mDownloadDao.getAll()) {
|
||||
if (packageName.equals(downloadEntity.getPackageName())) {
|
||||
return downloadEntity;
|
||||
}
|
||||
}
|
||||
return null;
|
||||
public DownloadEntity get(String url) {
|
||||
return DownloadDao.getInstance(context).get(url);
|
||||
}
|
||||
|
||||
public void put(String url, long time) {
|
||||
@ -388,50 +266,45 @@ public class DownloadManager implements DownloadStatusListener {
|
||||
*/
|
||||
public List<DownloadEntity> getAll() {
|
||||
Utils.log(DownloadManager.class.getSimpleName(), "getAll");
|
||||
return mDownloadDao.getAll();
|
||||
return DownloadDao.getInstance(context).getAll();
|
||||
}
|
||||
|
||||
public ArrayMap<String, DownloadEntity> getEntryMap(String name) {
|
||||
return gameMap.get(name);
|
||||
}
|
||||
|
||||
void putStatus(String url, String status) {
|
||||
public void putStatus(String url, String status) {
|
||||
statusMap.put(url, status);
|
||||
onTaskStatusChanged(getDownloadEntityByUrl(url));
|
||||
}
|
||||
|
||||
public String getStatus(String url) {
|
||||
return statusMap.get(url);
|
||||
}
|
||||
|
||||
public ArrayMap<String, String> getStatusMap() {
|
||||
return statusMap;
|
||||
}
|
||||
|
||||
public void sendMessageDelayed(Message msg, long delayMillis) {
|
||||
mHandler.sendMessageDelayed(msg, delayMillis);
|
||||
handler.sendMessageDelayed(msg, delayMillis);
|
||||
}
|
||||
|
||||
/**
|
||||
* 根据url恢复下载 //TODO 这个可以删除的,全都在add判断,add的时候不需要关注任务真实状态
|
||||
* 根据url恢复下载
|
||||
*
|
||||
* @param url
|
||||
*/
|
||||
@Deprecated
|
||||
void resume(String url) {
|
||||
DownloadEntity entry = getDownloadEntityByUrl(url);
|
||||
public void resume(String url) {
|
||||
DownloadEntity entry = get(url);
|
||||
|
||||
// 暂停任务后,把文件删除,然后点继续,文件不存在,需要重新加入下载队列进行下载
|
||||
if (checkDownloadEntryRecordValidate(url)) {
|
||||
Toast.makeText(mContext, "文件不存在!已重新加入下载队列", Toast.LENGTH_SHORT).show();
|
||||
Toast.makeText(context, "文件不存在!已重新加入下载队列", Toast.LENGTH_SHORT)
|
||||
.show();
|
||||
add(entry);
|
||||
} else {
|
||||
if (entry != null) {
|
||||
if (isFileCompleted(url)) {
|
||||
entry.setStatus(DownloadStatus.done);
|
||||
DataChanger.INSTANCE.notifyDataChanged(entry);
|
||||
DataChanger.getInstance().notifyDataChanged(entry);
|
||||
} else if (!isTaskDownloading(url)) {
|
||||
mContext.startService(getIntent(entry, DownloadStatus.resume));
|
||||
context.startService(getIntent(entry, DownloadStatus.resume));
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -448,17 +321,17 @@ public class DownloadManager implements DownloadStatusListener {
|
||||
}
|
||||
|
||||
public void cancel(String url, boolean isDeleteFile) {
|
||||
DownloadEntity entry = mDownloadDao.get(url);
|
||||
DownloadEntity entry = DownloadDao.getInstance(context).get(url);
|
||||
if (entry != null) {
|
||||
if (isDeleteFile) {
|
||||
FileUtils.deleteFile(entry.getPath());
|
||||
}
|
||||
mDownloadDao.delete(url);
|
||||
Utils.log(DownloadManager.class.getSimpleName(), "cancel==>file and record were deleted!");
|
||||
DownloadDao.getInstance(context).delete(url);
|
||||
Utils.log(DownloadManager.class.getSimpleName(), "cancle==>file and record were deleted!");
|
||||
}
|
||||
if (entry != null) {
|
||||
entry.setStatus(DownloadStatus.cancel);
|
||||
mContext.startService(getIntent(entry, DownloadStatus.cancel));
|
||||
context.startService(getIntent(entry, DownloadStatus.cancel));
|
||||
Utils.log(DownloadManager.class.getSimpleName(), "cancel");
|
||||
}
|
||||
}
|
||||
@ -466,9 +339,10 @@ public class DownloadManager implements DownloadStatusListener {
|
||||
/**
|
||||
* 取消并删除所有下载任务(包括下载中、等待、暂停状态的任务)
|
||||
*/
|
||||
public void cancelAll() {
|
||||
for (DownloadEntity entry : DataChanger.INSTANCE.getDownloadEntries().values()) {
|
||||
cancel(entry.getUrl(), true);
|
||||
public void cancleAll() {
|
||||
for (Entry<String, DownloadEntity> entry : DataChanger.getInstance()
|
||||
.getDownloadEntries().entrySet()) {
|
||||
cancel(entry.getValue().getUrl(), true);
|
||||
}
|
||||
Utils.log(DownloadManager.class.getSimpleName(), "cancel all");
|
||||
}
|
||||
@ -477,8 +351,9 @@ public class DownloadManager implements DownloadStatusListener {
|
||||
* 开始所有下载任务
|
||||
*/
|
||||
public void startAll() {
|
||||
for (DownloadEntity entry : downloadingMap.values()) {
|
||||
add(entry);
|
||||
for (Entry<String, DownloadEntity> entry : DataChanger.getInstance()
|
||||
.getDownloadEntries().entrySet()) {
|
||||
add(entry.getValue());
|
||||
}
|
||||
Utils.log(DownloadManager.class.getSimpleName(), "start all");
|
||||
}
|
||||
@ -487,8 +362,10 @@ public class DownloadManager implements DownloadStatusListener {
|
||||
* 暂停所有正在下载的任务
|
||||
*/
|
||||
public void pauseAll() {
|
||||
for (DownloadEntity entity : DataChanger.INSTANCE.getDownloadEntries().values()) {
|
||||
pause(entity.getUrl());
|
||||
for (Entry<String, DownloadEntity> entry : DataChanger.getInstance().getDownloadEntries().entrySet()) {
|
||||
if (entry.getValue().getStatus() == DownloadStatus.downloading) {
|
||||
pause(entry.getValue().getUrl());
|
||||
}
|
||||
}
|
||||
Utils.log(DownloadManager.class.getSimpleName(), "pause all");
|
||||
}
|
||||
@ -500,55 +377,61 @@ public class DownloadManager implements DownloadStatusListener {
|
||||
*/
|
||||
public void pause(String url) {
|
||||
checkDownloadEntryRecordValidate(url);
|
||||
DownloadEntity entry = DataChanger.INSTANCE.getDownloadEntries().get(url);
|
||||
DownloadEntity entry = DataChanger.getInstance().getDownloadEntries()
|
||||
.get(url);
|
||||
if (entry != null) {
|
||||
mContext.startService(getIntent(entry, DownloadStatus.pause));
|
||||
put(url, System.currentTimeMillis());
|
||||
statusMap.put(url, DownloadStatus.pause.name());
|
||||
context.startService(getIntent(entry, DownloadStatus.pause));
|
||||
}
|
||||
Utils.log(DownloadManager.class.getSimpleName(), "pause");
|
||||
}
|
||||
|
||||
public void pause(DownloadEntity entity) {
|
||||
if (entity != null) {
|
||||
pause(entity.getUrl());
|
||||
/**
|
||||
* 根据包名获取某一个下载任务
|
||||
*
|
||||
* @param packageName 包名
|
||||
* @return null表示下载列表中不存在该任务,否则返回下载任务
|
||||
*/
|
||||
public DownloadEntity getByPackage(String packageName) {
|
||||
for (DownloadEntity downloadEntity : DownloadDao.getInstance(context).getAll()) {
|
||||
if (packageName.equals(downloadEntity.getPackageName())) {
|
||||
return downloadEntity;
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
/**
|
||||
* 检查数据库中当前是下载状态,但并未在下载进程中的下载数据
|
||||
*/
|
||||
public void checkAll() {
|
||||
final List<String> urlList = new ArrayList<>(DataChanger.INSTANCE.getDownloadingTasks().keySet());
|
||||
List<String> urlList = new ArrayList<>();
|
||||
for (Entry<String, DownloadTask> entry : DataChanger.getInstance()
|
||||
.getDownloadingTasks().entrySet()) {
|
||||
urlList.add(entry.getValue().getEntry().getUrl());
|
||||
}
|
||||
for (DownloadEntity downloadEntity : getAll()) {
|
||||
if (!urlList.contains(downloadEntity.getUrl())
|
||||
&& downloadEntity.getStatus().equals(DownloadStatus.downloading)) {
|
||||
downloadEntity.setStatus(DownloadStatus.pause);
|
||||
mDownloadDao.newOrUpdate(downloadEntity);
|
||||
DataChanger.INSTANCE.notifyDataChanged(downloadEntity);
|
||||
DownloadDao.getInstance(context).newOrUpdate(downloadEntity);
|
||||
DataChanger.getInstance().notifyDataChanged(downloadEntity);
|
||||
}
|
||||
}
|
||||
|
||||
// 开启下载服务
|
||||
mContext.startService(new Intent(mContext, DownloadService.class));
|
||||
|
||||
DownloadNotification.showDownloadingNotification(mContext);
|
||||
|
||||
}
|
||||
|
||||
public void addObserver(DataWatcher dataWatcher) {
|
||||
DataChanger.getInstance().addObserver(dataWatcher);
|
||||
Utils.log(DownloadManager.class.getSimpleName(), "addObserver");
|
||||
DataChanger.INSTANCE.addObserver(dataWatcher);
|
||||
}
|
||||
|
||||
public void removeObserver(DataWatcher dataWatcher) {
|
||||
DataChanger.getInstance().deleteObserver(dataWatcher);
|
||||
Utils.log(DownloadManager.class.getSimpleName(), "removeObserver");
|
||||
}
|
||||
|
||||
public void removeObservers() {
|
||||
DataChanger.getInstance().deleteObservers();
|
||||
Utils.log(DownloadManager.class.getSimpleName(), "removeObserver");
|
||||
DataChanger.INSTANCE.deleteObserver(dataWatcher);
|
||||
}
|
||||
//
|
||||
// public void removeObservers() {
|
||||
// Utils.log(DownloadManager.class.getSimpleName(), "removeObserver");
|
||||
// DataChanger.INSTANCE.deleteObservers();
|
||||
// }
|
||||
|
||||
}
|
||||
|
||||
@ -1,105 +0,0 @@
|
||||
package com.gh.download;
|
||||
|
||||
import android.app.Notification;
|
||||
import android.app.NotificationManager;
|
||||
import android.app.PendingIntent;
|
||||
import android.content.Context;
|
||||
import android.content.Intent;
|
||||
import android.support.v4.app.NotificationCompat;
|
||||
|
||||
import com.gh.common.util.AppDebugConfig;
|
||||
import com.gh.common.util.PlatformUtils;
|
||||
import com.gh.gamecenter.R;
|
||||
import com.lightgame.download.DownloadEntity;
|
||||
import com.lightgame.download.DownloadStatus;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
|
||||
/**
|
||||
* @author CsHeng
|
||||
* @Date 26/06/2017
|
||||
* @Time 6:01 PM
|
||||
*/
|
||||
|
||||
public class DownloadNotification {
|
||||
|
||||
public static final String ACTION_INSTALL = "com.gh.gamecenter.INSTALL";
|
||||
public static final String ACTION_DOWNLOAD = "com.gh.gamecenter.DOWNLOAD";
|
||||
public static final int ICON = R.drawable.logo;
|
||||
private static final int NOTIFY_ID = 0x123;
|
||||
|
||||
private static NotificationManager getNotificationManager(Context context) {
|
||||
return (NotificationManager) context.getApplicationContext().getSystemService(Context.NOTIFICATION_SERVICE);
|
||||
}
|
||||
|
||||
//TODO 下载重构
|
||||
public static void showDownloadDoneNotification(Context context, DownloadEntity downloadEntity) {
|
||||
final NotificationManager manager = getNotificationManager(context);
|
||||
Intent intent = new Intent();
|
||||
intent.putExtra("path", downloadEntity.getPath());
|
||||
intent.setAction(ACTION_INSTALL);
|
||||
final int requestCode = downloadEntity.getUrl().hashCode();
|
||||
final PendingIntent pendingIntent = PendingIntent.getBroadcast(context, requestCode, intent, PendingIntent.FLAG_UPDATE_CURRENT);
|
||||
String text;
|
||||
String title;
|
||||
if (downloadEntity.isPluggable()) {
|
||||
title = "下载完成,点击继续插件化";
|
||||
text = downloadEntity.getName() + " - "
|
||||
+ PlatformUtils.getInstance(context).getPlatformName(downloadEntity.getPlatform());
|
||||
} else {
|
||||
if (downloadEntity.isPlugin()) {
|
||||
text = downloadEntity.getName()
|
||||
+ " - " + PlatformUtils.getInstance(context).getPlatformName(downloadEntity.getPlatform());
|
||||
} else {
|
||||
text = downloadEntity.getName();
|
||||
}
|
||||
title = "下载完成,点击立即安装";
|
||||
}
|
||||
final Notification notification = new NotificationCompat.Builder(context)
|
||||
.setSmallIcon(R.drawable.logo)
|
||||
.setTicker(title)
|
||||
.setContentTitle(text)
|
||||
.setContentText(title)
|
||||
.setContentIntent(pendingIntent).build();
|
||||
// notification.defaults = Notification.DEFAULT_SOUND;// 添加系统默认声音
|
||||
notification.flags |= Notification.FLAG_AUTO_CANCEL; // // FLAG_AUTO_CANCEL表明当通知被用户点击时,通知将被清除。
|
||||
manager.notify(requestCode, notification);
|
||||
}
|
||||
|
||||
public static void showDownloadingNotification(Context context) {
|
||||
if (AppDebugConfig.IS_DEBUG) {
|
||||
AppDebugConfig.logMethodWithParams(DownloadNotification.class, context);
|
||||
}
|
||||
int downloadingSize = 0;
|
||||
final List<DownloadEntity> list = DownloadManager.getInstance(context).getAll();
|
||||
for (DownloadEntity entity : list) {
|
||||
if (entity.getStatus().equals(DownloadStatus.downloading)
|
||||
|| entity.getStatus().equals(DownloadStatus.waiting)
|
||||
|| entity.getStatus().equals(DownloadStatus.pause)
|
||||
|| entity.getStatus().equals(DownloadStatus.timeout)
|
||||
|| entity.getStatus().equals(DownloadStatus.neterror)) {
|
||||
downloadingSize++;
|
||||
}
|
||||
}
|
||||
NotificationManager nManager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
|
||||
if (downloadingSize == 0) {
|
||||
nManager.cancel(NOTIFY_ID);
|
||||
} else {
|
||||
Intent intent = new Intent();
|
||||
intent.setAction(ACTION_DOWNLOAD);
|
||||
PendingIntent pendingIntent = PendingIntent.getBroadcast(context, NOTIFY_ID,
|
||||
intent, PendingIntent.FLAG_UPDATE_CURRENT);
|
||||
Notification notification = new NotificationCompat.Builder(context)
|
||||
.setSmallIcon(ICON)
|
||||
.setTicker("点击查看")
|
||||
.setContentTitle("正在下载" + downloadingSize + "个游戏")
|
||||
.setContentText("点击查看")
|
||||
.setContentIntent(pendingIntent).build();
|
||||
// notification.defaults = Notification.DEFAULT_SOUND;// 添加系统默认声音
|
||||
notification.flags |= Notification.FLAG_NO_CLEAR; // 通知无法手动清除
|
||||
nManager.notify(NOTIFY_ID, notification);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
220
app/src/main/java/com/gh/download/DownloadService.java
Normal file
220
app/src/main/java/com/gh/download/DownloadService.java
Normal file
@ -0,0 +1,220 @@
|
||||
package com.gh.download;
|
||||
|
||||
import android.annotation.SuppressLint;
|
||||
import android.app.NotificationManager;
|
||||
import android.app.Service;
|
||||
import android.content.Context;
|
||||
import android.content.Intent;
|
||||
import android.os.Handler;
|
||||
import android.os.IBinder;
|
||||
import android.support.v4.util.ArrayMap;
|
||||
|
||||
import com.gh.common.constant.Constants;
|
||||
import com.gh.common.util.NotificationUtils;
|
||||
import com.gh.common.util.Utils;
|
||||
import com.gh.gamecenter.eventbus.EBDownloadStatus;
|
||||
|
||||
import org.greenrobot.eventbus.EventBus;
|
||||
|
||||
import java.util.Map.Entry;
|
||||
|
||||
|
||||
public class DownloadService extends Service {
|
||||
|
||||
private int mFlag = (int) System.currentTimeMillis() / 1000;
|
||||
|
||||
private ArrayMap<String, Integer> flagMap = new ArrayMap<>();
|
||||
@SuppressLint("HandlerLeak")
|
||||
private Handler handler = new Handler() {
|
||||
public void handleMessage(android.os.Message msg) {
|
||||
DownloadEntity entry = (DownloadEntity) msg.obj;
|
||||
DataChanger.getInstance().notifyDataChanged(entry);
|
||||
|
||||
if (msg.what == 1 && msg.obj != null) {
|
||||
switch (entry.getStatus()) {
|
||||
case downloading:
|
||||
break;
|
||||
case done:
|
||||
mFlag++;
|
||||
flagMap.put(entry.getUrl(), mFlag);
|
||||
NotificationUtils.showDownloadingNotification(DownloadService.this);
|
||||
NotificationUtils.showDownloadDoneNotification(DownloadService.this, entry, mFlag);
|
||||
removeAndCheckNext(entry);
|
||||
break;
|
||||
case pause:
|
||||
case cancel:
|
||||
removeAndCheckNext(entry);
|
||||
break;
|
||||
case timeout:
|
||||
case neterror:
|
||||
NotificationUtils.showDownloadingNotification(DownloadService.this);
|
||||
removeAndCheckNext(entry);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
@Override
|
||||
public void onCreate() {
|
||||
super.onCreate();
|
||||
Utils.log(DownloadService.class.getSimpleName(), "onCreate");
|
||||
// ArrayList<DownloadEntity> doneList = new ArrayList<>();
|
||||
// for (DownloadEntity downloadEntity : DownloadManager.getInstance(this).getAll()) {
|
||||
// if (downloadEntity.getStatus().equals(DownloadStatus.done)) {
|
||||
// doneList.add(downloadEntity);
|
||||
// }
|
||||
// }
|
||||
NotificationUtils.showDownloadingNotification(this);
|
||||
// if (doneList.size() != 0) {
|
||||
// for (DownloadEntity downloadEntity : doneList) {
|
||||
// mFlag++;
|
||||
// flagMap.put(downloadEntity.getUrl(), mFlag);
|
||||
// NotificationUtils.showDownloadDoneNotification(this, downloadEntity, mFlag);
|
||||
// }
|
||||
// }
|
||||
}
|
||||
|
||||
@Override
|
||||
public int onStartCommand(Intent intent, int flags, int startId) {
|
||||
Utils.log(DownloadService.class.getSimpleName(), "onStartCommand");
|
||||
if (intent != null && intent.getExtras() != null) {
|
||||
DownloadStatus status = DownloadStatus.valueOf(intent.getStringExtra(Constants.KEY_DOWNLOAD_ACTION));
|
||||
DownloadEntity entry = (DownloadEntity) intent.getSerializableExtra(Constants.KEY_DOWNLOAD_ENTRY);
|
||||
switch (status) {
|
||||
case add:
|
||||
addDownload(entry, true);
|
||||
break;
|
||||
case pause:
|
||||
case timeout:
|
||||
case neterror:
|
||||
pauseDownload(entry);
|
||||
break;
|
||||
case resume:
|
||||
resumeDownload(entry);
|
||||
break;
|
||||
case cancel:
|
||||
cancelDownload(entry);
|
||||
break;
|
||||
}
|
||||
}
|
||||
return super.onStartCommand(intent, flags, startId);
|
||||
}
|
||||
|
||||
private synchronized void addDownload(DownloadEntity entry, boolean isShow) {
|
||||
DownloadEntity downloadEntity = DownloadDao.getInstance(this).get(entry.getUrl());
|
||||
// 数据库下载历史中有这个任务的下载记录
|
||||
if (downloadEntity != null) {
|
||||
entry = downloadEntity;
|
||||
} else {
|
||||
entry.setStart(System.currentTimeMillis());
|
||||
}
|
||||
|
||||
if (DataChanger.getInstance().getDownloadingTasks().size() >= Constants.MAX_DOWNLOADING_SIZE) {
|
||||
// 1.改任务队列的状态
|
||||
entry.setStatus(DownloadStatus.waiting);
|
||||
DataChanger.getInstance().getDownloadEntries().put(entry.getUrl(), entry);
|
||||
// 2.改数据库状态
|
||||
DownloadDao.getInstance(this).newOrUpdate(entry);
|
||||
// 3.通知更新
|
||||
DataChanger.getInstance().notifyDataChanged(entry);
|
||||
} else {
|
||||
startDownload(entry);
|
||||
}
|
||||
Utils.log(DownloadService.class.getSimpleName(), "addDownload==>" + entry);
|
||||
EventBus.getDefault().post(new EBDownloadStatus("download"));
|
||||
|
||||
if (isShow) {
|
||||
NotificationUtils.showDownloadingNotification(this);
|
||||
}
|
||||
}
|
||||
|
||||
private synchronized void pauseDownload(DownloadEntity entry) {
|
||||
if (entry != null) {
|
||||
DownloadTask task = DataChanger.getInstance().getDownloadingTasks().get(entry.getUrl());
|
||||
if (task != null) {
|
||||
// 1.改任务队列的状态
|
||||
entry.setStatus(DownloadStatus.pause);
|
||||
}
|
||||
DataChanger.getInstance().pauseDownloadingTasks(entry.getUrl());
|
||||
entry.setStatus(DownloadStatus.pause);
|
||||
// 2.改数据库状态
|
||||
DownloadDao.getInstance(this).newOrUpdate(entry);
|
||||
// 3.通知更新
|
||||
DataChanger.getInstance().notifyDataChanged(entry);
|
||||
}
|
||||
Utils.log(DownloadService.class.getSimpleName(), "pauseDownload==>" + entry);
|
||||
}
|
||||
|
||||
private synchronized void resumeDownload(DownloadEntity entry) {
|
||||
addDownload(entry, false);
|
||||
Utils.log(DownloadService.class.getSimpleName(), "resumeDownload==>" + entry);
|
||||
}
|
||||
|
||||
private synchronized void cancelDownload(DownloadEntity downloadEntity) {
|
||||
DownloadTask task = DataChanger.getInstance().getDownloadingTasks()
|
||||
.get(downloadEntity.getUrl());
|
||||
if (task != null) {
|
||||
task.cancel();
|
||||
// 改任务队列的状态
|
||||
DataChanger.getInstance().getDownloadingTasks().remove(downloadEntity.getUrl());
|
||||
DataChanger.getInstance().notifyDataChanged(downloadEntity);
|
||||
}
|
||||
if (downloadEntity != null) {
|
||||
DataChanger.getInstance().getDownloadEntries().remove(downloadEntity.getUrl());
|
||||
DataChanger.getInstance().notifyDataChanged(downloadEntity);
|
||||
}
|
||||
Utils.log(DownloadService.class.getSimpleName(), "cancelDownload==>" + downloadEntity);
|
||||
EBDownloadStatus status = new EBDownloadStatus("delete", downloadEntity.getName(),
|
||||
downloadEntity.getPlatform(), downloadEntity.getUrl(), downloadEntity.getPackageName());
|
||||
status.setPluggable(downloadEntity.isPluggable());
|
||||
EventBus.getDefault().post(status);
|
||||
|
||||
Integer flag = flagMap.get(downloadEntity.getUrl());
|
||||
if (flag != null) {
|
||||
NotificationManager nManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
|
||||
nManager.cancel(flag);
|
||||
}
|
||||
NotificationUtils.showDownloadingNotification(DownloadService.this);
|
||||
}
|
||||
|
||||
private synchronized void startDownload(DownloadEntity entry) {
|
||||
// 1.改任务队列的状态
|
||||
entry.setStatus(DownloadStatus.downloading);
|
||||
DataChanger.getInstance().getDownloadEntries().put(entry.getUrl(), entry);
|
||||
DownloadTask task = new DownloadTask(handler, entry, this);
|
||||
task.start();
|
||||
DataChanger.getInstance().getDownloadingTasks().put(entry.getUrl(), task);
|
||||
// 2.改数据库状态
|
||||
DownloadDao.getInstance(this).newOrUpdate(entry);
|
||||
// 3.通知更新
|
||||
DataChanger.getInstance().notifyDataChanged(entry);
|
||||
|
||||
Utils.log(DownloadService.class.getSimpleName(), "startDownload==>" + entry);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onDestroy() {
|
||||
super.onDestroy();
|
||||
handler.removeCallbacksAndMessages(null);
|
||||
}
|
||||
|
||||
@Override
|
||||
public IBinder onBind(Intent intent) {
|
||||
return null;
|
||||
}
|
||||
|
||||
private synchronized void removeAndCheckNext(DownloadEntity downloadEntity) {
|
||||
DataChanger.getInstance().getDownloadingTasks().remove(downloadEntity.getUrl());
|
||||
DataChanger.getInstance().getDownloadEntries().remove(downloadEntity.getUrl());
|
||||
for (Entry<String, DownloadEntity> entry : DataChanger.getInstance().getDownloadEntries().entrySet()) {
|
||||
if (DownloadStatus.waiting.equals(entry.getValue().getStatus())) {
|
||||
startDownload(entry.getValue());
|
||||
return;
|
||||
}
|
||||
}
|
||||
Utils.log(DownloadService.class.getSimpleName(), "removeAndCheckNext==>" + downloadEntity);
|
||||
}
|
||||
}
|
||||
5
app/src/main/java/com/gh/download/DownloadStatus.java
Normal file
5
app/src/main/java/com/gh/download/DownloadStatus.java
Normal file
@ -0,0 +1,5 @@
|
||||
package com.gh.download;
|
||||
|
||||
public enum DownloadStatus {
|
||||
add, pause, cancel, downloading, done, waiting, resume, timeout, neterror, hijack, notfound
|
||||
}
|
||||
179
app/src/main/java/com/gh/download/DownloadTask.java
Normal file
179
app/src/main/java/com/gh/download/DownloadTask.java
Normal file
@ -0,0 +1,179 @@
|
||||
package com.gh.download;
|
||||
|
||||
import android.content.Context;
|
||||
import android.os.Handler;
|
||||
import android.os.Message;
|
||||
|
||||
import com.gh.common.constant.Constants;
|
||||
import com.gh.common.util.FileUtils;
|
||||
import com.gh.common.util.Utils;
|
||||
|
||||
import java.text.DecimalFormat;
|
||||
|
||||
public class DownloadTask implements DownloadListener {
|
||||
|
||||
private DownloadEntity entry;
|
||||
private Handler handler;
|
||||
private Context context;
|
||||
private DownloadThread downloadThread;
|
||||
|
||||
private double currPercent;
|
||||
private long totalSize;
|
||||
private long currSize;
|
||||
|
||||
// 计算下载速度
|
||||
private long lastTime;
|
||||
private long intervalDownloadedSize;
|
||||
|
||||
public DownloadTask(Handler handler, final DownloadEntity entry,
|
||||
Context context) {
|
||||
|
||||
this.entry = entry;
|
||||
this.handler = handler;
|
||||
|
||||
this.context = context;
|
||||
DownloadEntity historyEntry = DownloadDao.getInstance(context).get(
|
||||
entry.getUrl());
|
||||
if (historyEntry != null && historyEntry.getSize() != 0) {
|
||||
// 历史下载任务,初始化数据
|
||||
this.totalSize = entry.getSize();
|
||||
this.currPercent = (int) (entry.getProgress() * 100L / totalSize);
|
||||
Utils.log(DownloadTask.class.getSimpleName(),
|
||||
"DownloadTask==>" + "历史下载任务,初始化数据");
|
||||
} else {
|
||||
// 第一次下载
|
||||
this.currSize = 0;
|
||||
this.currPercent = 0;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
public void start() {
|
||||
// 从下载历史里获取过去下载的进度信息
|
||||
DownloadEntity downloadEntity = DownloadDao.getInstance(context).get(entry.getUrl());
|
||||
|
||||
if (downloadEntity != null) {
|
||||
entry = downloadEntity;
|
||||
entry.setStatus(DownloadStatus.downloading);
|
||||
Utils.log(DownloadTask.class.getSimpleName(),
|
||||
"start==>" + "load from history:" + entry.getUrl()
|
||||
+ "--" + entry.getProgress() + "," + entry.getSize());
|
||||
currSize = entry.getProgress();
|
||||
currPercent = entry.getPercent();
|
||||
} else {
|
||||
Utils.log(DownloadTask.class.getSimpleName(), "start==>" + "First log into history!");
|
||||
}
|
||||
|
||||
downloadThread = new DownloadThread(context, this.entry, this);
|
||||
downloadThread.setPriority(Thread.MAX_PRIORITY);
|
||||
downloadThread.start();
|
||||
}
|
||||
|
||||
@Override
|
||||
public synchronized void onProgressChanged(long length, int len) {
|
||||
currSize = length;
|
||||
double percent = 0;
|
||||
if (entry.getSize() != 0) {
|
||||
percent = currSize * 100.0 / entry.getSize();
|
||||
DecimalFormat df = new DecimalFormat("#.0");
|
||||
percent = Double.parseDouble(df.format(percent));
|
||||
}
|
||||
entry.setProgress(currSize);
|
||||
if (percent == 100.0d) {
|
||||
entry.setPercent(100);
|
||||
} else {
|
||||
entry.setPercent(percent);
|
||||
}
|
||||
|
||||
if (percent > currPercent) {
|
||||
currPercent = percent;
|
||||
Message msg = handler.obtainMessage();
|
||||
handler.removeMessages(0);
|
||||
msg.what = 0;
|
||||
msg.obj = entry;
|
||||
handler.sendMessage(msg);
|
||||
DownloadDao.getInstance(context).newOrUpdate(entry);
|
||||
}
|
||||
|
||||
// 计算下载速度
|
||||
if (System.currentTimeMillis() - lastTime > Constants.SPEED_CHECK_INTERVAL) {
|
||||
long speed = intervalDownloadedSize / (Constants.SPEED_CHECK_INTERVAL);
|
||||
if (speed < 0) {
|
||||
entry.setSpeed(0);
|
||||
} else {
|
||||
entry.setSpeed(speed);
|
||||
}
|
||||
lastTime = System.currentTimeMillis();
|
||||
intervalDownloadedSize = 0;
|
||||
DownloadDao.getInstance(context).newOrUpdate(entry);
|
||||
} else {
|
||||
intervalDownloadedSize += len;
|
||||
}
|
||||
|
||||
Utils.log(DownloadTask.class.getSimpleName(),
|
||||
"onProgressChanged==>" + entry.getName() + "**"
|
||||
+ entry.getPercent() + "%**" + entry.getSpeed() + "k/s");
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onStatusChanged(DownloadStatus status) {
|
||||
onStatusChanged(status, null);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onStatusChanged(DownloadStatus status, String error) {
|
||||
if (status == DownloadStatus.cancel
|
||||
|| status == DownloadStatus.hijack
|
||||
|| status == DownloadStatus.notfound) {
|
||||
entry.setProgress(0);
|
||||
entry.setPercent(0);
|
||||
if (status == DownloadStatus.hijack) {
|
||||
entry.setError(error);
|
||||
}
|
||||
FileUtils.deleteFile(entry.getPath());
|
||||
DownloadDao.getInstance(context).delete(entry.getUrl());
|
||||
Utils.log(DownloadTask.class.getSimpleName(),
|
||||
"onStatusChanged==>" + entry.getUrl() + " is calcled!");
|
||||
}
|
||||
|
||||
if (status == DownloadStatus.done) {
|
||||
entry.setSpeed(0);
|
||||
entry.setProgress(entry.getSize());
|
||||
entry.setPercent(100);
|
||||
entry.setEnd(System.currentTimeMillis());
|
||||
}
|
||||
|
||||
if (status == DownloadStatus.pause) {
|
||||
entry.setSpeed(0);
|
||||
}
|
||||
|
||||
/*********************** 处理网络异常 ***********************/
|
||||
if (status == DownloadStatus.timeout || status == DownloadStatus.neterror) {
|
||||
entry.setError(error);
|
||||
DownloadTask task = DataChanger.getInstance().getDownloadingTasks().remove(entry.getUrl());
|
||||
if (task != null) {
|
||||
task.pause();
|
||||
}
|
||||
}
|
||||
|
||||
entry.setStatus(status);
|
||||
DownloadDao.getInstance(context).newOrUpdate(entry);
|
||||
Message msg = handler.obtainMessage();
|
||||
msg.what = 1;
|
||||
msg.obj = entry;
|
||||
handler.sendMessage(msg);
|
||||
Utils.log(DownloadTask.class.getSimpleName(), "onStatusChanged:" + status);
|
||||
}
|
||||
|
||||
public void pause() {
|
||||
downloadThread.setStatus(DownloadStatus.pause);
|
||||
}
|
||||
|
||||
public void cancel() {
|
||||
downloadThread.setStatus(DownloadStatus.cancel);
|
||||
}
|
||||
|
||||
public DownloadEntity getEntry() {
|
||||
return entry;
|
||||
}
|
||||
}
|
||||
260
app/src/main/java/com/gh/download/DownloadThread.java
Normal file
260
app/src/main/java/com/gh/download/DownloadThread.java
Normal file
@ -0,0 +1,260 @@
|
||||
package com.gh.download;
|
||||
|
||||
import android.content.Context;
|
||||
import android.text.TextUtils;
|
||||
import android.util.Log;
|
||||
|
||||
import com.gh.common.util.HttpsUtils;
|
||||
import com.gh.common.util.Utils;
|
||||
|
||||
import org.json.JSONException;
|
||||
import org.json.JSONObject;
|
||||
|
||||
import java.io.BufferedInputStream;
|
||||
import java.io.BufferedOutputStream;
|
||||
import java.io.ByteArrayOutputStream;
|
||||
import java.io.File;
|
||||
import java.io.FileOutputStream;
|
||||
import java.io.IOException;
|
||||
import java.io.InputStream;
|
||||
import java.net.HttpURLConnection;
|
||||
import java.net.URL;
|
||||
import java.net.URLEncoder;
|
||||
|
||||
public class DownloadThread extends Thread {
|
||||
|
||||
private static final int CONNECT_TIME = 5000;
|
||||
private static final int READ_TIME = 5000;
|
||||
|
||||
private DownloadEntity entry;
|
||||
private DownloadListener listener;
|
||||
private DownloadStatus status;
|
||||
private Context context;
|
||||
|
||||
public DownloadThread(Context context, DownloadEntity entry, DownloadListener listener) {
|
||||
this.entry = entry;
|
||||
this.listener = listener;
|
||||
this.context = context;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void run() {
|
||||
super.run();
|
||||
download();
|
||||
}
|
||||
|
||||
private void download() {
|
||||
Utils.log("url = " + entry.getUrl());
|
||||
if (TextUtils.isEmpty(entry.getUrl())) {
|
||||
listener.onStatusChanged(DownloadStatus.notfound);
|
||||
Utils.log(DownloadThread.class.getSimpleName(), "error-->url is empty");
|
||||
return;
|
||||
}
|
||||
|
||||
BufferedInputStream bis = null;
|
||||
BufferedOutputStream bos = null;
|
||||
try {
|
||||
File targetFile = new File(entry.getPath());
|
||||
if (!targetFile.exists()) {
|
||||
File dir = targetFile.getParentFile();
|
||||
if (dir.exists() || dir.mkdirs()) {
|
||||
targetFile.createNewFile();
|
||||
}
|
||||
}
|
||||
|
||||
HttpURLConnection connection = openConnection(new URL(entry.getUrl()), targetFile.length());
|
||||
Utils.log(DownloadThread.class.getSimpleName(), "startPosition-->" + targetFile.length());
|
||||
|
||||
int code = connection.getResponseCode();
|
||||
if (code == HttpURLConnection.HTTP_MOVED_PERM
|
||||
|| code == HttpURLConnection.HTTP_MOVED_TEMP) {
|
||||
//未自动重定向
|
||||
String location = connection.getHeaderField("Location");
|
||||
Utils.log("location = " + location);
|
||||
connection = openConnection(new URL(location), targetFile.length());
|
||||
|
||||
code = connection.getResponseCode();
|
||||
}
|
||||
Utils.log("code = " + code);
|
||||
if (code == HttpURLConnection.HTTP_NOT_FOUND) {
|
||||
// 404 Not Found
|
||||
listener.onStatusChanged(DownloadStatus.notfound);
|
||||
Utils.log(DownloadThread.class.getSimpleName(), "error-->404 Not Found");
|
||||
return;
|
||||
}
|
||||
|
||||
String eTag = connection.getHeaderField("ETag");
|
||||
if (!TextUtils.isEmpty(eTag) && eTag.startsWith("\"") && eTag.endsWith("\"")) {
|
||||
eTag = eTag.substring(1, eTag.length() - 1);
|
||||
}
|
||||
String eTag2 = entry.getETag();
|
||||
if (!TextUtils.isEmpty(eTag2) && !eTag2.equals(eTag)) {
|
||||
// 链接被劫持,抛出异常
|
||||
if (!entry.isChange()
|
||||
&& "download.ghzhushou.com".equals(new URL(entry.getUrl()).getHost())
|
||||
&& ("apk2.ghzhushou.com".equals(connection.getURL().getHost())
|
||||
|| "apk.ghzhushou.com".equals(connection.getURL().getHost()))) {
|
||||
String newETag = getETag(entry.getUrl());
|
||||
if (!TextUtils.isEmpty(newETag)) {
|
||||
entry.setETag(newETag);
|
||||
entry.setChange(true);
|
||||
download();
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
// 妈的太长了,不测了。。直接copy一份简单点
|
||||
// 1. https://resource.ghzs666.com 对应原来的 https://apk.ghzhushou.com,已配置完毕
|
||||
// 2. https://apk.ghzs666.com 对应原来的 https://apk2.ghzhushou.com,已配置完毕
|
||||
// 3. https://resource.ghzs666.com域名的下载链接将不会增加,新产生的apk地址都会在https://apk.ghzs666.com中 @研发-林潘森
|
||||
if (!entry.isChange()
|
||||
&& "download.ghzs666.com".equals(new URL(entry.getUrl()).getHost())
|
||||
&& ("resource.ghzs666.com".equals(connection.getURL().getHost())
|
||||
|| "apk.ghzs666.com".equals(connection.getURL().getHost()))) {
|
||||
String newETag = getETag(entry.getUrl());
|
||||
if (!TextUtils.isEmpty(newETag)) {
|
||||
entry.setETag(newETag);
|
||||
entry.setChange(true);
|
||||
download();
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
Utils.log("eTag = " + eTag);
|
||||
Utils.log("eTag2 = " + eTag2);
|
||||
listener.onStatusChanged(DownloadStatus.hijack, connection.getURL().toString());
|
||||
Utils.log(DownloadThread.class.getSimpleName(), "error-->链接被劫持");
|
||||
return;
|
||||
}
|
||||
|
||||
long conentLength = connection.getContentLength();
|
||||
// 第一次下载记录文件长度
|
||||
if (entry.getSize() == 0) {
|
||||
entry.setSize(conentLength);
|
||||
DownloadDao.getInstance(context).newOrUpdate(entry);
|
||||
Utils.log(DownloadThread.class.getSimpleName(), "记录第一次长度");
|
||||
}
|
||||
Utils.log(DownloadThread.class.getSimpleName(),
|
||||
"progress:" + entry.getProgress() + "/curfilesize:"
|
||||
+ targetFile.length() + "=====contentLength:"
|
||||
+ conentLength + "/ totalSize:" + entry.getSize());
|
||||
|
||||
bis = new BufferedInputStream(connection.getInputStream());
|
||||
if (targetFile.length() > 0) {
|
||||
bos = new BufferedOutputStream(new FileOutputStream(entry.getPath(), true));
|
||||
} else {
|
||||
bos = new BufferedOutputStream(new FileOutputStream(entry.getPath()));
|
||||
}
|
||||
|
||||
byte[] buffer = new byte[2048];
|
||||
int len;
|
||||
while ((len = bis.read(buffer)) != -1) {
|
||||
bos.write(buffer, 0, len);
|
||||
listener.onProgressChanged(targetFile.length(), len);
|
||||
if (status == DownloadStatus.pause
|
||||
|| status == DownloadStatus.cancel) {
|
||||
listener.onStatusChanged(status);
|
||||
break;
|
||||
}
|
||||
}
|
||||
bos.flush();
|
||||
Utils.log(DownloadThread.class.getSimpleName(),
|
||||
"flush==>" + targetFile.length() + ",progress==>"
|
||||
+ entry.getProgress() + ",size==>" + entry.getSize());
|
||||
|
||||
if (entry.getPath().contains("/data/data/com.gh.gamecenter")) {
|
||||
// 存储在/data/data/包名目录下,添加apk的权限,避免权限导致的解析出错
|
||||
try {
|
||||
Runtime.getRuntime().exec("chmod 755 " + entry.getPath());
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
if (targetFile.length() == entry.getSize()) {
|
||||
listener.onStatusChanged(DownloadStatus.done);
|
||||
}
|
||||
} catch (Exception e) {
|
||||
if (!entry.isReset()) {
|
||||
entry.setReset(true);
|
||||
download();
|
||||
} else {
|
||||
String errorMsg = Log.getStackTraceString(e);
|
||||
if (!TextUtils.isEmpty(e.getMessage()) && e.getMessage().contains("connection timeout")) {
|
||||
listener.onStatusChanged(DownloadStatus.timeout, errorMsg);
|
||||
} else {
|
||||
listener.onStatusChanged(DownloadStatus.neterror, errorMsg);
|
||||
}
|
||||
Utils.log(DownloadThread.class.getSimpleName(), "exception-->" + e.toString());
|
||||
}
|
||||
} finally {
|
||||
if (bis != null) {
|
||||
try {
|
||||
bis.close();
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
if (bos != null) {
|
||||
try {
|
||||
bos.close();
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private HttpURLConnection openConnection(URL url, long range) throws Exception {
|
||||
HttpURLConnection connection;
|
||||
if ("https".equals(url.getProtocol())) {
|
||||
connection = HttpsUtils.getHttpsURLConnection(url);
|
||||
} else {
|
||||
connection = (HttpURLConnection) url.openConnection();
|
||||
}
|
||||
connection.setRequestMethod("GET");
|
||||
connection.setConnectTimeout(CONNECT_TIME);
|
||||
connection.setReadTimeout(READ_TIME);
|
||||
connection.setDoInput(true);
|
||||
connection.setRequestProperty("RANGE", "bytes=" + range + "-");
|
||||
//设置自动重定向
|
||||
connection.setInstanceFollowRedirects(true);
|
||||
return connection;
|
||||
}
|
||||
|
||||
private String getETag(String url) {
|
||||
try {
|
||||
String newUrl = "http://download.ghzs666.com/etag"
|
||||
+ "?url=" + URLEncoder.encode(url, "utf-8")
|
||||
+ "&" + System.currentTimeMillis();
|
||||
HttpURLConnection connection = (HttpURLConnection) new URL(newUrl).openConnection();
|
||||
connection.setRequestMethod("GET");
|
||||
connection.setConnectTimeout(CONNECT_TIME);
|
||||
connection.setReadTimeout(READ_TIME);
|
||||
connection.setDoInput(true);
|
||||
connection.connect();
|
||||
|
||||
int code = connection.getResponseCode();
|
||||
if (code == 200) {
|
||||
InputStream is = connection.getInputStream();
|
||||
ByteArrayOutputStream baos = new ByteArrayOutputStream();
|
||||
byte[] buffer = new byte[2048];
|
||||
int len;
|
||||
while ((len = is.read(buffer)) != -1) {
|
||||
baos.write(buffer, 0, len);
|
||||
}
|
||||
baos.flush();
|
||||
JSONObject response = new JSONObject(baos.toString("utf-8"));
|
||||
return response.getString("etag");
|
||||
}
|
||||
} catch (IOException | JSONException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
public void setStatus(DownloadStatus status) {
|
||||
this.status = status;
|
||||
}
|
||||
|
||||
}
|
||||
@ -1,14 +1,11 @@
|
||||
package com.gh.gamecenter;
|
||||
|
||||
import android.content.Context;
|
||||
import android.content.Intent;
|
||||
import android.os.Bundle;
|
||||
import android.os.Handler;
|
||||
import android.os.Message;
|
||||
import android.support.annotation.NonNull;
|
||||
import android.view.View;
|
||||
import android.widget.ProgressBar;
|
||||
import android.widget.RelativeLayout;
|
||||
import android.widget.TextView;
|
||||
|
||||
import com.gh.base.BaseActivity;
|
||||
@ -28,19 +25,11 @@ public class AboutActivity extends BaseActivity {
|
||||
|
||||
@BindView(R.id.about_version_tv)
|
||||
TextView mAboutVersion;
|
||||
@BindView(R.id.setting_rl_update)
|
||||
RelativeLayout mAboutUpdateRl;
|
||||
@BindView(R.id.about_version_pb)
|
||||
ProgressBar mAboutPb;
|
||||
|
||||
private Handler handler = new MyHandler(this);
|
||||
|
||||
@NonNull
|
||||
public static Intent getIntent(Context context) {
|
||||
Intent intent = new Intent(context, AboutActivity.class);
|
||||
return intent;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected int getLayoutId() {
|
||||
return R.layout.activity_about;
|
||||
@ -49,9 +38,11 @@ public class AboutActivity extends BaseActivity {
|
||||
@Override
|
||||
protected void onCreate(Bundle savedInstanceState) {
|
||||
super.onCreate(savedInstanceState);
|
||||
initTitle(getString(R.string.title_about));
|
||||
init(getString(R.string.title_about));
|
||||
|
||||
((TextView) findViewById(R.id.about_tv_version)).setText("V" + PackageUtils.getVersionName(this));
|
||||
|
||||
UpdateManager.getInstance(this).checkUpdate(false, handler); // 自动检出更新
|
||||
}
|
||||
|
||||
@Override
|
||||
@ -60,17 +51,20 @@ public class AboutActivity extends BaseActivity {
|
||||
handler.removeCallbacksAndMessages(null);
|
||||
}
|
||||
|
||||
@OnClick({R.id.about_shengming, R.id.setting_rl_update})
|
||||
@OnClick({R.id.about_version_tv, R.id.about_shengming})
|
||||
public void OnClick(View view) {
|
||||
if (view.getId() == R.id.setting_rl_update) {
|
||||
UpdateManager.getInstance(AboutActivity.this).checkUpdate(false, handler); // 检出更新
|
||||
if (view.getId() == R.id.about_version_tv) {
|
||||
String content = mAboutVersion.getText().toString();
|
||||
if (content.startsWith("发现新版本")) {
|
||||
UpdateManager.getInstance(this).checkUpdate(false, handler); // 自动检出更新
|
||||
}
|
||||
} else if (view.getId() == R.id.about_shengming) {
|
||||
Intent intent = WebActivity.getWebIntent(this);
|
||||
startActivity(intent);
|
||||
}
|
||||
}
|
||||
|
||||
private static class MyHandler extends Handler {
|
||||
static class MyHandler extends Handler {
|
||||
|
||||
private WeakReference<AboutActivity> mWeakReference;
|
||||
|
||||
@ -86,8 +80,10 @@ public class AboutActivity extends BaseActivity {
|
||||
if (msg.what == 0) {
|
||||
final String version = (String) msg.obj;
|
||||
activity.mAboutVersion.setText(StringUtils.buildString("发现新版本 V", version));
|
||||
activity.mAboutPb.setVisibility(View.GONE);
|
||||
} else if (msg.what == 1) {
|
||||
activity.mAboutVersion.setText("已是最新版本");
|
||||
activity.mAboutPb.setVisibility(View.GONE);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -10,8 +10,6 @@ import android.net.wifi.ScanResult;
|
||||
import android.os.Bundle;
|
||||
import android.os.Handler;
|
||||
import android.os.Message;
|
||||
import android.preference.PreferenceManager;
|
||||
import android.support.annotation.NonNull;
|
||||
import android.support.v4.content.ContextCompat;
|
||||
import android.text.Html;
|
||||
import android.view.Gravity;
|
||||
@ -27,14 +25,16 @@ import android.widget.LinearLayout;
|
||||
import android.widget.RelativeLayout;
|
||||
import android.widget.TextView;
|
||||
|
||||
import com.facebook.drawee.backends.pipeline.Fresco;
|
||||
import com.facebook.drawee.interfaces.DraweeController;
|
||||
import com.facebook.drawee.view.SimpleDraweeView;
|
||||
import com.gh.base.AppController;
|
||||
import com.gh.base.BaseActivity;
|
||||
import com.gh.common.constant.Config;
|
||||
import com.gh.common.util.DialogUtils;
|
||||
import com.gh.common.util.DisplayUtils;
|
||||
import com.gh.common.util.UserIconUtils;
|
||||
import com.lightgame.utils.Utils;
|
||||
import com.gh.common.view.RadarView;
|
||||
import com.gh.common.util.Utils;
|
||||
import com.gh.gamecenter.kuaichuan.BaseTransfer;
|
||||
import com.gh.gamecenter.kuaichuan.Constant;
|
||||
import com.gh.gamecenter.kuaichuan.FileInfo;
|
||||
@ -86,8 +86,8 @@ public class ChooseReceiverActivity extends BaseActivity implements View.OnClick
|
||||
SimpleDraweeView userIcon3;
|
||||
@BindView(R.id.choosereceiver_user4_icon)
|
||||
SimpleDraweeView userIcon4;
|
||||
@BindView(R.id.choosereceiver_radar)
|
||||
RadarView mRadarView;
|
||||
@BindView(R.id.scan_gif)
|
||||
SimpleDraweeView mScanGif;
|
||||
@BindView(R.id.scan_user)
|
||||
TextView mScanUser;
|
||||
@BindView(R.id.scan_user_des)
|
||||
@ -132,13 +132,6 @@ public class ChooseReceiverActivity extends BaseActivity implements View.OnClick
|
||||
|
||||
private Handler handler = new MyHandler(this);
|
||||
|
||||
@NonNull
|
||||
public static Intent getIntent(Context context, boolean showConnHintDialog) {
|
||||
Intent intent = new Intent(context, ChooseReceiverActivity.class);
|
||||
intent.putExtra("showConnHintDialog", showConnHintDialog);
|
||||
return intent;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected int getLayoutId() {
|
||||
return R.layout.activity_choosereceiver;
|
||||
@ -154,7 +147,7 @@ public class ChooseReceiverActivity extends BaseActivity implements View.OnClick
|
||||
@Override
|
||||
protected void onCreate(Bundle savedInstanceState) {
|
||||
super.onCreate(savedInstanceState);
|
||||
initTitle(getString(R.string.title_choose_activity));
|
||||
init(getString(R.string.title_choose_activity));
|
||||
|
||||
mTitleTv.setTextColor(Color.WHITE);
|
||||
mBackIv.setImageResource(R.drawable.reuse_kc_back);
|
||||
@ -169,7 +162,6 @@ public class ChooseReceiverActivity extends BaseActivity implements View.OnClick
|
||||
RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(
|
||||
ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.MATCH_PARENT);
|
||||
params.addRule(RelativeLayout.ALIGN_PARENT_RIGHT);
|
||||
params.addRule(RelativeLayout.CENTER_VERTICAL);
|
||||
RelativeLayout reuse_actionbar = (RelativeLayout) mContentView.findViewById(
|
||||
R.id.reuse_actionbar);
|
||||
reuse_actionbar.addView(hintTv, params);
|
||||
@ -201,9 +193,14 @@ public class ChooseReceiverActivity extends BaseActivity implements View.OnClick
|
||||
}
|
||||
|
||||
private void init() {
|
||||
sp = PreferenceManager.getDefaultSharedPreferences(this);
|
||||
sp = getSharedPreferences(Config.PREFERENCE, Context.MODE_PRIVATE);
|
||||
conUserIconTag = 1;
|
||||
mRadarView.setSearching(true);
|
||||
|
||||
DraweeController controller = Fresco.newDraweeControllerBuilder()
|
||||
.setUri("asset:///scan_receiver.gif")
|
||||
.setAutoPlayAnimations(true)
|
||||
.build();
|
||||
mScanGif.setController(controller);
|
||||
|
||||
mScanHint.setText(Html.fromHtml("<u>" + "好友还没安装光环助手?请点这里" + "</u>"));
|
||||
|
||||
@ -301,13 +298,10 @@ public class ChooseReceiverActivity extends BaseActivity implements View.OnClick
|
||||
@Override
|
||||
protected void onDestroy() {
|
||||
super.onDestroy();
|
||||
mRadarView.setSearching(false);
|
||||
isDestroy = true;
|
||||
isStopScan = true;
|
||||
handler.removeCallbacksAndMessages(null);
|
||||
}
|
||||
|
||||
@Override
|
||||
} @Override
|
||||
public void onClick(View v) {
|
||||
if (v == choosereceiver_user1) {
|
||||
connReceiverWifi(0);
|
||||
@ -328,9 +322,8 @@ public class ChooseReceiverActivity extends BaseActivity implements View.OnClick
|
||||
|
||||
// TODO 关闭扫描??
|
||||
|
||||
startActivity(ShareGhActivity.getIntent(this));
|
||||
startActivity(new Intent(this, ShareGhActivity.class));
|
||||
} //1.连接网络
|
||||
|
||||
private void connReceiverWifi(int connPosition) {
|
||||
|
||||
if (isStopScan) {
|
||||
@ -379,9 +372,8 @@ public class ChooseReceiverActivity extends BaseActivity implements View.OnClick
|
||||
closeSocket();
|
||||
AppController.remove("FileInfo");
|
||||
} //发送UDP通知信息到 文件接收方 开启ServerSocketRunnable
|
||||
|
||||
private void createSendMsgToServerRunnable(final String ipAddress) {
|
||||
AppController.MAIN_EXECUTOR.execute(new Runnable() {
|
||||
AppController.MAIN_EXECUTOR.execute(new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
try {
|
||||
@ -420,9 +412,7 @@ public class ChooseReceiverActivity extends BaseActivity implements View.OnClick
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void startFileSenderServer(String ipAddress) throws Exception {
|
||||
} private void startFileSenderServer(String ipAddress) throws Exception {
|
||||
int serverPort = Constant.DEFAULT_SERVER_COM_PORT;
|
||||
|
||||
// 确保Wifi连接上之后获取得到IP地址
|
||||
@ -495,7 +485,6 @@ public class ChooseReceiverActivity extends BaseActivity implements View.OnClick
|
||||
handler.post(new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
mRadarView.setSearching(false);
|
||||
connSuccessAnimView();
|
||||
}
|
||||
});
|
||||
@ -597,7 +586,7 @@ public class ChooseReceiverActivity extends BaseActivity implements View.OnClick
|
||||
@Override
|
||||
public void onAnimationEnd(Animation animation) {
|
||||
mRoketAnimRl.setVisibility(View.GONE);
|
||||
startActivity(FileSenderActivity.getIntent(ChooseReceiverActivity.this));
|
||||
startActivity(new Intent(ChooseReceiverActivity.this, FileSenderActivity.class));
|
||||
closeSocket();
|
||||
Intent resultIntent = new Intent();
|
||||
resultIntent.putExtra("isFinish", true);
|
||||
@ -647,6 +636,11 @@ public class ChooseReceiverActivity extends BaseActivity implements View.OnClick
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* 关闭UDP Socket 流
|
||||
*/
|
||||
|
||||
@ -1,9 +1,7 @@
|
||||
package com.gh.gamecenter;
|
||||
|
||||
import android.content.Context;
|
||||
import android.content.Intent;
|
||||
import android.os.Bundle;
|
||||
import android.support.annotation.NonNull;
|
||||
import android.support.v4.util.ArrayMap;
|
||||
import android.support.v7.widget.LinearLayoutManager;
|
||||
import android.support.v7.widget.RecyclerView;
|
||||
@ -19,7 +17,7 @@ import android.widget.TextView;
|
||||
import com.gh.base.BaseActivity;
|
||||
import com.gh.common.util.DialogUtils;
|
||||
import com.gh.common.util.StringUtils;
|
||||
import com.lightgame.utils.Utils;
|
||||
import com.gh.common.util.Utils;
|
||||
import com.gh.common.view.VerticalItemDecoration;
|
||||
import com.gh.gamecenter.adapter.CleanApkAdapter;
|
||||
import com.gh.gamecenter.entity.InstallGameEntity;
|
||||
@ -62,12 +60,6 @@ public class CleanApkActivity extends BaseActivity implements CleanApkAdapter.On
|
||||
|
||||
private CleanApkAdapter mAdapter;
|
||||
|
||||
@NonNull
|
||||
public static Intent getIntent(Context context) {
|
||||
Intent intent = new Intent(context, CleanApkActivity.class);
|
||||
return intent;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected int getLayoutId() {
|
||||
return R.layout.activity_clean_apk;
|
||||
@ -76,11 +68,11 @@ public class CleanApkActivity extends BaseActivity implements CleanApkAdapter.On
|
||||
@Override
|
||||
protected void onCreate(Bundle savedInstanceState) {
|
||||
super.onCreate(savedInstanceState);
|
||||
initTitle(getString(R.string.title_clean_apk));
|
||||
init(getString(R.string.title_clean_apk));
|
||||
|
||||
mNodataSkipLl.setVisibility(View.GONE);
|
||||
|
||||
mAdapter = new CleanApkAdapter(this, this, mApkDeleteBtn, mApkSelectAll);
|
||||
mAdapter = new CleanApkAdapter(this, mApkDeleteBtn, mApkSelectAll);
|
||||
mApkRv.setLayoutManager(new LinearLayoutManager(this));
|
||||
mApkRv.addItemDecoration(new VerticalItemDecoration(this, 8, true));
|
||||
mApkRv.setAdapter(mAdapter);
|
||||
|
||||
@ -5,6 +5,9 @@ import android.content.Intent;
|
||||
import android.os.Bundle;
|
||||
import android.support.v7.widget.LinearLayoutManager;
|
||||
import android.support.v7.widget.RecyclerView;
|
||||
import android.view.View;
|
||||
import android.widget.LinearLayout;
|
||||
import android.widget.TextView;
|
||||
|
||||
import com.gh.base.BaseActivity;
|
||||
import com.gh.gamecenter.adapter.CommentDetailAdapter;
|
||||
@ -18,6 +21,10 @@ public class CommentDetailActivity extends BaseActivity {
|
||||
|
||||
@BindView(R.id.comment_detail_rv)
|
||||
RecyclerView mRecyclerView;
|
||||
@BindView(R.id.reuse_none_data)
|
||||
LinearLayout mNoData;
|
||||
@BindView(R.id.reuse_tv_none_data)
|
||||
TextView mNoDataTv;
|
||||
|
||||
private CommentDetailAdapter mAdapter;
|
||||
private LinearLayoutManager mLayoutManager;
|
||||
@ -37,11 +44,11 @@ public class CommentDetailActivity extends BaseActivity {
|
||||
@Override
|
||||
protected void onCreate(Bundle savedInstanceState) {
|
||||
super.onCreate(savedInstanceState);
|
||||
initTitle(getString(R.string.title_comment_detail));
|
||||
init(getString(R.string.title_comment_detail));
|
||||
|
||||
String commentId = getIntent().getExtras().getString("commentId");
|
||||
|
||||
mAdapter = new CommentDetailAdapter(this, commentId);
|
||||
mAdapter = new CommentDetailAdapter(this, this, commentId);
|
||||
mLayoutManager = new LinearLayoutManager(this);
|
||||
mRecyclerView.setLayoutManager(mLayoutManager);
|
||||
mRecyclerView.setAdapter(mAdapter);
|
||||
@ -56,4 +63,12 @@ public class CommentDetailActivity extends BaseActivity {
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
@Override
|
||||
public void loadEmpty() {
|
||||
super.loadEmpty();
|
||||
mNoData.setVisibility(View.VISIBLE);
|
||||
mNoDataTv.setText("天了噜~页面不见了");
|
||||
mRecyclerView.setVisibility(View.GONE);
|
||||
}
|
||||
}
|
||||
|
||||
@ -1,18 +0,0 @@
|
||||
package com.gh.gamecenter;
|
||||
|
||||
import com.gh.base.BaseAppCompatToolBarActivity;
|
||||
|
||||
public class CommonActivity extends BaseAppCompatToolBarActivity {
|
||||
|
||||
@Override
|
||||
protected int getLayoutId() {
|
||||
return R.layout.layout_wrapper_toolbar;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected boolean onNavigationIconClicked() {
|
||||
finish();
|
||||
return true;
|
||||
}
|
||||
|
||||
}
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user