925 lines
40 KiB
Java
925 lines
40 KiB
Java
package com.gh.gamecenter;
|
||
|
||
import android.annotation.SuppressLint;
|
||
import android.app.Activity;
|
||
import android.app.Dialog;
|
||
import android.app.NotificationManager;
|
||
import android.content.Context;
|
||
import android.content.Intent;
|
||
import android.content.SharedPreferences;
|
||
import android.content.pm.ApplicationInfo;
|
||
import android.graphics.Color;
|
||
import android.os.Build;
|
||
import android.os.Bundle;
|
||
import android.os.Handler;
|
||
import android.os.SystemClock;
|
||
import android.preference.PreferenceManager;
|
||
import android.text.Html;
|
||
import android.text.TextUtils;
|
||
import android.util.Log;
|
||
import android.view.KeyEvent;
|
||
import android.view.LayoutInflater;
|
||
import android.view.View;
|
||
import android.view.Window;
|
||
import android.widget.TextView;
|
||
|
||
import com.gh.base.AppUncaughtHandler;
|
||
import com.gh.base.BaseActivity;
|
||
import com.gh.base.fragment.BaseFragment_ViewPager;
|
||
import com.gh.common.AppExecutor;
|
||
import com.gh.common.DefaultUrlHandler;
|
||
import com.gh.common.avoidcallback.AvoidOnResultManager;
|
||
import com.gh.common.constant.Config;
|
||
import com.gh.common.constant.Constants;
|
||
import com.gh.common.emulator.EmulatorGameManager;
|
||
import com.gh.common.exposure.meta.MetaUtil;
|
||
import com.gh.common.im.ImManager;
|
||
import com.gh.common.loghub.LoghubUtils;
|
||
import com.gh.common.repository.ReservationRepository;
|
||
import com.gh.common.util.ActivationHelper;
|
||
import com.gh.common.util.ClassUtils;
|
||
import com.gh.common.util.ConcernUtils;
|
||
import com.gh.common.util.DataCollectionUtils;
|
||
import com.gh.common.util.DataUtils;
|
||
import com.gh.common.util.DeviceTokenUtils;
|
||
import com.gh.common.util.DeviceUtils;
|
||
import com.gh.common.util.DialogUtils;
|
||
import com.gh.common.util.DirectUtils;
|
||
import com.gh.common.util.DisplayUtils;
|
||
import com.gh.common.util.EntranceUtils;
|
||
import com.gh.common.util.HomePluggableHelper;
|
||
import com.gh.common.util.LogUtils;
|
||
import com.gh.common.util.LunchType;
|
||
import com.gh.common.util.MtaHelper;
|
||
import com.gh.common.util.NotificationHelper;
|
||
import com.gh.common.util.PackageInstaller;
|
||
import com.gh.common.util.PackageUtils;
|
||
import com.gh.common.util.PlatformUtils;
|
||
import com.gh.common.util.PushHelper;
|
||
import com.gh.common.util.SPUtils;
|
||
import com.gh.common.util.ShareUtils;
|
||
import com.gh.common.util.ThirdPartyPackageHelper;
|
||
import com.gh.common.util.UrlFilterUtils;
|
||
import com.gh.download.DownloadManager;
|
||
import com.gh.gamecenter.download.DownloadFragment;
|
||
import com.gh.gamecenter.entity.CommunityEntity;
|
||
import com.gh.gamecenter.entity.GameDigestEntity;
|
||
import com.gh.gamecenter.entity.InnerMetaInfoEntity;
|
||
import com.gh.gamecenter.entity.NotificationUgc;
|
||
import com.gh.gamecenter.eventbus.EBNetworkState;
|
||
import com.gh.gamecenter.eventbus.EBPackage;
|
||
import com.gh.gamecenter.eventbus.EBReuse;
|
||
import com.gh.gamecenter.eventbus.EBSkip;
|
||
import com.gh.gamecenter.fragment.MainWrapperFragment;
|
||
import com.gh.gamecenter.manager.DataCollectionManager;
|
||
import com.gh.gamecenter.manager.UpdateManager;
|
||
import com.gh.gamecenter.manager.UserManager;
|
||
import com.gh.gamecenter.normal.NormalFragment;
|
||
import com.gh.gamecenter.packagehelper.PackageRepository;
|
||
import com.gh.gamecenter.packagehelper.PackageViewModel;
|
||
import com.gh.gamecenter.qa.CommunityFragment;
|
||
import com.gh.gamecenter.retrofit.EmptyResponse;
|
||
import com.gh.gamecenter.retrofit.Response;
|
||
import com.gh.gamecenter.retrofit.RetrofitManager;
|
||
import com.gh.gamecenter.suggest.SuggestSelectFragment;
|
||
import com.gh.gamecenter.suggest.SuggestType;
|
||
import com.google.gson.Gson;
|
||
import com.google.gson.reflect.TypeToken;
|
||
import com.halo.assistant.HaloApp;
|
||
import com.halo.assistant.fragment.SettingsFragment;
|
||
import com.lightgame.config.CommonDebug;
|
||
import com.lightgame.download.DownloadEntity;
|
||
import com.lightgame.download.DownloadStatus;
|
||
import com.lightgame.download.FileUtils;
|
||
import com.lightgame.utils.AppManager;
|
||
import com.lightgame.utils.Utils;
|
||
import com.tencent.bugly.beta.tinker.TinkerManager;
|
||
import com.tencent.bugly.crashreport.CrashReport;
|
||
import com.umeng.message.PushAgent;
|
||
|
||
import org.greenrobot.eventbus.EventBus;
|
||
import org.greenrobot.eventbus.Subscribe;
|
||
import org.greenrobot.eventbus.ThreadMode;
|
||
import org.json.JSONException;
|
||
import org.json.JSONObject;
|
||
|
||
import java.io.BufferedReader;
|
||
import java.io.File;
|
||
import java.io.IOException;
|
||
import java.io.InputStream;
|
||
import java.io.InputStreamReader;
|
||
import java.lang.reflect.Type;
|
||
import java.util.Enumeration;
|
||
import java.util.HashMap;
|
||
import java.util.HashSet;
|
||
import java.util.List;
|
||
import java.util.Map;
|
||
import java.util.Set;
|
||
import java.util.Timer;
|
||
import java.util.TimerTask;
|
||
import java.util.zip.ZipEntry;
|
||
import java.util.zip.ZipFile;
|
||
|
||
import androidx.annotation.NonNull;
|
||
import androidx.lifecycle.ViewModelProviders;
|
||
import io.reactivex.android.schedulers.AndroidSchedulers;
|
||
import io.reactivex.schedulers.Schedulers;
|
||
import okhttp3.MediaType;
|
||
import okhttp3.RequestBody;
|
||
import okhttp3.ResponseBody;
|
||
|
||
import static com.gh.common.util.EntranceUtils.ENTRANCE_BROWSER;
|
||
import static com.gh.common.util.EntranceUtils.HOST_QQ;
|
||
import static com.gh.common.util.EntranceUtils.HOST_QQ_GROUP;
|
||
import static com.gh.common.util.EntranceUtils.HOST_WEB;
|
||
import static com.gh.common.util.EntranceUtils.KEY_DATA;
|
||
import static com.gh.common.util.EntranceUtils.KEY_NEXT_TO;
|
||
import static com.gh.common.util.EntranceUtils.KEY_TO;
|
||
import static com.gh.common.util.EntranceUtils.KEY_TYPE;
|
||
import static com.gh.gamecenter.fragment.MainWrapperFragment.INDEX_PERSONAL;
|
||
import static com.gh.gamecenter.personal.PersonalFragment.LOGIN_TAG;
|
||
import static com.gh.gamecenter.personal.PersonalFragment.LOGOUT_TAG;
|
||
|
||
public class MainActivity extends BaseActivity {
|
||
|
||
public final static String EB_SKIP_MAIN = "MainActivity";
|
||
public final static String SHOULD_INIT_IM = "should_init_im";
|
||
public final static String SWITCH_TO_COMMUNITY = "switch_to_community";
|
||
public final static String SWITCH_TO_VIDEO = "switch_to_video";
|
||
|
||
private final static String CURRENT_PAGE = "current_page";
|
||
|
||
private PackageViewModel mPackageViewModel;
|
||
|
||
private MainWrapperFragment mMainWrapperFragment;
|
||
|
||
private SharedPreferences mSp;
|
||
// 黄壮华 按连续按返回键两次才退出应用
|
||
private long[] mHits = new long[2];
|
||
|
||
public static boolean isNewFirstLaunch;
|
||
|
||
private Handler handler = new Handler();
|
||
|
||
@Override
|
||
protected void onCreate(Bundle savedInstanceState) {
|
||
super.onCreate(savedInstanceState);
|
||
setStatusBarColor(Color.TRANSPARENT);
|
||
|
||
mMainWrapperFragment = new MainWrapperFragment();
|
||
if (savedInstanceState != null) {
|
||
mMainWrapperFragment.setArguments(savedInstanceState);
|
||
} else if (getIntent() != null) {
|
||
mMainWrapperFragment.setArguments(getIntent().getExtras());
|
||
}
|
||
replaceFragment(mMainWrapperFragment);
|
||
|
||
mSp = PreferenceManager.getDefaultSharedPreferences(this);
|
||
|
||
isNewFirstLaunch = mSp.getBoolean("isNewFirstLaunchV" + PackageUtils.getVersionName(), true);
|
||
if (isNewFirstLaunch) {
|
||
final LunchType lunchType = DeviceTokenUtils.getLaunchType();
|
||
// 延时两秒提交,避免提交时还没获取到 GID/OAID
|
||
AppExecutor.getUiExecutor().executeWithDelay(() -> {
|
||
if (!this.isFinishing()) {
|
||
LogUtils.uploadDevice(lunchType);
|
||
ActivationHelper.sendActivationInfo();
|
||
}
|
||
}, 2000L);
|
||
getPluginUpdate();
|
||
mSp.edit().putBoolean("isNewFirstLaunchV" + PackageUtils.getVersionName(), false).apply();
|
||
|
||
checkDevice(); // 根据设备信息判断用户是否是新用户
|
||
}
|
||
|
||
// 若 SplashActivity 没能获取到 Gid 这里再重试一次
|
||
if (TextUtils.isEmpty(HaloApp.getInstance().getGid())) {
|
||
DataUtils.getGid();
|
||
}
|
||
|
||
mPackageViewModel = ViewModelProviders.of(this, new PackageViewModel.Factory()).get(PackageViewModel.class);
|
||
|
||
final String message = Config.getExceptionMsg();
|
||
if (!TextUtils.isEmpty(message)) {
|
||
Config.setExceptionMsg(null);
|
||
AppUncaughtHandler.reportException(this, new Throwable(message));
|
||
DialogUtils.showWarningDialog(this, "发生闪退", "光环助手刚刚发生了闪退,马上反馈以帮助我们更好地修复问题?(只需简单描述你刚才的操作)"
|
||
, "暂不", "马上反馈",
|
||
() -> {
|
||
startActivityForResult(SuggestionActivity.getIntent(MainActivity.this, SuggestType.crash, "APP闪退:"), 100);
|
||
MtaHelper.onEventWithBasicDeviceInfo(
|
||
"闪退弹窗",
|
||
"玩家操作", "点击反馈");
|
||
},
|
||
() -> MtaHelper.onEventWithBasicDeviceInfo(
|
||
"闪退弹窗",
|
||
"玩家操作", "点击关闭"));
|
||
}
|
||
|
||
// checkTinkerPath(); // 看情况是否需要显示补丁弹窗
|
||
|
||
// 必须放在这里,否则会导致获取 baseActivity 不是本应用包名
|
||
DownloadManager.getInstance(this).initDownloadService();
|
||
|
||
checkNotificationPermission();
|
||
|
||
// 初始化 IM,只有在 APP 刚启动时执行
|
||
if (HaloApp.get(SHOULD_INIT_IM, false) != null) {
|
||
HaloApp.put(SHOULD_INIT_IM, false);
|
||
handler.postDelayed(ImManager::attachIm, 1000);
|
||
}
|
||
|
||
ReservationRepository.refreshReservations();
|
||
|
||
if (getIntent().getBooleanExtra(SWITCH_TO_COMMUNITY, false)) {
|
||
handler.postDelayed(this::switchToCommunityTabAndRefresh, 800);
|
||
}
|
||
if (getIntent().getBooleanExtra(SWITCH_TO_VIDEO, false)) {
|
||
handler.postDelayed(() -> mMainWrapperFragment.setCurrentItem(2), 800);
|
||
}
|
||
|
||
// 跳转至其它页面
|
||
if (getIntent() != null
|
||
&& getIntent().getExtras() != null
|
||
&& getIntent().getBooleanExtra(EntranceUtils.KEY_REQUIRE_REDIRECT, false)) {
|
||
doSkip();
|
||
}
|
||
|
||
if (BuildConfig.DEBUG) {
|
||
handler.postDelayed(() -> {
|
||
EntranceUtils.jumpShortcut(this);
|
||
}, 500);
|
||
}
|
||
|
||
handler.postDelayed(() -> {
|
||
PushHelper.postPushClickAction(this.getApplicationContext(), null);
|
||
}, 2000);
|
||
|
||
|
||
// 耗时操作
|
||
AppExecutor.getIoExecutor().execute(() -> {
|
||
// 上传数据
|
||
DataCollectionManager.getInstance(getApplicationContext()).upload();
|
||
// 获取默认配置
|
||
Config.getGhzsSettings();
|
||
// 检查助手更新
|
||
UpdateManager.getInstance(this).checkUpdate(true, null);
|
||
// 初始化PlatformUtils
|
||
PlatformUtils.getInstance(getApplicationContext());
|
||
// 友盟记录启动
|
||
PushAgent.getInstance(this).onAppStart();
|
||
|
||
HomePluggableHelper.activationFilterData();
|
||
});
|
||
// 刷新本地已下载的模拟器游戏
|
||
EmulatorGameManager.refreshLocalPackageList();
|
||
|
||
|
||
//启动app删除视频缓存文件
|
||
AppExecutor.getIoExecutor().execute(() -> {
|
||
try {
|
||
String dirPath = getCacheDir().getAbsolutePath() + File.separator + "exo";
|
||
FileUtils.deleteFolder(new File(dirPath));
|
||
} catch (Exception e) {
|
||
e.printStackTrace();
|
||
}
|
||
});
|
||
|
||
//恢复顶部视频默认静音状态
|
||
SPUtils.setBoolean(Constants.SP_TOP_VIDEO_VOICE, true);
|
||
//恢复视频流非Wifi提醒
|
||
SPUtils.setBoolean(Constants.SP_NON_WIFI_TIPS, true);
|
||
//重置顶部视频播放进度
|
||
SPUtils.setString(Constants.SP_TOP_VIDEO_SCHEDULE, "");
|
||
}
|
||
|
||
@Override
|
||
protected void onRestoreInstanceState(Bundle savedInstanceState) {
|
||
super.onRestoreInstanceState(savedInstanceState);
|
||
if (savedInstanceState != null) {
|
||
int currentPageIndex = savedInstanceState.getInt(CURRENT_PAGE, -1);
|
||
if (currentPageIndex >= 0) {
|
||
EventBus.getDefault().post(new EBSkip(MainActivity.EB_SKIP_MAIN, currentPageIndex));
|
||
if (currentPageIndex == MainWrapperFragment.INDEX_VIDEO) {
|
||
DisplayUtils.setLightStatusBar(this, false);
|
||
}
|
||
}
|
||
}
|
||
}
|
||
|
||
@Override
|
||
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
|
||
super.onActivityResult(requestCode, resultCode, data);
|
||
if (requestCode == 100 && resultCode == SuggestSelectFragment.SUGGEST_TYPE_REQUEST) {
|
||
showKefuReportDialog();
|
||
}
|
||
}
|
||
|
||
private void showKefuReportDialog() {
|
||
// 只有是APP闪退反馈成功后弹出联系客服的弹窗
|
||
String str = "您也可以联系客服进一步描述闪退的情况,如果您反馈的是新问题,即有机会获得红包奖励";
|
||
DialogUtils.showWarningDialog(MainActivity.this, "反馈成功", Html.fromHtml(str.substring(0, str.indexOf("红包奖励")) + "<font color='#FF0000'>红包奖励</font>"), "暂不", "联系客服",
|
||
() -> {
|
||
if (ShareUtils.isQQClientAvailable(this)) {
|
||
DirectUtils.directToQqConversation(this, null);
|
||
} else {
|
||
toast("本机未安装QQ应用");
|
||
}
|
||
}, null);
|
||
}
|
||
|
||
@Override
|
||
protected void onDestroy() {
|
||
super.onDestroy();
|
||
|
||
handler.removeCallbacksAndMessages(null);
|
||
}
|
||
|
||
@NonNull
|
||
public static Intent getMainIntent(Context context) {
|
||
Intent intent = new Intent(context, MainActivity.class);
|
||
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
|
||
return intent;
|
||
}
|
||
|
||
private void doSkip() {
|
||
if (getIntent() != null && getIntent().getExtras() != null) {
|
||
getIntent().getExtras().putBoolean(EntranceUtils.KEY_REQUIRE_REDIRECT, false);
|
||
}
|
||
handler.postDelayed(() -> {
|
||
Bundle bundle = getIntent().getExtras();
|
||
if (bundle != null) {
|
||
String to = bundle.getString(KEY_TO);
|
||
if (!TextUtils.isEmpty(to)) {
|
||
Class<?> clazz = ClassUtils.forName(to);
|
||
if (clazz != null) {
|
||
String entrance = bundle.getString(EntranceUtils.KEY_ENTRANCE);
|
||
if (TextUtils.isEmpty(entrance) || !entrance.startsWith("(") || !entrance.endsWith(")")) {
|
||
bundle.putString(EntranceUtils.KEY_ENTRANCE, "(插件跳转)");
|
||
}
|
||
|
||
String packageName = bundle.getString("packageName");
|
||
if (packageName != null) {
|
||
bundle.putInt(BaseFragment_ViewPager.ARGS_INDEX, 1);
|
||
}
|
||
|
||
if (NormalFragment.class.isAssignableFrom(clazz)) {
|
||
NormalActivity.startFragment(MainActivity.this, (Class<? extends NormalFragment>) clazz, bundle);
|
||
} else {
|
||
Intent skipIntent = new Intent(MainActivity.this, clazz);
|
||
skipIntent.putExtras(bundle);
|
||
// startActivity(skipIntent);
|
||
AvoidOnResultManager.Companion.getInstance(this)
|
||
.startForResult(skipIntent, (resultCode, data) -> {
|
||
Bundle nextToBundle = getIntent().getBundleExtra(KEY_NEXT_TO);
|
||
if (nextToBundle != null) {
|
||
EntranceUtils.jumpActivity(this, nextToBundle);
|
||
}
|
||
});
|
||
}
|
||
} else {
|
||
// 使用光环进行二次跳转的页面会经过这里
|
||
switch (to) {
|
||
case HOST_QQ:
|
||
DirectUtils.directToQqConversation(this, bundle.getString(KEY_DATA));
|
||
break;
|
||
case HOST_QQ_GROUP:
|
||
DirectUtils.directToQqGroup(this, bundle.getString(KEY_DATA));
|
||
break;
|
||
case HOST_WEB:
|
||
String url = bundle.getString(KEY_DATA) == null ? "" : bundle.getString(KEY_DATA);
|
||
if ("internal".equals(bundle.getString(KEY_TYPE))) {
|
||
DirectUtils.directToWebView(this, url, ENTRANCE_BROWSER);
|
||
} else {
|
||
DirectUtils.directToExternalBrowser(this, url);
|
||
}
|
||
break;
|
||
}
|
||
}
|
||
}
|
||
|
||
Utils.log(bundle);
|
||
if (bundle.getInt(EntranceUtils.KEY_POSITION) != -1) {
|
||
Utils.log("abc");
|
||
EventBus.getDefault().post(new EBSkip(MainActivity.EB_SKIP_MAIN, bundle.getInt(EntranceUtils.KEY_POSITION)));
|
||
}
|
||
}
|
||
}, 500);
|
||
}
|
||
|
||
private void checkNotificationPermission() {
|
||
// 仅登录后再启动光环时请求一次权限
|
||
if (UserManager.getInstance().isLoggedIn()) {
|
||
NotificationHelper.showNotificationHintDialog(NotificationUgc.LOGIN, null);
|
||
}
|
||
}
|
||
|
||
// 统计下载
|
||
private void uploadData(String id, String platform) {
|
||
Map<String, String> params = new HashMap<>();
|
||
params.put("game", id);
|
||
params.put("platform", platform);
|
||
RequestBody body = RequestBody.create(MediaType.parse("application/json"),
|
||
new JSONObject(params).toString());
|
||
RetrofitManager.getInstance(this).getApi().postDownload(body)
|
||
.subscribeOn(Schedulers.io())
|
||
.observeOn(AndroidSchedulers.mainThread())
|
||
.subscribe(new Response<>());
|
||
}
|
||
|
||
@Override
|
||
public boolean onKeyDown(int keyCode, KeyEvent event) {
|
||
if (keyCode == KeyEvent.KEYCODE_BACK && event.getRepeatCount() == 0 && !mMainWrapperFragment.onHandleBackPressed()) {
|
||
DownloadEntity downloadEntity = null;
|
||
for (DownloadEntity entity : DownloadManager.getInstance(getApplicationContext()).getAllDownloadEntityExcludeSilentUpdate()) {
|
||
if (entity.getStatus().equals(DownloadStatus.done)) {
|
||
if (PackageUtils.isInstalled(getApplicationContext(), entity.getPackageName())
|
||
&& (!entity.isPlugin()
|
||
|| PackageUtils.isSignedByGh(getApplicationContext(), entity.getPackageName()))) {
|
||
continue;
|
||
}
|
||
if (downloadEntity == null) {
|
||
downloadEntity = entity;
|
||
} else if (entity.getEnd() > downloadEntity.getEnd()) {
|
||
downloadEntity = entity;
|
||
}
|
||
}
|
||
}
|
||
if (downloadEntity != null) {
|
||
String msg;
|
||
if (downloadEntity.isPlugin()) {
|
||
msg = "《" + downloadEntity.getName() + "-"
|
||
+ PlatformUtils.getInstance(getApplicationContext()).getPlatformName(downloadEntity.getPlatform())
|
||
+ "》已下载完但还未安装,是否立即安装?";
|
||
} else {
|
||
msg = "《" + downloadEntity.getName() + "》已下载完但还未安装,是否立即安装?";
|
||
}
|
||
DownloadEntity finalDownloadEntity = downloadEntity;
|
||
DialogUtils.showWarningDialog(this,
|
||
"提示", msg,
|
||
"直接退出",
|
||
"立即安装",
|
||
() -> handler.postDelayed(() -> PackageInstaller.install(MainActivity.this, finalDownloadEntity), 200),
|
||
this::finish);
|
||
return true;
|
||
}
|
||
System.arraycopy(mHits, 1, mHits, 0, mHits.length - 1);
|
||
mHits[mHits.length - 1] = SystemClock.uptimeMillis();
|
||
if (mHits[0] >= (SystemClock.uptimeMillis() - 1000)) {
|
||
finish();
|
||
} else {
|
||
toast("再按一次就退出光环助手了哦");
|
||
return true;
|
||
}
|
||
}
|
||
return super.onKeyDown(keyCode, event);
|
||
}
|
||
|
||
@Override
|
||
protected boolean handleBackPressed() {
|
||
return true;
|
||
}
|
||
|
||
@Override
|
||
public void finish() {
|
||
// 上传数据
|
||
DataCollectionManager.getInstance(getApplicationContext()).statClickData();
|
||
super.finish();
|
||
}
|
||
|
||
@Override
|
||
protected void onSaveInstanceState(Bundle outState) {
|
||
super.onSaveInstanceState(outState);
|
||
outState.putInt(CURRENT_PAGE, mMainWrapperFragment.getCurrentItem());
|
||
if (mMainWrapperFragment != null) {
|
||
outState.putInt(BaseFragment_ViewPager.ARGS_INDEX, mMainWrapperFragment.getCurrentItem());
|
||
}
|
||
}
|
||
|
||
@Override
|
||
protected int getLayoutId() {
|
||
return R.layout.layout_wrapper_activity;
|
||
}
|
||
|
||
@Override
|
||
protected void onNewIntent(Intent intent) {
|
||
super.onNewIntent(intent);
|
||
|
||
// 跳转至其它页面
|
||
if (getIntent() != null
|
||
&& getIntent().getExtras() != null
|
||
&& getIntent().getBooleanExtra(EntranceUtils.KEY_REQUIRE_REDIRECT, false)) {
|
||
doSkip();
|
||
}
|
||
|
||
// 跳转到问答社区并刷新
|
||
if (getIntent().getBooleanExtra(SWITCH_TO_COMMUNITY, false)) {
|
||
switchToCommunityTabAndRefresh();
|
||
}
|
||
if (getIntent().getBooleanExtra(SWITCH_TO_VIDEO, false)) {
|
||
mMainWrapperFragment.setCurrentItem(2);
|
||
}
|
||
}
|
||
|
||
private void switchToCommunityTabAndRefresh() {
|
||
getIntent().putExtra(SWITCH_TO_COMMUNITY, false);
|
||
Log.e("Switch", "true");
|
||
EventBus.getDefault().post(new EBSkip(MainActivity.EB_SKIP_MAIN, MainWrapperFragment.INDEX_ASK));
|
||
EventBus.getDefault().post(new EBReuse(CommunityFragment.EB_RETRY_PAGE));
|
||
}
|
||
|
||
private void checkTinkerPath() {
|
||
CommonDebug.logMethodWithParams(this, TinkerManager.getTinkerId(), TinkerManager.getNewTinkerId());
|
||
CommonDebug.logMethodWithParams(this, CrashReport.getAppVer(), CrashReport.getAppID(), CrashReport.getAppChannel(), CrashReport.getSdkExtraData());
|
||
|
||
// 1.(母包)首次启动,tinkerId不为空,newTinkerId(patchTinkerId)应该是空的
|
||
// 2. 补丁包启动,tinkerId和之前一致,但newTinkerId不一致
|
||
// 2.1 显示更新信息弹窗,记录tinkerId+newTinkerId
|
||
// 2.1.1 若tinkerId一致,但newTinkerId不一致才能认为是一次补丁更新
|
||
|
||
String tinkerId = TinkerManager.getTinkerId();
|
||
String newTinkerId = TinkerManager.getNewTinkerId();
|
||
|
||
if (TextUtils.isEmpty(newTinkerId)) {
|
||
//这是一个新的母包,没有任何补丁信息
|
||
return;
|
||
}
|
||
|
||
final Gson gson = new Gson();
|
||
|
||
Type type = new TypeToken<HashMap<String, Set<String>>>() {
|
||
}.getType();
|
||
|
||
final Map<String, Set<String>> tinkerIdMap;
|
||
final String tinkerMapJson = mSp.getString(Config.PATCHES, "");
|
||
if (!TextUtils.isEmpty(tinkerMapJson)) {
|
||
tinkerIdMap = gson.fromJson(tinkerMapJson, type);
|
||
} else {
|
||
tinkerIdMap = new HashMap<>();
|
||
}
|
||
|
||
Set<String> tinkerIdSet = tinkerIdMap.get(tinkerId);
|
||
if (tinkerIdSet == null) {
|
||
tinkerIdSet = new HashSet<>();
|
||
tinkerIdMap.put(tinkerId, tinkerIdSet);
|
||
}
|
||
|
||
// 有新的补丁,没有显示过
|
||
if (!tinkerIdSet.contains(newTinkerId)) {
|
||
tinkerIdSet.add(newTinkerId);
|
||
|
||
final Dialog dialog = new Dialog(this, R.style.GhAlertDialog);
|
||
|
||
View contentView = LayoutInflater.from(this).inflate(R.layout.dialog_alert, null);
|
||
TextView contentTv = contentView.findViewById(R.id.dialog_content);
|
||
TextView titleTv = contentView.findViewById(R.id.dialog_title);
|
||
TextView negativeTv = contentView.findViewById(R.id.dialog_negative);
|
||
TextView positiveTv = contentView.findViewById(R.id.dialog_positive);
|
||
|
||
titleTv.setText("补丁更新成功");
|
||
contentTv.setText(("光环助手已成功更新到V" + PackageUtils.getVersionName() + "-" + newTinkerId));
|
||
positiveTv.setText("知道了");
|
||
negativeTv.setText(null);
|
||
|
||
negativeTv.setOnClickListener(view -> dialog.dismiss());
|
||
|
||
positiveTv.setOnClickListener(view -> dialog.dismiss());
|
||
dialog.setOnDismissListener(dialog1 -> mSp.edit().putString(Config.PATCHES, gson.toJson(tinkerIdMap)).apply());
|
||
|
||
dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
|
||
dialog.setContentView(contentView);
|
||
dialog.show();
|
||
}
|
||
}
|
||
|
||
private void checkDevice() {
|
||
String content = DeviceUtils.getUserDevice(MainActivity.this).toString();
|
||
RequestBody body = RequestBody.create(MediaType.parse("application/json"), content);
|
||
RetrofitManager.getInstance(this).getApi().checkDevice(body)
|
||
.subscribeOn(Schedulers.io())
|
||
.observeOn(AndroidSchedulers.mainThread())
|
||
.subscribe(new Response<ResponseBody>() {
|
||
@Override
|
||
public void onResponse(ResponseBody response) {
|
||
super.onResponse(response);
|
||
try {
|
||
String string = response.string();
|
||
JSONObject object = new JSONObject(string);
|
||
String deviceId = object.getString("device_id");
|
||
if (!TextUtils.isEmpty(deviceId)) {
|
||
oldUserSkip(deviceId);
|
||
}
|
||
} catch (Exception e) {
|
||
e.printStackTrace();
|
||
}
|
||
}
|
||
});
|
||
}
|
||
|
||
private void oldUserSkip(String deviceId) {
|
||
mSp.edit().putString("syncDeviceID", deviceId).apply();
|
||
DialogUtils.showForceDialog(MainActivity.this, "数据同步提醒"
|
||
, "系统检测到你是光环助手的老用户,为了避免数据丢失,请尽快登录"
|
||
, "前往登录", "残忍拒绝", new DialogUtils.ConfirmListener() {
|
||
@Override
|
||
public void onConfirm() {
|
||
EventBus.getDefault().post(new EBSkip(MainActivity.EB_SKIP_MAIN, INDEX_PERSONAL));
|
||
}
|
||
}, null);
|
||
}
|
||
|
||
// 获取META-INF中的plugin_update 文件,判断是否从游戏插件中下载的app,是则获取游戏id,启动游戏更新,下载该游戏
|
||
private void getPluginUpdate() {
|
||
AppExecutor.getIoExecutor().execute(() -> {
|
||
ApplicationInfo appinfo = getApplicationInfo();
|
||
String sourceDir = appinfo.sourceDir;
|
||
ZipFile zipfile = null;
|
||
|
||
try {
|
||
zipfile = new ZipFile(sourceDir);
|
||
Enumeration<?> entries = zipfile.entries();
|
||
|
||
while (entries.hasMoreElements()) {
|
||
ZipEntry entry = ((ZipEntry) entries.nextElement());
|
||
String entryName = entry.getName();
|
||
if (entryName.contains("gh_assist")) {
|
||
String packageName = entryName.substring(entryName.lastIndexOf("_") + 1);
|
||
startActivity(DownloadManagerActivity.getDownloadMangerIntent(MainActivity.this,
|
||
packageName, DownloadFragment.INDEX_UPDATE, "(游戏插件)"));
|
||
break;
|
||
} else if (entryName.contains("halo_skip.json")) {
|
||
InputStream in = zipfile.getInputStream(entry);
|
||
if (in != null) {
|
||
final Gson gson = new Gson();
|
||
final BufferedReader reader = new BufferedReader(new InputStreamReader(in));
|
||
|
||
InnerMetaInfoEntity info = gson.fromJson(reader, InnerMetaInfoEntity.class);
|
||
if (info != null) {
|
||
if (EntranceUtils.HOST_COMMUNITY.equals(info.getType())) {
|
||
UserManager.getInstance().setCommunityData(new CommunityEntity(info.getLink(), info.getText()));
|
||
runOnUiThread(() -> mMainWrapperFragment.setCurrentItem(MainWrapperFragment.INDEX_ASK));
|
||
} else {
|
||
DirectUtils.directToSpecificPage(this,
|
||
info.getType(),
|
||
info.getLink(),
|
||
info.getText(),
|
||
EntranceUtils.KEY_PLUGIN,
|
||
"特定包启动跳转");
|
||
}
|
||
}
|
||
}
|
||
} else if (entryName.contains("halo_skip.dat")) {
|
||
InputStream in = zipfile.getInputStream(entry);
|
||
if (in != null) {
|
||
final BufferedReader reader = new BufferedReader(new InputStreamReader(in));
|
||
String content = "";
|
||
for (String line; (line = reader.readLine()) != null; content += line) ;
|
||
|
||
if (!TextUtils.isEmpty(content)) {
|
||
DefaultUrlHandler.interceptUrl(this, content, "(特定包启动跳转)");
|
||
}
|
||
}
|
||
}
|
||
}
|
||
} catch (Exception e) {
|
||
e.printStackTrace();
|
||
} finally {
|
||
if (zipfile != null) {
|
||
try {
|
||
zipfile.close();
|
||
} catch (IOException e) {
|
||
e.printStackTrace();
|
||
}
|
||
}
|
||
}
|
||
});
|
||
}
|
||
|
||
// 连接上网络事件
|
||
@Subscribe(threadMode = ThreadMode.MAIN)
|
||
public void onEventMainThread(EBNetworkState busNetworkState) {
|
||
if (busNetworkState.isNetworkConnected()) {
|
||
if (Config.getSettings() == null) {
|
||
Config.getGhzsSettings();
|
||
}
|
||
|
||
mPackageViewModel.checkData();
|
||
}
|
||
}
|
||
|
||
@Subscribe(threadMode = ThreadMode.MAIN)
|
||
public void onEventMainThread(EBPackage busFour) {
|
||
final String packageName = busFour.getPackageName();
|
||
final String versionName = busFour.getVersionName();
|
||
String gameId = "";
|
||
|
||
DownloadEntity mDownloadEntity = null;
|
||
for (DownloadEntity downloadEntity : DownloadManager.getInstance(getApplicationContext()).getAllDownloadEntity()) {
|
||
if (packageName.equals(downloadEntity.getPackageName())) {
|
||
mDownloadEntity = downloadEntity;
|
||
gameId = mDownloadEntity.getRealGameId(Constants.GAME_ID_DIVIDER);
|
||
if (TextUtils.isEmpty(busFour.getVersionName())) {
|
||
// 没有版本号的事件直接选用第一个找到的 downloadEntity
|
||
break;
|
||
} else {
|
||
// 有版本号的事件直接尽量找到版本一致的 downloadEntity
|
||
if (versionName.equals(downloadEntity.getVersionName())) {
|
||
break;
|
||
}
|
||
}
|
||
}
|
||
}
|
||
|
||
if ("安装".equals(busFour.getType())) {
|
||
mPackageViewModel.addInstalledGame(packageName);
|
||
|
||
// 删除下载完成 弹窗
|
||
NotificationManager nManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
|
||
nManager.cancel(packageName.hashCode());
|
||
|
||
if (mDownloadEntity != null) {
|
||
if (mDownloadEntity.isPluggable()) {
|
||
Map<String, Object> kv6 = new HashMap<>();
|
||
kv6.put("安装或卸载", "安装完成");
|
||
DataUtils.onEvent(this, "插件化", mDownloadEntity.getName(), kv6);
|
||
|
||
// DataUtils.onMtaEvent(this,
|
||
// "插件化_新",
|
||
// "位置", mDownloadEntity.getEntrance(),
|
||
// "游戏", mDownloadEntity.getName() + "-" + mDownloadEntity.getPlatform(),
|
||
// "操作", "安装完成",
|
||
// "网络状态", DeviceUtils.getNetwork(HaloApp.getInstance().getApplication()));
|
||
}
|
||
|
||
// 没有光环 ID 的都记录一下游戏 ID,供'我的游戏'区分同包名不同插件用
|
||
Object gh_id = PackageUtils.getMetaData(this, mDownloadEntity.getPackageName(), "gh_id");
|
||
if (gh_id == null) {
|
||
ThirdPartyPackageHelper.saveGameId(mDownloadEntity.getPackageName(), mDownloadEntity.getGameId());
|
||
}
|
||
DownloadManager.getInstance(getApplicationContext()).cancel(
|
||
mDownloadEntity.getUrl(), false, true); // 默认不删除安装包 mSp.getBoolean("autodelete", true)
|
||
}
|
||
|
||
|
||
if (mSp.getBoolean(SettingsFragment.CONCERN_GAME_SP_KEY, true)) { //设置页面控制是否安装后自动关注
|
||
// 安装后关注游戏
|
||
DownloadEntity finalDownloadEntity = mDownloadEntity;
|
||
RetrofitManager.getInstance(this).getSensitiveApi().getGameDigestByPackageName(UrlFilterUtils.getFilterQuery("package", packageName))
|
||
.subscribeOn(Schedulers.io())
|
||
.observeOn(AndroidSchedulers.mainThread())
|
||
.subscribe(new Response<List<GameDigestEntity>>() {
|
||
@Override
|
||
public void onResponse(List<GameDigestEntity> response) {
|
||
for (GameDigestEntity gameDigestEntity : response) {
|
||
if (!TextUtils.isEmpty(gameDigestEntity.getId())) { // 关注游戏
|
||
if (finalDownloadEntity != null && gameDigestEntity.getId().equals(finalDownloadEntity.getRealGameId(Constants.GAME_ID_DIVIDER))) {
|
||
ConcernUtils.INSTANCE.postConcernGameId(MainActivity.this, gameDigestEntity.getId(), null, false);
|
||
}
|
||
}
|
||
}
|
||
}
|
||
});
|
||
}
|
||
|
||
postNewlyInstalledApp(gameId, packageName);
|
||
}
|
||
if ("卸载".equals(busFour.getType())) {
|
||
mPackageViewModel.addUninstalledGame(packageName);
|
||
|
||
if (mDownloadEntity != null && mDownloadEntity.isPluggable()) {
|
||
Map<String, Object> kv6 = new HashMap<>();
|
||
kv6.put("安装或卸载", "卸载完成");
|
||
DataUtils.onEvent(this, "插件化", mDownloadEntity.getName(), kv6);
|
||
|
||
// DataUtils.onMtaEvent(this,
|
||
// "插件化_新",
|
||
// "位置", mDownloadEntity.getEntrance(),
|
||
// "游戏", mDownloadEntity.getName() + "-" + mDownloadEntity.getPlatform(),
|
||
// "操作", "卸载完成",
|
||
// "网络状态", DeviceUtils.getNetwork(HaloApp.getInstance().getApplication()));
|
||
|
||
PackageInstaller.install(this, mDownloadEntity);
|
||
}
|
||
|
||
// 更新已安装游戏
|
||
deleteInstalledPackage(packageName);
|
||
}
|
||
|
||
DataCollectionUtils.uploadInorunstall(this, busFour.getType(), busFour.getPackageName());
|
||
}
|
||
|
||
@SuppressWarnings("ResultOfMethodCallIgnored")
|
||
@SuppressLint("CheckResult")
|
||
private void postNewlyInstalledApp(String gameId, String packageName) {
|
||
|
||
// 发送应用变更前都检查一下是否需要把所有应用都上传
|
||
PackageRepository.checkAndUploadAppList();
|
||
|
||
// 更新已安装游戏
|
||
JSONObject packageObject = PackageUtils.getAppBasicInfoByPackageName(packageName);
|
||
JSONObject dataObject = new JSONObject();
|
||
JSONObject wrapperObject = new JSONObject();
|
||
try {
|
||
dataObject.put("type", "POST");
|
||
dataObject.put("device_id", HaloApp.getInstance().getGid());
|
||
dataObject.put("app", packageObject);
|
||
dataObject.put("time", Utils.getTime(getApplicationContext()));
|
||
wrapperObject.put("content", dataObject.toString());
|
||
} catch (JSONException e) {
|
||
e.printStackTrace();
|
||
}
|
||
LoghubUtils.log(wrapperObject, "halo-api-device-installed", true);
|
||
|
||
RequestBody requestBody = RequestBody.create(MediaType.parse("application/json"),
|
||
packageObject.toString());
|
||
// 更新已安装游戏
|
||
RetrofitManager.getInstance(MainActivity.this).getApi()
|
||
.postNewlyInstalledApp(HaloApp.getInstance().getGid(), requestBody)
|
||
.subscribeOn(Schedulers.io())
|
||
.observeOn(Schedulers.io())
|
||
.subscribe(new EmptyResponse<>());
|
||
|
||
if (!TextUtils.isEmpty(gameId) && UserManager.getInstance().isLoggedIn()) {
|
||
JSONObject jsonObject = new JSONObject();
|
||
try {
|
||
jsonObject.put("game_id", gameId);
|
||
jsonObject.put("package", packageName);
|
||
RequestBody rBody = RequestBody.create(MediaType.parse("application/json"), jsonObject.toString());
|
||
|
||
RetrofitManager.getInstance(MainActivity.this).getApi()
|
||
.postPlayedGame(UserManager.getInstance().getUserId(), rBody)
|
||
.subscribeOn(Schedulers.io())
|
||
.observeOn(Schedulers.io())
|
||
.subscribe(new EmptyResponse<>());
|
||
} catch (JSONException e) {
|
||
e.printStackTrace();
|
||
}
|
||
}
|
||
}
|
||
|
||
@SuppressLint("CheckResult")
|
||
private void deleteInstalledPackage(String packageName) {
|
||
|
||
// 发送应用变更前都检查一下是否需要把所有应用都上传
|
||
PackageRepository.checkAndUploadAppList();
|
||
|
||
// 删除已安装游戏
|
||
JSONObject dataObject = new JSONObject();
|
||
JSONObject wrapperObject = new JSONObject();
|
||
try {
|
||
dataObject.put("type", "DELETE");
|
||
dataObject.put("device_id", HaloApp.getInstance().getGid());
|
||
dataObject.put("package", packageName);
|
||
dataObject.put("time", Utils.getTime(getApplicationContext()));
|
||
wrapperObject.put("content", dataObject.toString());
|
||
} catch (JSONException e) {
|
||
e.printStackTrace();
|
||
}
|
||
LoghubUtils.log(wrapperObject, "halo-api-device-installed", true);
|
||
|
||
// 删除已安装游戏
|
||
RetrofitManager.getInstance(MainActivity.this).getApi()
|
||
.deleteInstalledApp(HaloApp.getInstance().getGid(), packageName)
|
||
.subscribeOn(Schedulers.io())
|
||
.observeOn(Schedulers.io())
|
||
.subscribe(new EmptyResponse<>());
|
||
}
|
||
|
||
// 接收登录和登出更新事件统计的 Meta
|
||
@Subscribe(threadMode = ThreadMode.MAIN)
|
||
public void onEventMainThread(EBReuse reuse) {
|
||
if (reuse.getType().equals(LOGIN_TAG) || reuse.getType().equals(LOGOUT_TAG)) {
|
||
MetaUtil.INSTANCE.refreshMeta();
|
||
}
|
||
}
|
||
|
||
@Override
|
||
protected boolean useButterKnife() {
|
||
return false;
|
||
}
|
||
|
||
@Override
|
||
public String getActivityNameInChinese() {
|
||
return "游戏首页";
|
||
}
|
||
|
||
public static void skipToMainActivity(Context context, int position) {
|
||
Activity activity = AppManager.getInstance().findActivity(MainActivity.class);
|
||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1
|
||
&& activity != null && !activity.isDestroyed()) {
|
||
EventBus.getDefault().post(new EBSkip(MainActivity.EB_SKIP_MAIN, position));
|
||
} else {
|
||
Timer timer = new Timer();
|
||
timer.schedule(new TimerTask() {
|
||
@Override
|
||
public void run() {
|
||
EventBus.getDefault().post(new EBSkip(MainActivity.EB_SKIP_MAIN, position));
|
||
}
|
||
}, 300);
|
||
}
|
||
|
||
Intent intent = MainActivity.getMainIntent(context);
|
||
context.startActivity(intent);
|
||
}
|
||
}
|