From a26e61ae4b5cf21a8d6a7db9c90ebbe04689400a Mon Sep 17 00:00:00 2001 From: liuyirong Date: Mon, 27 Dec 2021 11:07:31 +0800 Subject: [PATCH] =?UTF-8?q?=E3=80=90=E5=85=89=E7=8E=AF=E5=8A=A9=E6=89=8BV5?= =?UTF-8?q?.5.0=E3=80=91=E6=B8=B8=E6=88=8F=E5=8D=95=E6=B4=BB=E5=8A=A8?= =?UTF-8?q?=EF=BC=9A=E8=A7=A3=E9=94=81=E5=A5=BD=E6=B8=B8=E7=A7=8D=E8=8D=89?= =?UTF-8?q?=E6=96=B0=E5=A7=BF=E5=8A=BF=EF=BC=88=E5=AE=A2=E6=88=B7=E7=AB=AF?= =?UTF-8?q?=E9=83=A8=E5=88=86=EF=BC=89https://git.shanqu.cc/pm/halo-app-is?= =?UTF-8?q?sues/-/issues/1638?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/build.gradle | 7 +- .../base/GlobalActivityLifecycleObserver.kt | 2 +- .../main/java/com/gh/common/DefaultJsApi.kt | 22 +- .../java/com/gh/common/DefaultUrlHandler.kt | 10 +- .../java/com/gh/common/constant/Config.java | 1 + .../com/gh/common/constant/Constants.java | 4 + .../com/gh/common/util/EntranceUtils.java | 2 + .../main/java/com/gh/common/util/EnvHelper.kt | 13 + .../gh/common/util/FloatingBackViewManager.kt | 4 +- .../GameCollectionSquareBrowseTaskHelper.kt | 226 ++++++++++++++++++ .../java/com/gh/common/util/LogUtils.java | 21 ++ .../java/com/gh/gamecenter/SkipActivity.java | 4 + .../forum/home/CommunityHomeFragment.kt | 2 +- .../fragment/MainWrapperFragment.java | 2 +- .../detail/GameCollectionDetailActivity.kt | 6 + .../detail/GameCollectionDetailViewModel.kt | 14 ++ .../square/GameCollectionSquareActivity.kt | 11 + .../square/GameCollectionSquareFragment.kt | 1 - .../gamecenter/retrofit/RetrofitManager.java | 7 +- .../retrofit/service/ApiService.java | 6 + .../drawable-xxxhdpi/pic_browse_square.webp | Bin 0 -> 13642 bytes .../pic_browse_square_finish.webp | Bin 0 -> 10694 bytes .../drawable/bg_browse_square_progress.xml | 12 + .../progressbar_browse_square_style.xml | 28 +++ .../layout_square_browse_task_float.xml | 32 +++ dependencies.gradle | 2 +- gradle.properties | 2 + 27 files changed, 427 insertions(+), 14 deletions(-) create mode 100644 app/src/main/java/com/gh/common/util/GameCollectionSquareBrowseTaskHelper.kt create mode 100644 app/src/main/res/drawable-xxxhdpi/pic_browse_square.webp create mode 100644 app/src/main/res/drawable-xxxhdpi/pic_browse_square_finish.webp create mode 100644 app/src/main/res/drawable/bg_browse_square_progress.xml create mode 100644 app/src/main/res/drawable/progressbar_browse_square_style.xml create mode 100644 app/src/main/res/layout/layout_square_browse_task_float.xml diff --git a/app/build.gradle b/app/build.gradle index 7713397910..235b10f6e0 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -82,6 +82,7 @@ android { * All third-party appid/appkey */ buildConfigField "String", "API_HOST", "\"${API_HOST}\"" + buildConfigField "String", "NEW_API_HOST", "\"${NEW_API_HOST}\"" buildConfigField "String", "WECHAT_APPID", "\"${WECHAT_APPID}\"" buildConfigField "String", "WECHAT_SECRET", "\"${WECHAT_SECRET}\"" buildConfigField "String", "TENCENT_APPID", "\"${TENCENT_APPID}\"" @@ -171,6 +172,7 @@ android { versionNameSuffix "-debug" buildConfigField "String", "DEV_API_HOST", "\"${DEV_API_HOST}\"" + buildConfigField "String", "NEW_DEV_API_HOST", "\"${NEW_DEV_API_HOST}\"" } // publish release host˛ @@ -178,12 +180,14 @@ android { dimension "env" buildConfigField "String", "DEV_API_HOST", "\"${API_HOST}\"" + buildConfigField "String", "NEW_DEV_API_HOST", "\"${NEW_API_HOST}\"" } tea { dimension "env" buildConfigField "String", "DEV_API_HOST", "\"${API_HOST}\"" + buildConfigField "String", "NEW_DEV_API_HOST", "\"${NEW_API_HOST}\"" manifestPlaceholders.put("APPLOG_SCHEME", "rangersapplog.byAx6uYt".toLowerCase()) } @@ -192,6 +196,7 @@ android { dimension "env" buildConfigField "String", "DEV_API_HOST", "\"${API_HOST}\"" + buildConfigField "String", "NEW_DEV_API_HOST", "\"${NEW_API_HOST}\"" } } @@ -336,7 +341,7 @@ dependencies { implementation "org.nanohttpd:nanohttpd:${nanohttpd}" implementation "com.aliyun.openservices:aliyun-log-android-sdk:${aliyunLog}" - implementation "com.github.princekin-f:EasyFloat:${easyFloat}" + implementation "com.lg:easyfloat:${easyFloat}" implementation "io.github.florent37:shapeofview:${shapeOfView}" diff --git a/app/src/main/java/com/gh/base/GlobalActivityLifecycleObserver.kt b/app/src/main/java/com/gh/base/GlobalActivityLifecycleObserver.kt index e8b64d845f..c6bee0a827 100644 --- a/app/src/main/java/com/gh/base/GlobalActivityLifecycleObserver.kt +++ b/app/src/main/java/com/gh/base/GlobalActivityLifecycleObserver.kt @@ -71,7 +71,7 @@ class GlobalActivityLifecycleObserver : Application.ActivityLifecycleCallbacks { override fun onActivityPaused(activity: Activity) { CurrentActivityHolder.activitySet.remove(activity) - FloatingBackViewManager.dismissBackView(activity) + FloatingBackViewManager.dismissBackView() if (HaloApp.isUserAcceptPrivacyPolicy(activity)) { DataUtils.onPause(activity) diff --git a/app/src/main/java/com/gh/common/DefaultJsApi.kt b/app/src/main/java/com/gh/common/DefaultJsApi.kt index 3d766a8d23..9df02e8661 100644 --- a/app/src/main/java/com/gh/common/DefaultJsApi.kt +++ b/app/src/main/java/com/gh/common/DefaultJsApi.kt @@ -14,10 +14,7 @@ import com.gh.common.loghub.LoghubUtils import com.gh.common.tracker.Tracker import com.gh.common.util.* import com.gh.common.view.dsbridge.CompletionHandler -import com.gh.gamecenter.BuildConfig -import com.gh.gamecenter.ImageViewerActivity -import com.gh.gamecenter.LoginActivity -import com.gh.gamecenter.WebActivity +import com.gh.gamecenter.* import com.gh.gamecenter.energy.EnergyCenterActivity import com.gh.gamecenter.energy.EnergyHouseActivity import com.gh.gamecenter.entity.Badge @@ -397,6 +394,20 @@ class DefaultJsApi(var context: Context) { runOnUiThread { DirectUtils.directToFullScreenWebPage(context, url.toString(), true) } } + @JavascriptInterface + fun startGameCollectionSquareBrowseTask(event: Any) { + val browseTimeEvent = event.toString().toObject() ?: BrowseTaskEvent() + GameCollectionSquareBrowseTaskHelper.enableBrowseTimeCount( + browseTimeEvent.timeout.toInt(), + browseTimeEvent.isFinished == "true" + ) + } + + @JavascriptInterface + fun checkUpdateGhzs(msg: Any) { + context.startActivity(AboutActivity.getIntent(context, true)); + } + @Keep internal data class ImageEvent(var imageList: ArrayList = arrayListOf(), var position: Int = 0) @@ -411,4 +422,7 @@ class DefaultJsApi(var context: Context) { @Keep internal data class LogEvent(var jsonString: String = "", var logStore: String = "") + + @Keep + internal data class BrowseTaskEvent(var timeout: String = "", var isFinished: String = "") } diff --git a/app/src/main/java/com/gh/common/DefaultUrlHandler.kt b/app/src/main/java/com/gh/common/DefaultUrlHandler.kt index a49da99b44..e6f14572d5 100644 --- a/app/src/main/java/com/gh/common/DefaultUrlHandler.kt +++ b/app/src/main/java/com/gh/common/DefaultUrlHandler.kt @@ -18,6 +18,7 @@ import com.gh.common.util.DirectUtils.directToQa import com.gh.common.util.GsonUtils.gson import com.gh.gamecenter.* import com.gh.gamecenter.entity.* +import com.gh.gamecenter.gamecollection.publish.GameCollectionEditActivity import com.gh.gamecenter.qa.BbsType import com.gh.gamecenter.qa.video.publish.VideoPublishActivity import com.gh.gamecenter.subject.SubjectActivity @@ -375,11 +376,18 @@ object DefaultUrlHandler { } } - EntranceUtils.HOST_GAME_COLLECTION_DETAIL -> { DirectUtils.directToGameCollectionDetail(context, id, entrance) } + EntranceUtils.HOST_GAME_COLLECTION_SQUARE -> { + DirectUtils.directToGameCollectionSquare(context, entrance) + } + + EntranceUtils.HOST_GAME_COLLECTION_EDIT -> { + context.startActivity(GameCollectionEditActivity.getIntent(context, entrance)) + } + else -> DialogHelper.showUpgradeDialog(context) } return true diff --git a/app/src/main/java/com/gh/common/constant/Config.java b/app/src/main/java/com/gh/common/constant/Config.java index 67c0a529e6..6ff19a4df8 100644 --- a/app/src/main/java/com/gh/common/constant/Config.java +++ b/app/src/main/java/com/gh/common/constant/Config.java @@ -38,6 +38,7 @@ public class Config { // 这个 API_HOST 在测试包里会随着选择的环境切换,正式包里会一直保持正式 host public static final String API_HOST = EnvHelper.getHost(); + public static final String NEW_API_HOST = EnvHelper.getNewHost(); /** * 需要配置的请使用{@link PreferenceManager#getDefaultSharedPreferences(Context)} diff --git a/app/src/main/java/com/gh/common/constant/Constants.java b/app/src/main/java/com/gh/common/constant/Constants.java index a4bc25e827..49d1935208 100644 --- a/app/src/main/java/com/gh/common/constant/Constants.java +++ b/app/src/main/java/com/gh/common/constant/Constants.java @@ -357,6 +357,10 @@ public class Constants { public static final String GAME_COLLECTION_SHARE_ADDRESS_DEV = "https://dev-and-static.ghzs.com/web/game_collection/index.html#/?from=ghzs"; public static final String GAME_COLLECTION_SHARE_ADDRESS = "https://and-static.ghzs.com/web/game_collection/index.html#/?from=ghzs"; + // 游戏单活动分享链接 https://git.shanqu.cc/pm/halo-app-issues/-/issues/1638 + public static final String GAME_COLLECTION_ACTIVITY_ADDRESS_DEV = "https://dev-and-static.ghzs.com/web/ghzs_activity/haoyouUnlock.html"; + public static final String GAME_COLLECTION_ACTIVITY_ADDRESS = "https://and-static.ghzs.com/web/ghzs_activity/haoyouUnlock.html"; + // 青少年模式找回密码 public static final String TEEN_MODE_RESET_PASSWORD = "https://resource.ghzs.com/page/privacy_policies/help_password.html"; 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 ec744161fc..ea9131f5ef 100644 --- a/app/src/main/java/com/gh/common/util/EntranceUtils.java +++ b/app/src/main/java/com/gh/common/util/EntranceUtils.java @@ -97,6 +97,8 @@ public class EntranceUtils { public static final String HOST_HELP_DETAIL = "help_detail"; public static final String HOST_HELP_SUGGESTION = "help_suggestion"; public static final String HOST_GAME_COLLECTION_DETAIL = "game_collection_detail"; + public static final String HOST_GAME_COLLECTION_SQUARE = "game_collection_square"; + public static final String HOST_GAME_COLLECTION_EDIT = "game_collection_edit"; public static final String KEY_DATA = "data"; public static final String KEY_MESSAGE = "message"; public static final String KEY_MESSAGE_ID = "message_id"; diff --git a/app/src/main/java/com/gh/common/util/EnvHelper.kt b/app/src/main/java/com/gh/common/util/EnvHelper.kt index d097d187a9..41c22cfa56 100644 --- a/app/src/main/java/com/gh/common/util/EnvHelper.kt +++ b/app/src/main/java/com/gh/common/util/EnvHelper.kt @@ -24,6 +24,19 @@ object EnvHelper { } } + @JvmStatic + fun getNewHost(): String { + return if (!isTestEnv()) { + BuildConfig.NEW_API_HOST + } else { + if (isDevEnv) { + BuildConfig.NEW_DEV_API_HOST + } else { + BuildConfig.NEW_API_HOST + } + } + } + // 包体是否为测试包 @JvmStatic fun isTestEnv(): Boolean { diff --git a/app/src/main/java/com/gh/common/util/FloatingBackViewManager.kt b/app/src/main/java/com/gh/common/util/FloatingBackViewManager.kt index d3cd027587..e0cd351cd7 100644 --- a/app/src/main/java/com/gh/common/util/FloatingBackViewManager.kt +++ b/app/src/main/java/com/gh/common/util/FloatingBackViewManager.kt @@ -91,8 +91,8 @@ object FloatingBackViewManager { * 隐藏返回小浮窗 */ @JvmStatic - fun dismissBackView(activity: Activity) { - EasyFloat.dismiss(activity, FLOATING_BACK_VIEW) + fun dismissBackView() { + EasyFloat.dismiss(FLOATING_BACK_VIEW) } fun getType(): String { diff --git a/app/src/main/java/com/gh/common/util/GameCollectionSquareBrowseTaskHelper.kt b/app/src/main/java/com/gh/common/util/GameCollectionSquareBrowseTaskHelper.kt new file mode 100644 index 0000000000..f5969cb16b --- /dev/null +++ b/app/src/main/java/com/gh/common/util/GameCollectionSquareBrowseTaskHelper.kt @@ -0,0 +1,226 @@ +package com.gh.common.util + +import android.annotation.SuppressLint +import android.app.Activity +import android.app.Application +import android.os.Build +import android.os.Bundle +import android.view.Gravity +import android.widget.ImageView +import android.widget.ProgressBar +import com.gh.base.CurrentActivityHolder +import com.gh.base.GHThreadFactory +import com.gh.common.runOnUiThread +import com.gh.gamecenter.NormalActivity +import com.gh.gamecenter.R +import com.gh.gamecenter.gamecollection.detail.GameCollectionDetailActivity +import com.gh.gamecenter.gamecollection.square.GameCollectionSquareActivity +import com.gh.gamecenter.retrofit.BiResponse +import com.gh.gamecenter.retrofit.RetrofitManager +import com.halo.assistant.HaloApp +import com.lzf.easyfloat.EasyFloat +import com.lzf.easyfloat.enums.ShowPattern +import com.lzf.easyfloat.enums.SidePattern +import okhttp3.ResponseBody +import java.util.concurrent.ExecutorService +import java.util.concurrent.Executors + +/** + * 浏览游戏单广场任务辅助类 + */ +@SuppressLint("StaticFieldLeak") +object GameCollectionSquareBrowseTaskHelper { + + const val KEY_IS_FORM_BROWSE_TASK = "is_from_browse_task" + private const val FLOATING_SQUARE_BROWSE_TASK_VIEW = "floating_square_browse_task_view" + + private var mBrowseTimeCount = 0 + private var mIsBrowseTimeCountEnabled = false // 游戏单广场浏览时间统计是否开启 + private var mBrowseTimeTimeout = 15 + private var mIsBrowseTimeCountValid = false // 游戏单广场浏览时间统计是否有效 + private var mBrowsePro: ProgressBar? = null + private var mIsFinished = false + private var mNeedShowFloatView = false + private var mIsFirstEnterSquare = true + + private val mThreadService: ExecutorService by lazy { + Executors.newSingleThreadExecutor(GHThreadFactory("BROWSE_SQUARE_THREAD")) + } + + private val mActivityLifecycleCallbacks by lazy { + object : Application.ActivityLifecycleCallbacks { + override fun onActivityCreated(activity: Activity, savedInstanceState: Bundle?) {} + override fun onActivityStopped(activity: Activity) {} + override fun onActivitySaveInstanceState(activity: Activity, outState: Bundle) {} + override fun onActivityStarted(activity: Activity) {} + + override fun onActivityResumed(activity: Activity) { + if (isTopActivityGameCollectionRelated(activity) && mIsBrowseTimeCountEnabled) { + resumeTimeCount() + } else if (isGameCollectionSquare(activity) && mNeedShowFloatView) { + showOrUpdateFloatView(activity, mBrowseTimeTimeout) + } + } + + override fun onActivityPaused(activity: Activity) { + if (isTopActivityGameCollectionRelated(activity) && mIsBrowseTimeCountEnabled) { + pauseTimeCount() + } + if (isGameCollectionSquare(activity)) { + dismissFloatView() + } + } + + override fun onActivityDestroyed(activity: Activity) { + if (isGameCollectionSquare(activity) && mIsBrowseTimeCountEnabled) { + disableBrowseTimeCount() + unregisterActivityLifecycleCallbacks() + } + } + } + } + + fun enableBrowseTimeCount(timeout: Int, isFinished: Boolean) { + mIsBrowseTimeCountEnabled = true + mBrowseTimeTimeout = timeout + mIsFinished = isFinished + mNeedShowFloatView = true + mIsFirstEnterSquare = true + + resumeTimeCount() + + HaloApp.getInstance().registerActivityLifecycleCallbacks(mActivityLifecycleCallbacks) + } + + fun disableBrowseTimeCount() { + mBrowseTimeCount = 0 + mIsBrowseTimeCountEnabled = false + mBrowsePro = null + mIsFinished = false + mIsFirstEnterSquare = true + } + + fun unregisterActivityLifecycleCallbacks() { + mNeedShowFloatView = false + HaloApp.getInstance().unregisterActivityLifecycleCallbacks(mActivityLifecycleCallbacks) + } + + fun resumeTimeCount() { + if (!mIsBrowseTimeCountEnabled) return + + mIsBrowseTimeCountValid = true + + mThreadService.execute { + while (mIsBrowseTimeCountEnabled && mIsBrowseTimeCountValid) { + val topActivity = CurrentActivityHolder.getCurrentActivity() ?: continue + if (isGameCollectionSquare(topActivity, false) && mIsFirstEnterSquare) { + mIsFirstEnterSquare = false + topActivity.intent.putExtra(KEY_IS_FORM_BROWSE_TASK, true) + } + if (isTopActivityGameCollectionRelated(topActivity)) { + tryWithDefaultCatch { + showOrUpdateFloatView(topActivity, if (mIsFinished) mBrowseTimeTimeout else mBrowseTimeCount) + if (mIsFinished) { + disableBrowseTimeCount() + } else { + mBrowseTimeCount++ + if (mBrowseTimeCount >= mBrowseTimeTimeout) { + showOrUpdateFloatView(topActivity, mBrowseTimeTimeout) + postBrowseFinish() + } + } + } + } + Thread.sleep(1000) + } + } + } + + fun pauseTimeCount() { + if (!mIsBrowseTimeCountEnabled) return + + mIsBrowseTimeCountValid = false + } + + // 从任务跳转的游戏单广场/此游戏单广场进入的游戏单详情都计时 + private fun isTopActivityGameCollectionRelated(activity: Activity): Boolean { + return isGameCollectionSquare(activity) + || (activity is GameCollectionDetailActivity + && activity.intent.getBundleExtra(NormalActivity.NORMAL_FRAGMENT_BUNDLE)?.getBoolean(KEY_IS_FORM_BROWSE_TASK) == true) + } + + private fun isGameCollectionSquare(activity: Activity, checkIsFromTask: Boolean = true): Boolean { + return activity is GameCollectionSquareActivity + && (!checkIsFromTask || activity.intent.getBooleanExtra(KEY_IS_FORM_BROWSE_TASK, false)) + } + + private fun showOrUpdateFloatView(activity: Activity, time: Int) { + // 不支持 Android 4.1 的设备 + if (Build.VERSION.SDK_INT == Build.VERSION_CODES.JELLY_BEAN) return + + // 游戏单广场才显示FloatView + if (!isGameCollectionSquare(activity)) return + + runOnUiThread { + val isFinished = time == mBrowseTimeTimeout + val floatView = EasyFloat.getFloatView(FLOATING_SQUARE_BROWSE_TASK_VIEW) + if (floatView != null) { + if (mBrowsePro == null) { + mBrowsePro = floatView.findViewById(R.id.browsePro) + } + mBrowsePro?.progress = time + if (isFinished) { + floatView.findViewById(R.id.browsePic) + .setImageResource(R.drawable.pic_browse_square_finish) + } + } else { + EasyFloat.with(activity) + .setLayout(R.layout.layout_square_browse_task_float) + .setTag(FLOATING_SQUARE_BROWSE_TASK_VIEW) + .setAnimator(null) + .setGravity(Gravity.END.or(Gravity.CENTER_VERTICAL), 0, 0) + .setSidePattern(SidePattern.RIGHT) + .setShowPattern(ShowPattern.CURRENT_ACTIVITY) + .setDragEnable(false) + .registerCallback { + createResult { _, _, view -> + if (isFinished) { + view?.findViewById(R.id.browsePro)?.run { + max = mBrowseTimeTimeout + progress = mBrowseTimeTimeout + } + view?.findViewById(R.id.browsePic) + ?.setImageResource(R.drawable.pic_browse_square_finish) + } else { + view?.findViewById(R.id.browsePro)?.run { + mBrowsePro = this + max = mBrowseTimeTimeout + progress = 0 + } + view?.findViewById(R.id.browsePic) + ?.setImageResource(R.drawable.pic_browse_square) + } + } + } + .show() + } + } + } + + fun dismissFloatView() { + EasyFloat.dismiss(FLOATING_SQUARE_BROWSE_TASK_VIEW) + } + + @SuppressLint("CheckResult") + private fun postBrowseFinish() { + RetrofitManager.getInstance(HaloApp.getInstance()) + .newApi + .postGameCollectionTask("browse_game_list_square") + .compose(singleToMain()) + .subscribe(object : BiResponse() { + override fun onSuccess(data: ResponseBody) { + disableBrowseTimeCount() + } + }) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/gh/common/util/LogUtils.java b/app/src/main/java/com/gh/common/util/LogUtils.java index 259493edfd..ee88336aa4 100644 --- a/app/src/main/java/com/gh/common/util/LogUtils.java +++ b/app/src/main/java/com/gh/common/util/LogUtils.java @@ -584,6 +584,27 @@ public class LogUtils { .postShareResult(body) .subscribeOn(Schedulers.io()) .subscribe(new EmptyResponse<>()); + + // 判断是否上报游戏单活动的"转发活动"任务 + postGameCollectionRepostActivityTaskCheck(url, shareResult); + } + + @SuppressLint("CheckResult") + public static void postGameCollectionRepostActivityTaskCheck(String url, String shareResult) { + if (!TextUtils.isEmpty(url) && "success".equals(shareResult)) { + String gameCollectionActivityUrl; + if (EnvHelper.isDevEnv()) { + gameCollectionActivityUrl = Constants.GAME_COLLECTION_ACTIVITY_ADDRESS_DEV; + } else { + gameCollectionActivityUrl = Constants.GAME_COLLECTION_ACTIVITY_ADDRESS; + } + if (url.contains(gameCollectionActivityUrl)) { + RetrofitManager.getInstance(HaloApp.getInstance().getApplication()).getNewApi() + .postGameCollectionTask("repost_activity") + .subscribeOn(Schedulers.io()) + .subscribe(new EmptyResponse<>()); + } + } } public static JSONObject getMetaObject() { diff --git a/app/src/main/java/com/gh/gamecenter/SkipActivity.java b/app/src/main/java/com/gh/gamecenter/SkipActivity.java index bb112c004e..fae1c87f5e 100644 --- a/app/src/main/java/com/gh/gamecenter/SkipActivity.java +++ b/app/src/main/java/com/gh/gamecenter/SkipActivity.java @@ -37,6 +37,7 @@ import static com.gh.common.util.EntranceUtils.HOST_COMMUNITY_QUESTION_LABEL_DET 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_GAME_COLLECTION_DETAIL; +import static com.gh.common.util.EntranceUtils.HOST_GAME_COLLECTION_SQUARE; 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_GROUP; @@ -394,6 +395,9 @@ public class SkipActivity extends BaseActivity { case HOST_GAME_COLLECTION_DETAIL: DirectUtils.directToGameCollectionDetail(this, path, ENTRANCE_BROWSER); break; + case HOST_GAME_COLLECTION_SQUARE: + DirectUtils.directToGameCollectionSquare(this, ENTRANCE_BROWSER, "", "", ""); + break; default: EntranceUtils.jumpActivity(this, new Bundle()); // 跳转至首页 return; diff --git a/app/src/main/java/com/gh/gamecenter/forum/home/CommunityHomeFragment.kt b/app/src/main/java/com/gh/gamecenter/forum/home/CommunityHomeFragment.kt index 840cc3b4ce..18739f6753 100644 --- a/app/src/main/java/com/gh/gamecenter/forum/home/CommunityHomeFragment.kt +++ b/app/src/main/java/com/gh/gamecenter/forum/home/CommunityHomeFragment.kt @@ -122,7 +122,7 @@ class CommunityHomeFragment : LazyFragment() { 2 -> { NewLogUtils.logCommunityHomeEvent("click_activity_tab") FloatingBackViewManager.disableBackView() - FloatingBackViewManager.dismissBackView(requireActivity()) + FloatingBackViewManager.dismissBackView() } } }, 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 f3a5231989..ed1cb52eb4 100644 --- a/app/src/main/java/com/gh/gamecenter/fragment/MainWrapperFragment.java +++ b/app/src/main/java/com/gh/gamecenter/fragment/MainWrapperFragment.java @@ -494,7 +494,7 @@ public class MainWrapperFragment extends BaseFragment_ViewPager_Checkable implem if (index != INDEX_BBS) { FloatingBackViewManager.disableBackView(); - FloatingBackViewManager.dismissBackView(requireActivity()); + FloatingBackViewManager.dismissBackView(); } SubjectRecommendEntity navBarEntity = mViewModel.getNavBar().getValue(); diff --git a/app/src/main/java/com/gh/gamecenter/gamecollection/detail/GameCollectionDetailActivity.kt b/app/src/main/java/com/gh/gamecenter/gamecollection/detail/GameCollectionDetailActivity.kt index 8298502af8..f6ff9e6876 100644 --- a/app/src/main/java/com/gh/gamecenter/gamecollection/detail/GameCollectionDetailActivity.kt +++ b/app/src/main/java/com/gh/gamecenter/gamecollection/detail/GameCollectionDetailActivity.kt @@ -5,8 +5,10 @@ import android.content.Intent import android.os.Bundle import com.gh.common.util.DisplayUtils import com.gh.common.util.EntranceUtils +import com.gh.common.util.GameCollectionSquareBrowseTaskHelper import com.gh.gamecenter.NormalActivity import com.gh.gamecenter.R +import com.gh.gamecenter.gamecollection.square.GameCollectionSquareActivity class GameCollectionDetailActivity : NormalActivity() { @@ -32,6 +34,10 @@ class GameCollectionDetailActivity : NormalActivity() { bundle.putString(EntranceUtils.KEY_GAME_COLLECTION_ID, gameCollectionId) bundle.putBoolean(EntranceUtils.KEY_IS_FROM_SQUARE, isFromSquare) bundle.putBoolean(EntranceUtils.KEY_SCROLL_TO_COMMENT_AREA, isScrollToCommentArea) + if (context is GameCollectionSquareActivity) { + val isFromBrowseTask = context.intent.getBooleanExtra(GameCollectionSquareBrowseTaskHelper.KEY_IS_FORM_BROWSE_TASK, false) + bundle.putBoolean(GameCollectionSquareBrowseTaskHelper.KEY_IS_FORM_BROWSE_TASK, isFromBrowseTask) + } return getTargetIntent(context, GameCollectionDetailActivity::class.java, GameCollectionDetailFragment::class.java, bundle) } } diff --git a/app/src/main/java/com/gh/gamecenter/gamecollection/detail/GameCollectionDetailViewModel.kt b/app/src/main/java/com/gh/gamecenter/gamecollection/detail/GameCollectionDetailViewModel.kt index 868d461f7c..da56ff808f 100644 --- a/app/src/main/java/com/gh/gamecenter/gamecollection/detail/GameCollectionDetailViewModel.kt +++ b/app/src/main/java/com/gh/gamecenter/gamecollection/detail/GameCollectionDetailViewModel.kt @@ -22,6 +22,7 @@ import com.gh.gamecenter.manager.UserManager import com.gh.gamecenter.qa.article.detail.CommentItemData import com.gh.gamecenter.qa.comment.base.BaseCommentViewModel import com.gh.gamecenter.retrofit.BiResponse +import com.gh.gamecenter.retrofit.EmptyResponse import com.gh.gamecenter.retrofit.Response import com.gh.gamecenter.retrofit.RetrofitManager import com.halo.assistant.HaloApp @@ -68,6 +69,8 @@ open class GameCollectionDetailViewModel(application: Application, filterPos = (data.games?.size ?: 1) + 1 loadResultLiveData.postValue(LoadResult.SUCCESS) mergeData(mListLiveData.value) + + postGameCollectionTask("browse_game_list") } override fun onFailure(exception: Exception) { @@ -258,6 +261,8 @@ open class GameCollectionDetailViewModel(application: Application, @SuppressLint("CheckResult") fun postShareGameCollection() { + postGameCollectionTask("forward_share_game_list") + if (gameCollectionDetail == null) return mApi.shareGameCollection(gameCollectionId) .compose(singleToMain()) @@ -361,6 +366,15 @@ open class GameCollectionDetailViewModel(application: Application, }) } + @SuppressLint("CheckResult") + private fun postGameCollectionTask(event: String) { + RetrofitManager.getInstance(HaloApp.getInstance()) + .newApi + .postGameCollectionTask(event) + .compose(singleToMain()) + .subscribe(EmptyResponse()) + } + fun getStarText(): String { val favoriteCount = gameCollectionDetail?.count?.favorite ?: 0 return when { diff --git a/app/src/main/java/com/gh/gamecenter/gamecollection/square/GameCollectionSquareActivity.kt b/app/src/main/java/com/gh/gamecenter/gamecollection/square/GameCollectionSquareActivity.kt index d61d327fba..3b25e841ed 100644 --- a/app/src/main/java/com/gh/gamecenter/gamecollection/square/GameCollectionSquareActivity.kt +++ b/app/src/main/java/com/gh/gamecenter/gamecollection/square/GameCollectionSquareActivity.kt @@ -3,6 +3,7 @@ package com.gh.gamecenter.gamecollection.square import android.os.Bundle import com.gh.base.BaseActivity import com.gh.common.util.DisplayUtils +import com.gh.common.util.GameCollectionSquareBrowseTaskHelper import com.gh.gamecenter.R class GameCollectionSquareActivity : BaseActivity() { @@ -20,4 +21,14 @@ class GameCollectionSquareActivity : BaseActivity() { ?: GameCollectionSquareFragment().with(intent.extras) supportFragmentManager.beginTransaction().replace(R.id.placeholder, containerFragment, GameCollectionSquareFragment::class.java.simpleName).commitAllowingStateLoss() } + + override fun finish() { + GameCollectionSquareBrowseTaskHelper.run { + if (intent.getBooleanExtra(KEY_IS_FORM_BROWSE_TASK, false)){ + disableBrowseTimeCount() + unregisterActivityLifecycleCallbacks() + } + } + super.finish() + } } \ No newline at end of file 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 7a652d6874..070729fadc 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 @@ -7,7 +7,6 @@ import android.os.Bundle import android.view.View import android.view.ViewGroup import android.view.animation.AnimationUtils -import android.view.animation.TranslateAnimation import android.widget.ImageView import android.widget.RelativeLayout import android.widget.TextView diff --git a/app/src/main/java/com/gh/gamecenter/retrofit/RetrofitManager.java b/app/src/main/java/com/gh/gamecenter/retrofit/RetrofitManager.java index c44c958ae6..33951afdde 100644 --- a/app/src/main/java/com/gh/gamecenter/retrofit/RetrofitManager.java +++ b/app/src/main/java/com/gh/gamecenter/retrofit/RetrofitManager.java @@ -6,7 +6,6 @@ import com.chuckerteam.chucker.api.ChuckerCollector; import com.chuckerteam.chucker.api.ChuckerInterceptor; import com.chuckerteam.chucker.api.RetentionManager; import com.gh.common.constant.Config; -import com.gh.common.util.EnvHelper; import com.gh.gamecenter.Injection; import com.gh.gamecenter.retrofit.service.ApiService; @@ -32,6 +31,7 @@ public class RetrofitManager { private static final byte[] LOCK = new byte[0]; private final ApiService mApiService; private final ApiService mUploadApiService; + private final ApiService mNewApiService; public static T provideService(OkHttpClient client, String url, Class serviceCls) { return new Retrofit.Builder() @@ -45,6 +45,7 @@ public class RetrofitManager { OkHttpClient okHttpNormalConfig = getOkHttpConfig(context, 0, 2); mApiService = provideService(okHttpNormalConfig, Config.API_HOST, ApiService.class); mUploadApiService = provideService(getOkHttpConfig(context, UPLOAD_CALL_TIME_OUT, 1), Config.API_HOST, ApiService.class); + mNewApiService = provideService(okHttpNormalConfig, Config.NEW_API_HOST, ApiService.class); } private OkHttpClient getOkHttpConfig(Context context, int callTimeout, int maxRetryCount) { @@ -81,4 +82,8 @@ public class RetrofitManager { public ApiService getUploadApi() { return mUploadApiService; } + + public ApiService getNewApi() { + return mNewApiService; + } } 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 2f0a2e7d1c..b3b0b4e1d1 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 @@ -3426,4 +3426,10 @@ public interface ApiService { */ @DELETE("api_go/game_list/{game_list_id}/comment/{comment_id}") Observable deleteGameCollectionComment(@Path("game_list_id") String gameCollectionId, @Path("comment_id") String commentId); + + /** + * 游戏单活动上报任务 + */ + @POST("lottery/incr-progress/{task_event}") + Single postGameCollectionTask(@Path("task_event") String event); } \ No newline at end of file diff --git a/app/src/main/res/drawable-xxxhdpi/pic_browse_square.webp b/app/src/main/res/drawable-xxxhdpi/pic_browse_square.webp new file mode 100644 index 0000000000000000000000000000000000000000..155101db54bc77c16d2e0d0fee92bae328836662 GIT binary patch literal 13642 zcmV-QHMPo8Nk&FOH2?rtMM6+kP&il$0000G0000V0RaC106|PpNZ$BuSDK zGq>3Xu22*30J4@l-dn}Y-kLK=D4tQn85Xt?3DBCXoCmj)F`W1)C@e zIzbeCVhGp<&Hbga_^$B7wLKPcnk9K52W%@j!^PnSY?D~wm@q@O3KbuO7_yzoN>6RX zF_-UXX{MxIh!?`Or1Y=nr?U0V<2BCoo(tW7O=b7wmnh;;pF0T+zXj z4-ke&Hs)kUn{7oV39X=SkA>+J=jsH0G+_2m<%M^UPVlGycfIJ$+C^!WE?Tp4_SlXW z_ib;b?6E_BV*c^~3uTeH{D&*;lSS5@(>&ZZ*<_EVGt)BJWCfWA32g-sbF!^JM=#ABRMp4n=GOPaw5# zt65FaX2(hOYz2DzJ~>no-zCzV{K8hYgol%#g_%4}5q8(1AF(z3rMWN7-%H1($a27d zrE%y9`|GF(AFQ19xj2bdGxrOE2D~5&V}Y zYZ#nsx`zDt`gsQE^E-yfMb!+^>We~qoOB<<^uAW%{NQXE19f$72o$`|P<^|={2xT$ zV6eXFnEsCC4Al(>Y!-^M&D|Nnze956f@|u|2>u;XTr$KB-5H_3 zL+Zz(u^*8u8(eZc+2A>+v2Z+Xq;wcvBpr%gkq)nvNr&<}=}^n!G3!5B|H=AK)_=18 zlO3Hcb<*LNGU@R3E7IYWBI!^xN;-@_O*)+Bc(TFkM6PUbiTcTgenhctl3`nnh!T<^ zL4VL$GIahE$$YU(Y4nf_J=3AtQeie_uuGLpsM;kHx>zP$Oe!Cg2oI8ymMi7K>XvFK z?_Fu|ZXWp=drKI_$ls1DB*B_o3Sz7K<-h~2D4-Wr%Yd4TD7ZVmAOT+7k+kgUq9@sn zwC$2e;U<;nLPp$e&^pLJEb!J1+KtTV^c_|F>X*N6#mLrQzkIcLR9}aJNmfueAUrSt z0MMuaodGH!0RRC$F&2nJA|W9a8SWe)0|c`-YtBb9*BoRACk}V`Kgiz-?JL{=uzt_} zW&Etw-?#r-{b&8V+s9@dQRRi@|E+(~{{8Jk`q%ug?%w0SN&n3M4g2Tx1^RveU;FR5 zPxl|Up5;HL|F!(0_yPSJ{1^Uj@;|@-F8}L4WPQ*7T>oABDewpVOa1TvZ(V<3FZ18^ z|Nr}me>wk4|Nq&?{$K82{ST8*>R<7{aDVRnjsDDk`~QLepWp-j*Qf{Y|Ns8Xe!l-- z{5t({^4I%^?_b=1YX7-@!TtgMJN*CTC*wD{e=vW= z^#c5d_{aAT?Z2@l#e&TMS^FRUTigfvuk|nT|D1lh zo*_PY>MGsLsx@@Wp-I6Ie(Y1_q z7^Zsy-{xe09t~t`nXq&oZPT{3r_4jOUl__i2e{v5e#<+WJnlnd%qx>SYcXB#n!_=% z7k;x9^QOs*QUL*N2dwz^Opd)W5wWvEV`tGXnY9(9E8e* z>cyz-mWOs=9{*!QZf{Z^HXt)`{kS)kT%mk4-DEuwtMHC&uL_{B5YvY`Ui6tuWs7|n zQ5t}=^*#)TWK+WVa?BmY3**vmCJtO1%Xl)Az53gPe?b^NfQN^as?PS^z!-Y%lRGN| z;7lp?zwq`T5w}I%E1Ov^fb*d=RT|DXeH6{zQDg8@Sq_0$)y@XYy?60`(YVjT?}){5 zSTJWTgh3PxciBIR8ekzm_s_H;Z*W5TmZ{5)H1#2ZxZH^vkH8dO_PQU`tb4&!P)t&R zIt7JkpGP;eVmrOJ60`hDvClb)n7XxAEWw>SQ}C`mdH=}tjR7~SN}bVs9QnQj3;^IK zvJ}a*n$l(L@>jC!k^&Q5zI%K4yE1o0(vPPG(UcTP8k)kbg_(X0hTdg3+Jn3{ z_HLt@dW{Urq2V6I?|ZweD?M{w1&N%!)6iu;OXEy<0!aIH`<_?JwJFwOnrjjj)B^rI zCM8Zy9X6QDr$BO*{Y<7g8{0Vd=UZA>UA@=$$OtM_sSoxlsbu{X+GR63MSinqD;s?v zk5Y8w1v$u+$qR730dy#^W^-EpAL~GK;V*mN_0_D&<*-%RA%;1O@n0ZX0_?*x>=m7)!Mo2%V!qA4pO_V0iFqgU2xmtsJNbj^@N-}w^x%5}nYAa>B!lx1 zehnWE%0bBCaFb*RRp=P0xKU6=$7EPtYh=QvaJX?;t0{$$7mjfkz0gUY*Z;MAW(}|+ zzE;HqOmZMD^IjBN-K11xW`YPHplv4*m;d%H&qMOX%fBtWS?tbh#?&@zi6CNjdZNLTq`%bTi`n zm?gl=NP8l9E{L-or~m*WEwzk2hX2`(AYoffZRKkCJHPg^n6`}MR#$D5CF(?-XATTh z{O6Wdd7lIMZmNkxc2RxG=QR28t>5M^JBZq$?IGA&5HZ?~I%O;BSYSngf+q9$$2`&( z+UXrU?R}U5z3U`7UBU*5zRncupbrcoo7Fp5p0);VggjWhy$ zCuWmTJT8l_zMXmnP0vzb~?y9+aC0>FtIpyBcYmMQy39oV+fK%vYu)* zhr+#X+0xpuJ%)`qwdh_@k=J-}7*3s^LXmb+oXtw%(+H8Z=k*(GV2HrmOvQmFcfjDT zlv^(s3m1D=&Q5$FIX29iTR%t|3FQUcjP=H2VW5m;1+HTa#-Pt*UaueLYnOVAGf zJ8JpUzzl-RTr?M#Cwu~ESkeRSe#sq(r#a8=Kch_GmB5Z}M?*4I&_2?AC#TvZ6nf8`-H_q{p(RM|KaT(;ha3q6`MtMn@@lrGoza#skDg#sxx8_Mf;cl30-XW`&g96JV0tu%wr#+FBcN?5InS zEQzNWnp@vG>T3J%pj#75dUN)}yo)>L{Qlk~@y)mBWhfV9bFWImIz|RAvYLB8pAnw~ zTF|-f;dfR7cuS#;2fbo-ALSBfy}RnmmM$bw%>y&U?klcJ%Fo=%WTYIs)Pj3$5y2eN z=4}DSD{hVDHEME$0*6Y9vKO!0Hj1`830h(fV4_g)8JH|e`biTq49bvO(*3<$H8;c# zNBSYW%bQ`TB1xwtM1wVGex~MTg@SBX-l{84j>q%y0W8pc+47Rq(`dj;_vX#jG^|Ng zrD25n4&#QYLsbGQ8e6UWLdui?&;TAuFdAmfn9xb-%1xAH(I2EO=j}Kt?eOLkIBt~3 zY)gsu+$Of{rr$^Zd>s8a1%F!+%mNGN?M(x!{&5cdtwoPT|*#C4#g zo)1LJ*VU#;R;!XrCDi9x7xO2c^$-Gp!?mVzSsHi@yn0m#b_T%ItVDE(BS=Uug?L~d zu!H~WF_0A&a>#d;ZSDQk(L8a1fvrk(NdAeW7qf_%YX>`tafWO9TTsMvJvC?4iNM8- zr-ZTtn<2qL=?vlkAFreeS#PR@v_q{1*yc!VS)suGA2)J{y;H2i-9`oAi&FD!=#qvF(tjty<42yo zVka6*X8u)D!Z#8~dF=rZSvI+c&)Uh7z|zlyY-CXzTPq`P{|^3>=d%-f(@&edjzMU5 z=3l3Uk9PDN<^Zt&2S!TT;(igW6ojG+G3T@^mF?m)6NG5YV*Z7J~&t<_7jUy<7lA zYO%{juEv+1Pg7gZ<>Fb}_68h4Mj9?rwyA}r^No5o8g!*NCj4D;G>JmePo8i;V)1Gy~;_jY~zOXe#_4e4;SmjPgoKSYWeqV9ruh7X%oea}OGhr_-h{ z{)P@1@TB@qfQ+eN48`L(Oa`s*!x1E2fQ}AGE{k4l_{Ggd4*{M6sr`#10rz{EcDCogT|WVucNK(u{l(V)+}UO z%iVdh=Tf$88yZHj0v8w6Vhn;*ds&%3U*tw9|FcmmS8AeV$Z~Kp+0Zo#f+szdVb47W zYL}WDE&u=lX`a11ms10k^F@ND8EK5iS{xjaMC^Vqc>1>6$yH+QO~)BaZ<+=X2Lk(c z-uKDz6zgVa6E&JDKS8PH-_;b@U;d+MP zxdBNlM-C9EiiCB!Se4e(+>}kr;tW>H*w5w{6I8J6YfPt~6DDHt>rIpVzAF0ihr>%+ z3k1)>&R!)kB`~C~X#0;bc8YSv6tgx1_l*}zl${1P%|_N`aMvsP6zAy#2}Y~05Bw=L z>_0jEL#+mzA$a+Rf{ERs7v8n+AUGvx*_WMNl*%!FX}$}17>AWQ14ERs!gk)D^sot$ zha^UU8*v9kC4raF-b1+OW8j_1TlNLAS#)?OEQzz9edd8(KXs8 zVX}{)n{U|H_KwGWcZ)S;&I9m8WSkndz4j?u?gNl<1>e1~+B7#~Ow zlWd?B3SbDkB-Zw!c1xw(u{)i$*s`&K037;%8iy9FtK6)1_tzz)1Lso)1jCG0Y?7NL zSWMRliPSQoSs?u?s$wp9M`6HI;GpV-ha~fVrbv{_B|=FEp-kxshxd&%+k6nVjUCo> zOR-Q)YUxOA41>JVKChV6=^bDi!Kf!Ak71s7^GJ&3j)qJ720^{d*5lav&T?T)2rNQI zY*5~Y3UKuZ2UAL?^s+;L6yul@Wn=%SrJJtAS+@WRjqr91mo4m6fdR99Jjsvo{d_N! z8%jjOSz)fJ&}uMi7Dr_#EkbGp51T5v$CCsHl4Gk$Td`MXPNMMI5`jlwhIWw>f$bW- zECp}*&`Smz+HF$8?F?g$34ywOprq{ev&UJVp$PT{=UH6QnpK!S8$CT0tVv(lGlBgcL_9r1&o8ew^xR zl3mkwKiRTkQp~#l637jXG6?O_Aa}pW_XJi2Bj~cmZZ#J2U5Er;F)u*E`$;zm-^CUZ znwA-UWqf}E$pc^{5tPO~(4;C(a+)<}D+j{6D59&ZU0Xr^r4Z-wK+V7uo^-p%9+33$ zdph`!Hi!-DCFx0D!113e0fC@s25gOdIk)2x0E?|F)U!Hx?U(&;{XgnMN053T{Z`h& z!cZ#+Z#GePQ^)HqZU8DPAXv=t5AGHbN|D18xa9`Tn>GUFS&D{fbb#69g5n?yY2rZ6 zGs3o=zTawi!hmVPhL_1bJ8LCwg9|u~hV1QQvx=Y$6+MDxHUbuT3D*`uF{6fDG8M9| zfRSW%JX_R+R%^7zEIC-!Nw6;`mjg}WfA$pbj??tEh)b*ouCKQG15Vq`5dJPF!=V3*l%QiagD2d1Yj#Za` z^o>Vic5p7Nj#MNlw6>OZ4)elC5zJ(eI}4J2iuBYqSq-^dj6NZ*S*yA{A!FUmS@-9A zTL*}8V3PZG+#IUW89#sgCV?rW0Nnq2nmuKF2R>4Nx;z!scKmCbnI- zf?TLQ@1zhltHLCYFa_vMMcwbYI^z5lT-*(p%UJCzR(Red^{{7G`)kX7=*IgOi$6)Y zZjLLv_Zd(Ef1E90;%*XZ$*QB}u7~Yy^94Nr-9{P-Hi%nlh8uo&6@rMX?M$kKfoA0I z=brK3x1Ob@Y26nv*qVivM?X8xZx7eOtl`FZV6;?s!Oh5A5jOUFiY63s@Kt5|MEgmq5}4{T7$uh8UhLMU zu}=Z0akZ%^Pm&rJ092%S=5CCZl!mY_0e!`$E`wV*q3B(4sVlB=ZY`eX>9haJcm`MJ zKy;V|5XfdoIQ7Tt65w^~{Zr!~eXwnoXeArS&k%I_f|H1m`5w-?*KwK#^O{*aKF5ot z!U1tC|KCIc2*5cir76 zRXI|W7&5|yWZ794px_&{*>r_4;aEqnYTb{%-Z%(?WB<@%-c}CPi}*8*#LQ8GGNa9J z%Qi!-H|AftFc0M<_;@Q1SmZt$mXuTWFPd^*5SueD-5#qbKQke6j|aWThA z8HNf-d#C{Lyv^zdPn~i~Ms)4_K#uv35@_I3y|# zAR1XiB;Dx+cAD9tyfXJM+T>E*tF&;nhMgn6CZPTi?ZuI`u`?fE2?~d_w6&vaUA~DP zf_+mjQ5>tm(@qX;q;|5N!)RPlw^e!v@(_5 zU1HvE6#D&u<1OON&)T z^ohaDU*Mf32yHzmcFrWf{OrG3$Cm)p3`%BYz^qK9%;?0_m*PBoE}Nc`v70P8t&G#k zfbkTEWr+lPQ8>aq()#_qVW6Dm;_6ekxKQP0&pmYPbK9456-1f?SYQ$z4m};yGY&3R zNY59#?oACG{BQ$`mBsS`;~pth`H^oxqOuKT()`8FEQY58Qq`UnB7b#n9jf1h+*Jsij#x3$%uV24ywMkRJZ9X{%B`Y5DxO3Uc?i zu<^f_C&OSYVdk?9%VLH?DGO(D$ZChg5a_LU6%mc`c@uuoJL+=8lixKZ9IQXjVD-O z>LE<{*6#K{Eh>PXzj4vFs=YGm?G@k8$f-D9NJ!>`N%11)5%V4HK&Re}QE9}u;P28d zGmImQ`W$>8%e$jPeBSbC9ob-%FF`PSTjaTpoJM^ZEP7ShMwu9+`cF1=0?KR zMG>OLz!FDQ&>4o_0Wk~MkI7>#lgrgJwqKi3^{Q#Ge8(H3C()GyB%cUBvl+5_@ei@& zSyDycjZ0#n_0uuFf5;q2=ij^+Ep|K8|CEN~1Dxg68UQ4{FIm5Xwxf!^aW9Sahy6}s z>OBqEo|Cl?@~)(b1y~oU^AjherTaxC()`Qc7SO}%jUS0JY4DuddecLaD`uxeCwZ*a zI4{I-;-2HyI36_XYoz&QYDAp}!QSB7`cfxX)NTU5uF1w1b_r^dZ)ZK0*pO_XDAW5$Jw*v7r_f#ZD>i+SK~* z=m+D%0!J;i>)q2-nP&D;b_*vW)oODWw{Z_IZiayd&ZIUOCt0pG>ArLTzbaqXLfRru z&)E49JE_jXyQ?p)P~4H^S!X1u#bHNV_VDGBTtS9XWw+w#OYi)y;noN_4p8Py#^*#D zt_SYY#c@zBZDclyvwK)G^YL3azaQMG@VI_d=lx4#2^EgU!{NAx*D2*PAf`55E-Puu z)nQbaT>t2QXv87et>f&ZaSya&vlSB4ak&f~#)rO3L!_6uc$-Jm78tZ@RPdx_#`DG% zgEjM}>S>O=XE)MXgbks3W?0E5W-z4nL@W(4m`Vm;7+I0VZ!B%1V*u6Xf}as1=cfo7 zPx+lhYKL?6ZhlSw3@P%cmz(3!_L05%3*%!PJ$;xVc}R(QAzKX!XPeU&eK7hCKO(`A z7rW}hbG?o8BT*i_=w)y??$lJ+2-uIfE>S#995@eOSB_9t>+_;Jz#55X4VV6! zU!(yJuBi8FU}J96n!-i}?fUL>rEw|Gtqnfh&4rR%(=QZR_Jp!6XZv8v&lO$f$jI9w zGSE4HB^-B99rmwyS(>-5Am{h+r1yKe(l3kkNmi`a7ZSkEnWJRBvr|Kohf9fi`VDfu z<+1-TNE?M?c~|Au7ETxY6Sm?-Ecy_>{9<(*51;A7b9DA7u6Hwpn3GUS&YcKhQ)e8s06=2p7eJp+N6GX1Lqx&dI^`JB{3GJ$i z8x4>vogTFevKY%71KGkB_OZs|{)(7RcF|!xuX&6&ZwrONIfqgIafg0oE{HgTCai*_ zM2R_Wh@4q(T!^c^O_~(M79QV=MvRPAzP_Ty=nJWyr-l8XjEb#>NL+6NxoSEc?t_Ed zLhdHjqM{Gl1SSbx_ol5i)b{k)(M?)sYPV|xg5`gGi^}24>Hb}==XKw`U=v>9zm=*> zrg~{`=YM?v*X;{VWcr>jWZRbG@>c3q?BxU3|5;X2$gGF%%xyUjr>k3&d$kd7yNWLw z)k!CkVuG=|6x$z00`ADG#x4l4FBu=e$~1bTj@~B^7w|m`ox)q#_%6*dS=JlDZwMY5 z&&n)Vz<7qNZr23c%B87Gcwy~dO?g6NS!ashd9pGrAA{4<4lvz;M}7&iXu7_3V=Y8) zkr`{(toO4e?}QaDXT5ej+9pjvne{iEPvO%4Vja_&uO_m)S5siIpICYgfm2Sh{+!@6 zyQ93YWVM2@kzEWX*mW{Oi^%O{vttst`w{C|f0(p7F=S1?0|aK$X&7NYhMi!=e3!Cm z?B~5G|4oEtNHIII{!N+`ipLeldk}Y1m{!j8I~P81G2kr3DZ_DcB7^Gk9*UOMV~zzy zHT!2;^Ie-M9fSX*Nv%gP!1Biy>Ho6*3^V3RwD``!lD*ujBp+_X7W(3A#$nIcR%j=w z8_{C;RB`p9so$3=5*Qt5Mqx|pJUq<20yal^ zOjBPhUqTlXtFoYRHuU-ZTaxyr^fCYt?CB|dGarz47y^`CY7cE|%?c@#M#a{Dd=&b!Df`W%72an`LxM&|5LVR$GukQ4)fqStUgg#Xc@$#f_z^KfV*k%BnTj ze<9!Hw}U&;NpcP z+u3_A@Suq{3bye^lf7rV zcf5K;;t+LM=G9hodZl-Pmly@&KR{isCMBz;=weI@n4i z2`nEQQ1DmZf}PHPYGt$^_(;(z^l;txUsv-7>((cb0S2Jg@`Zz+QSB+$1h`H3N1ZM* z=D`){43HJr2eMU=DXWV9*)wiam(8r3kls(a$Kt4&iI_ia9 zONKcEVRAU2cH5v`!xQ9EcX26!N*!4g`+M_vfh{{fT?K{B6VKsS*@w%EOI{@4q6+X` z_vd|vyj@3}{ulWW@|*aXLSP4sVnmBuUSL>^+pw`>x}@YJX!5Q+Yy#V!{Ev95$K%Wn zY7@R8`vNCTmfIdqjLN*`5VVFty=UNfJV0i2!bPf+jHop#w)##I46me&V}a1QZF=F( zS-+34O^$ShLmOig4VPljL#1fm6IhLfLfoW*{R__~yJdPfR1_Ue8{#~(5$~6g6!Goz zuQzwC_gH^*PD=CKWbkpVp0DvISs#K|c)9~Mnn28QR(I8Y1zum2jyIG|sJ3Xa-xjwZ z!oro&BKq?DSxbn>Z`X+J4lqUpw2qS>r2=(Ul+(%5?O;gs>#&kqh5`K2$|M+0JNwd` zOlO6@2H(~r^C{=r2c90~FkB1>2s*g_QR9dY%Aj=(w!gvXaX-CUy9l+gp3!7h`>xZb zci56o9`T~g+-VuSO&9~p6dHmgmE%!K0WAe|_-|vsLf5Q)uA3?ySq+7g@uPj+M-v6~ z`f{`cVHz-xa+MPa8K7?ZZE`z^=@7QCaFCqMS;X%RLt0st)7b$Xu#sJR)IxtA5uo+) z)2g}gd*OXW9roxPS)=%InU+iUwlsBxDoJ%e+EuV-EqjlkH)i2)+r>o0h ze9pRmf9LQ^S_YCGGJqOpb9=Z=2Fu^)uP& zWUFwO@Gh2a*O)Ks5}~!RF@Feh4D|f;i5cPxtzTi3tVyMsS{}GON=JIasqsRu4VjC>D zMOE$tn8?TBFk4StBmd@dOgsys!F=zwqCU(BB+7A3GQ(bIA0*trWCq0=&W-K})R+SK zFPsgK)XqqEA20jsBBb+1T8kc3ln7p88za@BonyG0s$CpIbE2vSnT z8wBN+-)C;b7<~>xvQc9%)Tn^|thO0N*DE#XM(td+#0FK3x`_HG)lZln(foMp0Dz){ zI&2vVY%KO|%u{ub_11~9Z`HH2KIOdfWq7*2FX$9lgm6mIFV=Jl06cr2)uC*&XM9H< zu{D)uOWEW`#7YxY!VFeT)%Uy$z#wa3aC<4uA*8Ai+`6=A>_Y&GI+z5MW0!zd%2qst z-se@P$BTYj)ZRn*Th4R%9R;d8)dem^VSM_Tidf=piz8CqgoV7T@uIai=jeuXsQcoh z*Y|fS_mJM}^jn5-2R@t7lcPGmQ6<7rNXy25Y{eFdbgNznO>6TCn!^qgg6Z;jic7C{ zZy!2VO&B=CE@^PUSN81S@JT$y=*C6|h<^JuK50W`Y{=ok&K)~6{@?56hXTt3_&!SSk4lM4Fs??0I`6 zFSHD?n}CB(ZU*s+QL}hcn7Z3cQvd`pMuDdd1;lWg=!d6?*< z-16R?d3n|j?@cXYnmYJ}=sfh8K<_C~2j(Fy5tV2Yq~K2$BA&49ag!I^k$Io5G5~L0 zKPok_*&4&O6R_WX@Lue|Q5HZ$KTp+`i)VR~J4FgRZQh7WxzvM2dfwtH7& zXfGj}#>v3Y;B^J$ki9m!rnk?7z*&c0bDUL+^U~=!RGZcj;3;cI8gSY#xa$m(&dtE< z`#~>5z43T$90;KtuWBk?t_}MlGw+`OiIYqP4be0)d7Krcu$zz5Yp3WQ5^v;UywJd{ z&ybPNVl^sme`v>{t0tmtHlk~c+;Ell%jPz)!{iE-b1O``Hz{e!=cpuKIVDoM4Armp zbon3++Q+o3MvG09gjK8XHMRDMe2EZIRN99&K}$_C;P1XN$~Tgn3pYTPyJT6-U$6u> z7i76Nh*Xj+T>9P_h49Sl8vaga-rMEW#8m}d)Ee`Q{{%9dElDEMOwtHkM}hNXm?@+3 z=G0KyC+j5Yw^QETgZ-CGpmJqCiCxZ{`d9|95HdH0np|D+VjemH3P}zNS6%sYuR1C` zZFy@a4#Se*wpsC*jF#~VTsEbxKdH4XI!s49dh#+QIDX_1wxCt50@pvFlIZ+hWdK%M z*C<5{e;_y5*#$?%Z%~8ncf8ZU4qr3op7gnW?tr6iySTGsuYziii9L?TWl)N;p(C{! zP@QUNcM2~v|06e<>?EoigzOg6T}(Q#rur%@qt9BUH=d=|i`8G)Eel;pg7K7M%F1H% zd3Sk*wd@=8(^L(~p8I3uZ6ba59Q}G~#9;O*A-g2Cc7IjV0}~=gzx@lcZDa}nPp_6n z>jKs#&;m~g>t}1aP+>Uxh|_#KM3JkH@}Yhcqj)q&CuqG?!M`Le@pz}oMS99|Dwwhr z633j7*bLtR{qMg^Fw+I~H31f~cU#ASW6b^-))RdCUX;F%Lq#)~tW_cQzhEM1Zu|lO zKY=G4QoJyJT@>J85iq|L463IJaODUk4y6xQ{d}eD4_6;g_Ssu(vejS%MW+k5qCy@)qT<+PK zai5QkWOf=+jsE-p0_fD+8Bk9}`$O#@N&cu1Rh&Jn8#J*mm$&!vp2wk&T)Fm)db-Bz z5mD$nU2fELZVbBp3q^=%i&1Cr3!ok6s`v0I#nZ>^J}_{jF2+zjD$c`TX9s0#di+a) zl;BX1NMTrT;CI!BWHua;<}CKZ6_j8sNi#LubZ^r!IA1wP|#X zBd{*=M`}xOpf|d4#3c@?)%A$kS|ttF(@^{Jw+i7W$N3^3kQ3PX00DRax6p|BCm6~U zwgD|b5FBP_BcoBP5*8O$TU6-cm5gy25W@f>L;#HdEubC+Agt|d0-M29?}P~_afpFr z`ju;%Q_C_5m4N^q1CqA^bij63z!8$f3QhdZeMAH2EPp@>L=%7ldOpsJF>wx3+)Q c$`+}a5-wv>t+bY4lN3CUj~>|fI(z^C0GblI!2kdN literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xxxhdpi/pic_browse_square_finish.webp b/app/src/main/res/drawable-xxxhdpi/pic_browse_square_finish.webp new file mode 100644 index 0000000000000000000000000000000000000000..343f83f015d91cdcb35ca89a7c93b476a47da6d3 GIT binary patch literal 10694 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 literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable/bg_browse_square_progress.xml b/app/src/main/res/drawable/bg_browse_square_progress.xml new file mode 100644 index 0000000000..4757878588 --- /dev/null +++ b/app/src/main/res/drawable/bg_browse_square_progress.xml @@ -0,0 +1,12 @@ + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/progressbar_browse_square_style.xml b/app/src/main/res/drawable/progressbar_browse_square_style.xml new file mode 100644 index 0000000000..f56cb17c0a --- /dev/null +++ b/app/src/main/res/drawable/progressbar_browse_square_style.xml @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/layout_square_browse_task_float.xml b/app/src/main/res/layout/layout_square_browse_task_float.xml new file mode 100644 index 0000000000..8c087d2431 --- /dev/null +++ b/app/src/main/res/layout/layout_square_browse_task_float.xml @@ -0,0 +1,32 @@ + + + + + + + + + diff --git a/dependencies.gradle b/dependencies.gradle index 1c8902ba2b..a8d83c64cc 100644 --- a/dependencies.gradle +++ b/dependencies.gradle @@ -110,7 +110,7 @@ ext { apkParser = "v2.6.10" nanohttpd = "2.3.1" aliyunLog = "2.5.14" - easyFloat = "1.3.4" + easyFloat = "2.0.4" shapeOfView = "1.4.7" splitties = "3.0.0" diff --git a/gradle.properties b/gradle.properties index b8bc5b1866..04f32aa994 100644 --- a/gradle.properties +++ b/gradle.properties @@ -53,6 +53,8 @@ QUICK_LOGIN_APPKEY=002BAABA2C078342DA33BEAB0A4C6A25 # hosts DEV_API_HOST=https\://dev-and-api.ghzs.com/v5d5d0/ API_HOST=https\://and-api.ghzs.com/v5d5d0/ +NEW_DEV_API_HOST=https\://dev-app-api.ghzs.com/ +NEW_API_HOST=https\://app-api.ghzs.com/ android.useAndroidX=true android.enableJetifier=true