From a1be8352f0123647d42b4efa080aea06576234dc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BC=A0=E7=8E=89=E4=B9=85?= Date: Mon, 16 May 2022 15:09:03 +0800 Subject: [PATCH] =?UTF-8?q?=E3=80=90=E5=85=89=E7=8E=AF=E5=8A=A9=E6=89=8BV5?= =?UTF-8?q?.10.0=E3=80=91=E6=B8=B8=E6=88=8F=E5=BA=93=E5=8A=9F=E8=83=BD?= =?UTF-8?q?=E4=BC=98=E5=8C=96=20https://git.shanqu.cc/pm/halo-app-issues/-?= =?UTF-8?q?/issues/1834?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../fragment/MainWrapperFragment.java | 107 +++++++++++++++--- .../fragment/MainWrapperRepository.kt | 48 ++++++++ .../fragment/MainWrapperViewModel.kt | 42 +++---- .../fragment/SearchToolWrapperFragment.java | 2 + .../square/GameCollectionSquareFragment.kt | 4 +- .../retrofit/service/ApiService.java | 6 + .../main/java/com/halo/assistant/HaloApp.java | 10 +- 7 files changed, 170 insertions(+), 49 deletions(-) create mode 100644 app/src/main/java/com/gh/gamecenter/fragment/MainWrapperRepository.kt diff --git a/app/src/main/java/com/gh/gamecenter/fragment/MainWrapperFragment.java b/app/src/main/java/com/gh/gamecenter/fragment/MainWrapperFragment.java index 9c969f252f..30f914263a 100644 --- a/app/src/main/java/com/gh/gamecenter/fragment/MainWrapperFragment.java +++ b/app/src/main/java/com/gh/gamecenter/fragment/MainWrapperFragment.java @@ -29,13 +29,14 @@ import com.facebook.imagepipeline.image.ImageInfo; import com.gh.common.constant.Config; import com.gh.common.dialog.PrivacyPolicyDialogFragment; import com.gh.common.dialog.ReserveDialog; +import com.gh.common.exposure.ExposureSource; import com.gh.common.tracker.TrackerLogger; -import com.gh.common.util.DataUtils; import com.gh.common.util.FloatingBackViewManager; import com.gh.common.util.HomeBottomBarHelper; import com.gh.common.util.IntegralLogHelper; import com.gh.common.util.LogUtils; import com.gh.gamecenter.R; +import com.gh.gamecenter.category2.CategoryV2Fragment; import com.gh.gamecenter.common.base.fragment.BaseFragment_ViewPager_Checkable; import com.gh.gamecenter.common.callback.BiCallback; import com.gh.gamecenter.common.callback.OnDoubleTapListener; @@ -47,6 +48,7 @@ import com.gh.gamecenter.common.utils.NightModeUtils; import com.gh.gamecenter.core.utils.DisplayUtils; import com.gh.gamecenter.databinding.FragmentMainBinding; import com.gh.gamecenter.entity.SettingsEntity; +import com.gh.gamecenter.entity.SubjectData; import com.gh.gamecenter.entity.SubjectRecommendEntity; import com.gh.gamecenter.entity.WelcomeDialogEntity; import com.gh.gamecenter.eventbus.EBReuse; @@ -54,11 +56,18 @@ import com.gh.gamecenter.eventbus.EBSkip; import com.gh.gamecenter.eventbus.EBUISwitch; import com.gh.gamecenter.forum.home.CommunityHomeFragment; import com.gh.gamecenter.game.GameFragment; +import com.gh.gamecenter.game.columncollection.detail.ColumnCollectionDetailFragment; +import com.gh.gamecenter.game.commoncollection.detail.CommonCollectionDetailFragment; +import com.gh.gamecenter.gamecollection.square.GameCollectionSquareFragment; import com.gh.gamecenter.message.MessageUnreadRepository; import com.gh.gamecenter.message.MessageUnreadViewModel; import com.gh.gamecenter.personal.PersonalFragment; +import com.gh.gamecenter.servers.GameServersPublishFragment; +import com.gh.gamecenter.servers.GameServersTestFragment; +import com.gh.gamecenter.subject.SubjectFragment; import com.gh.gamecenter.video.detail.HomeVideoFragment; import com.halo.assistant.HaloApp; +import com.halo.assistant.fragment.WebFragment; import com.lightgame.listeners.OnBackPressedListener; import com.lightgame.view.CheckableLinearLayout; import com.lightgame.view.NoScrollableViewPager; @@ -116,11 +125,7 @@ public class MainWrapperFragment extends BaseFragment_ViewPager_Checkable implem mHomeFragment = new HomeSearchToolWrapperFragment(); fragments.add(mHomeFragment); - mGameWrapperFragment = new SearchToolWrapperFragment(); - Bundle homeArgs = new Bundle(); - homeArgs.putBoolean(EntranceConsts.KEY_IS_HOME, true); - homeArgs.putString(SearchToolWrapperFragment.WRAPPER_FRAGMENT_NAME, GameFragment.class.getName()); - mGameWrapperFragment.setArguments(homeArgs); + initGameWrapperFragment(); fragments.add(mGameWrapperFragment); mHomeVideoFragment = new HomeVideoFragment(); @@ -139,6 +144,80 @@ public class MainWrapperFragment extends BaseFragment_ViewPager_Checkable implem fragments.add(new PersonalFragment()); } + private void initGameWrapperFragment() { + mGameWrapperFragment = new SearchToolWrapperFragment(); + Bundle homeArgs = new Bundle(); + String className = GameFragment.class.getName(); + SubjectRecommendEntity entity = mViewModel.getNavBar().getValue(); + if (entity == null) { + entity = HomeBottomBarHelper.getDefaultGameBarData(); + } + if (entity.getType() != null) { + switch (entity.getType()) { + case "block": + className = GameFragment.class.getName(); + break; + case "column": + className = SubjectFragment.class.getName(); + homeArgs.putString(EntranceConsts.KEY_ENTRANCE, "游戏库"); + homeArgs.putParcelable( + EntranceConsts.KEY_SUBJECT_DATA, + new SubjectData(entity.getLink(), entity.getText(), false, "", "", "", "", true, false) + ); + break; + case "column_collection": + className = ColumnCollectionDetailFragment.class.getName(); + homeArgs.putString(EntranceConsts.KEY_ENTRANCE, "游戏库"); + homeArgs.putString(EntranceConsts.KEY_COLLECTION_ID, entity.getLink()); + homeArgs.putInt(EntranceConsts.KEY_POSITION, 0); + homeArgs.putString(EntranceConsts.KEY_COLUMNNAME, entity.getText()); + homeArgs.putBoolean(EntranceConsts.KEY_IS_COLUMN_COLLECTION, true); + break; + case "server": + className = GameServersPublishFragment.class.getName(); + break; + case "column_test": + className = GameServersTestFragment.class.getName(); + homeArgs.putString(GameServersTestFragment.TEST_COLUMN_ID, entity.getLink()); + break; + case "category_v2": + className = CategoryV2Fragment.class.getName(); + homeArgs.putString(EntranceConsts.KEY_CATEGORY_ID, entity.getLink()); + homeArgs.putString(EntranceConsts.KEY_CATEGORY_TITLE, entity.getText()); + break; + case "common_collection": + className = CommonCollectionDetailFragment.class.getName(); + homeArgs.putString(EntranceConsts.KEY_ENTRANCE, "游戏库"); + homeArgs.putString(EntranceConsts.KEY_COLLECTION_ID, entity.getLink()); + homeArgs.putString(EntranceConsts.KEY_COLUMNNAME, entity.getText()); + break; + case "game_list": + className = GameCollectionSquareFragment.class.getName(); + homeArgs.putString(EntranceConsts.KEY_ENTRANCE, "游戏库"); + homeArgs.putInt(EntranceConsts.KEY_TAB_INDEX, 0); + homeArgs.putString(EntranceConsts.KEY_NAME, entity.getName()); + break; + case "web": + className = WebFragment.class.getName(); + homeArgs.putString(EntranceConsts.KEY_URL, entity.getLink()); + homeArgs.putBoolean(WebFragment.KEY_OPEN_NATIVE_PAGE, false); + homeArgs.putBoolean(WebFragment.KEY_ENABLE_HORIZONTAL_SCROLL_DISPATCH, true); + if (entity.getLink() != null && entity.getLink().contains("leave_web_page_handle_back_pressed=true")) { + homeArgs.putBoolean(WebFragment.KEY_LEAVE_WEB_PAGE_TO_HANDLE_BACK_PRESSED, true); + } + break; + } + } + + homeArgs.putString(SearchToolWrapperFragment.WRAPPER_FRAGMENT_NAME, className); + homeArgs.putBoolean(EntranceConsts.KEY_IS_HOME, true); + homeArgs.putParcelable( + EntranceConsts.KEY_EXPOSURE_SOURCE, + new ExposureSource("游戏库", "") + ); + mGameWrapperFragment.setArguments(homeArgs); + } + @Override public ArrayList restoreFragments() { ArrayList restoreFragments = super.restoreFragments(); @@ -158,7 +237,7 @@ public class MainWrapperFragment extends BaseFragment_ViewPager_Checkable implem @Override public void onCreate(Bundle savedInstanceState) { - mViewModel = ViewModelProviders.of(this).get(MainWrapperViewModel.class); + mViewModel = ViewModelProviders.of(this, new MainWrapperViewModel.Factory(HaloApp.getInstance())).get(MainWrapperViewModel.class); super.onCreate(savedInstanceState); @@ -193,7 +272,7 @@ public class MainWrapperFragment extends BaseFragment_ViewPager_Checkable implem .get(MessageUnreadViewModel.class) .getUnreadMessageTotalLiveData().observe(this, isShow -> ExtensionsKt.goneIf(mBinding.mainIvMessageHint, !isShow)); } - + public void getDialog() { mViewModel.requestOpeningData(); mViewModel.getPrivacyPolicyDialog().observe(this, it -> { @@ -207,7 +286,7 @@ public class MainWrapperFragment extends BaseFragment_ViewPager_Checkable implem } }); } - + private void showWelcomeDialogIfNeeded(WelcomeDialogEntity welcomeDialogEntity) { // 判断启动本次应用是否已经弹窗,不是的话弹启动弹窗 if (welcomeDialogEntity != null && HaloApp.get(MainWrapperViewModel.SHOULD_SHOW_OPENING_DIALOG, false) == null) { @@ -217,7 +296,7 @@ public class MainWrapperFragment extends BaseFragment_ViewPager_Checkable implem public void onFirst(Bitmap bitmap) { // 网络速度追不上用户操作的时候可能会出现要弹启动弹窗但用户已经不停留在 MainActivity 的情况 if (!isAdded()) return; - + WelcomeDialogFragment welcomeDialog = WelcomeDialogFragment.getInstance(welcomeDialogEntity); welcomeDialog.setOnDismissListener(() -> { mViewModel.requestReserveDialog(); @@ -225,7 +304,7 @@ public class MainWrapperFragment extends BaseFragment_ViewPager_Checkable implem }); welcomeDialog.show(getChildFragmentManager(), "openingDialog"); } - + @Override public void onSecond(Boolean aBoolean) { mViewModel.requestReserveDialog(); @@ -242,7 +321,7 @@ public class MainWrapperFragment extends BaseFragment_ViewPager_Checkable implem mBinding.mainTabGameName.setText(navBarEntity.getName()); ImageUtils.getPicasso() .load(Uri.parse(navBarEntity.getIconUnselect())) - .placeholder(R.drawable.ic_game_unselect) + //.placeholder(R.drawable.ic_game_unselect) .into(mBinding.mainTabGameIcon); if (navBarEntity.getDefault()) setCurrentItem(INDEX_GAME); } else { @@ -477,12 +556,12 @@ public class MainWrapperFragment extends BaseFragment_ViewPager_Checkable implem if (index == INDEX_GAME) { ImageUtils.getPicasso() .load(Uri.parse(navBarEntity.getIconSelect())) - .placeholder(R.drawable.ic_game_select) + //.placeholder(R.drawable.ic_game_select) .into(mBinding.mainTabGameIcon); } else { ImageUtils.getPicasso() .load(Uri.parse(navBarEntity.getIconUnselect())) - .placeholder(R.drawable.ic_game_unselect) + //.placeholder(R.drawable.ic_game_unselect) .into(mBinding.mainTabGameIcon); } } diff --git a/app/src/main/java/com/gh/gamecenter/fragment/MainWrapperRepository.kt b/app/src/main/java/com/gh/gamecenter/fragment/MainWrapperRepository.kt new file mode 100644 index 0000000000..515ac9aff4 --- /dev/null +++ b/app/src/main/java/com/gh/gamecenter/fragment/MainWrapperRepository.kt @@ -0,0 +1,48 @@ +package com.gh.gamecenter.fragment + +import android.annotation.SuppressLint +import androidx.lifecycle.MutableLiveData +import com.gh.common.util.HomeBottomBarHelper +import com.gh.gamecenter.BuildConfig +import com.gh.gamecenter.core.utils.SingletonHolder +import com.gh.gamecenter.entity.SubjectRecommendEntity +import com.gh.gamecenter.retrofit.BiResponse +import com.gh.gamecenter.retrofit.RetrofitManager +import com.halo.assistant.HaloApp +import io.reactivex.android.schedulers.AndroidSchedulers +import io.reactivex.schedulers.Schedulers +import retrofit2.HttpException + +class MainWrapperRepository { + + private val mSensitiveApi = RetrofitManager.getInstance().api + + private val mNavBar = MutableLiveData() + + fun getNavBarLiveData() = mNavBar + + @SuppressLint("CheckResult") + fun getHomeNavBar() { + mSensitiveApi.getHomeNavBarV2(HaloApp.getInstance().channel, BuildConfig.VERSION_NAME) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(object : BiResponse() { + override fun onSuccess(data: SubjectRecommendEntity) { + HomeBottomBarHelper.updateDefaultGameBarData(data) + mNavBar.postValue(data) + } + + override fun onFailure(exception: Exception) { + if (exception is HttpException && exception.code() == 404) { + mNavBar.postValue(null) + HomeBottomBarHelper.updateDefaultGameBarData(SubjectRecommendEntity()) + } else { + mNavBar.postValue(HomeBottomBarHelper.getDefaultGameBarData()) + } + } + }) + } + + + companion object : SingletonHolder({ MainWrapperRepository() }) +} \ No newline at end of file diff --git a/app/src/main/java/com/gh/gamecenter/fragment/MainWrapperViewModel.kt b/app/src/main/java/com/gh/gamecenter/fragment/MainWrapperViewModel.kt index 4b0a185264..63f0130eab 100644 --- a/app/src/main/java/com/gh/gamecenter/fragment/MainWrapperViewModel.kt +++ b/app/src/main/java/com/gh/gamecenter/fragment/MainWrapperViewModel.kt @@ -5,11 +5,13 @@ import android.app.Application import android.preference.PreferenceManager import androidx.lifecycle.AndroidViewModel import androidx.lifecycle.MutableLiveData -import com.gh.gamecenter.common.constant.Constants +import androidx.lifecycle.ViewModel +import androidx.lifecycle.ViewModelProvider import com.gh.common.util.CheckLoginUtils import com.gh.common.util.HomeBottomBarHelper import com.gh.common.util.PackageUtils import com.gh.gamecenter.BuildConfig +import com.gh.gamecenter.common.constant.Constants import com.gh.gamecenter.core.utils.SPUtils import com.gh.gamecenter.entity.DialogEntity import com.gh.gamecenter.entity.SimpleGameEntity @@ -23,43 +25,17 @@ import io.reactivex.android.schedulers.AndroidSchedulers import io.reactivex.schedulers.Schedulers import retrofit2.HttpException -class MainWrapperViewModel(application: Application) : AndroidViewModel(application) { +class MainWrapperViewModel(application: Application, repository: MainWrapperRepository) : AndroidViewModel(application) { private val mApi = RetrofitManager.getInstance().api private val mSensitiveApi = RetrofitManager.getInstance().api - val navBar = MutableLiveData() + val navBar: MutableLiveData = repository.getNavBarLiveData() // 弹窗优先级: 隐私政策弹窗->启动弹窗->预约弹窗->消息弹窗 val openingDialog = MutableLiveData() val reserveDialog = MutableLiveData?>() val privacyPolicyDialog = MutableLiveData() - init { - getHomeNavBar() - } - - @SuppressLint("CheckResult") - private fun getHomeNavBar() { - mSensitiveApi.getHomeNavBar(HaloApp.getInstance().channel, BuildConfig.VERSION_NAME) - .subscribeOn(Schedulers.io()) - .observeOn(AndroidSchedulers.mainThread()) - .subscribe(object : BiResponse() { - override fun onSuccess(data: SubjectRecommendEntity) { - HomeBottomBarHelper.updateDefaultGameBarData(data) - navBar.postValue(data) - } - - override fun onFailure(exception: Exception) { - if (exception is HttpException && exception.code() == 404) { - navBar.postValue(null) - HomeBottomBarHelper.updateDefaultGameBarData(SubjectRecommendEntity()) - } else { - navBar.postValue(HomeBottomBarHelper.getDefaultGameBarData()) - } - } - }) - } - /** * 获取弹窗 */ @@ -149,6 +125,14 @@ class MainWrapperViewModel(application: Application) : AndroidViewModel(applicat return if (channelInInteger == null) false else channelInInteger in 1001..1050 } + class Factory( + private val mApplication: Application, + ) : ViewModelProvider.NewInstanceFactory() { + override fun create(modelClass: Class): T { + return MainWrapperViewModel(mApplication, MainWrapperRepository.getInstance()) as T + } + } + companion object { const val SHOULD_SHOW_OPENING_DIALOG = "show_opening_dialog" } diff --git a/app/src/main/java/com/gh/gamecenter/fragment/SearchToolWrapperFragment.java b/app/src/main/java/com/gh/gamecenter/fragment/SearchToolWrapperFragment.java index 45e365a17b..3d2b23891c 100644 --- a/app/src/main/java/com/gh/gamecenter/fragment/SearchToolWrapperFragment.java +++ b/app/src/main/java/com/gh/gamecenter/fragment/SearchToolWrapperFragment.java @@ -51,6 +51,8 @@ public class SearchToolWrapperFragment extends LazyFragment { bundle.putString(EntranceConsts.KEY_LOCATION, "游戏库"); } mSearchToolbarFragment.setArguments(bundle); + Bundle mContentBundle = (Bundle) requireArguments().clone(); + mContentFragment.setArguments(mContentBundle); } } catch (Exception e) { e.printStackTrace(); diff --git a/app/src/main/java/com/gh/gamecenter/gamecollection/square/GameCollectionSquareFragment.kt b/app/src/main/java/com/gh/gamecenter/gamecollection/square/GameCollectionSquareFragment.kt index 8c20bbe358..364a936bd3 100644 --- a/app/src/main/java/com/gh/gamecenter/gamecollection/square/GameCollectionSquareFragment.kt +++ b/app/src/main/java/com/gh/gamecenter/gamecollection/square/GameCollectionSquareFragment.kt @@ -99,7 +99,7 @@ class GameCollectionSquareFragment : LazyListFragment(R.id.fab)?.visibility = View.GONE } else { if (mExposureEventList.isNotEmpty()) ExposureManager.log(mExposureEventList) @@ -109,7 +109,7 @@ class GameCollectionSquareFragment : LazyListFragment(R.id.fab)?.visibility = View.VISIBLE } } 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 6a8c76fffb..6fb5bfd1ee 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 @@ -2355,6 +2355,12 @@ public interface ApiService { @GET("home/navbar") Single getHomeNavBar(@Query("channel") String channel, @Query("version") String version); + /** + * 首页导航栏数据v2 + */ + @GET("home/navbar/v2") + Single getHomeNavBarV2(@Query("channel") String channel, @Query("version") String version); + /** * 获取我的光环功能列表 */ diff --git a/app/src/main/java/com/halo/assistant/HaloApp.java b/app/src/main/java/com/halo/assistant/HaloApp.java index f59ae830f7..3dd89feec0 100644 --- a/app/src/main/java/com/halo/assistant/HaloApp.java +++ b/app/src/main/java/com/halo/assistant/HaloApp.java @@ -28,31 +28,32 @@ import com.gh.base.GlobalActivityLifecycleObserver; import com.gh.common.FixedRateJobHelper; import com.gh.common.exposure.ExposureManager; import com.gh.common.filter.RegionSettingHelper; -import com.gh.gamecenter.common.image.EmptyDecoder; import com.gh.common.loghub.LoghubUtils; import com.gh.common.tracker.Tracker; import com.gh.common.util.DataUtils; import com.gh.common.util.DownloadNotificationHelper; import com.gh.common.util.DownloadObserver; -import com.gh.gamecenter.common.utils.EmulatorUtil; import com.gh.common.util.HomeBottomBarHelper; -import com.gh.gamecenter.common.utils.NightModeUtils; import com.gh.common.util.PackageHelper; import com.gh.common.util.PackageUtils; -import com.gh.gamecenter.common.utils.TimestampUtils; import com.gh.common.videolog.VideoRecordUtils; import com.gh.gamecenter.BuildConfig; import com.gh.gamecenter.Injection; import com.gh.gamecenter.common.constant.Config; import com.gh.gamecenter.common.constant.Constants; +import com.gh.gamecenter.common.image.EmptyDecoder; import com.gh.gamecenter.common.utils.DeviceUtils; +import com.gh.gamecenter.common.utils.EmulatorUtil; import com.gh.gamecenter.common.utils.ExtensionsKt; import com.gh.gamecenter.common.utils.ImageUtils; +import com.gh.gamecenter.common.utils.NightModeUtils; import com.gh.gamecenter.common.utils.PackageFlavorHelper; +import com.gh.gamecenter.common.utils.TimestampUtils; import com.gh.gamecenter.core.AppExecutor; import com.gh.gamecenter.core.iinterface.IApplication; import com.gh.gamecenter.core.utils.SPUtils; import com.gh.gamecenter.entity.SubjectRecommendEntity; +import com.gh.gamecenter.fragment.MainWrapperRepository; import com.gh.gamecenter.packagehelper.PackageRepository; import com.gh.gamecenter.receiver.ActivitySkipReceiver; import com.gh.gamecenter.receiver.DownloadReceiver; @@ -207,6 +208,7 @@ public class HaloApp extends MultiDexApplication implements Configuration.Provid } // 异步初始化 SP SPUtils.getString(""); + MainWrapperRepository.Companion.getInstance().getHomeNavBar(); }); RxJavaPlugins.setIoSchedulerHandler(scheduler -> AppExecutor.INSTANCE.getCachedScheduler());