diff --git a/app/src/main/java/com/gh/common/FixedRateJobHelper.kt b/app/src/main/java/com/gh/common/FixedRateJobHelper.kt index 712aa3ba61..30defae1ef 100644 --- a/app/src/main/java/com/gh/common/FixedRateJobHelper.kt +++ b/app/src/main/java/com/gh/common/FixedRateJobHelper.kt @@ -48,7 +48,9 @@ object FixedRateJobHelper { // 提交曝光数据 if ((mExecuteCount * CHECKER_PERIOD) % EXPOSURE_PERIOD == 0L) { - ExposureManager.commitSavedExposureEvents(true) + runOnUiThread { + ExposureManager.commitSavedExposureEvents(true) + } } // 分片检测下载进度 diff --git a/app/src/main/java/com/gh/common/util/DirectUtils.kt b/app/src/main/java/com/gh/common/util/DirectUtils.kt index 27bc641fca..f0078ce1a7 100644 --- a/app/src/main/java/com/gh/common/util/DirectUtils.kt +++ b/app/src/main/java/com/gh/common/util/DirectUtils.kt @@ -85,7 +85,6 @@ import org.greenrobot.eventbus.EventBus import retrofit2.HttpException import java.net.URLEncoder import java.util.* -import kotlin.collections.ArrayList import kotlin.math.roundToInt /** @@ -671,10 +670,11 @@ object DirectUtils { bundle.putSerializable(KEY_SUGGESTTYPE, SuggestType.normal) } else { bundle.putString(KEY_CONTENT, content) - bundle.putSerializable(KEY_SUGGESTTYPE, SuggestType.gameQuestion) if (TextUtils.isEmpty(hintType)) { + bundle.putSerializable(KEY_SUGGESTTYPE, SuggestType.gameQuestion) bundle.putString(KEY_SUGGEST_HINT_TYPE, KEY_PLUGIN) } else { + bundle.putSerializable(KEY_SUGGESTTYPE, SuggestType.normal) bundle.putString(KEY_SUGGEST_HINT_TYPE, hintType) } } diff --git a/app/src/main/java/com/gh/download/DownloadManager.java b/app/src/main/java/com/gh/download/DownloadManager.java index 7c8e687bc0..b561d2cd6b 100644 --- a/app/src/main/java/com/gh/download/DownloadManager.java +++ b/app/src/main/java/com/gh/download/DownloadManager.java @@ -781,17 +781,18 @@ public class DownloadManager implements DownloadStatusListener { } else { entry.getMeta().put(DownloadDataHelper.DOWNLOAD_CANCEL_WAY, DownloadDataHelper.DOWNLOAD_CANCEL_MANUAL); } - entry.setStatus(DownloadStatus.cancel); initGameMap(); if (cancelSilently) { + entry.setStatus(DownloadStatus.cancel); cancelAndNotify(entry, true); return; } // 将原来安装完成后在 downloadService 完成的功能放到这里,避免因为 ANR 造成闪退 AppExecutor.getUiExecutor().executeWithDelay(() -> { + entry.setStatus(DownloadStatus.cancel); cancelAndNotify(entry, false); }, 0); }); diff --git a/app/src/main/java/com/gh/gamecenter/SkipActivity.java b/app/src/main/java/com/gh/gamecenter/SkipActivity.java index 7e4ab2b50b..83876c2473 100644 --- a/app/src/main/java/com/gh/gamecenter/SkipActivity.java +++ b/app/src/main/java/com/gh/gamecenter/SkipActivity.java @@ -119,6 +119,7 @@ public class SkipActivity extends BaseActivity { String gameId = uri.getQueryParameter(EntranceConsts.KEY_GAMEID); String packageMd5 = uri.getQueryParameter(EntranceConsts.KEY_PACKAGE_MD5); String isQaFeedbackString = uri.getQueryParameter(EntranceConsts.KEY_IS_QA_FEEDBACK); + String suggestionType = uri.getQueryParameter(KEY_TYPE); boolean isQaFeedback = !TextUtils.isEmpty(isQaFeedbackString) && isQaFeedbackString.equals("true"); String content = (TextUtils.isEmpty(gameId) || TextUtils.isEmpty(packageMd5)) ? String.format("%s-%s-V%s,", @@ -134,6 +135,8 @@ public class SkipActivity extends BaseActivity { String qaTitle = uri.getQueryParameter(EntranceConsts.KEY_QA_TITLE); if (!TextUtils.isEmpty(qaId)) { DirectUtils.directToQa(this, qaTitle, qaId); + } else if ("vgame".equals(suggestionType)) { + DirectUtils.directToFeedback(this, content, "game", isQaFeedback, qaContentId, EntranceConsts.ENTRANCE_BROWSER); } else { DirectUtils.directToFeedback(this, content, null, isQaFeedback, qaContentId, EntranceConsts.ENTRANCE_BROWSER); } diff --git a/app/src/main/java/com/gh/gamecenter/forum/detail/ForumArticleAskListViewModel.kt b/app/src/main/java/com/gh/gamecenter/forum/detail/ForumArticleAskListViewModel.kt index 069c1acfa9..ce37c2fb18 100644 --- a/app/src/main/java/com/gh/gamecenter/forum/detail/ForumArticleAskListViewModel.kt +++ b/app/src/main/java/com/gh/gamecenter/forum/detail/ForumArticleAskListViewModel.kt @@ -3,10 +3,11 @@ package com.gh.gamecenter.forum.detail import android.app.Application import androidx.lifecycle.ViewModel import androidx.lifecycle.ViewModelProvider -import com.gh.gamecenter.core.utils.UrlFilterUtils +import com.gh.gamecenter.baselist.ListViewModel import com.gh.gamecenter.common.constant.EntranceConsts import com.gh.gamecenter.core.utils.PageSwitchDataHelper -import com.gh.gamecenter.common.baselist.ListViewModel +import com.gh.gamecenter.core.utils.SPUtils +import com.gh.gamecenter.core.utils.UrlFilterUtils import com.gh.gamecenter.entity.ForumVideoEntity import com.gh.gamecenter.qa.entity.AnswerEntity import com.gh.gamecenter.retrofit.RetrofitManager @@ -24,10 +25,19 @@ class ForumArticleAskListViewModel(application: Application, val bbsId: String = "全部" -> { val data = PageSwitchDataHelper.popLastPageData() val map = hashMapOf() + if (data != null && data.containsKey(EntranceConsts.KEY_TOP_ID)) { map["top_id"] = data[EntranceConsts.KEY_TOP_ID] } - RetrofitManager.getInstance().api.getAllForumList(bbsId, UrlFilterUtils.getFilterQuery(sort, "-1"), page, map) + + if (bbsId == TEMP_FIXED_TOP_BBS && SPUtils.getBoolean("$FIXED_TOP_KEY$bbsId", true)) { + val fixedTopId = TEMP_FIXED_TOP_POST + SPUtils.setBoolean("$FIXED_TOP_KEY$bbsId", false) + RetrofitManager.getInstance().api.getAllForumList(bbsId, fixedTopId, UrlFilterUtils.getFilterQuery(sort, "-1"), page, map) + } else { + RetrofitManager.getInstance().api.getAllForumList(bbsId, UrlFilterUtils.getFilterQuery(sort, "-1"), page, map) + } + } "精华" -> { RetrofitManager.getInstance().api.getEssenceForumList(bbsId, page) @@ -58,4 +68,13 @@ class ForumArticleAskListViewModel(application: Application, val bbsId: String = return ForumArticleAskListViewModel(HaloApp.getInstance().application, bbsId, path) as T } } + + companion object { + + const val FIXED_TOP_KEY = "one_time_bbs_fixed_top_" + + const val TEMP_FIXED_TOP_BBS = "63201e1a7e4c92e5420f30ec" + const val TEMP_FIXED_TOP_POST = "6322f759047515fa1e09fe16" + + } } \ No newline at end of file diff --git a/app/src/main/java/com/gh/gamecenter/receiver/ActivitySkipReceiver.java b/app/src/main/java/com/gh/gamecenter/receiver/ActivitySkipReceiver.java index 423c59cfff..07dd8b92c4 100644 --- a/app/src/main/java/com/gh/gamecenter/receiver/ActivitySkipReceiver.java +++ b/app/src/main/java/com/gh/gamecenter/receiver/ActivitySkipReceiver.java @@ -24,7 +24,7 @@ public class ActivitySkipReceiver extends BroadcastReceiver { ExtensionsKt.doOnMainProcessOnly(context, () -> { if (ACTION_ACTIVITY_SKIP.equals(intent.getAction())) { Bundle bundle = intent.getExtras(); - if (RunningUtils.isRunning(context)) { + if (RunningUtils.isRunning(context) && bundle != null) { // 应用正在运行,前台或后台 String to = bundle.getString("to"); if (!TextUtils.isEmpty(to)) { diff --git a/app/src/main/java/com/gh/gamecenter/receiver/DownloadReceiver.java b/app/src/main/java/com/gh/gamecenter/receiver/DownloadReceiver.java index 0a158c70b3..633cc0304b 100644 --- a/app/src/main/java/com/gh/gamecenter/receiver/DownloadReceiver.java +++ b/app/src/main/java/com/gh/gamecenter/receiver/DownloadReceiver.java @@ -9,6 +9,7 @@ import android.content.Intent; import com.gh.common.util.DirectUtils; import com.gh.common.util.DownloadNotificationHelper; import com.gh.gamecenter.common.utils.ExtensionsKt; +import com.gh.gamecenter.core.utils.ToastUtils; /** * Created by LGT on 2016/10/10. @@ -19,11 +20,19 @@ public class DownloadReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { ExtensionsKt.doOnMainProcessOnly(context, () -> { - if (DownloadNotificationHelper.ACTION_VDOWNLOAD.equals(intent.getAction())) { - DirectUtils.directToVGameDownload(context, true); - } else { - DirectUtils.directToDownloadManager(context, ENTRANCE_DOWNLOAD); + try { + if (DownloadNotificationHelper.ACTION_VDOWNLOAD.equals(intent.getAction())) { + DirectUtils.directToVGameDownload(context, true); + } else { + DirectUtils.directToDownloadManager(context, ENTRANCE_DOWNLOAD); + } + } catch (NullPointerException exception) { + // "unknown reason", 系统内部的错误 + if (exception.getMessage() != null) { + ToastUtils.toast(exception.getMessage()); + } } }); } + } diff --git a/app/src/main/java/com/gh/gamecenter/retrofit/service/ApiService.java b/app/src/main/java/com/gh/gamecenter/retrofit/service/ApiService.java index 8578c4ac5d..96f57078c0 100644 --- a/app/src/main/java/com/gh/gamecenter/retrofit/service/ApiService.java +++ b/app/src/main/java/com/gh/gamecenter/retrofit/service/ApiService.java @@ -2557,7 +2557,22 @@ public interface ApiService { * 获取论坛全部Tab内容(社区文章+问题) */ @GET("bbses/{bbs_id}/contents") - Observable> getAllForumList(@Path("bbs_id") String bbsId, @Query("sort") String sort, @Query("page") int page, @QueryMap Map params); + Observable> getAllForumList( + @Path("bbs_id") String bbsId, + @Query("top_id") String fixedTopId, + @Query("sort") String sort, + @Query("page") int page, + @QueryMap Map params); + + /** + * 获取论坛全部Tab内容(社区文章+问题) (同上) + */ + @GET("bbses/{bbs_id}/contents") + Observable> getAllForumList( + @Path("bbs_id") String bbsId, + @Query("sort") String sort, + @Query("page") int page, + @QueryMap Map params); /** * 获取论坛精华Tab内容(社区文章) diff --git a/app/src/main/java/com/gh/vspace/VDownloadManagerWrapperFragment.kt b/app/src/main/java/com/gh/vspace/VDownloadManagerWrapperFragment.kt index 3fbe0d9d0a..308af24c8b 100644 --- a/app/src/main/java/com/gh/vspace/VDownloadManagerWrapperFragment.kt +++ b/app/src/main/java/com/gh/vspace/VDownloadManagerWrapperFragment.kt @@ -101,19 +101,23 @@ class VDownloadManagerWrapperFragment: BaseLazyTabFragment() { } fun changeOption() { - val fragments = childFragmentManager.fragments - mViewModel.currentOptionLiveData.value?.let { - fragments.forEachIndexed { index, fragment -> - if (fragment is IBatchDelete) { - if (index == mViewPager.currentItem) { - fragment.changeOption(it) - } else if (index == mLastPosition) { - fragment.changeOption(ManageOption.OPTION_MANAGER) + try { + val fragments = childFragmentManager.fragments + mViewModel.currentOptionLiveData.value?.let { + fragments.forEachIndexed { index, fragment -> + if (fragment is IBatchDelete) { + if (index == mViewPager.currentItem) { + fragment.changeOption(it) + } else if (index == mLastPosition) { + fragment.changeOption(ManageOption.OPTION_MANAGER) + } } } } + changeMenuTextByOption() + } catch (e: IllegalStateException) { + // 忽略页面快速滚动时 childFragment 尚未添加到 fragmentManager 的情况 } - changeMenuTextByOption() } } \ No newline at end of file diff --git a/app/src/main/res/layout/download_dialog_installed_item.xml b/app/src/main/res/layout/download_dialog_installed_item.xml index 81a02c266e..0928a40bde 100644 --- a/app/src/main/res/layout/download_dialog_installed_item.xml +++ b/app/src/main/res/layout/download_dialog_installed_item.xml @@ -104,7 +104,7 @@ android:layout_width="8dp" android:layout_height="8dp" android:layout_marginRight="12dp" - android:src="@drawable/download_dialog_status_download_gray" + app:srcCompat="@drawable/download_dialog_status_download_gray" android:visibility="gone" /> + android:visibility="visible" + app:drawableRightCompat="@drawable/download_dialog_status_collection_gray" />