diff --git a/app/src/main/java/com/gh/base/fragment/BaseDialogFragment.java b/app/src/main/java/com/gh/base/fragment/BaseDialogFragment.java index abbb7433dc..c1392c68e2 100644 --- a/app/src/main/java/com/gh/base/fragment/BaseDialogFragment.java +++ b/app/src/main/java/com/gh/base/fragment/BaseDialogFragment.java @@ -9,6 +9,8 @@ import com.gh.gamecenter.R; import com.lightgame.utils.RuntimeUtils; import com.lightgame.utils.Utils; +import java.lang.reflect.Field; + import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.annotation.StringRes; @@ -71,7 +73,22 @@ public class BaseDialogFragment extends DialogFragment { transaction.show(fragment); transaction.commit(); } else { - super.show(manager, tag); + try { + Class clazz = DialogFragment.class; + Field dismissed = clazz.getDeclaredField("mDismissed"); + dismissed.setAccessible(true); + dismissed.set(this, false); + + Field shownByMe = clazz.getDeclaredField("mShownByMe"); + shownByMe.setAccessible(true); + shownByMe.set(this, true); + FragmentTransaction transaction = manager.beginTransaction(); + transaction.add(this, tag); + transaction.commitAllowingStateLoss(); + } catch (Exception e) { + super.show(manager, tag); + e.printStackTrace(); + } } } } diff --git a/app/src/main/java/com/gh/common/dialog/BaseTrackableDialogFragment.kt b/app/src/main/java/com/gh/common/dialog/BaseTrackableDialogFragment.kt index 2e896edf8c..43d9b32a0d 100644 --- a/app/src/main/java/com/gh/common/dialog/BaseTrackableDialogFragment.kt +++ b/app/src/main/java/com/gh/common/dialog/BaseTrackableDialogFragment.kt @@ -4,6 +4,8 @@ import android.content.DialogInterface import android.os.Bundle import android.view.KeyEvent import android.view.View +import androidx.fragment.app.DialogFragment +import androidx.fragment.app.FragmentManager import com.gh.common.util.MtaHelper import com.lightgame.dialog.BaseDialogFragment import java.util.concurrent.atomic.AtomicBoolean @@ -63,4 +65,29 @@ abstract class BaseTrackableDialogFragment : BaseDialogFragment() { open fun trackWithBasicDeviceInfo() = false + + override fun show(manager: FragmentManager, tag: String?) { + val fragment = manager.findFragmentByTag(tag) + if (fragment != null) { + val transaction = manager.beginTransaction() + transaction.show(fragment) + transaction.commit() + } else { + try { + val clazz: Class<*> = DialogFragment::class.java + val dismissed = clazz.getDeclaredField("mDismissed") + dismissed.isAccessible = true + dismissed[this] = false + val shownByMe = clazz.getDeclaredField("mShownByMe") + shownByMe.isAccessible = true + shownByMe[this] = true + val transaction = manager.beginTransaction() + transaction.add(this, tag) + transaction.commitAllowingStateLoss() + } catch (e: Exception) { + super.show(manager, tag) + e.printStackTrace() + } + } + } } \ No newline at end of file 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 5daca02c94..50b2776d31 100644 --- a/app/src/main/java/com/gh/common/simulator/SimulatorDownloadManager.kt +++ b/app/src/main/java/com/gh/common/simulator/SimulatorDownloadManager.kt @@ -7,6 +7,7 @@ import android.view.View import android.view.Window import android.widget.ProgressBar import android.widget.TextView +import androidx.appcompat.app.AppCompatActivity import androidx.constraintlayout.widget.ConstraintLayout import androidx.core.content.ContextCompat import com.g00fy2.versioncompare.Version @@ -23,6 +24,7 @@ import com.gh.gamecenter.entity.TrackableEntity import com.halo.assistant.HaloApp import com.lightgame.download.* import com.lightgame.utils.Utils +import java.lang.ref.WeakReference import java.text.DecimalFormat class SimulatorDownloadManager private constructor() { @@ -34,6 +36,7 @@ class SimulatorDownloadManager private constructor() { private var appProgressFilling: View? = null private var appProgressAnchor: View? = null private var downloadDialog: Dialog? = null + private var mContextRef: WeakReference? = null private var simulatorLocation: SimulatorLocation? = null private var simulator: SimulatorEntity? = null @@ -71,7 +74,10 @@ class SimulatorDownloadManager private constructor() { val startTime = downloadEntity.getMetaExtra(Constants.SIMULATOR_DOWNLOAD_START_TIME) LogUtils.uploadSimulatorDownload("simulator_download_complete", fileName, simulator?.id, downloadEntity.name, gameId, locationStr, downloadType, startTime) DownloadManager.getInstance(HaloApp.getInstance().application).cancel(downloadEntity.url, false, true) - downloadDialog?.dismiss() + val activity = mContextRef?.get() as? AppCompatActivity + if (activity?.isFinishing == false) { + downloadDialog?.dismiss() + } } DownloadStatus.neterror == downloadEntity.status -> { ToastUtils.showToast("网络不稳定,下载任务已暂停") @@ -96,6 +102,7 @@ class SimulatorDownloadManager private constructor() { fun showDownloadDialog(context: Context?, simulator: SimulatorEntity?, location: SimulatorLocation, gameId: String = "", gameName: String = "", cancelCallback: (() -> Unit)? = null) { if (context == null) return + mContextRef = WeakReference(context) this.simulatorLocation = location this.simulator = simulator this.gameId = gameId @@ -154,7 +161,10 @@ class SimulatorDownloadManager private constructor() { view.findViewById(R.id.app_tv_cancel).setOnClickListener { DownloadManager.getInstance(context).pause(simulator?.apk?.url) MtaHelper.onEvent("模拟器下载", "下载中弹窗", "点击关闭") - downloadDialog?.dismiss() + val activity = mContextRef?.get() as? AppCompatActivity + if (activity?.isFinishing == false) { + downloadDialog?.dismiss() + } } downloadDialog?.setOnDismissListener { diff --git a/app/src/main/java/com/gh/common/util/DownloadItemUtils.java b/app/src/main/java/com/gh/common/util/DownloadItemUtils.java index ef1d6ced62..c205c7db67 100644 --- a/app/src/main/java/com/gh/common/util/DownloadItemUtils.java +++ b/app/src/main/java/com/gh/common/util/DownloadItemUtils.java @@ -134,7 +134,7 @@ public class DownloadItemUtils { // 已预约 holder.gameDownloadBtn.setVisibility(View.VISIBLE); holder.gameDownloadBtn.setText("已预约"); - holder.gameDownloadBtn.setTextColor(ContextCompat.getColor(holder.gameDes.getContext(),R.color.aaaaaa)); + holder.gameDownloadBtn.setTextColor(ContextCompat.getColor(holder.gameDes.getContext(), R.color.aaaaaa)); holder.gameDownloadBtn.setBackgroundResource(R.drawable.button_round_f5f5f5); } } @@ -580,7 +580,9 @@ public class DownloadItemUtils { final String location, @Nullable final ExposureEvent traceEvent) { String str = downloadBtn.getText().toString(); - ApkEntity apk = gameEntity.getApk().get(0); + if (gameEntity.getApk().isEmpty()) return; + ApkEntity apk = ExtensionsKt.safelyGetInRelease(gameEntity.getApk(), 0); + if (apk == null) return; if (str.equals(context.getString(R.string.download))) { // 先弹下载弹窗(如果需要的话) diff --git a/app/src/main/java/com/gh/common/view/FixGridLayoutManager.java b/app/src/main/java/com/gh/common/view/FixGridLayoutManager.java new file mode 100644 index 0000000000..6d7e4ccf3f --- /dev/null +++ b/app/src/main/java/com/gh/common/view/FixGridLayoutManager.java @@ -0,0 +1,33 @@ +package com.gh.common.view; + +import android.content.Context; +import android.util.AttributeSet; + +import androidx.recyclerview.widget.GridLayoutManager; +import androidx.recyclerview.widget.LinearLayoutManager; +import androidx.recyclerview.widget.RecyclerView; + +public class FixGridLayoutManager extends GridLayoutManager { + + + public FixGridLayoutManager(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) { + super(context, attrs, defStyleAttr, defStyleRes); + } + + public FixGridLayoutManager(Context context, int spanCount) { + super(context, spanCount); + } + + public FixGridLayoutManager(Context context, int spanCount, int orientation, boolean reverseLayout) { + super(context, spanCount, orientation, reverseLayout); + } + + @Override + public void onLayoutChildren(RecyclerView.Recycler recycler, RecyclerView.State state) { + try { + super.onLayoutChildren(recycler, state); + } catch (Exception e) { + e.printStackTrace(); + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/gh/gamecenter/ImageViewerActivity.kt b/app/src/main/java/com/gh/gamecenter/ImageViewerActivity.kt index dacd5da008..51155286fa 100644 --- a/app/src/main/java/com/gh/gamecenter/ImageViewerActivity.kt +++ b/app/src/main/java/com/gh/gamecenter/ImageViewerActivity.kt @@ -145,7 +145,7 @@ class ImageViewerActivity : BaseActivity(), OnPageChangeListener { // init slide val outMetrics = DisplayMetrics() - windowManager.defaultDisplay.getMetrics(outMetrics) + windowManager?.defaultDisplay?.getMetrics(outMetrics) val widthPixels = outMetrics.widthPixels mLimitWidth = if (NetworkUtils.isWifiOr4GConnected(this)) { widthPixels * 2 diff --git a/app/src/main/java/com/gh/gamecenter/SuggestionActivity.java b/app/src/main/java/com/gh/gamecenter/SuggestionActivity.java index 2ba84ab6cb..97615a1e93 100644 --- a/app/src/main/java/com/gh/gamecenter/SuggestionActivity.java +++ b/app/src/main/java/com/gh/gamecenter/SuggestionActivity.java @@ -1081,7 +1081,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()); @@ -1253,7 +1253,7 @@ public class SuggestionActivity extends ToolBarActivity implements OnRequestCall public String readFromFile() { if (Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState())) { - + if (getExternalFilesDir(null) == null) return "SD Card error"; File file = new File(getExternalFilesDir(null).getPath() + "/log"); if (file.isFile()) return "检测log文件夹是文件"; diff --git a/app/src/main/java/com/gh/gamecenter/WeiBoShareActivity.java b/app/src/main/java/com/gh/gamecenter/WeiBoShareActivity.java index 87b2e39e73..2d4724531e 100644 --- a/app/src/main/java/com/gh/gamecenter/WeiBoShareActivity.java +++ b/app/src/main/java/com/gh/gamecenter/WeiBoShareActivity.java @@ -81,7 +81,9 @@ public class WeiBoShareActivity extends Activity implements WbShareCallback { mWeiboShareAPI = new WbShareHandler(this); mWeiboShareAPI.registerApp(); - loadIconAndShare(shareIcon); + if (shareIcon != null) { + loadIconAndShare(shareIcon); + } } @@ -118,7 +120,7 @@ public class WeiBoShareActivity extends Activity implements WbShareCallback { } else if (ShareUtils.ShareEntrance.shareGh.name().equals(mShareType)) { textObject.text = "这个App可以下载各种热门卡牌手游的加速版,绿色安全,超级省心,做日常效率提高3-5倍!不用肝的感觉真好! @光环助手"; } else if (ShareUtils.ShareEntrance.plugin.name().equals(mShareType) - || ShareUtils.ShareEntrance.game.name().equals(mShareType)) { + || ShareUtils.ShareEntrance.game.name().equals(mShareType)) { textObject.text = "向你推荐:" + mTitle + " @光环助手 "; } else { textObject.text = mTitle + " @光环助手 "; diff --git a/app/src/main/java/com/gh/gamecenter/adapter/viewholder/DetailViewHolder.java b/app/src/main/java/com/gh/gamecenter/adapter/viewholder/DetailViewHolder.java index ba9a0a1078..44643f7a3f 100644 --- a/app/src/main/java/com/gh/gamecenter/adapter/viewholder/DetailViewHolder.java +++ b/app/src/main/java/com/gh/gamecenter/adapter/viewholder/DetailViewHolder.java @@ -107,6 +107,7 @@ public class DetailViewHolder { @Override public void onClick(View v) { // 这个 switch 纯粹是为了 MTA和上报光能任务 统计用的 + if (mViewHolder.mDownloadPb.getDownloadType() == null) return; switch (mViewHolder.mDownloadPb.getDownloadType()) { case DOWNLOADING_PLUGIN: MtaHelper.onEvent("游戏详情_新", "插件化中", mGameEntity.getName()); @@ -297,10 +298,12 @@ public class DetailViewHolder { Utils.toast(mViewHolder.context, "正在加急更新版本,敬请后续留意"); break; default: - Intent intent = DownloadManagerActivity.getDownloadMangerIntent(mViewHolder.context, - mGameEntity.getApk().get(0).getUrl(), - StringUtils.buildString(mEntrance, "+(", mName, "[", mTitle, "])")); - mViewHolder.context.startActivity(intent); + if (!mGameEntity.getApk().isEmpty()) { + Intent intent = DownloadManagerActivity.getDownloadMangerIntent(mViewHolder.context, + mGameEntity.getApk().get(0).getUrl(), + StringUtils.buildString(mEntrance, "+(", mName, "[", mTitle, "])")); + mViewHolder.context.startActivity(intent); + } break; } } diff --git a/app/src/main/java/com/gh/gamecenter/gamedetail/dialog/GameDetailMoreDialog.kt b/app/src/main/java/com/gh/gamecenter/gamedetail/dialog/GameDetailMoreDialog.kt index 1b268f6cd4..5848ead71e 100644 --- a/app/src/main/java/com/gh/gamecenter/gamedetail/dialog/GameDetailMoreDialog.kt +++ b/app/src/main/java/com/gh/gamecenter/gamedetail/dialog/GameDetailMoreDialog.kt @@ -102,8 +102,8 @@ class GameDetailMoreDialog : BaseDialogFragment(), View.OnTouchListener { shareEntrance = ShareUtils.ShareEntrance.plugin } } - shareUtils.shareGameDetail(requireActivity(), url, gameEntity?.icon, gameEntity?.name, - gameEntity?.brief, shareEntrance, gameEntity?.id ?: "", null) + shareUtils.shareGameDetail(requireActivity(), url, gameEntity?.icon ?: "", gameEntity?.name + ?: "", gameEntity?.brief ?: "", shareEntrance, gameEntity?.id ?: "", null) return shareUtils } diff --git a/app/src/main/java/com/gh/gamecenter/gamedetail/video/TopVideoView.kt b/app/src/main/java/com/gh/gamecenter/gamedetail/video/TopVideoView.kt index 3e55400dca..da12188ece 100644 --- a/app/src/main/java/com/gh/gamecenter/gamedetail/video/TopVideoView.kt +++ b/app/src/main/java/com/gh/gamecenter/gamedetail/video/TopVideoView.kt @@ -304,7 +304,7 @@ class TopVideoView @JvmOverloads constructor(context: Context, attrs: AttributeS } private fun hideBackBtn() { - mTopContainer.setBackgroundResource(0) + mTopContainer?.setBackgroundResource(0) back.visibility = View.GONE } diff --git a/app/src/main/java/com/gh/gamecenter/mygame/MyReservationAdapter.kt b/app/src/main/java/com/gh/gamecenter/mygame/MyReservationAdapter.kt index 6300aac785..6508cfd37e 100644 --- a/app/src/main/java/com/gh/gamecenter/mygame/MyReservationAdapter.kt +++ b/app/src/main/java/com/gh/gamecenter/mygame/MyReservationAdapter.kt @@ -114,7 +114,7 @@ class MyReservationAdapter(context: Context, var mViewModel: MyReservationViewMo for (key in positionMap.keys) { if (key.contains(packageName)) { val position = positionMap[key]!! - val game = entityList?.get(position) + val game = entityList?.safelyGetInRelease(position) if (game != null) { positionList.add(GameAndPosition(game, position)) } diff --git a/app/src/main/java/com/gh/gamecenter/personalhome/background/PersonalityBackgroundFragment.kt b/app/src/main/java/com/gh/gamecenter/personalhome/background/PersonalityBackgroundFragment.kt index 43d76aac37..95305fa975 100644 --- a/app/src/main/java/com/gh/gamecenter/personalhome/background/PersonalityBackgroundFragment.kt +++ b/app/src/main/java/com/gh/gamecenter/personalhome/background/PersonalityBackgroundFragment.kt @@ -94,14 +94,15 @@ class PersonalityBackgroundFragment : NormalFragment() { if (requestCode == MEDIA_STORE_REQUEST && resultCode == Activity.RESULT_OK) { val selectedPaths = Matisse.obtainPathResult(data) - if (selectedPaths.size > 0) { + if (!selectedPaths.isNullOrEmpty()) { val intent = BackgroundClipActivity.getIntent(requireContext(), selectedPaths[0], mEntrance) startActivityForResult(intent, REQUEST_CODE_IMAGE_CROP) } } else if (requestCode == REQUEST_CODE_IMAGE_CROP && resultCode == Activity.RESULT_OK) { if (data != null) { val imagePath = data.getStringExtra(CropImageActivity.RESULT_CLIP_PATH) - val intent = BackgroundPreviewActivity.getIntent(requireContext(), imagePath ?: "", null) + val intent = BackgroundPreviewActivity.getIntent(requireContext(), imagePath + ?: "", null) requireActivity().startActivityForResult(intent, CHANGE_BACKGROUND_SUCCESS) } } else if (requestCode == CHANGE_BACKGROUND_SUCCESS && resultCode == Activity.RESULT_OK) { diff --git a/app/src/main/java/com/gh/gamecenter/personalhome/home/UserVideoHistoryFragment.kt b/app/src/main/java/com/gh/gamecenter/personalhome/home/UserVideoHistoryFragment.kt index 57ab757637..36588cf620 100644 --- a/app/src/main/java/com/gh/gamecenter/personalhome/home/UserVideoHistoryFragment.kt +++ b/app/src/main/java/com/gh/gamecenter/personalhome/home/UserVideoHistoryFragment.kt @@ -8,6 +8,7 @@ import androidx.recyclerview.widget.GridLayoutManager import androidx.recyclerview.widget.RecyclerView import com.gh.common.util.dip2px import com.gh.common.util.viewModelProvider +import com.gh.common.view.FixGridLayoutManager import com.gh.common.view.GridSpacingItemDecoration import com.gh.gamecenter.R import com.gh.gamecenter.baselist.ListAdapter @@ -43,7 +44,7 @@ class UserVideoHistoryFragment : ListFragment