From 48698f06cd6223c84b9250abb3e37ef3d2ce0e3b Mon Sep 17 00:00:00 2001 From: juntao Date: Tue, 26 Apr 2022 18:37:16 +0800 Subject: [PATCH] =?UTF-8?q?=E3=80=90=E5=85=89=E7=8E=AF=E5=8A=A9=E6=89=8BV5?= =?UTF-8?q?.9.0=E3=80=91=E6=B8=B8=E6=88=8F=E5=AE=9E=E5=90=8D=E8=AE=A4?= =?UTF-8?q?=E8=AF=81=E6=8F=90=E7=A4=BA=E5=8F=8A=E5=85=B6=E4=BB=96=E7=9B=B8?= =?UTF-8?q?=E5=85=B3=E4=BC=98=E5=8C=96=20https://git.shanqu.cc/pm/halo-app?= =?UTF-8?q?-issues/-/issues/1785?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/gh/common/constant/Constants.java | 2 + .../dialog/ApplyModeratorDialogFragment.kt | 2 +- .../gh/common/dialog/PrivacyDialogFragment.kt | 157 --------------- .../dialog/PrivacyPolicyDialogFragment.kt | 182 ++++++++++++++++++ .../java/com/gh/gamecenter/MainActivity.java | 4 +- .../gh/gamecenter/SplashScreenActivity.java | 4 +- .../com/gh/gamecenter/entity/DialogEntity.kt | 24 +++ .../fragment/MainWrapperFragment.java | 71 ++++--- .../fragment/MainWrapperViewModel.kt | 70 +++++-- .../fragment/WelcomeDialogFragment.kt} | 7 +- .../retrofit/service/ApiService.java | 2 +- .../res/layout/dialog_privacy_protocol.xml | 85 ++++---- 12 files changed, 359 insertions(+), 251 deletions(-) delete mode 100644 app/src/main/java/com/gh/common/dialog/PrivacyDialogFragment.kt create mode 100644 app/src/main/java/com/gh/common/dialog/PrivacyPolicyDialogFragment.kt create mode 100644 app/src/main/java/com/gh/gamecenter/entity/DialogEntity.kt rename app/src/main/java/com/gh/{common/view/WelcomeDialog.kt => gamecenter/fragment/WelcomeDialogFragment.kt} (97%) 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 b59abdc66a..179c8cd2b8 100644 --- a/app/src/main/java/com/gh/common/constant/Constants.java +++ b/app/src/main/java/com/gh/common/constant/Constants.java @@ -49,6 +49,8 @@ public class Constants { // 最近显示的弹窗信息 public static final String SP_LAST_OPENING_ID = "last_opening_dialog_id"; public static final String SP_LAST_OPENING_TIME = "last_opening_dialog_time"; + + public static final String SP_LAST_ACCEPTED_PRIVACY_DIALOG_ID = "last_accepted_privacy_dialog_id"; // 游戏图标和图标角标 public static final String RAW_GAME_ICON = "raw_game_icon"; diff --git a/app/src/main/java/com/gh/common/dialog/ApplyModeratorDialogFragment.kt b/app/src/main/java/com/gh/common/dialog/ApplyModeratorDialogFragment.kt index 815537a684..2d39f74f2b 100644 --- a/app/src/main/java/com/gh/common/dialog/ApplyModeratorDialogFragment.kt +++ b/app/src/main/java/com/gh/common/dialog/ApplyModeratorDialogFragment.kt @@ -87,7 +87,7 @@ class ApplyModeratorDialogFragment : BaseDialogFragment() { } }.show( activity.supportFragmentManager, - PrivacyDialogFragment::class.java.simpleName + ApplyModeratorDialogFragment::class.java.simpleName ) } } diff --git a/app/src/main/java/com/gh/common/dialog/PrivacyDialogFragment.kt b/app/src/main/java/com/gh/common/dialog/PrivacyDialogFragment.kt deleted file mode 100644 index 525ef65aef..0000000000 --- a/app/src/main/java/com/gh/common/dialog/PrivacyDialogFragment.kt +++ /dev/null @@ -1,157 +0,0 @@ -package com.gh.common.dialog - -import android.app.Dialog -import android.content.DialogInterface -import android.os.Bundle -import android.text.SpannableStringBuilder -import android.text.Spanned -import android.text.TextPaint -import android.text.method.ScrollingMovementMethod -import android.text.style.ClickableSpan -import android.view.* -import android.widget.TextView -import androidx.appcompat.app.AppCompatActivity -import androidx.core.content.ContextCompat -import androidx.fragment.app.FragmentTransaction -import com.gh.base.fragment.BaseDialogFragment -import com.gh.common.util.dip2px -import com.gh.common.view.CustomLinkMovementMethod -import com.gh.gamecenter.R -import com.gh.gamecenter.WebActivity - -class PrivacyDialogFragment : BaseDialogFragment() { - -// private val mLocalPrivacyHtml = "file:///android_asset/privacy_policies.html" -// private val mLocalRegulationHtml = "file:///android_asset/user_regulation.html" - - var containerView: View? = null - var mCallBack: ((isSuccess: Boolean) -> Unit)? = null - - override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { - containerView = LayoutInflater.from(requireContext()).inflate(R.layout.dialog_privacy_protocol, null, false) - return containerView - } - - override fun onViewCreated(view: View, savedInstanceState: Bundle?) { - super.onViewCreated(view, savedInstanceState) -// val mWebViewPrivacy = containerView?.findViewById(R.id.webView) -// val mWebViewRegulation = containerView?.findViewById(R.id.webView2) -// -// mWebViewPrivacy?.isHorizontalScrollBarEnabled = false -// mWebViewRegulation?.isHorizontalScrollBarEnabled = false - - val contentTv = containerView?.findViewById(R.id.contentTv) - val descTv = containerView?.findViewById(R.id.descTv) - contentTv?.movementMethod = ScrollingMovementMethod() - - val skipText = SpannableStringBuilder("查看完整版的隐私政策和用户协议") - skipText.setSpan(object : ClickableSpan() { - override fun updateDrawState(ds: TextPaint) { - super.updateDrawState(ds) - ds.color = ContextCompat.getColor(requireContext(), R.color.theme_font) - ds.isUnderlineText = false - } - - override fun onClick(widget: View) { - val intent = WebActivity.getIntent(requireContext(), context!!.getString(R.string.privacy_policy_url), true) - context?.startActivity(intent) - } - }, skipText.length - 9, skipText.length - 5, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE) - - skipText.setSpan(object : ClickableSpan() { - override fun updateDrawState(ds: TextPaint) { - super.updateDrawState(ds) - ds.color = ContextCompat.getColor(requireContext(), R.color.theme_font) - ds.isUnderlineText = false - } - - override fun onClick(widget: View) { - val intent = WebActivity.getIntent(requireContext(), context!!.getString(R.string.disclaimer_url), true) - context?.startActivity(intent) - } - }, skipText.length - 4, skipText.length, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE) - descTv?.movementMethod = CustomLinkMovementMethod() - descTv?.text = skipText - -// val mWebViewPrivacy = containerView?.findViewById(R.id.webView) -// -// mWebViewPrivacy?.isHorizontalScrollBarEnabled = false -// -// val settingsArrayList = arrayListOf(mWebViewPrivacy?.settings, mWebViewRegulation?.settings) -// -// for (settings in settingsArrayList) { -// settings?.javaScriptEnabled = true -// if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { -// settings?.mixedContentMode = WebSettings.MIXED_CONTENT_ALWAYS_ALLOW -// } -// // 避免提示网页有害信息不能访问 -// if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { -// settings?.safeBrowsingEnabled = false -// } -// -// // 适配大于屏幕宽度的页面 -// settings?.useWideViewPort = true -// settings?.loadWithOverviewMode = true -// settings?.domStorageEnabled = true -// -// // 自适应屏幕 -// if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { -// settings?.layoutAlgorithm = WebSettings.LayoutAlgorithm.TEXT_AUTOSIZING -// } -// } - -// mWebViewPrivacy?.webViewClient = client -// mWebViewRegulation?.webViewClient = client - - containerView?.findViewById(R.id.refuseTv)?.setOnClickListener { - mCallBack?.invoke(false) - dismissAllowingStateLoss() - } - containerView?.findViewById(R.id.agreeTv)?.setOnClickListener { - mCallBack?.invoke(true) - dismissAllowingStateLoss() - } - } - - override fun onCreateDialog(savedInstanceState: Bundle?): Dialog { - val createDialog = super.onCreateDialog(savedInstanceState) - createDialog.setCanceledOnTouchOutside(false) - createDialog.setOnKeyListener(object : DialogInterface.OnKeyListener { - override fun onKey(dialog: DialogInterface?, keyCode: Int, event: KeyEvent?): Boolean { - if (keyCode == KeyEvent.KEYCODE_BACK) { - return true - } - return false - } - }) - - val window = createDialog.window - window?.setGravity(Gravity.CENTER) - return createDialog - } - - override fun onStart() { - super.onStart() - val width = requireContext().resources.displayMetrics.widthPixels - 60F.dip2px() - val height = ViewGroup.LayoutParams.WRAP_CONTENT - dialog?.window?.setLayout(width, height) - } - - companion object { - @JvmStatic - fun show(activity: AppCompatActivity, callBack: ((isSuccess: Boolean) -> Unit)?) { - var privacyDialogFragment = activity.supportFragmentManager.findFragmentByTag(PrivacyDialogFragment::class.java.simpleName) as? PrivacyDialogFragment - if (privacyDialogFragment != null) { - privacyDialogFragment.mCallBack = callBack - val transaction: FragmentTransaction = activity.supportFragmentManager.beginTransaction() - transaction.show(privacyDialogFragment) - transaction.commit() - } else { - privacyDialogFragment = PrivacyDialogFragment().apply { - mCallBack = callBack - } - privacyDialogFragment.show(activity.supportFragmentManager, PrivacyDialogFragment::class.java.simpleName) - } - } - } -} \ No newline at end of file diff --git a/app/src/main/java/com/gh/common/dialog/PrivacyPolicyDialogFragment.kt b/app/src/main/java/com/gh/common/dialog/PrivacyPolicyDialogFragment.kt new file mode 100644 index 0000000000..338357b027 --- /dev/null +++ b/app/src/main/java/com/gh/common/dialog/PrivacyPolicyDialogFragment.kt @@ -0,0 +1,182 @@ +package com.gh.common.dialog + +import android.app.Dialog +import android.content.DialogInterface +import android.os.Bundle +import android.text.SpannableStringBuilder +import android.text.Spanned +import android.text.TextPaint +import android.text.method.ScrollingMovementMethod +import android.text.style.ClickableSpan +import android.view.* +import androidx.core.content.ContextCompat +import androidx.fragment.app.FragmentActivity +import com.gh.base.fragment.BaseDialogFragment +import com.gh.common.constant.Constants +import com.gh.common.util.SPUtils +import com.gh.common.util.dip2px +import com.gh.common.util.fromHtml +import com.gh.common.view.CustomLinkMovementMethod +import com.gh.gamecenter.R +import com.gh.gamecenter.WebActivity +import com.gh.gamecenter.databinding.DialogPrivacyProtocolBinding +import com.gh.gamecenter.entity.DialogEntity +import com.lightgame.utils.AppManager +import splitties.bundle.put + +// TODO Restore callback after recreation +class PrivacyPolicyDialogFragment : BaseDialogFragment() { + + private var mCallBack: ((isSuccess: Boolean) -> Unit)? = null + private val mBinding by lazy { DialogPrivacyProtocolBinding.inflate(layoutInflater) } + + override fun onCreateView( + inflater: LayoutInflater, + container: ViewGroup?, + savedInstanceState: Bundle? + ): View { + return mBinding.root + } + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + + mBinding.contentTv.movementMethod = ScrollingMovementMethod() + + val privacyPolicyEntity = arguments?.get(KEY_DATA) as? DialogEntity.PrivacyPolicyEntity + if (privacyPolicyEntity == null) { + showPreLaunchStyle() + } else { + showUpdatedStyle(privacyPolicyEntity) + } + } + + private fun showUpdatedStyle(privacyPolicyEntity: DialogEntity.PrivacyPolicyEntity) { + mBinding.titleIv.visibility = View.VISIBLE + mBinding.privacyTitleTv.text = "光环助手《隐私协议》更新" + mBinding.contentTv.text = privacyPolicyEntity.content.fromHtml() + + val skipText = SpannableStringBuilder("查看隐私政策详情") + skipText.setSpan(object : ClickableSpan() { + override fun updateDrawState(ds: TextPaint) { + super.updateDrawState(ds) + ds.color = ContextCompat.getColor(requireContext(), R.color.theme_font) + ds.isUnderlineText = false + } + + override fun onClick(widget: View) { + val intent = WebActivity.getIntent(requireContext(), context!!.getString(R.string.privacy_policy_url), true) + context?.startActivity(intent) + } + }, skipText.length - 6, skipText.length, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE) + mBinding.descTv.movementMethod = CustomLinkMovementMethod() + mBinding.descTv.text = skipText + + if (privacyPolicyEntity.alertType == "INFORM") { + mBinding.refuseTv.visibility = View.GONE + mBinding.agreeTv.text = "我知道了" + mBinding.agreeTv.setOnClickListener { + SPUtils.setString(Constants.SP_LAST_ACCEPTED_PRIVACY_DIALOG_ID, privacyPolicyEntity.id) + mCallBack?.invoke(true) + dismissAllowingStateLoss() + } + } else { + mBinding.refuseTv.text = "不同意退出" + mBinding.agreeTv.text = "同意" + mBinding.refuseTv.setOnClickListener { + dismissAllowingStateLoss() + AppManager.getInstance().finishAllActivity() + } + mBinding.agreeTv.setOnClickListener { + SPUtils.setString(Constants.SP_LAST_ACCEPTED_PRIVACY_DIALOG_ID, privacyPolicyEntity.id) + mCallBack?.invoke(true) + dismissAllowingStateLoss() + } + } + } + + private fun showPreLaunchStyle() { + val skipText = SpannableStringBuilder("查看完整版的隐私政策和用户协议") + + skipText.setSpan(object : ClickableSpan() { + override fun updateDrawState(ds: TextPaint) { + super.updateDrawState(ds) + ds.color = ContextCompat.getColor(requireContext(), R.color.theme_font) + ds.isUnderlineText = false + } + + override fun onClick(widget: View) { + val intent = WebActivity.getIntent(requireContext(), context!!.getString(R.string.privacy_policy_url), true) + context?.startActivity(intent) + } + }, skipText.length - 9, skipText.length - 5, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE) + + skipText.setSpan(object : ClickableSpan() { + override fun updateDrawState(ds: TextPaint) { + super.updateDrawState(ds) + ds.color = ContextCompat.getColor(requireContext(), R.color.theme_font) + ds.isUnderlineText = false + } + + override fun onClick(widget: View) { + val intent = WebActivity.getIntent(requireContext(), context!!.getString(R.string.disclaimer_url), true) + context?.startActivity(intent) + } + }, skipText.length - 4, skipText.length, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE) + mBinding.descTv.movementMethod = CustomLinkMovementMethod() + mBinding.descTv.text = skipText + + mBinding.refuseTv.setOnClickListener { + mCallBack?.invoke(false) + dismissAllowingStateLoss() + } + mBinding.agreeTv.setOnClickListener { + mCallBack?.invoke(true) + dismissAllowingStateLoss() + } + } + + override fun onCreateDialog(savedInstanceState: Bundle?): Dialog { + val createDialog = super.onCreateDialog(savedInstanceState) + createDialog.setCanceledOnTouchOutside(false) + createDialog.setOnKeyListener(object : DialogInterface.OnKeyListener { + override fun onKey(dialog: DialogInterface?, keyCode: Int, event: KeyEvent?): Boolean { + if (keyCode == KeyEvent.KEYCODE_BACK) { + return true + } + return false + } + }) + + val window = createDialog.window + window?.setGravity(Gravity.CENTER) + return createDialog + } + + override fun onStart() { + super.onStart() + val width = requireContext().resources.displayMetrics.widthPixels - 60F.dip2px() + val height = ViewGroup.LayoutParams.WRAP_CONTENT + dialog?.window?.setLayout(width, height) + } + + companion object { + const val KEY_DATA = "data" + + @JvmStatic + fun show(activity: FragmentActivity, + privacyPolicyEntity: DialogEntity.PrivacyPolicyEntity? = null, + callBack: ((isSuccess: Boolean) -> Unit)?) { + val privacyDialogFragment = PrivacyPolicyDialogFragment().apply { + mCallBack = callBack + } + privacyDialogFragment.arguments = Bundle().apply { + put(KEY_DATA, privacyPolicyEntity) + } + privacyDialogFragment.show( + activity.supportFragmentManager, + PrivacyPolicyDialogFragment::class.java.simpleName + ) + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/gh/gamecenter/MainActivity.java b/app/src/main/java/com/gh/gamecenter/MainActivity.java index 4f093e73af..99cdaf89c7 100644 --- a/app/src/main/java/com/gh/gamecenter/MainActivity.java +++ b/app/src/main/java/com/gh/gamecenter/MainActivity.java @@ -22,7 +22,6 @@ import android.content.Context; import android.content.Intent; import android.content.SharedPreferences; import android.content.pm.ApplicationInfo; -import android.content.res.Configuration; import android.graphics.Color; import android.os.Build; import android.os.Bundle; @@ -107,7 +106,6 @@ import com.gh.gamecenter.room.dao.SimulatorGameDao; import com.gh.gamecenter.suggest.SuggestSelectFragment; import com.gh.gamecenter.suggest.SuggestType; import com.google.android.exoplayer2.upstream.cache.Cache; -import com.google.gson.Gson; import com.google.gson.JsonSyntaxException; import com.google.gson.reflect.TypeToken; import com.halo.assistant.HaloApp; @@ -516,7 +514,7 @@ public class MainActivity extends BaseActivity { AppExecutor.getIoExecutor().execute(() -> { UpdateManager updateManager = UpdateManager.getInstance(this); updateManager.checkUpdate(true, null); - updateManager.setDismissCallback(() -> mMainWrapperFragment.getWelcomeDialog()); + updateManager.setDismissCallback(() -> mMainWrapperFragment.getDialog()); }); } diff --git a/app/src/main/java/com/gh/gamecenter/SplashScreenActivity.java b/app/src/main/java/com/gh/gamecenter/SplashScreenActivity.java index 82a88d201b..6f61e22b12 100644 --- a/app/src/main/java/com/gh/gamecenter/SplashScreenActivity.java +++ b/app/src/main/java/com/gh/gamecenter/SplashScreenActivity.java @@ -25,7 +25,7 @@ import com.gh.base.BaseActivity; import com.gh.common.AppExecutor; import com.gh.common.constant.Config; import com.gh.common.constant.Constants; -import com.gh.common.dialog.PrivacyDialogFragment; +import com.gh.common.dialog.PrivacyPolicyDialogFragment; import com.gh.common.tracker.TrackerLogger; import com.gh.common.util.AdHelper; import com.gh.common.util.DeviceTokenUtils; @@ -181,7 +181,7 @@ public class SplashScreenActivity extends BaseActivity { } private void showPrivacyDialog(ViewPager guideLayout) { - PrivacyDialogFragment.show(this, (isSuccess) -> { + PrivacyPolicyDialogFragment.show(this, null, (isSuccess) -> { if (isSuccess) { showPrivacyPolicy((shouldRequestPermission) -> { // Dialog dismiss 后的回调 diff --git a/app/src/main/java/com/gh/gamecenter/entity/DialogEntity.kt b/app/src/main/java/com/gh/gamecenter/entity/DialogEntity.kt new file mode 100644 index 0000000000..dfc96174a6 --- /dev/null +++ b/app/src/main/java/com/gh/gamecenter/entity/DialogEntity.kt @@ -0,0 +1,24 @@ +package com.gh.gamecenter.entity + +import android.os.Parcelable +import com.google.gson.annotations.SerializedName +import kotlinx.parcelize.Parcelize + +data class DialogEntity( + @SerializedName("index") + val welcomeDialog: WelcomeDialogEntity? = null, + @SerializedName("privacy_policy") + val privacyPolicyDialog: PrivacyPolicyEntity? = null) { + + @Parcelize + data class PrivacyPolicyEntity( + @SerializedName("_id") + var id: String, + var type: String, + var alert: String, // ONCE/EVERY_TIME_OPEN + @SerializedName("alert_type") + var alertType: String,// INFORM/RECONFIRM + var content: String, // 支持html + var time: Long + ): Parcelable +} \ No newline at end of file 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 56824d4b36..2a66931b1c 100644 --- a/app/src/main/java/com/gh/gamecenter/fragment/MainWrapperFragment.java +++ b/app/src/main/java/com/gh/gamecenter/fragment/MainWrapperFragment.java @@ -1,6 +1,5 @@ package com.gh.gamecenter.fragment; -import android.content.res.Configuration; import android.graphics.Bitmap; import android.graphics.PorterDuff; import android.graphics.drawable.Animatable; @@ -12,7 +11,6 @@ import android.widget.CheckedTextView; import android.widget.ImageView; import androidx.annotation.ColorRes; -import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.core.content.ContextCompat; import androidx.fragment.app.Fragment; @@ -29,10 +27,13 @@ import com.facebook.imagepipeline.image.ImageInfo; import com.gh.base.OnDoubleTapListener; import com.gh.base.fragment.BaseFragment_ViewPager_Checkable; import com.gh.common.constant.Config; +import com.gh.common.constant.Constants; +import com.gh.common.dialog.PrivacyPolicyDialogFragment; import com.gh.common.syncpage.SyncPageRepository; import com.gh.common.tracker.TrackerLogger; import com.gh.common.util.BiCallback; import com.gh.common.util.DataUtils; +import com.gh.common.util.DialogUtils; import com.gh.common.util.DisplayUtils; import com.gh.common.util.EntranceUtils; import com.gh.common.util.ExtensionsKt; @@ -42,12 +43,14 @@ import com.gh.common.util.ImageUtils; import com.gh.common.util.IntegralLogHelper; import com.gh.common.util.LogUtils; import com.gh.common.util.NightModeUtils; +import com.gh.common.util.SPUtils; import com.gh.common.view.ReserveDialog; -import com.gh.common.view.WelcomeDialog; import com.gh.gamecenter.R; import com.gh.gamecenter.databinding.FragmentMainBinding; +import com.gh.gamecenter.entity.PrivacyPolicyEntity; import com.gh.gamecenter.entity.SettingsEntity; import com.gh.gamecenter.entity.SubjectRecommendEntity; +import com.gh.gamecenter.entity.WelcomeDialogEntity; import com.gh.gamecenter.eventbus.EBReuse; import com.gh.gamecenter.eventbus.EBSkip; import com.gh.gamecenter.eventbus.EBUISwitch; @@ -61,7 +64,6 @@ import com.halo.assistant.HaloApp; import com.lightgame.listeners.OnBackPressedListener; import com.lightgame.view.CheckableLinearLayout; import com.lightgame.view.NoScrollableViewPager; -import com.squareup.picasso.Picasso; import org.greenrobot.eventbus.EventBus; import org.greenrobot.eventbus.Subscribe; @@ -195,37 +197,46 @@ public class MainWrapperFragment extends BaseFragment_ViewPager_Checkable implem .get(MessageUnreadViewModel.class) .getUnreadMessageTotalLiveData().observe(this, isShow -> ExtensionsKt.goneIf(mBinding.mainIvMessageHint, !isShow)); } - - public void getWelcomeDialog() { - // 判断是否是第一次启动应用,不是的话不弹启动弹窗 - if (HaloApp.get(MainWrapperViewModel.SHOULD_SHOW_OPENING_DIALOG, false) == null) { + + public void getDialog() { + mViewModel.requestOpeningData(); + mViewModel.getPrivacyPolicyDialog().observe(this, it -> { + if (it != null) { + PrivacyPolicyDialogFragment.show(requireActivity(), it, (isSuccess) -> { + showWelcomeDialogIfNeeded(mViewModel.getOpeningDialog().getValue()); + return null; + }); + } else { + showWelcomeDialogIfNeeded(mViewModel.getOpeningDialog().getValue()); + } + }); + } + + private void showWelcomeDialogIfNeeded(WelcomeDialogEntity welcomeDialogEntity) { + // 判断启动本次应用是否已经弹窗,不是的话弹启动弹窗 + if (welcomeDialogEntity != null && HaloApp.get(MainWrapperViewModel.SHOULD_SHOW_OPENING_DIALOG, false) == null) { HaloApp.put(MainWrapperViewModel.SHOULD_SHOW_OPENING_DIALOG, false); - mViewModel.requestOpeningData(); - mViewModel.getOpeningDialog().observe(this, it -> { - if (it != null) { - ImageUtils.getBitmap(it.getIcon(), new BiCallback() { - @Override - public void onFirst(Bitmap bitmap) { - // 网络速度追不上用户操作的时候可能会出现要弹启动弹窗但用户已经不停留在 MainActivity 的情况 - if (!isAdded()) return; - - WelcomeDialog welcomeDialog = WelcomeDialog.getInstance(it); - welcomeDialog.setOnDismissListener(() -> { - mViewModel.requestReserveDialog(); - return null; - }); - welcomeDialog.show(getChildFragmentManager(), "openingDialog"); - } - - @Override - public void onSecond(Boolean aBoolean) { - mViewModel.requestReserveDialog(); - } + ImageUtils.getBitmap(welcomeDialogEntity.getIcon(), new BiCallback() { + @Override + public void onFirst(Bitmap bitmap) { + // 网络速度追不上用户操作的时候可能会出现要弹启动弹窗但用户已经不停留在 MainActivity 的情况 + if (!isAdded()) return; + + WelcomeDialogFragment welcomeDialog = WelcomeDialogFragment.getInstance(welcomeDialogEntity); + welcomeDialog.setOnDismissListener(() -> { + mViewModel.requestReserveDialog(); + return null; }); - } else { + welcomeDialog.show(getChildFragmentManager(), "openingDialog"); + } + + @Override + public void onSecond(Boolean aBoolean) { mViewModel.requestReserveDialog(); } }); + } else { + mViewModel.requestReserveDialog(); } } 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 2d95c9c6ff..3704a2eb66 100644 --- a/app/src/main/java/com/gh/gamecenter/fragment/MainWrapperViewModel.kt +++ b/app/src/main/java/com/gh/gamecenter/fragment/MainWrapperViewModel.kt @@ -9,11 +9,9 @@ import com.gh.common.constant.Constants import com.gh.common.util.CheckLoginUtils import com.gh.common.util.HomeBottomBarHelper import com.gh.common.util.PackageUtils +import com.gh.common.util.SPUtils import com.gh.gamecenter.BuildConfig -import com.gh.gamecenter.entity.ConcernEntity -import com.gh.gamecenter.entity.SimpleGameEntity -import com.gh.gamecenter.entity.SubjectRecommendEntity -import com.gh.gamecenter.entity.WelcomeDialogEntity +import com.gh.gamecenter.entity.* import com.gh.gamecenter.manager.UserManager import com.gh.gamecenter.retrofit.BiResponse import com.gh.gamecenter.retrofit.Response @@ -34,9 +32,10 @@ class MainWrapperViewModel(application: Application) : AndroidViewModel(applicat val concernData = MutableLiveData>() val navBar = MutableLiveData() - // 弹窗优先级: 启动弹窗->预约弹窗->消息弹窗 - val openingDialog = MutableLiveData() - val reserveDialog = MutableLiveData>() + // 弹窗优先级: 隐私政策弹窗->启动弹窗->预约弹窗->消息弹窗 + val openingDialog = MutableLiveData() + val reserveDialog = MutableLiveData?>() + val privacyPolicyDialog = MutableLiveData() init { getHomeNavBar() @@ -83,7 +82,7 @@ class MainWrapperViewModel(application: Application) : AndroidViewModel(applicat } /** - * 获取启动弹窗 + * 获取弹窗 */ @SuppressLint("CheckResult") fun requestOpeningData() { @@ -95,28 +94,59 @@ class MainWrapperViewModel(application: Application) : AndroidViewModel(applicat mSensitiveApi.getOpeningDialog(HaloApp.getInstance().channel, lastId, lastTime, openType) .subscribeOn(Schedulers.io()) - .subscribe(object : BiResponse() { - override fun onSuccess(data: WelcomeDialogEntity) { + .subscribe(object : BiResponse() { + override fun onSuccess(data: DialogEntity) { + val welcomeDialogEntity = data.welcomeDialog + val privacyPolicyDialogEntity = data.privacyPolicyDialog + // 类型为游戏时判断是否本地已安装该游戏,已安装不弹弹窗 - if (data.type == "game") { - if (data.packages == null) { - openingDialog.postValue(data) + if (welcomeDialogEntity != null) { + if (welcomeDialogEntity.type == "game") { + if (welcomeDialogEntity.packages == null) { + openingDialog.postValue(data.welcomeDialog) + } else { + for (packageName in data.welcomeDialog.packages!!) { + if (PackageUtils.isInstalled(getApplication(), packageName)) { + openingDialog.postValue(null) + return + } + } + openingDialog.postValue(data.welcomeDialog) + } } else { - for (packageName in data.packages!!) { - if (PackageUtils.isInstalled(getApplication(), packageName)) { - openingDialog.postValue(null) - return + openingDialog.postValue(data.welcomeDialog) + } + } + + // 全新安装忽略隐私弹窗 + if (privacyPolicyDialogEntity != null) { + val id = privacyPolicyDialogEntity.id + val lastAcceptedId = SPUtils.getString(Constants.SP_LAST_ACCEPTED_PRIVACY_DIALOG_ID, "") + if (HaloApp.getInstance().isBrandNewInstall) { + SPUtils.setString(Constants.SP_LAST_ACCEPTED_PRIVACY_DIALOG_ID, id) + privacyPolicyDialog.postValue(null) + } else { + if (privacyPolicyDialogEntity.alertType == "INFORM") { + if (id != lastAcceptedId) { + privacyPolicyDialog.postValue(privacyPolicyDialogEntity) + } else { + privacyPolicyDialog.postValue(null) + } + } else { + if (id != lastAcceptedId) { + privacyPolicyDialog.postValue(privacyPolicyDialogEntity) + } else { + privacyPolicyDialog.postValue(null) } } - openingDialog.postValue(data) } } else { - openingDialog.postValue(data) + privacyPolicyDialog.postValue(null) } } override fun onFailure(exception: Exception) { - openingDialog.postValue(null) + privacyPolicyDialog.postValue(null) } }) } diff --git a/app/src/main/java/com/gh/common/view/WelcomeDialog.kt b/app/src/main/java/com/gh/gamecenter/fragment/WelcomeDialogFragment.kt similarity index 97% rename from app/src/main/java/com/gh/common/view/WelcomeDialog.kt rename to app/src/main/java/com/gh/gamecenter/fragment/WelcomeDialogFragment.kt index de5dbf1d6f..9a47f660b1 100644 --- a/app/src/main/java/com/gh/common/view/WelcomeDialog.kt +++ b/app/src/main/java/com/gh/gamecenter/fragment/WelcomeDialogFragment.kt @@ -1,4 +1,4 @@ -package com.gh.common.view +package com.gh.gamecenter.fragment import android.os.Bundle import android.preference.PreferenceManager @@ -11,12 +11,13 @@ import com.gh.common.constant.Constants import com.gh.common.constant.Constants.SP_LAST_OPENING_ID import com.gh.common.constant.Constants.SP_LAST_OPENING_TIME import com.gh.common.util.* +import com.gh.common.view.WrapContentDraweeView import com.gh.gamecenter.databinding.DialogWelcomeBinding import com.gh.gamecenter.entity.CommunityEntity import com.gh.gamecenter.entity.WelcomeDialogEntity import com.halo.assistant.HaloApp -class WelcomeDialog : BaseDialogFragment() { +class WelcomeDialogFragment : BaseDialogFragment() { private var mWelcomeEntity: WelcomeDialogEntity? = null private var mTimeHelper: TimeElapsedHelper? = null @@ -138,7 +139,7 @@ class WelcomeDialog : BaseDialogFragment() { const val TAG = "welcome_dialog" @JvmStatic - fun getInstance(welcomeEntity: WelcomeDialogEntity?) = WelcomeDialog().apply { + fun getInstance(welcomeEntity: WelcomeDialogEntity?) = WelcomeDialogFragment().apply { arguments = Bundle() arguments?.putParcelable(TAG, welcomeEntity) LogUtils.uploadWelcomeDialog("show", welcomeEntity?.id, welcomeEntity?.text) 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 bf30772434..80365b89e2 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 @@ -1339,7 +1339,7 @@ public interface ApiService { * @param previousTime 上一次获取到的弹窗时间 */ @GET("dialog") - Single getOpeningDialog(@Query("channel") String channel, @Query("prev_id") String previousId, @Query("prev_time") Long previousTime, @Query("open_type") String openType); + Single getOpeningDialog(@Query("channel") String channel, @Query("prev_id") String previousId, @Query("prev_time") Long previousTime, @Query("open_type") String openType); /** * 告诉后台用户结束了客服会话 diff --git a/app/src/main/res/layout/dialog_privacy_protocol.xml b/app/src/main/res/layout/dialog_privacy_protocol.xml index a06dd048e0..2d85beeb8a 100644 --- a/app/src/main/res/layout/dialog_privacy_protocol.xml +++ b/app/src/main/res/layout/dialog_privacy_protocol.xml @@ -1,6 +1,7 @@ - - + app:layout_constraintTop_toBottomOf="@id/titleContainer"> + + + + + + + - - - - + + + + \ No newline at end of file