diff --git a/app/src/main/java/com/gh/common/DefaultUrlHandler.kt b/app/src/main/java/com/gh/common/DefaultUrlHandler.kt index 8521eef2f7..741b71504d 100644 --- a/app/src/main/java/com/gh/common/DefaultUrlHandler.kt +++ b/app/src/main/java/com/gh/common/DefaultUrlHandler.kt @@ -4,19 +4,20 @@ import android.content.Context import android.content.Intent import android.net.Uri import android.text.TextUtils +import android.util.Base64 import com.gh.common.util.* import com.gh.common.util.DirectUtils.directToGameDetailVideoStreaming +import com.gh.common.util.DirectUtils.directToGameServerCalendar import com.gh.common.util.DirectUtils.directToGameVideo +import com.gh.common.util.DirectUtils.directToLinkPage import com.gh.common.util.DirectUtils.directToVideoDetail -import com.gh.common.util.EntranceUtils +import com.gh.common.util.GsonUtils.gson import com.gh.gamecenter.* -import com.gh.gamecenter.entity.CommunityEntity -import com.gh.gamecenter.entity.SimpleGameEntity -import com.gh.gamecenter.entity.SubjectRecommendEntity -import com.gh.gamecenter.entity.VideoLinkEntity +import com.gh.gamecenter.entity.* import com.gh.gamecenter.subject.SubjectActivity import com.gh.gamecenter.video.detail.VideoDetailContainerViewModel import com.lightgame.utils.Utils +import java.nio.charset.Charset object DefaultUrlHandler { @@ -230,6 +231,36 @@ object DefaultUrlHandler { DirectUtils.directGameZone(context, id, zoneUrl, entrance) } + EntranceUtils.HOST_LINK -> { + try { + val dataString = uri.getQueryParameter("data") + if (!TextUtils.isEmpty(dataString)) { + val linkData = Base64.decode(dataString, Base64.DEFAULT) + val linkDataString = String(linkData, Charset.defaultCharset()) + val le = gson.fromJson(linkDataString, LinkEntity::class.java) + directToLinkPage(context, le, entrance, "") + } + } catch (e: Exception) { + e.printStackTrace() + } + } + + EntranceUtils.HOST_GAME_NEWS -> { + DirectUtils.directToGameNews( + context, + uri.getQueryParameter(EntranceUtils.KEY_GAME_ID), + uri.getQueryParameter(EntranceUtils.KEY_GAME_NAME), + entrance); + } + + EntranceUtils.HOST_GAME_CALENDAR -> { + directToGameServerCalendar(context, uri.getQueryParameter(EntranceUtils.KEY_GAME_ID)) + } + + EntranceUtils.HOST_HISTORY_APK -> { + DirectUtils.directToHistoryApk(context, uri.getQueryParameter(EntranceUtils.KEY_GAME_ID)) + } + else -> DialogUtils.showLowVersionDialog(context) } return 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 cf3da9d004..52db1a80b0 100644 --- a/app/src/main/java/com/gh/common/util/DirectUtils.kt +++ b/app/src/main/java/com/gh/common/util/DirectUtils.kt @@ -29,8 +29,9 @@ import com.gh.gamecenter.fragment.MainWrapperFragment import com.gh.gamecenter.game.columncollection.detail.ColumnCollectionDetailActivity import com.gh.gamecenter.game.upload.GameSubmissionActivity import com.gh.gamecenter.gamedetail.GameDetailFragment +import com.gh.gamecenter.gamedetail.fuli.kaifu.ServersCalendarActivity +import com.gh.gamecenter.gamedetail.history.HistoryApkListActivity import com.gh.gamecenter.manager.UserManager -import com.gh.gamecenter.mvvm.Resource import com.gh.gamecenter.mygame.PlayedGameActivity import com.gh.gamecenter.personalhome.UserHomeActivity import com.gh.gamecenter.qa.CommunityFragment @@ -94,9 +95,6 @@ object DirectUtils { } } - /** - * 跳转到特定页面,只支持App内部跳转 - */ @JvmStatic fun directToLinkPage(context: Context, linkEntity: LinkEntity, entrance: String, path: String) { directToLinkPage(context, linkEntity, entrance, path, null) @@ -294,6 +292,45 @@ object DirectUtils { jumpActivity(context, bundle) } + /** + * 跳转至资讯文章列表 + */ + @JvmStatic + fun directToGameNews(context: Context, gameId: String?, gameName: String?, entrance: String?) { + val bundle = Bundle() + bundle.putString(KEY_TO, GameNewsActivity::class.java.name) + bundle.putString(KEY_ENTRANCE, entrance) + bundle.putString(KEY_GAMEID, gameId) + bundle.putString(KEY_GAMENAME, gameName) + jumpActivity(context, bundle) + } + + /** + * 跳转至游戏日历表 + */ + @JvmStatic + fun directToGameServerCalendar(context: Context, gameId: String?) { + val bundle = Bundle() + bundle.putString(KEY_TO, ServersCalendarActivity::class.java.name) + bundle.putParcelable(GameEntity::class.java.simpleName, GameEntity().apply { + id = gameId ?: "" + }) + bundle.putParcelable(GameDetailServer::class.java.simpleName, GameDetailServer()) + bundle.putParcelable(MeEntity::class.java.simpleName, MeEntity()) + jumpActivity(context, bundle) + } + + /** + * 跳转至游戏历史版本页面 + */ + @JvmStatic + fun directToHistoryApk(context: Context, gameId: String?) { + val bundle = Bundle() + bundle.putString(KEY_TO, HistoryApkListActivity::class.java.name) + bundle.putString(KEY_GAMEID, gameId) + jumpActivity(context, bundle) + } + /** * 跳转到新闻详情 */ diff --git a/app/src/main/java/com/gh/common/util/EntranceUtils.java b/app/src/main/java/com/gh/common/util/EntranceUtils.java index 921539d261..dc34745f14 100644 --- a/app/src/main/java/com/gh/common/util/EntranceUtils.java +++ b/app/src/main/java/com/gh/common/util/EntranceUtils.java @@ -39,6 +39,7 @@ public class EntranceUtils { public static final String KEY_NEXT_TO = "next_to"; public static final String KEY_NEWSID = "newsId"; public static final String KEY_GAMEID = "gameId"; + public static final String KEY_GAME_ID = "game_id"; public static final String KEY_ID = "id"; public static final String KEY_URL = "url"; public static final String KEY_BUNDLE = "bundle"; @@ -60,6 +61,8 @@ public class EntranceUtils { public static final String HOST_BLOCK = "block";//板块 public static final String HOST_SERVER_BLOCK = "server";//开服表板块 public static final String HOST_AMWAY_BLOCK = "amway";//安利墙板块 + public static final String HOST_GAME_CALENDAR = "game_calendar";// 指定游戏的开服表页面 + public static final String HOST_HISTORY_APK = "history_apk"; // 历史版本页面 public static final String HOST_HELP = "help";//Q&A public static final String HOST_HELP_COLLECTION = "help_collection";//Q&A合集 public static final String HOST_GAME_UPLOAD = "game_upload";//游戏上传 @@ -68,6 +71,7 @@ public class EntranceUtils { public static final String HOST_COMMUNITY_COLUMN = "community_column"; public static final String HOST_GAME = "game"; public static final String HOST_GAME_DOWNLOAD = "game_download"; + public static final String HOST_GAME_NEWS = "game_news"; public static final String HOST_COLUMN = "column"; public static final String HOST_WEB = "web"; public static final String HOST_QQ = "qq"; @@ -75,6 +79,7 @@ public class EntranceUtils { public static final String HOST_QQ_QUN = "qqqun"; public static final String HOST_DOWNLOAD = "download"; public static final String HOST_UPDATE = "update"; + public static final String HOST_LINK = "link"; public static final String HOST_LIBAO = "libao"; public static final String HOST_COMMUNITY = "community"; public static final String HOST_SUGGESTION = "suggestion"; diff --git a/app/src/main/java/com/gh/gamecenter/GameNewsActivity.java b/app/src/main/java/com/gh/gamecenter/GameNewsActivity.java index c8d1111510..2e55256df2 100644 --- a/app/src/main/java/com/gh/gamecenter/GameNewsActivity.java +++ b/app/src/main/java/com/gh/gamecenter/GameNewsActivity.java @@ -3,6 +3,7 @@ package com.gh.gamecenter; import android.content.Context; import android.content.Intent; import android.os.Bundle; + import androidx.annotation.NonNull; import com.gh.common.util.EntranceUtils; @@ -25,4 +26,9 @@ public class GameNewsActivity extends NormalActivity { return getTargetIntent(context, GameNewsActivity.class, GameNewsSearchFragment.class, args); } + @Override + protected Intent provideNormalIntent() { + return getTargetIntent(this, GameNewsActivity.class, GameNewsSearchFragment.class); + } + } diff --git a/app/src/main/java/com/gh/gamecenter/SkipActivity.java b/app/src/main/java/com/gh/gamecenter/SkipActivity.java index 59bc1e1ac0..3b0eba15c0 100644 --- a/app/src/main/java/com/gh/gamecenter/SkipActivity.java +++ b/app/src/main/java/com/gh/gamecenter/SkipActivity.java @@ -4,14 +4,17 @@ import android.content.Intent; import android.net.Uri; import android.os.Bundle; import android.text.TextUtils; +import android.util.Base64; import com.gh.base.BaseActivity; import com.gh.common.util.CheckLoginUtils; import com.gh.common.util.DirectUtils; import com.gh.common.util.EntranceUtils; +import com.gh.common.util.GsonUtils; import com.gh.common.util.PlatformUtils; import com.gh.common.util.RunningUtils; import com.gh.gamecenter.entity.CommunityEntity; +import com.gh.gamecenter.entity.LinkEntity; import com.gh.gamecenter.entity.SimpleGameEntity; import com.gh.gamecenter.entity.SubjectRecommendEntity; import com.gh.gamecenter.entity.VideoLinkEntity; @@ -35,8 +38,8 @@ import static com.gh.common.util.EntranceUtils.HOST_DOWNLOAD; import static com.gh.common.util.EntranceUtils.HOST_GAME; import static com.gh.common.util.EntranceUtils.HOST_LIBAO; import static com.gh.common.util.EntranceUtils.HOST_QQ; -import static com.gh.common.util.EntranceUtils.HOST_QQ_QUN; import static com.gh.common.util.EntranceUtils.HOST_QQ_GROUP; +import static com.gh.common.util.EntranceUtils.HOST_QQ_QUN; import static com.gh.common.util.EntranceUtils.HOST_QUESTION; import static com.gh.common.util.EntranceUtils.HOST_SUGGESTION; import static com.gh.common.util.EntranceUtils.HOST_TOOLBOX; @@ -328,7 +331,33 @@ public class SkipActivity extends BaseActivity { String zoneUrl = uri.getQueryParameter("url"); DirectUtils.directGameZone(this, path, zoneUrl, ENTRANCE_BROWSER); break; - + case EntranceUtils.HOST_LINK: + try { + String dataString = uri.getQueryParameter("data"); + if (!TextUtils.isEmpty(dataString)) { + byte[] linkData = Base64.decode(dataString, Base64.DEFAULT); + String linkDataString = new String(linkData, "UTF-8"); + LinkEntity le = GsonUtils.INSTANCE.getGson().fromJson(linkDataString, LinkEntity.class); + DirectUtils.directToLinkPage(this, le, ENTRANCE_BROWSER, ""); + } + } catch (Exception e) { + e.printStackTrace(); + toast(e.getMessage()); + } + break; + case EntranceUtils.HOST_GAME_NEWS: + DirectUtils.directToGameNews( + this, + uri.getQueryParameter(EntranceUtils.KEY_GAME_ID), + uri.getQueryParameter(EntranceUtils.KEY_GAME_NAME), + EntranceUtils.ENTRANCE_BROWSER); + break; + case EntranceUtils.HOST_GAME_CALENDAR: + DirectUtils.directToGameServerCalendar(this, uri.getQueryParameter(EntranceUtils.KEY_GAME_ID)); + break; + case EntranceUtils.HOST_HISTORY_APK: + DirectUtils.directToHistoryApk(this, uri.getQueryParameter(EntranceUtils.KEY_GAME_ID)); + break; default: EntranceUtils.jumpActivity(this, new Bundle()); // 跳转至首页 return; diff --git a/app/src/main/java/com/gh/gamecenter/gamedetail/history/HistoryApkListActivity.kt b/app/src/main/java/com/gh/gamecenter/gamedetail/history/HistoryApkListActivity.kt index e2693f0d93..c126d0ecc3 100644 --- a/app/src/main/java/com/gh/gamecenter/gamedetail/history/HistoryApkListActivity.kt +++ b/app/src/main/java/com/gh/gamecenter/gamedetail/history/HistoryApkListActivity.kt @@ -15,11 +15,16 @@ class HistoryApkListActivity : NormalActivity() { fun getIntent(context: Context, gameEntity: GameEntity, entrance: String, path: String): Intent { val bundle = Bundle() bundle.putString(EntranceUtils.KEY_ENTRANCE, BaseActivity.mergeEntranceAndPath(entrance, path)) + bundle.putString(EntranceUtils.KEY_GAMEID, gameEntity.id) bundle.putParcelable(EntranceUtils.KEY_GAME, gameEntity) return getTargetIntent(context, HistoryApkListActivity::class.java, HistoryApkListFragment::class.java, bundle) } } + override fun provideNormalIntent(): Intent { + return getTargetIntent(this, HistoryApkListActivity::class.java, HistoryApkListFragment::class.java) + } + override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setNavigationTitle(R.string.title_history_apk) diff --git a/app/src/main/java/com/gh/gamecenter/gamedetail/history/HistoryApkListAdapter.kt b/app/src/main/java/com/gh/gamecenter/gamedetail/history/HistoryApkListAdapter.kt index a2b04f7c2a..7f20e47c68 100644 --- a/app/src/main/java/com/gh/gamecenter/gamedetail/history/HistoryApkListAdapter.kt +++ b/app/src/main/java/com/gh/gamecenter/gamedetail/history/HistoryApkListAdapter.kt @@ -68,7 +68,7 @@ class HistoryApkListAdapter(context: Context, holder.binding.updateDescTv, mExpandSparseBooleanArray.get(holder.adapterPosition), holder.binding.downloadBtn.visibility == View.VISIBLE) - MtaHelper.onEvent("历史版本", "展开", "${mViewModel.game.name}+${apkEntity.version}") + MtaHelper.onEvent("历史版本", "展开", "${mViewModel.game?.name}+${apkEntity.version}") } holder.binding.executePendingBindings() holder.binding.downloadBtn.run { @@ -155,10 +155,10 @@ class HistoryApkListAdapter(context: Context, private fun showDowngradeToastIfNeed(apkEntity: ApkEntity, btnText: CharSequence) { when (btnText) { - "下载" -> MtaHelper.onEvent("历史版本", "下载", "${mViewModel.game.name}_${apkEntity.version}") - "下载中" -> MtaHelper.onEvent("历史版本", "下载中", "${mViewModel.game.name}_${apkEntity.version}") - "安装" -> MtaHelper.onEvent("历史版本", "安装", "${mViewModel.game.name}_${apkEntity.version}") - "启动" -> MtaHelper.onEvent("历史版本", "启动", "${mViewModel.game.name}_${apkEntity.version}") + "下载" -> MtaHelper.onEvent("历史版本", "下载", "${mViewModel.game?.name}_${apkEntity.version}") + "下载中" -> MtaHelper.onEvent("历史版本", "下载中", "${mViewModel.game?.name}_${apkEntity.version}") + "安装" -> MtaHelper.onEvent("历史版本", "安装", "${mViewModel.game?.name}_${apkEntity.version}") + "启动" -> MtaHelper.onEvent("历史版本", "启动", "${mViewModel.game?.name}_${apkEntity.version}") } if (btnText == "安装" || btnText == "下载") { if (PackageUtils.isInstalled(mContext, apkEntity.packageName)) { diff --git a/app/src/main/java/com/gh/gamecenter/gamedetail/history/HistoryApkListFragment.kt b/app/src/main/java/com/gh/gamecenter/gamedetail/history/HistoryApkListFragment.kt index e03fc23d3c..52e850dae5 100644 --- a/app/src/main/java/com/gh/gamecenter/gamedetail/history/HistoryApkListFragment.kt +++ b/app/src/main/java/com/gh/gamecenter/gamedetail/history/HistoryApkListFragment.kt @@ -72,15 +72,16 @@ class HistoryApkListFragment : ListFragment return itemDecoration } - override fun getLayoutId(): Int { - return R.layout.fragment_history_apk_list - } + override fun getLayoutId() = R.layout.fragment_history_apk_list + + override fun isAutomaticLoad() = arguments?.getParcelable(EntranceUtils.KEY_GAME) != null override fun provideListViewModel(): HistoryApkListViewModel { if (mViewModel == null) { val factory = HistoryApkListViewModel.Factory( HaloApp.getInstance().application, - arguments?.getParcelable(EntranceUtils.KEY_GAME) ?: GameEntity()) + arguments?.getString(EntranceUtils.KEY_GAMEID) ?: "", + arguments?.getParcelable(EntranceUtils.KEY_GAME)) mViewModel = viewModelProvider(factory) } diff --git a/app/src/main/java/com/gh/gamecenter/gamedetail/history/HistoryApkListViewModel.kt b/app/src/main/java/com/gh/gamecenter/gamedetail/history/HistoryApkListViewModel.kt index f4c7b81c4f..417dbe07a7 100644 --- a/app/src/main/java/com/gh/gamecenter/gamedetail/history/HistoryApkListViewModel.kt +++ b/app/src/main/java/com/gh/gamecenter/gamedetail/history/HistoryApkListViewModel.kt @@ -6,34 +6,59 @@ import androidx.lifecycle.ViewModel import androidx.lifecycle.ViewModelProvider import com.gh.common.constant.Constants import com.gh.gamecenter.baselist.ListViewModel +import com.gh.gamecenter.baselist.LoadType import com.gh.gamecenter.entity.ApkEntity import com.gh.gamecenter.entity.GameEntity +import com.gh.gamecenter.retrofit.Response import com.gh.gamecenter.retrofit.RetrofitManager -import io.reactivex.Observable import io.reactivex.Single +import io.reactivex.android.schedulers.AndroidSchedulers +import io.reactivex.schedulers.Schedulers +import retrofit2.HttpException -class HistoryApkListViewModel(application: Application, var game: GameEntity) +class HistoryApkListViewModel(application: Application, var gameId: String, var game: GameEntity?) : ListViewModel(application) { val showDowngradeHint = MutableLiveData() - override fun provideDataObservable(page: Int): Observable>? { - return null + init { + if (game == null) { + getGameDigest() + } } + override fun provideDataObservable(page: Int) = null + override fun provideDataSingle(page: Int): Single> { - return RetrofitManager.getInstance(getApplication()).sensitiveApi.getHistoryApks(game.id, page) + return RetrofitManager.getInstance(getApplication()).sensitiveApi.getHistoryApks(gameId, page) + } + + fun getGameDigest() { + RetrofitManager.getInstance(getApplication()).sensitiveApi + .getGameDigest(gameId) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(object : Response() { + override fun onResponse(response: GameEntity?) { + game = response + load(LoadType.NORMAL) + } + + override fun onFailure(e: HttpException?) { + load(LoadType.NORMAL) + } + }) } override fun mergeResultLiveData() { mResultLiveData.addSource(mListLiveData) { val gameList = arrayListOf() for (apk in it) { - gameList.add(game.clone().apply { + gameList.add(game!!.clone().apply { // 改变 id 避免其它地方根据原有 game id 变更状态 this.isReservable = false - this.id = game.id + Constants.GAME_ID_DIVIDER + apk.version - this.name = game.name + Constants.GAME_NAME_DECORATOR // 历史版本加个空格避免其他用游戏名来判定是否待安装的地方错误判断 + this.id = game?.id + Constants.GAME_ID_DIVIDER + apk.version + this.name = game?.name + Constants.GAME_NAME_DECORATOR // 历史版本加个空格避免其他用游戏名来判定是否待安装的地方错误判断 this.setApk(arrayListOf(apk)) }) } @@ -45,9 +70,10 @@ class HistoryApkListViewModel(application: Application, var game: GameEntity) } class Factory(private val mApplication: Application, - private val game: GameEntity) : ViewModelProvider.NewInstanceFactory() { + private val gameId: String, + private val game: GameEntity?) : ViewModelProvider.NewInstanceFactory() { override fun create(modelClass: Class): T { - return HistoryApkListViewModel(mApplication, game) as T + return HistoryApkListViewModel(mApplication, gameId, game) as T } } diff --git a/app/src/main/java/com/halo/assistant/fragment/WebFragment.java b/app/src/main/java/com/halo/assistant/fragment/WebFragment.java index 8aba32c862..695554b43e 100644 --- a/app/src/main/java/com/halo/assistant/fragment/WebFragment.java +++ b/app/src/main/java/com/halo/assistant/fragment/WebFragment.java @@ -51,7 +51,6 @@ import org.greenrobot.eventbus.ThreadMode; import java.util.HashMap; import java.util.List; -import androidx.annotation.Nullable; import butterknife.BindView; import butterknife.OnClick; import io.reactivex.android.schedulers.AndroidSchedulers;