From 5a51d0bfc02bfee9c05873c278bdb573db1af793 Mon Sep 17 00:00:00 2001 From: h4h13 Date: Mon, 30 Dec 2019 16:31:50 +0530 Subject: [PATCH] Code refactor --- .../java/code/name/monkey/retromusic/App.kt | 37 +- .../code/name/monkey/retromusic/Result.kt | 2 + .../retromusic/activities/AboutActivity.kt | 27 +- .../activities/AlbumDetailsActivity.kt | 96 ++- .../activities/ArtistDetailActivity.kt | 69 +- .../activities/GenreDetailsActivity.kt | 19 +- .../activities/LicenseActivity.java | 54 +- .../activities/LockScreenActivity.kt | 124 ++-- .../retromusic/activities/LyricsActivity.kt | 114 +-- .../retromusic/activities/MainActivity.kt | 25 +- .../activities/PlayingQueueActivity.kt | 33 +- .../activities/PlaylistDetailActivity.kt | 50 +- .../retromusic/activities/PurchaseActivity.kt | 225 +++--- .../retromusic/activities/SearchActivity.kt | 25 +- .../activities/base/AbsBaseActivity.kt | 233 +++--- .../base/AbsMusicServiceActivity.kt | 272 +++---- .../base/AbsSlidingMusicPanelActivity.kt | 33 +- .../activities/base/AbsThemeActivity.kt | 7 +- .../activities/bugreport/BugReportActivity.kt | 50 +- .../bugreport/model/DeviceInfo.java | 55 +- .../activities/bugreport/model/Report.java | 11 +- .../bugreport/model/github/ExtraInfo.java | 5 +- .../bugreport/model/github/GithubLogin.java | 17 +- .../bugreport/model/github/GithubTarget.java | 11 +- .../activities/saf/SAFGuideActivity.java | 9 +- .../tageditor/AbsTagEditorActivity.kt | 691 +++++++++--------- .../tageditor/AlbumTagEditorActivity.kt | 376 +++++----- .../tageditor/SongTagEditorActivity.kt | 30 +- .../tageditor/WriteTagsAsyncTask.java | 101 ++- .../retromusic/appwidgets/AppWidgetClassic.kt | 348 ++++----- .../retromusic/appwidgets/AppWidgetSmall.kt | 322 ++++---- .../retromusic/dagger/MusicComponent.kt | 32 +- .../dagger/module/ActivityModule.kt | 34 - .../retromusic/dagger/module/AlbumModule.kt | 39 - .../retromusic/dagger/module/AppModule.kt | 7 +- .../retromusic/dagger/module/ArtistModule.kt | 39 - .../retromusic/dagger/module/GenreModule.kt | 40 - .../retromusic/dagger/module/HomeModule.kt | 33 - .../dagger/module/PlaylistModule.kt | 38 - .../dagger/module/PresenterModile.kt | 111 +++ .../dagger/module/RepositoryModule.kt | 33 - .../retromusic/dagger/module/SearchModule.kt | 33 - .../retromusic/dagger/module/SongModule.kt | 31 - .../fragments/mainactivity/AlbumsFragment.kt | 7 +- .../mvp/presenter/AlbumPresenter.kt | 14 +- .../retromusic/providers/RepositoryImpl.kt | 72 +- app/src/main/res/drawable/circle_progress.xml | 40 +- app/src/main/res/layout/activity_about.xml | 1 - .../main/res/layout/app_widget_classic.xml | 164 ++--- gradle.properties | 3 +- 50 files changed, 2137 insertions(+), 2105 deletions(-) delete mode 100644 app/src/main/java/code/name/monkey/retromusic/dagger/module/ActivityModule.kt delete mode 100644 app/src/main/java/code/name/monkey/retromusic/dagger/module/AlbumModule.kt delete mode 100644 app/src/main/java/code/name/monkey/retromusic/dagger/module/ArtistModule.kt delete mode 100644 app/src/main/java/code/name/monkey/retromusic/dagger/module/GenreModule.kt delete mode 100644 app/src/main/java/code/name/monkey/retromusic/dagger/module/HomeModule.kt delete mode 100644 app/src/main/java/code/name/monkey/retromusic/dagger/module/PlaylistModule.kt create mode 100644 app/src/main/java/code/name/monkey/retromusic/dagger/module/PresenterModile.kt delete mode 100644 app/src/main/java/code/name/monkey/retromusic/dagger/module/RepositoryModule.kt delete mode 100644 app/src/main/java/code/name/monkey/retromusic/dagger/module/SearchModule.kt delete mode 100644 app/src/main/java/code/name/monkey/retromusic/dagger/module/SongModule.kt 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 35479e7e..e00eeb31 100644 --- a/app/src/main/java/code/name/monkey/retromusic/App.kt +++ b/app/src/main/java/code/name/monkey/retromusic/App.kt @@ -25,27 +25,21 @@ import code.name.monkey.retromusic.dagger.module.AppModule import com.anjlab.android.iab.v3.BillingProcessor import com.anjlab.android.iab.v3.TransactionDetails - class App : MultiDexApplication() { lateinit var billingProcessor: BillingProcessor override fun onCreate() { - /* if (MissingSplitsManagerFactory.create(this).disableAppIfMissingRequiredSplits()) { - return - }*/ super.onCreate() instance = this - musicComponent = DaggerMusicComponent.builder() - .appModule(AppModule(this)) - .build() + musicComponent = initDagger(this) // default theme if (!ThemeStore.isConfigured(this, 3)) { ThemeStore.editTheme(this) - .accentColorRes(R.color.md_deep_purple_A200) - .coloredNavigationBar(true) - .commit() + .accentColorRes(R.color.md_deep_purple_A200) + .coloredNavigationBar(true) + .commit() } if (VersionUtils.hasNougatMR()) @@ -53,19 +47,25 @@ class App : MultiDexApplication() { // automatically restores purchases billingProcessor = BillingProcessor(this, BuildConfig.GOOGLE_PLAY_LICENSING_KEY, - object : BillingProcessor.IBillingHandler { - override fun onProductPurchased(productId: String, details: TransactionDetails?) {} + object : BillingProcessor.IBillingHandler { + override fun onProductPurchased(productId: String, details: TransactionDetails?) {} - override fun onPurchaseHistoryRestored() { - Toast.makeText(this@App, R.string.restored_previous_purchase_please_restart, Toast.LENGTH_LONG).show(); - } + override fun onPurchaseHistoryRestored() { + Toast.makeText(this@App, R.string.restored_previous_purchase_please_restart, Toast.LENGTH_LONG) + .show() + } - override fun onBillingError(errorCode: Int, error: Throwable?) {} + override fun onBillingError(errorCode: Int, error: Throwable?) {} - override fun onBillingInitialized() {} - }) + override fun onBillingInitialized() {} + }) } + private fun initDagger(app: App): MusicComponent = + DaggerMusicComponent.builder() + .appModule(AppModule(app)) + .build() + override fun onTerminate() { super.onTerminate() billingProcessor.release() @@ -85,6 +85,5 @@ class App : MultiDexApplication() { lateinit var musicComponent: MusicComponent const val PRO_VERSION_PRODUCT_ID = "pro_version" - } } diff --git a/app/src/main/java/code/name/monkey/retromusic/Result.kt b/app/src/main/java/code/name/monkey/retromusic/Result.kt index f2f00f8b..64b638a6 100644 --- a/app/src/main/java/code/name/monkey/retromusic/Result.kt +++ b/app/src/main/java/code/name/monkey/retromusic/Result.kt @@ -19,6 +19,8 @@ package code.name.monkey.retromusic */ sealed class Result { + class Success(val data: T) : Result() + class Error(val exception: Throwable) : Result() } \ No newline at end of file diff --git a/app/src/main/java/code/name/monkey/retromusic/activities/AboutActivity.kt b/app/src/main/java/code/name/monkey/retromusic/activities/AboutActivity.kt index 48ffc3fb..21e44354 100644 --- a/app/src/main/java/code/name/monkey/retromusic/activities/AboutActivity.kt +++ b/app/src/main/java/code/name/monkey/retromusic/activities/AboutActivity.kt @@ -32,11 +32,22 @@ import com.afollestad.materialdialogs.bottomsheets.BottomSheet import com.afollestad.materialdialogs.list.listItems import com.google.gson.Gson import com.google.gson.reflect.TypeToken -import kotlinx.android.synthetic.main.activity_about.* -import kotlinx.android.synthetic.main.card_credit.* -import kotlinx.android.synthetic.main.card_other.* -import kotlinx.android.synthetic.main.card_retro_info.* -import kotlinx.android.synthetic.main.card_social.* +import kotlinx.android.synthetic.main.activity_about.toolbar +import kotlinx.android.synthetic.main.card_credit.recyclerView +import kotlinx.android.synthetic.main.card_other.changelog +import kotlinx.android.synthetic.main.card_other.openSource +import kotlinx.android.synthetic.main.card_other.version +import kotlinx.android.synthetic.main.card_retro_info.appGithub +import kotlinx.android.synthetic.main.card_retro_info.appRate +import kotlinx.android.synthetic.main.card_retro_info.appShare +import kotlinx.android.synthetic.main.card_retro_info.appTranslation +import kotlinx.android.synthetic.main.card_retro_info.bugReportLink +import kotlinx.android.synthetic.main.card_retro_info.donateLink +import kotlinx.android.synthetic.main.card_retro_info.faqLink +import kotlinx.android.synthetic.main.card_social.instagramLink +import kotlinx.android.synthetic.main.card_social.pinterestLink +import kotlinx.android.synthetic.main.card_social.telegramLink +import kotlinx.android.synthetic.main.card_social.twitterLink import java.io.IOException import java.nio.charset.StandardCharsets @@ -68,7 +79,6 @@ class AboutActivity : AbsBaseActivity(), View.OnClickListener { setNavigationbarColorAuto() setLightNavigationBar(true) - val toolbarColor = ATHUtil.resolveColor(this, R.attr.colorSurface) toolbar.setBackgroundColor(toolbarColor) ToolbarContentTintHelper.colorBackButton(toolbar) @@ -107,7 +117,6 @@ class AboutActivity : AbsBaseActivity(), View.OnClickListener { openSource.setOnClickListener(this) pinterestLink.setOnClickListener(this) bugReportLink.setOnClickListener(this) - } override fun onClick(view: View) { @@ -153,8 +162,8 @@ class AboutActivity : AbsBaseActivity(), View.OnClickListener { private fun shareApp() { ShareCompat.IntentBuilder.from(this).setType("text/plain") - .setChooserTitle(R.string.share_app) - .setText(String.format(getString(R.string.app_share), packageName)).startChooser() + .setChooserTitle(R.string.share_app) + .setText(String.format(getString(R.string.app_share), packageName)).startChooser() } private fun loadContributors() { diff --git a/app/src/main/java/code/name/monkey/retromusic/activities/AlbumDetailsActivity.kt b/app/src/main/java/code/name/monkey/retromusic/activities/AlbumDetailsActivity.kt index c9b349c1..1ac45184 100644 --- a/app/src/main/java/code/name/monkey/retromusic/activities/AlbumDetailsActivity.kt +++ b/app/src/main/java/code/name/monkey/retromusic/activities/AlbumDetailsActivity.kt @@ -42,23 +42,37 @@ import code.name.monkey.retromusic.util.PreferenceUtil import code.name.monkey.retromusic.util.RetroColorUtil import com.afollestad.materialcab.MaterialCab import com.bumptech.glide.Glide -import kotlinx.android.synthetic.main.activity_album.* -import kotlinx.android.synthetic.main.activity_album_content.* -import java.util.* +import kotlinx.android.synthetic.main.activity_album.albumText +import kotlinx.android.synthetic.main.activity_album.albumTitle +import kotlinx.android.synthetic.main.activity_album.image +import kotlinx.android.synthetic.main.activity_album.toolbar +import kotlinx.android.synthetic.main.activity_album_content.moreRecyclerView +import kotlinx.android.synthetic.main.activity_album_content.moreTitle +import kotlinx.android.synthetic.main.activity_album_content.playAction +import kotlinx.android.synthetic.main.activity_album_content.recyclerView +import kotlinx.android.synthetic.main.activity_album_content.shuffleAction +import kotlinx.android.synthetic.main.activity_album_content.songTitle +import java.util.ArrayList import javax.inject.Inject import android.util.Pair as UtilPair - class AlbumDetailsActivity : AbsSlidingMusicPanelActivity(), AlbumDetailsView, CabHolder { override fun openCab(menuRes: Int, callback: MaterialCab.Callback): MaterialCab { cab?.let { if (it.isActive) it.finish() } cab = MaterialCab(this, R.id.cab_stub) - .setMenu(menuRes) - .setCloseDrawableRes(R.drawable.ic_close_white_24dp) - .setBackgroundColor(RetroColorUtil.shiftBackgroundColorForLightText(ATHUtil.resolveColor(this, R.attr.colorSurface))) - .start(callback) + .setMenu(menuRes) + .setCloseDrawableRes(R.drawable.ic_close_white_24dp) + .setBackgroundColor( + RetroColorUtil.shiftBackgroundColorForLightText( + ATHUtil.resolveColor( + this, + R.attr.colorSurface + ) + ) + ) + .start(callback) return cab as MaterialCab } @@ -93,7 +107,10 @@ class AlbumDetailsActivity : AbsSlidingMusicPanelActivity(), AlbumDetailsView, C setupRecyclerView() artistImage.setOnClickListener { - val artistPairs = ActivityOptions.makeSceneTransitionAnimation(this, UtilPair.create(artistImage, getString(R.string.transition_artist_image))) + val artistPairs = ActivityOptions.makeSceneTransitionAnimation( + this, + UtilPair.create(artistImage, getString(R.string.transition_artist_image)) + ) NavigationUtil.goToArtistOptions(this, album.artistId, artistPairs) } playAction.apply { @@ -142,9 +159,18 @@ class AlbumDetailsActivity : AbsSlidingMusicPanelActivity(), AlbumDetailsView, C albumTitle.text = album.title if (MusicUtil.getYearString(album.year) == "-") { - albumText.text = String.format("%s • %s", album.artistName, MusicUtil.getReadableDurationString(MusicUtil.getTotalDuration(this, album.songs))) + albumText.text = String.format( + "%s • %s", + album.artistName, + MusicUtil.getReadableDurationString(MusicUtil.getTotalDuration(this, album.songs)) + ) } else { - albumText.text = String.format("%s • %s • %s", album.artistName, MusicUtil.getYearString(album.year), MusicUtil.getReadableDurationString(MusicUtil.getTotalDuration(this, album.songs))) + albumText.text = String.format( + "%s • %s • %s", + album.artistName, + MusicUtil.getYearString(album.year), + MusicUtil.getReadableDurationString(MusicUtil.getTotalDuration(this, album.songs)) + ) } loadAlbumCover() simpleSongAdapter.swapDataSet(album.songs) @@ -158,22 +184,20 @@ class AlbumDetailsActivity : AbsSlidingMusicPanelActivity(), AlbumDetailsView, C val albumAdapter = HorizontalAlbumAdapter(this, albums, false, null) moreRecyclerView.layoutManager = GridLayoutManager( - this, - 1, - GridLayoutManager.HORIZONTAL, - false + this, + 1, + GridLayoutManager.HORIZONTAL, + false ) moreRecyclerView.adapter = albumAdapter } override fun loadArtistImage(artist: Artist) { ArtistGlideRequest.Builder.from(Glide.with(this), artist).generatePalette(this).build() - .dontAnimate().dontTransform().into(object : RetroMusicColoredTarget(artistImage) { - override fun onColorReady(color: Int) { - - } - }) - + .dontAnimate().dontTransform().into(object : RetroMusicColoredTarget(artistImage) { + override fun onColorReady(color: Int) { + } + }) } private fun loadAlbumCover() { @@ -183,15 +207,15 @@ class AlbumDetailsActivity : AbsSlidingMusicPanelActivity(), AlbumDetailsView, C .dontAnimate().into(image)*/ SongGlideRequest.Builder.from(Glide.with(this), album.safeGetFirstSong()) - .checkIgnoreMediaStore(this) - .ignoreMediaStore(PreferenceUtil.getInstance(this).ignoreMediaStoreArtwork()) - .generatePalette(this) - .build().dontAnimate().dontTransform() - .into(object : RetroMusicColoredTarget(image) { - override fun onColorReady(color: Int) { - setColors(color) - } - }) + .checkIgnoreMediaStore(this) + .ignoreMediaStore(PreferenceUtil.getInstance(this).ignoreMediaStoreArtwork()) + .generatePalette(this) + .build().dontAnimate().dontTransform() + .into(object : RetroMusicColoredTarget(image) { + override fun onColorReady(color: Int) { + setColors(color) + } + }) } private fun setColors(color: Int) { @@ -254,7 +278,11 @@ class AlbumDetailsActivity : AbsSlidingMusicPanelActivity(), AlbumDetailsView, C R.id.action_tag_editor -> { val intent = Intent(this, AlbumTagEditorActivity::class.java) intent.putExtra(AbsTagEditorActivity.EXTRA_ID, album.id) - val options = ActivityOptions.makeSceneTransitionAnimation(this, image, getString(R.string.transition_album_art)) + val options = ActivityOptions.makeSceneTransitionAnimation( + this, + image, + getString(R.string.transition_album_art) + ) startActivityForResult(intent, TAG_EDITOR_REQUEST, options.toBundle()) return true } @@ -275,8 +303,10 @@ class AlbumDetailsActivity : AbsSlidingMusicPanelActivity(), AlbumDetailsView, C when (savedSortOrder) { AlbumSongSortOrder.SONG_A_Z -> sortOrder.findItem(R.id.action_sort_order_title).isChecked = true AlbumSongSortOrder.SONG_Z_A -> sortOrder.findItem(R.id.action_sort_order_title_desc).isChecked = true - AlbumSongSortOrder.SONG_TRACK_LIST -> sortOrder.findItem(R.id.action_sort_order_track_list).isChecked = true - AlbumSongSortOrder.SONG_DURATION -> sortOrder.findItem(R.id.action_sort_order_artist_song_duration).isChecked = true + AlbumSongSortOrder.SONG_TRACK_LIST -> sortOrder.findItem(R.id.action_sort_order_track_list).isChecked = + true + AlbumSongSortOrder.SONG_DURATION -> sortOrder.findItem(R.id.action_sort_order_artist_song_duration) + .isChecked = true } } diff --git a/app/src/main/java/code/name/monkey/retromusic/activities/ArtistDetailActivity.kt b/app/src/main/java/code/name/monkey/retromusic/activities/ArtistDetailActivity.kt index 4a4a5184..baca7e7f 100755 --- a/app/src/main/java/code/name/monkey/retromusic/activities/ArtistDetailActivity.kt +++ b/app/src/main/java/code/name/monkey/retromusic/activities/ArtistDetailActivity.kt @@ -33,14 +33,29 @@ import code.name.monkey.retromusic.model.Artist import code.name.monkey.retromusic.mvp.presenter.ArtistDetailsPresenter import code.name.monkey.retromusic.mvp.presenter.ArtistDetailsView import code.name.monkey.retromusic.rest.model.LastFmArtist -import code.name.monkey.retromusic.util.* +import code.name.monkey.retromusic.util.CustomArtistImageUtil +import code.name.monkey.retromusic.util.DensityUtil +import code.name.monkey.retromusic.util.MusicUtil +import code.name.monkey.retromusic.util.PreferenceUtil +import code.name.monkey.retromusic.util.RetroColorUtil +import code.name.monkey.retromusic.util.RetroUtil import com.afollestad.materialcab.MaterialCab import com.bumptech.glide.Glide -import kotlinx.android.synthetic.main.activity_artist_content.* -import kotlinx.android.synthetic.main.activity_artist_details.* -import java.util.* +import kotlinx.android.synthetic.main.activity_artist_content.albumRecyclerView +import kotlinx.android.synthetic.main.activity_artist_content.albumTitle +import kotlinx.android.synthetic.main.activity_artist_content.biographyText +import kotlinx.android.synthetic.main.activity_artist_content.biographyTitle +import kotlinx.android.synthetic.main.activity_artist_content.playAction +import kotlinx.android.synthetic.main.activity_artist_content.recyclerView +import kotlinx.android.synthetic.main.activity_artist_content.shuffleAction +import kotlinx.android.synthetic.main.activity_artist_content.songTitle +import kotlinx.android.synthetic.main.activity_artist_details.artistImage +import kotlinx.android.synthetic.main.activity_artist_details.artistTitle +import kotlinx.android.synthetic.main.activity_artist_details.imageContainer +import kotlinx.android.synthetic.main.activity_artist_details.text +import kotlinx.android.synthetic.main.activity_artist_details.toolbar +import java.util.Locale import javax.inject.Inject -import kotlin.collections.ArrayList class ArtistDetailActivity : AbsSlidingMusicPanelActivity(), ArtistDetailsView, CabHolder { override fun openCab(menuRes: Int, callback: MaterialCab.Callback): MaterialCab { @@ -48,10 +63,17 @@ class ArtistDetailActivity : AbsSlidingMusicPanelActivity(), ArtistDetailsView, if (it.isActive) it.finish() } cab = MaterialCab(this, R.id.cab_stub) - .setMenu(menuRes) - .setCloseDrawableRes(R.drawable.ic_close_white_24dp) - .setBackgroundColor(RetroColorUtil.shiftBackgroundColorForLightText(ATHUtil.resolveColor(this, R.attr.colorSurface))) - .start(callback) + .setMenu(menuRes) + .setCloseDrawableRes(R.drawable.ic_close_white_24dp) + .setBackgroundColor( + RetroColorUtil.shiftBackgroundColorForLightText( + ATHUtil.resolveColor( + this, + R.attr.colorSurface + ) + ) + ) + .start(callback) return cab as MaterialCab } @@ -155,7 +177,6 @@ class ArtistDetailActivity : AbsSlidingMusicPanelActivity(), ArtistDetailsView, } override fun showEmptyView() { - } override fun complete() { @@ -174,9 +195,9 @@ class ArtistDetailActivity : AbsSlidingMusicPanelActivity(), ArtistDetailsView, } artistTitle.text = artist.name text.text = String.format( - "%s • %s", - MusicUtil.getArtistInfoString(this, artist), - MusicUtil.getReadableDurationString(MusicUtil.getTotalDuration(this, artist.songs)) + "%s • %s", + MusicUtil.getArtistInfoString(this, artist), + MusicUtil.getReadableDurationString(MusicUtil.getTotalDuration(this, artist.songs)) ) songAdapter.swapDataSet(artist.songs) @@ -184,8 +205,8 @@ class ArtistDetailActivity : AbsSlidingMusicPanelActivity(), ArtistDetailsView, } private fun loadBiography( - name: String, - lang: String? = Locale.getDefault().language + name: String, + lang: String? = Locale.getDefault().language ) { biography = null this.lang = lang @@ -217,11 +238,11 @@ class ArtistDetailActivity : AbsSlidingMusicPanelActivity(), ArtistDetailsView, private fun loadArtistImage() { ArtistGlideRequest.Builder.from(Glide.with(this), artist).generatePalette(this).build() - .dontAnimate().into(object : RetroMusicColoredTarget(artistImage) { - override fun onColorReady(color: Int) { - setColors(color) - } - }) + .dontAnimate().into(object : RetroMusicColoredTarget(artistImage) { + override fun onColorReady(color: Int) { + setColors(color) + } + }) } private fun setColors(color: Int) { @@ -275,11 +296,15 @@ class ArtistDetailActivity : AbsSlidingMusicPanelActivity(), ArtistDetailsView, R.id.action_set_artist_image -> { val intent = Intent(Intent.ACTION_GET_CONTENT) intent.type = "image/*" - startActivityForResult(Intent.createChooser(intent, getString(R.string.pick_from_local_storage)), REQUEST_CODE_SELECT_IMAGE) + startActivityForResult( + Intent.createChooser(intent, getString(R.string.pick_from_local_storage)), + REQUEST_CODE_SELECT_IMAGE + ) return true } R.id.action_reset_artist_image -> { - Toast.makeText(this@ArtistDetailActivity, resources.getString(R.string.updating), Toast.LENGTH_SHORT).show() + Toast.makeText(this@ArtistDetailActivity, resources.getString(R.string.updating), Toast.LENGTH_SHORT) + .show() CustomArtistImageUtil.getInstance(this@ArtistDetailActivity).resetCustomArtistImage(artist) forceDownload = true return true diff --git a/app/src/main/java/code/name/monkey/retromusic/activities/GenreDetailsActivity.kt b/app/src/main/java/code/name/monkey/retromusic/activities/GenreDetailsActivity.kt index 17612ecd..290f8779 100644 --- a/app/src/main/java/code/name/monkey/retromusic/activities/GenreDetailsActivity.kt +++ b/app/src/main/java/code/name/monkey/retromusic/activities/GenreDetailsActivity.kt @@ -23,8 +23,11 @@ import code.name.monkey.retromusic.util.DensityUtil import code.name.monkey.retromusic.util.RetroColorUtil import code.name.monkey.retromusic.util.ViewUtil import com.afollestad.materialcab.MaterialCab -import kotlinx.android.synthetic.main.activity_playlist_detail.* -import java.util.* +import kotlinx.android.synthetic.main.activity_playlist_detail.empty +import kotlinx.android.synthetic.main.activity_playlist_detail.emptyEmoji +import kotlinx.android.synthetic.main.activity_playlist_detail.recyclerView +import kotlinx.android.synthetic.main.activity_playlist_detail.toolbar +import java.util.ArrayList import javax.inject.Inject /** @@ -75,7 +78,6 @@ class GenreDetailsActivity : AbsSlidingMusicPanelActivity(), CabHolder, GenreDet App.musicComponent.inject(this) genreDetailsPresenter.attachView(this) - } private fun setUpToolBar() { @@ -98,7 +100,6 @@ class GenreDetailsActivity : AbsSlidingMusicPanelActivity(), CabHolder, GenreDet } override fun showEmptyView() { - } override fun onCreateOptionsMenu(menu: Menu): Boolean { @@ -135,7 +136,15 @@ class GenreDetailsActivity : AbsSlidingMusicPanelActivity(), CabHolder, GenreDet override fun openCab(menuRes: Int, callback: MaterialCab.Callback): MaterialCab { if (cab != null && cab!!.isActive) cab?.finish() - cab = MaterialCab(this, R.id.cab_stub).setMenu(menuRes).setCloseDrawableRes(R.drawable.ic_close_white_24dp).setBackgroundColor(RetroColorUtil.shiftBackgroundColorForLightText(ATHUtil.resolveColor(this, R.attr.colorSurface))).start(callback) + cab = MaterialCab(this, R.id.cab_stub).setMenu(menuRes).setCloseDrawableRes(R.drawable.ic_close_white_24dp) + .setBackgroundColor( + RetroColorUtil.shiftBackgroundColorForLightText( + ATHUtil.resolveColor( + this, + R.attr.colorSurface + ) + ) + ).start(callback) return cab!! } diff --git a/app/src/main/java/code/name/monkey/retromusic/activities/LicenseActivity.java b/app/src/main/java/code/name/monkey/retromusic/activities/LicenseActivity.java index d0edccdb..59f427dd 100644 --- a/app/src/main/java/code/name/monkey/retromusic/activities/LicenseActivity.java +++ b/app/src/main/java/code/name/monkey/retromusic/activities/LicenseActivity.java @@ -14,47 +14,30 @@ package code.name.monkey.retromusic.activities; +import static code.name.monkey.appthemehelper.util.ATHUtil.INSTANCE; + import android.graphics.Color; import android.os.Bundle; import android.view.MenuItem; import android.webkit.WebView; - import androidx.annotation.NonNull; import androidx.appcompat.widget.Toolbar; - -import org.jetbrains.annotations.Nullable; - -import java.io.BufferedReader; -import java.io.InputStream; -import java.io.InputStreamReader; -import java.nio.charset.StandardCharsets; - import code.name.monkey.appthemehelper.ThemeStore; import code.name.monkey.appthemehelper.util.ColorUtil; import code.name.monkey.appthemehelper.util.ToolbarContentTintHelper; import code.name.monkey.retromusic.R; import code.name.monkey.retromusic.activities.base.AbsBaseActivity; - -import static code.name.monkey.appthemehelper.util.ATHUtil.INSTANCE; +import java.io.BufferedReader; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.nio.charset.StandardCharsets; +import org.jetbrains.annotations.Nullable; /** * Created by hemanths on 2019-09-27. */ public class LicenseActivity extends AbsBaseActivity { - @Override - public boolean onOptionsItemSelected(@NonNull MenuItem item) { - if (item.getItemId() == android.R.id.home) { - onBackPressed(); - return true; - } - return super.onOptionsItemSelected(item); - } - - private String colorToCSS(int color) { - return String.format("rgb(%d, %d, %d)", Color.red(color), Color.green(color), Color.blue(color)); // on API 29, WebView doesn't load with hex colors - } - @Override protected void onCreate(@Nullable Bundle savedInstanceState) { setDrawUnderStatusBar(); @@ -73,19 +56,22 @@ public class LicenseActivity extends AbsBaseActivity { InputStream json = getAssets().open("index.html"); BufferedReader in = new BufferedReader(new InputStreamReader(json, StandardCharsets.UTF_8)); String str; - while ((str = in.readLine()) != null) + while ((str = in.readLine()) != null) { buf.append(str); + } in.close(); // Inject color values for WebView body background and links final boolean isDark = INSTANCE.isWindowBackgroundDark(this); - final String backgroundColor = colorToCSS(INSTANCE.resolveColor(this, R.attr.colorSurface, Color.parseColor(isDark ? "#424242" : "#ffffff"))); + final String backgroundColor = colorToCSS(INSTANCE.resolveColor(this, R.attr.colorSurface, + Color.parseColor(isDark ? "#424242" : "#ffffff"))); final String contentColor = colorToCSS(Color.parseColor(isDark ? "#ffffff" : "#000000")); final String changeLog = buf.toString() .replace("{style-placeholder}", String.format("body { background-color: %s; color: %s; }", backgroundColor, contentColor)) .replace("{link-color}", colorToCSS(ThemeStore.Companion.accentColor(this))) - .replace("{link-color-active}", colorToCSS(ColorUtil.INSTANCE.lightenColor(ThemeStore.Companion.accentColor(this)))); + .replace("{link-color-active}", + colorToCSS(ColorUtil.INSTANCE.lightenColor(ThemeStore.Companion.accentColor(this)))); webView.loadData(changeLog, "text/html", "UTF-8"); } catch (Throwable e) { @@ -93,4 +79,18 @@ public class LicenseActivity extends AbsBaseActivity { } } + + @Override + public boolean onOptionsItemSelected(@NonNull MenuItem item) { + if (item.getItemId() == android.R.id.home) { + onBackPressed(); + return true; + } + return super.onOptionsItemSelected(item); + } + + private String colorToCSS(int color) { + return String.format("rgb(%d, %d, %d)", Color.red(color), Color.green(color), + Color.blue(color)); // on API 29, WebView doesn't load with hex colors + } } diff --git a/app/src/main/java/code/name/monkey/retromusic/activities/LockScreenActivity.kt b/app/src/main/java/code/name/monkey/retromusic/activities/LockScreenActivity.kt index 3f0dffbd..f2e2bc98 100644 --- a/app/src/main/java/code/name/monkey/retromusic/activities/LockScreenActivity.kt +++ b/app/src/main/java/code/name/monkey/retromusic/activities/LockScreenActivity.kt @@ -18,79 +18,79 @@ import com.r0adkll.slidr.Slidr import com.r0adkll.slidr.model.SlidrConfig import com.r0adkll.slidr.model.SlidrListener import com.r0adkll.slidr.model.SlidrPosition -import kotlinx.android.synthetic.main.activity_lock_screen.* +import kotlinx.android.synthetic.main.activity_lock_screen.image class LockScreenActivity : AbsMusicServiceActivity() { - private var fragment: LockScreenPlayerControlsFragment? = null + private var fragment: LockScreenPlayerControlsFragment? = null - override fun onCreate(savedInstanceState: Bundle?) { - super.onCreate(savedInstanceState) - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O_MR1) { - setShowWhenLocked(true) - setTurnScreenOn(true) - } else { - this.window.addFlags(WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD or WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED or WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON) - } - setDrawUnderStatusBar() - setContentView(R.layout.activity_lock_screen) - hideStatusBar() - setStatusbarColorAuto() - setNavigationbarColorAuto() - setTaskDescriptionColorAuto() - setLightNavigationBar(true) + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O_MR1) { + setShowWhenLocked(true) + setTurnScreenOn(true) + } else { + this.window.addFlags(WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD or + WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED or + WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON) + } + setDrawUnderStatusBar() + setContentView(R.layout.activity_lock_screen) + hideStatusBar() + setStatusbarColorAuto() + setNavigationbarColorAuto() + setTaskDescriptionColorAuto() + setLightNavigationBar(true) - val config = SlidrConfig.Builder().listener(object : SlidrListener { - override fun onSlideStateChanged(state: Int) { + val config = SlidrConfig.Builder().listener(object : SlidrListener { + override fun onSlideStateChanged(state: Int) { + } - } + override fun onSlideChange(percent: Float) { + } - override fun onSlideChange(percent: Float) { + override fun onSlideOpened() { + } - } + override fun onSlideClosed(): Boolean { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { + val keyguardManager = getSystemService(Context.KEYGUARD_SERVICE) as KeyguardManager + keyguardManager.requestDismissKeyguard(this@LockScreenActivity, null) + } + finish() + return true + } + }).position(SlidrPosition.BOTTOM).build() - override fun onSlideOpened() { + Slidr.attach(this, config) - } + fragment = + supportFragmentManager.findFragmentById(R.id.playback_controls_fragment) as LockScreenPlayerControlsFragment? - override fun onSlideClosed(): Boolean { - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { - val keyguardManager = getSystemService(Context.KEYGUARD_SERVICE) as KeyguardManager - keyguardManager.requestDismissKeyguard(this@LockScreenActivity, null) - } - finish() - return true - } - }).position(SlidrPosition.BOTTOM).build() + findViewById(R.id.slide).apply { + translationY = 100f + alpha = 0f + ViewCompat.animate(this).translationY(0f).alpha(1f).setDuration(1500).start() + } + } - Slidr.attach(this, config) + override fun onPlayingMetaChanged() { + super.onPlayingMetaChanged() + updateSongs() + } - fragment = supportFragmentManager.findFragmentById(R.id.playback_controls_fragment) as LockScreenPlayerControlsFragment? + override fun onServiceConnected() { + super.onServiceConnected() + updateSongs() + } - findViewById(R.id.slide).apply { - translationY = 100f - alpha = 0f - ViewCompat.animate(this).translationY(0f).alpha(1f).setDuration(1500).start() - } - } - - override fun onPlayingMetaChanged() { - super.onPlayingMetaChanged() - updateSongs() - } - - override fun onServiceConnected() { - super.onServiceConnected() - updateSongs() - } - - private fun updateSongs() { - val song = MusicPlayerRemote.currentSong - SongGlideRequest.Builder.from(Glide.with(this), song).checkIgnoreMediaStore(this) - .generatePalette(this).build().dontAnimate() - .into(object : RetroMusicColoredTarget(image) { - override fun onColorReady(color: Int) { - fragment?.setDark(color) - } - }) - } + private fun updateSongs() { + val song = MusicPlayerRemote.currentSong + SongGlideRequest.Builder.from(Glide.with(this), song).checkIgnoreMediaStore(this) + .generatePalette(this).build().dontAnimate() + .into(object : RetroMusicColoredTarget(image) { + override fun onColorReady(color: Int) { + fragment?.setDark(color) + } + }) + } } \ No newline at end of file diff --git a/app/src/main/java/code/name/monkey/retromusic/activities/LyricsActivity.kt b/app/src/main/java/code/name/monkey/retromusic/activities/LyricsActivity.kt index abd5e7b8..6f06f626 100644 --- a/app/src/main/java/code/name/monkey/retromusic/activities/LyricsActivity.kt +++ b/app/src/main/java/code/name/monkey/retromusic/activities/LyricsActivity.kt @@ -7,7 +7,11 @@ import android.os.Build import android.os.Bundle import android.text.InputType import android.text.TextUtils -import android.view.* +import android.view.LayoutInflater +import android.view.MenuItem +import android.view.View +import android.view.ViewGroup +import android.view.WindowManager import androidx.annotation.StringRes import androidx.core.content.ContextCompat import androidx.fragment.app.Fragment @@ -15,7 +19,12 @@ import androidx.fragment.app.FragmentManager import androidx.fragment.app.FragmentStatePagerAdapter import androidx.viewpager.widget.ViewPager import code.name.monkey.appthemehelper.ThemeStore -import code.name.monkey.appthemehelper.util.* +import code.name.monkey.appthemehelper.util.ATHUtil +import code.name.monkey.appthemehelper.util.ColorUtil +import code.name.monkey.appthemehelper.util.MaterialUtil +import code.name.monkey.appthemehelper.util.MaterialValueHelper +import code.name.monkey.appthemehelper.util.TintHelper +import code.name.monkey.appthemehelper.util.ToolbarContentTintHelper import code.name.monkey.retromusic.App import code.name.monkey.retromusic.R import code.name.monkey.retromusic.activities.base.AbsMusicServiceActivity @@ -36,13 +45,15 @@ import com.afollestad.materialdialogs.MaterialDialog import com.afollestad.materialdialogs.bottomsheets.BottomSheet import com.afollestad.materialdialogs.input.getInputLayout import com.afollestad.materialdialogs.input.input -import kotlinx.android.synthetic.main.activity_lyrics.* -import kotlinx.android.synthetic.main.fragment_lyrics.* -import kotlinx.android.synthetic.main.fragment_synced.* +import kotlinx.android.synthetic.main.activity_lyrics.fab +import kotlinx.android.synthetic.main.activity_lyrics.tabs +import kotlinx.android.synthetic.main.activity_lyrics.toolbar +import kotlinx.android.synthetic.main.activity_lyrics.viewPager +import kotlinx.android.synthetic.main.fragment_lyrics.offlineLyrics +import kotlinx.android.synthetic.main.fragment_synced.lyricsView import org.jaudiotagger.tag.FieldKey import java.io.File -import java.util.* -import kotlin.collections.ArrayList +import java.util.EnumMap class LyricsActivity : AbsMusicServiceActivity(), View.OnClickListener, ViewPager.OnPageChangeListener { override fun onPageScrollStateChanged(state: Int) { @@ -89,11 +100,16 @@ class LyricsActivity : AbsMusicServiceActivity(), View.OnClickListener, ViewPage setNavigationbarColorAuto() fab.backgroundTintList = ColorStateList.valueOf(ThemeStore.accentColor(this)) - ColorStateList.valueOf(MaterialValueHelper.getPrimaryTextColor(this, ColorUtil.isColorLight(ThemeStore.accentColor(this)))) - .apply { - fab.setTextColor(this) - fab.iconTint = this - } + ColorStateList.valueOf( + MaterialValueHelper.getPrimaryTextColor( + this, + ColorUtil.isColorLight(ThemeStore.accentColor(this)) + ) + ) + .apply { + fab.setTextColor(this) + fab.iconTint = this + } setupWakelock() viewPager.apply { @@ -108,8 +124,18 @@ class LyricsActivity : AbsMusicServiceActivity(), View.OnClickListener, ViewPage ToolbarContentTintHelper.colorBackButton(toolbar) setSupportActionBar(toolbar) tabs.setupWithViewPager(viewPager) - tabs.setSelectedTabIndicator(TintHelper.createTintedDrawable(ContextCompat.getDrawable(this, R.drawable.tab_indicator), ThemeStore.accentColor(this))) - tabs.setTabTextColors(ATHUtil.resolveColor(this, android.R.attr.textColorSecondary), ThemeStore.accentColor(this)) + tabs.setSelectedTabIndicator( + TintHelper.createTintedDrawable( + ContextCompat.getDrawable( + this, + R.drawable.tab_indicator + ), ThemeStore.accentColor(this) + ) + ) + tabs.setTabTextColors( + ATHUtil.resolveColor(this, android.R.attr.textColorSecondary), + ThemeStore.accentColor(this) + ) tabs.setSelectedTabIndicatorColor(ThemeStore.accentColor(this)) fab.setOnClickListener(this) @@ -152,29 +178,30 @@ class LyricsActivity : AbsMusicServiceActivity(), View.OnClickListener, ViewPage } val materialDialog = MaterialDialog(this, BottomSheet(LayoutMode.WRAP_CONTENT)) - .show { - cornerRadius(PreferenceUtil.getInstance(this@LyricsActivity).dialogCorner) - title(R.string.add_time_framed_lryics) - negativeButton(R.string.action_search) { - RetroUtil.openUrl(this@LyricsActivity, googleSearchLrcUrl) - } - input( - hint = getString(R.string.paste_lyrics_here), - prefill = content, - inputType = InputType.TYPE_CLASS_TEXT or InputType.TYPE_TEXT_FLAG_MULTI_LINE - ) { _, input -> - LyricUtil.writeLrcToLoc(song.title, song.artistName, input.toString()) - } - positiveButton(android.R.string.ok) { - updateSong() - } + .show { + cornerRadius(PreferenceUtil.getInstance(this@LyricsActivity).dialogCorner) + title(R.string.add_time_framed_lryics) + negativeButton(R.string.action_search) { + RetroUtil.openUrl(this@LyricsActivity, googleSearchLrcUrl) } + input( + hint = getString(R.string.paste_lyrics_here), + prefill = content, + inputType = InputType.TYPE_CLASS_TEXT or InputType.TYPE_TEXT_FLAG_MULTI_LINE + ) { _, input -> + LyricUtil.writeLrcToLoc(song.title, song.artistName, input.toString()) + } + positiveButton(android.R.string.ok) { + updateSong() + } + } MaterialUtil.setTint(materialDialog.getInputLayout(), false) } private fun updateSong() { - val page = supportFragmentManager.findFragmentByTag("android:switcher:" + R.id.viewPager + ":" + viewPager.currentItem) + val page = + supportFragmentManager.findFragmentByTag("android:switcher:" + R.id.viewPager + ":" + viewPager.currentItem) if (viewPager.currentItem == 0 && page != null) { (page as BaseLyricsFragment).upDateSong() } @@ -188,7 +215,7 @@ class LyricsActivity : AbsMusicServiceActivity(), View.OnClickListener, ViewPage } val materialDialog = MaterialDialog( - this, BottomSheet(LayoutMode.WRAP_CONTENT) + this, BottomSheet(LayoutMode.WRAP_CONTENT) ).show { cornerRadius(PreferenceUtil.getInstance(this@LyricsActivity).dialogCorner) title(R.string.add_lyrics) @@ -196,16 +223,16 @@ class LyricsActivity : AbsMusicServiceActivity(), View.OnClickListener, ViewPage RetroUtil.openUrl(this@LyricsActivity, getGoogleSearchUrl()) } input( - hint = getString(R.string.paste_lyrics_here), - prefill = content, - inputType = InputType.TYPE_CLASS_TEXT or InputType.TYPE_TEXT_FLAG_MULTI_LINE + hint = getString(R.string.paste_lyrics_here), + prefill = content, + inputType = InputType.TYPE_CLASS_TEXT or InputType.TYPE_TEXT_FLAG_MULTI_LINE ) { _, input -> val fieldKeyValueMap = EnumMap(FieldKey::class.java) fieldKeyValueMap[FieldKey.LYRICS] = input.toString() WriteTagsAsyncTask(this@LyricsActivity).execute( - WriteTagsAsyncTask.LoadingInfo( - getSongPaths(song), fieldKeyValueMap, null - ) + WriteTagsAsyncTask.LoadingInfo( + getSongPaths(song), fieldKeyValueMap, null + ) ) } positiveButton(android.R.string.ok) { @@ -230,10 +257,11 @@ class LyricsActivity : AbsMusicServiceActivity(), View.OnClickListener, ViewPage } class PagerAdapter(fm: FragmentManager) : FragmentStatePagerAdapter( - fm, BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT + fm, BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT ) { + class Tabs( - @StringRes val title: Int, val fragment: Fragment + @StringRes val title: Int, val fragment: Fragment ) private var tabs = ArrayList() @@ -256,7 +284,6 @@ class LyricsActivity : AbsMusicServiceActivity(), View.OnClickListener, ViewPage override fun getCount(): Int { return tabs.size } - } abstract class BaseLyricsFragment : AbsMusicServiceFragment() { @@ -271,7 +298,6 @@ class LyricsActivity : AbsMusicServiceActivity(), View.OnClickListener, ViewPage super.onServiceConnected() upDateSong() } - } class OfflineLyricsFragment : BaseLyricsFragment() { @@ -331,7 +357,7 @@ class LyricsActivity : AbsMusicServiceActivity(), View.OnClickListener, ViewPage } override fun onCreateView( - inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? + inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? ): View? { return inflater.inflate(R.layout.fragment_lyrics, container, false) } @@ -344,7 +370,7 @@ class LyricsActivity : AbsMusicServiceActivity(), View.OnClickListener, ViewPage private lateinit var updateHelper: MusicProgressViewUpdateHelper override fun onCreateView( - inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? + inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? ): View? { return inflater.inflate(R.layout.fragment_synced, container, false) } diff --git a/app/src/main/java/code/name/monkey/retromusic/activities/MainActivity.kt b/app/src/main/java/code/name/monkey/retromusic/activities/MainActivity.kt index ac724d2e..79562a3f 100644 --- a/app/src/main/java/code/name/monkey/retromusic/activities/MainActivity.kt +++ b/app/src/main/java/code/name/monkey/retromusic/activities/MainActivity.kt @@ -1,6 +1,10 @@ package code.name.monkey.retromusic.activities -import android.content.* +import android.content.BroadcastReceiver +import android.content.Context +import android.content.Intent +import android.content.IntentFilter +import android.content.SharedPreferences import android.os.Bundle import android.provider.MediaStore import android.util.Log @@ -22,7 +26,7 @@ import code.name.monkey.retromusic.service.MusicService import code.name.monkey.retromusic.util.AppRater import code.name.monkey.retromusic.util.PreferenceUtil import io.reactivex.disposables.CompositeDisposable -import java.util.* +import java.util.ArrayList class MainActivity : AbsSlidingMusicPanelActivity(), SharedPreferences.OnSharedPreferenceChangeListener { @@ -49,7 +53,7 @@ class MainActivity : AbsSlidingMusicPanelActivity(), SharedPreferences.OnSharedP } override fun onCreate( - savedInstanceState: Bundle? + savedInstanceState: Bundle? ) { setDrawUnderStatusBar() super.onCreate(savedInstanceState) @@ -76,14 +80,13 @@ class MainActivity : AbsSlidingMusicPanelActivity(), SharedPreferences.OnSharedP val currentVersion = pInfo.versionCode if (currentVersion != PreferenceUtil.getInstance(this).lastChangelogVersion) { startActivityForResult( - Intent(this, WhatsNewActivity::class.java), - APP_INTRO_REQUEST + Intent(this, WhatsNewActivity::class.java), + APP_INTRO_REQUEST ) } } catch (e: Throwable) { e.printStackTrace() } - } override fun onResume() { @@ -112,13 +115,14 @@ class MainActivity : AbsSlidingMusicPanelActivity(), SharedPreferences.OnSharedP private fun setCurrentFragment(fragment: Fragment, tag: String) { if (tag != supportFragmentManager.findFragmentById(R.id.fragment_container)?.tag) { supportFragmentManager.beginTransaction() - .replace(R.id.fragment_container, fragment, tag).commit() + .replace(R.id.fragment_container, fragment, tag).commit() currentFragment = fragment as MainActivityFragmentCallbacks } } private fun restoreCurrentFragment() { - currentFragment = supportFragmentManager.findFragmentById(R.id.fragment_container) as MainActivityFragmentCallbacks + currentFragment = + supportFragmentManager.findFragmentById(R.id.fragment_container) as MainActivityFragmentCallbacks } private fun handlePlaybackIntent(intent: Intent?) { @@ -200,7 +204,6 @@ class MainActivity : AbsSlidingMusicPanelActivity(), SharedPreferences.OnSharedP } } } - } override fun handleBackPress(): Boolean { @@ -219,8 +222,8 @@ class MainActivity : AbsSlidingMusicPanelActivity(), SharedPreferences.OnSharedP } override fun onSharedPreferenceChanged(sharedPreferences: SharedPreferences, key: String) { - if (key == PreferenceUtil.GENERAL_THEME || key == PreferenceUtil.BLACK_THEME || key == PreferenceUtil.ADAPTIVE_COLOR_APP || key == PreferenceUtil.DOMINANT_COLOR || key == PreferenceUtil.USER_NAME || key == PreferenceUtil.TOGGLE_FULL_SCREEN || key == PreferenceUtil.TOGGLE_VOLUME || key == PreferenceUtil.ROUND_CORNERS || key == PreferenceUtil.CAROUSEL_EFFECT || key == PreferenceUtil.NOW_PLAYING_SCREEN_ID || key == PreferenceUtil.TOGGLE_GENRE || key == PreferenceUtil.BANNER_IMAGE_PATH || key == PreferenceUtil.PROFILE_IMAGE_PATH || key == PreferenceUtil.CIRCULAR_ALBUM_ART || key == PreferenceUtil.KEEP_SCREEN_ON || key == PreferenceUtil.TOGGLE_SEPARATE_LINE || key == PreferenceUtil.ALBUM_GRID_STYLE || key == PreferenceUtil.ARTIST_GRID_STYLE || key == PreferenceUtil.TOGGLE_HOME_BANNER || key == PreferenceUtil.TOGGLE_ADD_CONTROLS || key == PreferenceUtil.ALBUM_COVER_STYLE || key == PreferenceUtil.HOME_ARTIST_GRID_STYLE || key == PreferenceUtil.ALBUM_COVER_TRANSFORM || key == PreferenceUtil.DESATURATED_COLOR || key == PreferenceUtil.TAB_TEXT_MODE || key == PreferenceUtil.LIBRARY_CATEGORIES) postRecreate() - + if (key == PreferenceUtil.GENERAL_THEME || key == PreferenceUtil.BLACK_THEME || key == PreferenceUtil.ADAPTIVE_COLOR_APP || key == PreferenceUtil.DOMINANT_COLOR || key == PreferenceUtil.USER_NAME || key == PreferenceUtil.TOGGLE_FULL_SCREEN || key == PreferenceUtil.TOGGLE_VOLUME || key == PreferenceUtil.ROUND_CORNERS || key == PreferenceUtil.CAROUSEL_EFFECT || key == PreferenceUtil.NOW_PLAYING_SCREEN_ID || key == PreferenceUtil.TOGGLE_GENRE || key == PreferenceUtil.BANNER_IMAGE_PATH || key == PreferenceUtil.PROFILE_IMAGE_PATH || key == PreferenceUtil.CIRCULAR_ALBUM_ART || key == PreferenceUtil.KEEP_SCREEN_ON || key == PreferenceUtil.TOGGLE_SEPARATE_LINE || key == PreferenceUtil.ALBUM_GRID_STYLE || key == PreferenceUtil.ARTIST_GRID_STYLE || key == PreferenceUtil.TOGGLE_HOME_BANNER || key == PreferenceUtil.TOGGLE_ADD_CONTROLS || key == PreferenceUtil.ALBUM_COVER_STYLE || key == PreferenceUtil.HOME_ARTIST_GRID_STYLE || key == PreferenceUtil.ALBUM_COVER_TRANSFORM || key == PreferenceUtil.DESATURATED_COLOR || key == PreferenceUtil.TAB_TEXT_MODE || key == PreferenceUtil.LIBRARY_CATEGORIES + ) postRecreate() } private fun selectedFragment(itemId: Int) { diff --git a/app/src/main/java/code/name/monkey/retromusic/activities/PlayingQueueActivity.kt b/app/src/main/java/code/name/monkey/retromusic/activities/PlayingQueueActivity.kt index 194bb26b..7377fd93 100644 --- a/app/src/main/java/code/name/monkey/retromusic/activities/PlayingQueueActivity.kt +++ b/app/src/main/java/code/name/monkey/retromusic/activities/PlayingQueueActivity.kt @@ -20,7 +20,10 @@ import com.h6ah4i.android.widget.advrecyclerview.draggable.RecyclerViewDragDropM import com.h6ah4i.android.widget.advrecyclerview.swipeable.RecyclerViewSwipeManager import com.h6ah4i.android.widget.advrecyclerview.touchguard.RecyclerViewTouchActionGuardManager import com.h6ah4i.android.widget.advrecyclerview.utils.WrapperAdapterUtils -import kotlinx.android.synthetic.main.activity_playing_queue.* +import kotlinx.android.synthetic.main.activity_playing_queue.clearQueue +import kotlinx.android.synthetic.main.activity_playing_queue.playerQueueSubHeader +import kotlinx.android.synthetic.main.activity_playing_queue.recyclerView +import kotlinx.android.synthetic.main.activity_playing_queue.toolbar open class PlayingQueueActivity : AbsMusicServiceActivity() { @@ -33,7 +36,10 @@ open class PlayingQueueActivity : AbsMusicServiceActivity() { private fun getUpNextAndQueueTime(): String { val duration = MusicPlayerRemote.getQueueDurationMillis(MusicPlayerRemote.position) - return MusicUtil.buildInfoString(resources.getString(R.string.up_next), MusicUtil.getReadableDurationString(duration)) + return MusicUtil.buildInfoString( + resources.getString(R.string.up_next), + MusicUtil.getReadableDurationString(duration) + ) } override fun onCreate(savedInstanceState: Bundle?) { @@ -73,10 +79,10 @@ open class PlayingQueueActivity : AbsMusicServiceActivity() { animator.supportsChangeAnimations = false playingQueueAdapter = PlayingQueueAdapter( - this, - MusicPlayerRemote.playingQueue, - MusicPlayerRemote.position, - R.layout.item_queue + this, + MusicPlayerRemote.playingQueue, + MusicPlayerRemote.position, + R.layout.item_queue ) wrappedAdapter = recyclerViewDragDropManager?.createWrappedAdapter(playingQueueAdapter!!) wrappedAdapter = wrappedAdapter?.let { recyclerViewSwipeManager?.createWrappedAdapter(it) } @@ -105,7 +111,6 @@ open class PlayingQueueActivity : AbsMusicServiceActivity() { } private fun checkForPadding() { - } override fun onQueueChanged() { @@ -178,14 +183,14 @@ open class PlayingQueueActivity : AbsMusicServiceActivity() { applyToolbar(toolbar) clearQueue.backgroundTintList = ColorStateList.valueOf(ThemeStore.accentColor(this)) ColorStateList.valueOf( - MaterialValueHelper.getPrimaryTextColor( - this, - ColorUtil.isColorLight( - ThemeStore.accentColor( - this - ) - ) + MaterialValueHelper.getPrimaryTextColor( + this, + ColorUtil.isColorLight( + ThemeStore.accentColor( + this + ) ) + ) ).apply { clearQueue.setTextColor(this) clearQueue.iconTint = this diff --git a/app/src/main/java/code/name/monkey/retromusic/activities/PlaylistDetailActivity.kt b/app/src/main/java/code/name/monkey/retromusic/activities/PlaylistDetailActivity.kt index 5d1361ce..82a57bd4 100644 --- a/app/src/main/java/code/name/monkey/retromusic/activities/PlaylistDetailActivity.kt +++ b/app/src/main/java/code/name/monkey/retromusic/activities/PlaylistDetailActivity.kt @@ -29,7 +29,11 @@ import com.afollestad.materialcab.MaterialCab import com.h6ah4i.android.widget.advrecyclerview.animator.RefactoredDefaultItemAnimator import com.h6ah4i.android.widget.advrecyclerview.draggable.RecyclerViewDragDropManager import com.h6ah4i.android.widget.advrecyclerview.utils.WrapperAdapterUtils -import kotlinx.android.synthetic.main.activity_playlist_detail.* +import kotlinx.android.synthetic.main.activity_playlist_detail.empty +import kotlinx.android.synthetic.main.activity_playlist_detail.emptyEmoji +import kotlinx.android.synthetic.main.activity_playlist_detail.emptyText +import kotlinx.android.synthetic.main.activity_playlist_detail.recyclerView +import kotlinx.android.synthetic.main.activity_playlist_detail.toolbar import javax.inject.Inject class PlaylistDetailActivity : AbsSlidingMusicPanelActivity(), CabHolder, PlaylistSongsView { @@ -79,19 +83,25 @@ class PlaylistDetailActivity : AbsSlidingMusicPanelActivity(), CabHolder, Playli recyclerViewDragDropManager = RecyclerViewDragDropManager() val animator = RefactoredDefaultItemAnimator() adapter = OrderablePlaylistSongAdapter(this, - ArrayList(), - R.layout.item_list, - false, - this, - object : OrderablePlaylistSongAdapter.OnMoveItemListener { - override fun onMoveItem(fromPosition: Int, toPosition: Int) { - if (PlaylistsUtil.moveItem(this@PlaylistDetailActivity, playlist.id, fromPosition, toPosition)) { - val song = adapter.dataSet.removeAt(fromPosition) - adapter.dataSet.add(toPosition, song) - adapter.notifyItemMoved(fromPosition, toPosition) - } + ArrayList(), + R.layout.item_list, + false, + this, + object : OrderablePlaylistSongAdapter.OnMoveItemListener { + override fun onMoveItem(fromPosition: Int, toPosition: Int) { + if (PlaylistsUtil.moveItem( + this@PlaylistDetailActivity, + playlist.id, + fromPosition, + toPosition + ) + ) { + val song = adapter.dataSet.removeAt(fromPosition) + adapter.dataSet.add(toPosition, song) + adapter.notifyItemMoved(fromPosition, toPosition) } - }) + } + }) wrappedAdapter = recyclerViewDragDropManager!!.createWrappedAdapter(adapter) recyclerView.adapter = wrappedAdapter @@ -120,8 +130,8 @@ class PlaylistDetailActivity : AbsSlidingMusicPanelActivity(), CabHolder, Playli override fun onCreateOptionsMenu(menu: Menu): Boolean { menuInflater.inflate( - if (playlist is AbsCustomPlaylist) R.menu.menu_smart_playlist_detail - else R.menu.menu_playlist_detail, menu + if (playlist is AbsCustomPlaylist) R.menu.menu_smart_playlist_detail + else R.menu.menu_playlist_detail, menu ) return super.onCreateOptionsMenu(menu) } @@ -140,7 +150,15 @@ class PlaylistDetailActivity : AbsSlidingMusicPanelActivity(), CabHolder, Playli if (cab != null && cab!!.isActive) { cab!!.finish() } - cab = MaterialCab(this, R.id.cab_stub).setMenu(menuRes).setCloseDrawableRes(R.drawable.ic_close_white_24dp).setBackgroundColor(RetroColorUtil.shiftBackgroundColorForLightText(ATHUtil.resolveColor(this, R.attr.colorSurface))).start(callback) + cab = MaterialCab(this, R.id.cab_stub).setMenu(menuRes).setCloseDrawableRes(R.drawable.ic_close_white_24dp) + .setBackgroundColor( + RetroColorUtil.shiftBackgroundColorForLightText( + ATHUtil.resolveColor( + this, + R.attr.colorSurface + ) + ) + ).start(callback) return cab!! } diff --git a/app/src/main/java/code/name/monkey/retromusic/activities/PurchaseActivity.kt b/app/src/main/java/code/name/monkey/retromusic/activities/PurchaseActivity.kt index 1d1eeb0f..24e6d1f0 100644 --- a/app/src/main/java/code/name/monkey/retromusic/activities/PurchaseActivity.kt +++ b/app/src/main/java/code/name/monkey/retromusic/activities/PurchaseActivity.kt @@ -14,140 +14,143 @@ import code.name.monkey.retromusic.activities.base.AbsBaseActivity import code.name.monkey.retromusic.extensions.applyToolbar import com.anjlab.android.iab.v3.BillingProcessor import com.anjlab.android.iab.v3.TransactionDetails -import kotlinx.android.synthetic.main.activity_pro_version.* +import kotlinx.android.synthetic.main.activity_pro_version.purchaseButton +import kotlinx.android.synthetic.main.activity_pro_version.restoreButton +import kotlinx.android.synthetic.main.activity_pro_version.toolbar import java.lang.ref.WeakReference class PurchaseActivity : AbsBaseActivity(), BillingProcessor.IBillingHandler { - private lateinit var billingProcessor: BillingProcessor - private var restorePurchaseAsyncTask: AsyncTask<*, *, *>? = null + private lateinit var billingProcessor: BillingProcessor + private var restorePurchaseAsyncTask: AsyncTask<*, *, *>? = null - override fun onCreate(savedInstanceState: Bundle?) { - setDrawUnderStatusBar() - super.onCreate(savedInstanceState) - setContentView(R.layout.activity_pro_version) - setStatusbarColorAuto() - setNavigationbarColorAuto() - setLightNavigationBar(true) - applyToolbar(toolbar) + override fun onCreate(savedInstanceState: Bundle?) { + setDrawUnderStatusBar() + super.onCreate(savedInstanceState) + setContentView(R.layout.activity_pro_version) + setStatusbarColorAuto() + setNavigationbarColorAuto() + setLightNavigationBar(true) + applyToolbar(toolbar) - restoreButton.isEnabled = false - purchaseButton.isEnabled = false + restoreButton.isEnabled = false + purchaseButton.isEnabled = false - billingProcessor = BillingProcessor(this, BuildConfig.GOOGLE_PLAY_LICENSING_KEY, this) + billingProcessor = BillingProcessor(this, BuildConfig.GOOGLE_PLAY_LICENSING_KEY, this) - MaterialUtil.setTint(restoreButton, false) - MaterialUtil.setTint(purchaseButton, true) + MaterialUtil.setTint(restoreButton, false) + MaterialUtil.setTint(purchaseButton, true) - restoreButton.setOnClickListener { - if (restorePurchaseAsyncTask == null || restorePurchaseAsyncTask!!.status != AsyncTask.Status.RUNNING) { - restorePurchase() - } + restoreButton.setOnClickListener { + if (restorePurchaseAsyncTask == null || restorePurchaseAsyncTask!!.status != AsyncTask.Status.RUNNING) { + restorePurchase() + } - } - purchaseButton.setOnClickListener { - billingProcessor.purchase(this@PurchaseActivity, App.PRO_VERSION_PRODUCT_ID) - } - } + } + purchaseButton.setOnClickListener { + billingProcessor.purchase(this@PurchaseActivity, App.PRO_VERSION_PRODUCT_ID) + } + } - private fun restorePurchase() { - if (restorePurchaseAsyncTask != null) { - restorePurchaseAsyncTask!!.cancel(false) - } - restorePurchaseAsyncTask = RestorePurchaseAsyncTask(this).execute() - } + private fun restorePurchase() { + if (restorePurchaseAsyncTask != null) { + restorePurchaseAsyncTask!!.cancel(false) + } + restorePurchaseAsyncTask = RestorePurchaseAsyncTask(this).execute() + } - override fun onProductPurchased(productId: String, details: TransactionDetails?) { - Toast.makeText(this, R.string.thank_you, Toast.LENGTH_SHORT).show() - setResult(RESULT_OK) - } + override fun onProductPurchased(productId: String, details: TransactionDetails?) { + Toast.makeText(this, R.string.thank_you, Toast.LENGTH_SHORT).show() + setResult(RESULT_OK) + } - override fun onPurchaseHistoryRestored() { - if (App.isProVersion()) { - Toast.makeText( - this, - R.string.restored_previous_purchase_please_restart, - Toast.LENGTH_LONG - ).show() - setResult(RESULT_OK) - } else { - Toast.makeText(this, R.string.no_purchase_found, Toast.LENGTH_SHORT).show() - } - } + override fun onPurchaseHistoryRestored() { + if (App.isProVersion()) { + Toast.makeText( + this, + R.string.restored_previous_purchase_please_restart, + Toast.LENGTH_LONG + ).show() + setResult(RESULT_OK) + } else { + Toast.makeText(this, R.string.no_purchase_found, Toast.LENGTH_SHORT).show() + } + } - override fun onBillingError(errorCode: Int, error: Throwable?) { - Log.e(TAG, "Billing error: code = $errorCode", error) - } + override fun onBillingError(errorCode: Int, error: Throwable?) { + Log.e(TAG, "Billing error: code = $errorCode", error) + } - override fun onBillingInitialized() { - restoreButton.isEnabled = true - purchaseButton.isEnabled = true - } + override fun onBillingInitialized() { + restoreButton.isEnabled = true + purchaseButton.isEnabled = true + } - public override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { - if (!billingProcessor.handleActivityResult(requestCode, resultCode, data)) { - super.onActivityResult(requestCode, resultCode, data) - } - } + public override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { + if (!billingProcessor.handleActivityResult(requestCode, resultCode, data)) { + super.onActivityResult(requestCode, resultCode, data) + } + } - override fun onOptionsItemSelected(item: MenuItem): Boolean { - when (item.itemId) { - android.R.id.home -> finish() - } - return super.onOptionsItemSelected(item) - } + override fun onOptionsItemSelected(item: MenuItem): Boolean { + when (item.itemId) { + android.R.id.home -> finish() + } + return super.onOptionsItemSelected(item) + } - override fun onDestroy() { - billingProcessor.release() - super.onDestroy() - } + override fun onDestroy() { + billingProcessor.release() + super.onDestroy() + } - private class RestorePurchaseAsyncTask internal constructor(purchaseActivity: PurchaseActivity) : AsyncTask() { + private class RestorePurchaseAsyncTask internal constructor(purchaseActivity: PurchaseActivity) : + AsyncTask() { - private val buyActivityWeakReference: WeakReference = WeakReference( - purchaseActivity - ) + private val buyActivityWeakReference: WeakReference = WeakReference( + purchaseActivity + ) - override fun onPreExecute() { - super.onPreExecute() - val purchaseActivity = buyActivityWeakReference.get() - if (purchaseActivity != null) { - Toast.makeText(purchaseActivity, R.string.restoring_purchase, Toast.LENGTH_SHORT) - .show() - } else { - cancel(false) - } - } + override fun onPreExecute() { + super.onPreExecute() + val purchaseActivity = buyActivityWeakReference.get() + if (purchaseActivity != null) { + Toast.makeText(purchaseActivity, R.string.restoring_purchase, Toast.LENGTH_SHORT) + .show() + } else { + cancel(false) + } + } - override fun doInBackground(vararg params: Void): Boolean? { - val purchaseActivity = buyActivityWeakReference.get() - if (purchaseActivity != null) { - return purchaseActivity.billingProcessor.loadOwnedPurchasesFromGoogle() - } - cancel(false) - return null - } + override fun doInBackground(vararg params: Void): Boolean? { + val purchaseActivity = buyActivityWeakReference.get() + if (purchaseActivity != null) { + return purchaseActivity.billingProcessor.loadOwnedPurchasesFromGoogle() + } + cancel(false) + return null + } - override fun onPostExecute(b: Boolean?) { - super.onPostExecute(b) - val purchaseActivity = buyActivityWeakReference.get() - if (purchaseActivity == null || b == null) { - return - } + override fun onPostExecute(b: Boolean?) { + super.onPostExecute(b) + val purchaseActivity = buyActivityWeakReference.get() + if (purchaseActivity == null || b == null) { + return + } - if (b) { - purchaseActivity.onPurchaseHistoryRestored() - } else { - Toast.makeText( - purchaseActivity, - R.string.could_not_restore_purchase, - Toast.LENGTH_SHORT - ).show() - } - } - } + if (b) { + purchaseActivity.onPurchaseHistoryRestored() + } else { + Toast.makeText( + purchaseActivity, + R.string.could_not_restore_purchase, + Toast.LENGTH_SHORT + ).show() + } + } + } - companion object { - private const val TAG: String = "PurchaseActivity" - } + companion object { + private const val TAG: String = "PurchaseActivity" + } } diff --git a/app/src/main/java/code/name/monkey/retromusic/activities/SearchActivity.kt b/app/src/main/java/code/name/monkey/retromusic/activities/SearchActivity.kt index 082adc6b..850aaae3 100644 --- a/app/src/main/java/code/name/monkey/retromusic/activities/SearchActivity.kt +++ b/app/src/main/java/code/name/monkey/retromusic/activities/SearchActivity.kt @@ -29,10 +29,17 @@ import code.name.monkey.retromusic.mvp.presenter.SearchPresenter import code.name.monkey.retromusic.mvp.presenter.SearchView import code.name.monkey.retromusic.util.RetroUtil import com.google.android.material.textfield.TextInputEditText -import kotlinx.android.synthetic.main.activity_search.* -import java.util.* +import kotlinx.android.synthetic.main.activity_search.appBarLayout +import kotlinx.android.synthetic.main.activity_search.back +import kotlinx.android.synthetic.main.activity_search.clearText +import kotlinx.android.synthetic.main.activity_search.empty +import kotlinx.android.synthetic.main.activity_search.keyboardPopup +import kotlinx.android.synthetic.main.activity_search.recyclerView +import kotlinx.android.synthetic.main.activity_search.searchContainer +import kotlinx.android.synthetic.main.activity_search.searchView +import kotlinx.android.synthetic.main.activity_search.voiceSearch +import java.util.Locale import javax.inject.Inject -import kotlin.collections.ArrayList class SearchActivity : AbsMusicServiceActivity(), OnQueryTextListener, TextWatcher, SearchView { @Inject @@ -73,7 +80,7 @@ class SearchActivity : AbsMusicServiceActivity(), OnQueryTextListener, TextWatch keyboardPopup.backgroundTintList = ColorStateList.valueOf(ThemeStore.accentColor(this)) ColorStateList.valueOf( - MaterialValueHelper.getPrimaryTextColor(this, ColorUtil.isColorLight(ThemeStore.accentColor(this))) + MaterialValueHelper.getPrimaryTextColor(this, ColorUtil.isColorLight(ThemeStore.accentColor(this))) ).apply { keyboardPopup.setTextColor(this) keyboardPopup.iconTint = this @@ -81,7 +88,6 @@ class SearchActivity : AbsMusicServiceActivity(), OnQueryTextListener, TextWatch if (savedInstanceState != null) { query = savedInstanceState.getString(QUERY) } - } private fun setupRecyclerView() { @@ -181,8 +187,8 @@ class SearchActivity : AbsMusicServiceActivity(), OnQueryTextListener, TextWatch private fun startMicSearch() { val intent = Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH) intent.putExtra( - RecognizerIntent.EXTRA_LANGUAGE_MODEL, - RecognizerIntent.LANGUAGE_MODEL_FREE_FORM + RecognizerIntent.EXTRA_LANGUAGE_MODEL, + RecognizerIntent.LANGUAGE_MODEL_FREE_FORM ) intent.putExtra(RecognizerIntent.EXTRA_LANGUAGE, Locale.getDefault()) intent.putExtra(RecognizerIntent.EXTRA_PROMPT, getString(R.string.speech_prompt)) @@ -191,13 +197,11 @@ class SearchActivity : AbsMusicServiceActivity(), OnQueryTextListener, TextWatch } catch (e: ActivityNotFoundException) { e.printStackTrace() Toast.makeText(this, getString(R.string.speech_not_supported), Toast.LENGTH_SHORT) - .show() + .show() } - } override fun beforeTextChanged(s: CharSequence, start: Int, count: Int, after: Int) { - } override fun onTextChanged(newText: CharSequence, start: Int, before: Int, count: Int) { @@ -205,7 +209,6 @@ class SearchActivity : AbsMusicServiceActivity(), OnQueryTextListener, TextWatch } override fun afterTextChanged(s: Editable) { - } companion object { diff --git a/app/src/main/java/code/name/monkey/retromusic/activities/base/AbsBaseActivity.kt b/app/src/main/java/code/name/monkey/retromusic/activities/base/AbsBaseActivity.kt index 3b096f51..649fc3cc 100644 --- a/app/src/main/java/code/name/monkey/retromusic/activities/base/AbsBaseActivity.kt +++ b/app/src/main/java/code/name/monkey/retromusic/activities/base/AbsBaseActivity.kt @@ -5,139 +5,142 @@ import android.content.Intent import android.content.pm.PackageManager import android.media.AudioManager import android.net.Uri -import android.os.* +import android.os.Build +import android.os.Bundle import android.provider.Settings -import android.view.* +import android.view.KeyEvent +import android.view.View import androidx.core.app.ActivityCompat import code.name.monkey.appthemehelper.ThemeStore +import code.name.monkey.retromusic.R import com.google.android.material.snackbar.Snackbar abstract class AbsBaseActivity : AbsThemeActivity() { - private var hadPermissions: Boolean = false - private lateinit var permissions: Array - private var permissionDeniedMessage: String? = null + private var hadPermissions: Boolean = false + private lateinit var permissions: Array + private var permissionDeniedMessage: String? = null - open fun getPermissionsToRequest(): Array { - return arrayOf() - } + open fun getPermissionsToRequest(): Array { + return arrayOf() + } - protected fun setPermissionDeniedMessage(message: String) { - permissionDeniedMessage = message - } + protected fun setPermissionDeniedMessage(message: String) { + permissionDeniedMessage = message + } - fun getPermissionDeniedMessage(): String { - return if (permissionDeniedMessage == null) getString(code.name.monkey.retromusic.R.string.permissions_denied) else permissionDeniedMessage!! - } + fun getPermissionDeniedMessage(): String { + return if (permissionDeniedMessage == null) getString(R.string.permissions_denied) else permissionDeniedMessage!! + } - private val snackBarContainer: View - get() = window.decorView + private val snackBarContainer: View + get() = window.decorView - override fun onCreate(savedInstanceState: Bundle?) { - super.onCreate(savedInstanceState) - volumeControlStream = AudioManager.STREAM_MUSIC - permissions = getPermissionsToRequest() - hadPermissions = hasPermissions() - permissionDeniedMessage = null - } + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + volumeControlStream = AudioManager.STREAM_MUSIC + permissions = getPermissionsToRequest() + hadPermissions = hasPermissions() + permissionDeniedMessage = null + } - override fun onPostCreate(savedInstanceState: Bundle?) { - super.onPostCreate(savedInstanceState) - if (!hasPermissions()) { - requestPermissions() - } - } + override fun onPostCreate(savedInstanceState: Bundle?) { + super.onPostCreate(savedInstanceState) + if (!hasPermissions()) { + requestPermissions() + } + } - override fun onResume() { - super.onResume() - val hasPermissions = hasPermissions() - if (hasPermissions != hadPermissions) { - hadPermissions = hasPermissions - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { - onHasPermissionsChanged(hasPermissions) - } - } - } + override fun onResume() { + super.onResume() + val hasPermissions = hasPermissions() + if (hasPermissions != hadPermissions) { + hadPermissions = hasPermissions + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { + onHasPermissionsChanged(hasPermissions) + } + } + } - protected open fun onHasPermissionsChanged(hasPermissions: Boolean) { - // implemented by sub classes - } + protected open fun onHasPermissionsChanged(hasPermissions: Boolean) { + // implemented by sub classes + } - override fun dispatchKeyEvent(event: KeyEvent): Boolean { - if (event.keyCode == KeyEvent.KEYCODE_MENU && event.action == KeyEvent.ACTION_UP) { - showOverflowMenu() - return true - } - return super.dispatchKeyEvent(event) - } + override fun dispatchKeyEvent(event: KeyEvent): Boolean { + if (event.keyCode == KeyEvent.KEYCODE_MENU && event.action == KeyEvent.ACTION_UP) { + showOverflowMenu() + return true + } + return super.dispatchKeyEvent(event) + } - protected fun showOverflowMenu() { + protected fun showOverflowMenu() { + } - } + protected open fun requestPermissions() { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { + requestPermissions(permissions, PERMISSION_REQUEST) + } + } - protected open fun requestPermissions() { - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { - requestPermissions(permissions, PERMISSION_REQUEST) - } - } + protected fun hasPermissions(): Boolean { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { + for (permission in permissions) { + if (checkSelfPermission(permission) != PackageManager.PERMISSION_GRANTED) { + return false + } + } + } + return true + } - protected fun hasPermissions(): Boolean { - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { - for (permission in permissions) { - if (checkSelfPermission(permission) != PackageManager.PERMISSION_GRANTED) { - return false - } - } - } - return true - } + override fun onRequestPermissionsResult( + requestCode: Int, + permissions: Array, + grantResults: IntArray + ) { + super.onRequestPermissionsResult(requestCode, permissions, grantResults) + if (requestCode == PERMISSION_REQUEST) { + for (grantResult in grantResults) { + if (grantResult != PackageManager.PERMISSION_GRANTED) { + if (ActivityCompat.shouldShowRequestPermissionRationale( + this@AbsBaseActivity, Manifest.permission.WRITE_EXTERNAL_STORAGE + ) + ) { + //User has deny from permission dialog + Snackbar.make( + snackBarContainer, + permissionDeniedMessage!!, + Snackbar.LENGTH_INDEFINITE + ) + .setAction(code.name.monkey.retromusic.R.string.action_grant) { requestPermissions() } + .setActionTextColor(ThemeStore.accentColor(this)).show() + } else { + // User has deny permission and checked never show permission dialog so you can redirect to Application settings page + Snackbar.make( + snackBarContainer, + permissionDeniedMessage!!, + Snackbar.LENGTH_INDEFINITE + ).setAction(code.name.monkey.retromusic.R.string.action_settings) { + val intent = Intent() + intent.action = Settings.ACTION_APPLICATION_DETAILS_SETTINGS + val uri = Uri.fromParts( + "package", + this@AbsBaseActivity.packageName, + null + ) + intent.data = uri + startActivity(intent) + }.setActionTextColor(ThemeStore.accentColor(this)).show() + } + return + } + } + hadPermissions = true + onHasPermissionsChanged(true) + } + } - override fun onRequestPermissionsResult( - requestCode: Int, - permissions: Array, - grantResults: IntArray - ) { - super.onRequestPermissionsResult(requestCode, permissions, grantResults) - if (requestCode == PERMISSION_REQUEST) { - for (grantResult in grantResults) { - if (grantResult != PackageManager.PERMISSION_GRANTED) { - if (ActivityCompat.shouldShowRequestPermissionRationale( - this@AbsBaseActivity, Manifest.permission.WRITE_EXTERNAL_STORAGE - )) { - //User has deny from permission dialog - Snackbar.make( - snackBarContainer, - permissionDeniedMessage!!, - Snackbar.LENGTH_INDEFINITE - ) - .setAction(code.name.monkey.retromusic.R.string.action_grant) { requestPermissions() } - .setActionTextColor(ThemeStore.accentColor(this)).show() - } else { - // User has deny permission and checked never show permission dialog so you can redirect to Application settings page - Snackbar.make( - snackBarContainer, - permissionDeniedMessage!!, - Snackbar.LENGTH_INDEFINITE - ).setAction(code.name.monkey.retromusic.R.string.action_settings) { - val intent = Intent() - intent.action = Settings.ACTION_APPLICATION_DETAILS_SETTINGS - val uri = Uri.fromParts( - "package", - this@AbsBaseActivity.packageName, - null - ) - intent.data = uri - startActivity(intent) - }.setActionTextColor(ThemeStore.accentColor(this)).show() - } - return - } - } - hadPermissions = true - onHasPermissionsChanged(true) - } - } - - companion object { - const val PERMISSION_REQUEST = 100 - } + companion object { + const val PERMISSION_REQUEST = 100 + } } diff --git a/app/src/main/java/code/name/monkey/retromusic/activities/base/AbsMusicServiceActivity.kt b/app/src/main/java/code/name/monkey/retromusic/activities/base/AbsMusicServiceActivity.kt index 30e99735..8472b51d 100644 --- a/app/src/main/java/code/name/monkey/retromusic/activities/base/AbsMusicServiceActivity.kt +++ b/app/src/main/java/code/name/monkey/retromusic/activities/base/AbsMusicServiceActivity.kt @@ -1,167 +1,179 @@ package code.name.monkey.retromusic.activities.base import android.Manifest -import android.content.* -import android.os.* +import android.content.BroadcastReceiver +import android.content.ComponentName +import android.content.Context +import android.content.Intent +import android.content.IntentFilter +import android.content.ServiceConnection +import android.os.Bundle +import android.os.IBinder import code.name.monkey.retromusic.R import code.name.monkey.retromusic.helper.MusicPlayerRemote import code.name.monkey.retromusic.interfaces.MusicServiceEventListener -import code.name.monkey.retromusic.service.MusicService.* +import code.name.monkey.retromusic.service.MusicService.FAVORITE_STATE_CHANGED +import code.name.monkey.retromusic.service.MusicService.MEDIA_STORE_CHANGED +import code.name.monkey.retromusic.service.MusicService.META_CHANGED +import code.name.monkey.retromusic.service.MusicService.PLAY_STATE_CHANGED +import code.name.monkey.retromusic.service.MusicService.QUEUE_CHANGED +import code.name.monkey.retromusic.service.MusicService.REPEAT_MODE_CHANGED +import code.name.monkey.retromusic.service.MusicService.SHUFFLE_MODE_CHANGED import java.lang.ref.WeakReference -import java.util.* +import java.util.ArrayList abstract class AbsMusicServiceActivity : AbsBaseActivity(), MusicServiceEventListener { - private val mMusicServiceEventListeners = ArrayList() + private val mMusicServiceEventListeners = ArrayList() - private var serviceToken: MusicPlayerRemote.ServiceToken? = null - private var musicStateReceiver: MusicStateReceiver? = null - private var receiverRegistered: Boolean = false + private var serviceToken: MusicPlayerRemote.ServiceToken? = null + private var musicStateReceiver: MusicStateReceiver? = null + private var receiverRegistered: Boolean = false - override fun onCreate(savedInstanceState: Bundle?) { - super.onCreate(savedInstanceState) - serviceToken = MusicPlayerRemote.bindToService(this, object : ServiceConnection { - override fun onServiceConnected(name: ComponentName, service: IBinder) { - this@AbsMusicServiceActivity.onServiceConnected() - } + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + serviceToken = MusicPlayerRemote.bindToService(this, object : ServiceConnection { + override fun onServiceConnected(name: ComponentName, service: IBinder) { + this@AbsMusicServiceActivity.onServiceConnected() + } - override fun onServiceDisconnected(name: ComponentName) { - this@AbsMusicServiceActivity.onServiceDisconnected() - } - }) + override fun onServiceDisconnected(name: ComponentName) { + this@AbsMusicServiceActivity.onServiceDisconnected() + } + }) - setPermissionDeniedMessage(getString(R.string.permission_external_storage_denied)); - } + setPermissionDeniedMessage(getString(R.string.permission_external_storage_denied)) + } - override fun onDestroy() { - super.onDestroy() - MusicPlayerRemote.unbindFromService(serviceToken) - if (receiverRegistered) { - unregisterReceiver(musicStateReceiver) - receiverRegistered = false - } - } + override fun onDestroy() { + super.onDestroy() + MusicPlayerRemote.unbindFromService(serviceToken) + if (receiverRegistered) { + unregisterReceiver(musicStateReceiver) + receiverRegistered = false + } + } - fun addMusicServiceEventListener(listener: MusicServiceEventListener?) { - if (listener != null) { - mMusicServiceEventListeners.add(listener) - } - } + fun addMusicServiceEventListener(listener: MusicServiceEventListener?) { + if (listener != null) { + mMusicServiceEventListeners.add(listener) + } + } - fun removeMusicServiceEventListener(listener: MusicServiceEventListener?) { - if (listener != null) { - mMusicServiceEventListeners.remove(listener) - } - } + fun removeMusicServiceEventListener(listener: MusicServiceEventListener?) { + if (listener != null) { + mMusicServiceEventListeners.remove(listener) + } + } - override fun onServiceConnected() { - if (!receiverRegistered) { - musicStateReceiver = MusicStateReceiver(this) + override fun onServiceConnected() { + if (!receiverRegistered) { + musicStateReceiver = MusicStateReceiver(this) - val filter = IntentFilter() - filter.addAction(PLAY_STATE_CHANGED) - filter.addAction(SHUFFLE_MODE_CHANGED) - filter.addAction(REPEAT_MODE_CHANGED) - filter.addAction(META_CHANGED) - filter.addAction(QUEUE_CHANGED) - filter.addAction(MEDIA_STORE_CHANGED) - filter.addAction(FAVORITE_STATE_CHANGED) + val filter = IntentFilter() + filter.addAction(PLAY_STATE_CHANGED) + filter.addAction(SHUFFLE_MODE_CHANGED) + filter.addAction(REPEAT_MODE_CHANGED) + filter.addAction(META_CHANGED) + filter.addAction(QUEUE_CHANGED) + filter.addAction(MEDIA_STORE_CHANGED) + filter.addAction(FAVORITE_STATE_CHANGED) - registerReceiver(musicStateReceiver, filter) + registerReceiver(musicStateReceiver, filter) - receiverRegistered = true - } + receiverRegistered = true + } - for (listener in mMusicServiceEventListeners) { - listener.onServiceConnected() - } - } + for (listener in mMusicServiceEventListeners) { + listener.onServiceConnected() + } + } - override fun onServiceDisconnected() { - if (receiverRegistered) { - unregisterReceiver(musicStateReceiver) - receiverRegistered = false - } + override fun onServiceDisconnected() { + if (receiverRegistered) { + unregisterReceiver(musicStateReceiver) + receiverRegistered = false + } - for (listener in mMusicServiceEventListeners) { - listener.onServiceDisconnected() - } - } + for (listener in mMusicServiceEventListeners) { + listener.onServiceDisconnected() + } + } - override fun onPlayingMetaChanged() { - for (listener in mMusicServiceEventListeners) { - listener.onPlayingMetaChanged() - } - } + override fun onPlayingMetaChanged() { + for (listener in mMusicServiceEventListeners) { + listener.onPlayingMetaChanged() + } + } - override fun onQueueChanged() { - for (listener in mMusicServiceEventListeners) { - listener.onQueueChanged() - } - } + override fun onQueueChanged() { + for (listener in mMusicServiceEventListeners) { + listener.onQueueChanged() + } + } - override fun onPlayStateChanged() { - for (listener in mMusicServiceEventListeners) { - listener.onPlayStateChanged() - } - } + override fun onPlayStateChanged() { + for (listener in mMusicServiceEventListeners) { + listener.onPlayStateChanged() + } + } - override fun onMediaStoreChanged() { - for (listener in mMusicServiceEventListeners) { - listener.onMediaStoreChanged() - } - } + override fun onMediaStoreChanged() { + for (listener in mMusicServiceEventListeners) { + listener.onMediaStoreChanged() + } + } - override fun onRepeatModeChanged() { - for (listener in mMusicServiceEventListeners) { - listener.onRepeatModeChanged() - } - } + override fun onRepeatModeChanged() { + for (listener in mMusicServiceEventListeners) { + listener.onRepeatModeChanged() + } + } - override fun onShuffleModeChanged() { - for (listener in mMusicServiceEventListeners) { - listener.onShuffleModeChanged() - } - } + override fun onShuffleModeChanged() { + for (listener in mMusicServiceEventListeners) { + listener.onShuffleModeChanged() + } + } - override fun onHasPermissionsChanged(hasPermissions: Boolean) { - super.onHasPermissionsChanged(hasPermissions) - val intent = Intent(MEDIA_STORE_CHANGED) - intent.putExtra( - "from_permissions_changed", - true - ) // just in case we need to know this at some point - sendBroadcast(intent) - } + override fun onHasPermissionsChanged(hasPermissions: Boolean) { + super.onHasPermissionsChanged(hasPermissions) + val intent = Intent(MEDIA_STORE_CHANGED) + intent.putExtra( + "from_permissions_changed", + true + ) // just in case we need to know this at some point + sendBroadcast(intent) + } - override fun getPermissionsToRequest(): Array { - return arrayOf( - Manifest.permission.READ_EXTERNAL_STORAGE, - Manifest.permission.WRITE_EXTERNAL_STORAGE - ) - } + override fun getPermissionsToRequest(): Array { + return arrayOf( + Manifest.permission.READ_EXTERNAL_STORAGE, + Manifest.permission.WRITE_EXTERNAL_STORAGE + ) + } - private class MusicStateReceiver(activity: AbsMusicServiceActivity) : BroadcastReceiver() { + private class MusicStateReceiver(activity: AbsMusicServiceActivity) : BroadcastReceiver() { - private val reference: WeakReference = WeakReference(activity) + private val reference: WeakReference = WeakReference(activity) - override fun onReceive(context: Context, intent: Intent) { - val action = intent.action - val activity = reference.get() - if (activity != null && action != null) { - when (action) { - FAVORITE_STATE_CHANGED, META_CHANGED -> activity.onPlayingMetaChanged() - QUEUE_CHANGED -> activity.onQueueChanged() - PLAY_STATE_CHANGED -> activity.onPlayStateChanged() - REPEAT_MODE_CHANGED -> activity.onRepeatModeChanged() - SHUFFLE_MODE_CHANGED -> activity.onShuffleModeChanged() - MEDIA_STORE_CHANGED -> activity.onMediaStoreChanged() - } - } - } - } + override fun onReceive(context: Context, intent: Intent) { + val action = intent.action + val activity = reference.get() + if (activity != null && action != null) { + when (action) { + FAVORITE_STATE_CHANGED, META_CHANGED -> activity.onPlayingMetaChanged() + QUEUE_CHANGED -> activity.onQueueChanged() + PLAY_STATE_CHANGED -> activity.onPlayStateChanged() + REPEAT_MODE_CHANGED -> activity.onRepeatModeChanged() + SHUFFLE_MODE_CHANGED -> activity.onShuffleModeChanged() + MEDIA_STORE_CHANGED -> activity.onMediaStoreChanged() + } + } + } + } - companion object { - val TAG: String = AbsMusicServiceActivity::class.java.simpleName - } + companion object { + val TAG: String = AbsMusicServiceActivity::class.java.simpleName + } } diff --git a/app/src/main/java/code/name/monkey/retromusic/activities/base/AbsSlidingMusicPanelActivity.kt b/app/src/main/java/code/name/monkey/retromusic/activities/base/AbsSlidingMusicPanelActivity.kt index cc72372d..2b4dd3c6 100644 --- a/app/src/main/java/code/name/monkey/retromusic/activities/base/AbsSlidingMusicPanelActivity.kt +++ b/app/src/main/java/code/name/monkey/retromusic/activities/base/AbsSlidingMusicPanelActivity.kt @@ -15,7 +15,20 @@ import code.name.monkey.retromusic.extensions.hide import code.name.monkey.retromusic.extensions.show import code.name.monkey.retromusic.fragments.MiniPlayerFragment import code.name.monkey.retromusic.fragments.NowPlayingScreen -import code.name.monkey.retromusic.fragments.NowPlayingScreen.* +import code.name.monkey.retromusic.fragments.NowPlayingScreen.ADAPTIVE +import code.name.monkey.retromusic.fragments.NowPlayingScreen.BLUR +import code.name.monkey.retromusic.fragments.NowPlayingScreen.BLUR_CARD +import code.name.monkey.retromusic.fragments.NowPlayingScreen.CARD +import code.name.monkey.retromusic.fragments.NowPlayingScreen.COLOR +import code.name.monkey.retromusic.fragments.NowPlayingScreen.FIT +import code.name.monkey.retromusic.fragments.NowPlayingScreen.FLAT +import code.name.monkey.retromusic.fragments.NowPlayingScreen.FULL +import code.name.monkey.retromusic.fragments.NowPlayingScreen.MATERIAL +import code.name.monkey.retromusic.fragments.NowPlayingScreen.NORMAL +import code.name.monkey.retromusic.fragments.NowPlayingScreen.PEAK +import code.name.monkey.retromusic.fragments.NowPlayingScreen.PLAIN +import code.name.monkey.retromusic.fragments.NowPlayingScreen.SIMPLE +import code.name.monkey.retromusic.fragments.NowPlayingScreen.TINY import code.name.monkey.retromusic.fragments.base.AbsPlayerFragment import code.name.monkey.retromusic.fragments.player.adaptive.AdaptiveFragment import code.name.monkey.retromusic.fragments.player.blur.BlurPlayerFragment @@ -38,7 +51,9 @@ import code.name.monkey.retromusic.util.PreferenceUtil import code.name.monkey.retromusic.views.BottomNavigationBarTinted import com.google.android.material.bottomsheet.BottomSheetBehavior import com.google.android.material.card.MaterialCardView -import kotlinx.android.synthetic.main.sliding_music_panel_layout.* +import kotlinx.android.synthetic.main.sliding_music_panel_layout.bottomNavigationView +import kotlinx.android.synthetic.main.sliding_music_panel_layout.dimBackground +import kotlinx.android.synthetic.main.sliding_music_panel_layout.slidingPanel abstract class AbsSlidingMusicPanelActivity : AbsMusicServiceActivity(), AbsPlayerFragment.Callbacks { companion object { @@ -205,7 +220,8 @@ abstract class AbsSlidingMusicPanelActivity : AbsMusicServiceActivity(), AbsPlay slidingPanel.cardElevation = DensityUtil.dip2px(this, 10f).toFloat() bottomNavigationView.elevation = DensityUtil.dip2px(this, 10f).toFloat() bottomSheetBehavior.isHideable = false - bottomSheetBehavior.peekHeight = if (bottomNavigationView.visibility == View.VISIBLE) heightOfBarWithTabs else heightOfBar + bottomSheetBehavior.peekHeight = + if (bottomNavigationView.visibility == View.VISIBLE) heightOfBarWithTabs else heightOfBar } } } @@ -236,7 +252,7 @@ abstract class AbsSlidingMusicPanelActivity : AbsMusicServiceActivity(), AbsPlay else -> PlayerFragment() } // must implement AbsPlayerFragment supportFragmentManager.beginTransaction().replace(R.id.playerFragmentContainer, fragment) - .commit() + .commit() supportFragmentManager.executePendingTransactions() playerFragment = supportFragmentManager.findFragmentById(R.id.playerFragmentContainer) as AbsPlayerFragment @@ -292,7 +308,14 @@ abstract class AbsSlidingMusicPanelActivity : AbsMusicServiceActivity(), AbsPlay super.setLightNavigationBar(isColorLight) super.setLightStatusbar(isColorLight) } else { - super.setLightStatusbar(ColorUtil.isColorLight(ATHUtil.resolveColor(this, android.R.attr.windowBackground))) + super.setLightStatusbar( + ColorUtil.isColorLight( + ATHUtil.resolveColor( + this, + android.R.attr.windowBackground + ) + ) + ) super.setLightNavigationBar(true) } } 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 96bace4d..6ea53f26 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 @@ -68,7 +68,8 @@ abstract class AbsThemeActivity : ATHToolbarActivity(), Runnable { var background: Drawable? = if (PreferenceUtil.getInstance(this).isRoundCorners) ContextCompat.getDrawable(this, R.drawable.round_window) else ContextCompat.getDrawable(this, R.drawable.square_window) - background = TintHelper.createTintedDrawable(background, ATHUtil.resolveColor(this, android.R.attr.windowBackground)) + background = + TintHelper.createTintedDrawable(background, ATHUtil.resolveColor(this, android.R.attr.windowBackground)) window.setBackgroundDrawable(background) } @@ -158,7 +159,8 @@ abstract class AbsThemeActivity : ATHToolbarActivity(), Runnable { } private fun setImmersiveFullscreen() { - val flags = (View.SYSTEM_UI_FLAG_LAYOUT_STABLE or View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION or View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN or View.SYSTEM_UI_FLAG_HIDE_NAVIGATION or View.SYSTEM_UI_FLAG_FULLSCREEN or View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY) + val flags = + (View.SYSTEM_UI_FLAG_LAYOUT_STABLE or View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION or View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN or View.SYSTEM_UI_FLAG_HIDE_NAVIGATION or View.SYSTEM_UI_FLAG_FULLSCREEN or View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY) if (PreferenceUtil.getInstance(this).fullScreenMode) { window.decorView.systemUiVisibility = flags @@ -190,6 +192,5 @@ abstract class AbsThemeActivity : ATHToolbarActivity(), Runnable { handler.postDelayed(this, 500) } return super.onKeyDown(keyCode, event) - } } \ No newline at end of file diff --git a/app/src/main/java/code/name/monkey/retromusic/activities/bugreport/BugReportActivity.kt b/app/src/main/java/code/name/monkey/retromusic/activities/bugreport/BugReportActivity.kt index a8a57809..44f8af2b 100644 --- a/app/src/main/java/code/name/monkey/retromusic/activities/bugreport/BugReportActivity.kt +++ b/app/src/main/java/code/name/monkey/retromusic/activities/bugreport/BugReportActivity.kt @@ -32,9 +32,19 @@ import com.afollestad.materialdialogs.MaterialDialog import com.afollestad.materialdialogs.callbacks.onCancel import com.google.android.material.floatingactionbutton.FloatingActionButton import com.google.android.material.textfield.TextInputLayout -import kotlinx.android.synthetic.main.activity_bug_report.* -import kotlinx.android.synthetic.main.bug_report_card_device_info.* -import kotlinx.android.synthetic.main.bug_report_card_report.* +import kotlinx.android.synthetic.main.activity_bug_report.sendFab +import kotlinx.android.synthetic.main.activity_bug_report.toolbar +import kotlinx.android.synthetic.main.bug_report_card_device_info.airTextDeviceInfo +import kotlinx.android.synthetic.main.bug_report_card_report.inputDescription +import kotlinx.android.synthetic.main.bug_report_card_report.inputLayoutDescription +import kotlinx.android.synthetic.main.bug_report_card_report.inputLayoutPassword +import kotlinx.android.synthetic.main.bug_report_card_report.inputLayoutTitle +import kotlinx.android.synthetic.main.bug_report_card_report.inputLayoutUsername +import kotlinx.android.synthetic.main.bug_report_card_report.inputPassword +import kotlinx.android.synthetic.main.bug_report_card_report.inputTitle +import kotlinx.android.synthetic.main.bug_report_card_report.inputUsername +import kotlinx.android.synthetic.main.bug_report_card_report.optionAnonymous +import kotlinx.android.synthetic.main.bug_report_card_report.optionUseAccount import org.eclipse.egit.github.core.Issue import org.eclipse.egit.github.core.client.GitHubClient import org.eclipse.egit.github.core.client.RequestException @@ -48,11 +58,11 @@ private const val RESULT_ISSUES_NOT_ENABLED = "RESULT_ISSUES_NOT_ENABLED" private const val RESULT_UNKNOWN = "RESULT_UNKNOWN" @StringDef( - RESULT_SUCCESS, - RESULT_BAD_CREDENTIALS, - RESULT_INVALID_TOKEN, - RESULT_ISSUES_NOT_ENABLED, - RESULT_UNKNOWN + RESULT_SUCCESS, + RESULT_BAD_CREDENTIALS, + RESULT_INVALID_TOKEN, + RESULT_ISSUES_NOT_ENABLED, + RESULT_UNKNOWN ) @Retention(AnnotationRetention.SOURCE) private annotation class Result @@ -157,9 +167,9 @@ open class BugReportActivity : AbsThemeActivity() { val clip = ClipData.newPlainText(getString(R.string.device_info), deviceInfo?.toMarkdown()) clipboard.setPrimaryClip(clip) Toast.makeText( - this@BugReportActivity, - R.string.copied_device_info_to_clipboard, - Toast.LENGTH_LONG + this@BugReportActivity, + R.string.copied_device_info_to_clipboard, + Toast.LENGTH_LONG ).show() } @@ -232,11 +242,12 @@ open class BugReportActivity : AbsThemeActivity() { } private class ReportIssueAsyncTask private constructor( - activity: Activity, - private val report: Report, - private val target: GithubTarget, - private val login: GithubLogin + activity: Activity, + private val report: Report, + private val target: GithubTarget, + private val login: GithubLogin ) : DialogAsyncTask(activity) { + override fun createDialog(context: Context): Dialog { return AlertDialog.Builder(context).show() } @@ -268,7 +279,6 @@ open class BugReportActivity : AbsThemeActivity() { e.printStackTrace() return RESULT_UNKNOWN } - } override fun onPostExecute(@Result result: String) { @@ -312,10 +322,10 @@ open class BugReportActivity : AbsThemeActivity() { companion object { fun report( - activity: Activity, - report: Report, - target: GithubTarget, - login: GithubLogin + activity: Activity, + report: Report, + target: GithubTarget, + login: GithubLogin ) { ReportIssueAsyncTask(activity, report, target, login).execute() } diff --git a/app/src/main/java/code/name/monkey/retromusic/activities/bugreport/model/DeviceInfo.java b/app/src/main/java/code/name/monkey/retromusic/activities/bugreport/model/DeviceInfo.java index 4e7ea77e..94879474 100644 --- a/app/src/main/java/code/name/monkey/retromusic/activities/bugreport/model/DeviceInfo.java +++ b/app/src/main/java/code/name/monkey/retromusic/activities/bugreport/model/DeviceInfo.java @@ -5,41 +5,56 @@ import android.content.Context; import android.content.pm.PackageInfo; import android.content.pm.PackageManager; import android.os.Build; - import androidx.annotation.IntRange; - +import code.name.monkey.retromusic.util.PreferenceUtil; import java.util.Arrays; -import code.name.monkey.retromusic.util.PreferenceUtil; - public class DeviceInfo { - private final int versionCode; - private final String versionName; - private final String buildVersion = Build.VERSION.INCREMENTAL; - private final String releaseVersion = Build.VERSION.RELEASE; - @IntRange(from = 0) - private final int sdkVersion = Build.VERSION.SDK_INT; - private final String buildID = Build.DISPLAY; - private final String brand = Build.BRAND; - private final String manufacturer = Build.MANUFACTURER; - private final String device = Build.DEVICE; - private final String model = Build.MODEL; - private final String product = Build.PRODUCT; - private final String hardware = Build.HARDWARE; - private final String baseTheme; - private final String nowPlayingTheme; - private final boolean isAdaptive; + @SuppressLint("NewApi") @SuppressWarnings("deprecation") private final String[] abis = Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP ? Build.SUPPORTED_ABIS : new String[]{Build.CPU_ABI, Build.CPU_ABI2}; + @SuppressLint("NewApi") private final String[] abis32Bits = Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP ? Build.SUPPORTED_32_BIT_ABIS : null; + @SuppressLint("NewApi") private final String[] abis64Bits = Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP ? Build.SUPPORTED_64_BIT_ABIS : null; + private final String baseTheme; + + private final String brand = Build.BRAND; + + private final String buildID = Build.DISPLAY; + + private final String buildVersion = Build.VERSION.INCREMENTAL; + + private final String device = Build.DEVICE; + + private final String hardware = Build.HARDWARE; + + private final boolean isAdaptive; + + private final String manufacturer = Build.MANUFACTURER; + + private final String model = Build.MODEL; + + private final String nowPlayingTheme; + + private final String product = Build.PRODUCT; + + private final String releaseVersion = Build.VERSION.RELEASE; + + @IntRange(from = 0) + private final int sdkVersion = Build.VERSION.SDK_INT; + + private final int versionCode; + + private final String versionName; + public DeviceInfo(Context context) { PackageInfo packageInfo; try { diff --git a/app/src/main/java/code/name/monkey/retromusic/activities/bugreport/model/Report.java b/app/src/main/java/code/name/monkey/retromusic/activities/bugreport/model/Report.java index 4549693f..1da9313b 100644 --- a/app/src/main/java/code/name/monkey/retromusic/activities/bugreport/model/Report.java +++ b/app/src/main/java/code/name/monkey/retromusic/activities/bugreport/model/Report.java @@ -4,7 +4,6 @@ package code.name.monkey.retromusic.activities.bugreport.model; import code.name.monkey.retromusic.activities.bugreport.model.github.ExtraInfo; public class Report { - private final String title; private final String description; @@ -12,6 +11,8 @@ public class Report { private final ExtraInfo extraInfo; + private final String title; + public Report(String title, String description, DeviceInfo deviceInfo, ExtraInfo extraInfo) { this.title = title; this.description = description; @@ -19,14 +20,14 @@ public class Report { this.extraInfo = extraInfo; } - public String getTitle() { - return title; - } - public String getDescription() { return description + "\n\n" + "-\n\n" + deviceInfo.toMarkdown() + "\n\n" + extraInfo.toMarkdown(); } + + public String getTitle() { + return title; + } } diff --git a/app/src/main/java/code/name/monkey/retromusic/activities/bugreport/model/github/ExtraInfo.java b/app/src/main/java/code/name/monkey/retromusic/activities/bugreport/model/github/ExtraInfo.java index c9bedfa6..ec27388c 100644 --- a/app/src/main/java/code/name/monkey/retromusic/activities/bugreport/model/github/ExtraInfo.java +++ b/app/src/main/java/code/name/monkey/retromusic/activities/bugreport/model/github/ExtraInfo.java @@ -4,6 +4,7 @@ import java.util.LinkedHashMap; import java.util.Map; public class ExtraInfo { + private final Map extraInfo = new LinkedHashMap<>(); public void put(String key, String value) { @@ -39,7 +40,9 @@ public class ExtraInfo { } public String toMarkdown() { - if (extraInfo.isEmpty()) return ""; + if (extraInfo.isEmpty()) { + return ""; + } StringBuilder output = new StringBuilder(); output.append("Extra info:\n" diff --git a/app/src/main/java/code/name/monkey/retromusic/activities/bugreport/model/github/GithubLogin.java b/app/src/main/java/code/name/monkey/retromusic/activities/bugreport/model/github/GithubLogin.java index a2d147ee..e388249c 100644 --- a/app/src/main/java/code/name/monkey/retromusic/activities/bugreport/model/github/GithubLogin.java +++ b/app/src/main/java/code/name/monkey/retromusic/activities/bugreport/model/github/GithubLogin.java @@ -3,11 +3,12 @@ package code.name.monkey.retromusic.activities.bugreport.model.github; import android.text.TextUtils; public class GithubLogin { - private final String username; + + private final String apiToken; private final String password; - private final String apiToken; + private final String username; public GithubLogin(String username, String password) { this.username = username; @@ -21,20 +22,20 @@ public class GithubLogin { this.apiToken = apiToken; } - public String getUsername() { - return username; + public String getApiToken() { + return apiToken; } public String getPassword() { return password; } + public String getUsername() { + return username; + } + public boolean shouldUseApiToken() { return TextUtils.isEmpty(username) || TextUtils.isEmpty(password); } - public String getApiToken() { - return apiToken; - } - } diff --git a/app/src/main/java/code/name/monkey/retromusic/activities/bugreport/model/github/GithubTarget.java b/app/src/main/java/code/name/monkey/retromusic/activities/bugreport/model/github/GithubTarget.java index 4bea98be..21126d30 100644 --- a/app/src/main/java/code/name/monkey/retromusic/activities/bugreport/model/github/GithubTarget.java +++ b/app/src/main/java/code/name/monkey/retromusic/activities/bugreport/model/github/GithubTarget.java @@ -1,20 +1,21 @@ package code.name.monkey.retromusic.activities.bugreport.model.github; public class GithubTarget { - private final String username; private final String repository; + private final String username; + public GithubTarget(String username, String repository) { this.username = username; this.repository = repository; } - public String getUsername() { - return username; - } - public String getRepository() { return repository; } + + public String getUsername() { + return username; + } } diff --git a/app/src/main/java/code/name/monkey/retromusic/activities/saf/SAFGuideActivity.java b/app/src/main/java/code/name/monkey/retromusic/activities/saf/SAFGuideActivity.java index 4ba6c990..ef7ce78d 100644 --- a/app/src/main/java/code/name/monkey/retromusic/activities/saf/SAFGuideActivity.java +++ b/app/src/main/java/code/name/monkey/retromusic/activities/saf/SAFGuideActivity.java @@ -16,18 +16,16 @@ package code.name.monkey.retromusic.activities.saf; import android.os.Build; import android.os.Bundle; - import androidx.annotation.Nullable; - +import code.name.monkey.retromusic.R; import com.heinrichreimersoftware.materialintro.app.IntroActivity; import com.heinrichreimersoftware.materialintro.slide.SimpleSlide; -import code.name.monkey.retromusic.R; - /** * Created by hemanths on 2019-07-31. */ public class SAFGuideActivity extends IntroActivity { + public static final int REQUEST_CODE_SAF_GUIDE = 98; @Override @@ -44,7 +42,8 @@ public class SAFGuideActivity extends IntroActivity { addSlide(new SimpleSlide.Builder() .title(title) - .description(Build.VERSION.SDK_INT <= Build.VERSION_CODES.N_MR1 ? R.string.saf_guide_slide1_description_before_o : R.string.saf_guide_slide1_description) + .description(Build.VERSION.SDK_INT <= Build.VERSION_CODES.N_MR1 + ? R.string.saf_guide_slide1_description_before_o : R.string.saf_guide_slide1_description) .image(R.drawable.saf_guide_1) .background(R.color.md_deep_purple_300) .backgroundDark(R.color.md_deep_purple_400) diff --git a/app/src/main/java/code/name/monkey/retromusic/activities/tageditor/AbsTagEditorActivity.kt b/app/src/main/java/code/name/monkey/retromusic/activities/tageditor/AbsTagEditorActivity.kt index df8cbe29..8b82cb48 100755 --- a/app/src/main/java/code/name/monkey/retromusic/activities/tageditor/AbsTagEditorActivity.kt +++ b/app/src/main/java/code/name/monkey/retromusic/activities/tageditor/AbsTagEditorActivity.kt @@ -1,416 +1,417 @@ package code.name.monkey.retromusic.activities.tageditor -import android.app.* +import android.app.Activity +import android.app.SearchManager import android.content.Intent import android.content.res.ColorStateList -import android.graphics.* +import android.graphics.Bitmap +import android.graphics.BitmapFactory import android.net.Uri -import android.os.* +import android.os.Build +import android.os.Bundle import android.util.Log -import android.view.* +import android.view.MenuItem +import android.view.View import android.view.animation.OvershootInterpolator import code.name.monkey.appthemehelper.ThemeStore -import code.name.monkey.appthemehelper.util.* +import code.name.monkey.appthemehelper.util.ATHUtil +import code.name.monkey.appthemehelper.util.ColorUtil +import code.name.monkey.appthemehelper.util.MaterialValueHelper +import code.name.monkey.appthemehelper.util.TintHelper import code.name.monkey.retromusic.R import code.name.monkey.retromusic.activities.base.AbsBaseActivity import code.name.monkey.retromusic.activities.saf.SAFGuideActivity -import code.name.monkey.retromusic.util.* -import com.afollestad.materialdialogs.* +import code.name.monkey.retromusic.util.PreferenceUtil +import code.name.monkey.retromusic.util.RetroUtil +import code.name.monkey.retromusic.util.SAFUtil +import com.afollestad.materialdialogs.LayoutMode +import com.afollestad.materialdialogs.MaterialDialog import com.afollestad.materialdialogs.bottomsheets.BottomSheet import com.afollestad.materialdialogs.list.listItems import com.google.android.material.button.MaterialButton -import kotlinx.android.synthetic.main.activity_album_tag_editor.* -import org.jaudiotagger.audio.* +import kotlinx.android.synthetic.main.activity_album_tag_editor.editorImage +import kotlinx.android.synthetic.main.activity_album_tag_editor.imageContainer +import org.jaudiotagger.audio.AudioFile +import org.jaudiotagger.audio.AudioFileIO import org.jaudiotagger.tag.FieldKey import java.io.File -import java.util.* +import java.util.Collections abstract class AbsTagEditorActivity : AbsBaseActivity() { - protected var id: Int = 0 - private set - private var paletteColorPrimary: Int = 0 - private var isInNoImageMode: Boolean = false - private var songPaths: List? = null - lateinit var saveFab: MaterialButton + protected var id: Int = 0 + private set + private var paletteColorPrimary: Int = 0 + private var isInNoImageMode: Boolean = false + private var songPaths: List? = null + lateinit var saveFab: MaterialButton - private var savedSongPaths: List? = null - private val currentSongPath: String? = null - private var savedTags: Map? = null - private var savedArtworkInfo: ArtworkInfo? = null + private var savedSongPaths: List? = null + private val currentSongPath: String? = null + private var savedTags: Map? = null + private var savedArtworkInfo: ArtworkInfo? = null - protected val show: MaterialDialog - get() = MaterialDialog(this, BottomSheet(LayoutMode.WRAP_CONTENT)).show { - cornerRadius(PreferenceUtil.getInstance(this@AbsTagEditorActivity).dialogCorner) - title(R.string.update_image) - listItems(items = items) { _, position, _ -> - when (position) { - 0 -> startImagePicker() - 1 -> searchImageOnWeb() - 2 -> deleteImage() - } - } - } - protected abstract val contentViewLayout: Int + protected val show: MaterialDialog + get() = MaterialDialog(this, BottomSheet(LayoutMode.WRAP_CONTENT)).show { + cornerRadius(PreferenceUtil.getInstance(this@AbsTagEditorActivity).dialogCorner) + title(R.string.update_image) + listItems(items = items) { _, position, _ -> + when (position) { + 0 -> startImagePicker() + 1 -> searchImageOnWeb() + 2 -> deleteImage() + } + } + } + protected abstract val contentViewLayout: Int - internal val albumArtist: String? - get() { - return try { - getAudioFile(songPaths!![0]).tagOrCreateAndSetDefault.getFirst(FieldKey.ALBUM_ARTIST) - } catch (ignored: Exception) { - null - } + internal val albumArtist: String? + get() { + return try { + getAudioFile(songPaths!![0]).tagOrCreateAndSetDefault.getFirst(FieldKey.ALBUM_ARTIST) + } catch (ignored: Exception) { + null + } + } - } + protected val songTitle: String? + get() { + return try { + getAudioFile(songPaths!![0]).tagOrCreateAndSetDefault.getFirst(FieldKey.TITLE) + } catch (ignored: Exception) { + null + } + } + protected val composer: String? + get() { + return try { + getAudioFile(songPaths!![0]).tagOrCreateAndSetDefault.getFirst(FieldKey.COMPOSER) + } catch (ignored: Exception) { + null + } + } - protected val songTitle: String? - get() { - return try { - getAudioFile(songPaths!![0]).tagOrCreateAndSetDefault.getFirst(FieldKey.TITLE) - } catch (ignored: Exception) { - null - } + protected val albumTitle: String? + get() { + return try { + getAudioFile(songPaths!![0]).tagOrCreateAndSetDefault.getFirst(FieldKey.ALBUM) + } catch (ignored: Exception) { + null + } + } - } - protected val composer: String? - get() { - return try { - getAudioFile(songPaths!![0]).tagOrCreateAndSetDefault.getFirst(FieldKey.COMPOSER) - } catch (ignored: Exception) { - null - } + protected val artistName: String? + get() { + return try { + getAudioFile(songPaths!![0]).tagOrCreateAndSetDefault.getFirst(FieldKey.ARTIST) + } catch (ignored: Exception) { + null + } + } - } + protected val albumArtistName: String? + get() { + return try { + getAudioFile(songPaths!![0]).tagOrCreateAndSetDefault.getFirst(FieldKey.ALBUM_ARTIST) + } catch (ignored: Exception) { + null + } + } - protected val albumTitle: String? - get() { - return try { - getAudioFile(songPaths!![0]).tagOrCreateAndSetDefault.getFirst(FieldKey.ALBUM) - } catch (ignored: Exception) { - null - } + protected val genreName: String? + get() { + return try { + getAudioFile(songPaths!![0]).tagOrCreateAndSetDefault.getFirst(FieldKey.GENRE) + } catch (ignored: Exception) { + null + } + } - } + protected val songYear: String? + get() { + return try { + getAudioFile(songPaths!![0]).tagOrCreateAndSetDefault.getFirst(FieldKey.YEAR) + } catch (ignored: Exception) { + null + } + } - protected val artistName: String? - get() { - return try { - getAudioFile(songPaths!![0]).tagOrCreateAndSetDefault.getFirst(FieldKey.ARTIST) - } catch (ignored: Exception) { - null - } + protected val trackNumber: String? + get() { + return try { + getAudioFile(songPaths!![0]).tagOrCreateAndSetDefault.getFirst(FieldKey.TRACK) + } catch (ignored: Exception) { + null + } + } - } + protected val lyrics: String? + get() { + return try { + getAudioFile(songPaths!![0]).tagOrCreateAndSetDefault.getFirst(FieldKey.LYRICS) + } catch (ignored: Exception) { + null + } + } - protected val albumArtistName: String? - get() { - return try { - getAudioFile(songPaths!![0]).tagOrCreateAndSetDefault.getFirst(FieldKey.ALBUM_ARTIST) - } catch (ignored: Exception) { - null - } + protected val albumArt: Bitmap? + get() { + try { + val artworkTag = getAudioFile(songPaths!![0]).tagOrCreateAndSetDefault.firstArtwork + if (artworkTag != null) { + val artworkBinaryData = artworkTag.binaryData + return BitmapFactory.decodeByteArray( + artworkBinaryData, + 0, + artworkBinaryData.size + ) + } + return null + } catch (ignored: Exception) { + return null + } + } - } + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + setContentView(contentViewLayout) - protected val genreName: String? - get() { - return try { - getAudioFile(songPaths!![0]).tagOrCreateAndSetDefault.getFirst(FieldKey.GENRE) - } catch (ignored: Exception) { - null - } + saveFab = findViewById(R.id.saveTags) + getIntentExtras() - } + songPaths = getSongPaths() + if (songPaths!!.isEmpty()) { + finish() + return + } - protected val songYear: String? - get() { - return try { - getAudioFile(songPaths!![0]).tagOrCreateAndSetDefault.getFirst(FieldKey.YEAR) - } catch (ignored: Exception) { - null - } - - } - - protected val trackNumber: String? - get() { - return try { - getAudioFile(songPaths!![0]).tagOrCreateAndSetDefault.getFirst(FieldKey.TRACK) - } catch (ignored: Exception) { - null - } - - } - - protected val lyrics: String? - get() { - return try { - getAudioFile(songPaths!![0]).tagOrCreateAndSetDefault.getFirst(FieldKey.LYRICS) - } catch (ignored: Exception) { - null - } - - } - - protected val albumArt: Bitmap? - get() { - try { - val artworkTag = getAudioFile(songPaths!![0]).tagOrCreateAndSetDefault.firstArtwork - if (artworkTag != null) { - val artworkBinaryData = artworkTag.binaryData - return BitmapFactory.decodeByteArray( - artworkBinaryData, - 0, - artworkBinaryData.size - ) - } - return null - } catch (ignored: Exception) { - return null - } - - } - - override fun onCreate(savedInstanceState: Bundle?) { - super.onCreate(savedInstanceState) - setContentView(contentViewLayout) - - saveFab = findViewById(R.id.saveTags) - getIntentExtras() - - songPaths = getSongPaths() - if (songPaths!!.isEmpty()) { - finish() - return - } - - setUpViews() + setUpViews() - setNavigationbarColorAuto() - setTaskDescriptionColorAuto() - } + setNavigationbarColorAuto() + setTaskDescriptionColorAuto() + } - private fun setUpViews() { - setUpScrollView() - setUpFab() - setUpImageView() - } + private fun setUpViews() { + setUpScrollView() + setUpFab() + setUpImageView() + } - private fun setUpScrollView() { - //observableScrollView.setScrollViewCallbacks(observableScrollViewCallbacks); - } + private fun setUpScrollView() { + //observableScrollView.setScrollViewCallbacks(observableScrollViewCallbacks); + } - private lateinit var items: List + private lateinit var items: List - private fun setUpImageView() { - loadCurrentImage() - items = listOf( - getString(code.name.monkey.retromusic.R.string.pick_from_local_storage), - getString(code.name.monkey.retromusic.R.string.web_search), - getString(code.name.monkey.retromusic.R.string.remove_cover) - ) - editorImage?.setOnClickListener { show } - } + private fun setUpImageView() { + loadCurrentImage() + items = listOf( + getString(code.name.monkey.retromusic.R.string.pick_from_local_storage), + getString(code.name.monkey.retromusic.R.string.web_search), + getString(code.name.monkey.retromusic.R.string.remove_cover) + ) + editorImage?.setOnClickListener { show } + } - private fun startImagePicker() { - val intent = Intent(Intent.ACTION_GET_CONTENT) - intent.type = "image/*" - startActivityForResult( - Intent.createChooser( - intent, - getString(code.name.monkey.retromusic.R.string.pick_from_local_storage) - ), REQUEST_CODE_SELECT_IMAGE - ) - } + private fun startImagePicker() { + val intent = Intent(Intent.ACTION_GET_CONTENT) + intent.type = "image/*" + startActivityForResult( + Intent.createChooser( + intent, + getString(code.name.monkey.retromusic.R.string.pick_from_local_storage) + ), REQUEST_CODE_SELECT_IMAGE + ) + } - protected abstract fun loadCurrentImage() + protected abstract fun loadCurrentImage() - protected abstract fun searchImageOnWeb() + protected abstract fun searchImageOnWeb() - protected abstract fun deleteImage() + protected abstract fun deleteImage() - private fun setUpFab() { - saveFab.backgroundTintList = ColorStateList.valueOf(ThemeStore.accentColor(this)) - ColorStateList.valueOf( - MaterialValueHelper.getPrimaryTextColor( - this, - ColorUtil.isColorLight( - ThemeStore.accentColor( - this - ) - ) - ) - ).apply { - saveFab.setTextColor(this) - saveFab.iconTint = this - } - saveFab.apply { - scaleX = 0f - scaleY = 0f - isEnabled = false - setOnClickListener { save() } - TintHelper.setTintAuto(this, ThemeStore.accentColor(this@AbsTagEditorActivity), true) - } - } + private fun setUpFab() { + saveFab.backgroundTintList = ColorStateList.valueOf(ThemeStore.accentColor(this)) + ColorStateList.valueOf( + MaterialValueHelper.getPrimaryTextColor( + this, + ColorUtil.isColorLight( + ThemeStore.accentColor( + this + ) + ) + ) + ).apply { + saveFab.setTextColor(this) + saveFab.iconTint = this + } + saveFab.apply { + scaleX = 0f + scaleY = 0f + isEnabled = false + setOnClickListener { save() } + TintHelper.setTintAuto(this, ThemeStore.accentColor(this@AbsTagEditorActivity), true) + } + } - protected abstract fun save() + protected abstract fun save() - private fun getIntentExtras() { - val intentExtras = intent.extras - if (intentExtras != null) { - id = intentExtras.getInt(EXTRA_ID) - } - } + private fun getIntentExtras() { + val intentExtras = intent.extras + if (intentExtras != null) { + id = intentExtras.getInt(EXTRA_ID) + } + } - protected abstract fun getSongPaths(): List + protected abstract fun getSongPaths(): List - protected fun searchWebFor(vararg keys: String) { - val stringBuilder = StringBuilder() - for (key in keys) { - stringBuilder.append(key) - stringBuilder.append(" ") - } - val intent = Intent(Intent.ACTION_WEB_SEARCH) - intent.putExtra(SearchManager.QUERY, stringBuilder.toString()) - intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK) + protected fun searchWebFor(vararg keys: String) { + val stringBuilder = StringBuilder() + for (key in keys) { + stringBuilder.append(key) + stringBuilder.append(" ") + } + val intent = Intent(Intent.ACTION_WEB_SEARCH) + intent.putExtra(SearchManager.QUERY, stringBuilder.toString()) + intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK) - startActivity(intent) - } + startActivity(intent) + } - override fun onOptionsItemSelected(item: MenuItem): Boolean { - when (item.itemId) { - android.R.id.home -> { - super.onBackPressed() - return true - } - } - return super.onOptionsItemSelected(item) - } + override fun onOptionsItemSelected(item: MenuItem): Boolean { + when (item.itemId) { + android.R.id.home -> { + super.onBackPressed() + return true + } + } + return super.onOptionsItemSelected(item) + } - protected fun setNoImageMode() { - isInNoImageMode = true - imageContainer?.visibility = View.GONE - editorImage?.visibility = View.GONE - editorImage?.isEnabled = false + protected fun setNoImageMode() { + isInNoImageMode = true + imageContainer?.visibility = View.GONE + editorImage?.visibility = View.GONE + editorImage?.isEnabled = false - setColors( - intent.getIntExtra( - EXTRA_PALETTE, - ATHUtil.resolveColor(this, R.attr.colorPrimary) - ) - ) - } + setColors( + intent.getIntExtra( + EXTRA_PALETTE, + ATHUtil.resolveColor(this, R.attr.colorPrimary) + ) + ) + } - protected fun dataChanged() { - showFab() - } + protected fun dataChanged() { + showFab() + } - private fun showFab() { - saveFab.animate().setDuration(500).setInterpolator(OvershootInterpolator()).scaleX(1f) - .scaleY(1f).start() - saveFab.isEnabled = true - } + private fun showFab() { + saveFab.animate().setDuration(500).setInterpolator(OvershootInterpolator()).scaleX(1f) + .scaleY(1f).start() + saveFab.isEnabled = true + } - private fun hideFab() { - saveFab.animate().setDuration(500).setInterpolator(OvershootInterpolator()).scaleX(0.0f) - .scaleY(0.0f).start() - saveFab.isEnabled = false - } + private fun hideFab() { + saveFab.animate().setDuration(500).setInterpolator(OvershootInterpolator()).scaleX(0.0f) + .scaleY(0.0f).start() + saveFab.isEnabled = false + } - protected fun setImageBitmap(bitmap: Bitmap?, bgColor: Int) { - if (bitmap == null) { - editorImage.setImageResource(code.name.monkey.retromusic.R.drawable.default_album_art) - } else { - editorImage.setImageBitmap(bitmap) - } - setColors(bgColor) - } + protected fun setImageBitmap(bitmap: Bitmap?, bgColor: Int) { + if (bitmap == null) { + editorImage.setImageResource(code.name.monkey.retromusic.R.drawable.default_album_art) + } else { + editorImage.setImageBitmap(bitmap) + } + setColors(bgColor) + } - protected open fun setColors(color: Int) { - paletteColorPrimary = color - } + protected open fun setColors(color: Int) { + paletteColorPrimary = color + } - protected fun writeValuesToFiles( - fieldKeyValueMap: Map, artworkInfo: ArtworkInfo? - ) { - RetroUtil.hideSoftKeyboard(this) + protected fun writeValuesToFiles( + fieldKeyValueMap: Map, artworkInfo: ArtworkInfo? + ) { + RetroUtil.hideSoftKeyboard(this) - hideFab() + hideFab() - savedSongPaths = getSongPaths() - savedTags = fieldKeyValueMap - savedArtworkInfo = artworkInfo + savedSongPaths = getSongPaths() + savedTags = fieldKeyValueMap + savedArtworkInfo = artworkInfo - if (!SAFUtil.isSAFRequired(savedSongPaths)) { - writeTags(savedSongPaths) - } else { - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { - if (SAFUtil.isSDCardAccessGranted(this)) { - writeTags(savedSongPaths) - } else { - startActivityForResult( - Intent(this, SAFGuideActivity::class.java), - SAFGuideActivity.REQUEST_CODE_SAF_GUIDE - ) - } - } - } - } + if (!SAFUtil.isSAFRequired(savedSongPaths)) { + writeTags(savedSongPaths) + } else { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { + if (SAFUtil.isSDCardAccessGranted(this)) { + writeTags(savedSongPaths) + } else { + startActivityForResult( + Intent(this, SAFGuideActivity::class.java), + SAFGuideActivity.REQUEST_CODE_SAF_GUIDE + ) + } + } + } + } - private fun writeTags(paths: List?) { - WriteTagsAsyncTask(this).execute( - WriteTagsAsyncTask.LoadingInfo( - paths, - savedTags, - savedArtworkInfo - ) - ) - } + private fun writeTags(paths: List?) { + WriteTagsAsyncTask(this).execute( + WriteTagsAsyncTask.LoadingInfo( + paths, + savedTags, + savedArtworkInfo + ) + ) + } - override fun onActivityResult(requestCode: Int, resultCode: Int, intent: Intent?) { - super.onActivityResult(requestCode, resultCode, intent) - when (requestCode) { - REQUEST_CODE_SELECT_IMAGE -> if (resultCode == Activity.RESULT_OK) { - intent?.data?.let { - loadImageFromFile(it) - } - } - SAFGuideActivity.REQUEST_CODE_SAF_GUIDE -> { - SAFUtil.openTreePicker(this) - } - SAFUtil.REQUEST_SAF_PICK_TREE -> { - if (resultCode == Activity.RESULT_OK) { - SAFUtil.saveTreeUri(this, intent) - writeTags(savedSongPaths) - } - } - SAFUtil.REQUEST_SAF_PICK_FILE -> { - if (resultCode == Activity.RESULT_OK) { - writeTags(Collections.singletonList(currentSongPath + SAFUtil.SEPARATOR + intent!!.dataString)) - } - } - } - } + override fun onActivityResult(requestCode: Int, resultCode: Int, intent: Intent?) { + super.onActivityResult(requestCode, resultCode, intent) + when (requestCode) { + REQUEST_CODE_SELECT_IMAGE -> if (resultCode == Activity.RESULT_OK) { + intent?.data?.let { + loadImageFromFile(it) + } + } + SAFGuideActivity.REQUEST_CODE_SAF_GUIDE -> { + SAFUtil.openTreePicker(this) + } + SAFUtil.REQUEST_SAF_PICK_TREE -> { + if (resultCode == Activity.RESULT_OK) { + SAFUtil.saveTreeUri(this, intent) + writeTags(savedSongPaths) + } + } + SAFUtil.REQUEST_SAF_PICK_FILE -> { + if (resultCode == Activity.RESULT_OK) { + writeTags(Collections.singletonList(currentSongPath + SAFUtil.SEPARATOR + intent!!.dataString)) + } + } + } + } - protected abstract fun loadImageFromFile(selectedFile: Uri?) + protected abstract fun loadImageFromFile(selectedFile: Uri?) - private fun getAudioFile(path: String): AudioFile { - return try { - AudioFileIO.read(File(path)) - } catch (e: Exception) { - Log.e(TAG, "Could not read audio file $path", e) - AudioFile() - } - } + private fun getAudioFile(path: String): AudioFile { + return try { + AudioFileIO.read(File(path)) + } catch (e: Exception) { + Log.e(TAG, "Could not read audio file $path", e) + AudioFile() + } + } - class ArtworkInfo constructor(val albumId: Int, val artwork: Bitmap?) + class ArtworkInfo constructor(val albumId: Int, val artwork: Bitmap?) - companion object { + companion object { - const val EXTRA_ID = "extra_id" - const val EXTRA_PALETTE = "extra_palette" - private val TAG = AbsTagEditorActivity::class.java.simpleName - private const val REQUEST_CODE_SELECT_IMAGE = 1000 - } + const val EXTRA_ID = "extra_id" + const val EXTRA_PALETTE = "extra_palette" + private val TAG = AbsTagEditorActivity::class.java.simpleName + private const val REQUEST_CODE_SELECT_IMAGE = 1000 + } } diff --git a/app/src/main/java/code/name/monkey/retromusic/activities/tageditor/AlbumTagEditorActivity.kt b/app/src/main/java/code/name/monkey/retromusic/activities/tageditor/AlbumTagEditorActivity.kt index c9699032..7c2dec8d 100755 --- a/app/src/main/java/code/name/monkey/retromusic/activities/tageditor/AlbumTagEditorActivity.kt +++ b/app/src/main/java/code/name/monkey/retromusic/activities/tageditor/AlbumTagEditorActivity.kt @@ -31,218 +31,230 @@ import com.bumptech.glide.load.engine.DiskCacheStrategy import com.bumptech.glide.request.animation.GlideAnimation import com.bumptech.glide.request.target.SimpleTarget import io.reactivex.disposables.CompositeDisposable -import kotlinx.android.synthetic.main.activity_album_tag_editor.* +import kotlinx.android.synthetic.main.activity_album_tag_editor.albumArtistContainer +import kotlinx.android.synthetic.main.activity_album_tag_editor.albumArtistText +import kotlinx.android.synthetic.main.activity_album_tag_editor.albumText +import kotlinx.android.synthetic.main.activity_album_tag_editor.albumTitleContainer +import kotlinx.android.synthetic.main.activity_album_tag_editor.genreContainer +import kotlinx.android.synthetic.main.activity_album_tag_editor.genreTitle +import kotlinx.android.synthetic.main.activity_album_tag_editor.toolbar +import kotlinx.android.synthetic.main.activity_album_tag_editor.yearContainer +import kotlinx.android.synthetic.main.activity_album_tag_editor.yearTitle import org.jaudiotagger.tag.FieldKey -import java.util.* +import java.util.ArrayList +import java.util.EnumMap class AlbumTagEditorActivity : AbsTagEditorActivity(), TextWatcher { - override val contentViewLayout: Int - get() = R.layout.activity_album_tag_editor + override val contentViewLayout: Int + get() = R.layout.activity_album_tag_editor - override fun loadImageFromFile(selectedFileUri: Uri?) { + override fun loadImageFromFile(selectedFileUri: Uri?) { - Glide.with(this@AlbumTagEditorActivity).load(selectedFileUri).asBitmap() - .transcode(BitmapPaletteTranscoder(this), BitmapPaletteWrapper::class.java) - .diskCacheStrategy(DiskCacheStrategy.NONE).skipMemoryCache(true) - .into(object : SimpleTarget() { - override fun onResourceReady( - resource: BitmapPaletteWrapper?, - glideAnimation: GlideAnimation? - ) { - getColor(resource?.palette, Color.TRANSPARENT) - albumArtBitmap = resource?.bitmap?.let { ImageUtil.resizeBitmap(it, 2048) } - setImageBitmap(albumArtBitmap, getColor(resource?.palette, ATHUtil.resolveColor(this@AlbumTagEditorActivity, R.attr.defaultFooterColor))) - deleteAlbumArt = false - dataChanged() - setResult(Activity.RESULT_OK) - } + Glide.with(this@AlbumTagEditorActivity).load(selectedFileUri).asBitmap() + .transcode(BitmapPaletteTranscoder(this), BitmapPaletteWrapper::class.java) + .diskCacheStrategy(DiskCacheStrategy.NONE).skipMemoryCache(true) + .into(object : SimpleTarget() { + override fun onResourceReady( + resource: BitmapPaletteWrapper?, + glideAnimation: GlideAnimation? + ) { + getColor(resource?.palette, Color.TRANSPARENT) + albumArtBitmap = resource?.bitmap?.let { ImageUtil.resizeBitmap(it, 2048) } + setImageBitmap( + albumArtBitmap, + getColor( + resource?.palette, + ATHUtil.resolveColor(this@AlbumTagEditorActivity, R.attr.defaultFooterColor) + ) + ) + deleteAlbumArt = false + dataChanged() + setResult(Activity.RESULT_OK) + } - override fun onLoadFailed(e: Exception?, errorDrawable: Drawable?) { - super.onLoadFailed(e, errorDrawable) - Toast.makeText(this@AlbumTagEditorActivity, e.toString(), Toast.LENGTH_LONG) - .show() - } - }) - } + override fun onLoadFailed(e: Exception?, errorDrawable: Drawable?) { + super.onLoadFailed(e, errorDrawable) + Toast.makeText(this@AlbumTagEditorActivity, e.toString(), Toast.LENGTH_LONG) + .show() + } + }) + } - private var albumArtBitmap: Bitmap? = null - private var deleteAlbumArt: Boolean = false - private var lastFMRestClient: LastFMRestClient? = null - private val disposable = CompositeDisposable() + private var albumArtBitmap: Bitmap? = null + private var deleteAlbumArt: Boolean = false + private var lastFMRestClient: LastFMRestClient? = null + private val disposable = CompositeDisposable() - private fun setupToolbar() { - applyToolbar(toolbar) - supportActionBar?.setDisplayShowHomeEnabled(true) - } + private fun setupToolbar() { + applyToolbar(toolbar) + supportActionBar?.setDisplayShowHomeEnabled(true) + } - override fun onCreate(savedInstanceState: Bundle?) { - setDrawUnderStatusBar() - super.onCreate(savedInstanceState) - lastFMRestClient = LastFMRestClient(this) + override fun onCreate(savedInstanceState: Bundle?) { + setDrawUnderStatusBar() + super.onCreate(savedInstanceState) + lastFMRestClient = LastFMRestClient(this) - setUpViews() - setupToolbar() - } + setUpViews() + setupToolbar() + } - private fun setUpViews() { - fillViewsWithFileTags() + private fun setUpViews() { + fillViewsWithFileTags() - MaterialUtil.setTint(yearContainer, false) - MaterialUtil.setTint(genreContainer, false) - MaterialUtil.setTint(albumTitleContainer, false) - MaterialUtil.setTint(albumArtistContainer, false) + MaterialUtil.setTint(yearContainer, false) + MaterialUtil.setTint(genreContainer, false) + MaterialUtil.setTint(albumTitleContainer, false) + MaterialUtil.setTint(albumArtistContainer, false) - albumText.appHandleColor().addTextChangedListener(this) - albumArtistText.appHandleColor().addTextChangedListener(this) - genreTitle.appHandleColor().addTextChangedListener(this) - yearTitle.appHandleColor().addTextChangedListener(this) - } + albumText.appHandleColor().addTextChangedListener(this) + albumArtistText.appHandleColor().addTextChangedListener(this) + genreTitle.appHandleColor().addTextChangedListener(this) + yearTitle.appHandleColor().addTextChangedListener(this) + } - private fun fillViewsWithFileTags() { - albumText.setText(albumTitle) - albumArtistText.setText(albumArtistName) - genreTitle.setText(genreName) - yearTitle.setText(songYear) - } + private fun fillViewsWithFileTags() { + albumText.setText(albumTitle) + albumArtistText.setText(albumArtistName) + genreTitle.setText(genreName) + yearTitle.setText(songYear) + } - override fun loadCurrentImage() { - val bitmap = albumArt - setImageBitmap( - bitmap, - getColor( - generatePalette(bitmap), - ATHUtil.resolveColor(this, R.attr.defaultFooterColor) - ) - ) - deleteAlbumArt = false - } + override fun loadCurrentImage() { + val bitmap = albumArt + setImageBitmap( + bitmap, + getColor( + generatePalette(bitmap), + ATHUtil.resolveColor(this, R.attr.defaultFooterColor) + ) + ) + deleteAlbumArt = false + } - override fun onPause() { - super.onPause() - disposable.clear() - } + override fun onPause() { + super.onPause() + disposable.clear() + } - private fun extractDetails(lastFmAlbum: LastFmAlbum) { - if (lastFmAlbum.album != null) { + private fun extractDetails(lastFmAlbum: LastFmAlbum) { + if (lastFmAlbum.album != null) { - val url = LastFMUtil.getLargestAlbumImageUrl(lastFmAlbum.album.image) + val url = LastFMUtil.getLargestAlbumImageUrl(lastFmAlbum.album.image) - if (!TextUtils.isEmpty(url) && url.trim { it <= ' ' }.isNotEmpty()) { - Glide.with(this@AlbumTagEditorActivity).load(url).asBitmap() - .transcode(BitmapPaletteTranscoder(this), BitmapPaletteWrapper::class.java) - .diskCacheStrategy(DiskCacheStrategy.SOURCE).error(R.drawable.default_album_art) - .into(object : SimpleTarget() { - override fun onLoadFailed( - e: java.lang.Exception?, - errorDrawable: Drawable? - ) { - super.onLoadFailed(e, errorDrawable) - Toast.makeText( - this@AlbumTagEditorActivity, - e.toString(), - Toast.LENGTH_LONG - ).show() - } + if (!TextUtils.isEmpty(url) && url.trim { it <= ' ' }.isNotEmpty()) { + Glide.with(this@AlbumTagEditorActivity).load(url).asBitmap() + .transcode(BitmapPaletteTranscoder(this), BitmapPaletteWrapper::class.java) + .diskCacheStrategy(DiskCacheStrategy.SOURCE).error(R.drawable.default_album_art) + .into(object : SimpleTarget() { + override fun onLoadFailed( + e: java.lang.Exception?, + errorDrawable: Drawable? + ) { + super.onLoadFailed(e, errorDrawable) + Toast.makeText( + this@AlbumTagEditorActivity, + e.toString(), + Toast.LENGTH_LONG + ).show() + } - override fun onResourceReady( - resource: BitmapPaletteWrapper?, - glideAnimation: GlideAnimation? - ) { - albumArtBitmap = resource?.bitmap?.let { - ImageUtil.resizeBitmap( - it, - 2048 - ) - } - setImageBitmap( - albumArtBitmap, - getColor( - resource?.palette, - ATHUtil.resolveColor( - this@AlbumTagEditorActivity, - R.attr.defaultFooterColor - ) - ) - ) - deleteAlbumArt = false - dataChanged() - setResult(RESULT_OK) - } - }) - return - } - if (lastFmAlbum.album.tags.tag.size > 0) { - genreTitle.setText(lastFmAlbum.album.tags.tag[0].name) - } + override fun onResourceReady( + resource: BitmapPaletteWrapper?, + glideAnimation: GlideAnimation? + ) { + albumArtBitmap = resource?.bitmap?.let { + ImageUtil.resizeBitmap( + it, + 2048 + ) + } + setImageBitmap( + albumArtBitmap, + getColor( + resource?.palette, + ATHUtil.resolveColor( + this@AlbumTagEditorActivity, + R.attr.defaultFooterColor + ) + ) + ) + deleteAlbumArt = false + dataChanged() + setResult(RESULT_OK) + } + }) + return + } + if (lastFmAlbum.album.tags.tag.size > 0) { + genreTitle.setText(lastFmAlbum.album.tags.tag[0].name) + } + } + toastLoadingFailed() + } - } - toastLoadingFailed() - } + private fun toastLoadingFailed() { + Toast.makeText( + this@AlbumTagEditorActivity, + R.string.could_not_download_album_cover, + Toast.LENGTH_SHORT + ).show() + } - private fun toastLoadingFailed() { - Toast.makeText( - this@AlbumTagEditorActivity, - R.string.could_not_download_album_cover, - Toast.LENGTH_SHORT - ).show() - } + override fun searchImageOnWeb() { + searchWebFor(albumText.text.toString(), albumArtistText.text.toString()) + } - override fun searchImageOnWeb() { - searchWebFor(albumText.text.toString(), albumArtistText.text.toString()) - } + override fun deleteImage() { + setImageBitmap( + BitmapFactory.decodeResource(resources, R.drawable.default_album_art), + ATHUtil.resolveColor(this, R.attr.defaultFooterColor) + ) + deleteAlbumArt = true + dataChanged() + } - override fun deleteImage() { - setImageBitmap( - BitmapFactory.decodeResource(resources, R.drawable.default_album_art), - ATHUtil.resolveColor(this, R.attr.defaultFooterColor) - ) - deleteAlbumArt = true - dataChanged() - } + override fun save() { + val fieldKeyValueMap = EnumMap(FieldKey::class.java) + fieldKeyValueMap[FieldKey.ALBUM] = albumText.text.toString() + //android seems not to recognize album_artist field so we additionally write the normal artist field + fieldKeyValueMap[FieldKey.ARTIST] = albumArtistText.text.toString() + fieldKeyValueMap[FieldKey.ALBUM_ARTIST] = albumArtistText.text.toString() + fieldKeyValueMap[FieldKey.GENRE] = genreTitle.text.toString() + fieldKeyValueMap[FieldKey.YEAR] = yearTitle.text.toString() - override fun save() { - val fieldKeyValueMap = EnumMap(FieldKey::class.java) - fieldKeyValueMap[FieldKey.ALBUM] = albumText.text.toString() - //android seems not to recognize album_artist field so we additionally write the normal artist field - fieldKeyValueMap[FieldKey.ARTIST] = albumArtistText.text.toString() - fieldKeyValueMap[FieldKey.ALBUM_ARTIST] = albumArtistText.text.toString() - fieldKeyValueMap[FieldKey.GENRE] = genreTitle.text.toString() - fieldKeyValueMap[FieldKey.YEAR] = yearTitle.text.toString() + writeValuesToFiles( + fieldKeyValueMap, if (deleteAlbumArt) ArtworkInfo(id, null) + else if (albumArtBitmap == null) null else ArtworkInfo(id, albumArtBitmap!!) + ) + } - writeValuesToFiles( - fieldKeyValueMap, if (deleteAlbumArt) ArtworkInfo(id, null) - else if (albumArtBitmap == null) null else ArtworkInfo(id, albumArtBitmap!!) - ) - } + override fun getSongPaths(): List { + val songs = AlbumLoader.getAlbum(this, id).songs + val paths = ArrayList(songs!!.size) + for (song in songs) { + paths.add(song.data) + } + return paths + } - override fun getSongPaths(): List { - val songs = AlbumLoader.getAlbum(this, id).songs - val paths = ArrayList(songs!!.size) - for (song in songs) { - paths.add(song.data) - } - return paths - } + override fun beforeTextChanged(s: CharSequence, start: Int, count: Int, after: Int) { + } - override fun beforeTextChanged(s: CharSequence, start: Int, count: Int, after: Int) { + override fun onTextChanged(s: CharSequence, start: Int, before: Int, count: Int) { + } - } + override fun afterTextChanged(s: Editable) { + dataChanged() + } - override fun onTextChanged(s: CharSequence, start: Int, before: Int, count: Int) { + override fun setColors(color: Int) { + super.setColors(color) + saveFab.backgroundTintList = ColorStateList.valueOf(color) + } - } + companion object { - override fun afterTextChanged(s: Editable) { - dataChanged() - } - - override fun setColors(color: Int) { - super.setColors(color) - saveFab.backgroundTintList = ColorStateList.valueOf(color) - } - - companion object { - - val TAG: String = AlbumTagEditorActivity::class.java.simpleName - } + val TAG: String = AlbumTagEditorActivity::class.java.simpleName + } } diff --git a/app/src/main/java/code/name/monkey/retromusic/activities/tageditor/SongTagEditorActivity.kt b/app/src/main/java/code/name/monkey/retromusic/activities/tageditor/SongTagEditorActivity.kt index fb1dbb50..bdee34c6 100755 --- a/app/src/main/java/code/name/monkey/retromusic/activities/tageditor/SongTagEditorActivity.kt +++ b/app/src/main/java/code/name/monkey/retromusic/activities/tageditor/SongTagEditorActivity.kt @@ -9,16 +9,34 @@ import code.name.monkey.retromusic.R import code.name.monkey.retromusic.extensions.appHandleColor import code.name.monkey.retromusic.extensions.applyToolbar import code.name.monkey.retromusic.loaders.SongLoader -import kotlinx.android.synthetic.main.activity_song_tag_editor.* +import kotlinx.android.synthetic.main.activity_song_tag_editor.albumArtistContainer +import kotlinx.android.synthetic.main.activity_song_tag_editor.albumArtistText +import kotlinx.android.synthetic.main.activity_song_tag_editor.albumText +import kotlinx.android.synthetic.main.activity_song_tag_editor.albumTextContainer +import kotlinx.android.synthetic.main.activity_song_tag_editor.artistContainer +import kotlinx.android.synthetic.main.activity_song_tag_editor.artistText +import kotlinx.android.synthetic.main.activity_song_tag_editor.composerContainer +import kotlinx.android.synthetic.main.activity_song_tag_editor.genreContainer +import kotlinx.android.synthetic.main.activity_song_tag_editor.genreText +import kotlinx.android.synthetic.main.activity_song_tag_editor.lyricsContainer +import kotlinx.android.synthetic.main.activity_song_tag_editor.lyricsText +import kotlinx.android.synthetic.main.activity_song_tag_editor.songComposerText +import kotlinx.android.synthetic.main.activity_song_tag_editor.songText +import kotlinx.android.synthetic.main.activity_song_tag_editor.songTextContainer +import kotlinx.android.synthetic.main.activity_song_tag_editor.toolbar +import kotlinx.android.synthetic.main.activity_song_tag_editor.trackNumberContainer +import kotlinx.android.synthetic.main.activity_song_tag_editor.trackNumberText +import kotlinx.android.synthetic.main.activity_song_tag_editor.yearContainer +import kotlinx.android.synthetic.main.activity_song_tag_editor.yearText import org.jaudiotagger.tag.FieldKey -import java.util.* +import java.util.ArrayList +import java.util.EnumMap class SongTagEditorActivity : AbsTagEditorActivity(), TextWatcher { override val contentViewLayout: Int get() = R.layout.activity_song_tag_editor - override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) @@ -64,15 +82,12 @@ class SongTagEditorActivity : AbsTagEditorActivity(), TextWatcher { } override fun loadCurrentImage() { - } override fun searchImageOnWeb() { - } override fun deleteImage() { - } override fun save() { @@ -96,15 +111,12 @@ class SongTagEditorActivity : AbsTagEditorActivity(), TextWatcher { } override fun loadImageFromFile(selectedFile: Uri?) { - } override fun beforeTextChanged(s: CharSequence, start: Int, count: Int, after: Int) { - } override fun onTextChanged(s: CharSequence, start: Int, before: Int, count: Int) { - } override fun afterTextChanged(s: Editable) { diff --git a/app/src/main/java/code/name/monkey/retromusic/activities/tageditor/WriteTagsAsyncTask.java b/app/src/main/java/code/name/monkey/retromusic/activities/tageditor/WriteTagsAsyncTask.java index d9bfb86a..4873959f 100644 --- a/app/src/main/java/code/name/monkey/retromusic/activities/tageditor/WriteTagsAsyncTask.java +++ b/app/src/main/java/code/name/monkey/retromusic/activities/tageditor/WriteTagsAsyncTask.java @@ -7,19 +7,14 @@ import android.graphics.Bitmap; import android.media.MediaScannerConnection; import android.net.Uri; import android.os.Build; - import androidx.annotation.NonNull; import androidx.annotation.Nullable; - +import code.name.monkey.retromusic.R; +import code.name.monkey.retromusic.misc.DialogAsyncTask; +import code.name.monkey.retromusic.misc.UpdateToastMediaScannerCompletionListener; +import code.name.monkey.retromusic.util.MusicUtil; +import code.name.monkey.retromusic.util.SAFUtil; import com.google.android.material.dialog.MaterialAlertDialogBuilder; - -import org.jaudiotagger.audio.AudioFile; -import org.jaudiotagger.audio.AudioFileIO; -import org.jaudiotagger.tag.FieldKey; -import org.jaudiotagger.tag.Tag; -import org.jaudiotagger.tag.images.Artwork; -import org.jaudiotagger.tag.images.ArtworkFactory; - import java.io.File; import java.io.FileOutputStream; import java.io.IOException; @@ -27,16 +22,35 @@ import java.lang.ref.WeakReference; import java.util.ArrayList; import java.util.Collection; import java.util.Map; - -import code.name.monkey.retromusic.R; -import code.name.monkey.retromusic.misc.DialogAsyncTask; -import code.name.monkey.retromusic.misc.UpdateToastMediaScannerCompletionListener; -import code.name.monkey.retromusic.util.MusicUtil; -import code.name.monkey.retromusic.util.SAFUtil; +import org.jaudiotagger.audio.AudioFile; +import org.jaudiotagger.audio.AudioFileIO; +import org.jaudiotagger.tag.FieldKey; +import org.jaudiotagger.tag.Tag; +import org.jaudiotagger.tag.images.Artwork; +import org.jaudiotagger.tag.images.ArtworkFactory; public class WriteTagsAsyncTask extends DialogAsyncTask { + public static class LoadingInfo { + + @Nullable + final Map fieldKeyValueMap; + + final Collection filePaths; + + @Nullable + private AbsTagEditorActivity.ArtworkInfo artworkInfo; + + public LoadingInfo(Collection filePaths, + @Nullable Map fieldKeyValueMap, + @Nullable AbsTagEditorActivity.ArtworkInfo artworkInfo) { + this.filePaths = filePaths; + this.fieldKeyValueMap = fieldKeyValueMap; + this.artworkInfo = artworkInfo; + } + } + private WeakReference activity; public WriteTagsAsyncTask(@NonNull Activity activity) { @@ -44,6 +58,16 @@ public class WriteTagsAsyncTask extends this.activity = new WeakReference<>(activity); } + @NonNull + @Override + protected Dialog createDialog(@NonNull Context context) { + return new MaterialAlertDialogBuilder(context) + .setTitle(R.string.saving_changes) + .setCancelable(false) + .setView(R.layout.loading) + .create(); + } + @Override protected String[] doInBackground(LoadingInfo... params) { try { @@ -120,8 +144,9 @@ public class WriteTagsAsyncTask extends if (Build.VERSION.SDK_INT == Build.VERSION_CODES.KITKAT) { paths = new ArrayList<>(info.filePaths.size()); for (String path : info.filePaths) { - if (path.contains(SAFUtil.SEPARATOR)) + if (path.contains(SAFUtil.SEPARATOR)) { path = path.split(SAFUtil.SEPARATOR)[0]; + } paths.add(path); } } @@ -133,33 +158,16 @@ public class WriteTagsAsyncTask extends } } - @Override - protected void onPostExecute(String[] toBeScanned) { - super.onPostExecute(toBeScanned); - scan(toBeScanned); - } - @Override protected void onCancelled(String[] toBeScanned) { super.onCancelled(toBeScanned); scan(toBeScanned); } - private void scan(String[] toBeScanned) { - Activity activity = this.activity.get(); - if (activity != null) { - MediaScannerConnection.scanFile(activity, toBeScanned, null, new UpdateToastMediaScannerCompletionListener(activity, toBeScanned)); - } - } - - @NonNull @Override - protected Dialog createDialog(@NonNull Context context) { - return new MaterialAlertDialogBuilder(context) - .setTitle(R.string.saving_changes) - .setCancelable(false) - .setView(R.layout.loading) - .create(); + protected void onPostExecute(String[] toBeScanned) { + super.onPostExecute(toBeScanned); + scan(toBeScanned); } @Override @@ -169,20 +177,11 @@ public class WriteTagsAsyncTask extends //((MaterialDialog) dialog).setProgress(values[0]); } - public static class LoadingInfo { - - final Collection filePaths; - @Nullable - final Map fieldKeyValueMap; - @Nullable - private AbsTagEditorActivity.ArtworkInfo artworkInfo; - - public LoadingInfo(Collection filePaths, - @Nullable Map fieldKeyValueMap, - @Nullable AbsTagEditorActivity.ArtworkInfo artworkInfo) { - this.filePaths = filePaths; - this.fieldKeyValueMap = fieldKeyValueMap; - this.artworkInfo = artworkInfo; + private void scan(String[] toBeScanned) { + Activity activity = this.activity.get(); + if (activity != null) { + MediaScannerConnection.scanFile(activity, toBeScanned, null, + new UpdateToastMediaScannerCompletionListener(activity, toBeScanned)); } } } \ No newline at end of file diff --git a/app/src/main/java/code/name/monkey/retromusic/appwidgets/AppWidgetClassic.kt b/app/src/main/java/code/name/monkey/retromusic/appwidgets/AppWidgetClassic.kt index 3a63d69f..7972413d 100644 --- a/app/src/main/java/code/name/monkey/retromusic/appwidgets/AppWidgetClassic.kt +++ b/app/src/main/java/code/name/monkey/retromusic/appwidgets/AppWidgetClassic.kt @@ -15,8 +15,11 @@ package code.name.monkey.retromusic.appwidgets import android.app.PendingIntent -import android.content.* +import android.content.ComponentName +import android.content.Context +import android.content.Intent import android.graphics.Bitmap +import android.graphics.Color import android.graphics.drawable.Drawable import android.text.TextUtils import android.view.View @@ -28,203 +31,208 @@ import code.name.monkey.retromusic.appwidgets.base.BaseAppWidget import code.name.monkey.retromusic.glide.SongGlideRequest import code.name.monkey.retromusic.glide.palette.BitmapPaletteWrapper import code.name.monkey.retromusic.service.MusicService -import code.name.monkey.retromusic.service.MusicService.* -import code.name.monkey.retromusic.util.* +import code.name.monkey.retromusic.service.MusicService.ACTION_REWIND +import code.name.monkey.retromusic.service.MusicService.ACTION_SKIP +import code.name.monkey.retromusic.service.MusicService.ACTION_TOGGLE_PAUSE +import code.name.monkey.retromusic.util.ImageUtil +import code.name.monkey.retromusic.util.RetroUtil import com.bumptech.glide.Glide import com.bumptech.glide.request.animation.GlideAnimation -import com.bumptech.glide.request.target.* +import com.bumptech.glide.request.target.SimpleTarget import com.bumptech.glide.request.target.Target class AppWidgetClassic : BaseAppWidget() { - private var target: Target? = null // for cancellation + private var target: Target? = null // for cancellation - /** - * Initialize given widgets to default state, where we launch Music on default click and hide - * actions if service not running. - */ - override fun defaultAppWidget(context: Context, appWidgetIds: IntArray) { - val appWidgetView = RemoteViews(context.packageName, R.layout.app_widget_classic) + /** + * Initialize given widgets to default state, where we launch Music on default click and hide + * actions if service not running. + */ + override fun defaultAppWidget(context: Context, appWidgetIds: IntArray) { + val appWidgetView = RemoteViews(context.packageName, R.layout.app_widget_classic) - appWidgetView.setViewVisibility(R.id.media_titles, View.INVISIBLE) - appWidgetView.setImageViewResource(R.id.image, R.drawable.default_album_art) - appWidgetView.setImageViewBitmap( - R.id.button_next, createBitmap( - RetroUtil.getTintedVectorDrawable( - context, - R.drawable.ic_skip_next_white_24dp, - MaterialValueHelper.getSecondaryTextColor( - context, true - ) - )!!, 1f - ) - ) - appWidgetView.setImageViewBitmap( - R.id.button_prev, createBitmap( - RetroUtil.getTintedVectorDrawable( - context, - R.drawable.ic_skip_previous_white_24dp, - MaterialValueHelper.getSecondaryTextColor( - context, true - ) - )!!, 1f - ) - ) - appWidgetView.setImageViewBitmap( - R.id.button_toggle_play_pause, createBitmap( - RetroUtil.getTintedVectorDrawable( - context, - R.drawable.ic_play_arrow_white_32dp, - MaterialValueHelper.getSecondaryTextColor( - context, true - ) - )!!, 1f - ) - ) + appWidgetView.setViewVisibility(R.id.media_titles, View.INVISIBLE) + appWidgetView.setImageViewResource(R.id.image, R.drawable.default_album_art) + appWidgetView.setImageViewBitmap( + R.id.button_next, + createBitmap( + RetroUtil.getTintedVectorDrawable( + context, + R.drawable.ic_skip_next_white_24dp, + MaterialValueHelper.getSecondaryTextColor(context, true) + )!!, 1f + ) + ) + appWidgetView.setImageViewBitmap( + R.id.button_prev, + createBitmap( + RetroUtil.getTintedVectorDrawable( + context, + R.drawable.ic_skip_previous_white_24dp, + MaterialValueHelper.getSecondaryTextColor(context, true) + )!!, 1f + ) + ) + appWidgetView.setImageViewBitmap( + R.id.button_toggle_play_pause, + createBitmap( + RetroUtil.getTintedVectorDrawable( + context, + R.drawable.ic_play_arrow_white_32dp, + MaterialValueHelper.getSecondaryTextColor(context, true) + )!!, 1f + ) + ) - linkButtons(context, appWidgetView) - pushUpdate(context, appWidgetIds, appWidgetView) - } + linkButtons(context, appWidgetView) + pushUpdate(context, appWidgetIds, appWidgetView) + } - /** - * Update all active widget instances by pushing changes - */ - override fun performUpdate(service: MusicService, appWidgetIds: IntArray?) { - val appWidgetView = RemoteViews(service.packageName, R.layout.app_widget_classic) + /** + * Update all active widget instances by pushing changes + */ + override fun performUpdate(service: MusicService, appWidgetIds: IntArray?) { + val appWidgetView = RemoteViews(service.packageName, R.layout.app_widget_classic) - val isPlaying = service.isPlaying - val song = service.currentSong + val isPlaying = service.isPlaying + val song = service.currentSong - // Set the titles and artwork - if (TextUtils.isEmpty(song.title) && TextUtils.isEmpty(song.artistName)) { - appWidgetView.setViewVisibility(R.id.media_titles, View.INVISIBLE) - } else { - appWidgetView.setViewVisibility(R.id.media_titles, View.VISIBLE) - appWidgetView.setTextViewText(R.id.title, song.title) - appWidgetView.setTextViewText(R.id.text, getSongArtistAndAlbum(song)) - } + // Set the titles and artwork + if (TextUtils.isEmpty(song.title) && TextUtils.isEmpty(song.artistName)) { + appWidgetView.setViewVisibility(R.id.media_titles, View.INVISIBLE) + } else { + appWidgetView.setViewVisibility(R.id.media_titles, View.VISIBLE) + appWidgetView.setTextViewText(R.id.title, song.title) + appWidgetView.setTextViewText(R.id.text, getSongArtistAndAlbum(song)) + } - // Link actions buttons to intents - linkButtons(service, appWidgetView) + // Link actions buttons to intents + linkButtons(service, appWidgetView) - if (imageSize == 0) { - imageSize = service.resources.getDimensionPixelSize(R.dimen.app_widget_classic_image_size) - } - if (cardRadius == 0f) { - cardRadius = service.resources.getDimension(R.dimen.app_widget_card_radius) - } + if (imageSize == 0) { + imageSize = service.resources.getDimensionPixelSize(R.dimen.app_widget_classic_image_size) + } + if (cardRadius == 0f) { + cardRadius = service.resources.getDimension(R.dimen.app_widget_card_radius) + } - // Load the album cover async and push the update on completion - val appContext = service.applicationContext - service.runOnUiThread { - if (target != null) { - Glide.clear(target) - } - target = SongGlideRequest.Builder.from(Glide.with(service), song) - .checkIgnoreMediaStore(service).generatePalette(service).build().centerCrop() - .into(object : SimpleTarget(imageSize, imageSize) { - override fun onResourceReady( - resource: BitmapPaletteWrapper, - glideAnimation: GlideAnimation - ) { - val palette = resource.palette - update( - resource.bitmap, palette.getVibrantColor( - palette.getMutedColor( - MaterialValueHelper.getSecondaryTextColor( - service, true - ) - ) - ) - ) - } + // Load the album cover async and push the update on completion + val appContext = service.applicationContext + service.runOnUiThread { + if (target != null) { + Glide.clear(target) + } + target = SongGlideRequest.Builder.from(Glide.with(service), song) + .checkIgnoreMediaStore(service).generatePalette(service).build().centerCrop() + .into(object : SimpleTarget(imageSize, imageSize) { + override fun onResourceReady( + resource: BitmapPaletteWrapper, + glideAnimation: GlideAnimation + ) { + val palette = resource.palette + update( + resource.bitmap, + palette.getVibrantColor( + palette.getMutedColor( + MaterialValueHelper.getSecondaryTextColor( + service, + true + ) + ) + ) + ) + } - override fun onLoadFailed(e: Exception?, errorDrawable: Drawable?) { - super.onLoadFailed(e, errorDrawable) - update(null, MaterialValueHelper.getSecondaryTextColor(service, true)) - } + override fun onLoadFailed(e: Exception?, errorDrawable: Drawable?) { + super.onLoadFailed(e, errorDrawable) + update(null, Color.WHITE) + } - private fun update(bitmap: Bitmap?, color: Int) { - // Set correct drawable for pause state - val playPauseRes = if (isPlaying) R.drawable.ic_pause_white_24dp else R.drawable.ic_play_arrow_white_24dp - appWidgetView.setImageViewBitmap( - R.id.button_toggle_play_pause, ImageUtil.createBitmap( - ImageUtil.getTintedVectorDrawable( - service, playPauseRes, color - ) - ) - ) + private fun update(bitmap: Bitmap?, color: Int) { + // Set correct drawable for pause state + val playPauseRes = + if (isPlaying) R.drawable.ic_pause_white_24dp else R.drawable.ic_play_arrow_white_24dp + appWidgetView.setImageViewBitmap( + R.id.button_toggle_play_pause, + ImageUtil.createBitmap(ImageUtil.getTintedVectorDrawable(service, playPauseRes, color)) + ) - // Set prev/next button drawables - appWidgetView.setImageViewBitmap( - R.id.button_next, ImageUtil.createBitmap( - ImageUtil.getTintedVectorDrawable( - service, R.drawable.ic_skip_next_white_24dp, color - ) - ) - ) - appWidgetView.setImageViewBitmap( - R.id.button_prev, ImageUtil.createBitmap( - ImageUtil.getTintedVectorDrawable( - service, R.drawable.ic_skip_previous_white_24dp, color - ) - ) - ) + // Set prev/next button drawables + appWidgetView.setImageViewBitmap( + R.id.button_next, + ImageUtil.createBitmap( + ImageUtil.getTintedVectorDrawable( + service, + R.drawable.ic_skip_next_white_24dp, + color + ) + ) + ) + appWidgetView.setImageViewBitmap( + R.id.button_prev, + ImageUtil.createBitmap( + ImageUtil.getTintedVectorDrawable( + service, + R.drawable.ic_skip_previous_white_24dp, + color + ) + ) + ) - val image = getAlbumArtDrawable(service.resources, bitmap) - val roundedBitmap = createRoundedBitmap( - image, imageSize, imageSize, cardRadius, 0F, cardRadius, 0F - ) - appWidgetView.setImageViewBitmap(R.id.image, roundedBitmap) + val image = getAlbumArtDrawable(service.resources, bitmap) + val roundedBitmap = + createRoundedBitmap(image, imageSize, imageSize, cardRadius, 0F, cardRadius, 0F) + appWidgetView.setImageViewBitmap(R.id.image, roundedBitmap) - pushUpdate(appContext, appWidgetIds, appWidgetView) - } - }) - } - } + pushUpdate(appContext, appWidgetIds, appWidgetView) + } + }) + } + } - /** - * Link up various button actions using [PendingIntent]. - */ - private fun linkButtons(context: Context, views: RemoteViews) { - val action = Intent(context, MainActivity::class.java).putExtra("expand", true) - var pendingIntent: PendingIntent + /** + * Link up various button actions using [PendingIntent]. + */ + private fun linkButtons(context: Context, views: RemoteViews) { + val action = Intent(context, MainActivity::class.java).putExtra("expand", true) + var pendingIntent: PendingIntent - val serviceName = ComponentName(context, MusicService::class.java) + val serviceName = ComponentName(context, MusicService::class.java) - // Home - action.flags = Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TOP - pendingIntent = PendingIntent.getActivity(context, 0, action, 0) - views.setOnClickPendingIntent(R.id.image, pendingIntent) - views.setOnClickPendingIntent(R.id.media_titles, pendingIntent) + // Home + action.flags = Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TOP + pendingIntent = PendingIntent.getActivity(context, 0, action, 0) + views.setOnClickPendingIntent(R.id.image, pendingIntent) + views.setOnClickPendingIntent(R.id.media_titles, pendingIntent) - // Previous track - pendingIntent = buildPendingIntent(context, ACTION_REWIND, serviceName) - views.setOnClickPendingIntent(R.id.button_prev, pendingIntent) + // Previous track + pendingIntent = buildPendingIntent(context, ACTION_REWIND, serviceName) + views.setOnClickPendingIntent(R.id.button_prev, pendingIntent) - // Play and pause - pendingIntent = buildPendingIntent(context, ACTION_TOGGLE_PAUSE, serviceName) - views.setOnClickPendingIntent(R.id.button_toggle_play_pause, pendingIntent) + // Play and pause + pendingIntent = buildPendingIntent(context, ACTION_TOGGLE_PAUSE, serviceName) + views.setOnClickPendingIntent(R.id.button_toggle_play_pause, pendingIntent) - // Next track - pendingIntent = buildPendingIntent(context, ACTION_SKIP, serviceName) - views.setOnClickPendingIntent(R.id.button_next, pendingIntent) - } + // Next track + pendingIntent = buildPendingIntent(context, ACTION_SKIP, serviceName) + views.setOnClickPendingIntent(R.id.button_next, pendingIntent) + } - companion object { + companion object { - const val NAME = "app_widget_classic" + const val NAME = "app_widget_classic" - private var mInstance: AppWidgetClassic? = null - private var imageSize = 0 - private var cardRadius = 0f + private var mInstance: AppWidgetClassic? = null + private var imageSize = 0 + private var cardRadius = 0f - val instance: AppWidgetClassic - @Synchronized get() { - if (mInstance == null) { - mInstance = AppWidgetClassic() - } - return mInstance!! - } - } + val instance: AppWidgetClassic + @Synchronized get() { + if (mInstance == null) { + mInstance = AppWidgetClassic() + } + return mInstance!! + } + } } diff --git a/app/src/main/java/code/name/monkey/retromusic/appwidgets/AppWidgetSmall.kt b/app/src/main/java/code/name/monkey/retromusic/appwidgets/AppWidgetSmall.kt index 08f30b60..a67bf87f 100644 --- a/app/src/main/java/code/name/monkey/retromusic/appwidgets/AppWidgetSmall.kt +++ b/app/src/main/java/code/name/monkey/retromusic/appwidgets/AppWidgetSmall.kt @@ -15,7 +15,9 @@ package code.name.monkey.retromusic.appwidgets import android.app.PendingIntent -import android.content.* +import android.content.ComponentName +import android.content.Context +import android.content.Intent import android.graphics.Bitmap import android.graphics.drawable.Drawable import android.text.TextUtils @@ -32,207 +34,175 @@ import code.name.monkey.retromusic.service.MusicService.* import code.name.monkey.retromusic.util.RetroUtil import com.bumptech.glide.Glide import com.bumptech.glide.request.animation.GlideAnimation -import com.bumptech.glide.request.target.* +import com.bumptech.glide.request.target.SimpleTarget import com.bumptech.glide.request.target.Target class AppWidgetSmall : BaseAppWidget() { - private var target: Target? = null // for cancellation + private var target: Target? = null // for cancellation - /** - * Initialize given widgets to default state, where we launch Music on default click and hide - * actions if service not running. - */ - override fun defaultAppWidget(context: Context, appWidgetIds: IntArray) { - val appWidgetView = RemoteViews(context.packageName, R.layout.app_widget_small) + /** + * Initialize given widgets to default state, where we launch Music on default click and hide + * actions if service not running. + */ + override fun defaultAppWidget(context: Context, appWidgetIds: IntArray) { + val appWidgetView = RemoteViews(context.packageName, R.layout.app_widget_small) - appWidgetView.setViewVisibility(R.id.media_titles, View.INVISIBLE) - appWidgetView.setImageViewResource(R.id.image, R.drawable.default_album_art) - appWidgetView.setImageViewBitmap( - R.id.button_next, createBitmap( - RetroUtil.getTintedVectorDrawable( - context, - R.drawable.ic_skip_next_white_24dp, - MaterialValueHelper.getSecondaryTextColor( - context, true - ) - )!!, 1f - ) - ) - appWidgetView.setImageViewBitmap( - R.id.button_prev, createBitmap( - RetroUtil.getTintedVectorDrawable( - context, - R.drawable.ic_skip_previous_white_24dp, - MaterialValueHelper.getSecondaryTextColor( - context, true - ) - )!!, 1f - ) - ) - appWidgetView.setImageViewBitmap( - R.id.button_toggle_play_pause, createBitmap( - RetroUtil.getTintedVectorDrawable( - context, - R.drawable.ic_play_arrow_white_32dp, - MaterialValueHelper.getSecondaryTextColor( - context, true - ) - )!!, 1f - ) - ) + appWidgetView.setViewVisibility(R.id.media_titles, View.INVISIBLE) + appWidgetView.setImageViewResource(R.id.image, R.drawable.default_album_art) + appWidgetView.setImageViewBitmap(R.id.button_next, createBitmap(RetroUtil.getTintedVectorDrawable(context, R.drawable.ic_skip_next_white_24dp, MaterialValueHelper.getSecondaryTextColor(context, true))!!, 1f)) + appWidgetView.setImageViewBitmap(R.id.button_prev, createBitmap(RetroUtil.getTintedVectorDrawable(context, R.drawable.ic_skip_previous_white_24dp, MaterialValueHelper.getSecondaryTextColor(context, true))!!, 1f)) + appWidgetView.setImageViewBitmap(R.id.button_toggle_play_pause, createBitmap(RetroUtil.getTintedVectorDrawable(context, R.drawable.ic_play_arrow_white_32dp, MaterialValueHelper.getSecondaryTextColor(context, true))!!, 1f)) - linkButtons(context, appWidgetView) - pushUpdate(context, appWidgetIds, appWidgetView) - } + linkButtons(context, appWidgetView) + pushUpdate(context, appWidgetIds, appWidgetView) + } - /** - * Update all active widget instances by pushing changes - */ - override fun performUpdate(service: MusicService, appWidgetIds: IntArray?) { - val appWidgetView = RemoteViews( - service.packageName, R.layout.app_widget_small - ) + /** + * Update all active widget instances by pushing changes + */ + override fun performUpdate(service: MusicService, appWidgetIds: IntArray?) { + val appWidgetView = RemoteViews(service.packageName, R.layout.app_widget_small) - val isPlaying = service.isPlaying - val song = service.currentSong + val isPlaying = service.isPlaying + val song = service.currentSong - // Set the titles and artwork - if (TextUtils.isEmpty(song.title) && TextUtils.isEmpty(song.artistName)) { - appWidgetView.setViewVisibility(R.id.media_titles, View.INVISIBLE) - } else { - if (TextUtils.isEmpty(song.title) || TextUtils.isEmpty(song.artistName)) { - appWidgetView.setTextViewText(R.id.text_separator, "") - } else { - appWidgetView.setTextViewText(R.id.text_separator, "•") - } + // Set the titles and artwork + if (TextUtils.isEmpty(song.title) && TextUtils.isEmpty(song.artistName)) { + appWidgetView.setViewVisibility(R.id.media_titles, View.INVISIBLE) + } else { + if (TextUtils.isEmpty(song.title) || TextUtils.isEmpty(song.artistName)) { + appWidgetView.setTextViewText(R.id.text_separator, "") + } else { + appWidgetView.setTextViewText(R.id.text_separator, "•") + } - appWidgetView.setViewVisibility(R.id.media_titles, View.VISIBLE) - appWidgetView.setTextViewText(R.id.title, song.title) - appWidgetView.setTextViewText(R.id.text, song.artistName) - } + appWidgetView.setViewVisibility(R.id.media_titles, View.VISIBLE) + appWidgetView.setTextViewText(R.id.title, song.title) + appWidgetView.setTextViewText(R.id.text, song.artistName) + } - // Link actions buttons to intents - linkButtons(service, appWidgetView) + // Link actions buttons to intents + linkButtons(service, appWidgetView) - if (imageSize == 0) { - imageSize = service.resources.getDimensionPixelSize(R.dimen.app_widget_small_image_size) - } - if (cardRadius == 0f) { - cardRadius = service.resources.getDimension(R.dimen.app_widget_card_radius) - } + if (imageSize == 0) { + imageSize = service.resources.getDimensionPixelSize(R.dimen.app_widget_small_image_size) + } + if (cardRadius == 0f) { + cardRadius = service.resources.getDimension(R.dimen.app_widget_card_radius) + } - // Load the album cover async and push the update on completion - val appContext = service.applicationContext - service.runOnUiThread { - if (target != null) { - Glide.clear(target) - } - target = SongGlideRequest.Builder.from(Glide.with(service), song) - .checkIgnoreMediaStore(service).generatePalette(service).build().centerCrop() - .into(object : SimpleTarget(imageSize, imageSize) { - override fun onResourceReady( - resource: BitmapPaletteWrapper, - glideAnimation: GlideAnimation - ) { - val palette = resource.palette - update( - resource.bitmap, palette.getVibrantColor( - palette.getMutedColor( - MaterialValueHelper.getSecondaryTextColor( - service, true - ) - ) - ) - ) - } + // Load the album cover async and push the update on completion + val appContext = service.applicationContext + service.runOnUiThread { + if (target != null) { + Glide.clear(target) + } + target = SongGlideRequest.Builder.from(Glide.with(service), song) + .checkIgnoreMediaStore(service).generatePalette(service).build().centerCrop() + .into(object : SimpleTarget(imageSize, imageSize) { + override fun onResourceReady( + resource: BitmapPaletteWrapper, + glideAnimation: GlideAnimation + ) { + val palette = resource.palette + update( + resource.bitmap, palette.getVibrantColor( + palette.getMutedColor( + MaterialValueHelper.getSecondaryTextColor( + service, true + ) + ) + ) + ) + } - override fun onLoadFailed(e: Exception?, errorDrawable: Drawable?) { - super.onLoadFailed(e, errorDrawable) - update(null, MaterialValueHelper.getSecondaryTextColor(service, true)) - } + override fun onLoadFailed(e: Exception?, errorDrawable: Drawable?) { + super.onLoadFailed(e, errorDrawable) + update(null, MaterialValueHelper.getSecondaryTextColor(service, true)) + } - private fun update(bitmap: Bitmap?, color: Int) { - // Set correct drawable for pause state - val playPauseRes = if (isPlaying) R.drawable.ic_pause_white_24dp - else R.drawable.ic_play_arrow_white_32dp - appWidgetView.setImageViewBitmap( - R.id.button_toggle_play_pause, createBitmap( - RetroUtil.getTintedVectorDrawable( - service, playPauseRes, color - )!!, 1f - ) - ) + private fun update(bitmap: Bitmap?, color: Int) { + // Set correct drawable for pause state + val playPauseRes = if (isPlaying) R.drawable.ic_pause_white_24dp + else R.drawable.ic_play_arrow_white_32dp + appWidgetView.setImageViewBitmap( + R.id.button_toggle_play_pause, createBitmap( + RetroUtil.getTintedVectorDrawable( + service, playPauseRes, color + )!!, 1f + ) + ) - // Set prev/next button drawables - appWidgetView.setImageViewBitmap( - R.id.button_next, createBitmap( - RetroUtil.getTintedVectorDrawable( - service, R.drawable.ic_skip_next_white_24dp, color - )!!, 1f - ) - ) - appWidgetView.setImageViewBitmap( - R.id.button_prev, createBitmap( - RetroUtil.getTintedVectorDrawable( - service, R.drawable.ic_skip_previous_white_24dp, color - )!!, 1f - ) - ) + // Set prev/next button drawables + appWidgetView.setImageViewBitmap( + R.id.button_next, createBitmap( + RetroUtil.getTintedVectorDrawable( + service, R.drawable.ic_skip_next_white_24dp, color + )!!, 1f + ) + ) + appWidgetView.setImageViewBitmap( + R.id.button_prev, createBitmap( + RetroUtil.getTintedVectorDrawable( + service, R.drawable.ic_skip_previous_white_24dp, color + )!!, 1f + ) + ) - val image = getAlbumArtDrawable(service.resources, bitmap) - val roundedBitmap = createRoundedBitmap( - image, imageSize, imageSize, cardRadius, 0f, 0f, 0f - ) - appWidgetView.setImageViewBitmap(R.id.image, roundedBitmap) + val image = getAlbumArtDrawable(service.resources, bitmap) + val roundedBitmap = createRoundedBitmap( + image, imageSize, imageSize, cardRadius, 0f, 0f, 0f + ) + appWidgetView.setImageViewBitmap(R.id.image, roundedBitmap) - pushUpdate(appContext, appWidgetIds, appWidgetView) - } - }) - } - } + pushUpdate(appContext, appWidgetIds, appWidgetView) + } + }) + } + } - /** - * Link up various button actions using [PendingIntent]. - */ - private fun linkButtons(context: Context, views: RemoteViews) { - val action = Intent(context, MainActivity::class.java).putExtra("expand", true) - var pendingIntent: PendingIntent + /** + * Link up various button actions using [PendingIntent]. + */ + private fun linkButtons(context: Context, views: RemoteViews) { + val action = Intent(context, MainActivity::class.java).putExtra("expand", true) + var pendingIntent: PendingIntent - val serviceName = ComponentName(context, MusicService::class.java) + val serviceName = ComponentName(context, MusicService::class.java) - // Home - action.flags = Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TOP - pendingIntent = PendingIntent.getActivity(context, 0, action, 0) - views.setOnClickPendingIntent(R.id.image, pendingIntent) - views.setOnClickPendingIntent(R.id.media_titles, pendingIntent) + // Home + action.flags = Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TOP + pendingIntent = PendingIntent.getActivity(context, 0, action, 0) + views.setOnClickPendingIntent(R.id.image, pendingIntent) + views.setOnClickPendingIntent(R.id.media_titles, pendingIntent) - // Previous track - pendingIntent = buildPendingIntent(context, ACTION_REWIND, serviceName) - views.setOnClickPendingIntent(R.id.button_prev, pendingIntent) + // Previous track + pendingIntent = buildPendingIntent(context, ACTION_REWIND, serviceName) + views.setOnClickPendingIntent(R.id.button_prev, pendingIntent) - // Play and pause - pendingIntent = buildPendingIntent(context, ACTION_TOGGLE_PAUSE, serviceName) - views.setOnClickPendingIntent(R.id.button_toggle_play_pause, pendingIntent) + // Play and pause + pendingIntent = buildPendingIntent(context, ACTION_TOGGLE_PAUSE, serviceName) + views.setOnClickPendingIntent(R.id.button_toggle_play_pause, pendingIntent) - // Next track - pendingIntent = buildPendingIntent(context, ACTION_SKIP, serviceName) - views.setOnClickPendingIntent(R.id.button_next, pendingIntent) - } + // Next track + pendingIntent = buildPendingIntent(context, ACTION_SKIP, serviceName) + views.setOnClickPendingIntent(R.id.button_next, pendingIntent) + } - companion object { + companion object { - const val NAME: String = "app_widget_small" + const val NAME: String = "app_widget_small" - private var mInstance: AppWidgetSmall? = null - private var imageSize = 0 - private var cardRadius = 0f + private var mInstance: AppWidgetSmall? = null + private var imageSize = 0 + private var cardRadius = 0f - val instance: AppWidgetSmall - @Synchronized get() { - if (mInstance == null) { - mInstance = AppWidgetSmall() - } - return mInstance!! - } - } + val instance: AppWidgetSmall + @Synchronized get() { + if (mInstance == null) { + mInstance = AppWidgetSmall() + } + return mInstance!! + } + } } diff --git a/app/src/main/java/code/name/monkey/retromusic/dagger/MusicComponent.kt b/app/src/main/java/code/name/monkey/retromusic/dagger/MusicComponent.kt index 97df4e04..6815f918 100644 --- a/app/src/main/java/code/name/monkey/retromusic/dagger/MusicComponent.kt +++ b/app/src/main/java/code/name/monkey/retromusic/dagger/MusicComponent.kt @@ -14,9 +14,18 @@ package code.name.monkey.retromusic.dagger -import code.name.monkey.retromusic.activities.* -import code.name.monkey.retromusic.dagger.module.* -import code.name.monkey.retromusic.fragments.mainactivity.* +import code.name.monkey.retromusic.activities.AlbumDetailsActivity +import code.name.monkey.retromusic.activities.ArtistDetailActivity +import code.name.monkey.retromusic.activities.GenreDetailsActivity +import code.name.monkey.retromusic.activities.PlaylistDetailActivity +import code.name.monkey.retromusic.activities.SearchActivity +import code.name.monkey.retromusic.dagger.module.AppModule +import code.name.monkey.retromusic.dagger.module.PresenterModule +import code.name.monkey.retromusic.fragments.mainactivity.AlbumsFragment +import code.name.monkey.retromusic.fragments.mainactivity.ArtistsFragment +import code.name.monkey.retromusic.fragments.mainactivity.GenresFragment +import code.name.monkey.retromusic.fragments.mainactivity.PlaylistsFragment +import code.name.monkey.retromusic.fragments.mainactivity.SongsFragment import code.name.monkey.retromusic.fragments.mainactivity.home.BannerHomeFragment import dagger.Component import javax.inject.Singleton @@ -25,17 +34,12 @@ import javax.inject.Singleton * Created by hemanths on 2019-09-04. */ @Singleton -@Component(modules = [ - RepositoryModule::class, - AlbumModule::class, - ArtistModule::class, - GenreModule::class, - HomeModule::class, - PlaylistModule::class, - SearchModule::class, - SongModule::class, - ActivityModule::class -]) +@Component( + modules = [ + AppModule::class, + PresenterModule::class + ] +) interface MusicComponent { fun inject(songsFragment: SongsFragment) diff --git a/app/src/main/java/code/name/monkey/retromusic/dagger/module/ActivityModule.kt b/app/src/main/java/code/name/monkey/retromusic/dagger/module/ActivityModule.kt deleted file mode 100644 index ed94f451..00000000 --- a/app/src/main/java/code/name/monkey/retromusic/dagger/module/ActivityModule.kt +++ /dev/null @@ -1,34 +0,0 @@ -/* - * Copyright (c) 2019 Hemanth Savarala. - * - * 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.dagger.module - -import android.app.Activity - -import dagger.Module -import dagger.Provides -import javax.inject.Singleton - -/** - * Created by hemanths on 2019-09-04. - */ -@Module -class ActivityModule(private val activity: Activity) { - - @Provides - @Singleton - fun provideActivity(): Activity { - return activity - } -} diff --git a/app/src/main/java/code/name/monkey/retromusic/dagger/module/AlbumModule.kt b/app/src/main/java/code/name/monkey/retromusic/dagger/module/AlbumModule.kt deleted file mode 100644 index 80fcd1ca..00000000 --- a/app/src/main/java/code/name/monkey/retromusic/dagger/module/AlbumModule.kt +++ /dev/null @@ -1,39 +0,0 @@ -/* - * Copyright (c) 2019 Hemanth Savarala. - * - * 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.dagger.module - -import code.name.monkey.retromusic.mvp.presenter.AlbumDetailsPresenter -import code.name.monkey.retromusic.mvp.presenter.AlbumDetailsPresenter.AlbumDetailsPresenterImpl -import code.name.monkey.retromusic.mvp.presenter.AlbumsPresenter -import code.name.monkey.retromusic.mvp.presenter.AlbumsPresenter.AlbumsPresenterImpl -import dagger.Module -import dagger.Provides - -/** - * Created by hemanths on 2019-09-04. - */ -@Module -class AlbumModule { - - @Provides - fun providesAlbumsPresenter(presenter: AlbumsPresenterImpl): AlbumsPresenter { - return presenter - } - - @Provides - fun providesAlbumDetailsPresenter(presenter: AlbumDetailsPresenterImpl): AlbumDetailsPresenter { - return presenter - } -} diff --git a/app/src/main/java/code/name/monkey/retromusic/dagger/module/AppModule.kt b/app/src/main/java/code/name/monkey/retromusic/dagger/module/AppModule.kt index db795847..31707bb0 100644 --- a/app/src/main/java/code/name/monkey/retromusic/dagger/module/AppModule.kt +++ b/app/src/main/java/code/name/monkey/retromusic/dagger/module/AppModule.kt @@ -14,6 +14,7 @@ package code.name.monkey.retromusic.dagger.module +import android.app.Application import android.content.Context import dagger.Module @@ -24,11 +25,9 @@ import javax.inject.Singleton * Created by hemanths on 2019-09-04. */ @Module -class AppModule(private val context: Context) { +class AppModule(private val application: Application) { @Provides @Singleton - fun provideContext(): Context { - return context - } + fun provideContext(): Context = application } diff --git a/app/src/main/java/code/name/monkey/retromusic/dagger/module/ArtistModule.kt b/app/src/main/java/code/name/monkey/retromusic/dagger/module/ArtistModule.kt deleted file mode 100644 index 0d9ecfec..00000000 --- a/app/src/main/java/code/name/monkey/retromusic/dagger/module/ArtistModule.kt +++ /dev/null @@ -1,39 +0,0 @@ -/* - * Copyright (c) 2019 Hemanth Savarala. - * - * 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.dagger.module - -import code.name.monkey.retromusic.mvp.presenter.ArtistDetailsPresenter -import code.name.monkey.retromusic.mvp.presenter.ArtistDetailsPresenter.ArtistDetailsPresenterImpl -import code.name.monkey.retromusic.mvp.presenter.ArtistsPresenter -import code.name.monkey.retromusic.mvp.presenter.ArtistsPresenter.ArtistsPresenterImpl -import dagger.Module -import dagger.Provides - -/** - * Created by hemanths on 2019-09-04. - */ -@Module -class ArtistModule { - - @Provides - fun providesArtistDetailsPresenter(presenter: ArtistDetailsPresenterImpl): ArtistDetailsPresenter { - return presenter - } - - @Provides - fun providesArtistsPresenter(presenter: ArtistsPresenterImpl): ArtistsPresenter { - return presenter - } -} diff --git a/app/src/main/java/code/name/monkey/retromusic/dagger/module/GenreModule.kt b/app/src/main/java/code/name/monkey/retromusic/dagger/module/GenreModule.kt deleted file mode 100644 index 6fc027cc..00000000 --- a/app/src/main/java/code/name/monkey/retromusic/dagger/module/GenreModule.kt +++ /dev/null @@ -1,40 +0,0 @@ -/* - * Copyright (c) 2019 Hemanth Savarala. - * - * 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.dagger.module - -import code.name.monkey.retromusic.mvp.presenter.GenreDetailsPresenter -import code.name.monkey.retromusic.mvp.presenter.GenreDetailsPresenter.GenreDetailsPresenterImpl -import code.name.monkey.retromusic.mvp.presenter.GenresPresenter -import code.name.monkey.retromusic.mvp.presenter.GenresPresenter.GenresPresenterImpl -import dagger.Module -import dagger.Provides - -/** - * Created by hemanths on 2019-09-04. - */ -@Module -class GenreModule { - - @Provides - fun providesGenresPresenter(presenter: GenresPresenterImpl): GenresPresenter { - return presenter - } - - - @Provides - fun providesGenreDetailsPresenter(presenter: GenreDetailsPresenterImpl): GenreDetailsPresenter { - return presenter - } -} diff --git a/app/src/main/java/code/name/monkey/retromusic/dagger/module/HomeModule.kt b/app/src/main/java/code/name/monkey/retromusic/dagger/module/HomeModule.kt deleted file mode 100644 index 51b6eadd..00000000 --- a/app/src/main/java/code/name/monkey/retromusic/dagger/module/HomeModule.kt +++ /dev/null @@ -1,33 +0,0 @@ -/* - * Copyright (c) 2019 Hemanth Savarala. - * - * 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.dagger.module - -import code.name.monkey.retromusic.mvp.presenter.HomePresenter -import code.name.monkey.retromusic.mvp.presenter.HomePresenter.HomePresenterImpl -import dagger.Module -import dagger.Provides - -/** - * Created by hemanths on 2019-09-04. - */ -@Module -class HomeModule { - - @Provides - fun providesHomePresenter(presenter: HomePresenterImpl): HomePresenter { - return presenter - } - -} diff --git a/app/src/main/java/code/name/monkey/retromusic/dagger/module/PlaylistModule.kt b/app/src/main/java/code/name/monkey/retromusic/dagger/module/PlaylistModule.kt deleted file mode 100644 index 2995fe5d..00000000 --- a/app/src/main/java/code/name/monkey/retromusic/dagger/module/PlaylistModule.kt +++ /dev/null @@ -1,38 +0,0 @@ -/* - * Copyright (c) 2019 Hemanth Savarala. - * - * 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.dagger.module - -import code.name.monkey.retromusic.mvp.presenter.PlaylistSongsPresenter -import code.name.monkey.retromusic.mvp.presenter.PlaylistSongsPresenter.PlaylistSongsPresenterImpl -import code.name.monkey.retromusic.mvp.presenter.PlaylistsPresenter -import code.name.monkey.retromusic.mvp.presenter.PlaylistsPresenter.PlaylistsPresenterImpl -import dagger.Module -import dagger.Provides - -/** - * Created by hemanths on 2019-09-04. - */ -@Module -class PlaylistModule { - @Provides - fun providesPlaylistSongPresenter(presenter: PlaylistSongsPresenterImpl): PlaylistSongsPresenter { - return presenter - } - - @Provides - fun providesPlaylistsPresenter(presenter: PlaylistsPresenterImpl): PlaylistsPresenter { - return presenter - } -} diff --git a/app/src/main/java/code/name/monkey/retromusic/dagger/module/PresenterModile.kt b/app/src/main/java/code/name/monkey/retromusic/dagger/module/PresenterModile.kt new file mode 100644 index 00000000..707f369c --- /dev/null +++ b/app/src/main/java/code/name/monkey/retromusic/dagger/module/PresenterModile.kt @@ -0,0 +1,111 @@ +/* + * Copyright (c) 2019 Hemanth Savarala. + * + * 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.dagger.module + +import android.content.Context +import code.name.monkey.retromusic.mvp.presenter.AlbumDetailsPresenter +import code.name.monkey.retromusic.mvp.presenter.AlbumDetailsPresenter.AlbumDetailsPresenterImpl +import code.name.monkey.retromusic.mvp.presenter.AlbumsPresenter +import code.name.monkey.retromusic.mvp.presenter.AlbumsPresenter.AlbumsPresenterImpl +import code.name.monkey.retromusic.mvp.presenter.ArtistDetailsPresenter +import code.name.monkey.retromusic.mvp.presenter.ArtistDetailsPresenter.ArtistDetailsPresenterImpl +import code.name.monkey.retromusic.mvp.presenter.ArtistsPresenter +import code.name.monkey.retromusic.mvp.presenter.ArtistsPresenter.ArtistsPresenterImpl +import code.name.monkey.retromusic.mvp.presenter.GenreDetailsPresenter +import code.name.monkey.retromusic.mvp.presenter.GenreDetailsPresenter.GenreDetailsPresenterImpl +import code.name.monkey.retromusic.mvp.presenter.GenresPresenter +import code.name.monkey.retromusic.mvp.presenter.GenresPresenter.GenresPresenterImpl +import code.name.monkey.retromusic.mvp.presenter.HomePresenter +import code.name.monkey.retromusic.mvp.presenter.HomePresenter.HomePresenterImpl +import code.name.monkey.retromusic.mvp.presenter.PlaylistSongsPresenter +import code.name.monkey.retromusic.mvp.presenter.PlaylistSongsPresenter.PlaylistSongsPresenterImpl +import code.name.monkey.retromusic.mvp.presenter.PlaylistsPresenter +import code.name.monkey.retromusic.mvp.presenter.PlaylistsPresenter.PlaylistsPresenterImpl +import code.name.monkey.retromusic.mvp.presenter.SearchPresenter +import code.name.monkey.retromusic.mvp.presenter.SearchPresenter.SearchPresenterImpl +import code.name.monkey.retromusic.mvp.presenter.SongPresenter +import code.name.monkey.retromusic.mvp.presenter.SongPresenter.SongPresenterImpl +import code.name.monkey.retromusic.providers.RepositoryImpl +import code.name.monkey.retromusic.providers.interfaces.Repository +import dagger.Module +import dagger.Provides + +/** + * Created by hemanths on 2019-12-30. + */ + +@Module +class PresenterModule { + + @Provides + fun providesRepository(context: Context): Repository { + return RepositoryImpl(context) + } + + @Provides + fun providesAlbumsPresenter(presenter: AlbumsPresenterImpl): AlbumsPresenter { + return presenter + } + + @Provides + fun providesAlbumDetailsPresenter(presenter: AlbumDetailsPresenterImpl): AlbumDetailsPresenter { + return presenter + } + + @Provides + fun providesArtistDetailsPresenter(presenter: ArtistDetailsPresenterImpl): ArtistDetailsPresenter { + return presenter + } + + @Provides + fun providesArtistsPresenter(presenter: ArtistsPresenterImpl): ArtistsPresenter { + return presenter + } + + @Provides + fun providesGenresPresenter(presenter: GenresPresenterImpl): GenresPresenter { + return presenter + } + + @Provides + fun providesGenreDetailsPresenter(presenter: GenreDetailsPresenterImpl): GenreDetailsPresenter { + return presenter + } + + @Provides + fun providesHomePresenter(presenter: HomePresenterImpl): HomePresenter { + return presenter + } + + @Provides + fun providesPlaylistSongPresenter(presenter: PlaylistSongsPresenterImpl): PlaylistSongsPresenter { + return presenter + } + + @Provides + fun providesPlaylistsPresenter(presenter: PlaylistsPresenterImpl): PlaylistsPresenter { + return presenter + } + + @Provides + fun providesSearchPresenter(presenter: SearchPresenterImpl): SearchPresenter { + return presenter + } + + @Provides + fun providesSongPresenter(presenter: SongPresenterImpl): SongPresenter { + return presenter + } +} \ No newline at end of file diff --git a/app/src/main/java/code/name/monkey/retromusic/dagger/module/RepositoryModule.kt b/app/src/main/java/code/name/monkey/retromusic/dagger/module/RepositoryModule.kt deleted file mode 100644 index 71e48d80..00000000 --- a/app/src/main/java/code/name/monkey/retromusic/dagger/module/RepositoryModule.kt +++ /dev/null @@ -1,33 +0,0 @@ -/* - * Copyright (c) 2019 Hemanth Savarala. - * - * 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.dagger.module - -import android.content.Context -import code.name.monkey.retromusic.providers.RepositoryImpl -import code.name.monkey.retromusic.providers.interfaces.Repository -import dagger.Module -import dagger.Provides - -/** - * Created by hemanths on 2019-09-04. - */ -@Module(includes = [AppModule::class]) -class RepositoryModule { - - @Provides - fun providesRepository(context: Context): Repository { - return RepositoryImpl(context) - } -} diff --git a/app/src/main/java/code/name/monkey/retromusic/dagger/module/SearchModule.kt b/app/src/main/java/code/name/monkey/retromusic/dagger/module/SearchModule.kt deleted file mode 100644 index 0eafe55a..00000000 --- a/app/src/main/java/code/name/monkey/retromusic/dagger/module/SearchModule.kt +++ /dev/null @@ -1,33 +0,0 @@ -/* - * Copyright (c) 2019 Hemanth Savarala. - * - * 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.dagger.module - -import code.name.monkey.retromusic.mvp.presenter.SearchPresenter -import code.name.monkey.retromusic.mvp.presenter.SearchPresenter.SearchPresenterImpl -import dagger.Module -import dagger.Provides - -/** - * Created by hemanths on 2019-09-04. - */ -@Module -class SearchModule { - - @Provides - fun providesSearchPresenter(presenter: SearchPresenterImpl): SearchPresenter { - return presenter - } - -} diff --git a/app/src/main/java/code/name/monkey/retromusic/dagger/module/SongModule.kt b/app/src/main/java/code/name/monkey/retromusic/dagger/module/SongModule.kt deleted file mode 100644 index a78a864e..00000000 --- a/app/src/main/java/code/name/monkey/retromusic/dagger/module/SongModule.kt +++ /dev/null @@ -1,31 +0,0 @@ -/* - * Copyright (c) 2019 Hemanth Savarala. - * - * 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.dagger.module - -import code.name.monkey.retromusic.mvp.presenter.SongPresenter -import code.name.monkey.retromusic.mvp.presenter.SongPresenter.SongPresenterImpl -import dagger.Module -import dagger.Provides - -/** - * Created by hemanths on 2019-09-04. - */ -@Module -class SongModule { - @Provides - fun providesSongPresenter(presenter: SongPresenterImpl): SongPresenter { - return presenter - } -} diff --git a/app/src/main/java/code/name/monkey/retromusic/fragments/mainactivity/AlbumsFragment.kt b/app/src/main/java/code/name/monkey/retromusic/fragments/mainactivity/AlbumsFragment.kt index 7f926dad..ec1bd229 100644 --- a/app/src/main/java/code/name/monkey/retromusic/fragments/mainactivity/AlbumsFragment.kt +++ b/app/src/main/java/code/name/monkey/retromusic/fragments/mainactivity/AlbumsFragment.kt @@ -13,7 +13,9 @@ import code.name.monkey.retromusic.mvp.presenter.AlbumsView import code.name.monkey.retromusic.util.PreferenceUtil import javax.inject.Inject -open class AlbumsFragment : AbsLibraryPagerRecyclerViewCustomGridSizeFragment(), AlbumsView { +open class AlbumsFragment : AbsLibraryPagerRecyclerViewCustomGridSizeFragment(), + AlbumsView { + @Inject lateinit var albumsPresenter: AlbumsPresenter @@ -73,7 +75,6 @@ open class AlbumsFragment : AbsLibraryPagerRecyclerViewCustomGridSizeFragment { fun loadAlbums() class AlbumsPresenterImpl @Inject constructor( - private val repository: Repository + private val repository: Repository ) : PresenterImpl(), AlbumsPresenter, CoroutineScope { private val job = Job() diff --git a/app/src/main/java/code/name/monkey/retromusic/providers/RepositoryImpl.kt b/app/src/main/java/code/name/monkey/retromusic/providers/RepositoryImpl.kt index 8da40b9f..47874e0b 100644 --- a/app/src/main/java/code/name/monkey/retromusic/providers/RepositoryImpl.kt +++ b/app/src/main/java/code/name/monkey/retromusic/providers/RepositoryImpl.kt @@ -20,14 +20,29 @@ import code.name.monkey.retromusic.Result import code.name.monkey.retromusic.Result.Error import code.name.monkey.retromusic.Result.Success import code.name.monkey.retromusic.adapter.HomeAdapter -import code.name.monkey.retromusic.loaders.* -import code.name.monkey.retromusic.model.* +import code.name.monkey.retromusic.loaders.AlbumLoader +import code.name.monkey.retromusic.loaders.ArtistLoader +import code.name.monkey.retromusic.loaders.GenreLoader +import code.name.monkey.retromusic.loaders.LastAddedSongsLoader +import code.name.monkey.retromusic.loaders.PlaylistLoader +import code.name.monkey.retromusic.loaders.PlaylistSongsLoader +import code.name.monkey.retromusic.loaders.SearchLoader +import code.name.monkey.retromusic.loaders.SongLoader +import code.name.monkey.retromusic.loaders.TopAndRecentlyPlayedTracksLoader +import code.name.monkey.retromusic.model.AbsCustomPlaylist +import code.name.monkey.retromusic.model.Album +import code.name.monkey.retromusic.model.Artist +import code.name.monkey.retromusic.model.Genre +import code.name.monkey.retromusic.model.Home +import code.name.monkey.retromusic.model.Playlist +import code.name.monkey.retromusic.model.Song import code.name.monkey.retromusic.providers.interfaces.Repository import code.name.monkey.retromusic.rest.LastFMRestClient import code.name.monkey.retromusic.rest.model.LastFmArtist import java.io.IOException +import javax.inject.Inject -class RepositoryImpl(private val context: Context) : Repository { +class RepositoryImpl @Inject constructor(private val context: Context) : Repository { override suspend fun allAlbums(): Result> { return try { @@ -152,11 +167,15 @@ class RepositoryImpl(private val context: Context) : Repository { if (artists.isEmpty()) { Error(Throwable("No items found")) } else { - Success(Home(0, + Success( + Home( + 0, R.string.recent_artists, artists, HomeAdapter.RECENT_ARTISTS, - R.drawable.ic_artist_white_24dp)) + R.drawable.ic_artist_white_24dp + ) + ) } } catch (e: Exception) { Error(e) @@ -169,12 +188,15 @@ class RepositoryImpl(private val context: Context) : Repository { if (albums.isEmpty()) { Error(Throwable("No items found")) } else { - Success(Home(1, + Success( + Home( + 1, R.string.recent_albums, albums, HomeAdapter.RECENT_ALBUMS, R.drawable.ic_album_white_24dp - )) + ) + ) } } catch (e: Exception) { Error(e) @@ -187,31 +209,36 @@ class RepositoryImpl(private val context: Context) : Repository { if (albums.isEmpty()) { Error(Throwable("No items found")) } else { - Success(Home(3, + Success( + Home( + 3, R.string.top_albums, albums, HomeAdapter.TOP_ALBUMS, R.drawable.ic_album_white_24dp - )) + ) + ) } } catch (e: Exception) { Error(e) } } - override suspend fun topArtists(): Result { return try { val artists = TopAndRecentlyPlayedTracksLoader.getTopArtists(context) if (artists.isEmpty()) { Error(Throwable("No items found")) } else { - Success(Home(2, + Success( + Home( + 2, R.string.top_artists, artists, HomeAdapter.TOP_ARTISTS, R.drawable.ic_artist_white_24dp - )) + ) + ) } } catch (e: Exception) { Error(e) @@ -224,12 +251,15 @@ class RepositoryImpl(private val context: Context) : Repository { if (playlists.isEmpty()) { Error(Throwable("No items found")) } else { - Success(Home(4, + Success( + Home( + 4, R.string.favorites, playlists, HomeAdapter.PLAYLISTS, R.drawable.ic_favorite_white_24dp - )) + ) + ) } } catch (e: Exception) { Error(e) @@ -237,14 +267,14 @@ class RepositoryImpl(private val context: Context) : Repository { } override suspend fun artistInfo( - name: String, - lang: String?, - cache: String? + name: String, + lang: String?, + cache: String? ): Result = safeApiCall( - call = { - Success(LastFMRestClient(context).apiService.artistInfo(name, lang, cache)) - }, - errorMessage = "Error" + call = { + Success(LastFMRestClient(context).apiService.artistInfo(name, lang, cache)) + }, + errorMessage = "Error" ) diff --git a/app/src/main/res/drawable/circle_progress.xml b/app/src/main/res/drawable/circle_progress.xml index 3f6f2a28..8cbb3008 100644 --- a/app/src/main/res/drawable/circle_progress.xml +++ b/app/src/main/res/drawable/circle_progress.xml @@ -12,24 +12,24 @@ ~ See the GNU General Public License for more details. --> - - - - - - - - - - - + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_about.xml b/app/src/main/res/layout/activity_about.xml index 2b5310d2..6194a515 100644 --- a/app/src/main/res/layout/activity_about.xml +++ b/app/src/main/res/layout/activity_about.xml @@ -18,7 +18,6 @@ android:layout_height="match_parent" android:background="?attr/colorSurface"> - + + + + + android:layout_height="match_parent"> - + - + android:layout_height="match_parent" + android:layout_weight="1" + android:background="@drawable/widget_selector" + tools:src="@drawable/ic_skip_previous_white_24dp" + tools:tint="@color/ate_secondary_text_dark" /> - + - + - + - + - + - + - - - - - - + + \ No newline at end of file diff --git a/gradle.properties b/gradle.properties index c9729751..a09e1510 100644 --- a/gradle.properties +++ b/gradle.properties @@ -8,4 +8,5 @@ android.enableR8.fullMode=false android.enableJetifier=true android.debug.obsoleteApi=true android.enableBuildCache=true -android.jetifier.blacklist = butterknife.*\\.jar \ No newline at end of file +android.jetifier.blacklist = butterknife.*\\.jar +kotlin.code.style=official \ No newline at end of file