diff --git a/app/src/main/java/com/gh/common/simulator/SimulatorDownloadManager.kt b/app/src/main/java/com/gh/common/simulator/SimulatorDownloadManager.kt index fc42fb695c..115df3997a 100644 --- a/app/src/main/java/com/gh/common/simulator/SimulatorDownloadManager.kt +++ b/app/src/main/java/com/gh/common/simulator/SimulatorDownloadManager.kt @@ -185,6 +185,7 @@ class SimulatorDownloadManager private constructor() { DownloadManager.getInstance(context).pauseAll() val entity = DownloadManager.getInstance(context).getDownloadEntityByUrl(apkEntity.url) + HaloApp.put(simulator.name, simulator) if (entity != null) { when (entity.status) { DownloadStatus.pause, DownloadStatus.subscribe, diff --git a/app/src/main/java/com/gh/common/simulator/SimulatorGameManager.kt b/app/src/main/java/com/gh/common/simulator/SimulatorGameManager.kt index 638fd660ca..f34fec232f 100644 --- a/app/src/main/java/com/gh/common/simulator/SimulatorGameManager.kt +++ b/app/src/main/java/com/gh/common/simulator/SimulatorGameManager.kt @@ -3,6 +3,7 @@ package com.gh.common.simulator import android.annotation.SuppressLint import android.content.ActivityNotFoundException import android.content.Intent +import android.graphics.Bitmap import android.net.Uri import android.text.TextUtils import com.g00fy2.versioncompare.Version @@ -18,9 +19,11 @@ import com.lightgame.download.DownloadDao import com.lightgame.download.DownloadEntity import com.lightgame.download.FileUtils import com.lightgame.utils.AppManager +import io.reactivex.Single import io.reactivex.android.schedulers.AndroidSchedulers import io.reactivex.schedulers.Schedulers import okhttp3.ResponseBody +import java.io.ByteArrayOutputStream import java.io.File @@ -90,31 +93,62 @@ object SimulatorGameManager { } } + @SuppressLint("CheckResult") private fun jumpToSimulator(downloadEntity: DownloadEntity, gameEntity: GameEntity) { - val intent = Intent() - intent.data = Uri.fromFile(File(downloadEntity.path)) - if (gameEntity.simulatorType == "FBA") { - val apkEntity = gameEntity.getApk()[0] - intent.putExtra("rom_name", apkEntity.packageName) - } - intent.putExtra("default_path", downloadEntity.path.substring(0, downloadEntity.path.lastIndexOf('/'))) - intent.putExtra("game_type", gameEntity.simulatorType) - intent.putExtra("title", downloadEntity.name) - intent.putExtra("icon", gameEntity.icon ?: "") - intent.putExtra("meta", LogUtils.getMetaObject().toString()) - intent.putExtra("simulatorId", gameEntity.simulator?.id) - intent.putExtra("simulatorName", gameEntity.simulator?.name) - intent.putExtra("gameId", gameEntity.id) + Single.just(gameEntity.icon ?: "") + .flatMap { + getBitmapFormCache(it) + }.map { + BitmapUtils.compressBitmap(it, 100) + }.map { + val baos = ByteArrayOutputStream() + it.compress(Bitmap.CompressFormat.WEBP, 100, baos) + baos.toByteArray() + } + .compose(singleToMain()) + .subscribe({ + val intent = Intent() + intent.data = Uri.fromFile(File(downloadEntity.path)) + if (gameEntity.simulatorType == "FBA") { + val apkEntity = gameEntity.getApk()[0] + intent.putExtra("rom_name", apkEntity.packageName) + } + intent.putExtra("default_path", downloadEntity.path.substring(0, downloadEntity.path.lastIndexOf('/'))) + intent.putExtra("game_type", gameEntity.simulatorType) + intent.putExtra("title", downloadEntity.name) + intent.putExtra("icon", gameEntity.icon ?: "") + intent.putExtra("iconStream", it) + intent.putExtra("meta", LogUtils.getMetaObject().toString()) + intent.putExtra("simulatorId", gameEntity.simulator?.id) + intent.putExtra("simulatorName", gameEntity.simulator?.name) + intent.putExtra("gameId", gameEntity.id) - val destActivity = "com.gh.emu.RequestPermissionActivity" - intent.setClassName(gameEntity.simulator?.apk?.packageName ?: "", destActivity) - try { - AppManager.getInstance().recentActiveActivity?.startActivity(intent) - } catch (e: ActivityNotFoundException) { - ToastUtils.showToast("模拟器安装错误") - } + val destActivity = "com.gh.emu.RequestPermissionActivity" + intent.setClassName(gameEntity.simulator?.apk?.packageName ?: "", destActivity) + try { + AppManager.getInstance().recentActiveActivity?.startActivity(intent) + } catch (e: ActivityNotFoundException) { + ToastUtils.showToast("模拟器安装错误") + } - recordPlaySimulatorGames(gameEntity.id) + recordPlaySimulatorGames(gameEntity.id) + }, { + ToastUtils.showToast("跳转失败") + }) + } + + private fun getBitmapFormCache(url: String): Single { + return Single.create { + ImageUtils.getBitmap(url, object : BiCallback { + override fun onFirst(first: Bitmap) { + it.onSuccess(first) + } + + override fun onSecond(second: Boolean) { + it.onError(Throwable("获取bitmap失败")) + } + }) + } } diff --git a/app/src/main/java/com/gh/common/util/BitmapUtils.java b/app/src/main/java/com/gh/common/util/BitmapUtils.java index 36b95438f0..99077eeef7 100644 --- a/app/src/main/java/com/gh/common/util/BitmapUtils.java +++ b/app/src/main/java/com/gh/common/util/BitmapUtils.java @@ -333,14 +333,19 @@ public class BitmapUtils { } - public static Bitmap compressBitmap(Bitmap bitmap) { + /** + * 压缩图片 + * + * @param bitmap + * @param compressSize 压缩大小(单位k) + */ + public static Bitmap compressBitmap(Bitmap bitmap, int compressSize) { ByteArrayOutputStream bos = new ByteArrayOutputStream(); Matrix matrix = new Matrix(); Bitmap result = Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(), bitmap.getHeight(), matrix, true); result.compress(Bitmap.CompressFormat.WEBP, 100, bos); - while (bos.toByteArray().length > 400 * 1024) { - System.out.println(bos.toByteArray().length); + while (bos.toByteArray().length > compressSize * 1024) { matrix.setScale(0.9f, 0.9f); result = Bitmap.createBitmap(result, 0, 0, result.getWidth(), result.getHeight(), matrix, true); bos.reset(); diff --git a/app/src/main/java/com/gh/common/util/DialogUtils.java b/app/src/main/java/com/gh/common/util/DialogUtils.java index f88e35939a..48ae574a04 100644 --- a/app/src/main/java/com/gh/common/util/DialogUtils.java +++ b/app/src/main/java/com/gh/common/util/DialogUtils.java @@ -41,6 +41,8 @@ import androidx.constraintlayout.widget.ConstraintLayout; import androidx.core.content.ContextCompat; import androidx.databinding.DataBindingUtil; import androidx.recyclerview.widget.RecyclerView; +import kotlin.Unit; +import kotlin.jvm.functions.Function0; import com.facebook.drawee.generic.GenericDraweeHierarchy; import com.facebook.drawee.view.SimpleDraweeView; @@ -56,6 +58,7 @@ import com.gh.gamecenter.R; import com.gh.gamecenter.SuggestionActivity; import com.gh.gamecenter.adapter.viewholder.PrivacyPolicyItemViewHolder; import com.gh.gamecenter.databinding.DialogOverseaConfirmationBinding; +import com.gh.gamecenter.databinding.DialogPackageParseErrorBinding; import com.gh.gamecenter.databinding.ImprintContentItemBinding; import com.gh.gamecenter.databinding.PrivacyItemBinding; import com.gh.gamecenter.entity.ApkEntity; @@ -64,6 +67,7 @@ import com.gh.gamecenter.entity.BadgeEntity; import com.gh.gamecenter.entity.GameEntity; import com.gh.gamecenter.entity.PrivacyPolicyEntity; import com.gh.gamecenter.entity.SettingsEntity; +import com.gh.gamecenter.entity.SimpleGameEntity; import com.gh.gamecenter.entity.TrackableEntity; import com.gh.gamecenter.suggest.SuggestType; import com.halo.assistant.HaloApp; @@ -2000,6 +2004,44 @@ public class DialogUtils { dialog.show(); } + public static void showSimulatorParseErrorDialog(Context context, String gameId, String gameName, ConfirmListener confirmListener) { + context = checkDialogContext(context); + final Dialog dialog = new Dialog(context, R.style.GhAlertDialog); + + DialogPackageParseErrorBinding binding = DialogPackageParseErrorBinding.inflate(LayoutInflater.from(context), null, false); + Context finalContext = context; + SpannableStringBuilder builder = new SpanBuilder("您也可以点击提交反馈跟我们联系").click(6, 10, R.color.theme_font, true, new Function0() { + @Override + public Unit invoke() { + SimpleGameEntity entity = new SimpleGameEntity(gameId, gameName, ""); + SuggestionActivity.startSuggestionActivity(finalContext, SuggestType.gameQuestion, "notfound", "模拟器安装包解析错误", entity, "-"); + dialog.dismiss(); + return null; + } + }).build(); + binding.feedbackTv.setText(builder); + binding.feedbackTv.setMovementMethod(new LinkMovementMethod()); + + binding.cancel.setOnClickListener(v -> { + dialog.dismiss(); + }); + binding.confirm.setOnClickListener(v -> { + confirmListener.onConfirm(); + dialog.dismiss(); + }); + + dialog.requestWindowFeature(Window.FEATURE_NO_TITLE); + dialog.setContentView(binding.getRoot()); + dialog.show(); + Window window = dialog.getWindow(); + if (window != null) { + window.setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT)); + WindowManager.LayoutParams params = window.getAttributes(); + params.width = context.getResources().getDisplayMetrics().widthPixels - DisplayUtils.dip2px(60f); + window.setAttributes(params); + } + } + /** * @param context may be is application context * @return activity context diff --git a/app/src/main/java/com/gh/common/util/DownloadObserver.kt b/app/src/main/java/com/gh/common/util/DownloadObserver.kt index f7b9418138..96680bd822 100644 --- a/app/src/main/java/com/gh/common/util/DownloadObserver.kt +++ b/app/src/main/java/com/gh/common/util/DownloadObserver.kt @@ -16,6 +16,7 @@ import com.gh.gamecenter.R import com.gh.gamecenter.SuggestionActivity import com.gh.gamecenter.entity.GameEntity import com.gh.gamecenter.entity.SimpleGameEntity +import com.gh.gamecenter.entity.SimulatorEntity import com.gh.gamecenter.eventbus.EBDownloadStatus import com.gh.gamecenter.eventbus.EBShowDialog import com.gh.gamecenter.retrofit.Response @@ -142,7 +143,8 @@ object DownloadObserver { if (gameEntity?.simulator != null) { val isInstalled = PackageUtils.isInstalledFromAllPackage(HaloApp.getInstance().application, gameEntity.simulator!!.apk!!.packageName) if (!isInstalled) { - val currentActivity = AppManager.getInstance().currentActivity() ?: return + val currentActivity = AppManager.getInstance().currentActivity() + ?: return SimulatorDownloadManager.getInstance().showDownloadDialog(currentActivity, gameEntity.simulator, SimulatorDownloadManager.SimulatorLocation.LAUNCH, gameEntity.id, gameEntity.name @@ -179,15 +181,27 @@ object DownloadObserver { } // 下载过程分析统计 -// val pm = mApplication.packageManager -// val packageInfo = pm.getPackageArchiveInfo(downloadEntity.path, 0) -// if (packageInfo == null) { + val pm = mApplication.packageManager + val packageInfo = pm.getPackageArchiveInfo(downloadEntity.path, 0) + if (packageInfo == null) { // MtaHelper.onEventWithBasicDeviceInfo("解析包错误分析", // "游戏名字", downloadEntity.name + ":" + PlatformUtils.getInstance(mApplication).getPlatformName(downloadEntity.platform)) // // MtaHelper.onEventWithBasicDeviceInfo("解析包错误_新", // "游戏", downloadEntity.name + ":" + PlatformUtils.getInstance(mApplication).getPlatformName(downloadEntity.platform)) -// } + val downloadType = downloadEntity.getMetaExtra(Constants.EXTRA_DOWNLOAD_TYPE) + if (downloadType == Constants.SIMULATOR_DOWNLOAD) { + val currentActivity = AppManager.getInstance().currentActivity() + ?: return + DialogUtils.showSimulatorParseErrorDialog(currentActivity, downloadEntity.gameId, downloadEntity.name) { + val simulator = HaloApp.get(downloadEntity.name, true) as? SimulatorEntity + ?: return@showSimulatorParseErrorDialog + DownloadManager.getInstance(currentActivity).cancel(downloadEntity.url, true, true) + SimulatorDownloadManager.getInstance().showDownloadDialog(currentActivity, simulator, SimulatorDownloadManager.SimulatorLocation.SIMULATOR_GAME) + } + } + } + HaloApp.remove(downloadEntity.name) } if (downloadEntity.status == DownloadStatus.done) { diff --git a/app/src/main/java/com/gh/gamecenter/SuggestionActivity.java b/app/src/main/java/com/gh/gamecenter/SuggestionActivity.java index 276dba7368..d2a85af41d 100644 --- a/app/src/main/java/com/gh/gamecenter/SuggestionActivity.java +++ b/app/src/main/java/com/gh/gamecenter/SuggestionActivity.java @@ -263,10 +263,20 @@ public class SuggestionActivity extends ToolBarActivity implements OnRequestCall String suggestHintType, String content, SimpleGameEntity game) { + startSuggestionActivity(context, suggestType, suggestHintType, content, game, ""); + } + + public static void startSuggestionActivity(Context context, + SuggestType suggestType, + String suggestHintType, + String content, + SimpleGameEntity game, + String gamePlatform) { Intent intent = new Intent(context, SuggestionActivity.class); intent.putExtra(EntranceUtils.KEY_SUGGESTTYPE, suggestType); intent.putExtra(EntranceUtils.KEY_SUGGEST_HINT_TYPE, suggestHintType); intent.putExtra(EntranceUtils.KEY_CONTENT, content); + intent.putExtra(EntranceUtils.KEY_PLATFORM, gamePlatform); intent.putExtra(SimpleGameEntity.class.getSimpleName(), game); context.startActivity(intent); } @@ -366,6 +376,7 @@ public class SuggestionActivity extends ToolBarActivity implements OnRequestCall mSuggestContent = extras.getString(EntranceUtils.KEY_CONTENT); mSuggestHintType = extras.getString(EntranceUtils.KEY_SUGGEST_HINT_TYPE); mHideHint = extras.getString(EntranceUtils.KEY_HIDE_SUGGEST_HINT, ""); + String gamePlatform = mHideHint = extras.getString(EntranceUtils.KEY_PLATFORM, ""); mFunctionTypeName = getResources().getStringArray(R.array.suggest_function_type); mGameEntity = extras.getParcelable(SimpleGameEntity.class.getSimpleName()); fromRating = extras.getBoolean(FROM_RATING_KEY, false); @@ -417,6 +428,9 @@ public class SuggestionActivity extends ToolBarActivity implements OnRequestCall } else { mSuggestContentEt.setText(mSuggestContent); } + if (!TextUtils.isEmpty(gamePlatform)){ + mPlatformEt.setText(gamePlatform); + } mSuggestContentEt.setSelection(mSuggestContentEt.getText().length()); } @@ -1086,7 +1100,7 @@ public class SuggestionActivity extends ToolBarActivity implements OnRequestCall if (fromRating) { params.put("suggestion_type", mSuggestType.getType() + "(评论)"); - } else if (!mDiagnosisResult.isEmpty()){ + } else if (!mDiagnosisResult.isEmpty()) { params.put("suggestion_type", "网络诊断"); } else { params.put("suggestion_type", mSuggestType.getType()); diff --git a/app/src/main/res/layout/dialog_package_parse_error.xml b/app/src/main/res/layout/dialog_package_parse_error.xml new file mode 100644 index 0000000000..f20798903e --- /dev/null +++ b/app/src/main/res/layout/dialog_package_parse_error.xml @@ -0,0 +1,103 @@ + + + + + + + + + + + + + + + + + + + \ No newline at end of file