Compare commits

..

9 Commits
v3.0 ... v2.6

563 changed files with 19961 additions and 15972 deletions

4
.gitmodules vendored
View File

@ -1,4 +0,0 @@
[submodule "libraries/LGLibrary"]
path = libraries/LGLibrary
url = git@gitlab.ghzhushou.com:client/client-common.git
branch = master

View File

@ -1,8 +0,0 @@
### Ver 3.0
* x
### Ver 2.6
* xx
### Ver 2.5
* 此处写本次更新所做的业务和代码修改

View File

@ -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
* 此处写本次更新所做的业务和代码修改

View File

@ -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')
}

View File

@ -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.** {*;}

View File

@ -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);
}
}

View File

@ -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

Binary file not shown.

After

Width:  |  Height:  |  Size: 544 KiB

View File

@ -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;
// }
}

View 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);
// }
//
//}

View 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));
// }
// }
//
//}

View File

@ -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 {

View File

@ -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() {
}
}

View 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为0game_url为对应的游戏链接aid传联运游戏的aid
// * 对于非联运游戏传入非联运游戏的game_idgame_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);
}
}

View 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);
}
}
}

View File

@ -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

View File

@ -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);
}
}
}
}

View 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() {
}
}

View 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();
// }
//
//}

View File

@ -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);
}
}

View File

@ -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();
}

View File

@ -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) {

View File

@ -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) {

View 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);
}
}
}
}

View 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();
}

View File

@ -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;
}
}

View 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();
}

View File

@ -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() {
}
}

View File

@ -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);
}
}
}

View File

@ -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);
}
}

View File

@ -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);
}

View File

@ -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}$";

View 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;
}
}

View File

@ -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();
}
}

View File

@ -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();
}
}

View File

@ -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

View 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"));
}
});
}
}

View File

@ -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"))
}
})
}
}

View File

@ -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;

View File

@ -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;

View File

@ -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上报日志或错误

View File

@ -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);
}
}
}
}
}

View File

@ -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();
}

View File

@ -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);
}

View 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());
}
// 设置DataOutputStreamgetOutputStream中默认调用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();
}
}
}
}
}

View File

@ -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++;

View File

@ -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);
}
}

View 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;
}
}

View 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());
}
}

View File

@ -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)
}
}
}

View File

@ -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;

View File

@ -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)

View File

@ -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);
}
}

View File

@ -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);
}
}

View File

@ -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;

View File

@ -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);
}
}

View 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);
}
}
}

View File

@ -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;

View File

@ -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();
}
}

View File

@ -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;

View File

@ -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;

View File

@ -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.
*/

View File

@ -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;

View File

@ -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();
}
}

View 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);
}
}

View File

@ -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);

View File

@ -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);
}
}

View File

@ -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);
}
/*

View File

@ -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);

View File

@ -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;
}
}
}

View File

@ -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);
}
}
}
}
}

View 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);
}
}

View File

@ -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;
}
}

View 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);
}
}
}

View 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;
}
}

View File

@ -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);
}
}

View File

@ -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();

View File

@ -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;
}
}

View File

@ -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;
}
}

View File

@ -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;
}
}

View File

@ -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));
}
}
}

View File

@ -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));
}
}
}

View 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;
}
}

View 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;
}
}
}

View 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);
}

View 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();
}
}
}

View 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;
}
}

View File

@ -0,0 +1,31 @@
package com.gh.download;
/**
* @author Stay
* @version create timeSep 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);
}

View File

@ -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();
// }
}

View File

@ -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);
}
}
}

View 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);
}
}

View File

@ -0,0 +1,5 @@
package com.gh.download;
public enum DownloadStatus {
add, pause, cancel, downloading, done, waiting, resume, timeout, neterror, hijack, notfound
}

View 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;
}
}

View 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;
}
}

View File

@ -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);
}
}
}

View File

@ -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 流
*/

View File

@ -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);

View File

@ -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);
}
}

View File

@ -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