diff --git a/app/src/main/java/com/gh/common/dialog/NotificationHintDialogFragment.kt b/app/src/main/java/com/gh/common/dialog/NotificationHintDialogFragment.kt index 1be9728298..c5667d02e1 100644 --- a/app/src/main/java/com/gh/common/dialog/NotificationHintDialogFragment.kt +++ b/app/src/main/java/com/gh/common/dialog/NotificationHintDialogFragment.kt @@ -67,7 +67,7 @@ class NotificationHintDialogFragment : BaseTrackableDialogFragment() { activateTv.setOnClickListener { MtaHelper.onEventWithBasicDeviceInfo(getEvent(), getKey(), "点击立即开启") MtaHelper.onEventWithBasicDeviceInfo(getEvent(), getKey(), "${styleEntity.scenes}_${styleEntity.styleNo}_点击立即开启") - dismiss() + dismissAllowingStateLoss() if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { //这种方案适用于 API 26, 即8.0(含8.0)以上可以用 val intent = Intent() @@ -80,7 +80,7 @@ class NotificationHintDialogFragment : BaseTrackableDialogFragment() { } closeIv.setOnClickListener { - dismiss() + dismissAllowingStateLoss() MtaHelper.onEventWithBasicDeviceInfo(getEvent(), getKey(), "点击关闭") MtaHelper.onEventWithBasicDeviceInfo(getEvent(), getKey(), "${styleEntity.scenes}_${styleEntity.styleNo}_点击关闭") } diff --git a/app/src/main/java/com/gh/common/dialog/PackageCheckDialogFragment.kt b/app/src/main/java/com/gh/common/dialog/PackageCheckDialogFragment.kt index 716c813bdb..ac61e171ec 100644 --- a/app/src/main/java/com/gh/common/dialog/PackageCheckDialogFragment.kt +++ b/app/src/main/java/com/gh/common/dialog/PackageCheckDialogFragment.kt @@ -260,6 +260,8 @@ class PackageCheckDialogFragment : BaseDialogFragment() { return } + if (activity.isFinishing) return + var dialogFragment = activity.supportFragmentManager.findFragmentByTag(PackageCheckDialogFragment::class.java.simpleName) as? PackageCheckDialogFragment if (dialogFragment == null) { dialogFragment = PackageCheckDialogFragment() @@ -283,7 +285,7 @@ class PackageCheckDialogFragment : BaseDialogFragment() { val isPackagesInstall: (ArrayList) -> Boolean = { packages -> var isPackagesInstalled = false - packages.forEach {packageName-> + packages.forEach { packageName -> val isInstalled = PackageUtils.getInstalledPackages(HaloApp.getInstance().application, 0).find { it.packageName == packageName } != null if (isInstalled) { isPackagesInstalled = true diff --git a/app/src/main/java/com/gh/common/view/dsbridge/DWebView.java b/app/src/main/java/com/gh/common/view/dsbridge/DWebView.java index ab81607c0f..ce23c6d75c 100644 --- a/app/src/main/java/com/gh/common/view/dsbridge/DWebView.java +++ b/app/src/main/java/com/gh/common/view/dsbridge/DWebView.java @@ -15,6 +15,7 @@ import android.os.Message; import android.util.AttributeSet; import android.util.Log; import android.view.Gravity; +import android.view.InflateException; import android.view.View; import android.view.ViewGroup; import android.webkit.ConsoleMessage; @@ -34,6 +35,7 @@ import android.widget.FrameLayout; import androidx.annotation.Keep; import androidx.appcompat.app.AlertDialog; +import androidx.appcompat.app.AppCompatActivity; import org.json.JSONArray; import org.json.JSONException; @@ -716,6 +718,8 @@ public class DWebView extends WebView { return true; } } + Activity activity = (AppCompatActivity) getContext(); + if (activity.isFinishing()) return true; Dialog alertDialog = new AlertDialog.Builder(getContext()). setMessage(message). setCancelable(false). @@ -742,6 +746,8 @@ public class DWebView extends WebView { if (webChromeClient != null && webChromeClient.onJsConfirm(view, url, message, result)) { return true; } else { + Activity activity = (AppCompatActivity) getContext(); + if (activity.isFinishing()) return true; DialogInterface.OnClickListener listener = new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { @@ -784,6 +790,8 @@ public class DWebView extends WebView { if (webChromeClient != null && webChromeClient.onJsPrompt(view, url, message, defaultValue, result)) { return true; } else { + Activity activity = (AppCompatActivity) getContext(); + if (activity.isFinishing()) return true; final EditText editText = new EditText(getContext()); editText.setText(defaultValue); if (defaultValue != null) { @@ -1028,10 +1036,7 @@ public class DWebView extends WebView { try { super.setOverScrollMode(mode); } catch (Throwable e) { - String trace = Log.getStackTraceString(e); - if (trace.contains("android.content.pm.PackageManager$NameNotFoundException") - || trace.contains("java.lang.RuntimeException: Cannot load WebView") - || trace.contains("android.webkit.WebViewFactory$MissingWebViewPackageException: Failed to load WebView provider: No WebView installed")) { + if (e instanceof InflateException) { e.printStackTrace(); } else { throw e; diff --git a/app/src/main/java/com/gh/common/view/vertical_recycler/PagerLayoutManager.java b/app/src/main/java/com/gh/common/view/vertical_recycler/PagerLayoutManager.java index 96bc2c20e9..1222868002 100644 --- a/app/src/main/java/com/gh/common/view/vertical_recycler/PagerLayoutManager.java +++ b/app/src/main/java/com/gh/common/view/vertical_recycler/PagerLayoutManager.java @@ -163,7 +163,13 @@ public class PagerLayoutManager extends LinearLayoutManager { return 0; } this.mDrift = dy; - return super.scrollVerticallyBy(dy, recycler, state); + //fix for `java.lang.IndexOutOfBoundsException: Inconsistency detected.` + try { + return super.scrollVerticallyBy(dy, recycler, state); + } catch (Exception e) { + e.printStackTrace(); + } + return 0; } /** diff --git a/app/src/main/java/com/gh/gamecenter/download/InstalledGameFragmentAdapter.java b/app/src/main/java/com/gh/gamecenter/download/InstalledGameFragmentAdapter.java index bb0248ee48..164cc71159 100644 --- a/app/src/main/java/com/gh/gamecenter/download/InstalledGameFragmentAdapter.java +++ b/app/src/main/java/com/gh/gamecenter/download/InstalledGameFragmentAdapter.java @@ -41,6 +41,7 @@ import com.lightgame.download.DownloadEntity; import java.util.ArrayList; import java.util.Collections; import java.util.List; +import java.util.concurrent.CopyOnWriteArrayList; import androidx.annotation.Nullable; import androidx.collection.ArrayMap; @@ -59,7 +60,7 @@ public class InstalledGameFragmentAdapter extends BaseRecyclerAdapter gameList; - private ArrayList sortedList; + private CopyOnWriteArrayList sortedList; //下载用到的map private ArrayMap> locationMap; @@ -73,7 +74,7 @@ public class InstalledGameFragmentAdapter extends BaseRecyclerAdapter(); - sortedList = new ArrayList<>(); + sortedList = new CopyOnWriteArrayList<>(); locationMap = new ArrayMap<>(); @@ -256,7 +257,10 @@ public class InstalledGameFragmentAdapter extends BaseRecyclerAdapter(R.id.placeholderView)?.goneIf(!mViewModel.isHomeVideo) - val mOrientationUtils = OrientationUtils(mContext as Activity, videoView) - mOrientationUtils.isEnable = false - videoView.setViewModel(mViewModel) - GSYVideoOptionBuilder() - .setIsTouchWiget(false) - .setUrl(videoList[position].url) - .setRotateViewAuto(false) - .setCacheWithPlay(true) - .setRotateWithSystem(false) - .setReleaseWhenLossAudio(true) + val video = videoList.safelyGetInRelease(position) + video?.let { + val mOrientationUtils = OrientationUtils(mContext as Activity, videoView) + mOrientationUtils.isEnable = false + videoView.setViewModel(mViewModel) + GSYVideoOptionBuilder() + .setIsTouchWiget(false) + .setUrl(it.url) + .setRotateViewAuto(false) + .setCacheWithPlay(true) + .setRotateWithSystem(false) + .setReleaseWhenLossAudio(true) // .setLockLand(true) - .setLooping(false) - .setShowFullAnimation(false) - .setVideoAllCallBack(object : GSYSampleCallBack() { - override fun onQuitFullscreen(url: String?, vararg objects: Any) { - mOrientationUtils.backToProtVideo() - videoView.hideAllButton(false) - videoView.recordMta("全屏播放-退出全屏") - MtaHelper.onEvent("视频详情", "全屏播放-退出全屏", "${videoList[position].title}(${videoList[position].id})") - videoView.uploadVideoStreamingPlaying("全屏播放-退出全屏") - } - }) - .build(videoView) + .setLooping(false) + .setShowFullAnimation(false) + .setVideoAllCallBack(object : GSYSampleCallBack() { + override fun onQuitFullscreen(url: String?, vararg objects: Any) { + mOrientationUtils.backToProtVideo() + videoView.hideAllButton(false) + videoView.recordMta("全屏播放-退出全屏") + MtaHelper.onEvent("视频详情", "全屏播放-退出全屏", "${videoList[position].title}(${videoList[position].id})") + videoView.uploadVideoStreamingPlaying("全屏播放-退出全屏") + } + }) + .build(videoView) - videoView.updateViewDetail(videoList[position]) - videoView.updateThumb(videoList[position].getThumb()) - videoView.updateMuteStatus() - videoView.fullscreenButton.setOnClickListener { - if (refreshLayout.isRefreshing) return@setOnClickListener - if (mOrientationUtils.isLand == 0) { - videoView.recordMta("进入全屏") - MtaHelper.onEvent("视频详情", "进入全屏", "${videoList[position].title}(${videoList[position].id})") - videoView.uploadVideoStreamingPlaying("全屏") - } - videoView.hideAllButton(true) - mOrientationUtils.resolveByClick() - val fullVideoPlayer = videoView.startWindowFullscreen(mContext, true, true) as? DetailPlayerView - fullVideoPlayer?.observeVolume(mContext as AppCompatActivity) - fullVideoPlayer?.setViewModel(mViewModel) - fullVideoPlayer?.hideAllButton(true) - fullVideoPlayer?.updateViewDetail(videoList[position]) - fullVideoPlayer?.updateMuteStatus() - //金进入全屏后直接播放 - if (fullVideoPlayer?.currentState == GSYVideoView.CURRENT_STATE_PAUSE) { - fullVideoPlayer.setCurrentPosition(videoView.getCurrentPosition()) - fullVideoPlayer.onVideoResume() + videoView.updateViewDetail(it) + videoView.updateThumb(it.getThumb()) + videoView.updateMuteStatus() + videoView.fullscreenButton.setOnClickListener { + if (refreshLayout.isRefreshing) return@setOnClickListener + if (mOrientationUtils.isLand == 0) { + videoView.recordMta("进入全屏") + MtaHelper.onEvent("视频详情", "进入全屏", "${videoList[position].title}(${videoList[position].id})") + videoView.uploadVideoStreamingPlaying("全屏") + } + videoView.hideAllButton(true) + mOrientationUtils.resolveByClick() + val fullVideoPlayer = videoView.startWindowFullscreen(mContext, true, true) as? DetailPlayerView + fullVideoPlayer?.observeVolume(mContext as AppCompatActivity) + fullVideoPlayer?.setViewModel(mViewModel) + fullVideoPlayer?.hideAllButton(true) + fullVideoPlayer?.updateViewDetail(videoList[position]) + fullVideoPlayer?.updateMuteStatus() + //金进入全屏后直接播放 + if (fullVideoPlayer?.currentState == GSYVideoView.CURRENT_STATE_PAUSE) { + fullVideoPlayer.setCurrentPosition(videoView.getCurrentPosition()) + fullVideoPlayer.onVideoResume() + } } + + videoView.isNeedShowWifiTip = HaloApp.get(Constants.SHOULD_SHOW_VIDEO_MOBILE_WARNING, false) as Boolean? + ?: false } - videoView.isNeedShowWifiTip = HaloApp.get(Constants.SHOULD_SHOW_VIDEO_MOBILE_WARNING, false) as Boolean? - ?: false if (position == mViewModel.startPosition && isVisible) { if (position + 2 <= videoList.size - 1) {//预加载视频 ExoCacheManager.preload(videoList[position + 1].url) diff --git a/app/src/main/java/com/gh/gamecenter/video/detail/VideoDetailContainerFragment.kt b/app/src/main/java/com/gh/gamecenter/video/detail/VideoDetailContainerFragment.kt index 222926712c..d42d5dd0ec 100644 --- a/app/src/main/java/com/gh/gamecenter/video/detail/VideoDetailContainerFragment.kt +++ b/app/src/main/java/com/gh/gamecenter/video/detail/VideoDetailContainerFragment.kt @@ -554,8 +554,10 @@ class VideoDetailContainerFragment : BaseLazyFragment(), OnBackPressedListener { } fun showMoreMenuDialog(targetView: View) { - mViewModel.currentDisplayingVideo?.let { - showMoreMenuDialog(it, targetView) + if (::mViewModel.isInitialized) { + mViewModel.currentDisplayingVideo?.let { + showMoreMenuDialog(it, targetView) + } } } diff --git a/libraries/LGLibrary b/libraries/LGLibrary index 9f2bebe7b8..095a344df4 160000 --- a/libraries/LGLibrary +++ b/libraries/LGLibrary @@ -1 +1 @@ -Subproject commit 9f2bebe7b83df28619f40fe971e7057eef94e854 +Subproject commit 095a344df4073b93ecb94ee3df5efadca09e72c9