diff --git a/app/build.gradle b/app/build.gradle
index f92862ea9..04138bfcf 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -41,6 +41,15 @@ android {
versionNameSuffix ' DEBUG'
}
}
+ flavorDimensions "version"
+ productFlavors {
+ normal {
+ dimension "version"
+ }
+ fdroid {
+ dimension "version"
+ }
+ }
buildFeatures{
viewBinding true
@@ -95,11 +104,11 @@ dependencies {
implementation 'androidx.core:core-ktx:1.8.0'
implementation 'androidx.palette:palette-ktx:1.0.0'
- //Cast Dependencies
implementation 'androidx.mediarouter:mediarouter:1.3.0'
- implementation 'com.google.android.gms:play-services-cast-framework:21.0.1'
+ //Cast Dependencies
+ normalImplementation 'com.google.android.gms:play-services-cast-framework:21.0.1'
//WebServer by NanoHttpd
- implementation "org.nanohttpd:nanohttpd:2.3.1"
+ normalImplementation "org.nanohttpd:nanohttpd:2.3.1"
implementation "androidx.navigation:navigation-runtime-ktx:$navigation_version"
implementation "androidx.navigation:navigation-fragment-ktx:$navigation_version"
@@ -117,8 +126,8 @@ dependencies {
implementation "androidx.core:core-splashscreen:1.0.0-rc01"
- implementation 'com.google.android.play:feature-delivery:2.0.0'
- implementation 'com.google.android.play:review:2.0.0'
+ normalImplementation 'com.google.android.play:feature-delivery:2.0.0'
+ normalImplementation 'com.google.android.play:review:2.0.0'
implementation "com.google.android.material:material:$mdc_version"
@@ -160,7 +169,7 @@ dependencies {
implementation 'org.eclipse.mylyn.github:org.eclipse.egit.github.core:2.1.5'
implementation 'com.github.Adonai:jaudiotagger:2.3.15'
- implementation 'com.anjlab.android.iab.v3:library:2.0.3'
+ normalImplementation 'com.anjlab.android.iab.v3:library:2.0.3'
implementation 'com.r0adkll:slidableactivity:2.1.0'
implementation 'com.heinrichreimersoftware:material-intro:2.0.0'
implementation 'com.github.dhaval2404:imagepicker:2.1'
diff --git a/app/src/fdroid/java/code/name/monkey/retromusic/activities/base/AbsCastActivity.kt b/app/src/fdroid/java/code/name/monkey/retromusic/activities/base/AbsCastActivity.kt
new file mode 100644
index 000000000..def9a7050
--- /dev/null
+++ b/app/src/fdroid/java/code/name/monkey/retromusic/activities/base/AbsCastActivity.kt
@@ -0,0 +1,5 @@
+package code.name.monkey.retromusic.activities.base
+
+
+abstract class AbsCastActivity : AbsSlidingMusicPanelActivity() {
+}
\ No newline at end of file
diff --git a/app/src/fdroid/java/code/name/monkey/retromusic/billing/BillingManager.kt b/app/src/fdroid/java/code/name/monkey/retromusic/billing/BillingManager.kt
new file mode 100644
index 000000000..fa2402ef0
--- /dev/null
+++ b/app/src/fdroid/java/code/name/monkey/retromusic/billing/BillingManager.kt
@@ -0,0 +1,9 @@
+package code.name.monkey.retromusic.billing
+
+class BillingManager {
+
+ fun release() {}
+
+ val isProVersion: Boolean
+ get() = true
+}
\ No newline at end of file
diff --git a/app/src/fdroid/java/code/name/monkey/retromusic/cast/RetroWebServer.kt b/app/src/fdroid/java/code/name/monkey/retromusic/cast/RetroWebServer.kt
new file mode 100644
index 000000000..03103dfb7
--- /dev/null
+++ b/app/src/fdroid/java/code/name/monkey/retromusic/cast/RetroWebServer.kt
@@ -0,0 +1,6 @@
+package code.name.monkey.retromusic.cast
+
+import android.content.Context
+
+@Suppress("UNUSED_PARAMETER")
+class RetroWebServer(context: Context)
\ No newline at end of file
diff --git a/app/src/fdroid/java/code/name/monkey/retromusic/extensions/extensions.kt b/app/src/fdroid/java/code/name/monkey/retromusic/extensions/extensions.kt
new file mode 100644
index 000000000..3d93f388c
--- /dev/null
+++ b/app/src/fdroid/java/code/name/monkey/retromusic/extensions/extensions.kt
@@ -0,0 +1,15 @@
+@file:Suppress("UNUSED_PARAMETER", "unused")
+
+package code.name.monkey.retromusic.extensions
+
+import android.content.Context
+import android.view.Menu
+import androidx.fragment.app.FragmentActivity
+
+fun Context.setUpMediaRouteButton(menu: Menu) {}
+
+fun FragmentActivity.installLanguageAndRecreate(code: String) {}
+
+fun Context.goToProVersion() {}
+
+fun Context.installSplitCompat() {}
\ No newline at end of file
diff --git a/app/src/fdroid/java/code/name/monkey/retromusic/service/CastPlayer.kt b/app/src/fdroid/java/code/name/monkey/retromusic/service/CastPlayer.kt
new file mode 100644
index 000000000..3a0eaca28
--- /dev/null
+++ b/app/src/fdroid/java/code/name/monkey/retromusic/service/CastPlayer.kt
@@ -0,0 +1,47 @@
+package code.name.monkey.retromusic.service
+
+import code.name.monkey.retromusic.model.Song
+import code.name.monkey.retromusic.service.playback.Playback
+
+// Empty CastPlayer implementation
+class CastPlayer : Playback {
+ override val isInitialized: Boolean
+ get() = true
+ override val isPlaying: Boolean
+ get() = true
+ override val audioSessionId: Int
+ get() = 0
+
+ override fun setDataSource(
+ song: Song,
+ force: Boolean,
+ completion: (success: Boolean) -> Unit,
+ ) {
+ }
+
+ override fun setNextDataSource(path: String?) {}
+
+ override var callbacks: Playback.PlaybackCallbacks? = null
+
+ override fun start() = true
+
+ override fun stop() {}
+
+ override fun release() {}
+
+ override fun pause(): Boolean = true
+
+ override fun duration() = 0
+
+ override fun position() = 0
+
+ override fun seek(whereto: Int) = whereto
+
+ override fun setVolume(vol: Float) = true
+
+ override fun setAudioSessionId(sessionId: Int) = true
+
+ override fun setCrossFadeDuration(duration: Int) {}
+
+ override fun setPlaybackSpeedPitch(speed: Float, pitch: Float) {}
+}
\ No newline at end of file
diff --git a/app/src/fdroid/java/code/name/monkey/retromusic/util/AppRater.kt b/app/src/fdroid/java/code/name/monkey/retromusic/util/AppRater.kt
new file mode 100644
index 000000000..2691d70b2
--- /dev/null
+++ b/app/src/fdroid/java/code/name/monkey/retromusic/util/AppRater.kt
@@ -0,0 +1,8 @@
+package code.name.monkey.retromusic.util
+
+import android.content.Context
+
+@Suppress("UNUSED_PARAMETER")
+object AppRater {
+ fun appLaunched(context: Context) {}
+}
\ No newline at end of file
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index efbc081f6..b8eb2170a 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -120,7 +120,6 @@
-
diff --git a/app/src/main/java/code/name/monkey/retromusic/App.kt b/app/src/main/java/code/name/monkey/retromusic/App.kt
index f92442df4..b60870b52 100644
--- a/app/src/main/java/code/name/monkey/retromusic/App.kt
+++ b/app/src/main/java/code/name/monkey/retromusic/App.kt
@@ -19,20 +19,17 @@ import androidx.preference.PreferenceManager
import cat.ereza.customactivityoncrash.config.CaocConfig
import code.name.monkey.appthemehelper.ThemeStore
import code.name.monkey.appthemehelper.util.VersionUtils
-import code.name.monkey.retromusic.Constants.PRO_VERSION_PRODUCT_ID
import code.name.monkey.retromusic.activities.ErrorActivity
import code.name.monkey.retromusic.activities.MainActivity
import code.name.monkey.retromusic.appshortcuts.DynamicShortcutManager
-import code.name.monkey.retromusic.extensions.showToast
+import code.name.monkey.retromusic.billing.BillingManager
import code.name.monkey.retromusic.helper.WallpaperAccentManager
-import com.anjlab.android.iab.v3.BillingProcessor
-import com.anjlab.android.iab.v3.PurchaseInfo
import org.koin.android.ext.koin.androidContext
import org.koin.core.context.startKoin
class App : Application() {
- lateinit var billingProcessor: BillingProcessor
+ lateinit var billingManager: BillingManager
private val wallpaperAccentManager = WallpaperAccentManager(this)
override fun onCreate() {
@@ -55,33 +52,18 @@ class App : Application() {
if (VersionUtils.hasNougatMR())
DynamicShortcutManager(this).initDynamicShortcuts()
- // automatically restores purchases
- billingProcessor = BillingProcessor(
- this, BuildConfig.GOOGLE_PLAY_LICENSING_KEY,
- object : BillingProcessor.IBillingHandler {
- override fun onProductPurchased(productId: String, details: PurchaseInfo?) {}
-
- override fun onPurchaseHistoryRestored() {
- showToast(R.string.restored_previous_purchase_please_restart)
- }
-
- override fun onBillingError(errorCode: Int, error: Throwable?) {}
-
- override fun onBillingInitialized() {}
- })
-
// setting Error activity
CaocConfig.Builder.create().errorActivity(ErrorActivity::class.java)
.restartActivity(MainActivity::class.java).apply()
// Set Default values for now playing preferences
- // This will reduce start time for now playing settings fragment as Preference listener of AbsSlidingMusicPanelActivity won't be called
+ // This will reduce startup time for now playing settings fragment as Preference listener of AbsSlidingMusicPanelActivity won't be called
PreferenceManager.setDefaultValues(this, R.xml.pref_now_playing_screen, false)
}
override fun onTerminate() {
super.onTerminate()
- billingProcessor.release()
+ billingManager.release()
wallpaperAccentManager.release()
}
@@ -93,9 +75,7 @@ class App : Application() {
}
fun isProVersion(): Boolean {
- return BuildConfig.DEBUG || instance?.billingProcessor!!.isPurchased(
- PRO_VERSION_PRODUCT_ID
- )
+ return BuildConfig.DEBUG || instance?.billingManager!!.isProVersion
}
}
}
diff --git a/app/src/main/java/code/name/monkey/retromusic/activities/SupportDevelopmentActivity.kt b/app/src/main/java/code/name/monkey/retromusic/activities/SupportDevelopmentActivity.kt
index 377cbec93..e0d67a21f 100644
--- a/app/src/main/java/code/name/monkey/retromusic/activities/SupportDevelopmentActivity.kt
+++ b/app/src/main/java/code/name/monkey/retromusic/activities/SupportDevelopmentActivity.kt
@@ -14,41 +14,23 @@
*/
package code.name.monkey.retromusic.activities
-import android.graphics.Paint
import android.os.Bundle
-import android.util.Log
-import android.view.LayoutInflater
import android.view.MenuItem
-import android.view.ViewGroup
-import android.widget.TextView
-import androidx.core.view.isVisible
-import androidx.recyclerview.widget.DefaultItemAnimator
-import androidx.recyclerview.widget.GridLayoutManager
-import androidx.recyclerview.widget.RecyclerView
-import code.name.monkey.appthemehelper.util.ATHUtil
-import code.name.monkey.appthemehelper.util.TintHelper
import code.name.monkey.appthemehelper.util.ToolbarContentTintHelper
-import code.name.monkey.retromusic.BuildConfig
-import code.name.monkey.retromusic.R
import code.name.monkey.retromusic.activities.base.AbsThemeActivity
import code.name.monkey.retromusic.databinding.ActivityDonationBinding
-import code.name.monkey.retromusic.databinding.ItemDonationOptionBinding
-import code.name.monkey.retromusic.extensions.*
-import com.anjlab.android.iab.v3.BillingProcessor
-import com.anjlab.android.iab.v3.PurchaseInfo
-import com.anjlab.android.iab.v3.SkuDetails
+import code.name.monkey.retromusic.extensions.setStatusBarColorAuto
+import code.name.monkey.retromusic.extensions.setTaskDescriptionColorAuto
+import code.name.monkey.retromusic.extensions.surfaceColor
-class SupportDevelopmentActivity : AbsThemeActivity(), BillingProcessor.IBillingHandler {
+class SupportDevelopmentActivity : AbsThemeActivity() {
lateinit var binding: ActivityDonationBinding
companion object {
val TAG: String = SupportDevelopmentActivity::class.java.simpleName
- const val DONATION_PRODUCT_IDS = R.array.donation_ids
}
- var billingProcessor: BillingProcessor? = null
-
override fun onOptionsItemSelected(item: MenuItem): Boolean {
if (item.itemId == android.R.id.home) {
onBackPressed()
@@ -57,11 +39,6 @@ class SupportDevelopmentActivity : AbsThemeActivity(), BillingProcessor.IBilling
return super.onOptionsItemSelected(item)
}
- fun donate(i: Int) {
- val ids = resources.getStringArray(DONATION_PRODUCT_IDS)
- billingProcessor?.purchase(this, ids[i])
- }
-
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = ActivityDonationBinding.inflate(layoutInflater)
@@ -72,148 +49,11 @@ class SupportDevelopmentActivity : AbsThemeActivity(), BillingProcessor.IBilling
setupToolbar()
- billingProcessor = BillingProcessor(this, BuildConfig.GOOGLE_PLAY_LICENSING_KEY, this)
- TintHelper.setTint(binding.progress, accentColor())
- binding.donation.setTextColor(accentColor())
}
private fun setupToolbar() {
- val toolbarColor = surfaceColor()
- binding.toolbar.setBackgroundColor(toolbarColor)
+ binding.toolbar.setBackgroundColor(surfaceColor())
ToolbarContentTintHelper.colorBackButton(binding.toolbar)
setSupportActionBar(binding.toolbar)
}
-
- override fun onBillingInitialized() {
- loadSkuDetails()
- }
-
- private fun loadSkuDetails() {
- binding.progressContainer.isVisible = true
- binding.recyclerView.isVisible = false
- val ids = resources.getStringArray(DONATION_PRODUCT_IDS)
- billingProcessor!!.getPurchaseListingDetailsAsync(
- ArrayList(listOf(*ids)),
- object : BillingProcessor.ISkuDetailsResponseListener {
- override fun onSkuDetailsResponse(skuDetails: MutableList?) {
- if (skuDetails == null || skuDetails.isEmpty()) {
- binding.progressContainer.isVisible = false
- return
- }
-
- binding.progressContainer.isVisible = false
- binding.recyclerView.apply {
- itemAnimator = DefaultItemAnimator()
- layoutManager = GridLayoutManager(this@SupportDevelopmentActivity, 2)
- adapter = SkuDetailsAdapter(this@SupportDevelopmentActivity, skuDetails)
- isVisible = true
- }
- }
-
- override fun onSkuDetailsError(error: String?) {
- Log.e(TAG, error.toString())
- }
- })
- }
-
- override fun onProductPurchased(productId: String, details: PurchaseInfo?) {
- // loadSkuDetails();
- showToast(R.string.thank_you)
- }
-
- override fun onBillingError(errorCode: Int, error: Throwable?) {
- Log.e(TAG, "Billing error: code = $errorCode", error)
- }
-
- override fun onPurchaseHistoryRestored() {
- // loadSkuDetails();
- showToast(R.string.restored_previous_purchases)
- }
-
- override fun onDestroy() {
- billingProcessor?.release()
- super.onDestroy()
- }
-}
-
-class SkuDetailsAdapter(
- private var donationsDialog: SupportDevelopmentActivity,
- objects: List,
-) : RecyclerView.Adapter() {
-
- private var skuDetailsList: List = ArrayList()
-
- init {
- skuDetailsList = objects
- }
-
- private fun getIcon(position: Int): Int {
- return when (position) {
- 0 -> R.drawable.ic_cookie
- 1 -> R.drawable.ic_take_away
- 2 -> R.drawable.ic_take_away_coffe
- 3 -> R.drawable.ic_beer
- 4 -> R.drawable.ic_fast_food_meal
- 5 -> R.drawable.ic_popcorn
- 6 -> R.drawable.ic_card_giftcard
- 7 -> R.drawable.ic_food_croissant
- else -> R.drawable.ic_card_giftcard
- }
- }
-
- override fun onCreateViewHolder(viewGroup: ViewGroup, i: Int): ViewHolder {
- return ViewHolder(
- ItemDonationOptionBinding.inflate(
- LayoutInflater.from(donationsDialog),
- viewGroup,
- false
- )
- )
- }
-
- override fun onBindViewHolder(viewHolder: ViewHolder, i: Int) {
- val skuDetails = skuDetailsList[i]
- with(viewHolder.binding) {
- itemTitle.text = skuDetails.title.replace("(Retro Music Player MP3 Player)", "")
- .trim { it <= ' ' }
- itemText.text = skuDetails.description
- itemText.isVisible = false
- itemPrice.text = skuDetails.priceText
- itemImage.setImageResource(getIcon(i))
- }
-
- val purchased = donationsDialog.billingProcessor!!.isPurchased(skuDetails.productId)
- val titleTextColor = if (purchased) ATHUtil.resolveColor(
- donationsDialog,
- android.R.attr.textColorHint
- ) else donationsDialog.textColorPrimary()
- val contentTextColor =
- if (purchased) titleTextColor else donationsDialog.textColorSecondary()
-
- with(viewHolder.binding) {
- itemTitle.setTextColor(titleTextColor)
- itemText.setTextColor(contentTextColor)
- itemPrice.setTextColor(titleTextColor)
- strikeThrough(itemTitle, purchased)
- strikeThrough(itemText, purchased)
- strikeThrough(itemPrice, purchased)
- }
-
- viewHolder.itemView.isEnabled = !purchased
- viewHolder.itemView.setOnClickListener { donationsDialog.donate(i) }
- }
-
- override fun getItemCount(): Int {
- return skuDetailsList.size
- }
-
- class ViewHolder(val binding: ItemDonationOptionBinding) : RecyclerView.ViewHolder(binding.root)
-
- companion object {
- private fun strikeThrough(textView: TextView, strikeThrough: Boolean) {
- textView.paintFlags =
- if (strikeThrough) textView.paintFlags or Paint.STRIKE_THRU_TEXT_FLAG
- else textView.paintFlags and Paint.STRIKE_THRU_TEXT_FLAG.inv()
- }
- }
}
diff --git a/app/src/main/java/code/name/monkey/retromusic/activities/base/AbsThemeActivity.kt b/app/src/main/java/code/name/monkey/retromusic/activities/base/AbsThemeActivity.kt
index 772a8cc38..ca112a6d4 100644
--- a/app/src/main/java/code/name/monkey/retromusic/activities/base/AbsThemeActivity.kt
+++ b/app/src/main/java/code/name/monkey/retromusic/activities/base/AbsThemeActivity.kt
@@ -31,7 +31,6 @@ import code.name.monkey.retromusic.util.PreferenceUtil
import code.name.monkey.retromusic.util.maybeShowAnnoyingToasts
import code.name.monkey.retromusic.util.theme.getNightMode
import code.name.monkey.retromusic.util.theme.getThemeResValue
-import com.google.android.play.core.splitcompat.SplitCompat
import java.util.*
abstract class AbsThemeActivity : ATHToolbarActivity(), Runnable {
@@ -105,6 +104,6 @@ abstract class AbsThemeActivity : ATHToolbarActivity(), Runnable {
Locale.forLanguageTag(code)
}
super.attachBaseContext(LanguageContextWrapper.wrap(newBase, locale))
- SplitCompat.install(this)
+ installSplitCompat()
}
}
diff --git a/app/src/main/java/code/name/monkey/retromusic/dialogs/SleepTimerDialog.kt b/app/src/main/java/code/name/monkey/retromusic/dialogs/SleepTimerDialog.kt
index 6a44e4638..32de5ba6c 100755
--- a/app/src/main/java/code/name/monkey/retromusic/dialogs/SleepTimerDialog.kt
+++ b/app/src/main/java/code/name/monkey/retromusic/dialogs/SleepTimerDialog.kt
@@ -95,7 +95,7 @@ class SleepTimerDialog : DialogFragment() {
shouldFinishLastSong.isVisible = false
timerUpdater.start()
setPositiveButton(android.R.string.ok, null)
- setNegativeButton(R.string.cast_stop) { _, _ ->
+ setNegativeButton(R.string.action_cancel) { _, _ ->
timerUpdater.cancel()
val previous = makeTimerPendingIntent(PendingIntent.FLAG_NO_CREATE)
if (previous != null) {
diff --git a/app/src/main/java/code/name/monkey/retromusic/fragments/albums/AlbumsFragment.kt b/app/src/main/java/code/name/monkey/retromusic/fragments/albums/AlbumsFragment.kt
index 55a8bb88d..ed00699a5 100644
--- a/app/src/main/java/code/name/monkey/retromusic/fragments/albums/AlbumsFragment.kt
+++ b/app/src/main/java/code/name/monkey/retromusic/fragments/albums/AlbumsFragment.kt
@@ -24,6 +24,7 @@ import androidx.recyclerview.widget.GridLayoutManager
import code.name.monkey.retromusic.EXTRA_ALBUM_ID
import code.name.monkey.retromusic.R
import code.name.monkey.retromusic.adapter.album.AlbumAdapter
+import code.name.monkey.retromusic.extensions.setUpMediaRouteButton
import code.name.monkey.retromusic.extensions.surfaceColor
import code.name.monkey.retromusic.fragments.GridStyle
import code.name.monkey.retromusic.fragments.ReloadType
@@ -41,7 +42,6 @@ import com.afollestad.materialcab.attached.AttachedCab
import com.afollestad.materialcab.attached.destroy
import com.afollestad.materialcab.attached.isActive
import com.afollestad.materialcab.createCab
-import com.google.android.gms.cast.framework.CastButtonFactory
class AlbumsFragment : AbsRecyclerViewCustomGridSizeFragment(),
IAlbumClickListener, ICabHolder {
@@ -169,7 +169,7 @@ class AlbumsFragment : AbsRecyclerViewCustomGridSizeFragment(),
IArtistClickListener, IAlbumArtistClickListener, ICabHolder {
@@ -180,7 +180,7 @@ class ArtistsFragment : AbsRecyclerViewCustomGridSizeFragment(),
menu.removeItem(R.id.action_sort_order)
menu.findItem(R.id.action_settings).setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM)
//Setting up cast button
- CastButtonFactory.setUpMediaRouteButton(requireContext(), menu, R.id.action_cast)
+ requireContext().setUpMediaRouteButton(menu)
}
override fun onResume() {
diff --git a/app/src/main/java/code/name/monkey/retromusic/fragments/home/HomeFragment.kt b/app/src/main/java/code/name/monkey/retromusic/fragments/home/HomeFragment.kt
index 6d42e2801..4a915690e 100644
--- a/app/src/main/java/code/name/monkey/retromusic/fragments/home/HomeFragment.kt
+++ b/app/src/main/java/code/name/monkey/retromusic/fragments/home/HomeFragment.kt
@@ -35,10 +35,7 @@ import code.name.monkey.retromusic.adapter.HomeAdapter
import code.name.monkey.retromusic.databinding.FragmentHomeBinding
import code.name.monkey.retromusic.dialogs.CreatePlaylistDialog
import code.name.monkey.retromusic.dialogs.ImportPlaylistDialog
-import code.name.monkey.retromusic.extensions.accentColor
-import code.name.monkey.retromusic.extensions.dip
-import code.name.monkey.retromusic.extensions.drawNextToNavbar
-import code.name.monkey.retromusic.extensions.elevatedAccentColor
+import code.name.monkey.retromusic.extensions.*
import code.name.monkey.retromusic.fragments.ReloadType
import code.name.monkey.retromusic.fragments.base.AbsMainActivityFragment
import code.name.monkey.retromusic.glide.GlideApp
@@ -48,7 +45,6 @@ import code.name.monkey.retromusic.interfaces.IScrollHelper
import code.name.monkey.retromusic.model.Song
import code.name.monkey.retromusic.util.PreferenceUtil
import code.name.monkey.retromusic.util.PreferenceUtil.userName
-import com.google.android.gms.cast.framework.CastButtonFactory
import com.google.android.material.shape.MaterialShapeDrawable
import com.google.android.material.transition.MaterialFadeThrough
import com.google.android.material.transition.MaterialSharedAxis
@@ -212,7 +208,7 @@ class HomeFragment :
ATHToolbarActivity.getToolbarBackgroundColor(binding.toolbar)
)
//Setting up cast button
- CastButtonFactory.setUpMediaRouteButton(requireContext(), menu, R.id.action_cast)
+ requireContext().setUpMediaRouteButton(menu)
}
override fun scrollToTop() {
diff --git a/app/src/main/java/code/name/monkey/retromusic/fragments/library/LibraryFragment.kt b/app/src/main/java/code/name/monkey/retromusic/fragments/library/LibraryFragment.kt
index eb66ca5b6..c5b02c973 100644
--- a/app/src/main/java/code/name/monkey/retromusic/fragments/library/LibraryFragment.kt
+++ b/app/src/main/java/code/name/monkey/retromusic/fragments/library/LibraryFragment.kt
@@ -30,11 +30,11 @@ import code.name.monkey.retromusic.R
import code.name.monkey.retromusic.databinding.FragmentLibraryBinding
import code.name.monkey.retromusic.dialogs.CreatePlaylistDialog
import code.name.monkey.retromusic.dialogs.ImportPlaylistDialog
+import code.name.monkey.retromusic.extensions.setUpMediaRouteButton
import code.name.monkey.retromusic.extensions.whichFragment
import code.name.monkey.retromusic.fragments.base.AbsMainActivityFragment
import code.name.monkey.retromusic.model.CategoryInfo
import code.name.monkey.retromusic.util.PreferenceUtil
-import com.google.android.gms.cast.framework.CastButtonFactory
class LibraryFragment : AbsMainActivityFragment(R.layout.fragment_library) {
@@ -99,7 +99,7 @@ class LibraryFragment : AbsMainActivityFragment(R.layout.fragment_library) {
getToolbarBackgroundColor(binding.toolbar)
)
//Setting up cast button
- CastButtonFactory.setUpMediaRouteButton(requireContext(), menu, R.id.action_cast)
+ requireContext().setUpMediaRouteButton(menu)
}
override fun onMenuItemSelected(item: MenuItem): Boolean {
diff --git a/app/src/main/java/code/name/monkey/retromusic/fragments/playlists/PlaylistsFragment.kt b/app/src/main/java/code/name/monkey/retromusic/fragments/playlists/PlaylistsFragment.kt
index 2c212d039..bf74cee56 100644
--- a/app/src/main/java/code/name/monkey/retromusic/fragments/playlists/PlaylistsFragment.kt
+++ b/app/src/main/java/code/name/monkey/retromusic/fragments/playlists/PlaylistsFragment.kt
@@ -24,13 +24,13 @@ import code.name.monkey.retromusic.EXTRA_PLAYLIST
import code.name.monkey.retromusic.R
import code.name.monkey.retromusic.adapter.playlist.PlaylistAdapter
import code.name.monkey.retromusic.db.PlaylistWithSongs
+import code.name.monkey.retromusic.extensions.setUpMediaRouteButton
import code.name.monkey.retromusic.fragments.ReloadType
import code.name.monkey.retromusic.fragments.base.AbsRecyclerViewCustomGridSizeFragment
import code.name.monkey.retromusic.helper.SortOrder.PlaylistSortOrder
import code.name.monkey.retromusic.interfaces.IPlaylistClickListener
import code.name.monkey.retromusic.util.PreferenceUtil
import code.name.monkey.retromusic.util.RetroUtil
-import com.google.android.gms.cast.framework.CastButtonFactory
import com.google.android.material.transition.MaterialSharedAxis
class PlaylistsFragment :
@@ -85,7 +85,7 @@ class PlaylistsFragment :
setUpSortOrderMenu(menu.findItem(R.id.action_sort_order).subMenu)
MenuCompat.setGroupDividerEnabled(menu, true)
//Setting up cast button
- CastButtonFactory.setUpMediaRouteButton(requireContext(), menu, R.id.action_cast)
+ requireContext().setUpMediaRouteButton(menu)
}
override fun onMenuItemSelected(item: MenuItem): Boolean {
diff --git a/app/src/main/java/code/name/monkey/retromusic/fragments/settings/AbsSettingsFragment.kt b/app/src/main/java/code/name/monkey/retromusic/fragments/settings/AbsSettingsFragment.kt
index af3e4a74b..b3688f609 100644
--- a/app/src/main/java/code/name/monkey/retromusic/fragments/settings/AbsSettingsFragment.kt
+++ b/app/src/main/java/code/name/monkey/retromusic/fragments/settings/AbsSettingsFragment.kt
@@ -26,6 +26,7 @@ import androidx.preference.PreferenceManager
import code.name.monkey.appthemehelper.common.prefs.supportv7.ATEPreferenceFragmentCompat
import code.name.monkey.retromusic.R
import code.name.monkey.retromusic.extensions.dip
+import code.name.monkey.retromusic.extensions.goToProVersion
import code.name.monkey.retromusic.extensions.showToast
import code.name.monkey.retromusic.preferences.*
import code.name.monkey.retromusic.util.NavigationUtil
@@ -39,7 +40,7 @@ abstract class AbsSettingsFragment : ATEPreferenceFragmentCompat() {
internal fun showProToastAndNavigate(message: String) {
showToast(getString(R.string.message_pro_feature, message))
- NavigationUtil.goToProVersion(requireActivity())
+ requireContext().goToProVersion()
}
internal fun setSummary(preference: Preference, value: Any?) {
diff --git a/app/src/main/java/code/name/monkey/retromusic/fragments/settings/MainSettingsFragment.kt b/app/src/main/java/code/name/monkey/retromusic/fragments/settings/MainSettingsFragment.kt
index aff3f4779..fa58c0bd2 100644
--- a/app/src/main/java/code/name/monkey/retromusic/fragments/settings/MainSettingsFragment.kt
+++ b/app/src/main/java/code/name/monkey/retromusic/fragments/settings/MainSettingsFragment.kt
@@ -27,6 +27,7 @@ import code.name.monkey.retromusic.App
import code.name.monkey.retromusic.R
import code.name.monkey.retromusic.databinding.FragmentMainSettingsBinding
import code.name.monkey.retromusic.extensions.drawAboveSystemBarsWithPadding
+import code.name.monkey.retromusic.extensions.goToProVersion
import code.name.monkey.retromusic.util.NavigationUtil
class MainSettingsFragment : Fragment(), View.OnClickListener {
@@ -77,11 +78,11 @@ class MainSettingsFragment : Fragment(), View.OnClickListener {
binding.buyProContainer.apply {
isGone = App.isProVersion()
setOnClickListener {
- NavigationUtil.goToProVersion(requireContext())
+ requireContext().goToProVersion()
}
}
binding.buyPremium.setOnClickListener {
- NavigationUtil.goToProVersion(requireContext())
+ requireContext().goToProVersion()
}
ThemeStore.accentColor(requireContext()).let {
binding.buyPremium.setTextColor(it)
diff --git a/app/src/main/java/code/name/monkey/retromusic/fragments/settings/OtherSettingsFragment.kt b/app/src/main/java/code/name/monkey/retromusic/fragments/settings/OtherSettingsFragment.kt
index 9164b3156..554bc674a 100644
--- a/app/src/main/java/code/name/monkey/retromusic/fragments/settings/OtherSettingsFragment.kt
+++ b/app/src/main/java/code/name/monkey/retromusic/fragments/settings/OtherSettingsFragment.kt
@@ -21,12 +21,10 @@ import code.name.monkey.appthemehelper.common.prefs.supportv7.ATEListPreference
import code.name.monkey.retromusic.LANGUAGE_NAME
import code.name.monkey.retromusic.LAST_ADDED_CUTOFF
import code.name.monkey.retromusic.R
+import code.name.monkey.retromusic.extensions.installLanguageAndRecreate
import code.name.monkey.retromusic.fragments.LibraryViewModel
import code.name.monkey.retromusic.fragments.ReloadType.HomeSections
-import com.google.android.play.core.splitinstall.SplitInstallManagerFactory
-import com.google.android.play.core.splitinstall.SplitInstallRequest
import org.koin.androidx.viewmodel.ext.android.sharedViewModel
-import java.util.*
/**
* @author Hemanth S (h4h13).
@@ -58,21 +56,7 @@ class OtherSettingsFragment : AbsSettingsFragment() {
val languagePreference: Preference? = findPreference(LANGUAGE_NAME)
languagePreference?.setOnPreferenceChangeListener { prefs, newValue ->
setSummary(prefs, newValue)
- val code = newValue.toString()
- val manager = SplitInstallManagerFactory.create(requireContext())
- if (code != "auto") {
- // Try to download language resources
- val request =
- SplitInstallRequest.newBuilder().addLanguage(Locale.forLanguageTag(code))
- .build()
- manager.startInstall(request)
- // Recreate the activity on download complete
- .addOnCompleteListener {
- restartActivity()
- }
- } else {
- requireActivity().recreate()
- }
+ requireActivity().installLanguageAndRecreate(newValue.toString())
true
}
}
diff --git a/app/src/main/java/code/name/monkey/retromusic/fragments/songs/SongsFragment.kt b/app/src/main/java/code/name/monkey/retromusic/fragments/songs/SongsFragment.kt
index a728e2828..e47efaa1d 100644
--- a/app/src/main/java/code/name/monkey/retromusic/fragments/songs/SongsFragment.kt
+++ b/app/src/main/java/code/name/monkey/retromusic/fragments/songs/SongsFragment.kt
@@ -21,6 +21,7 @@ import androidx.annotation.LayoutRes
import androidx.recyclerview.widget.GridLayoutManager
import code.name.monkey.retromusic.R
import code.name.monkey.retromusic.adapter.song.SongAdapter
+import code.name.monkey.retromusic.extensions.setUpMediaRouteButton
import code.name.monkey.retromusic.extensions.surfaceColor
import code.name.monkey.retromusic.fragments.GridStyle
import code.name.monkey.retromusic.fragments.ReloadType
@@ -35,7 +36,6 @@ import com.afollestad.materialcab.attached.AttachedCab
import com.afollestad.materialcab.attached.destroy
import com.afollestad.materialcab.attached.isActive
import com.afollestad.materialcab.createCab
-import com.google.android.gms.cast.framework.CastButtonFactory
class SongsFragment : AbsRecyclerViewCustomGridSizeFragment(),
ICabHolder {
@@ -136,7 +136,7 @@ class SongsFragment : AbsRecyclerViewCustomGridSizeFragment Unit,
) {
playbackLocation = PlaybackLocation.REMOTE
- switchToPlayback(CastPlayer(castSession), onChange)
+ switchToPlayback(castPlayer, onChange)
}
private fun switchToPlayback(
diff --git a/app/src/main/java/code/name/monkey/retromusic/util/NavigationUtil.kt b/app/src/main/java/code/name/monkey/retromusic/util/NavigationUtil.kt
index 2d960af00..bea599a00 100755
--- a/app/src/main/java/code/name/monkey/retromusic/util/NavigationUtil.kt
+++ b/app/src/main/java/code/name/monkey/retromusic/util/NavigationUtil.kt
@@ -39,12 +39,6 @@ object NavigationUtil {
)
}
- fun goToProVersion(context: Context) {
- context.startActivity(
- Intent(context, PurchaseActivity::class.java), null
- )
- }
-
fun goToSupportDevelopment(activity: Activity) {
activity.startActivity(
Intent(activity, SupportDevelopmentActivity::class.java), null
diff --git a/app/src/main/java/code/name/monkey/retromusic/util/PremiumShow.kt b/app/src/main/java/code/name/monkey/retromusic/util/PremiumShow.kt
deleted file mode 100644
index adcf36971..000000000
--- a/app/src/main/java/code/name/monkey/retromusic/util/PremiumShow.kt
+++ /dev/null
@@ -1,33 +0,0 @@
-package code.name.monkey.retromusic.util
-
-import android.content.Context
-import android.content.Intent
-import code.name.monkey.retromusic.App
-import code.name.monkey.retromusic.activities.PurchaseActivity
-
-object PremiumShow {
- private const val PREF_NAME = "premium_show"
- private const val LAUNCH_COUNT = "launch_count"
- private const val DATE_FIRST_LAUNCH = "date_first_launch"
-
- @JvmStatic
- fun launch(context: Context) {
- val pref = context.getSharedPreferences(PREF_NAME, Context.MODE_PRIVATE)
- if (App.isProVersion()) {
- return
- }
- val prefEditor = pref.edit()
- val launchCount = pref.getLong(LAUNCH_COUNT, 0) + 1
- prefEditor.putLong(LAUNCH_COUNT, launchCount)
-
- var dateLaunched = pref.getLong(DATE_FIRST_LAUNCH, 0)
- if (dateLaunched == 0L) {
- dateLaunched = System.currentTimeMillis()
- prefEditor.putLong(DATE_FIRST_LAUNCH, dateLaunched)
- }
- if (System.currentTimeMillis() >= dateLaunched + 2 * 24 * 60 * 60 * 1000) {
- context.startActivity(Intent(context, PurchaseActivity::class.java), null)
- }
- prefEditor.apply()
- }
-}
\ No newline at end of file
diff --git a/app/src/main/res/layout/activity_donation.xml b/app/src/main/res/layout/activity_donation.xml
index 9f2db5c0c..c69fa30cf 100644
--- a/app/src/main/res/layout/activity_donation.xml
+++ b/app/src/main/res/layout/activity_donation.xml
@@ -1,7 +1,6 @@
@@ -31,52 +30,5 @@
android:overScrollMode="@integer/overScrollMode"
app:layout_behavior="com.google.android.material.appbar.AppBarLayout$ScrollingViewBehavior">
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/app/src/normal/AndroidManifest.xml b/app/src/normal/AndroidManifest.xml
new file mode 100644
index 000000000..855ade12b
--- /dev/null
+++ b/app/src/normal/AndroidManifest.xml
@@ -0,0 +1,9 @@
+
+
+
+
+
+
+
diff --git a/app/src/main/java/code/name/monkey/retromusic/activities/PurchaseActivity.kt b/app/src/normal/java/code/name/monkey/retromusic/activities/PurchaseActivity.kt
similarity index 82%
rename from app/src/main/java/code/name/monkey/retromusic/activities/PurchaseActivity.kt
rename to app/src/normal/java/code/name/monkey/retromusic/activities/PurchaseActivity.kt
index accf2f880..b23e1d62d 100644
--- a/app/src/main/java/code/name/monkey/retromusic/activities/PurchaseActivity.kt
+++ b/app/src/normal/java/code/name/monkey/retromusic/activities/PurchaseActivity.kt
@@ -1,17 +1,3 @@
-/*
- * Copyright (c) 2020 Hemanth Savarla.
- *
- * Licensed under the GNU General Public License v3
- *
- * This is free software: you can redistribute it and/or modify it
- * under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
- *
- * This software is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
- * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
- * See the GNU General Public License for more details.
- *
- */
package code.name.monkey.retromusic.activities
import android.content.res.ColorStateList
@@ -22,7 +8,7 @@ import android.view.MenuItem
import code.name.monkey.appthemehelper.util.MaterialUtil
import code.name.monkey.retromusic.App
import code.name.monkey.retromusic.BuildConfig
-import code.name.monkey.retromusic.Constants.PRO_VERSION_PRODUCT_ID
+import code.name.monkey.retromusic.Constants
import code.name.monkey.retromusic.R
import code.name.monkey.retromusic.activities.base.AbsThemeActivity
import code.name.monkey.retromusic.databinding.ActivityProVersionBinding
@@ -58,7 +44,7 @@ class PurchaseActivity : AbsThemeActivity(), BillingProcessor.IBillingHandler {
restorePurchase()
}
binding.purchaseButton.setOnClickListener {
- billingProcessor.purchase(this@PurchaseActivity, PRO_VERSION_PRODUCT_ID)
+ billingProcessor.purchase(this@PurchaseActivity, Constants.PRO_VERSION_PRODUCT_ID)
}
binding.bannerContainer.backgroundTintList =
ColorStateList.valueOf(accentColor())
@@ -116,4 +102,4 @@ class PurchaseActivity : AbsThemeActivity(), BillingProcessor.IBillingHandler {
companion object {
private const val TAG: String = "PurchaseActivity"
}
-}
+}
\ No newline at end of file
diff --git a/app/src/main/java/code/name/monkey/retromusic/activities/base/AbsCastActivity.kt b/app/src/normal/java/code/name/monkey/retromusic/activities/base/AbsCastActivity.kt
similarity index 93%
rename from app/src/main/java/code/name/monkey/retromusic/activities/base/AbsCastActivity.kt
rename to app/src/normal/java/code/name/monkey/retromusic/activities/base/AbsCastActivity.kt
index 23d668a53..4a2f3aaea 100644
--- a/app/src/main/java/code/name/monkey/retromusic/activities/base/AbsCastActivity.kt
+++ b/app/src/normal/java/code/name/monkey/retromusic/activities/base/AbsCastActivity.kt
@@ -3,6 +3,7 @@ package code.name.monkey.retromusic.activities.base
import code.name.monkey.retromusic.cast.RetroSessionManagerListener
import code.name.monkey.retromusic.cast.RetroWebServer
import code.name.monkey.retromusic.helper.MusicPlayerRemote
+import code.name.monkey.retromusic.service.CastPlayer
import com.google.android.gms.cast.framework.CastContext
import com.google.android.gms.cast.framework.CastSession
import com.google.android.gms.common.ConnectionResult
@@ -37,7 +38,7 @@ abstract class AbsCastActivity : AbsSlidingMusicPanelActivity() {
override fun onSessionStarted(castSession: CastSession, p1: String) {
invalidateOptionsMenu()
mCastSession = castSession
- MusicPlayerRemote.switchToRemotePlayback(castSession)
+ MusicPlayerRemote.switchToRemotePlayback(CastPlayer(castSession))
}
override fun onSessionEnded(castSession: CastSession, p1: Int) {
@@ -53,7 +54,7 @@ abstract class AbsCastActivity : AbsSlidingMusicPanelActivity() {
invalidateOptionsMenu()
mCastSession = castSession
webServer.start()
- MusicPlayerRemote.switchToRemotePlayback(castSession)
+ MusicPlayerRemote.switchToRemotePlayback(CastPlayer(castSession))
}
override fun onSessionSuspended(castSession: CastSession, p1: Int) {
diff --git a/app/src/normal/java/code/name/monkey/retromusic/billing/BillingManager.kt b/app/src/normal/java/code/name/monkey/retromusic/billing/BillingManager.kt
new file mode 100644
index 000000000..445044e73
--- /dev/null
+++ b/app/src/normal/java/code/name/monkey/retromusic/billing/BillingManager.kt
@@ -0,0 +1,37 @@
+package code.name.monkey.retromusic.billing
+
+import android.content.Context
+import code.name.monkey.retromusic.BuildConfig
+import code.name.monkey.retromusic.Constants
+import code.name.monkey.retromusic.R
+import code.name.monkey.retromusic.extensions.showToast
+import com.anjlab.android.iab.v3.BillingProcessor
+import com.anjlab.android.iab.v3.PurchaseInfo
+
+class BillingManager(context: Context) {
+ private val billingProcessor: BillingProcessor
+
+ init {
+ // automatically restores purchases
+ billingProcessor = BillingProcessor(
+ context, BuildConfig.GOOGLE_PLAY_LICENSING_KEY,
+ object : BillingProcessor.IBillingHandler {
+ override fun onProductPurchased(productId: String, details: PurchaseInfo?) {}
+
+ override fun onPurchaseHistoryRestored() {
+ context.showToast(R.string.restored_previous_purchase_please_restart)
+ }
+
+ override fun onBillingError(errorCode: Int, error: Throwable?) {}
+
+ override fun onBillingInitialized() {}
+ })
+ }
+
+ fun release() {
+ billingProcessor.release()
+ }
+
+ val isProVersion: Boolean
+ get() = billingProcessor.isPurchased(Constants.PRO_VERSION_PRODUCT_ID)
+}
\ No newline at end of file
diff --git a/app/src/main/java/code/name/monkey/retromusic/cast/CastHelper.kt b/app/src/normal/java/code/name/monkey/retromusic/cast/CastHelper.kt
similarity index 100%
rename from app/src/main/java/code/name/monkey/retromusic/cast/CastHelper.kt
rename to app/src/normal/java/code/name/monkey/retromusic/cast/CastHelper.kt
diff --git a/app/src/main/java/code/name/monkey/retromusic/cast/CastOptionsProvider.kt b/app/src/normal/java/code/name/monkey/retromusic/cast/CastOptionsProvider.kt
similarity index 100%
rename from app/src/main/java/code/name/monkey/retromusic/cast/CastOptionsProvider.kt
rename to app/src/normal/java/code/name/monkey/retromusic/cast/CastOptionsProvider.kt
diff --git a/app/src/main/java/code/name/monkey/retromusic/cast/RetroSessionManagerListener.kt b/app/src/normal/java/code/name/monkey/retromusic/cast/RetroSessionManagerListener.kt
similarity index 100%
rename from app/src/main/java/code/name/monkey/retromusic/cast/RetroSessionManagerListener.kt
rename to app/src/normal/java/code/name/monkey/retromusic/cast/RetroSessionManagerListener.kt
diff --git a/app/src/main/java/code/name/monkey/retromusic/cast/RetroWebServer.kt b/app/src/normal/java/code/name/monkey/retromusic/cast/RetroWebServer.kt
similarity index 100%
rename from app/src/main/java/code/name/monkey/retromusic/cast/RetroWebServer.kt
rename to app/src/normal/java/code/name/monkey/retromusic/cast/RetroWebServer.kt
diff --git a/app/src/normal/java/code/name/monkey/retromusic/extensions/extensions.kt b/app/src/normal/java/code/name/monkey/retromusic/extensions/extensions.kt
new file mode 100644
index 000000000..3ac58980f
--- /dev/null
+++ b/app/src/normal/java/code/name/monkey/retromusic/extensions/extensions.kt
@@ -0,0 +1,42 @@
+package code.name.monkey.retromusic.extensions
+
+import android.content.Context
+import android.content.Intent
+import android.view.Menu
+import androidx.fragment.app.FragmentActivity
+import code.name.monkey.retromusic.R
+import code.name.monkey.retromusic.activities.PurchaseActivity
+import com.google.android.gms.cast.framework.CastButtonFactory
+import com.google.android.play.core.splitcompat.SplitCompat
+import com.google.android.play.core.splitinstall.SplitInstallManagerFactory
+import com.google.android.play.core.splitinstall.SplitInstallRequest
+import java.util.*
+
+fun Context.setUpMediaRouteButton(menu: Menu) {
+ CastButtonFactory.setUpMediaRouteButton(this, menu, R.id.action_cast)
+}
+
+fun FragmentActivity.installLanguageAndRecreate(code: String) {
+ val manager = SplitInstallManagerFactory.create(this)
+ if (code != "auto") {
+ // Try to download language resources
+ val request =
+ SplitInstallRequest.newBuilder().addLanguage(Locale.forLanguageTag(code))
+ .build()
+ manager.startInstall(request)
+ // Recreate the activity on download complete
+ .addOnCompleteListener {
+ recreate()
+ }
+ } else {
+ recreate()
+ }
+}
+
+fun Context.goToProVersion() {
+ startActivity(Intent(this, PurchaseActivity::class.java))
+}
+
+fun Context.installSplitCompat() {
+ SplitCompat.install(this)
+}
\ No newline at end of file
diff --git a/app/src/main/java/code/name/monkey/retromusic/service/CastPlayer.kt b/app/src/normal/java/code/name/monkey/retromusic/service/CastPlayer.kt
similarity index 100%
rename from app/src/main/java/code/name/monkey/retromusic/service/CastPlayer.kt
rename to app/src/normal/java/code/name/monkey/retromusic/service/CastPlayer.kt
diff --git a/app/src/main/java/code/name/monkey/retromusic/util/AppRater.kt b/app/src/normal/java/code/name/monkey/retromusic/util/AppRater.kt
similarity index 99%
rename from app/src/main/java/code/name/monkey/retromusic/util/AppRater.kt
rename to app/src/normal/java/code/name/monkey/retromusic/util/AppRater.kt
index d6d47270e..1e3423478 100644
--- a/app/src/main/java/code/name/monkey/retromusic/util/AppRater.kt
+++ b/app/src/normal/java/code/name/monkey/retromusic/util/AppRater.kt
@@ -28,7 +28,6 @@ object AppRater {
private const val DAYS_UNTIL_PROMPT = 3//Min number of days
private const val LAUNCHES_UNTIL_PROMPT = 5//Min number of launches
- @JvmStatic
fun appLaunched(context: Activity) {
val prefs = context.getSharedPreferences(APP_RATING, 0)
if (prefs.getBoolean(DO_NOT_SHOW_AGAIN, false)) {