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)) {