From c268564445dcd058ee8596b79a6d793abaae810d Mon Sep 17 00:00:00 2001 From: ocean <503259349@qq.com> Date: Thu, 4 Jul 2024 13:50:43 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E8=AF=84=E5=88=86dialog?= =?UTF-8?q?=EF=BC=8C=E5=85=88=E8=AE=BE=E7=BD=AE=E4=B8=BA5=E5=88=86?= =?UTF-8?q?=E9=92=9F=E7=94=A8=E4=BA=8E=E6=B5=8B=E8=AF=95=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/java/melody/offline/music/App.kt | 9 + .../offline/music/activity/LaunchActivity.kt | 6 + .../offline/music/activity/MoBaseActivity.kt | 14 ++ .../offline/music/activity/PrimaryActivity.kt | 14 ++ .../music/activity/SettingsActivity.kt | 5 + .../java/melody/offline/music/sp/AppStore.kt | 8 +- .../melody/offline/music/util/AnalysisUtil.kt | 3 + .../melody/offline/music/util/OpenUrlUtil.kt | 12 ++ .../melody/offline/music/view/RatingDialog.kt | 73 ++++++++ .../res/drawable/drw_rating_dialog_bg.xml | 8 + .../main/res/drawable/star_select_icon.xml | 13 ++ .../main/res/drawable/star_unselect_icon.xml | 16 ++ app/src/main/res/layout/activity_settings.xml | 27 +++ app/src/main/res/layout/dialog_rating.xml | 173 ++++++++++++++++++ app/src/main/res/mipmap-xxhdpi/rating_img.png | Bin 0 -> 25822 bytes app/src/main/res/values/strings.xml | 4 + 16 files changed, 384 insertions(+), 1 deletion(-) create mode 100644 app/src/main/java/melody/offline/music/view/RatingDialog.kt create mode 100644 app/src/main/res/drawable/drw_rating_dialog_bg.xml create mode 100644 app/src/main/res/drawable/star_select_icon.xml create mode 100644 app/src/main/res/drawable/star_unselect_icon.xml create mode 100644 app/src/main/res/layout/dialog_rating.xml create mode 100644 app/src/main/res/mipmap-xxhdpi/rating_img.png diff --git a/app/src/main/java/melody/offline/music/App.kt b/app/src/main/java/melody/offline/music/App.kt index f51feb2..d17eec6 100644 --- a/app/src/main/java/melody/offline/music/App.kt +++ b/app/src/main/java/melody/offline/music/App.kt @@ -129,6 +129,7 @@ class App : Application() { AnalysisUtil.logEvent(AnalysisUtil.USER_LAUNCH) app = this AppLifecycleHandler(this) + saveInstallTimeIfNeeded() initAd() CommonIpInfoUtil.shared.initIPInfo() UploadEventName.shared.init(this) @@ -155,4 +156,12 @@ class App : Application() { LoLAds.setAdConfigKey("Music")//服务器端中⼴告json的key;⻅⼴告配置json详情 LoLAds.setAdConfig(AppStore(this).adJson)//设置自定义广告配置json } + + private fun saveInstallTimeIfNeeded() {//用于弹出评分dialog的条件 + val time = AppStore(this).showRateDialogTime + if (time == 0L) {//如果time为0L,则表示安装(或者是清除数据) + val currentTime = System.currentTimeMillis() + AppStore(this).showRateDialogTime = currentTime + } + } } \ No newline at end of file diff --git a/app/src/main/java/melody/offline/music/activity/LaunchActivity.kt b/app/src/main/java/melody/offline/music/activity/LaunchActivity.kt index 2d1785b..97ff315 100644 --- a/app/src/main/java/melody/offline/music/activity/LaunchActivity.kt +++ b/app/src/main/java/melody/offline/music/activity/LaunchActivity.kt @@ -1,5 +1,6 @@ package melody.offline.music.activity +import android.annotation.SuppressLint import android.content.Intent import android.os.CountDownTimer import android.os.Handler @@ -141,4 +142,9 @@ class LaunchActivity : MoBaseActivity() { } }) } + + @SuppressLint("MissingSuperCall") + override fun onBackPressed() { + + } } \ No newline at end of file diff --git a/app/src/main/java/melody/offline/music/activity/MoBaseActivity.kt b/app/src/main/java/melody/offline/music/activity/MoBaseActivity.kt index 21bc19e..eeb381f 100644 --- a/app/src/main/java/melody/offline/music/activity/MoBaseActivity.kt +++ b/app/src/main/java/melody/offline/music/activity/MoBaseActivity.kt @@ -66,7 +66,9 @@ import melody.offline.music.util.DownloadUtil import melody.offline.music.util.FileSizeConverter import melody.offline.music.util.LogTag import melody.offline.music.view.MusicPlayerView +import melody.offline.music.view.RatingDialog import org.json.JSONObject +import java.util.concurrent.TimeUnit @OptIn(UnstableApi::class) @@ -507,4 +509,16 @@ abstract class MoBaseActivity : AppCompatActivity(), MusicPlayerView.PlaySkipFor ContextCompat.getColor(this, R.color.main_bg_color) bottomSheetDialog?.show() } + + fun showRatingDialog() { + val dialog = RatingDialog(this) + val installTime = appStore.showRateDialogTime + val currentTime = System.currentTimeMillis() + // 检测是否超过三天 + if (currentTime - installTime > TimeUnit.DAYS.toMillis(3)) { + dialog.show() + //更新为当前时间 + appStore.showRateDialogTime = System.currentTimeMillis() + } + } } \ No newline at end of file diff --git a/app/src/main/java/melody/offline/music/activity/PrimaryActivity.kt b/app/src/main/java/melody/offline/music/activity/PrimaryActivity.kt index c09224f..f1acfae 100644 --- a/app/src/main/java/melody/offline/music/activity/PrimaryActivity.kt +++ b/app/src/main/java/melody/offline/music/activity/PrimaryActivity.kt @@ -22,6 +22,7 @@ class PrimaryActivity : MoBaseActivity(), SearchFragment.SearchFragmentCancelCli private val mFragments: MutableList = ArrayList() private var currentIndex: Int = 0 private var mCurrentFragment: Fragment? = null + private var shouldShowDialog = false fun getCurrentFragment(): Fragment? { if (mCurrentFragment != null) { @@ -145,6 +146,19 @@ class PrimaryActivity : MoBaseActivity(), SearchFragment.SearchFragmentCancelCli private fun activityOnResume() { addMusicPlayerViewToLayout(binding.playMusicLayout) + // 如果标志位为true,则表示用户从其他页面返回到了首页 + if (shouldShowDialog) { + // 检测并弹出Dialog + showRatingDialog() + // 重置标志位 + shouldShowDialog = false + } + } + + override fun onPause() { + super.onPause() + // 设置标志位为true,表示用户离开了首页 + shouldShowDialog = true } override fun onFragmentClick() { diff --git a/app/src/main/java/melody/offline/music/activity/SettingsActivity.kt b/app/src/main/java/melody/offline/music/activity/SettingsActivity.kt index 4af6b34..0e83494 100644 --- a/app/src/main/java/melody/offline/music/activity/SettingsActivity.kt +++ b/app/src/main/java/melody/offline/music/activity/SettingsActivity.kt @@ -13,6 +13,7 @@ import melody.offline.music.util.openPrivacyPolicy import melody.offline.music.util.openTermsOfService import melody.offline.music.util.sendFeedback import melody.offline.music.util.shareApp +import melody.offline.music.view.RatingDialog class SettingsActivity : AppCompatActivity() { @@ -62,6 +63,10 @@ class SettingsActivity : AppCompatActivity() { binding.tosBtn.setOnClickListener { openTermsOfService(this, TERMS_OF_SERVICE_URL) } + binding.rateUsBtn.setOnClickListener { + val dialog = RatingDialog(this) + dialog.show() + } } } \ No newline at end of file diff --git a/app/src/main/java/melody/offline/music/sp/AppStore.kt b/app/src/main/java/melody/offline/music/sp/AppStore.kt index 977fb5f..6ada955 100644 --- a/app/src/main/java/melody/offline/music/sp/AppStore.kt +++ b/app/src/main/java/melody/offline/music/sp/AppStore.kt @@ -59,6 +59,12 @@ class AppStore(context: Context) { defaultValue = Constants.DEFAULT_SHOW_AD_INTERVAL_TIME ) + //记录弹出dialog的时间 + var showRateDialogTime: Long by store.long( + key = SHOW_RATE_DIALOG_TIME, + defaultValue = 0L + ) + companion object { private const val FILE_NAME = "music_oo_app" const val SEARCH_HISTORY = "search_history" @@ -69,6 +75,6 @@ class AppStore(context: Context) { const val IP_COUNTRY_CODE = "ip_country_code" const val FIRST_OPEN_IS_SUCCEED = "first_open_is_succeed" const val SHOULD_ENTER_MUSIC_PAGE = "key_should_enter_music_page" - + const val SHOW_RATE_DIALOG_TIME = "show_rate_dialog_time" } } \ No newline at end of file diff --git a/app/src/main/java/melody/offline/music/util/AnalysisUtil.kt b/app/src/main/java/melody/offline/music/util/AnalysisUtil.kt index b2c3c16..aff0e71 100644 --- a/app/src/main/java/melody/offline/music/util/AnalysisUtil.kt +++ b/app/src/main/java/melody/offline/music/util/AnalysisUtil.kt @@ -34,6 +34,9 @@ object AnalysisUtil { const val SEARCH_RESULT_PV = "search_result_pv"//搜索结果曝光 const val SEARCH_RESULT_SUCCESS_ACTION = "search_result_success_action"//搜索有结果 const val SEARCH_TRIGGER = "search_trigger "//触发搜索 + const val RATING_DIALOG_SHOW = "rating_dialog_show" + const val RATING_DIALOG_OK_CLICK = "rating_dialog_ok_click" + const val RATING_DIALOG_CANCEL_CLICK = "rating_dialog_cancel_click" private const val AD_INST_SPLASH_SUCCESS = "ad_user_open_success"//首页开屏广告展示成功 diff --git a/app/src/main/java/melody/offline/music/util/OpenUrlUtil.kt b/app/src/main/java/melody/offline/music/util/OpenUrlUtil.kt index 5126db2..96d73b7 100644 --- a/app/src/main/java/melody/offline/music/util/OpenUrlUtil.kt +++ b/app/src/main/java/melody/offline/music/util/OpenUrlUtil.kt @@ -1,9 +1,11 @@ package melody.offline.music.util +import android.content.ActivityNotFoundException import android.content.Context import android.content.Intent import android.net.Uri import android.widget.Toast +import androidx.core.content.ContextCompat.startActivity const val PRIVACY_POLICY_URL = "https://himelody.mystrikingly.com/privacy" const val TERMS_OF_SERVICE_URL = "https://himelody.mystrikingly.com/terms" @@ -40,4 +42,14 @@ fun sendFeedback(context: Context, email: String, subject: String) { } catch (ex: android.content.ActivityNotFoundException) { Toast.makeText(context,"There is no app that supports sending emails",Toast.LENGTH_LONG).show() } +} + +fun openGooglePlay(context: Context, packageName: String) { + val intent = Intent(Intent.ACTION_VIEW, Uri.parse("https://play.google.com/store/apps/details?id=$packageName")) + intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK) + try { + context.startActivity(intent) + } catch (e: ActivityNotFoundException) { + e.printStackTrace() + } } \ No newline at end of file diff --git a/app/src/main/java/melody/offline/music/view/RatingDialog.kt b/app/src/main/java/melody/offline/music/view/RatingDialog.kt new file mode 100644 index 0000000..4d505ad --- /dev/null +++ b/app/src/main/java/melody/offline/music/view/RatingDialog.kt @@ -0,0 +1,73 @@ +package melody.offline.music.view + +import android.app.Dialog +import android.content.Context +import android.view.LayoutInflater +import melody.offline.music.R +import melody.offline.music.databinding.DialogRatingBinding +import melody.offline.music.util.AnalysisUtil +import melody.offline.music.util.openGooglePlay +import melody.offline.music.util.sendFeedback + +class RatingDialog(private val mContext: Context) : Dialog(mContext) { + private var starType = 5 + private var binding: DialogRatingBinding = + DialogRatingBinding.inflate(LayoutInflater.from(mContext)) + + init { + setContentView(binding.root) + window?.setBackgroundDrawableResource(android.R.color.transparent) + setCanceledOnTouchOutside(false) + initClick() + } + + private fun initClick() { + binding.dialogOkBtn.setOnClickListener { + when (starType) { + 1, 2, 3 -> { + sendFeedback( + mContext, + "motaleb3024@gmail.com", + mContext.getString(R.string.app_name) + ) + } + + 4, 5 -> { + openGooglePlay(mContext, mContext.packageName) + } + } + dismiss() + + AnalysisUtil + } + binding.dialogCancelBtn.setOnClickListener { + dismiss() + } + val stars = + arrayOf(binding.star1, binding.star2, binding.star3, binding.star4, binding.star5) + + stars.forEachIndexed { index, imageView -> + //由于数组索引从0开始,而星星的评分从1开始,因此需要将index加1 + imageView.setOnClickListener { + starType = index + 1 + updateStarUi(starType) + } + } + } + + private fun updateStarUi(type: Int) { + val stars = arrayOf( + binding.star1Img, + binding.star2Img, + binding.star3Img, + binding.star4Img, + binding.star5Img + ) + stars.forEachIndexed { index, imageView -> + //当前索引是否小于type,如果是,则表示该星星需要被选中,否则表示该星星未被选中。 + val resource = + if (index < type) R.drawable.star_select_icon else R.drawable.star_unselect_icon + imageView.setImageResource(resource) + } + } +} diff --git a/app/src/main/res/drawable/drw_rating_dialog_bg.xml b/app/src/main/res/drawable/drw_rating_dialog_bg.xml new file mode 100644 index 0000000..ea089cc --- /dev/null +++ b/app/src/main/res/drawable/drw_rating_dialog_bg.xml @@ -0,0 +1,8 @@ + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/star_select_icon.xml b/app/src/main/res/drawable/star_select_icon.xml new file mode 100644 index 0000000..a1adedd --- /dev/null +++ b/app/src/main/res/drawable/star_select_icon.xml @@ -0,0 +1,13 @@ + + + + + + diff --git a/app/src/main/res/drawable/star_unselect_icon.xml b/app/src/main/res/drawable/star_unselect_icon.xml new file mode 100644 index 0000000..fa6775b --- /dev/null +++ b/app/src/main/res/drawable/star_unselect_icon.xml @@ -0,0 +1,16 @@ + + + + + + diff --git a/app/src/main/res/layout/activity_settings.xml b/app/src/main/res/layout/activity_settings.xml index 6fbd31d..4b211d6 100644 --- a/app/src/main/res/layout/activity_settings.xml +++ b/app/src/main/res/layout/activity_settings.xml @@ -108,6 +108,33 @@ android:src="@drawable/back_icon" /> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/mipmap-xxhdpi/rating_img.png b/app/src/main/res/mipmap-xxhdpi/rating_img.png new file mode 100644 index 0000000000000000000000000000000000000000..8857f8cab69f99ff9e0c324fe41adb86e5f29aa9 GIT binary patch literal 25822 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 literal 0 HcmV?d00001 diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 172466a..1e59cbd 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -14,6 +14,7 @@ Search About Feedback + Rate Us Share Privacy Policy Terms of Service @@ -54,4 +55,7 @@ Created successfully This song already exists in this playlist. Successfully added to the playlist + Thank you for using our app. If you enjoy our service, please give us a five-star rating. Your feedback is very important to us! + Five-Star Rating + Rate the app \ No newline at end of file