From e4556845447b3dbd5859bef33164274ce71e1100 Mon Sep 17 00:00:00 2001 From: h4h13 Date: Fri, 15 Nov 2019 23:14:42 +0530 Subject: [PATCH] Crash fixed --- app/build.gradle | 5 +- app/src/main/AndroidManifest.xml | 7 - .../retromusic/activities/AboutActivity.kt | 247 ++++--- .../activities/AlbumDetailsActivity.kt | 451 ++++++------ .../activities/ArtistDetailActivity.kt | 468 ++++++------- .../activities/GenreDetailsActivity.kt | 221 +++--- .../activities/LicenseActivity.java | 1 - .../activities/LockScreenActivity.kt | 148 ++-- .../retromusic/activities/LyricsActivity.kt | 35 +- .../retromusic/activities/MainActivity.kt | 469 ++++++------- .../activities/PlayingQueueActivity.kt | 276 ++++---- .../activities/PlaylistDetailActivity.kt | 376 +++++----- .../retromusic/activities/PurchaseActivity.kt | 234 ++++--- .../retromusic/activities/SearchActivity.kt | 321 ++++----- .../retromusic/activities/SettingsActivity.kt | 4 +- .../activities/SupportDevelopmentActivity.kt | 357 +++++----- .../retromusic/activities/UserInfoActivity.kt | 494 ++++++------- .../activities/base/AbsBaseActivity.kt | 223 +++--- .../activities/base/AbsCrashCollector.kt | 12 - .../base/AbsMusicServiceActivity.kt | 252 +++---- .../base/AbsSlidingMusicPanelActivity.kt | 598 ++++++++-------- .../activities/base/AbsThemeActivity.kt | 326 +++++---- .../activities/bugreport/BugReportActivity.kt | 477 ++++++------- .../bugreport/ErrorHandlerActivity.kt | 1 - .../bugreport/model/DeviceInfo.java | 3 +- .../tageditor/AbsTagEditorActivity.kt | 663 +++++++++--------- .../tageditor/AlbumTagEditorActivity.kt | 348 ++++----- .../tageditor/SongTagEditorActivity.kt | 192 ++--- .../retromusic/adapter/ContributorAdapter.kt | 100 +-- .../monkey/retromusic/adapter/GenreAdapter.kt | 79 ++- .../monkey/retromusic/adapter/HomeAdapter.kt | 312 +++++---- .../retromusic/adapter/SearchAdapter.kt | 217 +++--- .../retromusic/adapter/SongFileAdapter.kt | 268 ++++--- .../retromusic/adapter/album/AlbumAdapter.kt | 306 ++++---- .../adapter/album/AlbumCoverPagerAdapter.kt | 261 ++++--- .../adapter/album/AlbumFullWidthAdapter.kt | 114 +-- .../adapter/album/HorizontalAlbumAdapter.kt | 113 +-- .../adapter/artist/ArtistAdapter.kt | 231 +++--- .../adapter/base/AbsMultiSelectAdapter.java | 5 +- .../adapter/playlist/PlaylistAdapter.kt | 362 +++++----- .../adapter/song/AbsOffsetSongAdapter.kt | 128 ++-- .../song/OrderablePlaylistSongAdapter.kt | 209 +++--- .../adapter/song/PlayingQueueAdapter.kt | 260 ++++--- .../adapter/song/PlaylistSongAdapter.kt | 136 ++-- .../adapter/song/ShuffleButtonSongAdapter.kt | 76 +- .../adapter/song/SimpleSongAdapter.kt | 46 +- .../retromusic/adapter/song/SongAdapter.kt | 335 ++++----- .../appshortcuts/AppShortcutIconGenerator.kt | 98 +-- .../AppShortcutLauncherActivity.kt | 109 ++- .../appshortcuts/DynamicShortcutManager.kt | 76 +- .../shortcuttype/BaseShortcutType.kt | 47 +- .../shortcuttype/LastAddedShortcutType.kt | 30 +- .../shortcuttype/SearchShortCutType.kt | 28 +- .../shortcuttype/ShuffleAllShortcutType.kt | 30 +- .../shortcuttype/TopTracksShortcutType.kt | 28 +- .../appwidgets/base/BaseAppWidget.kt | 256 +++---- .../fragments/player/color/ColorFragment.kt | 265 +++---- .../retromusic/helper/LastChanceHandler.kt | 53 -- .../monkey/retromusic/util/LyricUtil.java | 51 +- gradle.properties | 4 +- 60 files changed, 5987 insertions(+), 5855 deletions(-) delete mode 100644 app/src/main/java/code/name/monkey/retromusic/activities/base/AbsCrashCollector.kt delete mode 100644 app/src/main/java/code/name/monkey/retromusic/activities/bugreport/ErrorHandlerActivity.kt delete mode 100644 app/src/main/java/code/name/monkey/retromusic/helper/LastChanceHandler.kt diff --git a/app/build.gradle b/app/build.gradle index 37a55889c..b7f39dcc6 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -108,7 +108,7 @@ dependencies { implementation fileTree(include: ['*.jar'], dir: 'libs') implementation project(':appthemehelper') implementation 'androidx.multidex:multidex:2.0.1' - implementation 'androidx.fragment:fragment:1.2.0-rc01' + implementation 'androidx.fragment:fragment:1.2.0-rc02' implementation 'androidx.appcompat:appcompat:1.1.0' implementation 'androidx.recyclerview:recyclerview:1.1.0-rc01' implementation "androidx.gridlayout:gridlayout:1.0.0" @@ -118,9 +118,10 @@ dependencies { implementation 'androidx.preference:preference:1.1.0' implementation 'androidx.palette:palette-ktx:1.0.0' implementation 'androidx.constraintlayout:constraintlayout:1.1.3' + implementation 'androidx.core:core-ktx:1.1.0' implementation 'com.google.android.material:material:1.2.0-alpha01' - implementation 'com.google.android.play:core:1.6.3' + implementation 'com.google.android.play:core:1.6.4' implementation 'com.squareup.retrofit2:retrofit:2.6.2' implementation 'com.squareup.retrofit2:converter-gson:2.6.2' diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 2a38e51c0..559651404 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -119,13 +119,6 @@ android:name=".activities.SearchActivity" android:windowSoftInputMode="stateVisible" /> - - openUrl(PINTEREST) + R.id.faqLink -> openUrl(FAQ_LINK) + R.id.telegramLink -> openUrl(APP_TELEGRAM_LINK) + R.id.appGithub -> openUrl(GITHUB_PROJECT) + R.id.appTranslation -> openUrl(TRANSLATE) + R.id.appRate -> openUrl(RATE_ON_GOOGLE_PLAY) + R.id.appShare -> shareApp() + R.id.donateLink -> NavigationUtil.goToSupportDevelopment(this) + R.id.instagramLink -> openUrl(APP_INSTAGRAM_LINK) + R.id.twitterLink -> openUrl(APP_TWITTER_LINK) + R.id.changelog -> showChangeLogOptions() + R.id.openSource -> NavigationUtil.goToOpenSource(this) + R.id.bugReportLink -> NavigationUtil.bugReport(this) + } + } - override fun onClick(view: View) { - when (view.id) { - R.id.pinterestLink -> openUrl(PINTEREST) - R.id.faqLink -> openUrl(FAQ_LINK) - R.id.telegramLink -> openUrl(APP_TELEGRAM_LINK) - R.id.appGithub -> openUrl(GITHUB_PROJECT) - R.id.appTranslation -> openUrl(TRANSLATE) - R.id.appRate -> openUrl(RATE_ON_GOOGLE_PLAY) - R.id.appShare -> shareApp() - R.id.donateLink -> NavigationUtil.goToSupportDevelopment(this) - R.id.instagramLink -> openUrl(APP_INSTAGRAM_LINK) - R.id.twitterLink -> openUrl(APP_TWITTER_LINK) - R.id.changelog -> showChangeLogOptions() - R.id.openSource -> NavigationUtil.goToOpenSource(this) - R.id.bugReportLink -> NavigationUtil.bugReport(this) - } - } + private fun showChangeLogOptions() { + MaterialDialog(this, BottomSheet(LayoutMode.WRAP_CONTENT)).show { + cornerRadius(PreferenceUtil.getInstance(this@AboutActivity).dialogCorner) + listItems(items = listOf("Telegram Channel", "App")) { _, position, _ -> + if (position == 0) { + openUrl(TELEGRAM_CHANGE_LOG) + } else { + NavigationUtil.gotoWhatNews(this@AboutActivity) + } + } + } + } - private fun showChangeLogOptions() { - MaterialDialog(this, BottomSheet(LayoutMode.WRAP_CONTENT)) - .show { - cornerRadius(PreferenceUtil.getInstance(this@AboutActivity).dialogCorner) - listItems(items = listOf("Telegram Channel", "App")) { _, position, _ -> - if (position == 0) { - openUrl(TELEGRAM_CHANGE_LOG) - } else { - NavigationUtil.gotoWhatNews(this@AboutActivity) - } - } - } - } + private fun getAppVersion(): String { + return try { + val packageInfo = packageManager.getPackageInfo(packageName, 0) + packageInfo.versionName + } catch (e: PackageManager.NameNotFoundException) { + e.printStackTrace() + "0.0.0" + } + } - private fun getAppVersion(): String { - return try { - val packageInfo = packageManager.getPackageInfo(packageName, 0) - packageInfo.versionName - } catch (e: PackageManager.NameNotFoundException) { - e.printStackTrace() - "0.0.0" - } - } + 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() + } - 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() - } + private fun loadContributors() { + val data = assetJsonData + val type = object : TypeToken>() { - private fun loadContributors() { - val data = assetJsonData - val type = object : TypeToken>() { + }.type + val contributors = Gson().fromJson>(data, type) - }.type - val contributors = Gson().fromJson>(data, type) - - val contributorAdapter = ContributorAdapter(contributors) - recyclerView.layoutManager = LinearLayoutManager(this) - recyclerView.itemAnimator = DefaultItemAnimator() - recyclerView.adapter = contributorAdapter - } + val contributorAdapter = ContributorAdapter(contributors) + recyclerView.layoutManager = LinearLayoutManager(this) + recyclerView.itemAnimator = DefaultItemAnimator() + recyclerView.adapter = contributorAdapter + } } 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 44483a3bb..41244be4e 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 @@ -4,41 +4,25 @@ import android.app.ActivityOptions import android.content.Intent import android.graphics.Color import android.os.Bundle -import android.view.Menu -import android.view.MenuItem -import android.view.SubMenu -import android.view.View +import android.view.* import android.widget.ImageView import androidx.core.app.ActivityCompat -import androidx.recyclerview.widget.DefaultItemAnimator -import androidx.recyclerview.widget.GridLayoutManager -import androidx.recyclerview.widget.LinearLayoutManager +import androidx.recyclerview.widget.* import code.name.monkey.appthemehelper.ThemeStore -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.retromusic.App -import code.name.monkey.retromusic.R +import code.name.monkey.appthemehelper.util.* +import code.name.monkey.retromusic.* import code.name.monkey.retromusic.activities.base.AbsSlidingMusicPanelActivity -import code.name.monkey.retromusic.activities.tageditor.AbsTagEditorActivity -import code.name.monkey.retromusic.activities.tageditor.AlbumTagEditorActivity +import code.name.monkey.retromusic.activities.tageditor.* import code.name.monkey.retromusic.adapter.album.HorizontalAlbumAdapter import code.name.monkey.retromusic.adapter.song.SimpleSongAdapter -import code.name.monkey.retromusic.dialogs.AddToPlaylistDialog -import code.name.monkey.retromusic.dialogs.DeleteSongsDialog +import code.name.monkey.retromusic.dialogs.* import code.name.monkey.retromusic.extensions.show -import code.name.monkey.retromusic.glide.ArtistGlideRequest -import code.name.monkey.retromusic.glide.RetroMusicColoredTarget -import code.name.monkey.retromusic.glide.SongGlideRequest +import code.name.monkey.retromusic.glide.* import code.name.monkey.retromusic.helper.MusicPlayerRemote import code.name.monkey.retromusic.helper.SortOrder.AlbumSongSortOrder -import code.name.monkey.retromusic.model.Album -import code.name.monkey.retromusic.model.Artist -import code.name.monkey.retromusic.mvp.presenter.AlbumDetailsPresenter -import code.name.monkey.retromusic.mvp.presenter.AlbumDetailsView -import code.name.monkey.retromusic.util.MusicUtil -import code.name.monkey.retromusic.util.NavigationUtil -import code.name.monkey.retromusic.util.PreferenceUtil +import code.name.monkey.retromusic.model.* +import code.name.monkey.retromusic.mvp.presenter.* +import code.name.monkey.retromusic.util.* import com.bumptech.glide.Glide import kotlinx.android.synthetic.main.activity_album.* import kotlinx.android.synthetic.main.activity_album_content.* @@ -46,236 +30,263 @@ import java.util.* import javax.inject.Inject import android.util.Pair as UtilPair - class AlbumDetailsActivity : AbsSlidingMusicPanelActivity(), AlbumDetailsView { - private lateinit var simpleSongAdapter: SimpleSongAdapter - private lateinit var album: Album - private lateinit var artistImage: ImageView - private val savedSortOrder: String - get() = PreferenceUtil.getInstance(this).albumDetailSongSortOrder + private lateinit var simpleSongAdapter: SimpleSongAdapter + private lateinit var album: Album + private lateinit var artistImage: ImageView + private val savedSortOrder: String + get() = PreferenceUtil.getInstance(this).albumDetailSongSortOrder - override fun createContentView(): View { - return wrapSlidingMusicPanel(R.layout.activity_album) - } + override fun createContentView(): View { + return wrapSlidingMusicPanel(R.layout.activity_album) + } - @Inject - lateinit var albumDetailsPresenter: AlbumDetailsPresenter + @Inject + lateinit var albumDetailsPresenter: AlbumDetailsPresenter - override fun onCreate(savedInstanceState: Bundle?) { - setDrawUnderStatusBar() - super.onCreate(savedInstanceState) - toggleBottomNavigationView(true) - setStatusbarColor(Color.TRANSPARENT) - setNavigationbarColorAuto() - setTaskDescriptionColorAuto() - setLightNavigationBar(true) - setLightStatusbar(ColorUtil.isColorLight(ATHUtil.resolveColor(this, R.attr.colorPrimary))) + override fun onCreate(savedInstanceState: Bundle?) { + setDrawUnderStatusBar() + super.onCreate(savedInstanceState) + toggleBottomNavigationView(true) + setStatusbarColor(Color.TRANSPARENT) + setNavigationbarColorAuto() + setTaskDescriptionColorAuto() + setLightNavigationBar(true) + setLightStatusbar(ColorUtil.isColorLight(ATHUtil.resolveColor(this, R.attr.colorPrimary))) - ActivityCompat.postponeEnterTransition(this) + ActivityCompat.postponeEnterTransition(this) - App.musicComponent.inject(this) - artistImage = findViewById(R.id.artistImage) + App.musicComponent.inject(this) + artistImage = findViewById(R.id.artistImage) - setupRecyclerView() + setupRecyclerView() - artistImage.setOnClickListener { - val artistPairs = ActivityOptions.makeSceneTransitionAnimation(this, UtilPair.create(artistImage, getString(R.string.transition_artist_image))) - NavigationUtil.goToArtistOptions(this, album.artistId, artistPairs) - } - playAction.apply { - setOnClickListener { MusicPlayerRemote.openQueue(album.songs!!, 0, true) } - } - shuffleAction.apply { - setOnClickListener { MusicPlayerRemote.openAndShuffleQueue(album.songs!!, true) } - } + artistImage.setOnClickListener { + val artistPairs = ActivityOptions.makeSceneTransitionAnimation( + this, + UtilPair.create( + artistImage, + getString(R.string.transition_artist_image) + ) + ) + NavigationUtil.goToArtistOptions(this, album.artistId, artistPairs) + } + playAction.apply { + setOnClickListener { MusicPlayerRemote.openQueue(album.songs!!, 0, true) } + } + shuffleAction.apply { + setOnClickListener { MusicPlayerRemote.openAndShuffleQueue(album.songs!!, true) } + } - albumDetailsPresenter.attachView(this) + albumDetailsPresenter.attachView(this) - if (intent.extras!!.containsKey(EXTRA_ALBUM_ID)) { - intent.extras?.getInt(EXTRA_ALBUM_ID)?.let { albumDetailsPresenter.loadAlbum(it) } - } else { - finish() - } - } + if (intent.extras!!.containsKey(EXTRA_ALBUM_ID)) { + intent.extras?.getInt(EXTRA_ALBUM_ID)?.let { albumDetailsPresenter.loadAlbum(it) } + } else { + finish() + } + } - private fun setupRecyclerView() { - simpleSongAdapter = SimpleSongAdapter(this, ArrayList(), R.layout.item_song) - recyclerView.apply { - layoutManager = LinearLayoutManager(this@AlbumDetailsActivity) - itemAnimator = DefaultItemAnimator() - isNestedScrollingEnabled = false - adapter = simpleSongAdapter - } - } + private fun setupRecyclerView() { + simpleSongAdapter = SimpleSongAdapter(this, ArrayList(), R.layout.item_song) + recyclerView.apply { + layoutManager = LinearLayoutManager(this@AlbumDetailsActivity) + itemAnimator = DefaultItemAnimator() + isNestedScrollingEnabled = false + adapter = simpleSongAdapter + } + } - override fun onDestroy() { - super.onDestroy() - albumDetailsPresenter.detachView() - } + override fun onDestroy() { + super.onDestroy() + albumDetailsPresenter.detachView() + } - override fun complete() { - ActivityCompat.startPostponedEnterTransition(this) - } + override fun complete() { + ActivityCompat.startPostponedEnterTransition(this) + } - override fun album(album: Album) { + override fun album(album: Album) { - if (album.songs!!.isEmpty()) { - finish() - return - } - this.album = album + if (album.songs!!.isEmpty()) { + finish() + return + } + this.album = album - albumTitle.text = album.title - if (MusicUtil.getYearString(album.year) == "-") { - 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))) - } - loadAlbumCover() - simpleSongAdapter.swapDataSet(album.songs) - albumDetailsPresenter.loadMore(album.artistId) - } + albumTitle.text = album.title + if (MusicUtil.getYearString(album.year) == "-") { + 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 + ) + ) + ) + } + loadAlbumCover() + simpleSongAdapter.swapDataSet(album.songs) + albumDetailsPresenter.loadMore(album.artistId) + } + override fun moreAlbums(albums: ArrayList) { + moreTitle.show() + moreRecyclerView.show() + moreTitle.text = String.format(getString(R.string.label_more_from), album.artistName) - override fun moreAlbums(albums: ArrayList) { - moreTitle.show() - moreRecyclerView.show() - moreTitle.text = String.format(getString(R.string.label_more_from), album.artistName) + val albumAdapter = HorizontalAlbumAdapter(this, albums, false, null) + moreRecyclerView.layoutManager = GridLayoutManager( + this, + 1, + GridLayoutManager.HORIZONTAL, + false + ) + moreRecyclerView.adapter = albumAdapter + } - val albumAdapter = HorizontalAlbumAdapter(this, albums, false, null) - moreRecyclerView.layoutManager = GridLayoutManager(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) { - 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) { + } + }) - } - }) + } - } + private fun loadAlbumCover() { + SongGlideRequest.Builder.from(Glide.with(this), album.safeGetFirstSong()) + .checkIgnoreMediaStore(this).generatePalette(this).build().dontAnimate().dontTransform() + .into(object : RetroMusicColoredTarget(image) { + override fun onColorReady(color: Int) { + setColors(color) + } + }) + } - private fun loadAlbumCover() { - SongGlideRequest.Builder.from(Glide.with(this), album.safeGetFirstSong()) - .checkIgnoreMediaStore(this) - .generatePalette(this).build() - .dontAnimate().dontTransform() - .into(object : RetroMusicColoredTarget(image) { - override fun onColorReady(color: Int) { - setColors(color) - } - }) - } + private fun setColors(color: Int) { + val themeColor = if (PreferenceUtil.getInstance(this).adaptiveColor) color + else ThemeStore.accentColor(this) - private fun setColors(color: Int) { - val themeColor = if (PreferenceUtil.getInstance(this).adaptiveColor) color - else ThemeStore.accentColor(this) + songTitle.setTextColor(themeColor) + moreTitle.setTextColor(themeColor) - songTitle.setTextColor(themeColor) - moreTitle.setTextColor(themeColor) + val buttonColor = if (PreferenceUtil.getInstance(this).adaptiveColor) color + else ATHUtil.resolveColor(this, R.attr.cardBackgroundColor) - val buttonColor = if (PreferenceUtil.getInstance(this).adaptiveColor) color - else ATHUtil.resolveColor(this, R.attr.cardBackgroundColor) + MaterialUtil.setTint(button = shuffleAction, color = buttonColor) + MaterialUtil.setTint(button = playAction, color = buttonColor) - MaterialUtil.setTint(button = shuffleAction, color = buttonColor) - MaterialUtil.setTint(button = playAction, color = buttonColor) + toolbar.setBackgroundColor(ATHUtil.resolveColor(this, R.attr.colorPrimary)) + setSupportActionBar(toolbar) + supportActionBar?.title = null + } - toolbar.setBackgroundColor(ATHUtil.resolveColor(this, R.attr.colorPrimary)) - setSupportActionBar(toolbar) - supportActionBar?.title = null - } + override fun onCreateOptionsMenu(menu: Menu): Boolean { + menuInflater.inflate(R.menu.menu_album_detail, menu) + val sortOrder = menu.findItem(R.id.action_sort_order) + setUpSortOrderMenu(sortOrder.subMenu) + return super.onCreateOptionsMenu(menu) + } - override fun onCreateOptionsMenu(menu: Menu): Boolean { - menuInflater.inflate(R.menu.menu_album_detail, menu) - val sortOrder = menu.findItem(R.id.action_sort_order) - setUpSortOrderMenu(sortOrder.subMenu) - return super.onCreateOptionsMenu(menu) - } + override fun onOptionsItemSelected(item: MenuItem): Boolean { + return handleSortOrderMenuItem(item) + } - override fun onOptionsItemSelected(item: MenuItem): Boolean { - return handleSortOrderMenuItem(item) - } + private fun handleSortOrderMenuItem(item: MenuItem): Boolean { + var sortOrder: String? = null + val songs = simpleSongAdapter.dataSet + when (item.itemId) { + R.id.action_play_next -> { + MusicPlayerRemote.playNext(songs) + return true + } + R.id.action_add_to_current_playing -> { + MusicPlayerRemote.enqueue(songs) + return true + } + R.id.action_add_to_playlist -> { + AddToPlaylistDialog.create(songs).show(supportFragmentManager, "ADD_PLAYLIST") + return true + } + R.id.action_delete_from_device -> { + DeleteSongsDialog.create(songs).show(supportFragmentManager, "DELETE_SONGS") + return true + } + android.R.id.home -> { + super.onBackPressed() + return true + } + R.id.action_tag_editor -> { + val intent = Intent(this, AlbumTagEditorActivity::class.java) + intent.putExtra(AbsTagEditorActivity.EXTRA_ID, album.id) + startActivityForResult(intent, TAG_EDITOR_REQUEST) + return true + } + /*Sort*/ + R.id.action_sort_order_title -> sortOrder = AlbumSongSortOrder.SONG_A_Z + R.id.action_sort_order_title_desc -> sortOrder = AlbumSongSortOrder.SONG_Z_A + R.id.action_sort_order_track_list -> sortOrder = AlbumSongSortOrder.SONG_TRACK_LIST + R.id.action_sort_order_artist_song_duration -> sortOrder = AlbumSongSortOrder.SONG_DURATION + } + if (sortOrder != null) { + item.isChecked = true + setSaveSortOrder(sortOrder) + } + return true + } - private fun handleSortOrderMenuItem(item: MenuItem): Boolean { - var sortOrder: String? = null - val songs = simpleSongAdapter.dataSet - when (item.itemId) { - R.id.action_play_next -> { - MusicPlayerRemote.playNext(songs) - return true - } - R.id.action_add_to_current_playing -> { - MusicPlayerRemote.enqueue(songs) - return true - } - R.id.action_add_to_playlist -> { - AddToPlaylistDialog.create(songs).show(supportFragmentManager, "ADD_PLAYLIST") - return true - } - R.id.action_delete_from_device -> { - DeleteSongsDialog.create(songs).show(supportFragmentManager, "DELETE_SONGS") - return true - } - android.R.id.home -> { - super.onBackPressed() - return true - } - R.id.action_tag_editor -> { - val intent = Intent(this, AlbumTagEditorActivity::class.java) - intent.putExtra(AbsTagEditorActivity.EXTRA_ID, album.id) - startActivityForResult(intent, TAG_EDITOR_REQUEST) - return true - } - /*Sort*/ - R.id.action_sort_order_title -> sortOrder = AlbumSongSortOrder.SONG_A_Z - R.id.action_sort_order_title_desc -> sortOrder = AlbumSongSortOrder.SONG_Z_A - R.id.action_sort_order_track_list -> sortOrder = AlbumSongSortOrder.SONG_TRACK_LIST - R.id.action_sort_order_artist_song_duration -> sortOrder = AlbumSongSortOrder.SONG_DURATION - } - if (sortOrder != null) { - item.isChecked = true - setSaveSortOrder(sortOrder) - } - return true - } + private fun setUpSortOrderMenu(sortOrder: SubMenu) { + 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 + } + } - private fun setUpSortOrderMenu(sortOrder: SubMenu) { - 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 - } - } + private fun setSaveSortOrder(sortOrder: String?) { + PreferenceUtil.getInstance(this).albumDetailSongSortOrder = sortOrder + reload() + } - private fun setSaveSortOrder(sortOrder: String?) { - PreferenceUtil.getInstance(this).albumDetailSongSortOrder = sortOrder - reload() - } + override fun onMediaStoreChanged() { + super.onMediaStoreChanged() + reload() + } - override fun onMediaStoreChanged() { - super.onMediaStoreChanged() - reload() - } + private fun reload() { + if (intent.extras!!.containsKey(EXTRA_ALBUM_ID)) { + intent.extras?.getInt(EXTRA_ALBUM_ID)?.let { albumDetailsPresenter.loadAlbum(it) } + } else { + finish() + } + } - private fun reload() { - if (intent.extras!!.containsKey(EXTRA_ALBUM_ID)) { - intent.extras?.getInt(EXTRA_ALBUM_ID)?.let { albumDetailsPresenter.loadAlbum(it) } - } else { - finish() - } - } + companion object { - companion object { - - const val EXTRA_ALBUM_ID = "extra_album_id" - private const val TAG_EDITOR_REQUEST = 2001 - } + const val EXTRA_ALBUM_ID = "extra_album_id" + private const val TAG_EDITOR_REQUEST = 2001 + } } \ No newline at end of file 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 b1f210960..0ababef31 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 @@ -3,35 +3,23 @@ package code.name.monkey.retromusic.activities import android.app.Activity import android.content.Intent import android.graphics.Color -import android.os.Build -import android.os.Bundle -import android.text.Html -import android.text.Spanned -import android.view.Menu -import android.view.MenuItem -import android.view.View +import android.os.* +import android.text.* +import android.view.* import android.widget.Toast import androidx.core.app.ActivityCompat -import androidx.recyclerview.widget.DefaultItemAnimator -import androidx.recyclerview.widget.GridLayoutManager -import androidx.recyclerview.widget.LinearLayoutManager +import androidx.recyclerview.widget.* import code.name.monkey.appthemehelper.ThemeStore -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.retromusic.App -import code.name.monkey.retromusic.R +import code.name.monkey.appthemehelper.util.* +import code.name.monkey.retromusic.* import code.name.monkey.retromusic.activities.base.AbsSlidingMusicPanelActivity -import code.name.monkey.retromusic.adapter.album.AlbumAdapter -import code.name.monkey.retromusic.adapter.album.HorizontalAlbumAdapter +import code.name.monkey.retromusic.adapter.album.* import code.name.monkey.retromusic.adapter.song.SimpleSongAdapter import code.name.monkey.retromusic.dialogs.AddToPlaylistDialog -import code.name.monkey.retromusic.glide.ArtistGlideRequest -import code.name.monkey.retromusic.glide.RetroMusicColoredTarget +import code.name.monkey.retromusic.glide.* import code.name.monkey.retromusic.helper.MusicPlayerRemote 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.mvp.presenter.* import code.name.monkey.retromusic.rest.LastFMRestClient import code.name.monkey.retromusic.rest.model.LastFmArtist import code.name.monkey.retromusic.util.* @@ -44,257 +32,267 @@ import kotlin.collections.ArrayList class ArtistDetailActivity : AbsSlidingMusicPanelActivity(), ArtistDetailsView { - private var biography: Spanned? = null - private lateinit var artist: Artist - private var lastFMRestClient: LastFMRestClient? = null - private lateinit var songAdapter: SimpleSongAdapter - private lateinit var albumAdapter: AlbumAdapter - private var forceDownload: Boolean = false + private var biography: Spanned? = null + private lateinit var artist: Artist + private var lastFMRestClient: LastFMRestClient? = null + private lateinit var songAdapter: SimpleSongAdapter + private lateinit var albumAdapter: AlbumAdapter + private var forceDownload: Boolean = false - override fun createContentView(): View { - return wrapSlidingMusicPanel(R.layout.activity_artist_details) - } + override fun createContentView(): View { + return wrapSlidingMusicPanel(R.layout.activity_artist_details) + } - @Inject - lateinit var artistDetailsPresenter: ArtistDetailsPresenter + @Inject + lateinit var artistDetailsPresenter: ArtistDetailsPresenter - override fun onCreate(savedInstanceState: Bundle?) { - setDrawUnderStatusBar() - super.onCreate(savedInstanceState) - toggleBottomNavigationView(true) - setStatusbarColor(Color.TRANSPARENT) - setNavigationbarColorAuto() - setTaskDescriptionColorAuto() - setLightNavigationBar(true) - setLightStatusbar(ColorUtil.isColorLight(ATHUtil.resolveColor(this, R.attr.colorPrimary))) + override fun onCreate(savedInstanceState: Bundle?) { + setDrawUnderStatusBar() + super.onCreate(savedInstanceState) + toggleBottomNavigationView(true) + setStatusbarColor(Color.TRANSPARENT) + setNavigationbarColorAuto() + setTaskDescriptionColorAuto() + setLightNavigationBar(true) + setLightStatusbar(ColorUtil.isColorLight(ATHUtil.resolveColor(this, R.attr.colorPrimary))) - ActivityCompat.postponeEnterTransition(this) + ActivityCompat.postponeEnterTransition(this) - lastFMRestClient = LastFMRestClient(this) + lastFMRestClient = LastFMRestClient(this) - setUpViews() + setUpViews() - playAction.apply { - setOnClickListener { MusicPlayerRemote.openQueue(artist.songs, 0, true) } - } - shuffleAction.apply { - setOnClickListener { MusicPlayerRemote.openAndShuffleQueue(artist.songs, true) } - } + playAction.apply { + setOnClickListener { MusicPlayerRemote.openQueue(artist.songs, 0, true) } + } + shuffleAction.apply { + setOnClickListener { MusicPlayerRemote.openAndShuffleQueue(artist.songs, true) } + } - biographyText.setOnClickListener { - if (biographyText.maxLines == 4) { - biographyText.maxLines = Integer.MAX_VALUE - } else { - biographyText.maxLines = 4 - } - } + biographyText.setOnClickListener { + if (biographyText.maxLines == 4) { + biographyText.maxLines = Integer.MAX_VALUE + } else { + biographyText.maxLines = 4 + } + } - App.musicComponent.inject(this) - artistDetailsPresenter.attachView(this) + App.musicComponent.inject(this) + artistDetailsPresenter.attachView(this) - if (intent.extras!!.containsKey(EXTRA_ARTIST_ID)) { - intent.extras?.getInt(EXTRA_ARTIST_ID)?.let { artistDetailsPresenter.loadArtist(it) } - } else { - finish() - } - } + if (intent.extras!!.containsKey(EXTRA_ARTIST_ID)) { + intent.extras?.getInt(EXTRA_ARTIST_ID)?.let { artistDetailsPresenter.loadArtist(it) } + } else { + finish() + } + } - override fun onDestroy() { - super.onDestroy() - artistDetailsPresenter.detachView() - } + override fun onDestroy() { + super.onDestroy() + artistDetailsPresenter.detachView() + } - private fun setUpViews() { - setupRecyclerView() - setupContainerHeight() - } + private fun setUpViews() { + setupRecyclerView() + setupContainerHeight() + } - private fun setupContainerHeight() { - imageContainer?.let { - val params = it.layoutParams - params.width = DensityUtil.getScreenHeight(this) / 2 - it.layoutParams = params - } - } + private fun setupContainerHeight() { + imageContainer?.let { + val params = it.layoutParams + params.width = DensityUtil.getScreenHeight(this) / 2 + it.layoutParams = params + } + } + private fun setupRecyclerView() { + albumAdapter = HorizontalAlbumAdapter(this, ArrayList(), false, null) + albumRecyclerView.apply { + itemAnimator = DefaultItemAnimator() + layoutManager = GridLayoutManager(this.context, 1, GridLayoutManager.HORIZONTAL, false) + adapter = albumAdapter + } + songAdapter = SimpleSongAdapter(this, ArrayList(), R.layout.item_song) + recyclerView.apply { + itemAnimator = DefaultItemAnimator() + layoutManager = LinearLayoutManager(this.context) + adapter = songAdapter + } + } - private fun setupRecyclerView() { - albumAdapter = HorizontalAlbumAdapter(this, ArrayList(), false, null) - albumRecyclerView.apply { - itemAnimator = DefaultItemAnimator() - layoutManager = GridLayoutManager(this.context, 1, GridLayoutManager.HORIZONTAL, false) - adapter = albumAdapter - } - songAdapter = SimpleSongAdapter(this, ArrayList(), R.layout.item_song) - recyclerView.apply { - itemAnimator = DefaultItemAnimator() - layoutManager = LinearLayoutManager(this.context) - adapter = songAdapter - } - } + override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { + super.onActivityResult(requestCode, resultCode, data) + when (requestCode) { + REQUEST_CODE_SELECT_IMAGE -> if (resultCode == Activity.RESULT_OK) { + data?.data?.let { + CustomArtistImageUtil.getInstance(this).setCustomArtistImage(artist, it) + } + } + else -> if (resultCode == Activity.RESULT_OK) { + reload() + } + } + } + override fun showEmptyView() { - override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { - super.onActivityResult(requestCode, resultCode, data) - when (requestCode) { - REQUEST_CODE_SELECT_IMAGE -> if (resultCode == Activity.RESULT_OK) { - data?.data?.let { CustomArtistImageUtil.getInstance(this).setCustomArtistImage(artist, it) } - } - else -> if (resultCode == Activity.RESULT_OK) { - reload() - } - } - } + } - override fun showEmptyView() { + override fun complete() { + ActivityCompat.startPostponedEnterTransition(this) + } - } + override fun artist(artist: Artist) { + if (artist.songCount <= 0) { + finish() + } + this.artist = artist + loadArtistImage() - override fun complete() { - ActivityCompat.startPostponedEnterTransition(this) - } + if (RetroUtil.isAllowedToDownloadMetadata(this)) { + loadBiography(artist.name) + } + artistTitle.text = artist.name + text.text = String.format( + "%s • %s", + MusicUtil.getArtistInfoString(this, artist), + MusicUtil.getReadableDurationString(MusicUtil.getTotalDuration(this, artist.songs)) + ) - override fun artist(artist: Artist) { - if (artist.songCount <= 0) { - finish() - } - this.artist = artist - loadArtistImage() + songAdapter.swapDataSet(artist.songs) + albumAdapter.swapDataSet(artist.albums!!) + } - if (RetroUtil.isAllowedToDownloadMetadata(this)) { - loadBiography(artist.name) - } - artistTitle.text = artist.name - text.text = String.format("%s • %s", MusicUtil.getArtistInfoString(this, artist), MusicUtil - .getReadableDurationString(MusicUtil.getTotalDuration(this, artist.songs))) + private fun loadBiography( + name: String, lang: String? = Locale.getDefault().language + ) { + biography = null + this.lang = lang + artistDetailsPresenter.loadBiography(name, lang, null) + } - songAdapter.swapDataSet(artist.songs) - albumAdapter.swapDataSet(artist.albums!!) - } + override fun artistInfo(lastFmArtist: LastFmArtist?) { + if (lastFmArtist != null && lastFmArtist.artist != null) { + val bioContent = lastFmArtist.artist.bio.content + if (bioContent != null && bioContent.trim { it <= ' ' }.isNotEmpty()) { + biographyText.visibility = View.VISIBLE + biographyTitle.visibility = View.VISIBLE + biography = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { + Html.fromHtml(bioContent, Html.FROM_HTML_MODE_LEGACY) + } else { + Html.fromHtml(bioContent) + } + biographyText.text = biography + } + } - private fun loadBiography(name: String, - lang: String? = Locale.getDefault().language) { - biography = null - this.lang = lang - artistDetailsPresenter.loadBiography(name, lang, null) - } + // If the "lang" parameter is set and no biography is given, retry with default language + if (biography == null && lang != null) { + loadBiography(artist.name, null) + } + } - override fun artistInfo(lastFmArtist: LastFmArtist?) { - if (lastFmArtist != null && lastFmArtist.artist != null) { - val bioContent = lastFmArtist.artist.bio.content - if (bioContent != null && bioContent.trim { it <= ' ' }.isNotEmpty()) { - biographyText.visibility = View.VISIBLE - biographyTitle.visibility = View.VISIBLE - biography = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { - Html.fromHtml(bioContent, Html.FROM_HTML_MODE_LEGACY) - } else { - Html.fromHtml(bioContent) - } - biographyText.text = biography - } - } + private var lang: String? = null - // If the "lang" parameter is set and no biography is given, retry with default language - if (biography == null && lang != null) { - loadBiography(artist.name, null) - } - } + 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) + } + }) + } - private var lang: String? = null + private fun setColors(color: Int) { - 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) - } - }) - } + val textColor = if (PreferenceUtil.getInstance(this).adaptiveColor) color + else ThemeStore.accentColor(this) - private fun setColors(color: Int) { + albumTitle.setTextColor(textColor) + songTitle.setTextColor(textColor) + biographyTitle.setTextColor(textColor) - val textColor = if (PreferenceUtil.getInstance(this).adaptiveColor) color - else ThemeStore.accentColor(this) + val buttonColor = if (PreferenceUtil.getInstance(this).adaptiveColor) color + else ATHUtil.resolveColor(this, R.attr.cardBackgroundColor) - albumTitle.setTextColor(textColor) - songTitle.setTextColor(textColor) - biographyTitle.setTextColor(textColor) + MaterialUtil.setTint(button = shuffleAction, color = buttonColor) + MaterialUtil.setTint(button = playAction, color = buttonColor) - val buttonColor = if (PreferenceUtil.getInstance(this).adaptiveColor) color - else ATHUtil.resolveColor(this, R.attr.cardBackgroundColor) + toolbar.setBackgroundColor(ATHUtil.resolveColor(this, R.attr.colorPrimary)) + setSupportActionBar(toolbar) + supportActionBar?.title = null + } - MaterialUtil.setTint(button = shuffleAction, color = buttonColor) - MaterialUtil.setTint(button = playAction, color = buttonColor) + override fun onOptionsItemSelected(item: MenuItem): Boolean { + return handleSortOrderMenuItem(item) + } - toolbar.setBackgroundColor(ATHUtil.resolveColor(this, R.attr.colorPrimary)) - setSupportActionBar(toolbar) - supportActionBar?.title = null - } + private fun handleSortOrderMenuItem(item: MenuItem): Boolean { + val songs = artist.songs + when (item.itemId) { + android.R.id.home -> { + super.onBackPressed() + return true + } + R.id.action_play_next -> { + MusicPlayerRemote.playNext(songs) + return true + } + R.id.action_add_to_current_playing -> { + MusicPlayerRemote.enqueue(songs) + return true + } + R.id.action_add_to_playlist -> { + AddToPlaylistDialog.create(songs).show(supportFragmentManager, "ADD_PLAYLIST") + return true + } + 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 + ) + return true + } + R.id.action_reset_artist_image -> { + Toast.makeText( + this@ArtistDetailActivity, + resources.getString(R.string.updating), + Toast.LENGTH_SHORT + ).show() + CustomArtistImageUtil.getInstance(this@ArtistDetailActivity) + .resetCustomArtistImage(artist) + forceDownload = true + return true + } + } + return true + } + override fun onCreateOptionsMenu(menu: Menu): Boolean { + menuInflater.inflate(R.menu.menu_artist_detail, menu) + return super.onCreateOptionsMenu(menu) + } - override fun onOptionsItemSelected(item: MenuItem): Boolean { - return handleSortOrderMenuItem(item) - } + override fun onMediaStoreChanged() { + super.onMediaStoreChanged() + reload() + } - private fun handleSortOrderMenuItem(item: MenuItem): Boolean { - val songs = artist.songs - when (item.itemId) { - android.R.id.home -> { - super.onBackPressed() - return true - } - R.id.action_play_next -> { - MusicPlayerRemote.playNext(songs) - return true - } - R.id.action_add_to_current_playing -> { - MusicPlayerRemote.enqueue(songs) - return true - } - R.id.action_add_to_playlist -> { - AddToPlaylistDialog.create(songs).show(supportFragmentManager, "ADD_PLAYLIST") - return true - } - 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) - return true - } - R.id.action_reset_artist_image -> { - Toast.makeText(this@ArtistDetailActivity, resources.getString(R.string.updating), - Toast.LENGTH_SHORT).show() - CustomArtistImageUtil.getInstance(this@ArtistDetailActivity).resetCustomArtistImage(artist) - forceDownload = true - return true - } - } - return true - } + private fun reload() { + if (intent.extras!!.containsKey(EXTRA_ARTIST_ID)) { + intent.extras?.getInt(EXTRA_ARTIST_ID)?.let { artistDetailsPresenter.loadArtist(it) } + } else { + finish() + } + } - override fun onCreateOptionsMenu(menu: Menu): Boolean { - menuInflater.inflate(R.menu.menu_artist_detail, menu) - return super.onCreateOptionsMenu(menu) - } + companion object { - override fun onMediaStoreChanged() { - super.onMediaStoreChanged() - reload() - } - - private fun reload() { - if (intent.extras!!.containsKey(EXTRA_ARTIST_ID)) { - intent.extras?.getInt(EXTRA_ARTIST_ID)?.let { artistDetailsPresenter.loadArtist(it) } - } else { - finish() - } - } - - companion object { - - const val EXTRA_ARTIST_ID = "extra_artist_id" - const val REQUEST_CODE_SELECT_IMAGE = 9003 - } + const val EXTRA_ARTIST_ID = "extra_artist_id" + const val REQUEST_CODE_SELECT_IMAGE = 9003 + } } 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 763c99508..34673375d 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 @@ -2,26 +2,18 @@ package code.name.monkey.retromusic.activities import android.graphics.Color import android.os.Bundle -import android.view.Menu -import android.view.MenuItem -import android.view.View -import androidx.recyclerview.widget.DefaultItemAnimator -import androidx.recyclerview.widget.LinearLayoutManager -import androidx.recyclerview.widget.RecyclerView -import code.name.monkey.appthemehelper.util.ATHUtil -import code.name.monkey.appthemehelper.util.ColorUtil -import code.name.monkey.retromusic.App -import code.name.monkey.retromusic.R +import android.view.* +import androidx.recyclerview.widget.* +import code.name.monkey.appthemehelper.util.* +import code.name.monkey.retromusic.* import code.name.monkey.retromusic.activities.base.AbsSlidingMusicPanelActivity import code.name.monkey.retromusic.adapter.song.ShuffleButtonSongAdapter import code.name.monkey.retromusic.extensions.applyToolbar import code.name.monkey.retromusic.helper.menu.GenreMenuHelper import code.name.monkey.retromusic.interfaces.CabHolder -import code.name.monkey.retromusic.model.Genre -import code.name.monkey.retromusic.model.Song -import code.name.monkey.retromusic.mvp.presenter.GenreDetailsPresenter -import code.name.monkey.retromusic.mvp.presenter.GenreDetailsView -import code.name.monkey.retromusic.util.RetroColorUtil +import code.name.monkey.retromusic.model.* +import code.name.monkey.retromusic.mvp.presenter.* +import code.name.monkey.retromusic.util.* import code.name.monkey.retromusic.util.ViewUtil import com.afollestad.materialcab.MaterialCab import kotlinx.android.synthetic.main.activity_playlist_detail.* @@ -34,124 +26,127 @@ import javax.inject.Inject class GenreDetailsActivity : AbsSlidingMusicPanelActivity(), CabHolder, GenreDetailsView { - @Inject - lateinit var genreDetailsPresenter: GenreDetailsPresenter + @Inject + lateinit var genreDetailsPresenter: GenreDetailsPresenter - private lateinit var genre: Genre - private lateinit var songAdapter: ShuffleButtonSongAdapter - private var cab: MaterialCab? = null + private lateinit var genre: Genre + private lateinit var songAdapter: ShuffleButtonSongAdapter + private var cab: MaterialCab? = null - private fun checkIsEmpty() { - empty?.visibility = if (songAdapter.itemCount == 0) View.VISIBLE else View.GONE - } + private fun checkIsEmpty() { + empty?.visibility = if (songAdapter.itemCount == 0) View.VISIBLE else View.GONE + } - override fun onCreate(savedInstanceState: Bundle?) { - setDrawUnderStatusBar() - super.onCreate(savedInstanceState) + override fun onCreate(savedInstanceState: Bundle?) { + setDrawUnderStatusBar() + super.onCreate(savedInstanceState) - setStatusbarColor(Color.TRANSPARENT) - setNavigationbarColorAuto() - setTaskDescriptionColorAuto() - setLightNavigationBar(true) - setLightStatusbar(ColorUtil.isColorLight(ATHUtil.resolveColor(this, R.attr.colorPrimary))) - toggleBottomNavigationView(true) + setStatusbarColor(Color.TRANSPARENT) + setNavigationbarColorAuto() + setTaskDescriptionColorAuto() + setLightNavigationBar(true) + setLightStatusbar(ColorUtil.isColorLight(ATHUtil.resolveColor(this, R.attr.colorPrimary))) + toggleBottomNavigationView(true) - if (intent.extras != null) { - genre = intent?.extras?.getParcelable(EXTRA_GENRE_ID)!! - } else { - finish() - } + if (intent.extras != null) { + genre = intent?.extras?.getParcelable(EXTRA_GENRE_ID)!! + } else { + finish() + } - setUpToolBar() - setupRecyclerView() + setUpToolBar() + setupRecyclerView() - App.musicComponent.inject(this) - genreDetailsPresenter.attachView(this) + App.musicComponent.inject(this) + genreDetailsPresenter.attachView(this) - } + } - private fun setUpToolBar() { - val primaryColor = ATHUtil.resolveColor(this, R.attr.colorPrimary) - appBarLayout.setBackgroundColor(primaryColor) - applyToolbar(toolbar) - title = genre.name - } + private fun setUpToolBar() { + val primaryColor = ATHUtil.resolveColor(this, R.attr.colorPrimary) + appBarLayout.setBackgroundColor(primaryColor) + applyToolbar(toolbar) + title = genre.name + } - override fun onResume() { - super.onResume() - genreDetailsPresenter.loadGenreSongs(genre.id) - } + override fun onResume() { + super.onResume() + genreDetailsPresenter.loadGenreSongs(genre.id) + } - override fun onDestroy() { - super.onDestroy() - genreDetailsPresenter.detachView() - } + override fun onDestroy() { + super.onDestroy() + genreDetailsPresenter.detachView() + } - override fun createContentView(): View { - return wrapSlidingMusicPanel(R.layout.activity_playlist_detail) - } + override fun createContentView(): View { + return wrapSlidingMusicPanel(R.layout.activity_playlist_detail) + } - override fun showEmptyView() { + override fun showEmptyView() { - } + } - override fun onCreateOptionsMenu(menu: Menu): Boolean { - menuInflater.inflate(R.menu.menu_genre_detail, menu) - return super.onCreateOptionsMenu(menu) - } + override fun onCreateOptionsMenu(menu: Menu): Boolean { + menuInflater.inflate(R.menu.menu_genre_detail, menu) + return super.onCreateOptionsMenu(menu) + } - override fun onOptionsItemSelected(item: MenuItem): Boolean { - if (item.itemId == android.R.id.home) { - onBackPressed() - } - return GenreMenuHelper.handleMenuClick(this, genre, item) - } + override fun onOptionsItemSelected(item: MenuItem): Boolean { + if (item.itemId == android.R.id.home) { + onBackPressed() + } + return GenreMenuHelper.handleMenuClick(this, genre, item) + } - private fun setupRecyclerView() { - ViewUtil.setUpFastScrollRecyclerViewColor(this, recyclerView ) - songAdapter = ShuffleButtonSongAdapter(this, ArrayList(), R.layout.item_list, false, this) - recyclerView.apply { - itemAnimator = DefaultItemAnimator() - layoutManager = LinearLayoutManager(this@GenreDetailsActivity) - adapter = songAdapter - } - songAdapter.registerAdapterDataObserver(object : RecyclerView.AdapterDataObserver() { - override fun onChanged() { - super.onChanged() - checkIsEmpty() - } - }) - } + private fun setupRecyclerView() { + ViewUtil.setUpFastScrollRecyclerViewColor(this, recyclerView) + songAdapter = ShuffleButtonSongAdapter(this, ArrayList(), R.layout.item_list, false, this) + recyclerView.apply { + itemAnimator = DefaultItemAnimator() + layoutManager = LinearLayoutManager(this@GenreDetailsActivity) + adapter = songAdapter + } + songAdapter.registerAdapterDataObserver(object : RecyclerView.AdapterDataObserver() { + override fun onChanged() { + super.onChanged() + checkIsEmpty() + } + }) + } - override fun songs(songs: ArrayList) { - songAdapter.swapDataSet(songs) - } + override fun songs(songs: ArrayList) { + songAdapter.swapDataSet(songs) + } - 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.colorPrimary))) - .start(callback) - return cab!! - } + 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.colorPrimary + ) + ) + ).start(callback) + return cab!! + } - override fun onBackPressed() { - if (cab != null && cab!!.isActive) - cab!!.finish() - else { - recyclerView!!.stopScroll() - super.onBackPressed() - } - } + override fun onBackPressed() { + if (cab != null && cab!!.isActive) cab!!.finish() + else { + recyclerView!!.stopScroll() + super.onBackPressed() + } + } - override fun onMediaStoreChanged() { - super.onMediaStoreChanged() - genreDetailsPresenter.loadGenreSongs(genre.id) - } + override fun onMediaStoreChanged() { + super.onMediaStoreChanged() + genreDetailsPresenter.loadGenreSongs(genre.id) + } - companion object { - const val EXTRA_GENRE_ID = "extra_genre_id" - } + companion object { + const val EXTRA_GENRE_ID = "extra_genre_id" + } } 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 7c90f1764..89400965d 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 @@ -30,7 +30,6 @@ import java.io.InputStreamReader; import java.nio.charset.StandardCharsets; import code.name.monkey.appthemehelper.ThemeStore; -import code.name.monkey.appthemehelper.util.ATHUtil; import code.name.monkey.appthemehelper.util.ColorUtil; import code.name.monkey.appthemehelper.util.ToolbarContentTintHelper; import code.name.monkey.retromusic.R; 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 0ca1aa536..dc0a5410d 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 @@ -2,110 +2,100 @@ package code.name.monkey.retromusic.activities import android.app.KeyguardManager import android.content.Context -import android.os.Build -import android.os.Bundle -import android.view.View -import android.view.WindowManager +import android.os.* +import android.view.* import androidx.core.view.ViewCompat import code.name.monkey.appthemehelper.util.ATHUtil import code.name.monkey.retromusic.R import code.name.monkey.retromusic.activities.base.AbsMusicServiceActivity import code.name.monkey.retromusic.fragments.player.lockscreen.LockScreenPlayerControlsFragment -import code.name.monkey.retromusic.glide.RetroMusicColoredTarget -import code.name.monkey.retromusic.glide.SongGlideRequest +import code.name.monkey.retromusic.glide.* import code.name.monkey.retromusic.helper.MusicPlayerRemote import com.bumptech.glide.Glide import com.r0adkll.slidr.Slidr -import com.r0adkll.slidr.model.SlidrConfig -import com.r0adkll.slidr.model.SlidrListener -import com.r0adkll.slidr.model.SlidrPosition +import com.r0adkll.slidr.model.* import kotlinx.android.synthetic.main.activity_lock_screen.* 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) + 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() - setNavigationBarColorPrimary() - setTaskDescriptionColorAuto() - setLightNavigationBar(true) + hideStatusBar() + setStatusbarColorAuto() + setNavigationBarColorPrimary() + 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 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 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() - Slidr.attach(this, config) + Slidr.attach(this, config) - fragment = supportFragmentManager.findFragmentById(R.id.playback_controls_fragment) as LockScreenPlayerControlsFragment? + fragment = supportFragmentManager.findFragmentById(R.id.playback_controls_fragment) as LockScreenPlayerControlsFragment? - findViewById(R.id.slide).apply { - translationY = 100f - alpha = 0f - ViewCompat.animate(this) - .translationY(0f) - .alpha(1f) - .setDuration(1500) - .start() - } + findViewById(R.id.slide).apply { + translationY = 100f + alpha = 0f + ViewCompat.animate(this).translationY(0f).alpha(1f).setDuration(1500).start() + } - findViewById(R.id.root_layout).setBackgroundColor(ATHUtil.resolveColor(this, R.attr.colorPrimary)) - } + findViewById(R.id.root_layout).setBackgroundColor( + ATHUtil.resolveColor( + this, R.attr.colorPrimary + ) + ) + } - override fun onPlayingMetaChanged() { - super.onPlayingMetaChanged() - updateSongs() - } + override fun onPlayingMetaChanged() { + super.onPlayingMetaChanged() + updateSongs() + } - override fun onServiceConnected() { - super.onServiceConnected() - 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 912e71ee1..1c50951b8 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 @@ -95,7 +95,13 @@ class LyricsActivity : AbsMusicServiceActivity(), View.OnClickListener, ViewPage appBarLayout.setBackgroundColor(primaryColor) toolbar.apply { setBackgroundColor(primaryColor) - navigationIcon = TintHelper.createTintedDrawable(ContextCompat.getDrawable(this@LyricsActivity, R.drawable.ic_keyboard_backspace_black_24dp), ThemeStore.textColorSecondary(this@LyricsActivity)) + navigationIcon = TintHelper.createTintedDrawable( + ContextCompat.getDrawable( + this@LyricsActivity, + R.drawable.ic_keyboard_backspace_black_24dp + ), + ThemeStore.textColorSecondary(this@LyricsActivity) + ) setSupportActionBar(toolbar) } @@ -160,12 +166,17 @@ class LyricsActivity : AbsMusicServiceActivity(), View.OnClickListener, ViewPage e.printStackTrace() } - val materialDialog = MaterialDialog(this, BottomSheet(LayoutMode.WRAP_CONTENT)).show { + val materialDialog = MaterialDialog( + this, + BottomSheet(LayoutMode.WRAP_CONTENT) + ).show { 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), + input( + hint = getString(R.string.paste_lyrics_here), prefill = content, - inputType = InputType.TYPE_CLASS_TEXT or InputType.TYPE_TEXT_FLAG_MULTI_LINE) { _, input -> + inputType = InputType.TYPE_CLASS_TEXT or InputType.TYPE_TEXT_FLAG_MULTI_LINE + ) { _, input -> LyricUtil.writeLrcToLoc(song.data, song.artistName, input.toString()) } positiveButton(android.R.string.ok) { @@ -189,12 +200,16 @@ class LyricsActivity : AbsMusicServiceActivity(), View.OnClickListener, ViewPage lyricsString!! } - val materialDialog = MaterialDialog(this, BottomSheet(LayoutMode.WRAP_CONTENT)).show { + val materialDialog = MaterialDialog( + this, BottomSheet(LayoutMode.WRAP_CONTENT) + ).show { title(R.string.add_lyrics) negativeButton(R.string.action_search) { RetroUtil.openUrl(this@LyricsActivity, getGoogleSearchUrl()) } - input(hint = getString(R.string.paste_lyrics_here), + input( + hint = getString(R.string.paste_lyrics_here), prefill = content, - inputType = InputType.TYPE_CLASS_TEXT or InputType.TYPE_TEXT_FLAG_MULTI_LINE) { _, input -> + 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)) @@ -221,8 +236,10 @@ class LyricsActivity : AbsMusicServiceActivity(), View.OnClickListener, ViewPage } class PagerAdapter(fm: FragmentManager) : FragmentStatePagerAdapter(fm, BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT) { - class Tabs(@StringRes val title: Int, - val fragment: Fragment) + class Tabs( + @StringRes val title: Int, + val fragment: Fragment + ) private var tabs = ArrayList() 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 dc3bebd26..988b88417 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 @@ -12,288 +12,263 @@ import code.name.monkey.retromusic.activities.base.AbsSlidingMusicPanelActivity import code.name.monkey.retromusic.fragments.mainactivity.LibraryFragment import code.name.monkey.retromusic.fragments.mainactivity.folders.FoldersFragment import code.name.monkey.retromusic.fragments.mainactivity.home.BannerHomeFragment -import code.name.monkey.retromusic.helper.MusicPlayerRemote -import code.name.monkey.retromusic.helper.SearchQueryHelper +import code.name.monkey.retromusic.helper.* import code.name.monkey.retromusic.interfaces.MainActivityFragmentCallbacks -import code.name.monkey.retromusic.loaders.AlbumLoader -import code.name.monkey.retromusic.loaders.ArtistLoader -import code.name.monkey.retromusic.loaders.PlaylistSongsLoader +import code.name.monkey.retromusic.loaders.* import code.name.monkey.retromusic.service.MusicService -import code.name.monkey.retromusic.util.AppRater -import code.name.monkey.retromusic.util.PreferenceUtil +import code.name.monkey.retromusic.util.* import io.reactivex.disposables.CompositeDisposable import java.util.* - class MainActivity : AbsSlidingMusicPanelActivity(), SharedPreferences.OnSharedPreferenceChangeListener { - private lateinit var currentFragment: MainActivityFragmentCallbacks + private lateinit var currentFragment: MainActivityFragmentCallbacks - private var blockRequestPermissions: Boolean = false - private val disposable = CompositeDisposable() - private val broadcastReceiver = object : BroadcastReceiver() { - override fun onReceive(context: Context, intent: Intent) { - val action = intent.action - if (action != null && action == Intent.ACTION_SCREEN_OFF) { - if (PreferenceUtil.getInstance(this@MainActivity).lockScreen && MusicPlayerRemote.isPlaying) { - val activity = Intent(context, LockScreenActivity::class.java) - activity.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK) - activity.addFlags(Intent.FLAG_ACTIVITY_NO_HISTORY) - ActivityCompat.startActivity(context, activity, null) - } - } - } - } + private var blockRequestPermissions: Boolean = false + private val disposable = CompositeDisposable() + private val broadcastReceiver = object : BroadcastReceiver() { + override fun onReceive(context: Context, intent: Intent) { + val action = intent.action + if (action != null && action == Intent.ACTION_SCREEN_OFF) { + if (PreferenceUtil.getInstance(this@MainActivity).lockScreen && MusicPlayerRemote.isPlaying) { + val activity = Intent(context, LockScreenActivity::class.java) + activity.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK) + activity.addFlags(Intent.FLAG_ACTIVITY_NO_HISTORY) + ActivityCompat.startActivity(context, activity, null) + } + } + } + } - override fun createContentView(): View { - return wrapSlidingMusicPanel(R.layout.activity_main_content) - } + override fun createContentView(): View { + return wrapSlidingMusicPanel(R.layout.activity_main_content) + } - override fun onCreate( - savedInstanceState: Bundle? - ) { - setDrawUnderStatusBar() - super.onCreate(savedInstanceState) + override fun onCreate( + savedInstanceState: Bundle? + ) { + setDrawUnderStatusBar() + super.onCreate(savedInstanceState) - getBottomNavigationView().selectedItemId = PreferenceUtil.getInstance(this).lastPage + getBottomNavigationView().selectedItemId = PreferenceUtil.getInstance(this).lastPage - getBottomNavigationView().setOnNavigationItemSelectedListener { - PreferenceUtil.getInstance(this).lastPage = it.itemId - selectedFragment(it.itemId) - true - } + getBottomNavigationView().setOnNavigationItemSelectedListener { + PreferenceUtil.getInstance(this).lastPage = it.itemId + selectedFragment(it.itemId) + true + } - if (savedInstanceState == null) { - setMusicChooser(PreferenceUtil.getInstance(this).lastMusicChooser) - } else { - restoreCurrentFragment() - } + if (savedInstanceState == null) { + setMusicChooser(PreferenceUtil.getInstance(this).lastMusicChooser) + } else { + restoreCurrentFragment() + } - checkShowChangelog() - AppRater.appLaunched(this); - } + checkShowChangelog() + AppRater.appLaunched(this); + } - private fun checkShowChangelog() { - try { - val pInfo = packageManager.getPackageInfo(packageName, 0) - val currentVersion = pInfo.versionCode - if (currentVersion != PreferenceUtil.getInstance(this).lastChangelogVersion) { - startActivityForResult(Intent(this, WhatsNewActivity::class.java), APP_INTRO_REQUEST) - } - } catch (e: Throwable) { - e.printStackTrace() - } + private fun checkShowChangelog() { + try { + val pInfo = packageManager.getPackageInfo(packageName, 0) + val currentVersion = pInfo.versionCode + if (currentVersion != PreferenceUtil.getInstance(this).lastChangelogVersion) { + startActivityForResult( + Intent(this, WhatsNewActivity::class.java), + APP_INTRO_REQUEST + ) + } + } catch (e: Throwable) { + e.printStackTrace() + } - } + } - override fun onResume() { - super.onResume() - val screenOnOff = IntentFilter() - screenOnOff.addAction(Intent.ACTION_SCREEN_OFF) - registerReceiver(broadcastReceiver, screenOnOff) + override fun onResume() { + super.onResume() + val screenOnOff = IntentFilter() + screenOnOff.addAction(Intent.ACTION_SCREEN_OFF) + registerReceiver(broadcastReceiver, screenOnOff) - PreferenceUtil.getInstance(this).registerOnSharedPreferenceChangedListener(this) + PreferenceUtil.getInstance(this).registerOnSharedPreferenceChangedListener(this) - if (intent.hasExtra("expand")) { - if (intent.getBooleanExtra("expand", false)) { - expandPanel() - intent.putExtra("expand", false) - } - } - } + if (intent.hasExtra("expand")) { + if (intent.getBooleanExtra("expand", false)) { + expandPanel() + intent.putExtra("expand", false) + } + } + } - override fun onDestroy() { - super.onDestroy() - disposable.clear() - unregisterReceiver(broadcastReceiver) - PreferenceUtil.getInstance(this).unregisterOnSharedPreferenceChangedListener(this) - } + override fun onDestroy() { + super.onDestroy() + disposable.clear() + unregisterReceiver(broadcastReceiver) + PreferenceUtil.getInstance(this).unregisterOnSharedPreferenceChangedListener(this) + } - private fun setCurrentFragment(fragment: Fragment, tag: String) { - println("setCurrentFragment -> $tag -> ${supportFragmentManager.findFragmentById(R.id.fragment_container)?.tag}") - if (tag != supportFragmentManager.findFragmentById(R.id.fragment_container)?.tag) { - supportFragmentManager.beginTransaction().replace(R.id.fragment_container, fragment, tag).commit() - currentFragment = fragment as MainActivityFragmentCallbacks - } - } + private fun setCurrentFragment(fragment: Fragment, tag: String) { + println("setCurrentFragment -> $tag -> ${supportFragmentManager.findFragmentById(R.id.fragment_container)?.tag}") + if (tag != supportFragmentManager.findFragmentById(R.id.fragment_container)?.tag) { + supportFragmentManager.beginTransaction() + .replace(R.id.fragment_container, fragment, tag).commit() + currentFragment = fragment as MainActivityFragmentCallbacks + } + } - private fun restoreCurrentFragment() { - currentFragment = supportFragmentManager.findFragmentById(R.id.fragment_container) as MainActivityFragmentCallbacks - } + private fun restoreCurrentFragment() { + currentFragment = supportFragmentManager.findFragmentById(R.id.fragment_container) as MainActivityFragmentCallbacks + } - private fun handlePlaybackIntent(intent: Intent?) { - if (intent == null) { - return - } + private fun handlePlaybackIntent(intent: Intent?) { + if (intent == null) { + return + } - val uri = intent.data - val mimeType = intent.type - var handled = false - if (intent.action != null && intent.action == MediaStore.INTENT_ACTION_MEDIA_PLAY_FROM_SEARCH) { - val songs = SearchQueryHelper.getSongs(this, intent.extras!!) - if (MusicPlayerRemote.shuffleMode == MusicService.SHUFFLE_MODE_SHUFFLE) { - MusicPlayerRemote.openAndShuffleQueue(songs, true) - } else { - MusicPlayerRemote.openQueue(songs, 0, true) - } - handled = true - } + val uri = intent.data + val mimeType = intent.type + var handled = false + if (intent.action != null && intent.action == MediaStore.INTENT_ACTION_MEDIA_PLAY_FROM_SEARCH) { + val songs = SearchQueryHelper.getSongs(this, intent.extras!!) + if (MusicPlayerRemote.shuffleMode == MusicService.SHUFFLE_MODE_SHUFFLE) { + MusicPlayerRemote.openAndShuffleQueue(songs, true) + } else { + MusicPlayerRemote.openQueue(songs, 0, true) + } + handled = true + } - if (uri != null && uri.toString().isNotEmpty()) { - MusicPlayerRemote.playFromUri(uri) - handled = true - } else if (MediaStore.Audio.Playlists.CONTENT_TYPE == mimeType) { - val id = parseIdFromIntent(intent, "playlistId", "playlist").toInt() - if (id >= 0) { - val position = intent.getIntExtra("position", 0) - val songs = ArrayList(PlaylistSongsLoader.getPlaylistSongList(this, id)) - MusicPlayerRemote.openQueue(songs, position, true) - handled = true - } - } else if (MediaStore.Audio.Albums.CONTENT_TYPE == mimeType) { - val id = parseIdFromIntent(intent, "albumId", "album").toInt() - if (id >= 0) { - val position = intent.getIntExtra("position", 0) - MusicPlayerRemote.openQueue(AlbumLoader.getAlbum(this, id).songs!!, position, true) - handled = true - } - } else if (MediaStore.Audio.Artists.CONTENT_TYPE == mimeType) { - val id = parseIdFromIntent(intent, "artistId", "artist").toInt() - if (id >= 0) { - val position = intent.getIntExtra("position", 0) - MusicPlayerRemote.openQueue(ArtistLoader.getArtist(this, id).songs, position, true) - handled = true - } - } - if (handled) { - setIntent(Intent()) - } - } + if (uri != null && uri.toString().isNotEmpty()) { + MusicPlayerRemote.playFromUri(uri) + handled = true + } else if (MediaStore.Audio.Playlists.CONTENT_TYPE == mimeType) { + val id = parseIdFromIntent(intent, "playlistId", "playlist").toInt() + if (id >= 0) { + val position = intent.getIntExtra("position", 0) + val songs = ArrayList(PlaylistSongsLoader.getPlaylistSongList(this, id)) + MusicPlayerRemote.openQueue(songs, position, true) + handled = true + } + } else if (MediaStore.Audio.Albums.CONTENT_TYPE == mimeType) { + val id = parseIdFromIntent(intent, "albumId", "album").toInt() + if (id >= 0) { + val position = intent.getIntExtra("position", 0) + MusicPlayerRemote.openQueue(AlbumLoader.getAlbum(this, id).songs!!, position, true) + handled = true + } + } else if (MediaStore.Audio.Artists.CONTENT_TYPE == mimeType) { + val id = parseIdFromIntent(intent, "artistId", "artist").toInt() + if (id >= 0) { + val position = intent.getIntExtra("position", 0) + MusicPlayerRemote.openQueue(ArtistLoader.getArtist(this, id).songs, position, true) + handled = true + } + } + if (handled) { + setIntent(Intent()) + } + } - private fun parseIdFromIntent(intent: Intent, longKey: String, stringKey: String): Long { - var id = intent.getLongExtra(longKey, -1) - if (id < 0) { - val idString = intent.getStringExtra(stringKey) - if (idString != null) { - try { - id = java.lang.Long.parseLong(idString) - } catch (e: NumberFormatException) { - Log.e(TAG, e.message) - } - } - } - return id - } + private fun parseIdFromIntent(intent: Intent, longKey: String, stringKey: String): Long { + var id = intent.getLongExtra(longKey, -1) + if (id < 0) { + val idString = intent.getStringExtra(stringKey) + if (idString != null) { + try { + id = java.lang.Long.parseLong(idString) + } catch (e: NumberFormatException) { + Log.e(TAG, e.message) + } + } + } + return id + } - override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { - super.onActivityResult(requestCode, resultCode, data) - when (requestCode) { - APP_INTRO_REQUEST -> { - blockRequestPermissions = false - if (!hasPermissions()) { - requestPermissions() - } - } - REQUEST_CODE_THEME, APP_USER_INFO_REQUEST -> postRecreate() - PURCHASE_REQUEST -> { - if (resultCode == RESULT_OK) { - //checkSetUpPro(); - } - } - } + override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { + super.onActivityResult(requestCode, resultCode, data) + when (requestCode) { + APP_INTRO_REQUEST -> { + blockRequestPermissions = false + if (!hasPermissions()) { + requestPermissions() + } + } + REQUEST_CODE_THEME, APP_USER_INFO_REQUEST -> postRecreate() + PURCHASE_REQUEST -> { + if (resultCode == RESULT_OK) { + //checkSetUpPro(); + } + } + } - } + } - override fun handleBackPress(): Boolean { - return super.handleBackPress() || currentFragment.handleBackPress() - } + override fun handleBackPress(): Boolean { + return super.handleBackPress() || currentFragment.handleBackPress() + } - override fun onServiceConnected() { - super.onServiceConnected() - handlePlaybackIntent(intent) - } + override fun onServiceConnected() { + super.onServiceConnected() + handlePlaybackIntent(intent) + } - override fun requestPermissions() { - if (!blockRequestPermissions) { - super.requestPermissions() - } - } + override fun requestPermissions() { + if (!blockRequestPermissions) { + super.requestPermissions() + } + } - 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() + 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() - } + } - private fun showPromotionalOffer() { - /*MaterialDialog(this).show { - positiveButton(text = "Buy") { startActivity(Intent(this@MainActivity, PurchaseActivity::class.java)) } - negativeButton(android.R.string.cancel) - customView(R.layout.dialog_promotional_offer) - onDismiss { - PreferenceManager.getDefaultSharedPreferences(this@MainActivity) - .edit() - .putBoolean("shown", true) - .apply() - } - }*/ - } + private fun showPromotionalOffer() { + /*MaterialDialog(this).show { + positiveButton(text = "Buy") { startActivity(Intent(this@MainActivity, PurchaseActivity::class.java)) } + negativeButton(android.R.string.cancel) + customView(R.layout.dialog_promotional_offer) + onDismiss { + PreferenceManager.getDefaultSharedPreferences(this@MainActivity) + .edit() + .putBoolean("shown", true) + .apply() + } + }*/ + } - private fun selectedFragment(itemId: Int) { - when (itemId) { - R.id.action_album, - R.id.action_artist, - R.id.action_playlist, - R.id.action_genre, - R.id.action_song -> setCurrentFragment(LibraryFragment.newInstance(itemId), itemId.toString()) - R.id.action_home -> setCurrentFragment(BannerHomeFragment.newInstance(), BannerHomeFragment.TAG) - else -> { - setCurrentFragment(BannerHomeFragment.newInstance(), BannerHomeFragment.TAG) - } - } - } + private fun selectedFragment(itemId: Int) { + when (itemId) { + R.id.action_album, R.id.action_artist, R.id.action_playlist, R.id.action_genre, R.id.action_song -> setCurrentFragment( + LibraryFragment.newInstance(itemId), + itemId.toString() + ) + R.id.action_home -> setCurrentFragment( + BannerHomeFragment.newInstance(), + BannerHomeFragment.TAG + ) + else -> { + setCurrentFragment(BannerHomeFragment.newInstance(), BannerHomeFragment.TAG) + } + } + } - fun setMusicChooser(key: Int) { - PreferenceUtil.getInstance(this).lastMusicChooser = key - when (key) { - FOLDER -> setCurrentFragment(FoldersFragment.newInstance(this), FoldersFragment.TAG) - else -> selectedFragment(PreferenceUtil.getInstance(this).lastPage) - } - } + fun setMusicChooser(key: Int) { + PreferenceUtil.getInstance(this).lastMusicChooser = key + when (key) { + FOLDER -> setCurrentFragment(FoldersFragment.newInstance(this), FoldersFragment.TAG) + else -> selectedFragment(PreferenceUtil.getInstance(this).lastPage) + } + } - companion object { - const val APP_INTRO_REQUEST = 2323 - const val HOME = 0 - const val FOLDER = 1 - const val LIBRARY = 2 - private const val TAG = "MainActivity" - private const val APP_USER_INFO_REQUEST = 9003 - private const val REQUEST_CODE_THEME = 9002 - private const val PURCHASE_REQUEST = 101 - } + companion object { + const val APP_INTRO_REQUEST = 2323 + const val HOME = 0 + const val FOLDER = 1 + const val LIBRARY = 2 + private const val TAG = "MainActivity" + private const val APP_USER_INFO_REQUEST = 9003 + private const val REQUEST_CODE_THEME = 9002 + private const val PURCHASE_REQUEST = 101 + } } 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 ef162ee17..013c7fc02 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 @@ -3,182 +3,186 @@ package code.name.monkey.retromusic.activities import android.content.res.ColorStateList import android.os.Bundle import android.view.MenuItem -import androidx.recyclerview.widget.LinearLayoutManager -import androidx.recyclerview.widget.RecyclerView +import androidx.recyclerview.widget.* import code.name.monkey.appthemehelper.ThemeStore -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.* import code.name.monkey.retromusic.R import code.name.monkey.retromusic.activities.base.AbsMusicServiceActivity import code.name.monkey.retromusic.adapter.song.PlayingQueueAdapter import code.name.monkey.retromusic.extensions.applyToolbar import code.name.monkey.retromusic.helper.MusicPlayerRemote -import code.name.monkey.retromusic.util.MusicUtil +import code.name.monkey.retromusic.util.* import code.name.monkey.retromusic.util.ViewUtil 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_playing_queue.* - open class PlayingQueueActivity : AbsMusicServiceActivity() { - private var wrappedAdapter: RecyclerView.Adapter<*>? = null - private var recyclerViewDragDropManager: RecyclerViewDragDropManager? = null - private var playingQueueAdapter: PlayingQueueAdapter? = null - private lateinit var linearLayoutManager: LinearLayoutManager + private var wrappedAdapter: RecyclerView.Adapter<*>? = null + private var recyclerViewDragDropManager: RecyclerViewDragDropManager? = null + private var playingQueueAdapter: PlayingQueueAdapter? = null + private lateinit var linearLayoutManager: LinearLayoutManager + private fun getUpNextAndQueueTime(): String { + val duration = MusicPlayerRemote.getQueueDurationMillis(MusicPlayerRemote.position) - 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? + ) { + super.onCreate(savedInstanceState) + setContentView(R.layout.activity_playing_queue) - override fun onCreate( - savedInstanceState: Bundle? - ) { - super.onCreate(savedInstanceState) - setContentView(R.layout.activity_playing_queue) + setStatusbarColorAuto() + setNavigationBarColorPrimary() + setTaskDescriptionColorAuto() + setLightNavigationBar(true) - setStatusbarColorAuto() - setNavigationBarColorPrimary() - setTaskDescriptionColorAuto() - setLightNavigationBar(true) + setupToolbar() + setUpRecyclerView() - setupToolbar() - setUpRecyclerView() + clearQueue.setOnClickListener { + MusicPlayerRemote.clearQueue() + } + checkForPadding() + } - clearQueue.setOnClickListener { - MusicPlayerRemote.clearQueue() - } - checkForPadding() - } + override fun onOptionsItemSelected(item: MenuItem): Boolean { + return when (item.itemId) { + android.R.id.home -> { + onBackPressed() + true + } + else -> super.onOptionsItemSelected(item) + } + } - override fun onOptionsItemSelected(item: MenuItem): Boolean { - return when (item.itemId) { - android.R.id.home -> { - onBackPressed() - true - } - else -> super.onOptionsItemSelected(item) - } - } + private fun setUpRecyclerView() { + recyclerViewDragDropManager = RecyclerViewDragDropManager() + val animator = RefactoredDefaultItemAnimator() - private fun setUpRecyclerView() { - recyclerViewDragDropManager = RecyclerViewDragDropManager() - val animator = RefactoredDefaultItemAnimator() + playingQueueAdapter = PlayingQueueAdapter( + this, + MusicPlayerRemote.playingQueue, + MusicPlayerRemote.position, + R.layout.item_queue + ) + wrappedAdapter = recyclerViewDragDropManager?.createWrappedAdapter(playingQueueAdapter!!) - playingQueueAdapter = PlayingQueueAdapter( - this, - MusicPlayerRemote.playingQueue, - MusicPlayerRemote.position, - R.layout.item_queue) - wrappedAdapter = recyclerViewDragDropManager?.createWrappedAdapter(playingQueueAdapter!!) + linearLayoutManager = LinearLayoutManager(this) - linearLayoutManager = LinearLayoutManager(this) + recyclerView.apply { + layoutManager = linearLayoutManager + adapter = wrappedAdapter + itemAnimator = animator + recyclerViewDragDropManager?.attachRecyclerView(this) + } - recyclerView.apply { - layoutManager = linearLayoutManager - adapter = wrappedAdapter - itemAnimator = animator - recyclerViewDragDropManager?.attachRecyclerView(this) - } + linearLayoutManager.scrollToPositionWithOffset(MusicPlayerRemote.position + 1, 0) - linearLayoutManager.scrollToPositionWithOffset(MusicPlayerRemote.position + 1, 0) + recyclerView.addOnScrollListener(object : RecyclerView.OnScrollListener() { + override fun onScrolled(recyclerView: RecyclerView, dx: Int, dy: Int) { + super.onScrolled(recyclerView, dx, dy) + if (dy > 0) { + clearQueue.shrink() + } else if (dy < 0) { + clearQueue.extend() + } + } + }) + ViewUtil.setUpFastScrollRecyclerViewColor(this, recyclerView) + } - recyclerView.addOnScrollListener(object : RecyclerView.OnScrollListener() { - override fun onScrolled(recyclerView: RecyclerView, dx: Int, dy: Int) { - super.onScrolled(recyclerView, dx, dy) - if (dy > 0) { - clearQueue.shrink() - } else if (dy < 0) { - clearQueue.extend() - } - } - }) - ViewUtil.setUpFastScrollRecyclerViewColor(this, recyclerView) - } + private fun checkForPadding() { - private fun checkForPadding() { + } - } + override fun onQueueChanged() { + if (MusicPlayerRemote.playingQueue.isEmpty()) { + finish() + return + } + checkForPadding() + updateQueue() + updateCurrentSong() + } - override fun onQueueChanged() { - if (MusicPlayerRemote.playingQueue.isEmpty()) { - finish() - return - } - checkForPadding() - updateQueue() - updateCurrentSong() - } + override fun onMediaStoreChanged() { + updateQueue() + updateCurrentSong() + } - override fun onMediaStoreChanged() { - updateQueue() - updateCurrentSong() - } + private fun updateCurrentSong() { + playerQueueSubHeader.text = getUpNextAndQueueTime() + } - private fun updateCurrentSong() { - playerQueueSubHeader.text = getUpNextAndQueueTime() - } + override fun onPlayingMetaChanged() { + updateQueuePosition() + } - override fun onPlayingMetaChanged() { - updateQueuePosition() - } + private fun updateQueuePosition() { + playingQueueAdapter?.setCurrent(MusicPlayerRemote.position) + resetToCurrentPosition() + playerQueueSubHeader.text = getUpNextAndQueueTime() + } - private fun updateQueuePosition() { - playingQueueAdapter?.setCurrent(MusicPlayerRemote.position) - resetToCurrentPosition() - playerQueueSubHeader.text = getUpNextAndQueueTime() - } + private fun updateQueue() { + playingQueueAdapter?.swapDataSet(MusicPlayerRemote.playingQueue, MusicPlayerRemote.position) + resetToCurrentPosition() + } - private fun updateQueue() { - playingQueueAdapter?.swapDataSet(MusicPlayerRemote.playingQueue, MusicPlayerRemote.position) - resetToCurrentPosition() - } + private fun resetToCurrentPosition() { + recyclerView.stopScroll() + linearLayoutManager.scrollToPositionWithOffset(MusicPlayerRemote.position + 1, 0) + } - private fun resetToCurrentPosition() { - recyclerView.stopScroll() - linearLayoutManager.scrollToPositionWithOffset(MusicPlayerRemote.position + 1, 0) - } + override fun onPause() { + if (recyclerViewDragDropManager != null) { + recyclerViewDragDropManager!!.cancelDrag() + } + super.onPause() + } - override fun onPause() { - if (recyclerViewDragDropManager != null) { - recyclerViewDragDropManager!!.cancelDrag() - } - super.onPause() - } + override fun onDestroy() { + if (recyclerViewDragDropManager != null) { + recyclerViewDragDropManager!!.release() + recyclerViewDragDropManager = null + } - override fun onDestroy() { - if (recyclerViewDragDropManager != null) { - recyclerViewDragDropManager!!.release() - recyclerViewDragDropManager = null - } + if (wrappedAdapter != null) { + WrapperAdapterUtils.releaseAll(wrappedAdapter) + wrappedAdapter = null + } + playingQueueAdapter = null + super.onDestroy() + } - if (wrappedAdapter != null) { - WrapperAdapterUtils.releaseAll(wrappedAdapter) - wrappedAdapter = null - } - playingQueueAdapter = null - super.onDestroy() - } + private fun setupToolbar() { + playerQueueSubHeader.text = getUpNextAndQueueTime() + playerQueueSubHeader.setTextColor(ThemeStore.accentColor(this)) - private fun setupToolbar() { - playerQueueSubHeader.text = getUpNextAndQueueTime() - playerQueueSubHeader.setTextColor(ThemeStore.accentColor(this)) + applyToolbar(toolbar) + appBarLayout.setBackgroundColor(ATHUtil.resolveColor(this, R.attr.colorPrimary)) - applyToolbar(toolbar) - appBarLayout.setBackgroundColor(ATHUtil.resolveColor(this, R.attr.colorPrimary)) - - clearQueue.backgroundTintList = ColorStateList.valueOf(ThemeStore.accentColor(this)) - ColorStateList.valueOf(MaterialValueHelper.getPrimaryTextColor(this, ColorUtil.isColorLight(ThemeStore.accentColor(this)))).apply { - clearQueue.setTextColor(this) - clearQueue.iconTint = this - } - } + clearQueue.backgroundTintList = ColorStateList.valueOf(ThemeStore.accentColor(this)) + ColorStateList.valueOf( + 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 ff7bd51bc..ad259a6da 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 @@ -2,31 +2,19 @@ package code.name.monkey.retromusic.activities import android.graphics.Color import android.os.Bundle -import android.view.Menu -import android.view.MenuItem -import android.view.View -import androidx.recyclerview.widget.LinearLayoutManager -import androidx.recyclerview.widget.RecyclerView -import code.name.monkey.appthemehelper.util.ATHUtil -import code.name.monkey.appthemehelper.util.ColorUtil -import code.name.monkey.retromusic.App -import code.name.monkey.retromusic.R +import android.view.* +import androidx.recyclerview.widget.* +import code.name.monkey.appthemehelper.util.* +import code.name.monkey.retromusic.* import code.name.monkey.retromusic.activities.base.AbsSlidingMusicPanelActivity -import code.name.monkey.retromusic.adapter.song.OrderablePlaylistSongAdapter -import code.name.monkey.retromusic.adapter.song.PlaylistSongAdapter -import code.name.monkey.retromusic.adapter.song.SongAdapter +import code.name.monkey.retromusic.adapter.song.* import code.name.monkey.retromusic.extensions.applyToolbar import code.name.monkey.retromusic.helper.menu.PlaylistMenuHelper import code.name.monkey.retromusic.interfaces.CabHolder import code.name.monkey.retromusic.loaders.PlaylistLoader -import code.name.monkey.retromusic.model.AbsCustomPlaylist -import code.name.monkey.retromusic.model.Playlist -import code.name.monkey.retromusic.model.Song -import code.name.monkey.retromusic.mvp.presenter.PlaylistSongsPresenter -import code.name.monkey.retromusic.mvp.presenter.PlaylistSongsView -import code.name.monkey.retromusic.util.DensityUtil -import code.name.monkey.retromusic.util.PlaylistsUtil -import code.name.monkey.retromusic.util.RetroColorUtil +import code.name.monkey.retromusic.model.* +import code.name.monkey.retromusic.mvp.presenter.* +import code.name.monkey.retromusic.util.* import code.name.monkey.retromusic.util.ViewUtil import com.afollestad.materialcab.MaterialCab import com.h6ah4i.android.widget.advrecyclerview.animator.RefactoredDefaultItemAnimator @@ -35,197 +23,219 @@ import com.h6ah4i.android.widget.advrecyclerview.utils.WrapperAdapterUtils import kotlinx.android.synthetic.main.activity_playlist_detail.* import javax.inject.Inject - class PlaylistDetailActivity : AbsSlidingMusicPanelActivity(), CabHolder, PlaylistSongsView { - @Inject - lateinit var playlistSongsPresenter: PlaylistSongsPresenter + @Inject + lateinit var playlistSongsPresenter: PlaylistSongsPresenter - private lateinit var playlist: Playlist - private var cab: MaterialCab? = null - private lateinit var adapter: SongAdapter - private var wrappedAdapter: RecyclerView.Adapter<*>? = null - private var recyclerViewDragDropManager: RecyclerViewDragDropManager? = null + private lateinit var playlist: Playlist + private var cab: MaterialCab? = null + private lateinit var adapter: SongAdapter + private var wrappedAdapter: RecyclerView.Adapter<*>? = null + private var recyclerViewDragDropManager: RecyclerViewDragDropManager? = null - override fun onCreate(savedInstanceState: Bundle?) { - setDrawUnderStatusBar() - super.onCreate(savedInstanceState) - App.musicComponent.inject(this) + override fun onCreate(savedInstanceState: Bundle?) { + setDrawUnderStatusBar() + super.onCreate(savedInstanceState) + App.musicComponent.inject(this) - playlistSongsPresenter.attachView(this) + playlistSongsPresenter.attachView(this) - setStatusbarColor(Color.TRANSPARENT) - setNavigationbarColorAuto() - setTaskDescriptionColorAuto() - setLightNavigationBar(true) - setLightStatusbar(ColorUtil.isColorLight(ATHUtil.resolveColor(this, R.attr.colorPrimary))) + setStatusbarColor(Color.TRANSPARENT) + setNavigationbarColorAuto() + setTaskDescriptionColorAuto() + setLightNavigationBar(true) + setLightStatusbar(ColorUtil.isColorLight(ATHUtil.resolveColor(this, R.attr.colorPrimary))) - toggleBottomNavigationView(true) + toggleBottomNavigationView(true) - if (intent.extras != null) { - playlist = intent.extras!!.getParcelable(EXTRA_PLAYLIST)!! - } else { - finish() - } + if (intent.extras != null) { + playlist = intent.extras!!.getParcelable(EXTRA_PLAYLIST)!! + } else { + finish() + } - setUpToolBar() - setUpRecyclerView() - } + setUpToolBar() + setUpRecyclerView() + } - override fun createContentView(): View { - return wrapSlidingMusicPanel(R.layout.activity_playlist_detail) - } + override fun createContentView(): View { + return wrapSlidingMusicPanel(R.layout.activity_playlist_detail) + } - private fun setUpRecyclerView() { - ViewUtil.setUpFastScrollRecyclerViewColor(this, recyclerView) - recyclerView.layoutManager = LinearLayoutManager(this) - if (playlist is AbsCustomPlaylist) { - adapter = PlaylistSongAdapter(this, ArrayList(), R.layout.item_list, false, this) - recyclerView.adapter = adapter - } else { - 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) - } - } - }) - wrappedAdapter = recyclerViewDragDropManager!!.createWrappedAdapter(adapter) + private fun setUpRecyclerView() { + ViewUtil.setUpFastScrollRecyclerViewColor(this, recyclerView) + recyclerView.layoutManager = LinearLayoutManager(this) + if (playlist is AbsCustomPlaylist) { + adapter = PlaylistSongAdapter(this, ArrayList(), R.layout.item_list, false, this) + recyclerView.adapter = adapter + } else { + 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 + ) + } + } + }) + wrappedAdapter = recyclerViewDragDropManager!!.createWrappedAdapter(adapter) - recyclerView.adapter = wrappedAdapter - recyclerView.itemAnimator = animator + recyclerView.adapter = wrappedAdapter + recyclerView.itemAnimator = animator - recyclerViewDragDropManager?.attachRecyclerView(recyclerView) - } - adapter.registerAdapterDataObserver(object : RecyclerView.AdapterDataObserver() { - override fun onChanged() { - super.onChanged() - checkIsEmpty() - } - }) - } + recyclerViewDragDropManager?.attachRecyclerView(recyclerView) + } + adapter.registerAdapterDataObserver(object : RecyclerView.AdapterDataObserver() { + override fun onChanged() { + super.onChanged() + checkIsEmpty() + } + }) + } - override fun onResume() { - super.onResume() - playlistSongsPresenter.loadPlaylistSongs(playlist) - } + override fun onResume() { + super.onResume() + playlistSongsPresenter.loadPlaylistSongs(playlist) + } - private fun setUpToolBar() { - applyToolbar(toolbar) - title = playlist.name - } + private fun setUpToolBar() { + applyToolbar(toolbar) + title = playlist.name + } - 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) - return super.onCreateOptionsMenu(menu) - } + 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 + ) + return super.onCreateOptionsMenu(menu) + } - override fun onOptionsItemSelected(item: MenuItem): Boolean { - when (item.itemId) { - android.R.id.home -> { - onBackPressed() - return true - } - } - return PlaylistMenuHelper.handleMenuClick(this, playlist, item) - } + override fun onOptionsItemSelected(item: MenuItem): Boolean { + when (item.itemId) { + android.R.id.home -> { + onBackPressed() + return true + } + } + return PlaylistMenuHelper.handleMenuClick(this, playlist, item) + } - 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.colorPrimary))) - .start(callback) - return cab!! - } + 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.colorPrimary + ) + ) + ).start(callback) + return cab!! + } - override fun onBackPressed() { - if (cab != null && cab!!.isActive) { - cab!!.finish() - } else { - recyclerView!!.stopScroll() - super.onBackPressed() - } - } + override fun onBackPressed() { + if (cab != null && cab!!.isActive) { + cab!!.finish() + } else { + recyclerView!!.stopScroll() + super.onBackPressed() + } + } - override fun onMediaStoreChanged() { - super.onMediaStoreChanged() - if (playlist !is AbsCustomPlaylist) { - // Playlist deleted - if (!PlaylistsUtil.doesPlaylistExist(this, playlist.id)) { - finish() - return - } - // Playlist renamed - val playlistName = PlaylistsUtil.getNameForPlaylist(this, playlist.id.toLong()) - if (playlistName != playlist.name) { - playlist = PlaylistLoader.getPlaylist(this, playlist.id) - setToolbarTitle(playlist.name) - } - } - playlistSongsPresenter.loadPlaylistSongs(playlist) - } + override fun onMediaStoreChanged() { + super.onMediaStoreChanged() + if (playlist !is AbsCustomPlaylist) { + // Playlist deleted + if (!PlaylistsUtil.doesPlaylistExist(this, playlist.id)) { + finish() + return + } + // Playlist renamed + val playlistName = PlaylistsUtil.getNameForPlaylist(this, playlist.id.toLong()) + if (playlistName != playlist.name) { + playlist = PlaylistLoader.getPlaylist(this, playlist.id) + setToolbarTitle(playlist.name) + } + } + playlistSongsPresenter.loadPlaylistSongs(playlist) + } - private fun setToolbarTitle(title: String) { - supportActionBar!!.title = title - } + private fun setToolbarTitle(title: String) { + supportActionBar!!.title = title + } - private fun checkForPadding() { - val height = DensityUtil.dip2px(this, 52f) - recyclerView.setPadding(0, 0, 0, (height)) - } + private fun checkForPadding() { + val height = DensityUtil.dip2px(this, 52f) + recyclerView.setPadding(0, 0, 0, (height)) + } - private fun checkIsEmpty() { - checkForPadding() - empty.visibility = if (adapter.itemCount == 0) View.VISIBLE else View.GONE - emptyText.visibility = if (adapter.itemCount == 0) View.VISIBLE else View.GONE - } + private fun checkIsEmpty() { + checkForPadding() + empty.visibility = if (adapter.itemCount == 0) View.VISIBLE else View.GONE + emptyText.visibility = if (adapter.itemCount == 0) View.VISIBLE else View.GONE + } - public override fun onPause() { - if (recyclerViewDragDropManager != null) { - recyclerViewDragDropManager!!.cancelDrag() - } - super.onPause() - } + public override fun onPause() { + if (recyclerViewDragDropManager != null) { + recyclerViewDragDropManager!!.cancelDrag() + } + super.onPause() + } - override fun onDestroy() { - if (recyclerViewDragDropManager != null) { - recyclerViewDragDropManager!!.release() - recyclerViewDragDropManager = null - } + override fun onDestroy() { + if (recyclerViewDragDropManager != null) { + recyclerViewDragDropManager!!.release() + recyclerViewDragDropManager = null + } - if (recyclerView != null) { - recyclerView!!.itemAnimator = null - recyclerView!!.adapter = null - } + if (recyclerView != null) { + recyclerView!!.itemAnimator = null + recyclerView!!.adapter = null + } - if (wrappedAdapter != null) { - WrapperAdapterUtils.releaseAll(wrappedAdapter) - wrappedAdapter = null - } - super.onDestroy() - playlistSongsPresenter.detachView() - } + if (wrappedAdapter != null) { + WrapperAdapterUtils.releaseAll(wrappedAdapter) + wrappedAdapter = null + } + super.onDestroy() + playlistSongsPresenter.detachView() + } - override fun showEmptyView() { - empty.visibility = View.VISIBLE - emptyText.visibility = View.VISIBLE - } + override fun showEmptyView() { + empty.visibility = View.VISIBLE + emptyText.visibility = View.VISIBLE + } - override fun songs(songs: ArrayList) { - adapter.swapDataSet(songs) - } + override fun songs(songs: ArrayList) { + adapter.swapDataSet(songs) + } - companion object { - var EXTRA_PLAYLIST = "extra_playlist" - } + companion object { + var EXTRA_PLAYLIST = "extra_playlist" + } } 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 90a2f6d11..6dcdab37a 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 @@ -1,155 +1,157 @@ package code.name.monkey.retromusic.activities import android.content.Intent -import android.os.AsyncTask -import android.os.Bundle +import android.os.* import android.util.Log import android.view.MenuItem import android.widget.Toast -import code.name.monkey.appthemehelper.util.ATHUtil -import code.name.monkey.appthemehelper.util.MaterialUtil -import code.name.monkey.retromusic.App +import code.name.monkey.appthemehelper.util.* +import code.name.monkey.retromusic.* import code.name.monkey.retromusic.BuildConfig -import code.name.monkey.retromusic.R 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 com.anjlab.android.iab.v3.* import kotlinx.android.synthetic.main.activity_pro_version.* 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?) { + super.onCreate(savedInstanceState) + setContentView(R.layout.activity_pro_version) + setDrawUnderStatusBar() - override fun onCreate(savedInstanceState: Bundle?) { - super.onCreate(savedInstanceState) - setContentView(R.layout.activity_pro_version) - setDrawUnderStatusBar() + setStatusbarColorAuto() + setNavigationBarColorPrimary() + setTaskDescriptionColorAuto() + setLightNavigationBar(true) - setStatusbarColorAuto() - setNavigationBarColorPrimary() - setTaskDescriptionColorAuto() - setLightNavigationBar(true) + val primaryColor = ATHUtil.resolveColor(this, R.attr.colorPrimary) + toolbar.setBackgroundColor(primaryColor) + appBarLayout.setBackgroundColor(primaryColor) - val primaryColor = ATHUtil.resolveColor(this, R.attr.colorPrimary) - toolbar.setBackgroundColor(primaryColor) - appBarLayout.setBackgroundColor(primaryColor) + applyToolbar(toolbar) - 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 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 onProductPurchased(productId: String, details: TransactionDetails?) { - Toast.makeText(this, R.string.thank_you, Toast.LENGTH_SHORT).show() - setResult(RESULT_OK) - } + override fun onBillingError(errorCode: Int, error: Throwable?) { + Log.e(TAG, "Billing error: code = $errorCode", error) + } - 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 onBillingInitialized() { + restoreButton.isEnabled = true + purchaseButton.isEnabled = true + } - override fun onBillingError(errorCode: Int, error: Throwable?) { - Log.e(TAG, "Billing error: code = $errorCode", error) - } + 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 onBillingInitialized() { - restoreButton.isEnabled = true - purchaseButton.isEnabled = true - } + override fun onDestroy() { + billingProcessor.release() + super.onDestroy() + } + private class RestorePurchaseAsyncTask internal constructor(purchaseActivity: PurchaseActivity) : AsyncTask() { - public override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { - if (!billingProcessor.handleActivityResult(requestCode, resultCode, data)) { - super.onActivityResult(requestCode, resultCode, data) - } - } + private val buyActivityWeakReference: WeakReference = WeakReference( + purchaseActivity + ) - override fun onOptionsItemSelected(item: MenuItem): Boolean { - when (item.itemId) { - android.R.id.home -> finish() - } - return super.onOptionsItemSelected(item) - } + 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 onDestroy() { - billingProcessor.release() - super.onDestroy() - } + override fun doInBackground(vararg params: Void): Boolean? { + val purchaseActivity = buyActivityWeakReference.get() + if (purchaseActivity != null) { + return purchaseActivity.billingProcessor.loadOwnedPurchasesFromGoogle() + } + cancel(false) + return null + } - private class RestorePurchaseAsyncTask internal constructor(purchaseActivity: PurchaseActivity) : AsyncTask() { + override fun onPostExecute(b: Boolean?) { + super.onPostExecute(b) + val purchaseActivity = buyActivityWeakReference.get() + if (purchaseActivity == null || b == null) { + return + } - private val buyActivityWeakReference: WeakReference = WeakReference(purchaseActivity) + if (b) { + purchaseActivity.onPurchaseHistoryRestored() + } else { + Toast.makeText( + purchaseActivity, + R.string.could_not_restore_purchase, + Toast.LENGTH_SHORT + ).show() + } + } + } - 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 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() - } - } - } - - 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 e9bcbab4d..8b2d5efcc 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 @@ -1,212 +1,215 @@ package code.name.monkey.retromusic.activities -import android.app.Activity -import android.app.Service -import android.content.ActivityNotFoundException -import android.content.Intent +import android.app.* +import android.content.* import android.content.res.ColorStateList import android.os.Bundle import android.speech.RecognizerIntent -import android.text.Editable -import android.text.TextWatcher +import android.text.* import android.view.View import android.view.inputmethod.InputMethodManager import android.widget.TextView.BufferType import android.widget.Toast import androidx.appcompat.widget.SearchView.OnQueryTextListener -import androidx.recyclerview.widget.LinearLayoutManager -import androidx.recyclerview.widget.RecyclerView +import androidx.recyclerview.widget.* import code.name.monkey.appthemehelper.ThemeStore -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.retromusic.App -import code.name.monkey.retromusic.R +import code.name.monkey.appthemehelper.util.* +import code.name.monkey.retromusic.* import code.name.monkey.retromusic.activities.base.AbsMusicServiceActivity import code.name.monkey.retromusic.adapter.SearchAdapter -import code.name.monkey.retromusic.mvp.presenter.SearchPresenter -import code.name.monkey.retromusic.mvp.presenter.SearchView -import code.name.monkey.retromusic.util.RetroColorUtil -import code.name.monkey.retromusic.util.RetroUtil +import code.name.monkey.retromusic.mvp.presenter.* +import code.name.monkey.retromusic.util.* import kotlinx.android.synthetic.main.activity_search.* import java.util.* import javax.inject.Inject import kotlin.collections.ArrayList class SearchActivity : AbsMusicServiceActivity(), OnQueryTextListener, TextWatcher, SearchView { - @Inject - lateinit var searchPresenter: SearchPresenter + @Inject + lateinit var searchPresenter: SearchPresenter - private var searchAdapter: SearchAdapter? = null - private var query: String? = null + private var searchAdapter: SearchAdapter? = null + private var query: String? = null - override fun onCreate(savedInstanceState: Bundle?) { - setDrawUnderStatusBar() - super.onCreate(savedInstanceState) - setContentView(R.layout.activity_search) - App.musicComponent.inject(this) - searchPresenter.attachView(this) + override fun onCreate(savedInstanceState: Bundle?) { + setDrawUnderStatusBar() + super.onCreate(savedInstanceState) + setContentView(R.layout.activity_search) + App.musicComponent.inject(this) + searchPresenter.attachView(this) - setStatusbarColorAuto() - setNavigationBarColorPrimary() - setTaskDescriptionColorAuto() - setLightNavigationBar(true) + setStatusbarColorAuto() + setNavigationBarColorPrimary() + setTaskDescriptionColorAuto() + setLightNavigationBar(true) - setupRecyclerView() - setUpToolBar() - setupSearchView() + setupRecyclerView() + setUpToolBar() + setupSearchView() - if (intent.getBooleanExtra(EXTRA_SHOW_MIC, false)) { - startMicSearch() - } + if (intent.getBooleanExtra(EXTRA_SHOW_MIC, false)) { + startMicSearch() + } - back.setOnClickListener { onBackPressed() } - voiceSearch.setOnClickListener { startMicSearch() } + back.setOnClickListener { onBackPressed() } + voiceSearch.setOnClickListener { startMicSearch() } - searchContainer.setCardBackgroundColor(RetroColorUtil.toolbarColor(this)) + searchContainer.setCardBackgroundColor(RetroColorUtil.toolbarColor(this)) - keyboardPopup.setOnClickListener { - val inputManager = getSystemService(Service.INPUT_METHOD_SERVICE) as InputMethodManager - inputManager.showSoftInput(searchView, InputMethodManager.SHOW_IMPLICIT) - } + keyboardPopup.setOnClickListener { + val inputManager = getSystemService(Service.INPUT_METHOD_SERVICE) as InputMethodManager + inputManager.showSoftInput(searchView, InputMethodManager.SHOW_IMPLICIT) + } - keyboardPopup.backgroundTintList = ColorStateList.valueOf(ThemeStore.accentColor(this)) - ColorStateList.valueOf(MaterialValueHelper.getPrimaryTextColor(this, ColorUtil.isColorLight(ThemeStore.accentColor(this)))).apply { - keyboardPopup.setTextColor(this) - keyboardPopup.iconTint = this - } - if (savedInstanceState != null) { - query = savedInstanceState.getString(QUERY); - } + keyboardPopup.backgroundTintList = ColorStateList.valueOf(ThemeStore.accentColor(this)) + ColorStateList.valueOf( + MaterialValueHelper.getPrimaryTextColor( + this, + ColorUtil.isColorLight( + ThemeStore.accentColor( + this + ) + ) + ) + ).apply { + keyboardPopup.setTextColor(this) + keyboardPopup.iconTint = this + } + if (savedInstanceState != null) { + query = savedInstanceState.getString(QUERY); + } - } + } - private fun setupRecyclerView() { - searchAdapter = SearchAdapter(this, emptyList()) - searchAdapter!!.registerAdapterDataObserver(object : RecyclerView.AdapterDataObserver() { - override fun onChanged() { - super.onChanged() - empty.visibility = if (searchAdapter!!.itemCount < 1) View.VISIBLE else View.GONE - } - }) - recyclerView.apply { - layoutManager = LinearLayoutManager(this@SearchActivity) - adapter = searchAdapter - } - recyclerView.addOnScrollListener(object : RecyclerView.OnScrollListener() { - override fun onScrolled(recyclerView: RecyclerView, dx: Int, dy: Int) { - super.onScrolled(recyclerView, dx, dy) - if (dy > 0) { - keyboardPopup.shrink() - } else if (dy < 0) { - keyboardPopup.extend() - } - } - }) - } + private fun setupRecyclerView() { + searchAdapter = SearchAdapter(this, emptyList()) + searchAdapter!!.registerAdapterDataObserver(object : RecyclerView.AdapterDataObserver() { + override fun onChanged() { + super.onChanged() + empty.visibility = if (searchAdapter!!.itemCount < 1) View.VISIBLE else View.GONE + } + }) + recyclerView.apply { + layoutManager = LinearLayoutManager(this@SearchActivity) + adapter = searchAdapter + } + recyclerView.addOnScrollListener(object : RecyclerView.OnScrollListener() { + override fun onScrolled(recyclerView: RecyclerView, dx: Int, dy: Int) { + super.onScrolled(recyclerView, dx, dy) + if (dy > 0) { + keyboardPopup.shrink() + } else if (dy < 0) { + keyboardPopup.extend() + } + } + }) + } - private fun setupSearchView() { - searchView.addTextChangedListener(this) - } + private fun setupSearchView() { + searchView.addTextChangedListener(this) + } - override fun onDestroy() { - super.onDestroy() - searchPresenter.detachView() - } + override fun onDestroy() { + super.onDestroy() + searchPresenter.detachView() + } - override fun onSaveInstanceState(outState: Bundle) { - super.onSaveInstanceState(outState) - outState.putString(QUERY, query) - } + override fun onSaveInstanceState(outState: Bundle) { + super.onSaveInstanceState(outState) + outState.putString(QUERY, query) + } - private fun setUpToolBar() { - title = null - appBarLayout.setBackgroundColor(ATHUtil.resolveColor(this, R.attr.colorPrimary)) - } + private fun setUpToolBar() { + title = null + appBarLayout.setBackgroundColor(ATHUtil.resolveColor(this, R.attr.colorPrimary)) + } + private fun search(query: String) { + this.query = query + voiceSearch.visibility = if (query.isNotEmpty()) View.GONE else View.VISIBLE + searchPresenter.search(query) + } - private fun search(query: String) { - this.query = query - voiceSearch.visibility = if (query.isNotEmpty()) View.GONE else View.VISIBLE - searchPresenter.search(query) - } + override fun onMediaStoreChanged() { + super.onMediaStoreChanged() + query?.let { search(it) } + } - override fun onMediaStoreChanged() { - super.onMediaStoreChanged() - query?.let { search(it) } - } + override fun onQueryTextSubmit(query: String): Boolean { + hideSoftKeyboard() + return false + } - override fun onQueryTextSubmit(query: String): Boolean { - hideSoftKeyboard() - return false - } + override fun onQueryTextChange(newText: String): Boolean { + search(newText) + return false + } - override fun onQueryTextChange(newText: String): Boolean { - search(newText) - return false - } + private fun hideSoftKeyboard() { + RetroUtil.hideSoftKeyboard(this@SearchActivity) + if (searchView != null) { + searchView.clearFocus() + } + } - private fun hideSoftKeyboard() { - RetroUtil.hideSoftKeyboard(this@SearchActivity) - if (searchView != null) { - searchView.clearFocus() - } - } + override fun showEmptyView() { + searchAdapter?.swapDataSet(ArrayList()) + } - override fun showEmptyView() { - searchAdapter?.swapDataSet(ArrayList()) - } + override fun showData(data: MutableList) { + searchAdapter?.swapDataSet(data) + } - override fun showData(data: MutableList) { - searchAdapter?.swapDataSet(data) - } + override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { + super.onActivityResult(requestCode, resultCode, data) + when (requestCode) { + REQ_CODE_SPEECH_INPUT -> { + if (resultCode == Activity.RESULT_OK && null != data) { + val result: ArrayList? = data.getStringArrayListExtra(RecognizerIntent.EXTRA_RESULTS) + query = result?.get(0) + searchView.setText(query, BufferType.EDITABLE) + searchPresenter.search(query!!) + } + } + } + } - override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { - super.onActivityResult(requestCode, resultCode, data) - when (requestCode) { - REQ_CODE_SPEECH_INPUT -> { - if (resultCode == Activity.RESULT_OK && null != data) { - val result: ArrayList? = data.getStringArrayListExtra(RecognizerIntent.EXTRA_RESULTS) - query = result?.get(0) - searchView.setText(query, BufferType.EDITABLE) - searchPresenter.search(query!!) - } - } - } - } + private fun startMicSearch() { + val intent = Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH) + intent.putExtra( + 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)) + try { + startActivityForResult(intent, REQ_CODE_SPEECH_INPUT) + } catch (e: ActivityNotFoundException) { + e.printStackTrace() + Toast.makeText(this, getString(R.string.speech_not_supported), Toast.LENGTH_SHORT) + .show() + } - private fun startMicSearch() { - val intent = Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH) - intent.putExtra(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)) - try { - startActivityForResult(intent, REQ_CODE_SPEECH_INPUT) - } catch (e: ActivityNotFoundException) { - e.printStackTrace() - Toast.makeText(this, getString(R.string.speech_not_supported), Toast.LENGTH_SHORT).show() - } + } - } + 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(newText: CharSequence, start: Int, before: Int, count: Int) { + search(newText.toString()) + } - override fun onTextChanged(newText: CharSequence, start: Int, before: Int, count: Int) { - search(newText.toString()) - } + override fun afterTextChanged(s: Editable) { - override fun afterTextChanged(s: Editable) { + } - } + companion object { + val TAG: String = SearchActivity::class.java.simpleName - companion object { - val TAG: String = SearchActivity::class.java.simpleName + const val EXTRA_SHOW_MIC = "extra_show_mic" + const val QUERY: String = "query" - const val EXTRA_SHOW_MIC = "extra_show_mic" - const val QUERY: String = "query" - - private const val REQ_CODE_SPEECH_INPUT = 9002 - } + private const val REQ_CODE_SPEECH_INPUT = 9002 + } } diff --git a/app/src/main/java/code/name/monkey/retromusic/activities/SettingsActivity.kt b/app/src/main/java/code/name/monkey/retromusic/activities/SettingsActivity.kt index 96b570f61..e489541d0 100755 --- a/app/src/main/java/code/name/monkey/retromusic/activities/SettingsActivity.kt +++ b/app/src/main/java/code/name/monkey/retromusic/activities/SettingsActivity.kt @@ -5,14 +5,12 @@ import android.view.MenuItem import androidx.annotation.StringRes import androidx.fragment.app.Fragment import androidx.transition.TransitionManager -import code.name.monkey.appthemehelper.util.ATHUtil -import code.name.monkey.appthemehelper.util.ToolbarContentTintHelper +import code.name.monkey.appthemehelper.util.* import code.name.monkey.retromusic.R import code.name.monkey.retromusic.activities.base.AbsBaseActivity import code.name.monkey.retromusic.fragments.settings.MainSettingsFragment import kotlinx.android.synthetic.main.activity_settings.* - class SettingsActivity : AbsBaseActivity() { private val fragmentManager = supportFragmentManager diff --git a/app/src/main/java/code/name/monkey/retromusic/activities/SupportDevelopmentActivity.kt b/app/src/main/java/code/name/monkey/retromusic/activities/SupportDevelopmentActivity.kt index 902ad982c..b4c948783 100644 --- a/app/src/main/java/code/name/monkey/retromusic/activities/SupportDevelopmentActivity.kt +++ b/app/src/main/java/code/name/monkey/retromusic/activities/SupportDevelopmentActivity.kt @@ -2,237 +2,238 @@ package code.name.monkey.retromusic.activities import android.content.Intent import android.graphics.Paint -import android.os.AsyncTask -import android.os.Bundle +import android.os.* import android.util.Log -import android.view.LayoutInflater -import android.view.MenuItem -import android.view.View -import android.view.ViewGroup -import android.widget.TextView -import android.widget.Toast +import android.view.* +import android.widget.* import androidx.annotation.LayoutRes import androidx.appcompat.widget.AppCompatImageView -import androidx.recyclerview.widget.DefaultItemAnimator -import androidx.recyclerview.widget.GridLayoutManager -import androidx.recyclerview.widget.RecyclerView +import androidx.recyclerview.widget.* import code.name.monkey.appthemehelper.ThemeStore -import code.name.monkey.appthemehelper.util.ATHUtil -import code.name.monkey.appthemehelper.util.TintHelper +import code.name.monkey.appthemehelper.util.* +import code.name.monkey.retromusic.* import code.name.monkey.retromusic.BuildConfig -import code.name.monkey.retromusic.R 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.SkuDetails -import com.anjlab.android.iab.v3.TransactionDetails +import com.anjlab.android.iab.v3.* import kotlinx.android.synthetic.main.activity_donation.* import java.lang.ref.WeakReference import java.util.* class SupportDevelopmentActivity : AbsBaseActivity(), BillingProcessor.IBillingHandler { - companion object { - val TAG: String = SupportDevelopmentActivity::class.java.simpleName - const val DONATION_PRODUCT_IDS = R.array.donation_ids - private const val TEZ_REQUEST_CODE = 123 - } + companion object { + val TAG: String = SupportDevelopmentActivity::class.java.simpleName + const val DONATION_PRODUCT_IDS = R.array.donation_ids + private const val TEZ_REQUEST_CODE = 123 + } - var billingProcessor: BillingProcessor? = null - private var skuDetailsLoadAsyncTask: AsyncTask<*, *, *>? = null + var billingProcessor: BillingProcessor? = null + private var skuDetailsLoadAsyncTask: AsyncTask<*, *, *>? = null - override fun onOptionsItemSelected(item: MenuItem): Boolean { - if (item.itemId == android.R.id.home) { - onBackPressed() - return true - } - return super.onOptionsItemSelected(item) - } + override fun onOptionsItemSelected(item: MenuItem): Boolean { + if (item.itemId == android.R.id.home) { + onBackPressed() + return true + } + return super.onOptionsItemSelected(item) + } - fun donate(i: Int) { - val ids = resources.getStringArray(DONATION_PRODUCT_IDS) - billingProcessor!!.purchase(this, ids[i]) - } + fun donate(i: Int) { + val ids = resources.getStringArray(DONATION_PRODUCT_IDS) + billingProcessor!!.purchase(this, ids[i]) + } - override fun onCreate(savedInstanceState: Bundle?) { - super.onCreate(savedInstanceState) - setContentView(R.layout.activity_donation) + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + setContentView(R.layout.activity_donation) - setStatusbarColorAuto() - setNavigationBarColorPrimary() - setTaskDescriptionColorAuto() - setLightNavigationBar(true) + setStatusbarColorAuto() + setNavigationBarColorPrimary() + setTaskDescriptionColorAuto() + setLightNavigationBar(true) - setupToolbar() + setupToolbar() - billingProcessor = BillingProcessor(this, BuildConfig.GOOGLE_PLAY_LICENSING_KEY, this) - TintHelper.setTint(progress, ThemeStore.accentColor(this)) - donation.setTextColor(ThemeStore.accentColor(this)) - } + billingProcessor = BillingProcessor(this, BuildConfig.GOOGLE_PLAY_LICENSING_KEY, this) + TintHelper.setTint(progress, ThemeStore.accentColor(this)) + donation.setTextColor(ThemeStore.accentColor(this)) + } - private fun setupToolbar() { - val primaryColor = ATHUtil.resolveColor(this, R.attr.colorPrimary) - appBarLayout.setBackgroundColor(primaryColor) - applyToolbar(toolbar) - } + private fun setupToolbar() { + val primaryColor = ATHUtil.resolveColor(this, R.attr.colorPrimary) + appBarLayout.setBackgroundColor(primaryColor) + applyToolbar(toolbar) + } - override fun onBillingInitialized() { - loadSkuDetails() - } + override fun onBillingInitialized() { + loadSkuDetails() + } - private fun loadSkuDetails() { - if (skuDetailsLoadAsyncTask != null) { - skuDetailsLoadAsyncTask!!.cancel(false) - } - skuDetailsLoadAsyncTask = SkuDetailsLoadAsyncTask(this).execute() + private fun loadSkuDetails() { + if (skuDetailsLoadAsyncTask != null) { + skuDetailsLoadAsyncTask!!.cancel(false) + } + skuDetailsLoadAsyncTask = SkuDetailsLoadAsyncTask(this).execute() - } + } - override fun onProductPurchased(productId: String, details: TransactionDetails?) { - //loadSkuDetails(); - Toast.makeText(this, R.string.thank_you, Toast.LENGTH_SHORT).show() - } + override fun onProductPurchased(productId: String, details: TransactionDetails?) { + //loadSkuDetails(); + Toast.makeText(this, R.string.thank_you, 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 onPurchaseHistoryRestored() { - //loadSkuDetails(); - Toast.makeText(this, R.string.restored_previous_purchases, Toast.LENGTH_SHORT).show() - } + override fun onPurchaseHistoryRestored() { + //loadSkuDetails(); + Toast.makeText(this, R.string.restored_previous_purchases, Toast.LENGTH_SHORT).show() + } - override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { - if (!billingProcessor!!.handleActivityResult(requestCode, resultCode, data)) { - super.onActivityResult(requestCode, resultCode, data) - } - if (requestCode == TEZ_REQUEST_CODE) { - // Process based on the data in response. - Log.d("result", data!!.getStringExtra("Status")) - } - } + override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { + if (!billingProcessor!!.handleActivityResult(requestCode, resultCode, data)) { + super.onActivityResult(requestCode, resultCode, data) + } + if (requestCode == TEZ_REQUEST_CODE) { + // Process based on the data in response. + Log.d("result", data!!.getStringExtra("Status")) + } + } - override fun onDestroy() { - if (billingProcessor != null) { - billingProcessor!!.release() - } - if (skuDetailsLoadAsyncTask != null) { - skuDetailsLoadAsyncTask!!.cancel(true) - } - super.onDestroy() - } + override fun onDestroy() { + if (billingProcessor != null) { + billingProcessor!!.release() + } + if (skuDetailsLoadAsyncTask != null) { + skuDetailsLoadAsyncTask!!.cancel(true) + } + super.onDestroy() + } } private class SkuDetailsLoadAsyncTask internal constructor(supportDevelopmentActivity: SupportDevelopmentActivity) : AsyncTask>() { - private val weakReference: WeakReference = WeakReference(supportDevelopmentActivity) + private val weakReference: WeakReference = WeakReference( + supportDevelopmentActivity + ) - override fun onPreExecute() { - super.onPreExecute() - val supportDevelopmentActivity = weakReference.get() ?: return + override fun onPreExecute() { + super.onPreExecute() + val supportDevelopmentActivity = weakReference.get() ?: return - supportDevelopmentActivity.progressContainer.visibility = View.VISIBLE - supportDevelopmentActivity.recyclerView.visibility = View.GONE - } + supportDevelopmentActivity.progressContainer.visibility = View.VISIBLE + supportDevelopmentActivity.recyclerView.visibility = View.GONE + } - override fun doInBackground(vararg params: Void): List? { - val dialog = weakReference.get() - if (dialog != null) { - val ids = dialog.resources.getStringArray(SupportDevelopmentActivity.DONATION_PRODUCT_IDS) - return dialog.billingProcessor!!.getPurchaseListingDetails(ArrayList(Arrays.asList(*ids))) - } - cancel(false) - return null - } + override fun doInBackground(vararg params: Void): List? { + val dialog = weakReference.get() + if (dialog != null) { + val ids = dialog.resources.getStringArray(SupportDevelopmentActivity.DONATION_PRODUCT_IDS) + return dialog.billingProcessor!!.getPurchaseListingDetails(ArrayList(Arrays.asList(*ids))) + } + cancel(false) + return null + } - override fun onPostExecute(skuDetails: List?) { - super.onPostExecute(skuDetails) - val dialog = weakReference.get() ?: return + override fun onPostExecute(skuDetails: List?) { + super.onPostExecute(skuDetails) + val dialog = weakReference.get() ?: return - if (skuDetails == null || skuDetails.isEmpty()) { - dialog.progressContainer.visibility = View.GONE - return - } + if (skuDetails == null || skuDetails.isEmpty()) { + dialog.progressContainer.visibility = View.GONE + return + } - dialog.progressContainer.visibility = View.GONE - dialog.recyclerView.itemAnimator = DefaultItemAnimator() - dialog.recyclerView.layoutManager = GridLayoutManager(dialog, 2) - dialog.recyclerView.adapter = SkuDetailsAdapter(dialog, skuDetails) - dialog.recyclerView.visibility = View.VISIBLE - } + dialog.progressContainer.visibility = View.GONE + dialog.recyclerView.itemAnimator = DefaultItemAnimator() + dialog.recyclerView.layoutManager = GridLayoutManager(dialog, 2) + dialog.recyclerView.adapter = SkuDetailsAdapter(dialog, skuDetails) + dialog.recyclerView.visibility = View.VISIBLE + } } class SkuDetailsAdapter( - private var donationsDialog: SupportDevelopmentActivity, - objects: List + private var donationsDialog: SupportDevelopmentActivity, objects: List ) : RecyclerView.Adapter() { - private var skuDetailsList: List = ArrayList() + private var skuDetailsList: List = ArrayList() - init { - skuDetailsList = objects - } + init { + skuDetailsList = objects + } - private fun getIcon(position: Int): Int { - return when (position) { - 0 -> R.drawable.ic_cookie_white_24dp - 1 -> R.drawable.ic_take_away_white_24dp - 2 -> R.drawable.ic_take_away_coffe_white_24dp - 3 -> R.drawable.ic_beer_white_24dp - 4 -> R.drawable.ic_fast_food_meal_white_24dp - 5 -> R.drawable.ic_popcorn_white_24dp - 6 -> R.drawable.ic_card_giftcard_white_24dp - else -> R.drawable.ic_card_giftcard_white_24dp - } - } + private fun getIcon(position: Int): Int { + return when (position) { + 0 -> R.drawable.ic_cookie_white_24dp + 1 -> R.drawable.ic_take_away_white_24dp + 2 -> R.drawable.ic_take_away_coffe_white_24dp + 3 -> R.drawable.ic_beer_white_24dp + 4 -> R.drawable.ic_fast_food_meal_white_24dp + 5 -> R.drawable.ic_popcorn_white_24dp + 6 -> R.drawable.ic_card_giftcard_white_24dp + else -> R.drawable.ic_card_giftcard_white_24dp + } + } - override fun onCreateViewHolder(viewGroup: ViewGroup, i: Int): ViewHolder { - return ViewHolder(LayoutInflater.from(donationsDialog).inflate(LAYOUT_RES_ID, viewGroup, false)) - } + override fun onCreateViewHolder(viewGroup: ViewGroup, i: Int): ViewHolder { + return ViewHolder( + LayoutInflater.from(donationsDialog).inflate( + LAYOUT_RES_ID, + viewGroup, + false + ) + ) + } - override fun onBindViewHolder(viewHolder: ViewHolder, i: Int) { - val skuDetails = skuDetailsList[i] - viewHolder.title.text = skuDetails.title.replace("(Retro Music Player)", "").trim { it <= ' ' } - viewHolder.text.text = skuDetails.description - viewHolder.text.visibility = View.GONE - viewHolder.price.text = skuDetails.priceText - viewHolder.image.setImageResource(getIcon(i)) + override fun onBindViewHolder(viewHolder: ViewHolder, i: Int) { + val skuDetails = skuDetailsList[i] + viewHolder.title.text = skuDetails.title.replace("(Retro Music Player)", "") + .trim { it <= ' ' } + viewHolder.text.text = skuDetails.description + viewHolder.text.visibility = View.GONE + viewHolder.price.text = skuDetails.priceText + viewHolder.image.setImageResource(getIcon(i)) - val purchased = donationsDialog.billingProcessor!!.isPurchased(skuDetails.productId) - val titleTextColor = if (purchased) ATHUtil.resolveColor(donationsDialog, android.R.attr.textColorHint) else ThemeStore.textColorPrimary(donationsDialog) - val contentTextColor = if (purchased) titleTextColor else ThemeStore.textColorSecondary(donationsDialog) + val purchased = donationsDialog.billingProcessor!!.isPurchased(skuDetails.productId) + val titleTextColor = if (purchased) ATHUtil.resolveColor( + donationsDialog, + android.R.attr.textColorHint + ) else ThemeStore.textColorPrimary(donationsDialog) + val contentTextColor = if (purchased) titleTextColor else ThemeStore.textColorSecondary( + donationsDialog + ) - viewHolder.title.setTextColor(titleTextColor) - viewHolder.text.setTextColor(contentTextColor) - viewHolder.price.setTextColor(titleTextColor) + viewHolder.title.setTextColor(titleTextColor) + viewHolder.text.setTextColor(contentTextColor) + viewHolder.price.setTextColor(titleTextColor) - strikeThrough(viewHolder.title, purchased) - strikeThrough(viewHolder.text, purchased) - strikeThrough(viewHolder.price, purchased) + strikeThrough(viewHolder.title, purchased) + strikeThrough(viewHolder.text, purchased) + strikeThrough(viewHolder.price, purchased) - viewHolder.itemView.setOnTouchListener { _, _ -> purchased } - viewHolder.itemView.setOnClickListener { donationsDialog.donate(i) } - } + viewHolder.itemView.setOnTouchListener { _, _ -> purchased } + viewHolder.itemView.setOnClickListener { donationsDialog.donate(i) } + } - override fun getItemCount(): Int { - return skuDetailsList.size - } + override fun getItemCount(): Int { + return skuDetailsList.size + } - class ViewHolder(view: View) : RecyclerView.ViewHolder(view) { - var title: TextView = view.findViewById(R.id.itemTitle) - var text: TextView = view.findViewById(R.id.itemText) - var price: TextView = view.findViewById(R.id.itemPrice) - var image: AppCompatImageView = view.findViewById(R.id.itemImage) - } + class ViewHolder(view: View) : RecyclerView.ViewHolder(view) { + var title: TextView = view.findViewById(R.id.itemTitle) + var text: TextView = view.findViewById(R.id.itemText) + var price: TextView = view.findViewById(R.id.itemPrice) + var image: AppCompatImageView = view.findViewById(R.id.itemImage) + } - companion object { - @LayoutRes - private val LAYOUT_RES_ID = R.layout.item_donation_option + companion object { + @LayoutRes + private val LAYOUT_RES_ID = R.layout.item_donation_option - private fun strikeThrough(textView: TextView, strikeThrough: Boolean) { - textView.paintFlags = if (strikeThrough) - textView.paintFlags or Paint.STRIKE_THRU_TEXT_FLAG - else - textView.paintFlags and Paint.STRIKE_THRU_TEXT_FLAG.inv() - } - } + private fun strikeThrough(textView: TextView, strikeThrough: Boolean) { + textView.paintFlags = if (strikeThrough) textView.paintFlags or Paint.STRIKE_THRU_TEXT_FLAG + else textView.paintFlags and Paint.STRIKE_THRU_TEXT_FLAG.inv() + } + } } diff --git a/app/src/main/java/code/name/monkey/retromusic/activities/UserInfoActivity.kt b/app/src/main/java/code/name/monkey/retromusic/activities/UserInfoActivity.kt index baa667ae9..946b054a6 100644 --- a/app/src/main/java/code/name/monkey/retromusic/activities/UserInfoActivity.kt +++ b/app/src/main/java/code/name/monkey/retromusic/activities/UserInfoActivity.kt @@ -1,10 +1,7 @@ package code.name.monkey.retromusic.activities import android.app.Activity -import android.content.ContentUris -import android.content.Context -import android.content.ContextWrapper -import android.content.Intent +import android.content.* import android.content.res.ColorStateList import android.graphics.Bitmap import android.net.Uri @@ -16,275 +13,298 @@ import android.text.TextUtils import android.view.MenuItem import android.widget.Toast import code.name.monkey.appthemehelper.ThemeStore -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.retromusic.App +import code.name.monkey.appthemehelper.util.* +import code.name.monkey.retromusic.* import code.name.monkey.retromusic.Constants.USER_BANNER import code.name.monkey.retromusic.Constants.USER_PROFILE import code.name.monkey.retromusic.R import code.name.monkey.retromusic.activities.base.AbsBaseActivity import code.name.monkey.retromusic.extensions.applyToolbar -import code.name.monkey.retromusic.util.Compressor +import code.name.monkey.retromusic.util.* import code.name.monkey.retromusic.util.ImageUtil.getResizedBitmap -import code.name.monkey.retromusic.util.PreferenceUtil -import com.afollestad.materialdialogs.LayoutMode -import com.afollestad.materialdialogs.MaterialDialog +import com.afollestad.materialdialogs.* import com.afollestad.materialdialogs.bottomsheets.BottomSheet import com.afollestad.materialdialogs.list.listItems import io.reactivex.android.schedulers.AndroidSchedulers import io.reactivex.disposables.CompositeDisposable import io.reactivex.schedulers.Schedulers import kotlinx.android.synthetic.main.activity_user_info.* -import java.io.File -import java.io.FileOutputStream -import java.io.IOException +import java.io.* class UserInfoActivity : AbsBaseActivity() { - private var disposable = CompositeDisposable() + private var disposable = CompositeDisposable() - override fun onCreate(savedInstanceState: Bundle?) { - super.onCreate(savedInstanceState) - setContentView(R.layout.activity_user_info) - setStatusbarColorAuto() - setNavigationBarColorPrimary() - setTaskDescriptionColorAuto() - setLightNavigationBar(true) + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + setContentView(R.layout.activity_user_info) + setStatusbarColorAuto() + setNavigationBarColorPrimary() + setTaskDescriptionColorAuto() + setLightNavigationBar(true) - setupToolbar() + setupToolbar() - MaterialUtil.setTint(nameContainer, false) - name.setText(PreferenceUtil.getInstance(this).userName) + MaterialUtil.setTint(nameContainer, false) + name.setText(PreferenceUtil.getInstance(this).userName) - if (PreferenceUtil.getInstance(this).profileImage.isNotEmpty()) { - loadImageFromStorage(PreferenceUtil.getInstance(this).profileImage) - } - if (PreferenceUtil.getInstance(this).bannerImage.isNotEmpty()) { - loadBannerFromStorage(PreferenceUtil.getInstance(this).bannerImage) - } - userImage.setOnClickListener { - MaterialDialog(this, BottomSheet(LayoutMode.WRAP_CONTENT)).show { - title(text = getString(R.string.set_photo)) - listItems(items = listOf(getString(R.string.new_profile_photo), getString(R.string.remove_profile_photo))) { _, position, _ -> - when (position) { - 0 -> pickNewPhoto() - 1 -> PreferenceUtil.getInstance(this@UserInfoActivity).saveProfileImage("") - } - } - } - } - bannerSelect.setOnClickListener { - showBannerOptions() - } - next.setOnClickListener { - val nameString = name.text.toString().trim { it <= ' ' } - if (TextUtils.isEmpty(nameString)) { - Toast.makeText(this, "Umm name is empty", Toast.LENGTH_SHORT).show() - return@setOnClickListener - } - /*val bioString = bio.text.toString().trim() { it <= ' ' } - if (TextUtils.isEmpty(bioString)) { - Toast.makeText(this, "Umm bio is empty", Toast.LENGTH_SHORT).show() - return@setOnClickListener + if (PreferenceUtil.getInstance(this).profileImage.isNotEmpty()) { + loadImageFromStorage(PreferenceUtil.getInstance(this).profileImage) + } + if (PreferenceUtil.getInstance(this).bannerImage.isNotEmpty()) { + loadBannerFromStorage(PreferenceUtil.getInstance(this).bannerImage) + } + userImage.setOnClickListener { + MaterialDialog(this, BottomSheet(LayoutMode.WRAP_CONTENT)).show { + title(text = getString(R.string.set_photo)) + listItems( + items = listOf( + getString(R.string.new_profile_photo), + getString(R.string.remove_profile_photo) + ) + ) { _, position, _ -> + when (position) { + 0 -> pickNewPhoto() + 1 -> PreferenceUtil.getInstance(this@UserInfoActivity).saveProfileImage("") + } + } + } + } + bannerSelect.setOnClickListener { + showBannerOptions() + } + next.setOnClickListener { + val nameString = name.text.toString().trim { it <= ' ' } + if (TextUtils.isEmpty(nameString)) { + Toast.makeText(this, "Umm name is empty", Toast.LENGTH_SHORT).show() + return@setOnClickListener + } + /*val bioString = bio.text.toString().trim() { it <= ' ' } + if (TextUtils.isEmpty(bioString)) { + Toast.makeText(this, "Umm bio is empty", Toast.LENGTH_SHORT).show() + return@setOnClickListener - }*/ - PreferenceUtil.getInstance(this).userName = nameString - //PreferenceUtil.getInstance().userBio = bioString - setResult(Activity.RESULT_OK) - finish() - } - next.backgroundTintList = ColorStateList.valueOf(ThemeStore.accentColor(this)) - ColorStateList.valueOf(MaterialValueHelper.getPrimaryTextColor(this, ColorUtil.isColorLight(ThemeStore.accentColor(this)))).apply { - next.setTextColor(this) - next.iconTint = this - } - } + }*/ + PreferenceUtil.getInstance(this).userName = nameString + //PreferenceUtil.getInstance().userBio = bioString + setResult(Activity.RESULT_OK) + finish() + } + next.backgroundTintList = ColorStateList.valueOf(ThemeStore.accentColor(this)) + ColorStateList.valueOf( + MaterialValueHelper.getPrimaryTextColor( + this, + ColorUtil.isColorLight( + ThemeStore.accentColor( + this + ) + ) + ) + ).apply { + next.setTextColor(this) + next.iconTint = this + } + } - override fun onOptionsItemSelected(item: MenuItem): Boolean { - if (item.itemId == android.R.id.home) { - onBackPressed() - } - return super.onOptionsItemSelected(item) - } + override fun onOptionsItemSelected(item: MenuItem): Boolean { + if (item.itemId == android.R.id.home) { + onBackPressed() + } + return super.onOptionsItemSelected(item) + } - private fun setupToolbar() { - val primaryColor = ATHUtil.resolveColor(this, R.attr.colorPrimary) - applyToolbar(toolbar) - appBarLayout.setBackgroundColor(primaryColor) - } + private fun setupToolbar() { + val primaryColor = ATHUtil.resolveColor(this, R.attr.colorPrimary) + applyToolbar(toolbar) + appBarLayout.setBackgroundColor(primaryColor) + } - private fun showBannerOptions() { - MaterialDialog(this, BottomSheet(LayoutMode.WRAP_CONTENT)).show { - title(R.string.select_banner_photo) - listItems(items = listOf(getString(R.string.new_banner_photo), getString(R.string.remove_banner_photo))) - { _, position, _ -> - when (position) { - 0 -> selectBannerImage() - 1 -> PreferenceUtil.getInstance(this@UserInfoActivity).setBannerImagePath("") - } - } - } - } + private fun showBannerOptions() { + MaterialDialog(this, BottomSheet(LayoutMode.WRAP_CONTENT)).show { + title(R.string.select_banner_photo) + listItems( + items = listOf( + getString(R.string.new_banner_photo), + getString(R.string.remove_banner_photo) + ) + ) { _, position, _ -> + when (position) { + 0 -> selectBannerImage() + 1 -> PreferenceUtil.getInstance(this@UserInfoActivity).setBannerImagePath("") + } + } + } + } - private fun selectBannerImage() { + private fun selectBannerImage() { - if (TextUtils.isEmpty(PreferenceUtil.getInstance(this).bannerImage)) { - val pickImageIntent = Intent(Intent.ACTION_PICK, Media.EXTERNAL_CONTENT_URI) - pickImageIntent.type = "image/*" - //pickImageIntent.putExtra("crop", "true") - pickImageIntent.putExtra("outputX", 1290) - pickImageIntent.putExtra("outputY", 720) - pickImageIntent.putExtra("aspectX", 16) - pickImageIntent.putExtra("aspectY", 9) - pickImageIntent.putExtra("scale", true) - //intent.setAction(Intent.ACTION_GET_CONTENT); - startActivityForResult(Intent.createChooser(pickImageIntent, "Select Picture"), PICK_BANNER_REQUEST) - } else { - PreferenceUtil.getInstance(this).setBannerImagePath("") - bannerImage.setImageResource(android.R.color.transparent) - } - } + if (TextUtils.isEmpty(PreferenceUtil.getInstance(this).bannerImage)) { + val pickImageIntent = Intent(Intent.ACTION_PICK, Media.EXTERNAL_CONTENT_URI) + pickImageIntent.type = "image/*" + //pickImageIntent.putExtra("crop", "true") + pickImageIntent.putExtra("outputX", 1290) + pickImageIntent.putExtra("outputY", 720) + pickImageIntent.putExtra("aspectX", 16) + pickImageIntent.putExtra("aspectY", 9) + pickImageIntent.putExtra("scale", true) + //intent.setAction(Intent.ACTION_GET_CONTENT); + startActivityForResult( + Intent.createChooser(pickImageIntent, "Select Picture"), + PICK_BANNER_REQUEST + ) + } else { + PreferenceUtil.getInstance(this).setBannerImagePath("") + bannerImage.setImageResource(android.R.color.transparent) + } + } + private fun pickNewPhoto() { + val pickImageIntent = Intent(Intent.ACTION_PICK, Media.EXTERNAL_CONTENT_URI) + pickImageIntent.type = "image/*" + pickImageIntent.putExtra("crop", "true") + pickImageIntent.putExtra("outputX", 512) + pickImageIntent.putExtra("outputY", 512) + pickImageIntent.putExtra("aspectX", 1) + pickImageIntent.putExtra("aspectY", 1) + pickImageIntent.putExtra("scale", true) + startActivityForResult( + Intent.createChooser(pickImageIntent, "Select Picture"), + PICK_IMAGE_REQUEST + ) + } - private fun pickNewPhoto() { - val pickImageIntent = Intent(Intent.ACTION_PICK, Media.EXTERNAL_CONTENT_URI) - pickImageIntent.type = "image/*" - pickImageIntent.putExtra("crop", "true") - pickImageIntent.putExtra("outputX", 512) - pickImageIntent.putExtra("outputY", 512) - pickImageIntent.putExtra("aspectX", 1) - pickImageIntent.putExtra("aspectY", 1) - pickImageIntent.putExtra("scale", true) - startActivityForResult(Intent.createChooser(pickImageIntent, "Select Picture"), PICK_IMAGE_REQUEST) - } + public override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { + super.onActivityResult(requestCode, resultCode, data) + if (resultCode == Activity.RESULT_OK && data != null) { + when (requestCode) { + PICK_IMAGE_REQUEST -> { + try { + data.data?.let { + val bitmap = getResizedBitmap( + getBitmap(contentResolver, it), + PROFILE_ICON_SIZE + ) + val profileImagePath = saveToInternalStorage(bitmap, USER_PROFILE) + PreferenceUtil.getInstance(this).saveProfileImage(profileImagePath) + loadImageFromStorage(profileImagePath) + } - public override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { - super.onActivityResult(requestCode, resultCode, data) - if (resultCode == Activity.RESULT_OK && data != null) { - when (requestCode) { - PICK_IMAGE_REQUEST -> { - try { - data.data?.let { - val bitmap = getResizedBitmap(getBitmap(contentResolver, it), PROFILE_ICON_SIZE) - val profileImagePath = saveToInternalStorage(bitmap, USER_PROFILE) - PreferenceUtil.getInstance(this).saveProfileImage(profileImagePath) - loadImageFromStorage(profileImagePath) - } + } catch (e: IOException) { + e.printStackTrace() + } + } + PICK_BANNER_REQUEST -> { + try { + data.data?.let { + val bitmap = getBitmap(contentResolver, it) + val profileImagePath = saveToInternalStorage(bitmap, USER_BANNER) + PreferenceUtil.getInstance(this).setBannerImagePath(profileImagePath) + loadBannerFromStorage(profileImagePath) + } + } catch (e: IOException) { + e.printStackTrace() + } + } + } + } + } - } catch (e: IOException) { - e.printStackTrace() - } - } - PICK_BANNER_REQUEST -> { - try { - data.data?.let { - val bitmap = getBitmap(contentResolver, it) - val profileImagePath = saveToInternalStorage(bitmap, USER_BANNER) - PreferenceUtil.getInstance(this).setBannerImagePath(profileImagePath) - loadBannerFromStorage(profileImagePath) - } - } catch (e: IOException) { - e.printStackTrace() - } - } - } - } - } + private fun getImagePathFromUri(aUri: Uri?): String? { + var imagePath: String? = null + if (aUri == null) { + return imagePath + } + if (DocumentsContract.isDocumentUri(App.getContext(), aUri)) { + val documentId = DocumentsContract.getDocumentId(aUri) + if ("com.android.providers.media.documents" == aUri.authority) { + val id = documentId.split(":".toRegex()).dropLastWhile { it.isEmpty() }.toTypedArray()[1] + val selection = Media._ID + "=" + id + imagePath = getImagePath(Media.EXTERNAL_CONTENT_URI, selection) + } else if ("com.android.providers.downloads.documents" == aUri.authority) { + val contentUri = ContentUris.withAppendedId( + Uri.parse("content://downloads/public_downloads"), + java.lang.Long.valueOf(documentId) + ) + imagePath = getImagePath(contentUri, null) + } + } else if ("content".equals(aUri.scheme!!, ignoreCase = true)) { + imagePath = getImagePath(aUri, null) + } else if ("file".equals(aUri.scheme!!, ignoreCase = true)) { + imagePath = aUri.path + } + return imagePath + } + private fun getImagePath(aUri: Uri, aSelection: String?): String? { + var path: String? = null + val cursor = App.getContext().contentResolver.query(aUri, null, aSelection, null, null) + if (cursor != null) { + if (cursor.moveToFirst()) { + path = cursor.getString(cursor.getColumnIndex(Media.DATA)) + } + cursor.close() + } + return path + } - private fun getImagePathFromUri(aUri: Uri?): String? { - var imagePath: String? = null - if (aUri == null) { - return imagePath - } - if (DocumentsContract.isDocumentUri(App.getContext(), aUri)) { - val documentId = DocumentsContract.getDocumentId(aUri) - if ("com.android.providers.media.documents" == aUri.authority) { - val id = documentId.split(":".toRegex()).dropLastWhile { it.isEmpty() }.toTypedArray()[1] - val selection = Media._ID + "=" + id - imagePath = getImagePath(Media.EXTERNAL_CONTENT_URI, selection) - } else if ("com.android.providers.downloads.documents" == aUri.authority) { - val contentUri = ContentUris.withAppendedId(Uri.parse("content://downloads/public_downloads"), - java.lang.Long.valueOf(documentId)) - imagePath = getImagePath(contentUri, null) - } - } else if ("content".equals(aUri.scheme!!, ignoreCase = true)) { - imagePath = getImagePath(aUri, null) - } else if ("file".equals(aUri.scheme!!, ignoreCase = true)) { - imagePath = aUri.path - } - return imagePath - } + private fun loadBannerFromStorage(profileImagePath: String) { + disposable.add( + Compressor(this).setQuality(100).setCompressFormat(Bitmap.CompressFormat.WEBP).compressToBitmapAsFlowable( + File(profileImagePath, USER_BANNER) + ).subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe( + { bitmap -> bannerImage.setImageBitmap(bitmap) }, + { t -> println() }) + ) + } - private fun getImagePath(aUri: Uri, aSelection: String?): String? { - var path: String? = null - val cursor = App.getContext().contentResolver.query(aUri, null, aSelection, null, null) - if (cursor != null) { - if (cursor.moveToFirst()) { - path = cursor.getString(cursor.getColumnIndex(Media.DATA)) - } - cursor.close() - } - return path - } + private fun loadImageFromStorage(path: String) { + disposable.add( + Compressor(this).setMaxHeight(300).setMaxWidth(300).setQuality(75).setCompressFormat( + Bitmap.CompressFormat.WEBP + ).compressToBitmapAsFlowable( + File( + path, + USER_PROFILE + ) + ).subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe( + { bitmap -> userImage!!.setImageBitmap(bitmap) }, + { t -> println() }) + ) + } - private fun loadBannerFromStorage(profileImagePath: String) { - disposable.add(Compressor(this) - .setQuality(100) - .setCompressFormat(Bitmap.CompressFormat.WEBP) - .compressToBitmapAsFlowable(File(profileImagePath, USER_BANNER)) - .subscribeOn(Schedulers.io()) - .observeOn(AndroidSchedulers.mainThread()) - .subscribe({ bitmap -> bannerImage.setImageBitmap(bitmap) }, { t -> println() })) - } + private fun saveToInternalStorage(bitmapImage: Bitmap, userBanner: String): String { + val cw = ContextWrapper(this) + val directory = cw.getDir("imageDir", Context.MODE_PRIVATE) + val myPath = File(directory, userBanner) + var fos: FileOutputStream? = null + try { + fos = FileOutputStream(myPath) + // Use the compress method on the BitMap object to write image to the OutputStream + bitmapImage.compress(Bitmap.CompressFormat.WEBP, 100, fos) + } catch (e: Exception) { + e.printStackTrace() + } finally { + try { + fos?.close() + } catch (e: IOException) { + e.printStackTrace() + } + } + return directory.absolutePath + } - private fun loadImageFromStorage(path: String) { - disposable.add(Compressor(this) - .setMaxHeight(300) - .setMaxWidth(300) - .setQuality(75) - .setCompressFormat(Bitmap.CompressFormat.WEBP) - .compressToBitmapAsFlowable(File(path, USER_PROFILE)) - .subscribeOn(Schedulers.io()) - .observeOn(AndroidSchedulers.mainThread()) - .subscribe({ bitmap -> userImage!!.setImageBitmap(bitmap) }, { t -> println() })) - } + companion object { - private fun saveToInternalStorage(bitmapImage: Bitmap, userBanner: String): String { - val cw = ContextWrapper(this) - val directory = cw.getDir("imageDir", Context.MODE_PRIVATE) - val myPath = File(directory, userBanner) - var fos: FileOutputStream? = null - try { - fos = FileOutputStream(myPath) - // Use the compress method on the BitMap object to write image to the OutputStream - bitmapImage.compress(Bitmap.CompressFormat.WEBP, 100, fos) - } catch (e: Exception) { - e.printStackTrace() - } finally { - try { - fos?.close() - } catch (e: IOException) { - e.printStackTrace() - } - } - return directory.absolutePath - } - - companion object { - - private const val PICK_IMAGE_REQUEST = 9002 - private const val PICK_BANNER_REQUEST = 9004 - private const val PROFILE_ICON_SIZE = 400 - } + private const val PICK_IMAGE_REQUEST = 9002 + private const val PICK_BANNER_REQUEST = 9004 + private const val PROFILE_ICON_SIZE = 400 + } } fun Activity.pickImage(requestCode: Int) { - Intent(Intent.ACTION_GET_CONTENT).apply { - addCategory(Intent.CATEGORY_OPENABLE) - type = "image/*" - startActivityForResult(this, requestCode) - } + Intent(Intent.ACTION_GET_CONTENT).apply { + addCategory(Intent.CATEGORY_OPENABLE) + type = "image/*" + startActivityForResult(this, requestCode) + } } 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 13f3f3689..3b096f518 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,134 +5,139 @@ import android.content.Intent import android.content.pm.PackageManager import android.media.AudioManager import android.net.Uri -import android.os.Build -import android.os.Bundle +import android.os.* import android.provider.Settings -import android.view.KeyEvent -import android.view.View +import android.view.* import androidx.core.app.ActivityCompat import code.name.monkey.appthemehelper.ThemeStore 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(code.name.monkey.retromusic.R.string.permissions_denied) else permissionDeniedMessage!! - } + 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 + } - private val snackBarContainer: View - get() = window.decorView + 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 onCreate(savedInstanceState: Bundle?) { - super.onCreate(savedInstanceState) - volumeControlStream = AudioManager.STREAM_MUSIC - permissions = getPermissionsToRequest() - hadPermissions = hasPermissions() - permissionDeniedMessage = null - } + protected open fun onHasPermissionsChanged(hasPermissions: Boolean) { + // implemented by sub classes + } - override fun onPostCreate(savedInstanceState: Bundle?) { - super.onPostCreate(savedInstanceState) - if (!hasPermissions()) { - requestPermissions() - } - } + 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 onResume() { - super.onResume() - val hasPermissions = hasPermissions() - if (hasPermissions != hadPermissions) { - hadPermissions = hasPermissions - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { - onHasPermissionsChanged(hasPermissions) - } - } - } + protected fun showOverflowMenu() { - 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) - } + protected open fun requestPermissions() { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { + requestPermissions(permissions, PERMISSION_REQUEST) + } + } - protected fun showOverflowMenu() { + 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) + } + } - 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 - } - - 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/AbsCrashCollector.kt b/app/src/main/java/code/name/monkey/retromusic/activities/base/AbsCrashCollector.kt deleted file mode 100644 index 9bd0575dc..000000000 --- a/app/src/main/java/code/name/monkey/retromusic/activities/base/AbsCrashCollector.kt +++ /dev/null @@ -1,12 +0,0 @@ -package code.name.monkey.retromusic.activities.base - -import android.os.Bundle -import code.name.monkey.appthemehelper.ATHActivity -import code.name.monkey.retromusic.helper.TopExceptionHandler - -abstract class AbsCrashCollector : ATHActivity() { - override fun onCreate(savedInstanceState: Bundle?) { - super.onCreate(savedInstanceState) - Thread.setDefaultUncaughtExceptionHandler(TopExceptionHandler()) - } -} \ No newline at end of file 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 57ee45a75..30e99735b 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 @@ -2,8 +2,7 @@ package code.name.monkey.retromusic.activities.base import android.Manifest import android.content.* -import android.os.Bundle -import android.os.IBinder +import android.os.* import code.name.monkey.retromusic.R import code.name.monkey.retromusic.helper.MusicPlayerRemote import code.name.monkey.retromusic.interfaces.MusicServiceEventListener @@ -11,155 +10,158 @@ import code.name.monkey.retromusic.service.MusicService.* import java.lang.ref.WeakReference import java.util.* - 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 ac82c6578..5efe882dc 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 @@ -2,22 +2,15 @@ package code.name.monkey.retromusic.activities.base import android.animation.ValueAnimator import android.annotation.SuppressLint -import android.graphics.Color -import android.graphics.Rect +import android.graphics.* import android.os.Bundle -import android.view.MotionEvent -import android.view.View -import android.view.ViewGroup -import android.view.ViewTreeObserver +import android.view.* import androidx.annotation.LayoutRes import androidx.fragment.app.Fragment -import code.name.monkey.appthemehelper.util.ATHUtil -import code.name.monkey.appthemehelper.util.ColorUtil +import code.name.monkey.appthemehelper.util.* import code.name.monkey.retromusic.R -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.extensions.* +import code.name.monkey.retromusic.fragments.* import code.name.monkey.retromusic.fragments.NowPlayingScreen.* import code.name.monkey.retromusic.fragments.base.AbsPlayerFragment import code.name.monkey.retromusic.fragments.player.adaptive.AdaptiveFragment @@ -35,333 +28,330 @@ import code.name.monkey.retromusic.fragments.player.plain.PlainPlayerFragment import code.name.monkey.retromusic.fragments.player.simple.SimplePlayerFragment import code.name.monkey.retromusic.fragments.player.tiny.TinyPlayerFragment import code.name.monkey.retromusic.helper.MusicPlayerRemote -import code.name.monkey.retromusic.util.DensityUtil -import code.name.monkey.retromusic.util.PreferenceUtil +import code.name.monkey.retromusic.util.* 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.* - abstract class AbsSlidingMusicPanelActivity : AbsMusicServiceActivity(), AbsPlayerFragment.Callbacks { - companion object { - val TAG: String = AbsSlidingMusicPanelActivity::class.java.simpleName - } + companion object { + val TAG: String = AbsSlidingMusicPanelActivity::class.java.simpleName + } - private lateinit var bottomSheetBehavior: BottomSheetBehavior - private var miniPlayerFragment: MiniPlayerFragment? = null - private var playerFragment: AbsPlayerFragment? = null - private var currentNowPlayingScreen: NowPlayingScreen? = null - private var navigationBarColor: Int = 0 - private var taskColor: Int = 0 - private var lightStatusBar: Boolean = false - private var lightNavigationBar: Boolean = false - private var navigationBarColorAnimator: ValueAnimator? = null - protected abstract fun createContentView(): View - private val panelState: Int - get() = bottomSheetBehavior.state + private lateinit var bottomSheetBehavior: BottomSheetBehavior + private var miniPlayerFragment: MiniPlayerFragment? = null + private var playerFragment: AbsPlayerFragment? = null + private var currentNowPlayingScreen: NowPlayingScreen? = null + private var navigationBarColor: Int = 0 + private var taskColor: Int = 0 + private var lightStatusBar: Boolean = false + private var lightNavigationBar: Boolean = false + private var navigationBarColorAnimator: ValueAnimator? = null + protected abstract fun createContentView(): View + private val panelState: Int + get() = bottomSheetBehavior.state - private val bottomSheetCallbackList = object : BottomSheetBehavior.BottomSheetCallback() { + private val bottomSheetCallbackList = object : BottomSheetBehavior.BottomSheetCallback() { - override fun onSlide(bottomSheet: View, slideOffset: Float) { - setMiniPlayerAlphaProgress(slideOffset) - dimBackground.show() - dimBackground.alpha = slideOffset - } + override fun onSlide(bottomSheet: View, slideOffset: Float) { + setMiniPlayerAlphaProgress(slideOffset) + dimBackground.show() + dimBackground.alpha = slideOffset + } - override fun onStateChanged(bottomSheet: View, newState: Int) { - when (newState) { - BottomSheetBehavior.STATE_EXPANDED -> { - onPanelExpanded() - } - BottomSheetBehavior.STATE_COLLAPSED -> { - onPanelCollapsed() - dimBackground.hide() - } - else -> { + override fun onStateChanged(bottomSheet: View, newState: Int) { + when (newState) { + BottomSheetBehavior.STATE_EXPANDED -> { + onPanelExpanded() + } + BottomSheetBehavior.STATE_COLLAPSED -> { + onPanelCollapsed() + dimBackground.hide() + } + else -> { - } - } - } - } + } + } + } + } + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + setContentView(createContentView()) + + chooseFragmentForTheme() + setupSlidingUpPanel() + + updateTabs() + + bottomSheetBehavior = BottomSheetBehavior.from(slidingPanel) + + val themeColor = ATHUtil.resolveColor(this, R.attr.colorPrimary, Color.GRAY) + dimBackground.setBackgroundColor(ColorUtil.withAlpha(themeColor, 0.5f)) + } + + override fun onResume() { + super.onResume() + if (currentNowPlayingScreen != PreferenceUtil.getInstance(this).nowPlayingScreen) { + postRecreate() + } + bottomSheetBehavior.addBottomSheetCallback(bottomSheetCallbackList) + + if (bottomSheetBehavior.state == BottomSheetBehavior.STATE_EXPANDED) { + setMiniPlayerAlphaProgress(1f) + } + } + + override fun onDestroy() { + super.onDestroy() + bottomSheetBehavior.removeBottomSheetCallback(bottomSheetCallbackList) + if (navigationBarColorAnimator != null) navigationBarColorAnimator!!.cancel() // just in case + } + + protected fun wrapSlidingMusicPanel(@LayoutRes resId: Int): View { + @SuppressLint("InflateParams") val slidingMusicPanelLayout = layoutInflater.inflate( + R.layout.sliding_music_panel_layout, null + ) + val contentContainer = slidingMusicPanelLayout.findViewById(R.id.mainContentFrame) + layoutInflater.inflate(resId, contentContainer) + return slidingMusicPanelLayout + } + + private fun collapsePanel() { + bottomSheetBehavior.state = BottomSheetBehavior.STATE_COLLAPSED + } + + fun expandPanel() { + bottomSheetBehavior.state = BottomSheetBehavior.STATE_EXPANDED + setMiniPlayerAlphaProgress(1f) + } + + private fun setMiniPlayerAlphaProgress(progress: Float) { + if (miniPlayerFragment?.view == null) return + val alpha = 1 - progress + miniPlayerFragment?.view?.alpha = alpha + // necessary to make the views below clickable + miniPlayerFragment?.view?.visibility = if (alpha == 0f) View.GONE else View.VISIBLE + + bottomNavigationView.translationY = progress * 500 + bottomNavigationView.alpha = alpha + } + + open fun onPanelCollapsed() { + // restore values + super.setLightStatusbar(lightStatusBar) + super.setTaskDescriptionColor(taskColor) + super.setNavigationbarColor(navigationBarColor) + super.setLightNavigationBar(lightNavigationBar) - override fun onCreate(savedInstanceState: Bundle?) { - super.onCreate(savedInstanceState) - setContentView(createContentView()) + playerFragment?.setMenuVisibility(false) + playerFragment?.userVisibleHint = false + playerFragment?.onHide() + } - chooseFragmentForTheme() - setupSlidingUpPanel() + open fun onPanelExpanded() { + val playerFragmentColor = playerFragment!!.paletteColor + super.setTaskDescriptionColor(playerFragmentColor) - updateTabs() + playerFragment?.setMenuVisibility(true) + playerFragment?.userVisibleHint = true + playerFragment?.onShow() + onPaletteColorChanged() + } - bottomSheetBehavior = BottomSheetBehavior.from(slidingPanel) + private fun setupSlidingUpPanel() { + slidingPanel.viewTreeObserver.addOnGlobalLayoutListener(object : ViewTreeObserver.OnGlobalLayoutListener { + override fun onGlobalLayout() { + slidingPanel.viewTreeObserver.removeOnGlobalLayoutListener(this) + if (currentNowPlayingScreen != PEAK) { + val params = slidingPanel.layoutParams as ViewGroup.LayoutParams + params.height = ViewGroup.LayoutParams.MATCH_PARENT + slidingPanel.layoutParams = params + } + when (panelState) { + BottomSheetBehavior.STATE_EXPANDED -> onPanelExpanded() + BottomSheetBehavior.STATE_COLLAPSED -> onPanelCollapsed() + else -> playerFragment!!.onHide() + } + } + }) + } - val themeColor = ATHUtil.resolveColor(this, R.attr.colorPrimary, Color.GRAY) - dimBackground.setBackgroundColor(ColorUtil.withAlpha(themeColor, 0.5f)) - } + fun toggleBottomNavigationView(toggle: Boolean) { + bottomNavigationView.visibility = if (toggle) View.GONE else View.VISIBLE + } - override fun onResume() { - super.onResume() - if (currentNowPlayingScreen != PreferenceUtil.getInstance(this).nowPlayingScreen) { - postRecreate() - } - bottomSheetBehavior.addBottomSheetCallback(bottomSheetCallbackList) + fun getBottomNavigationView(): BottomNavigationBarTinted { + return bottomNavigationView + } - if (bottomSheetBehavior.state == BottomSheetBehavior.STATE_EXPANDED) { - setMiniPlayerAlphaProgress(1f) - } - } + private fun hideBottomBar(hide: Boolean) { + val heightOfBar = resources.getDimensionPixelSize(R.dimen.mini_player_height) + val heightOfBarWithTabs = resources.getDimensionPixelSize(R.dimen.mini_player_height_expanded) - override fun onDestroy() { - super.onDestroy() - bottomSheetBehavior.removeBottomSheetCallback(bottomSheetCallbackList) - if (navigationBarColorAnimator != null) navigationBarColorAnimator!!.cancel() // just in case - } + if (hide) { + bottomSheetBehavior.isHideable = true + bottomSheetBehavior.peekHeight = 0 + collapsePanel() + bottomNavigationView.elevation = DensityUtil.dip2px(this, 10f).toFloat() + } else { + if (MusicPlayerRemote.playingQueue.isNotEmpty()) { + 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 + } + } + } + fun setBottomBarVisibility(gone: Int) { + bottomNavigationView.visibility = gone + hideBottomBar(false) + } - protected fun wrapSlidingMusicPanel(@LayoutRes resId: Int): View { - @SuppressLint("InflateParams") - val slidingMusicPanelLayout = layoutInflater.inflate(R.layout.sliding_music_panel_layout, null) - val contentContainer = slidingMusicPanelLayout.findViewById(R.id.mainContentFrame) - layoutInflater.inflate(resId, contentContainer) - return slidingMusicPanelLayout - } + private fun chooseFragmentForTheme() { + currentNowPlayingScreen = PreferenceUtil.getInstance(this).nowPlayingScreen - private fun collapsePanel() { - bottomSheetBehavior.state = BottomSheetBehavior.STATE_COLLAPSED - } + val fragment: Fragment = when (currentNowPlayingScreen) { + BLUR -> BlurPlayerFragment() + ADAPTIVE -> AdaptiveFragment() + NORMAL -> PlayerFragment() + CARD -> CardFragment() + BLUR_CARD -> CardBlurFragment() + FIT -> FitFragment() + FLAT -> FlatPlayerFragment() + FULL -> FullPlayerFragment() + PLAIN -> PlainPlayerFragment() + SIMPLE -> SimplePlayerFragment() + MATERIAL -> MaterialFragment() + COLOR -> ColorFragment() + TINY -> TinyPlayerFragment() + PEAK -> PeakPlayerFragment() + else -> PlayerFragment() + } // must implement AbsPlayerFragment + supportFragmentManager.beginTransaction().replace(R.id.playerFragmentContainer, fragment) + .commit() + supportFragmentManager.executePendingTransactions() - fun expandPanel() { - bottomSheetBehavior.state = BottomSheetBehavior.STATE_EXPANDED - setMiniPlayerAlphaProgress(1f) - } + playerFragment = supportFragmentManager.findFragmentById(R.id.playerFragmentContainer) as AbsPlayerFragment + miniPlayerFragment = supportFragmentManager.findFragmentById(R.id.miniPlayerFragment) as MiniPlayerFragment + miniPlayerFragment?.view?.setOnClickListener { expandPanel() } + } - private fun setMiniPlayerAlphaProgress(progress: Float) { - if (miniPlayerFragment?.view == null) return - val alpha = 1 - progress - miniPlayerFragment?.view?.alpha = alpha - // necessary to make the views below clickable - miniPlayerFragment?.view?.visibility = if (alpha == 0f) View.GONE else View.VISIBLE + override fun onServiceConnected() { + super.onServiceConnected() + if (MusicPlayerRemote.playingQueue.isNotEmpty()) { + slidingPanel.viewTreeObserver.addOnGlobalLayoutListener(object : ViewTreeObserver.OnGlobalLayoutListener { + override fun onGlobalLayout() { + slidingPanel.viewTreeObserver.removeOnGlobalLayoutListener(this) + hideBottomBar(false) + } + }) + } // don't call hideBottomBar(true) here as it causes a bug with the SlidingUpPanelLayout + } - bottomNavigationView.translationY = progress * 500 - bottomNavigationView.alpha = alpha - } + override fun onQueueChanged() { + super.onQueueChanged() + hideBottomBar(MusicPlayerRemote.playingQueue.isEmpty()) + } - open fun onPanelCollapsed() { - // restore values - super.setLightStatusbar(lightStatusBar) - super.setTaskDescriptionColor(taskColor) - super.setNavigationbarColor(navigationBarColor) - super.setLightNavigationBar(lightNavigationBar) + override fun onBackPressed() { + if (!handleBackPress()) super.onBackPressed() + } + open fun handleBackPress(): Boolean { + if (bottomSheetBehavior.peekHeight != 0 && playerFragment!!.onBackPressed()) return true + if (panelState == BottomSheetBehavior.STATE_EXPANDED) { + collapsePanel() + return true + } + return false + } - playerFragment?.setMenuVisibility(false) - playerFragment?.userVisibleHint = false - playerFragment?.onHide() - } + override fun onPaletteColorChanged() { + if (panelState == BottomSheetBehavior.STATE_EXPANDED) { + val paletteColor = playerFragment!!.paletteColor + super.setTaskDescriptionColor(paletteColor) - open fun onPanelExpanded() { - val playerFragmentColor = playerFragment!!.paletteColor - super.setTaskDescriptionColor(playerFragmentColor) + val isColorLight = ColorUtil.isColorLight(paletteColor) - playerFragment?.setMenuVisibility(true) - playerFragment?.userVisibleHint = true - playerFragment?.onShow() - onPaletteColorChanged() - } + if (PreferenceUtil.getInstance(this).adaptiveColor && (currentNowPlayingScreen == NORMAL || currentNowPlayingScreen == FLAT)) { + super.setLightNavigationBar(true) + super.setLightStatusbar(isColorLight) + } else if (currentNowPlayingScreen == FULL || currentNowPlayingScreen == CARD || currentNowPlayingScreen == FIT || currentNowPlayingScreen == BLUR || currentNowPlayingScreen == BLUR_CARD) { + super.setLightStatusbar(false) + super.setLightNavigationBar(true) + } else if (currentNowPlayingScreen == COLOR || currentNowPlayingScreen == TINY) { + super.setNavigationbarColor(paletteColor) + super.setLightNavigationBar(isColorLight) + super.setLightStatusbar(isColorLight) + } else { + super.setLightStatusbar( + ColorUtil.isColorLight( + ATHUtil.resolveColor( + this, R.attr.colorPrimary + ) + ) + ) + super.setLightNavigationBar(true) + } + } + } - private fun setupSlidingUpPanel() { - slidingPanel.viewTreeObserver - .addOnGlobalLayoutListener(object : ViewTreeObserver.OnGlobalLayoutListener { - override fun onGlobalLayout() { - slidingPanel.viewTreeObserver.removeOnGlobalLayoutListener(this) - if (currentNowPlayingScreen != PEAK) { - val params = slidingPanel.layoutParams as ViewGroup.LayoutParams - params.height = ViewGroup.LayoutParams.MATCH_PARENT - slidingPanel.layoutParams = params - } - when (panelState) { - BottomSheetBehavior.STATE_EXPANDED -> { - onPanelExpanded() - } - BottomSheetBehavior.STATE_COLLAPSED -> onPanelCollapsed() - else -> playerFragment!!.onHide() - } - } - }) - } + override fun setLightStatusbar(enabled: Boolean) { + lightStatusBar = enabled + if (panelState == BottomSheetBehavior.STATE_COLLAPSED) { + super.setLightStatusbar(enabled) + } + } - fun toggleBottomNavigationView(toggle: Boolean) { - bottomNavigationView.visibility = if (toggle) View.GONE else View.VISIBLE - } + override fun setLightNavigationBar(enabled: Boolean) { + lightNavigationBar = enabled + if (panelState == BottomSheetBehavior.STATE_COLLAPSED) { + super.setLightNavigationBar(enabled) + } + } - fun getBottomNavigationView(): BottomNavigationBarTinted { - return bottomNavigationView - } + override fun setNavigationbarColor(color: Int) { + navigationBarColor = color + if (panelState == BottomSheetBehavior.STATE_COLLAPSED) { + if (navigationBarColorAnimator != null) navigationBarColorAnimator!!.cancel() + super.setNavigationbarColor(color) + } + } - private fun hideBottomBar(hide: Boolean) { - val heightOfBar = resources.getDimensionPixelSize(R.dimen.mini_player_height) - val heightOfBarWithTabs = resources.getDimensionPixelSize(R.dimen.mini_player_height_expanded) + override fun setTaskDescriptionColor(color: Int) { + taskColor = color + if (panelState == BottomSheetBehavior.STATE_COLLAPSED) { + super.setTaskDescriptionColor(color) + } + } - if (hide) { - bottomSheetBehavior.isHideable = true - bottomSheetBehavior.peekHeight = 0 - collapsePanel() - bottomNavigationView.elevation = DensityUtil.dip2px(this, 10f).toFloat() - } else { - if (MusicPlayerRemote.playingQueue.isNotEmpty()) { - 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 - } - } - } + private fun updateTabs() { + bottomNavigationView.menu.clear() + val currentTabs = PreferenceUtil.getInstance(this).libraryCategoryInfos + for (tab in currentTabs) { + if (tab.visible) { + val menu = tab.category + bottomNavigationView.menu.add( + 0, menu.id, 0, menu.stringRes + ).setIcon(menu.icon) + } + } + } - fun setBottomBarVisibility(gone: Int) { - bottomNavigationView.visibility = gone - hideBottomBar(false) - } - - private fun chooseFragmentForTheme() { - currentNowPlayingScreen = PreferenceUtil.getInstance(this).nowPlayingScreen - - val fragment: Fragment = when (currentNowPlayingScreen) { - BLUR -> BlurPlayerFragment() - ADAPTIVE -> AdaptiveFragment() - NORMAL -> PlayerFragment() - CARD -> CardFragment() - BLUR_CARD -> CardBlurFragment() - FIT -> FitFragment() - FLAT -> FlatPlayerFragment() - FULL -> FullPlayerFragment() - PLAIN -> PlainPlayerFragment() - SIMPLE -> SimplePlayerFragment() - MATERIAL -> MaterialFragment() - COLOR -> ColorFragment() - TINY -> TinyPlayerFragment() - PEAK -> PeakPlayerFragment() - else -> PlayerFragment() - } // must implement AbsPlayerFragment - supportFragmentManager.beginTransaction().replace(R.id.playerFragmentContainer, fragment).commit() - supportFragmentManager.executePendingTransactions() - - playerFragment = supportFragmentManager.findFragmentById(R.id.playerFragmentContainer) as AbsPlayerFragment - miniPlayerFragment = supportFragmentManager.findFragmentById(R.id.miniPlayerFragment) as MiniPlayerFragment - miniPlayerFragment!!.view!!.setOnClickListener { expandPanel() } - } - - override fun onServiceConnected() { - super.onServiceConnected() - if (MusicPlayerRemote.playingQueue.isNotEmpty()) { - slidingPanel.viewTreeObserver.addOnGlobalLayoutListener(object : ViewTreeObserver.OnGlobalLayoutListener { - override fun onGlobalLayout() { - slidingPanel.viewTreeObserver.removeOnGlobalLayoutListener(this) - hideBottomBar(false) - } - }) - } // don't call hideBottomBar(true) here as it causes a bug with the SlidingUpPanelLayout - } - - override fun onQueueChanged() { - super.onQueueChanged() - hideBottomBar(MusicPlayerRemote.playingQueue.isEmpty()) - } - - override fun onBackPressed() { - if (!handleBackPress()) - super.onBackPressed() - } - - open fun handleBackPress(): Boolean { - if (bottomSheetBehavior.peekHeight != 0 && playerFragment!!.onBackPressed()) - return true - if (panelState == BottomSheetBehavior.STATE_EXPANDED) { - collapsePanel() - return true - } - return false - } - - override fun onPaletteColorChanged() { - if (panelState == BottomSheetBehavior.STATE_EXPANDED) { - val paletteColor = playerFragment!!.paletteColor - super.setTaskDescriptionColor(paletteColor) - - val isColorLight = ColorUtil.isColorLight(paletteColor) - - if (PreferenceUtil.getInstance(this).adaptiveColor && - (currentNowPlayingScreen == NORMAL || currentNowPlayingScreen == FLAT)) { - super.setLightNavigationBar(true) - super.setLightStatusbar(isColorLight) - } else if (currentNowPlayingScreen == FULL || currentNowPlayingScreen == CARD || - currentNowPlayingScreen == FIT || currentNowPlayingScreen == BLUR || currentNowPlayingScreen == BLUR_CARD) { - super.setLightStatusbar(false) - super.setLightNavigationBar(true) - } else if (currentNowPlayingScreen == COLOR || currentNowPlayingScreen == TINY) { - super.setNavigationbarColor(paletteColor) - super.setLightNavigationBar(isColorLight) - super.setLightStatusbar(isColorLight) - } else { - super.setLightStatusbar(ColorUtil.isColorLight(ATHUtil.resolveColor(this, R.attr.colorPrimary))) - super.setLightNavigationBar(true) - } - } - } - - override fun setLightStatusbar(enabled: Boolean) { - lightStatusBar = enabled - if (panelState == BottomSheetBehavior.STATE_COLLAPSED) { - super.setLightStatusbar(enabled) - } - } - - override fun setLightNavigationBar(enabled: Boolean) { - lightNavigationBar = enabled - if (panelState == BottomSheetBehavior.STATE_COLLAPSED) { - super.setLightNavigationBar(enabled) - } - } - - override fun setNavigationbarColor(color: Int) { - navigationBarColor = color - if (panelState == BottomSheetBehavior.STATE_COLLAPSED) { - if (navigationBarColorAnimator != null) navigationBarColorAnimator!!.cancel() - super.setNavigationbarColor(color) - } - } - - override fun setTaskDescriptionColor(color: Int) { - taskColor = color - if (panelState == BottomSheetBehavior.STATE_COLLAPSED) { - super.setTaskDescriptionColor(color) - } - } - - - private fun updateTabs() { - bottomNavigationView.menu.clear() - val currentTabs = PreferenceUtil.getInstance(this).libraryCategoryInfos - for (tab in currentTabs) { - if (tab.visible) { - val menu = tab.category - bottomNavigationView.menu.add(0, menu.id, 0, menu.stringRes) - .setIcon(menu.icon) - } - } - } - - override fun dispatchTouchEvent(ev: MotionEvent?): Boolean { - if (ev?.action == MotionEvent.ACTION_DOWN) { - if (panelState == BottomSheetBehavior.STATE_EXPANDED) { - val outRect = Rect() - slidingPanel.getGlobalVisibleRect(outRect) - if (!outRect.contains(ev.rawX.toInt(), ev.rawY.toInt())) { - bottomSheetBehavior.state = BottomSheetBehavior.STATE_COLLAPSED - } - } - } - return super.dispatchTouchEvent(ev) - } + override fun dispatchTouchEvent(ev: MotionEvent?): Boolean { + if (ev?.action == MotionEvent.ACTION_DOWN) { + if (panelState == BottomSheetBehavior.STATE_EXPANDED) { + val outRect = Rect() + slidingPanel.getGlobalVisibleRect(outRect) + if (!outRect.contains(ev.rawX.toInt(), ev.rawY.toInt())) { + bottomSheetBehavior.state = BottomSheetBehavior.STATE_COLLAPSED + } + } + } + return super.dispatchTouchEvent(ev) + } } \ No newline at end of file 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 603f13f20..26f763871 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 @@ -2,207 +2,199 @@ package code.name.monkey.retromusic.activities.base import android.graphics.Color import android.graphics.drawable.Drawable -import android.os.Bundle -import android.os.Handler -import android.view.KeyEvent -import android.view.View -import android.view.WindowManager +import android.os.* +import android.view.* import androidx.annotation.ColorInt import androidx.core.content.ContextCompat -import code.name.monkey.appthemehelper.ATH -import code.name.monkey.appthemehelper.ThemeStore +import code.name.monkey.appthemehelper.* import code.name.monkey.appthemehelper.common.ATHToolbarActivity -import code.name.monkey.appthemehelper.util.ATHUtil -import code.name.monkey.appthemehelper.util.ColorUtil -import code.name.monkey.appthemehelper.util.TintHelper -import code.name.monkey.appthemehelper.util.VersionUtils +import code.name.monkey.appthemehelper.util.* import code.name.monkey.retromusic.R -import code.name.monkey.retromusic.util.PreferenceUtil -import code.name.monkey.retromusic.util.RetroUtil -import code.name.monkey.retromusic.util.ThemeManager +import code.name.monkey.retromusic.util.* abstract class AbsThemeActivity : ATHToolbarActivity(), Runnable { - private val handler = Handler() + private val handler = Handler() - override fun onCreate(savedInstanceState: Bundle?) { - setTheme(ThemeManager.getThemeResValue(this)) - hideStatusBar() - super.onCreate(savedInstanceState) + override fun onCreate(savedInstanceState: Bundle?) { + setTheme(ThemeManager.getThemeResValue(this)) + hideStatusBar() + super.onCreate(savedInstanceState) - changeBackgroundShape() - setImmersiveFullscreen() - registerSystemUiVisibility() - toggleScreenOn() - } + changeBackgroundShape() + setImmersiveFullscreen() + registerSystemUiVisibility() + toggleScreenOn() + } - private fun toggleScreenOn() { - if (PreferenceUtil.getInstance(this).isScreenOnEnabled) { - window.addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON) - } else { - window.clearFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON) - } - } + private fun toggleScreenOn() { + if (PreferenceUtil.getInstance(this).isScreenOnEnabled) { + window.addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON) + } else { + window.clearFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON) + } + } - override fun onWindowFocusChanged(hasFocus: Boolean) { - super.onWindowFocusChanged(hasFocus) - if (hasFocus) { - hideStatusBar() - handler.removeCallbacks(this) - handler.postDelayed(this, 300) - } else { - handler.removeCallbacks(this) - } - } + override fun onWindowFocusChanged(hasFocus: Boolean) { + super.onWindowFocusChanged(hasFocus) + if (hasFocus) { + hideStatusBar() + handler.removeCallbacks(this) + handler.postDelayed(this, 300) + } else { + handler.removeCallbacks(this) + } + } - fun hideStatusBar() { - hideStatusBar(PreferenceUtil.getInstance(this).fullScreenMode) - } + fun hideStatusBar() { + hideStatusBar(PreferenceUtil.getInstance(this).fullScreenMode) + } - private fun hideStatusBar(fullscreen: Boolean) { - val statusBar = window.decorView.rootView.findViewById(R.id.status_bar) - if (statusBar != null) { - statusBar.visibility = if (fullscreen) View.GONE else View.VISIBLE - } - } + private fun hideStatusBar(fullscreen: Boolean) { + val statusBar = window.decorView.rootView.findViewById(R.id.status_bar) + if (statusBar != null) { + statusBar.visibility = if (fullscreen) View.GONE else View.VISIBLE + } + } + private fun changeBackgroundShape() { + 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, R.attr.colorPrimary) + ) + window.setBackgroundDrawable(background) + } - private fun changeBackgroundShape() { - 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, R.attr.colorPrimary)) - window.setBackgroundDrawable(background) - } + fun setDrawUnderStatusBar() { + RetroUtil.setAllowDrawUnderStatusBar(window) + } - fun setDrawUnderStatusBar() { - RetroUtil.setAllowDrawUnderStatusBar(window) - } + fun setDrawUnderNavigationBar() { + RetroUtil.setAllowDrawUnderNavigationBar(window) + } - fun setDrawUnderNavigationBar() { - RetroUtil.setAllowDrawUnderNavigationBar(window) - } + /** + * This will set the color of the view with the id "status_bar" on KitKat and Lollipop. On + * Lollipop if no such view is found it will set the statusbar color using the native method. + * + * @param color the new statusbar color (will be shifted down on Lollipop and above) + */ + fun setStatusbarColor(color: Int) { + val statusBar = window.decorView.rootView.findViewById(R.id.status_bar) + if (statusBar != null) { + when { + VersionUtils.hasMarshmallow() -> window.statusBarColor = color + VersionUtils.hasLollipop() -> statusBar.setBackgroundColor( + ColorUtil.darkenColor( + color + ) + ) + else -> statusBar.setBackgroundColor(color) + } + } else { + when { + VersionUtils.hasMarshmallow() -> window.statusBarColor = color + else -> window.statusBarColor = ColorUtil.darkenColor(color) + } + } + setLightStatusbarAuto(color) + } - /** - * This will set the color of the view with the id "status_bar" on KitKat and Lollipop. On - * Lollipop if no such view is found it will set the statusbar color using the native method. - * - * @param color the new statusbar color (will be shifted down on Lollipop and above) - */ - fun setStatusbarColor(color: Int) { - val statusBar = window.decorView.rootView.findViewById(R.id.status_bar) - if (statusBar != null) { - when { - VersionUtils.hasMarshmallow() -> window.statusBarColor = color - VersionUtils.hasLollipop() -> statusBar.setBackgroundColor(ColorUtil.darkenColor(color)) - else -> statusBar.setBackgroundColor(color) - } - } else { - when { - VersionUtils.hasMarshmallow() -> window.statusBarColor = color - else -> window.statusBarColor = ColorUtil.darkenColor(color) - } - } - setLightStatusbarAuto(color) - } + fun setStatusbarColorAuto() { + // we don't want to use statusbar color because we are doing the color darkening on our own to support KitKat + setStatusbarColor(ATHUtil.resolveColor(this, R.attr.colorPrimary)) + } - fun setStatusbarColorAuto() { - // we don't want to use statusbar color because we are doing the color darkening on our own to support KitKat - setStatusbarColor(ATHUtil.resolveColor(this, R.attr.colorPrimary)) - } + open fun setTaskDescriptionColor(@ColorInt color: Int) { + ATH.setTaskDescriptionColor(this, color) + } - open fun setTaskDescriptionColor(@ColorInt color: Int) { - ATH.setTaskDescriptionColor(this, color) - } + fun setTaskDescriptionColorAuto() { + setTaskDescriptionColor(ATHUtil.resolveColor(this, R.attr.colorPrimary)) + } - fun setTaskDescriptionColorAuto() { - setTaskDescriptionColor(ATHUtil.resolveColor(this, R.attr.colorPrimary)) - } + open fun setNavigationbarColor(color: Int) { + if (ThemeStore.coloredNavigationBar(this)) { + ATH.setNavigationbarColor(this, color) + } else { + ATH.setNavigationbarColor(this, Color.BLACK) + } + } - open fun setNavigationbarColor(color: Int) { - if (ThemeStore.coloredNavigationBar(this)) { - ATH.setNavigationbarColor(this, color) - } else { - ATH.setNavigationbarColor(this, Color.BLACK) - } - } + open fun setNavigationBarColorPrimary() { + ATH.setNavigationbarColor(this, ATHUtil.resolveColor(this, R.attr.colorPrimary)) + } - open fun setNavigationBarColorPrimary() { - ATH.setNavigationbarColor(this, ATHUtil.resolveColor(this, R.attr.colorPrimary)) - } + fun setNavigationbarColorAuto() { + setNavigationbarColor(ATHUtil.resolveColor(this, R.attr.colorSecondary)) + } - fun setNavigationbarColorAuto() { - setNavigationbarColor(ATHUtil.resolveColor(this, R.attr.colorSecondary)) - } + open fun setLightStatusbar(enabled: Boolean) { + ATH.setLightStatusbar(this, enabled) + } - open fun setLightStatusbar(enabled: Boolean) { - ATH.setLightStatusbar(this, enabled) - } + fun setLightStatusbarAuto(bgColor: Int) { + setLightStatusbar(ColorUtil.isColorLight(bgColor)) + } - fun setLightStatusbarAuto(bgColor: Int) { - setLightStatusbar(ColorUtil.isColorLight(bgColor)) - } + open fun setLightNavigationBar(enabled: Boolean) { + if (!ATHUtil.isWindowBackgroundDark(this) and ThemeStore.coloredNavigationBar(this)) { + ATH.setLightNavigationbar(this, enabled) + } + } - open fun setLightNavigationBar(enabled: Boolean) { - if (!ATHUtil.isWindowBackgroundDark(this) and ThemeStore.coloredNavigationBar(this)) { - ATH.setLightNavigationbar(this, enabled) - } - } + private fun registerSystemUiVisibility() { + val decorView = window.decorView + decorView.setOnSystemUiVisibilityChangeListener { visibility -> + if (visibility and View.SYSTEM_UI_FLAG_FULLSCREEN == 0) { + setImmersiveFullscreen() + } + } + } - private fun registerSystemUiVisibility() { - val decorView = window.decorView - decorView.setOnSystemUiVisibilityChangeListener { visibility -> - if (visibility and View.SYSTEM_UI_FLAG_FULLSCREEN == 0) { - setImmersiveFullscreen() - } - } - } + private fun unregisterSystemUiVisibility() { + val decorView = window.decorView + decorView.setOnSystemUiVisibilityChangeListener(null) + } - private fun unregisterSystemUiVisibility() { - val decorView = window.decorView - decorView.setOnSystemUiVisibilityChangeListener(null) - } + 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) - 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) + if (PreferenceUtil.getInstance(this).fullScreenMode) { + window.decorView.systemUiVisibility = flags + } + } - if (PreferenceUtil.getInstance(this).fullScreenMode) { - window.decorView.systemUiVisibility = flags - } - } + private fun exitFullscreen() { + window.decorView.systemUiVisibility = View.SYSTEM_UI_FLAG_VISIBLE + } - private fun exitFullscreen() { - window.decorView.systemUiVisibility = View.SYSTEM_UI_FLAG_VISIBLE - } + override fun run() { + setImmersiveFullscreen() + } - override fun run() { - setImmersiveFullscreen() - } + override fun onStop() { + handler.removeCallbacks(this) + super.onStop() + } - override fun onStop() { - handler.removeCallbacks(this) - super.onStop() - } + public override fun onDestroy() { + super.onDestroy() + unregisterSystemUiVisibility() + exitFullscreen() + } - public override fun onDestroy() { - super.onDestroy() - unregisterSystemUiVisibility() - exitFullscreen() - } + override fun onKeyDown(keyCode: Int, event: KeyEvent): Boolean { + if (keyCode == KeyEvent.KEYCODE_VOLUME_DOWN || keyCode == KeyEvent.KEYCODE_VOLUME_UP) { + handler.removeCallbacks(this) + handler.postDelayed(this, 500) + } + return super.onKeyDown(keyCode, event) - - override fun onKeyDown(keyCode: Int, event: KeyEvent): Boolean { - if (keyCode == KeyEvent.KEYCODE_VOLUME_DOWN || keyCode == KeyEvent.KEYCODE_VOLUME_UP) { - handler.removeCallbacks(this) - 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 b72882eca..e9d177f22 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 @@ -1,32 +1,21 @@ package code.name.monkey.retromusic.activities.bugreport -import android.app.Activity -import android.app.Dialog -import android.content.ClipData -import android.content.ClipboardManager -import android.content.Context -import android.content.Intent +import android.app.* +import android.content.* import android.net.Uri import android.os.Bundle import android.text.TextUtils import android.view.MenuItem import android.view.inputmethod.EditorInfo import android.widget.Toast -import androidx.annotation.StringDef -import androidx.annotation.StringRes +import androidx.annotation.* import androidx.appcompat.app.AlertDialog import code.name.monkey.appthemehelper.ThemeStore -import code.name.monkey.appthemehelper.util.ATHUtil -import code.name.monkey.appthemehelper.util.MaterialUtil -import code.name.monkey.appthemehelper.util.TintHelper -import code.name.monkey.appthemehelper.util.ToolbarContentTintHelper +import code.name.monkey.appthemehelper.util.* import code.name.monkey.retromusic.R import code.name.monkey.retromusic.activities.base.AbsThemeActivity -import code.name.monkey.retromusic.activities.bugreport.model.DeviceInfo -import code.name.monkey.retromusic.activities.bugreport.model.Report -import code.name.monkey.retromusic.activities.bugreport.model.github.ExtraInfo -import code.name.monkey.retromusic.activities.bugreport.model.github.GithubLogin -import code.name.monkey.retromusic.activities.bugreport.model.github.GithubTarget +import code.name.monkey.retromusic.activities.bugreport.model.* +import code.name.monkey.retromusic.activities.bugreport.model.github.* import code.name.monkey.retromusic.misc.DialogAsyncTask import com.afollestad.materialdialogs.MaterialDialog import com.afollestad.materialdialogs.callbacks.onCancel @@ -36,8 +25,7 @@ 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 org.eclipse.egit.github.core.Issue -import org.eclipse.egit.github.core.client.GitHubClient -import org.eclipse.egit.github.core.client.RequestException +import org.eclipse.egit.github.core.client.* import org.eclipse.egit.github.core.service.IssueService import java.io.IOException @@ -47,268 +35,285 @@ private const val RESULT_INVALID_TOKEN = "RESULT_INVALID_TOKEN" 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) +@StringDef( + RESULT_SUCCESS, + RESULT_BAD_CREDENTIALS, + RESULT_INVALID_TOKEN, + RESULT_ISSUES_NOT_ENABLED, + RESULT_UNKNOWN +) @Retention(AnnotationRetention.SOURCE) private annotation class Result open class BugReportActivity : AbsThemeActivity() { - private var deviceInfo: DeviceInfo? = null + private var deviceInfo: DeviceInfo? = null - override fun onCreate(savedInstanceState: Bundle?) { - super.onCreate(savedInstanceState) - setContentView(R.layout.activity_bug_report) + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + setContentView(R.layout.activity_bug_report) - setStatusbarColorAuto() - setNavigationbarColorAuto() - setTaskDescriptionColorAuto() + setStatusbarColorAuto() + setNavigationbarColorAuto() + setTaskDescriptionColorAuto() - initViews() + initViews() - if (TextUtils.isEmpty(title)) - setTitle(R.string.report_an_issue) + if (TextUtils.isEmpty(title)) setTitle(R.string.report_an_issue) - deviceInfo = DeviceInfo(this) - airTextDeviceInfo.text = deviceInfo.toString() - } + deviceInfo = DeviceInfo(this) + airTextDeviceInfo.text = deviceInfo.toString() + } - private fun initViews() { - val accentColor = ThemeStore.accentColor(this) - val primaryColor = ATHUtil.resolveColor(this, R.attr.colorPrimary) - toolbar.setBackgroundColor(primaryColor) - setSupportActionBar(toolbar) - ToolbarContentTintHelper.colorBackButton(toolbar) - supportActionBar?.setDisplayHomeAsUpEnabled(true) - TintHelper.setTintAuto(optionUseAccount, accentColor, false) - optionUseAccount?.setOnClickListener { - inputTitle.isEnabled = true - inputDescription.isEnabled = true - inputUsername.isEnabled = true - inputPassword.isEnabled = true + private fun initViews() { + val accentColor = ThemeStore.accentColor(this) + val primaryColor = ATHUtil.resolveColor(this, R.attr.colorPrimary) + toolbar.setBackgroundColor(primaryColor) + setSupportActionBar(toolbar) + ToolbarContentTintHelper.colorBackButton(toolbar) + supportActionBar?.setDisplayHomeAsUpEnabled(true) + TintHelper.setTintAuto(optionUseAccount, accentColor, false) + optionUseAccount?.setOnClickListener { + inputTitle.isEnabled = true + inputDescription.isEnabled = true + inputUsername.isEnabled = true + inputPassword.isEnabled = true - optionAnonymous.isChecked = false - sendFab.hide(object : FloatingActionButton.OnVisibilityChangedListener() { - override fun onHidden(fab: FloatingActionButton?) { - super.onHidden(fab) - sendFab.setImageResource(R.drawable.ic_send_white_24dp) - sendFab.show() - } - }) - } - TintHelper.setTintAuto(optionAnonymous, accentColor, false) - optionAnonymous.setOnClickListener { - inputTitle.isEnabled = false - inputDescription.isEnabled = false - inputUsername.isEnabled = false - inputPassword.isEnabled = false + optionAnonymous.isChecked = false + sendFab.hide(object : FloatingActionButton.OnVisibilityChangedListener() { + override fun onHidden(fab: FloatingActionButton?) { + super.onHidden(fab) + sendFab.setImageResource(R.drawable.ic_send_white_24dp) + sendFab.show() + } + }) + } + TintHelper.setTintAuto(optionAnonymous, accentColor, false) + optionAnonymous.setOnClickListener { + inputTitle.isEnabled = false + inputDescription.isEnabled = false + inputUsername.isEnabled = false + inputPassword.isEnabled = false - optionUseAccount.isChecked = false - sendFab.hide(object : FloatingActionButton.OnVisibilityChangedListener() { - override fun onHidden(fab: FloatingActionButton?) { - super.onHidden(fab) - sendFab.setImageResource(R.drawable.ic_open_in_browser_white_24dp) - sendFab.show() - } - }) - } + optionUseAccount.isChecked = false + sendFab.hide(object : FloatingActionButton.OnVisibilityChangedListener() { + override fun onHidden(fab: FloatingActionButton?) { + super.onHidden(fab) + sendFab.setImageResource(R.drawable.ic_open_in_browser_white_24dp) + sendFab.show() + } + }) + } - inputPassword.setOnEditorActionListener { _, actionId, _ -> - if (actionId == EditorInfo.IME_ACTION_SEND) { - reportIssue() - return@setOnEditorActionListener true - } - false - } + inputPassword.setOnEditorActionListener { _, actionId, _ -> + if (actionId == EditorInfo.IME_ACTION_SEND) { + reportIssue() + return@setOnEditorActionListener true + } + false + } - airTextDeviceInfo.setOnClickListener { copyDeviceInfoToClipBoard() } + airTextDeviceInfo.setOnClickListener { copyDeviceInfoToClipBoard() } - TintHelper.setTintAuto(sendFab, accentColor, true) - sendFab.setOnClickListener { reportIssue() } + TintHelper.setTintAuto(sendFab, accentColor, true) + sendFab.setOnClickListener { reportIssue() } - MaterialUtil.setTint(inputLayoutTitle, false) - MaterialUtil.setTint(inputLayoutDescription, false) - MaterialUtil.setTint(inputLayoutUsername, false) - MaterialUtil.setTint(inputLayoutPassword, false) - } + MaterialUtil.setTint(inputLayoutTitle, false) + MaterialUtil.setTint(inputLayoutDescription, false) + MaterialUtil.setTint(inputLayoutUsername, false) + MaterialUtil.setTint(inputLayoutPassword, false) + } - private fun reportIssue() { - if (optionUseAccount.isChecked) { - if (!validateInput()) return - val username = inputUsername.text.toString() - val password = inputPassword.text.toString() - sendBugReport(GithubLogin(username, password)) - } else { - copyDeviceInfoToClipBoard() + private fun reportIssue() { + if (optionUseAccount.isChecked) { + if (!validateInput()) return + val username = inputUsername.text.toString() + val password = inputPassword.text.toString() + sendBugReport(GithubLogin(username, password)) + } else { + copyDeviceInfoToClipBoard() - val i = Intent(Intent.ACTION_VIEW) - i.data = Uri.parse(ISSUE_TRACKER_LINK) - i.flags = Intent.FLAG_ACTIVITY_NEW_TASK - startActivity(i) - } - } + val i = Intent(Intent.ACTION_VIEW) + i.data = Uri.parse(ISSUE_TRACKER_LINK) + i.flags = Intent.FLAG_ACTIVITY_NEW_TASK + startActivity(i) + } + } - private fun copyDeviceInfoToClipBoard() { - val clipboard = getSystemService(Context.CLIPBOARD_SERVICE) as ClipboardManager - val clip = ClipData.newPlainText(getString(R.string.device_info), deviceInfo?.toMarkdown()) - clipboard.primaryClip = clip - Toast.makeText(this@BugReportActivity, R.string.copied_device_info_to_clipboard, Toast.LENGTH_LONG).show() - } + private fun copyDeviceInfoToClipBoard() { + val clipboard = getSystemService(Context.CLIPBOARD_SERVICE) as ClipboardManager + val clip = ClipData.newPlainText(getString(R.string.device_info), deviceInfo?.toMarkdown()) + clipboard.primaryClip = clip + Toast.makeText( + this@BugReportActivity, + R.string.copied_device_info_to_clipboard, + Toast.LENGTH_LONG + ).show() + } - private fun validateInput(): Boolean { - var hasErrors = false + private fun validateInput(): Boolean { + var hasErrors = false - if (optionUseAccount.isChecked) { - if (TextUtils.isEmpty(inputUsername.text)) { - setError(inputLayoutUsername, R.string.bug_report_no_username) - hasErrors = true - } else { - removeError(inputLayoutUsername) - } + if (optionUseAccount.isChecked) { + if (TextUtils.isEmpty(inputUsername.text)) { + setError(inputLayoutUsername, R.string.bug_report_no_username) + hasErrors = true + } else { + removeError(inputLayoutUsername) + } - if (TextUtils.isEmpty(inputPassword.text)) { - setError(inputLayoutPassword, R.string.bug_report_no_password) - hasErrors = true - } else { - removeError(inputLayoutPassword) - } - } + if (TextUtils.isEmpty(inputPassword.text)) { + setError(inputLayoutPassword, R.string.bug_report_no_password) + hasErrors = true + } else { + removeError(inputLayoutPassword) + } + } - if (TextUtils.isEmpty(inputTitle.text)) { - setError(inputLayoutTitle, R.string.bug_report_no_title) - hasErrors = true - } else { - removeError(inputLayoutTitle) - } + if (TextUtils.isEmpty(inputTitle.text)) { + setError(inputLayoutTitle, R.string.bug_report_no_title) + hasErrors = true + } else { + removeError(inputLayoutTitle) + } - if (TextUtils.isEmpty(inputDescription.text)) { - setError(inputLayoutDescription, R.string.bug_report_no_description) - hasErrors = true - } else { - removeError(inputLayoutDescription) - } + if (TextUtils.isEmpty(inputDescription.text)) { + setError(inputLayoutDescription, R.string.bug_report_no_description) + hasErrors = true + } else { + removeError(inputLayoutDescription) + } - return !hasErrors - } + return !hasErrors + } - private fun setError(editTextLayout: TextInputLayout, @StringRes errorRes: Int) { - editTextLayout.error = getString(errorRes) - } + private fun setError(editTextLayout: TextInputLayout, @StringRes errorRes: Int) { + editTextLayout.error = getString(errorRes) + } - private fun removeError(editTextLayout: TextInputLayout) { - editTextLayout.error = null - } + private fun removeError(editTextLayout: TextInputLayout) { + editTextLayout.error = null + } - private fun sendBugReport(login: GithubLogin) { - if (!validateInput()) return + private fun sendBugReport(login: GithubLogin) { + if (!validateInput()) return - val bugTitle = inputTitle.text.toString() - val bugDescription = inputDescription.text.toString() + val bugTitle = inputTitle.text.toString() + val bugDescription = inputDescription.text.toString() - val extraInfo = ExtraInfo() - onSaveExtraInfo() + val extraInfo = ExtraInfo() + onSaveExtraInfo() - val report = Report(bugTitle, bugDescription, deviceInfo, extraInfo) - val target = GithubTarget("h4h13", "RetroMusicPlayer") + val report = Report(bugTitle, bugDescription, deviceInfo, extraInfo) + val target = GithubTarget("h4h13", "RetroMusicPlayer") - ReportIssueAsyncTask.report(this, report, target, login) - } + ReportIssueAsyncTask.report(this, report, target, login) + } - private fun onSaveExtraInfo() {} + private fun onSaveExtraInfo() {} - override fun onOptionsItemSelected(item: MenuItem): Boolean { - if (item.itemId == android.R.id.home) { - onBackPressed() - } - return super.onOptionsItemSelected(item) - } + override fun onOptionsItemSelected(item: MenuItem): Boolean { + if (item.itemId == android.R.id.home) { + onBackPressed() + } + return super.onOptionsItemSelected(item) + } - private class ReportIssueAsyncTask private constructor(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() - } + private class ReportIssueAsyncTask private constructor( + 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() + } - @Result - override fun doInBackground(vararg params: Void): String { - val client: GitHubClient = if (login.shouldUseApiToken()) { - GitHubClient().setOAuth2Token(login.apiToken) - } else { - GitHubClient().setCredentials(login.username, login.password) - } + @Result + override fun doInBackground(vararg params: Void): String { + val client: GitHubClient = if (login.shouldUseApiToken()) { + GitHubClient().setOAuth2Token(login.apiToken) + } else { + GitHubClient().setCredentials(login.username, login.password) + } - val issue = Issue().setTitle(report.title).setBody(report.description) - try { - IssueService(client).createIssue(target.username, target.repository, issue) - return RESULT_SUCCESS - } catch (e: RequestException) { - return when (e.status) { - STATUS_BAD_CREDENTIALS -> { - if (login.shouldUseApiToken()) RESULT_INVALID_TOKEN else RESULT_BAD_CREDENTIALS - } - STATUS_ISSUES_NOT_ENABLED -> RESULT_ISSUES_NOT_ENABLED - else -> { - e.printStackTrace() - RESULT_UNKNOWN - } - } - } catch (e: IOException) { - e.printStackTrace() - return RESULT_UNKNOWN - } + val issue = Issue().setTitle(report.title).setBody(report.description) + try { + IssueService(client).createIssue(target.username, target.repository, issue) + return RESULT_SUCCESS + } catch (e: RequestException) { + return when (e.status) { + STATUS_BAD_CREDENTIALS -> { + if (login.shouldUseApiToken()) RESULT_INVALID_TOKEN else RESULT_BAD_CREDENTIALS + } + STATUS_ISSUES_NOT_ENABLED -> RESULT_ISSUES_NOT_ENABLED + else -> { + e.printStackTrace() + RESULT_UNKNOWN + } + } + } catch (e: IOException) { + e.printStackTrace() + return RESULT_UNKNOWN + } - } + } - override fun onPostExecute(@Result result: String) { - super.onPostExecute(result) + override fun onPostExecute(@Result result: String) { + super.onPostExecute(result) - val context = context ?: return + val context = context ?: return - when (result) { - RESULT_SUCCESS -> tryToFinishActivity() - RESULT_BAD_CREDENTIALS -> MaterialDialog(context).show { - title(R.string.bug_report_failed) - message(R.string.bug_report_failed_wrong_credentials) - positiveButton(android.R.string.ok) - } - RESULT_INVALID_TOKEN -> MaterialDialog(context).show { - title(R.string.bug_report_failed) - message(R.string.bug_report_failed_invalid_token) - positiveButton(android.R.string.ok) - } - RESULT_ISSUES_NOT_ENABLED -> MaterialDialog(context).show { - title(R.string.bug_report_failed) - message(R.string.bug_report_failed_issues_not_available) - positiveButton(android.R.string.ok) - } - else -> MaterialDialog(context).show { - title(R.string.bug_report_failed) - message(R.string.bug_report_failed_unknown) - positiveButton(android.R.string.ok) { tryToFinishActivity() } - onCancel { tryToFinishActivity() } - } - } - } + when (result) { + RESULT_SUCCESS -> tryToFinishActivity() + RESULT_BAD_CREDENTIALS -> MaterialDialog(context).show { + title(R.string.bug_report_failed) + message(R.string.bug_report_failed_wrong_credentials) + positiveButton(android.R.string.ok) + } + RESULT_INVALID_TOKEN -> MaterialDialog(context).show { + title(R.string.bug_report_failed) + message(R.string.bug_report_failed_invalid_token) + positiveButton(android.R.string.ok) + } + RESULT_ISSUES_NOT_ENABLED -> MaterialDialog(context).show { + title(R.string.bug_report_failed) + message(R.string.bug_report_failed_issues_not_available) + positiveButton(android.R.string.ok) + } + else -> MaterialDialog(context).show { + title(R.string.bug_report_failed) + message(R.string.bug_report_failed_unknown) + positiveButton(android.R.string.ok) { tryToFinishActivity() } + onCancel { tryToFinishActivity() } + } + } + } - private fun tryToFinishActivity() { - val context = context - if (context is Activity && !context.isFinishing) { - context.finish() - } - } + private fun tryToFinishActivity() { + val context = context + if (context is Activity && !context.isFinishing) { + context.finish() + } + } - companion object { + companion object { - fun report(activity: Activity, report: Report, target: GithubTarget, login: GithubLogin) { - ReportIssueAsyncTask(activity, report, target, login).execute() - } - } - } + fun report( + activity: Activity, + report: Report, + target: GithubTarget, + login: GithubLogin + ) { + ReportIssueAsyncTask(activity, report, target, login).execute() + } + } + } - companion object { + companion object { - private const val STATUS_BAD_CREDENTIALS = 401 - private const val STATUS_ISSUES_NOT_ENABLED = 410 - private const val ISSUE_TRACKER_LINK = "https://github.com/h4h13/RetroMusicPlayer" - } + private const val STATUS_BAD_CREDENTIALS = 401 + private const val STATUS_ISSUES_NOT_ENABLED = 410 + private const val ISSUE_TRACKER_LINK = "https://github.com/h4h13/RetroMusicPlayer" + } } diff --git a/app/src/main/java/code/name/monkey/retromusic/activities/bugreport/ErrorHandlerActivity.kt b/app/src/main/java/code/name/monkey/retromusic/activities/bugreport/ErrorHandlerActivity.kt deleted file mode 100644 index 737653299..000000000 --- a/app/src/main/java/code/name/monkey/retromusic/activities/bugreport/ErrorHandlerActivity.kt +++ /dev/null @@ -1 +0,0 @@ -package code.name.monkey.retromusic.activities.bugreport import android.content.ActivityNotFoundException import android.content.Intent import android.net.Uri import android.os.Bundle import androidx.appcompat.app.AppCompatActivity import code.name.monkey.retromusic.R import code.name.monkey.retromusic.activities.bugreport.model.DeviceInfo import kotlinx.android.synthetic.main.activity_error_handler.* class ErrorHandlerActivity : AppCompatActivity() { private var deviceInfo: DeviceInfo? = null override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_error_handler) deviceInfo = DeviceInfo(this) clearAppData.setOnClickListener { try { val intent = Intent(android.provider.Settings.ACTION_APPLICATION_DETAILS_SETTINGS) intent.data = Uri.parse("package:$packageName") startActivity(intent) } catch (e: ActivityNotFoundException) { val intent = Intent(android.provider.Settings.ACTION_MANAGE_APPLICATIONS_SETTINGS) startActivity(intent) } } sendCrashLog.setOnClickListener { val sendIntent = Intent(Intent.ACTION_SEND) val subject = "Error report" val body = intent.getStringExtra("error") + "\n" + deviceInfo!!.toString() sendIntent.putExtra(Intent.EXTRA_EMAIL, arrayOf("monkeycodeapp@gmail.com")) sendIntent.putExtra(Intent.EXTRA_TEXT, body) sendIntent.putExtra(Intent.EXTRA_SUBJECT, subject) sendIntent.type = "message/rfc822" startActivity(Intent.createChooser(sendIntent, "Send crash log")) deleteFile("stack.trace") } showCrashError.text = String.format("%s", intent.getStringExtra("error")) showCrashError.append(deviceInfo!!.toString()) } } \ No newline at end of file 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 ec6c4a7a5..4e7ea77eb 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 @@ -6,9 +6,10 @@ import android.content.pm.PackageInfo; import android.content.pm.PackageManager; import android.os.Build; +import androidx.annotation.IntRange; + import java.util.Arrays; -import androidx.annotation.IntRange; import code.name.monkey.retromusic.util.PreferenceUtil; public class DeviceInfo { 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 42546517f..df8cbe297 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,405 +1,416 @@ package code.name.monkey.retromusic.activities.tageditor -import android.app.Activity -import android.app.SearchManager +import android.app.* import android.content.Intent import android.content.res.ColorStateList -import android.graphics.Bitmap -import android.graphics.BitmapFactory +import android.graphics.* import android.net.Uri -import android.os.Build -import android.os.Bundle +import android.os.* import android.util.Log -import android.view.MenuItem -import android.view.View +import android.view.* import android.view.animation.OvershootInterpolator import code.name.monkey.appthemehelper.ThemeStore -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.appthemehelper.util.* 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.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 code.name.monkey.retromusic.util.* +import com.afollestad.materialdialogs.* 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.AudioFile -import org.jaudiotagger.audio.AudioFileIO +import org.jaudiotagger.audio.* import org.jaudiotagger.tag.FieldKey import java.io.File import java.util.* - 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 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 composer: String? - get() { - return try { - getAudioFile(songPaths!![0]).tagOrCreateAndSetDefault.getFirst(FieldKey.COMPOSER) - } catch (ignored: Exception) { - null - } + } - } + protected val albumTitle: String? + get() { + return try { + getAudioFile(songPaths!![0]).tagOrCreateAndSetDefault.getFirst(FieldKey.ALBUM) + } catch (ignored: Exception) { + null + } - protected val albumTitle: String? - get() { - return try { - getAudioFile(songPaths!![0]).tagOrCreateAndSetDefault.getFirst(FieldKey.ALBUM) - } catch (ignored: Exception) { - null - } + } - } + protected val artistName: String? + get() { + return try { + getAudioFile(songPaths!![0]).tagOrCreateAndSetDefault.getFirst(FieldKey.ARTIST) + } 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 albumArtistName: String? - get() { - return try { - getAudioFile(songPaths!![0]).tagOrCreateAndSetDefault - .getFirst(FieldKey.ALBUM_ARTIST) - } catch (ignored: Exception) { - null - } + } - } + protected val genreName: String? + get() { + return try { + getAudioFile(songPaths!![0]).tagOrCreateAndSetDefault.getFirst(FieldKey.GENRE) + } 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 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 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 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() - 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 - } + setNavigationbarColorAuto() + setTaskDescriptionColorAuto() + } - } + private fun setUpViews() { + setUpScrollView() + setUpFab() + setUpImageView() + } - override fun onCreate(savedInstanceState: Bundle?) { - super.onCreate(savedInstanceState) - setContentView(contentViewLayout) + private fun setUpScrollView() { + //observableScrollView.setScrollViewCallbacks(observableScrollViewCallbacks); + } - saveFab = findViewById(R.id.saveTags) - getIntentExtras() + private lateinit var items: List - songPaths = getSongPaths() - if (songPaths!!.isEmpty()) { - finish() - return - } + 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 } + } - setUpViews() + 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() - setNavigationbarColorAuto() - setTaskDescriptionColorAuto() - } + protected abstract fun searchImageOnWeb() - private fun setUpViews() { - setUpScrollView() - setUpFab() - setUpImageView() - } + protected abstract fun deleteImage() - private fun setUpScrollView() { - //observableScrollView.setScrollViewCallbacks(observableScrollViewCallbacks); - } + 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 lateinit var items: List + protected abstract fun save() - 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 getIntentExtras() { + val intentExtras = intent.extras + if (intentExtras != null) { + id = intentExtras.getInt(EXTRA_ID) + } + } - 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 getSongPaths(): List - protected abstract fun loadCurrentImage() + 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 abstract fun searchImageOnWeb() + startActivity(intent) + } - protected abstract fun deleteImage() + override fun onOptionsItemSelected(item: MenuItem): Boolean { + when (item.itemId) { + android.R.id.home -> { + super.onBackPressed() + return true + } + } + return super.onOptionsItemSelected(item) + } - 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 fun setNoImageMode() { + isInNoImageMode = true + imageContainer?.visibility = View.GONE + editorImage?.visibility = View.GONE + editorImage?.isEnabled = false - protected abstract fun save() + setColors( + intent.getIntExtra( + EXTRA_PALETTE, + ATHUtil.resolveColor(this, R.attr.colorPrimary) + ) + ) + } - private fun getIntentExtras() { - val intentExtras = intent.extras - if (intentExtras != null) { - id = intentExtras.getInt(EXTRA_ID) - } - } + protected fun dataChanged() { + showFab() + } - protected abstract fun getSongPaths(): List + private fun showFab() { + saveFab.animate().setDuration(500).setInterpolator(OvershootInterpolator()).scaleX(1f) + .scaleY(1f).start() + saveFab.isEnabled = true + } - 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) + private fun hideFab() { + saveFab.animate().setDuration(500).setInterpolator(OvershootInterpolator()).scaleX(0.0f) + .scaleY(0.0f).start() + saveFab.isEnabled = false + } - startActivity(intent) - } + 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) + } - override fun onOptionsItemSelected(item: MenuItem): Boolean { - when (item.itemId) { - android.R.id.home -> { - super.onBackPressed() - return true - } - } - return super.onOptionsItemSelected(item) - } + protected open fun setColors(color: Int) { + paletteColorPrimary = color + } - protected fun setNoImageMode() { - isInNoImageMode = true - imageContainer?.visibility = View.GONE - editorImage?.visibility = View.GONE - editorImage?.isEnabled = false + protected fun writeValuesToFiles( + fieldKeyValueMap: Map, artworkInfo: ArtworkInfo? + ) { + RetroUtil.hideSoftKeyboard(this) - setColors(intent.getIntExtra(EXTRA_PALETTE, ATHUtil.resolveColor(this, R.attr.colorPrimary))) - } + hideFab() - protected fun dataChanged() { - showFab() - } + savedSongPaths = getSongPaths() + savedTags = fieldKeyValueMap + savedArtworkInfo = artworkInfo - private fun showFab() { - saveFab.animate() - .setDuration(500) - .setInterpolator(OvershootInterpolator()) - .scaleX(1f) - .scaleY(1f) - .start() - saveFab.isEnabled = true - } + 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 hideFab() { - saveFab.animate() - .setDuration(500) - .setInterpolator(OvershootInterpolator()) - .scaleX(0.0f) - .scaleY(0.0f) - .start() - saveFab.isEnabled = false - } + private fun writeTags(paths: List?) { + WriteTagsAsyncTask(this).execute( + WriteTagsAsyncTask.LoadingInfo( + paths, + savedTags, + savedArtworkInfo + ) + ) + } - 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) - } + 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 open fun setColors(color: Int) { - paletteColorPrimary = color - } + protected abstract fun loadImageFromFile(selectedFile: Uri?) - protected fun writeValuesToFiles(fieldKeyValueMap: Map, - artworkInfo: ArtworkInfo?) { - RetroUtil.hideSoftKeyboard(this) + 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() + } + } - hideFab() + class ArtworkInfo constructor(val albumId: Int, val artwork: Bitmap?) - savedSongPaths = getSongPaths() - savedTags = fieldKeyValueMap - savedArtworkInfo = artworkInfo + companion object { - 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)) - } - - 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?) - - 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?) - - 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 54e8c304c..8ec1de22a 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 @@ -2,27 +2,20 @@ package code.name.monkey.retromusic.activities.tageditor import android.app.Activity import android.content.res.ColorStateList -import android.graphics.Bitmap -import android.graphics.BitmapFactory -import android.graphics.Color +import android.graphics.* import android.graphics.drawable.Drawable import android.net.Uri import android.os.Bundle -import android.text.Editable -import android.text.TextUtils -import android.text.TextWatcher +import android.text.* import android.widget.Toast -import code.name.monkey.appthemehelper.util.ATHUtil -import code.name.monkey.appthemehelper.util.MaterialUtil +import code.name.monkey.appthemehelper.util.* import code.name.monkey.retromusic.R import code.name.monkey.retromusic.extensions.appHandleColor -import code.name.monkey.retromusic.glide.palette.BitmapPaletteTranscoder -import code.name.monkey.retromusic.glide.palette.BitmapPaletteWrapper +import code.name.monkey.retromusic.glide.palette.* import code.name.monkey.retromusic.loaders.AlbumLoader import code.name.monkey.retromusic.rest.LastFMRestClient import code.name.monkey.retromusic.rest.model.LastFmAlbum -import code.name.monkey.retromusic.util.ImageUtil -import code.name.monkey.retromusic.util.LastFMUtil +import code.name.monkey.retromusic.util.* import code.name.monkey.retromusic.util.RetroColorUtil.generatePalette import code.name.monkey.retromusic.util.RetroColorUtil.getColor import com.bumptech.glide.Glide @@ -34,181 +27,224 @@ import kotlinx.android.synthetic.main.activity_album_tag_editor.* import org.jaudiotagger.tag.FieldKey import java.util.* - 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() { - toolbar.setBackgroundColor(ATHUtil.resolveColor(this, R.attr.colorPrimary)) - setSupportActionBar(toolbar) - supportActionBar?.setDisplayShowHomeEnabled(true) - } + private fun setupToolbar() { + toolbar.setBackgroundColor(ATHUtil.resolveColor(this, R.attr.colorPrimary)) + setSupportActionBar(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 onTextChanged(s: CharSequence, start: Int, before: Int, count: Int) { + override fun afterTextChanged(s: Editable) { + dataChanged() + } - } + override fun setColors(color: Int) { + super.setColors(color) + saveFab.backgroundTintList = ColorStateList.valueOf(color) + } - override fun afterTextChanged(s: Editable) { - dataChanged() - } + companion object { - 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 a52277d6e..8c3f7c210 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 @@ -2,13 +2,10 @@ package code.name.monkey.retromusic.activities.tageditor import android.net.Uri import android.os.Bundle -import android.text.Editable -import android.text.TextWatcher +import android.text.* import androidx.core.content.ContextCompat import code.name.monkey.appthemehelper.ThemeStore -import code.name.monkey.appthemehelper.util.ATHUtil -import code.name.monkey.appthemehelper.util.MaterialUtil -import code.name.monkey.appthemehelper.util.TintHelper +import code.name.monkey.appthemehelper.util.* import code.name.monkey.retromusic.R import code.name.monkey.retromusic.extensions.appHandleColor import code.name.monkey.retromusic.loaders.SongLoader @@ -16,118 +13,127 @@ import kotlinx.android.synthetic.main.activity_song_tag_editor.* import org.jaudiotagger.tag.FieldKey import java.util.* - class SongTagEditorActivity : AbsTagEditorActivity(), TextWatcher { - override val contentViewLayout: Int - get() = R.layout.activity_song_tag_editor + override val contentViewLayout: Int + get() = R.layout.activity_song_tag_editor - private fun setupToolbar() { - appBarLayout.setBackgroundColor(ATHUtil.resolveColor(this, R.attr.colorPrimary)) - toolbar.apply { - setBackgroundColor(ATHUtil.resolveColor(this@SongTagEditorActivity, R.attr.colorPrimary)) - navigationIcon = TintHelper.createTintedDrawable(ContextCompat.getDrawable(context, R.drawable.ic_keyboard_backspace_black_24dp), ThemeStore.textColorPrimary(context)) - setNavigationOnClickListener { onBackPressed() } - setSupportActionBar(toolbar) - } - title = null - } + private fun setupToolbar() { + appBarLayout.setBackgroundColor(ATHUtil.resolveColor(this, R.attr.colorPrimary)) + toolbar.apply { + setBackgroundColor( + ATHUtil.resolveColor( + this@SongTagEditorActivity, + R.attr.colorPrimary + ) + ) + navigationIcon = TintHelper.createTintedDrawable( + ContextCompat.getDrawable( + context, + R.drawable.ic_keyboard_backspace_black_24dp + ), ThemeStore.textColorPrimary(context) + ) + setNavigationOnClickListener { onBackPressed() } + setSupportActionBar(toolbar) + } + title = null + } - override fun onCreate(savedInstanceState: Bundle?) { - super.onCreate(savedInstanceState) + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) - setNoImageMode() - setUpViews() - setupToolbar() - setStatusbarColorAuto() - } + setNoImageMode() + setUpViews() + setupToolbar() + setStatusbarColorAuto() + } - private fun setUpViews() { - fillViewsWithFileTags() - MaterialUtil.setTint(songTextContainer, false) - MaterialUtil.setTint(composerContainer, false) - MaterialUtil.setTint(albumTextContainer, false) - MaterialUtil.setTint(artistContainer, false) - MaterialUtil.setTint(albumArtistContainer, false) - MaterialUtil.setTint(yearContainer, false) - MaterialUtil.setTint(genreContainer, false) - MaterialUtil.setTint(trackNumberContainer, false) - MaterialUtil.setTint(lyricsContainer, false) + private fun setUpViews() { + fillViewsWithFileTags() + MaterialUtil.setTint(songTextContainer, false) + MaterialUtil.setTint(composerContainer, false) + MaterialUtil.setTint(albumTextContainer, false) + MaterialUtil.setTint(artistContainer, false) + MaterialUtil.setTint(albumArtistContainer, false) + MaterialUtil.setTint(yearContainer, false) + MaterialUtil.setTint(genreContainer, false) + MaterialUtil.setTint(trackNumberContainer, false) + MaterialUtil.setTint(lyricsContainer, false) - songText.appHandleColor().addTextChangedListener(this) - albumText.appHandleColor().addTextChangedListener(this) - albumArtistText.appHandleColor().addTextChangedListener(this) - artistText.appHandleColor().addTextChangedListener(this) - genreText.appHandleColor().addTextChangedListener(this) - yearText.appHandleColor().addTextChangedListener(this) - trackNumberText.appHandleColor().addTextChangedListener(this) - lyricsText.appHandleColor().addTextChangedListener(this) - songComposerText.appHandleColor().addTextChangedListener(this) - } + songText.appHandleColor().addTextChangedListener(this) + albumText.appHandleColor().addTextChangedListener(this) + albumArtistText.appHandleColor().addTextChangedListener(this) + artistText.appHandleColor().addTextChangedListener(this) + genreText.appHandleColor().addTextChangedListener(this) + yearText.appHandleColor().addTextChangedListener(this) + trackNumberText.appHandleColor().addTextChangedListener(this) + lyricsText.appHandleColor().addTextChangedListener(this) + songComposerText.appHandleColor().addTextChangedListener(this) + } - private fun fillViewsWithFileTags() { - songText.setText(songTitle) - albumArtistText.setText(albumArtist) - albumText.setText(albumTitle) - artistText.setText(artistName) - genreText.setText(genreName) - yearText.setText(songYear) - trackNumberText.setText(trackNumber) - lyricsText.setText(lyrics) - songComposerText.setText(composer) - } + private fun fillViewsWithFileTags() { + songText.setText(songTitle) + albumArtistText.setText(albumArtist) + albumText.setText(albumTitle) + artistText.setText(artistName) + genreText.setText(genreName) + yearText.setText(songYear) + trackNumberText.setText(trackNumber) + lyricsText.setText(lyrics) + songComposerText.setText(composer) + } - override fun loadCurrentImage() { + override fun loadCurrentImage() { - } + } - override fun searchImageOnWeb() { + override fun searchImageOnWeb() { - } + } - override fun deleteImage() { + override fun deleteImage() { - } + } - override fun save() { - val fieldKeyValueMap = EnumMap(FieldKey::class.java) - fieldKeyValueMap[FieldKey.TITLE] = songText.text.toString() - fieldKeyValueMap[FieldKey.ALBUM] = albumText.text.toString() - fieldKeyValueMap[FieldKey.ARTIST] = artistText.text.toString() - fieldKeyValueMap[FieldKey.GENRE] = genreText.text.toString() - fieldKeyValueMap[FieldKey.YEAR] = yearText.text.toString() - fieldKeyValueMap[FieldKey.TRACK] = trackNumberText.text.toString() - fieldKeyValueMap[FieldKey.LYRICS] = lyricsText.text.toString() - fieldKeyValueMap[FieldKey.ALBUM_ARTIST] = albumArtistText.text.toString() - fieldKeyValueMap[FieldKey.COMPOSER] = songComposerText.text.toString() - writeValuesToFiles(fieldKeyValueMap, null) - } + override fun save() { + val fieldKeyValueMap = EnumMap(FieldKey::class.java) + fieldKeyValueMap[FieldKey.TITLE] = songText.text.toString() + fieldKeyValueMap[FieldKey.ALBUM] = albumText.text.toString() + fieldKeyValueMap[FieldKey.ARTIST] = artistText.text.toString() + fieldKeyValueMap[FieldKey.GENRE] = genreText.text.toString() + fieldKeyValueMap[FieldKey.YEAR] = yearText.text.toString() + fieldKeyValueMap[FieldKey.TRACK] = trackNumberText.text.toString() + fieldKeyValueMap[FieldKey.LYRICS] = lyricsText.text.toString() + fieldKeyValueMap[FieldKey.ALBUM_ARTIST] = albumArtistText.text.toString() + fieldKeyValueMap[FieldKey.COMPOSER] = songComposerText.text.toString() + writeValuesToFiles(fieldKeyValueMap, null) + } - override fun getSongPaths(): List { - val paths = ArrayList(1) - paths.add(SongLoader.getSong(this, id).data) - return paths - } + override fun getSongPaths(): List { + val paths = ArrayList(1) + paths.add(SongLoader.getSong(this, id).data) + return paths + } - override fun loadImageFromFile(selectedFile: Uri?) { + override fun loadImageFromFile(selectedFile: Uri?) { - } + } - 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 onTextChanged(s: CharSequence, start: Int, before: Int, count: Int) { - } + } - override fun afterTextChanged(s: Editable) { - dataChanged() - } + override fun afterTextChanged(s: Editable) { + dataChanged() + } - companion object { - val TAG: String = SongTagEditorActivity::class.java.simpleName - } + companion object { + val TAG: String = SongTagEditorActivity::class.java.simpleName + } } diff --git a/app/src/main/java/code/name/monkey/retromusic/adapter/ContributorAdapter.kt b/app/src/main/java/code/name/monkey/retromusic/adapter/ContributorAdapter.kt index 376c6825c..df7fec524 100644 --- a/app/src/main/java/code/name/monkey/retromusic/adapter/ContributorAdapter.kt +++ b/app/src/main/java/code/name/monkey/retromusic/adapter/ContributorAdapter.kt @@ -1,9 +1,7 @@ package code.name.monkey.retromusic.adapter import android.app.Activity -import android.view.LayoutInflater -import android.view.View -import android.view.ViewGroup +import android.view.* import android.widget.TextView import androidx.recyclerview.widget.RecyclerView import code.name.monkey.retromusic.R @@ -13,56 +11,64 @@ import code.name.monkey.retromusic.views.CircularImageView import com.bumptech.glide.Glide class ContributorAdapter( - private var contributors: List + private var contributors: List ) : RecyclerView.Adapter() { - override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder { - return if (viewType == HEADER) { - ViewHolder(LayoutInflater.from(parent.context).inflate(R.layout.item_contributor_header, parent, false)) - } else - ViewHolder(LayoutInflater.from(parent.context).inflate(R.layout.item_contributor, parent, false)) - } + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder { + return if (viewType == HEADER) { + ViewHolder( + LayoutInflater.from(parent.context).inflate( + R.layout.item_contributor_header, + parent, + false + ) + ) + } else ViewHolder( + LayoutInflater.from(parent.context).inflate( + R.layout.item_contributor, + parent, + false + ) + ) + } - companion object { - const val HEADER: Int = 0 - const val ITEM: Int = 1 - } + companion object { + const val HEADER: Int = 0 + const val ITEM: Int = 1 + } - override fun getItemViewType(position: Int): Int { - return if (position == 0) { - HEADER - } else { - ITEM - } - } + override fun getItemViewType(position: Int): Int { + return if (position == 0) { + HEADER + } else { + ITEM + } + } - override fun onBindViewHolder(holder: ViewHolder, position: Int) { - val contributor = contributors[position] - holder.bindData(contributor) - holder.itemView.setOnClickListener { - openUrl(it?.context as Activity, contributors[position].link) - } - } + override fun onBindViewHolder(holder: ViewHolder, position: Int) { + val contributor = contributors[position] + holder.bindData(contributor) + holder.itemView.setOnClickListener { + openUrl(it?.context as Activity, contributors[position].link) + } + } - override fun getItemCount(): Int { - return contributors.size - } + override fun getItemCount(): Int { + return contributors.size + } - inner class ViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { - val title: TextView = itemView.findViewById(R.id.title) - val text: TextView = itemView.findViewById(R.id.text) - val image: CircularImageView = itemView.findViewById(R.id.icon) + inner class ViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { + val title: TextView = itemView.findViewById(R.id.title) + val text: TextView = itemView.findViewById(R.id.text) + val image: CircularImageView = itemView.findViewById(R.id.icon) - internal fun bindData(contributor: Contributor) { - title.text = contributor.name - text.text = contributor.summary - println(contributor.profileImage) - Glide.with(image.context) - .load(contributor.profileImage) - .error(R.drawable.ic_account_white_24dp) - .placeholder(R.drawable.ic_account_white_24dp) - .dontAnimate() - .into(image) - } - } + internal fun bindData(contributor: Contributor) { + title.text = contributor.name + text.text = contributor.summary + println(contributor.profileImage) + Glide.with(image.context).load(contributor.profileImage) + .error(R.drawable.ic_account_white_24dp) + .placeholder(R.drawable.ic_account_white_24dp).dontAnimate().into(image) + } + } } diff --git a/app/src/main/java/code/name/monkey/retromusic/adapter/GenreAdapter.kt b/app/src/main/java/code/name/monkey/retromusic/adapter/GenreAdapter.kt index 8ea1cf207..4a2dc8735 100644 --- a/app/src/main/java/code/name/monkey/retromusic/adapter/GenreAdapter.kt +++ b/app/src/main/java/code/name/monkey/retromusic/adapter/GenreAdapter.kt @@ -1,9 +1,7 @@ package code.name.monkey.retromusic.adapter import android.app.Activity -import android.view.LayoutInflater -import android.view.View -import android.view.ViewGroup +import android.view.* import androidx.recyclerview.widget.RecyclerView import code.name.monkey.retromusic.R import code.name.monkey.retromusic.adapter.base.MediaEntryViewHolder @@ -16,48 +14,49 @@ import java.util.* */ class GenreAdapter( - private val mActivity: Activity, - dataSet: ArrayList, - private val mItemLayoutRes: Int + private val activity: Activity, dataSet: ArrayList, private val mItemLayoutRes: Int ) : RecyclerView.Adapter() { - var dataSet = ArrayList() - private set + var dataSet = ArrayList() + private set - init { - this.dataSet = dataSet - } + init { + this.dataSet = dataSet + } - override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder { - return ViewHolder(LayoutInflater.from(mActivity).inflate(mItemLayoutRes, parent, false)) - } + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder { + return ViewHolder(LayoutInflater.from(activity).inflate(mItemLayoutRes, parent, false)) + } - override fun onBindViewHolder(holder: ViewHolder, position: Int) { - val genre = dataSet[position] - if (holder.title != null) { - holder.title!!.text = genre.name - } - if (holder.text != null) { - holder.text!!.text = String.format(Locale.getDefault(), "%d %s", genre.songCount, if (genre.songCount > 1) - mActivity.getString(R.string.songs) - else - mActivity.getString(R.string.song)) - } - } + override fun onBindViewHolder(holder: ViewHolder, position: Int) { + val genre = dataSet[position] + if (holder.title != null) { + holder.title!!.text = genre.name + } + if (holder.text != null) { + holder.text!!.text = String.format( + Locale.getDefault(), + "%d %s", + genre.songCount, + if (genre.songCount > 1) activity.getString(R.string.songs) + else activity.getString(R.string.song) + ) + } + } - override fun getItemCount(): Int { - return dataSet.size - } + override fun getItemCount(): Int { + return dataSet.size + } - fun swapDataSet(list: ArrayList) { - dataSet = list - notifyDataSetChanged() - } + fun swapDataSet(list: ArrayList) { + dataSet = list + notifyDataSetChanged() + } - inner class ViewHolder(itemView: View) : MediaEntryViewHolder(itemView) { - override fun onClick(v: View?) { - super.onClick(v) - val genre = dataSet[adapterPosition] - NavigationUtil.goToGenre(mActivity, genre) - } - } + inner class ViewHolder(itemView: View) : MediaEntryViewHolder(itemView) { + override fun onClick(v: View?) { + super.onClick(v) + val genre = dataSet[adapterPosition] + NavigationUtil.goToGenre(activity, genre) + } + } } diff --git a/app/src/main/java/code/name/monkey/retromusic/adapter/HomeAdapter.kt b/app/src/main/java/code/name/monkey/retromusic/adapter/HomeAdapter.kt index 8feac0300..1d6173356 100644 --- a/app/src/main/java/code/name/monkey/retromusic/adapter/HomeAdapter.kt +++ b/app/src/main/java/code/name/monkey/retromusic/adapter/HomeAdapter.kt @@ -1,181 +1,221 @@ package code.name.monkey.retromusic.adapter import android.util.DisplayMetrics -import android.view.LayoutInflater -import android.view.View -import android.view.ViewGroup +import android.view.* import androidx.annotation.IntDef import androidx.appcompat.app.AppCompatActivity -import androidx.recyclerview.widget.GridLayoutManager -import androidx.recyclerview.widget.RecyclerView +import androidx.recyclerview.widget.* import code.name.monkey.retromusic.R import code.name.monkey.retromusic.adapter.album.AlbumFullWidthAdapter import code.name.monkey.retromusic.adapter.artist.ArtistAdapter import code.name.monkey.retromusic.adapter.song.SongAdapter import code.name.monkey.retromusic.extensions.show import code.name.monkey.retromusic.loaders.PlaylistSongsLoader -import code.name.monkey.retromusic.model.Album -import code.name.monkey.retromusic.model.Artist -import code.name.monkey.retromusic.model.Home -import code.name.monkey.retromusic.model.Playlist +import code.name.monkey.retromusic.model.* import code.name.monkey.retromusic.util.PreferenceUtil import com.google.android.material.textview.MaterialTextView - class HomeAdapter( - private val activity: AppCompatActivity, - private val displayMetrics: DisplayMetrics + private val activity: AppCompatActivity, private val displayMetrics: DisplayMetrics ) : RecyclerView.Adapter() { - private var list = ArrayList() + private var list = ArrayList() - override fun getItemViewType(position: Int): Int { - return list[position].homeSection - } + override fun getItemViewType(position: Int): Int { + return list[position].homeSection + } - override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder { - val layout = LayoutInflater.from(activity).inflate(R.layout.section_recycler_view, parent, false) - return when (viewType) { - RECENT_ARTISTS, TOP_ARTISTS -> ArtistViewHolder(layout) - PLAYLISTS -> PlaylistViewHolder(layout) - else -> { - AlbumViewHolder(LayoutInflater.from(activity).inflate(R.layout.metal_section_recycler_view, parent, false)) - } - } - } + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder { + val layout = LayoutInflater.from(activity) + .inflate(R.layout.section_recycler_view, parent, false) + return when (viewType) { + RECENT_ARTISTS, TOP_ARTISTS -> ArtistViewHolder(layout) + PLAYLISTS -> PlaylistViewHolder(layout) + else -> { + AlbumViewHolder( + LayoutInflater.from(activity).inflate( + R.layout.metal_section_recycler_view, + parent, + false + ) + ) + } + } + } - override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) { - println("ViewType ${getItemViewType(position)}") - when (getItemViewType(position)) { - RECENT_ALBUMS -> { - val viewHolder = holder as AlbumViewHolder - viewHolder.bindView(list[position].arrayList.toAlbums(), R.string.recent_albums, R.string.recent_added_albums) - } - TOP_ALBUMS -> { - val viewHolder = holder as AlbumViewHolder - viewHolder.bindView(list[position].arrayList.toAlbums(), R.string.top_albums, R.string.most_played_albums) - } - RECENT_ARTISTS -> { - val viewHolder = holder as ArtistViewHolder - viewHolder.bindView(list[position].arrayList.toArtists(), R.string.recent_artists, R.string.recent_added_artists) - } - TOP_ARTISTS -> { - val viewHolder = holder as ArtistViewHolder + override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) { + println("ViewType ${getItemViewType(position)}") + when (getItemViewType(position)) { + RECENT_ALBUMS -> { + val viewHolder = holder as AlbumViewHolder + viewHolder.bindView( + list[position].arrayList.toAlbums(), + R.string.recent_albums, + R.string.recent_added_albums + ) + } + TOP_ALBUMS -> { + val viewHolder = holder as AlbumViewHolder + viewHolder.bindView( + list[position].arrayList.toAlbums(), + R.string.top_albums, + R.string.most_played_albums + ) + } + RECENT_ARTISTS -> { + val viewHolder = holder as ArtistViewHolder + viewHolder.bindView( + list[position].arrayList.toArtists(), + R.string.recent_artists, + R.string.recent_added_artists + ) + } + TOP_ARTISTS -> { + val viewHolder = holder as ArtistViewHolder - viewHolder.bindView(list[position].arrayList.toArtists(), R.string.top_artists, R.string.most_played_artists) - } - PLAYLISTS -> { - val viewHolder = holder as PlaylistViewHolder - viewHolder.bindView(list[position].arrayList.toPlaylist(), R.string.favorites, R.string.favorites_songs) - } - } - } + viewHolder.bindView( + list[position].arrayList.toArtists(), + R.string.top_artists, + R.string.most_played_artists + ) + } + PLAYLISTS -> { + val viewHolder = holder as PlaylistViewHolder + viewHolder.bindView( + list[position].arrayList.toPlaylist(), + R.string.favorites, + R.string.favorites_songs + ) + } + } + } - override fun getItemCount(): Int { - return list.size - } + override fun getItemCount(): Int { + return list.size + } - fun swapData(sections: ArrayList) { - list = sections - notifyDataSetChanged() - } + fun swapData(sections: ArrayList) { + list = sections + notifyDataSetChanged() + } - companion object { + companion object { - @IntDef(RECENT_ALBUMS, TOP_ALBUMS, RECENT_ARTISTS, TOP_ARTISTS, PLAYLISTS) - @Retention(AnnotationRetention.SOURCE) - annotation class HomeSection + @IntDef(RECENT_ALBUMS, TOP_ALBUMS, RECENT_ARTISTS, TOP_ARTISTS, PLAYLISTS) + @Retention(AnnotationRetention.SOURCE) + annotation class HomeSection - const val RECENT_ALBUMS = 3 - const val TOP_ALBUMS = 1 - const val RECENT_ARTISTS = 2 - const val TOP_ARTISTS = 0 - const val PLAYLISTS = 4 + const val RECENT_ALBUMS = 3 + const val TOP_ALBUMS = 1 + const val RECENT_ARTISTS = 2 + const val TOP_ARTISTS = 0 + const val PLAYLISTS = 4 - } + } - private inner class AlbumViewHolder(view: View) : AbsHomeViewItem(view) { - fun bindView(list: ArrayList, titleRes: Int, subtitleRes: Int) { - if (list.isNotEmpty()) { - recyclerView.apply { - show() - adapter = AlbumFullWidthAdapter(activity, list, displayMetrics) - } - titleContainer.show() - title.text = activity.getString(titleRes) - text.text = activity.getString(subtitleRes) - } - } + private inner class AlbumViewHolder(view: View) : AbsHomeViewItem(view) { + fun bindView(list: ArrayList, titleRes: Int, subtitleRes: Int) { + if (list.isNotEmpty()) { + recyclerView.apply { + show() + adapter = AlbumFullWidthAdapter(activity, list, displayMetrics) + } + titleContainer.show() + title.text = activity.getString(titleRes) + text.text = activity.getString(subtitleRes) + } + } - } + } - inner class ArtistViewHolder(view: View) : AbsHomeViewItem(view) { - fun bindView(list: ArrayList, titleRes: Int, subtitleRes: Int) { - if (list.isNotEmpty()) { - recyclerView.apply { - show() - layoutManager = GridLayoutManager(activity, 1, GridLayoutManager.HORIZONTAL, false) - val artistAdapter = ArtistAdapter(activity, list, - PreferenceUtil.getInstance(activity).getHomeGridStyle(activity), false, null) - adapter = artistAdapter - } - titleContainer.show() - title.text = activity.getString(titleRes) - text.text = activity.getString(subtitleRes) - } - } - } + inner class ArtistViewHolder(view: View) : AbsHomeViewItem(view) { + fun bindView(list: ArrayList, titleRes: Int, subtitleRes: Int) { + if (list.isNotEmpty()) { + recyclerView.apply { + show() + layoutManager = GridLayoutManager( + activity, + 1, + GridLayoutManager.HORIZONTAL, + false + ) + val artistAdapter = ArtistAdapter( + activity, + list, + PreferenceUtil.getInstance(activity).getHomeGridStyle(activity), + false, + null + ) + adapter = artistAdapter + } + titleContainer.show() + title.text = activity.getString(titleRes) + text.text = activity.getString(subtitleRes) + } + } + } - private inner class PlaylistViewHolder(view: View) : AbsHomeViewItem(view) { - fun bindView(arrayList: ArrayList, titleRes: Int, subtitleRes: Int) { - if (arrayList.isNotEmpty()) { - val songs = PlaylistSongsLoader.getPlaylistSongList(activity, arrayList[0]) - if (songs.isNotEmpty()) { - recyclerView.apply { - show() - val songAdapter = SongAdapter(activity, songs, R.layout.item_album_card, false, null) - layoutManager = GridLayoutManager(activity, 1, GridLayoutManager.HORIZONTAL, false) - adapter = songAdapter + private inner class PlaylistViewHolder(view: View) : AbsHomeViewItem(view) { + fun bindView(arrayList: ArrayList, titleRes: Int, subtitleRes: Int) { + if (arrayList.isNotEmpty()) { + val songs = PlaylistSongsLoader.getPlaylistSongList(activity, arrayList[0]) + if (songs.isNotEmpty()) { + recyclerView.apply { + show() + val songAdapter = SongAdapter( + activity, + songs, + R.layout.item_album_card, + false, + null + ) + layoutManager = GridLayoutManager( + activity, + 1, + GridLayoutManager.HORIZONTAL, + false + ) + adapter = songAdapter - } - titleContainer.show() - title.text = activity.getString(titleRes) - text.text = activity.getString(subtitleRes) - } - } - } - } + } + titleContainer.show() + title.text = activity.getString(titleRes) + text.text = activity.getString(subtitleRes) + } + } + } + } - open inner class AbsHomeViewItem(itemView: View) : RecyclerView.ViewHolder(itemView) { - val recyclerView: RecyclerView = itemView.findViewById(R.id.recyclerView) - val titleContainer: View = itemView.findViewById(R.id.titleContainer) - val title: MaterialTextView = itemView.findViewById(R.id.title) - val text: MaterialTextView = itemView.findViewById(R.id.text) - } + open inner class AbsHomeViewItem(itemView: View) : RecyclerView.ViewHolder(itemView) { + val recyclerView: RecyclerView = itemView.findViewById(R.id.recyclerView) + val titleContainer: View = itemView.findViewById(R.id.titleContainer) + val title: MaterialTextView = itemView.findViewById(R.id.title) + val text: MaterialTextView = itemView.findViewById(R.id.text) + } } private fun ArrayList.toAlbums(): ArrayList { - val arrayList = ArrayList() - for (x in this) { - arrayList.add(x as Album) - } - return arrayList; + val arrayList = ArrayList() + for (x in this) { + arrayList.add(x as Album) + } + return arrayList; } private fun ArrayList.toArtists(): ArrayList { - val arrayList = ArrayList() - for (x in this) { - arrayList.add(x as Artist) - } - return arrayList; + val arrayList = ArrayList() + for (x in this) { + arrayList.add(x as Artist) + } + return arrayList; } private fun ArrayList.toPlaylist(): ArrayList { - val arrayList = ArrayList() - for (x in this) { - arrayList.add(x as Playlist) - } - return arrayList; + val arrayList = ArrayList() + for (x in this) { + arrayList.add(x as Playlist) + } + return arrayList; } diff --git a/app/src/main/java/code/name/monkey/retromusic/adapter/SearchAdapter.kt b/app/src/main/java/code/name/monkey/retromusic/adapter/SearchAdapter.kt index e9a976dbf..a699fb54a 100644 --- a/app/src/main/java/code/name/monkey/retromusic/adapter/SearchAdapter.kt +++ b/app/src/main/java/code/name/monkey/retromusic/adapter/SearchAdapter.kt @@ -1,129 +1,140 @@ package code.name.monkey.retromusic.adapter import android.app.ActivityOptions -import android.view.LayoutInflater -import android.view.View -import android.view.ViewGroup +import android.view.* import androidx.appcompat.app.AppCompatActivity import androidx.recyclerview.widget.RecyclerView import code.name.monkey.appthemehelper.ThemeStore import code.name.monkey.retromusic.R import code.name.monkey.retromusic.adapter.base.MediaEntryViewHolder -import code.name.monkey.retromusic.glide.ArtistGlideRequest -import code.name.monkey.retromusic.glide.SongGlideRequest +import code.name.monkey.retromusic.glide.* import code.name.monkey.retromusic.helper.MusicPlayerRemote import code.name.monkey.retromusic.helper.menu.SongMenuHelper -import code.name.monkey.retromusic.model.Album -import code.name.monkey.retromusic.model.Artist -import code.name.monkey.retromusic.model.Song -import code.name.monkey.retromusic.util.MusicUtil -import code.name.monkey.retromusic.util.NavigationUtil +import code.name.monkey.retromusic.model.* +import code.name.monkey.retromusic.util.* import com.bumptech.glide.Glide import android.util.Pair as UtilPair class SearchAdapter( - private val activity: AppCompatActivity, - private var dataSet: List? + private val activity: AppCompatActivity, private var dataSet: List? ) : RecyclerView.Adapter() { - fun swapDataSet(dataSet: MutableList) { - this.dataSet = dataSet - notifyDataSetChanged() - } + fun swapDataSet(dataSet: MutableList) { + this.dataSet = dataSet + notifyDataSetChanged() + } - override fun getItemViewType(position: Int): Int { - if (dataSet!![position] is Album) return ALBUM - if (dataSet!![position] is Artist) return ARTIST - return if (dataSet!![position] is Song) SONG else HEADER - } + override fun getItemViewType(position: Int): Int { + if (dataSet!![position] is Album) return ALBUM + if (dataSet!![position] is Artist) return ARTIST + return if (dataSet!![position] is Song) SONG else HEADER + } - override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder { - return if (viewType == HEADER) ViewHolder(LayoutInflater.from(activity).inflate(R.layout.sub_header, parent, false), viewType) else ViewHolder(LayoutInflater.from(activity).inflate(R.layout.item_list, parent, false), viewType) - } + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder { + return if (viewType == HEADER) ViewHolder( + LayoutInflater.from(activity).inflate( + R.layout.sub_header, + parent, + false + ), viewType + ) else ViewHolder( + LayoutInflater.from(activity).inflate(R.layout.item_list, parent, false), + viewType + ) + } - override fun onBindViewHolder(holder: ViewHolder, position: Int) { - when (getItemViewType(position)) { - ALBUM -> { - val album = dataSet?.get(position) as Album - holder.title?.text = album.title - holder.text?.text = album.artistName - SongGlideRequest.Builder.from(Glide.with(activity), album.safeGetFirstSong()) - .checkIgnoreMediaStore(activity).build() - .into(holder.image) - } - ARTIST -> { - val artist = dataSet?.get(position) as Artist - holder.title?.text = artist.name - holder.text?.text = MusicUtil.getArtistInfoString(activity, artist) - ArtistGlideRequest.Builder.from(Glide.with(activity), artist) - .build().into(holder.image) - } - SONG -> { - val song = dataSet?.get(position) as Song - holder.title?.text = song.title - holder.text?.text = song.albumName - } - else -> { - holder.title?.text = dataSet?.get(position).toString() - holder.title?.setTextColor(ThemeStore.accentColor(activity)) - } - } - } + override fun onBindViewHolder(holder: ViewHolder, position: Int) { + when (getItemViewType(position)) { + ALBUM -> { + val album = dataSet?.get(position) as Album + holder.title?.text = album.title + holder.text?.text = album.artistName + SongGlideRequest.Builder.from(Glide.with(activity), album.safeGetFirstSong()) + .checkIgnoreMediaStore(activity).build().into(holder.image) + } + ARTIST -> { + val artist = dataSet?.get(position) as Artist + holder.title?.text = artist.name + holder.text?.text = MusicUtil.getArtistInfoString(activity, artist) + ArtistGlideRequest.Builder.from(Glide.with(activity), artist).build() + .into(holder.image) + } + SONG -> { + val song = dataSet?.get(position) as Song + holder.title?.text = song.title + holder.text?.text = song.albumName + } + else -> { + holder.title?.text = dataSet?.get(position).toString() + holder.title?.setTextColor(ThemeStore.accentColor(activity)) + } + } + } - override fun getItemCount(): Int { - return dataSet!!.size - } + override fun getItemCount(): Int { + return dataSet!!.size + } - inner class ViewHolder(itemView: View, itemViewType: Int) : MediaEntryViewHolder(itemView) { - init { - itemView.setOnLongClickListener(null) + inner class ViewHolder(itemView: View, itemViewType: Int) : MediaEntryViewHolder(itemView) { + init { + itemView.setOnLongClickListener(null) - if (itemViewType == SONG) { - menu?.visibility = View.VISIBLE - menu?.setOnClickListener(object : SongMenuHelper.OnClickSongMenu(activity) { - override val song: Song - get() = dataSet!![adapterPosition] as Song - }) - } else { - menu?.visibility = View.GONE - } + if (itemViewType == SONG) { + menu?.visibility = View.VISIBLE + menu?.setOnClickListener(object : SongMenuHelper.OnClickSongMenu(activity) { + override val song: Song + get() = dataSet!![adapterPosition] as Song + }) + } else { + menu?.visibility = View.GONE + } - when (itemViewType) { - ALBUM -> setImageTransitionName(activity.getString(R.string.transition_album_art)) - ARTIST -> setImageTransitionName(activity.getString(R.string.transition_artist_image)) - else -> { - val container = itemView.findViewById(R.id.imageContainer) - container?.visibility = View.GONE - } - } - } + when (itemViewType) { + ALBUM -> setImageTransitionName(activity.getString(R.string.transition_album_art)) + ARTIST -> setImageTransitionName(activity.getString(R.string.transition_artist_image)) + else -> { + val container = itemView.findViewById(R.id.imageContainer) + container?.visibility = View.GONE + } + } + } - override fun onClick(v: View?) { - val item = dataSet!![adapterPosition] - when (itemViewType) { - ALBUM -> { - val options = ActivityOptions.makeSceneTransitionAnimation(activity, - UtilPair.create(image, activity.getString(R.string.transition_album_art))) - NavigationUtil.goToAlbumOptions(activity, (item as Album).id, options) - } - ARTIST -> { - val options = ActivityOptions.makeSceneTransitionAnimation(activity, - UtilPair.create(image, activity.getString(R.string.transition_artist_image))) - NavigationUtil.goToArtistOptions(activity, (item as Artist).id, options) - } - SONG -> { - val playList = ArrayList() - playList.add(item as Song) - MusicPlayerRemote.openQueue(playList, 0, true) - } - } - } - } + override fun onClick(v: View?) { + val item = dataSet!![adapterPosition] + when (itemViewType) { + ALBUM -> { + val options = ActivityOptions.makeSceneTransitionAnimation( + activity, + UtilPair.create( + image, + activity.getString(R.string.transition_album_art) + ) + ) + NavigationUtil.goToAlbumOptions(activity, (item as Album).id, options) + } + ARTIST -> { + val options = ActivityOptions.makeSceneTransitionAnimation( + activity, + UtilPair.create( + image, + activity.getString(R.string.transition_artist_image) + ) + ) + NavigationUtil.goToArtistOptions(activity, (item as Artist).id, options) + } + SONG -> { + val playList = ArrayList() + playList.add(item as Song) + MusicPlayerRemote.openQueue(playList, 0, true) + } + } + } + } - companion object { - private const val HEADER = 0 - private const val ALBUM = 1 - private const val ARTIST = 2 - private const val SONG = 3 - } + companion object { + private const val HEADER = 0 + private const val ALBUM = 1 + private const val ARTIST = 2 + private const val SONG = 3 + } } diff --git a/app/src/main/java/code/name/monkey/retromusic/adapter/SongFileAdapter.kt b/app/src/main/java/code/name/monkey/retromusic/adapter/SongFileAdapter.kt index cc169e2dc..e459430c1 100644 --- a/app/src/main/java/code/name/monkey/retromusic/adapter/SongFileAdapter.kt +++ b/app/src/main/java/code/name/monkey/retromusic/adapter/SongFileAdapter.kt @@ -1,15 +1,11 @@ package code.name.monkey.retromusic.adapter import android.graphics.PorterDuff -import android.view.LayoutInflater -import android.view.MenuItem -import android.view.View -import android.view.ViewGroup +import android.view.* import androidx.appcompat.app.AppCompatActivity import code.name.monkey.appthemehelper.util.ATHUtil import code.name.monkey.retromusic.R -import code.name.monkey.retromusic.adapter.base.AbsMultiSelectAdapter -import code.name.monkey.retromusic.adapter.base.MediaEntryViewHolder +import code.name.monkey.retromusic.adapter.base.* import code.name.monkey.retromusic.glide.audiocover.AudioFileCover import code.name.monkey.retromusic.interfaces.CabHolder import code.name.monkey.retromusic.util.RetroUtil @@ -20,162 +16,164 @@ import com.simplecityapps.recyclerview_fastscroll.views.FastScrollRecyclerView import java.io.File import java.text.DecimalFormat import java.util.* -import kotlin.math.log10 -import kotlin.math.pow - +import kotlin.math.* class SongFileAdapter( - private val activity: AppCompatActivity, - private var dataSet: List?, - private val itemLayoutRes: Int, - private val callbacks: Callbacks?, - cabHolder: CabHolder? -) : AbsMultiSelectAdapter(activity, cabHolder, R.menu.menu_media_selection), FastScrollRecyclerView.SectionedAdapter { + private val activity: AppCompatActivity, + private var dataSet: List?, + private val itemLayoutRes: Int, + private val callbacks: Callbacks?, + cabHolder: CabHolder? +) : AbsMultiSelectAdapter( + activity, cabHolder, R.menu.menu_media_selection +), FastScrollRecyclerView.SectionedAdapter { - init { - this.setHasStableIds(true) - } + init { + this.setHasStableIds(true) + } - override fun getItemViewType(position: Int): Int { - return if (dataSet!![position].isDirectory) FOLDER else FILE - } + override fun getItemViewType(position: Int): Int { + return if (dataSet!![position].isDirectory) FOLDER else FILE + } - override fun getItemId(position: Int): Long { - return dataSet!![position].hashCode().toLong() - } + override fun getItemId(position: Int): Long { + return dataSet!![position].hashCode().toLong() + } - fun swapDataSet(songFiles: List) { - this.dataSet = songFiles - notifyDataSetChanged() - } + fun swapDataSet(songFiles: List) { + this.dataSet = songFiles + notifyDataSetChanged() + } - override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder { - return ViewHolder(LayoutInflater.from(activity).inflate(itemLayoutRes, parent, false)) - } + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder { + return ViewHolder(LayoutInflater.from(activity).inflate(itemLayoutRes, parent, false)) + } - override fun onBindViewHolder(holder: ViewHolder, index: Int) { - val file = dataSet!![index] - holder.itemView.isActivated = isChecked(file) - holder.title?.text = getFileTitle(file) - if (holder.text != null) { - if (holder.itemViewType == FILE) { - holder.text!!.text = getFileText(file) - } else { - holder.text!!.visibility = View.GONE - } - } + override fun onBindViewHolder(holder: ViewHolder, index: Int) { + val file = dataSet!![index] + holder.itemView.isActivated = isChecked(file) + holder.title?.text = getFileTitle(file) + if (holder.text != null) { + if (holder.itemViewType == FILE) { + holder.text?.text = getFileText(file) + } else { + holder.text?.visibility = View.GONE + } + } - if (holder.image != null) { - loadFileImage(file, holder) - } - } + if (holder.image != null) { + loadFileImage(file, holder) + } + } - private fun getFileTitle(file: File): String { - return file.name - } + private fun getFileTitle(file: File): String { + return file.name + } - private fun getFileText(file: File): String? { - return if (file.isDirectory) null else readableFileSize(file.length()) - } + private fun getFileText(file: File): String? { + return if (file.isDirectory) null else readableFileSize(file.length()) + } - private fun loadFileImage(file: File, holder: ViewHolder) { - val iconColor = ATHUtil.resolveColor(activity, R.attr.iconColor) - if (file.isDirectory) { - holder.image?.let { - it.setColorFilter(iconColor, PorterDuff.Mode.SRC_IN) - it.setImageResource(R.drawable.ic_folder_white_24dp) - } - holder.imageTextContainer?.setCardBackgroundColor(ATHUtil.resolveColor(activity, R.attr.colorPrimary)) + private fun loadFileImage(file: File, holder: ViewHolder) { + val iconColor = ATHUtil.resolveColor(activity, R.attr.iconColor) + if (file.isDirectory) { + holder.image?.let { + it.setColorFilter(iconColor, PorterDuff.Mode.SRC_IN) + it.setImageResource(R.drawable.ic_folder_white_24dp) + } + holder.imageTextContainer?.setCardBackgroundColor( + ATHUtil.resolveColor( + activity, R.attr.colorPrimary + ) + ) - } else { - val error = RetroUtil.getTintedVectorDrawable(activity, R.drawable.ic_file_music_white_24dp, iconColor) - Glide.with(activity) - .load(AudioFileCover(file.path)) - .diskCacheStrategy(DiskCacheStrategy.NONE) - .error(error) - .placeholder(error) - .animate(android.R.anim.fade_in) - .signature(MediaStoreSignature("", file.lastModified(), 0)) - .into(holder.image) - } - } + } else { + val error = RetroUtil.getTintedVectorDrawable( + activity, R.drawable.ic_file_music_white_24dp, iconColor + ) + Glide.with(activity).load(AudioFileCover(file.path)) + .diskCacheStrategy(DiskCacheStrategy.NONE).error(error).placeholder(error) + .animate(android.R.anim.fade_in) + .signature(MediaStoreSignature("", file.lastModified(), 0)).into(holder.image) + } + } - override fun getItemCount(): Int { - return dataSet!!.size - } + override fun getItemCount(): Int { + return dataSet!!.size + } - override fun getIdentifier(position: Int): File? { - return dataSet!![position] - } + override fun getIdentifier(position: Int): File? { + return dataSet!![position] + } - override fun getName(`object`: File): String { - return getFileTitle(`object`) - } + override fun getName(`object`: File): String { + return getFileTitle(`object`) + } - override fun onMultipleItemAction(menuItem: MenuItem, selection: ArrayList) { - if (callbacks == null) return - callbacks.onMultipleItemAction(menuItem, selection) - } + override fun onMultipleItemAction(menuItem: MenuItem, selection: ArrayList) { + if (callbacks == null) return + callbacks.onMultipleItemAction(menuItem, selection) + } - override fun getSectionName(position: Int): String { - return dataSet!![position].name[0].toString().toUpperCase() - } + override fun getSectionName(position: Int): String { + return dataSet!![position].name[0].toString().toUpperCase() + } - interface Callbacks { - fun onFileSelected(file: File) + interface Callbacks { + fun onFileSelected(file: File) - fun onFileMenuClicked(file: File, view: View) + fun onFileMenuClicked(file: File, view: View) - fun onMultipleItemAction(item: MenuItem, files: ArrayList) - } + fun onMultipleItemAction(item: MenuItem, files: ArrayList) + } - inner class ViewHolder(itemView: View) : MediaEntryViewHolder(itemView) { + inner class ViewHolder(itemView: View) : MediaEntryViewHolder(itemView) { - init { - if (menu != null && callbacks != null) { - menu!!.setOnClickListener { v -> - val position = adapterPosition - if (isPositionInRange(position)) { - callbacks.onFileMenuClicked(dataSet!![position], v) - } - } - } - if (imageTextContainer != null) { - imageTextContainer?.cardElevation = 0f - } - } + init { + if (menu != null && callbacks != null) { + menu!!.setOnClickListener { v -> + val position = adapterPosition + if (isPositionInRange(position)) { + callbacks.onFileMenuClicked(dataSet!![position], v) + } + } + } + if (imageTextContainer != null) { + imageTextContainer?.cardElevation = 0f + } + } - override fun onClick(v: View?) { - val position = adapterPosition - if (isPositionInRange(position)) { - if (isInQuickSelectMode) { - toggleChecked(position) - } else { - callbacks?.onFileSelected(dataSet!![position]) - } - } - } + override fun onClick(v: View?) { + val position = adapterPosition + if (isPositionInRange(position)) { + if (isInQuickSelectMode) { + toggleChecked(position) + } else { + callbacks?.onFileSelected(dataSet!![position]) + } + } + } - override fun onLongClick(v: View?): Boolean { - val position = adapterPosition - return isPositionInRange(position) && toggleChecked(position) - } + override fun onLongClick(v: View?): Boolean { + val position = adapterPosition + return isPositionInRange(position) && toggleChecked(position) + } - private fun isPositionInRange(position: Int): Boolean { - return position >= 0 && position < dataSet!!.size - } - } + private fun isPositionInRange(position: Int): Boolean { + return position >= 0 && position < dataSet!!.size + } + } - companion object { + companion object { - private const val FILE = 0 - private const val FOLDER = 1 + private const val FILE = 0 + private const val FOLDER = 1 - fun readableFileSize(size: Long): String { - if (size <= 0) return "$size B" - val units = arrayOf("B", "KB", "MB", "GB", "TB") - val digitGroups = (log10(size.toDouble()) / log10(1024.0)).toInt() - return DecimalFormat("#,##0.##").format(size / 1024.0.pow(digitGroups.toDouble())) + " " + units[digitGroups] - } - } + fun readableFileSize(size: Long): String { + if (size <= 0) return "$size B" + val units = arrayOf("B", "KB", "MB", "GB", "TB") + val digitGroups = (log10(size.toDouble()) / log10(1024.0)).toInt() + return DecimalFormat("#,##0.##").format(size / 1024.0.pow(digitGroups.toDouble())) + " " + units[digitGroups] + } + } } \ No newline at end of file diff --git a/app/src/main/java/code/name/monkey/retromusic/adapter/album/AlbumAdapter.kt b/app/src/main/java/code/name/monkey/retromusic/adapter/album/AlbumAdapter.kt index 98d5aa151..fc7b684ce 100644 --- a/app/src/main/java/code/name/monkey/retromusic/adapter/album/AlbumAdapter.kt +++ b/app/src/main/java/code/name/monkey/retromusic/adapter/album/AlbumAdapter.kt @@ -3,186 +3,198 @@ package code.name.monkey.retromusic.adapter.album import android.app.ActivityOptions import android.content.res.ColorStateList import android.graphics.drawable.Drawable -import android.view.LayoutInflater -import android.view.MenuItem -import android.view.View -import android.view.ViewGroup -import androidx.annotation.LayoutRes +import android.view.* import androidx.appcompat.app.AppCompatActivity -import code.name.monkey.appthemehelper.util.ColorUtil -import code.name.monkey.appthemehelper.util.MaterialValueHelper +import code.name.monkey.appthemehelper.util.* import code.name.monkey.retromusic.R -import code.name.monkey.retromusic.adapter.base.AbsMultiSelectAdapter -import code.name.monkey.retromusic.adapter.base.MediaEntryViewHolder -import code.name.monkey.retromusic.glide.RetroMusicColoredTarget -import code.name.monkey.retromusic.glide.SongGlideRequest -import code.name.monkey.retromusic.helper.MusicPlayerRemote -import code.name.monkey.retromusic.helper.SortOrder +import code.name.monkey.retromusic.adapter.base.* +import code.name.monkey.retromusic.glide.* +import code.name.monkey.retromusic.helper.* import code.name.monkey.retromusic.helper.menu.SongsMenuHelper import code.name.monkey.retromusic.interfaces.CabHolder -import code.name.monkey.retromusic.model.Album -import code.name.monkey.retromusic.model.Song -import code.name.monkey.retromusic.util.MusicUtil -import code.name.monkey.retromusic.util.NavigationUtil -import code.name.monkey.retromusic.util.PreferenceUtil +import code.name.monkey.retromusic.model.* +import code.name.monkey.retromusic.util.* import com.bumptech.glide.Glide import com.simplecityapps.recyclerview_fastscroll.views.FastScrollRecyclerView +open class AlbumAdapter( + protected val activity: AppCompatActivity, + dataSet: ArrayList, + protected var itemLayoutRes: Int, + usePalette: Boolean, + cabHolder: CabHolder? +) : AbsMultiSelectAdapter( + activity, cabHolder, code.name.monkey.retromusic.R.menu.menu_media_selection +), FastScrollRecyclerView.SectionedAdapter { + var dataSet: ArrayList + protected set -open class AlbumAdapter(protected val activity: AppCompatActivity, - dataSet: ArrayList, - @param:LayoutRes protected var itemLayoutRes: Int, - usePalette: Boolean, - cabHolder: CabHolder?) : AbsMultiSelectAdapter(activity, cabHolder, code.name.monkey.retromusic.R.menu.menu_media_selection), FastScrollRecyclerView.SectionedAdapter { - var dataSet: ArrayList - protected set + protected var usePalette = false - protected var usePalette = false + init { + this.dataSet = dataSet + this.usePalette = usePalette + this.setHasStableIds(true) + } + fun useItemLayout(itemLayoutRes: Int) { + this.itemLayoutRes = itemLayoutRes + notifyDataSetChanged() + } - init { - this.dataSet = dataSet - this.usePalette = usePalette - this.setHasStableIds(true) - } + fun usePalette(usePalette: Boolean) { + this.usePalette = usePalette + notifyDataSetChanged() + } - fun useItemLayout(itemLayoutRes: Int) { - this.itemLayoutRes = itemLayoutRes - notifyDataSetChanged() - } + fun swapDataSet(dataSet: ArrayList) { + this.dataSet = dataSet + notifyDataSetChanged() + } - fun usePalette(usePalette: Boolean) { - this.usePalette = usePalette - notifyDataSetChanged() - } + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder { + val view = LayoutInflater.from(activity).inflate(itemLayoutRes, parent, false) + return createViewHolder(view, viewType) + } - fun swapDataSet(dataSet: ArrayList) { - this.dataSet = dataSet - notifyDataSetChanged() - } + protected open fun createViewHolder(view: View, viewType: Int): ViewHolder { + return ViewHolder(view) + } - override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder { - val view = LayoutInflater.from(activity).inflate(itemLayoutRes, parent, false) - return createViewHolder(view, viewType) - } + private fun getAlbumTitle(album: Album): String? { + return album.title + } - protected open fun createViewHolder(view: View, viewType: Int): ViewHolder { - return ViewHolder(view) - } + protected open fun getAlbumText(album: Album): String? { + return album.artistName + } - private fun getAlbumTitle(album: Album): String? { - return album.title - } + override fun onBindViewHolder(holder: ViewHolder, position: Int) { + val album = dataSet[position] + val isChecked = isChecked(album) + holder.itemView.isActivated = isChecked + holder.title?.text = getAlbumTitle(album) + holder.text?.text = getAlbumText(album) + holder.playSongs?.setOnClickListener { + album.songs?.let { songs -> + MusicPlayerRemote.openQueue( + songs, 0, true + ) + } + } + loadAlbumCover(album, holder) + } - protected open fun getAlbumText(album: Album): String? { - return album.artistName - } + protected open fun setColors(color: Int, holder: ViewHolder) { + if (holder.paletteColorContainer != null) { + holder.title?.setTextColor( + MaterialValueHelper.getPrimaryTextColor(activity, ColorUtil.isColorLight(color)) + ) + holder.text?.setTextColor( + MaterialValueHelper.getSecondaryTextColor( + activity, ColorUtil.isColorLight( + color + ) + ) + ) + holder.paletteColorContainer?.setBackgroundColor(color) + } - override fun onBindViewHolder(holder: ViewHolder, position: Int) { - val album = dataSet[position] - val isChecked = isChecked(album) - holder.itemView.isActivated = isChecked - holder.title?.text = getAlbumTitle(album) - holder.text?.text = getAlbumText(album) - holder.playSongs?.setOnClickListener { album.songs?.let { songs -> MusicPlayerRemote.openQueue(songs, 0, true) } } - loadAlbumCover(album, holder) - } + holder.mask?.backgroundTintList = ColorStateList.valueOf(color) + } - protected open fun setColors(color: Int, holder: ViewHolder) { - if (holder.paletteColorContainer != null) { - holder.title?.setTextColor( - MaterialValueHelper.getPrimaryTextColor(activity, ColorUtil.isColorLight(color))) - holder.text?.setTextColor(MaterialValueHelper.getSecondaryTextColor(activity, ColorUtil.isColorLight(color))) - holder.paletteColorContainer?.setBackgroundColor(color) - } + protected open fun loadAlbumCover(album: Album, holder: ViewHolder) { + if (holder.image == null) { + return + } - holder.mask?.backgroundTintList = ColorStateList.valueOf(color) - } + SongGlideRequest.Builder.from(Glide.with(activity), album.safeGetFirstSong()) + .checkIgnoreMediaStore(activity).generatePalette(activity).build() + .into(object : RetroMusicColoredTarget(holder.image!!) { + override fun onLoadCleared(placeholder: Drawable?) { + super.onLoadCleared(placeholder) + setColors(defaultFooterColor, holder) + } - protected open fun loadAlbumCover(album: Album, holder: ViewHolder) { - if (holder.image == null) { - return - } + override fun onColorReady(color: Int) { + setColors(color, holder) + } + }) + } - SongGlideRequest.Builder.from(Glide.with(activity), album.safeGetFirstSong()) - .checkIgnoreMediaStore(activity) - .generatePalette(activity).build() - .into(object : RetroMusicColoredTarget(holder.image!!) { - override fun onLoadCleared(placeholder: Drawable?) { - super.onLoadCleared(placeholder) - setColors(defaultFooterColor, holder) - } + override fun getItemCount(): Int { + return dataSet.size + } - override fun onColorReady(color: Int) { - setColors(color, holder) - } - }) - } + override fun getItemId(position: Int): Long { + return dataSet[position].id.toLong() + } - override fun getItemCount(): Int { - return dataSet.size - } + override fun getIdentifier(position: Int): Album? { + return dataSet[position] + } - override fun getItemId(position: Int): Long { - return dataSet[position].id.toLong() - } + override fun getName(album: Album): String { + return album.title!! + } - override fun getIdentifier(position: Int): Album? { - return dataSet[position] - } + override fun onMultipleItemAction( + menuItem: MenuItem, selection: ArrayList + ) { + SongsMenuHelper.handleMenuClick(activity, getSongList(selection), menuItem.itemId) + } - override fun getName(album: Album): String { - return album.title!! - } + private fun getSongList(albums: List): ArrayList { + val songs = ArrayList() + for (album in albums) { + songs.addAll(album.songs!!) + } + return songs + } - override fun onMultipleItemAction(menuItem: MenuItem, - selection: ArrayList) { - SongsMenuHelper.handleMenuClick(activity, getSongList(selection), menuItem.itemId) - } + override fun getSectionName(position: Int): String { + var sectionName: String? = null + when (PreferenceUtil.getInstance(activity).albumSortOrder) { + SortOrder.AlbumSortOrder.ALBUM_A_Z, SortOrder.AlbumSortOrder.ALBUM_Z_A -> sectionName = dataSet[position].title + SortOrder.AlbumSortOrder.ALBUM_ARTIST -> sectionName = dataSet[position].artistName + SortOrder.AlbumSortOrder.ALBUM_YEAR -> return MusicUtil.getYearString( + dataSet[position].year + ) + } - private fun getSongList(albums: List): ArrayList { - val songs = ArrayList() - for (album in albums) { - songs.addAll(album.songs!!) - } - return songs - } + return MusicUtil.getSectionName(sectionName) + } - override fun getSectionName(position: Int): String { - var sectionName: String? = null - when (PreferenceUtil.getInstance(activity).albumSortOrder) { - SortOrder.AlbumSortOrder.ALBUM_A_Z, SortOrder.AlbumSortOrder.ALBUM_Z_A -> sectionName = dataSet[position].title - SortOrder.AlbumSortOrder.ALBUM_ARTIST -> sectionName = dataSet[position].artistName - SortOrder.AlbumSortOrder.ALBUM_YEAR -> return MusicUtil.getYearString(dataSet[position].year) - } + inner class ViewHolder(itemView: View) : MediaEntryViewHolder(itemView) { - return MusicUtil.getSectionName(sectionName) - } + init { + setImageTransitionName(activity.getString(R.string.transition_album_art)) + menu?.visibility = View.GONE + } - inner class ViewHolder(itemView: View) : MediaEntryViewHolder(itemView) { + override fun onClick(v: View?) { + super.onClick(v) + if (isInQuickSelectMode) { + toggleChecked(adapterPosition) + } else { + val activityOptions = ActivityOptions.makeSceneTransitionAnimation( + activity, image, activity.getString( + R.string.transition_album_art + ) + ) + NavigationUtil.goToAlbumOptions( + activity, dataSet[adapterPosition].id, activityOptions + ) + } + } - init { - setImageTransitionName(activity.getString(R.string.transition_album_art)) - menu?.visibility = View.GONE - } + override fun onLongClick(v: View?): Boolean { + toggleChecked(adapterPosition) + return super.onLongClick(v) + } + } - override fun onClick(v: View?) { - super.onClick(v) - if (isInQuickSelectMode) { - toggleChecked(adapterPosition) - } else { - val activityOptions = ActivityOptions.makeSceneTransitionAnimation(activity, image, activity.getString(R.string.transition_album_art)) - NavigationUtil.goToAlbumOptions(activity, dataSet[adapterPosition].id, activityOptions) - } - } - - override fun onLongClick(v: View?): Boolean { - toggleChecked(adapterPosition) - return super.onLongClick(v) - } - } - - companion object { - val TAG: String = AlbumAdapter::class.java.simpleName - } + companion object { + val TAG: String = AlbumAdapter::class.java.simpleName + } } diff --git a/app/src/main/java/code/name/monkey/retromusic/adapter/album/AlbumCoverPagerAdapter.kt b/app/src/main/java/code/name/monkey/retromusic/adapter/album/AlbumCoverPagerAdapter.kt index 0063c06b1..3560ba701 100644 --- a/app/src/main/java/code/name/monkey/retromusic/adapter/album/AlbumCoverPagerAdapter.kt +++ b/app/src/main/java/code/name/monkey/retromusic/adapter/album/AlbumCoverPagerAdapter.kt @@ -1,166 +1,165 @@ package code.name.monkey.retromusic.adapter.album import android.os.Bundle -import android.view.LayoutInflater -import android.view.View -import android.view.ViewGroup +import android.view.* import android.widget.ImageView -import androidx.fragment.app.Fragment -import androidx.fragment.app.FragmentManager +import androidx.fragment.app.* import code.name.monkey.retromusic.R import code.name.monkey.retromusic.fragments.AlbumCoverStyle -import code.name.monkey.retromusic.glide.RetroMusicColoredTarget -import code.name.monkey.retromusic.glide.SongGlideRequest +import code.name.monkey.retromusic.glide.* import code.name.monkey.retromusic.misc.CustomFragmentStatePagerAdapter import code.name.monkey.retromusic.model.Song -import code.name.monkey.retromusic.util.NavigationUtil -import code.name.monkey.retromusic.util.PreferenceUtil +import code.name.monkey.retromusic.util.* import com.bumptech.glide.Glide import java.util.* +class AlbumCoverPagerAdapter( + fm: FragmentManager, + private val dataSet: ArrayList +) : CustomFragmentStatePagerAdapter(fm) { -class AlbumCoverPagerAdapter(fm: FragmentManager, private val dataSet: ArrayList) : CustomFragmentStatePagerAdapter(fm) { + private var currentColorReceiver: AlbumCoverFragment.ColorReceiver? = null + private var currentColorReceiverPosition = -1 - private var currentColorReceiver: AlbumCoverFragment.ColorReceiver? = null - private var currentColorReceiverPosition = -1 + override fun getItem(position: Int): Fragment { + return AlbumCoverFragment.newInstance(dataSet[position]) + } - override fun getItem(position: Int): Fragment { - return AlbumCoverFragment.newInstance(dataSet[position]) - } + override fun getCount(): Int { + return dataSet.size + } - override fun getCount(): Int { - return dataSet.size - } + override fun instantiateItem(container: ViewGroup, position: Int): Any { + val o = super.instantiateItem(container, position) + if (currentColorReceiver != null && currentColorReceiverPosition == position) { + receiveColor(currentColorReceiver!!, currentColorReceiverPosition) + } + return o + } - override fun instantiateItem(container: ViewGroup, position: Int): Any { - val o = super.instantiateItem(container, position) - if (currentColorReceiver != null && currentColorReceiverPosition == position) { - receiveColor(currentColorReceiver!!, currentColorReceiverPosition) - } - return o - } + /** + * Only the latest passed [AlbumCoverFragment.ColorReceiver] is guaranteed to receive a + * response + */ + fun receiveColor(colorReceiver: AlbumCoverFragment.ColorReceiver, position: Int) { - /** - * Only the latest passed [AlbumCoverFragment.ColorReceiver] is guaranteed to receive a - * response - */ - fun receiveColor(colorReceiver: AlbumCoverFragment.ColorReceiver, position: Int) { + if (getFragment(position) is AlbumCoverFragment) { + val fragment = getFragment(position) as AlbumCoverFragment + currentColorReceiver = null + currentColorReceiverPosition = -1 + fragment.receiveColor(colorReceiver, position) + } else { + currentColorReceiver = colorReceiver + currentColorReceiverPosition = position + } + } - if (getFragment(position) is AlbumCoverFragment) { - val fragment = getFragment(position) as AlbumCoverFragment - currentColorReceiver = null - currentColorReceiverPosition = -1 - fragment.receiveColor(colorReceiver, position) - } else { - currentColorReceiver = colorReceiver - currentColorReceiverPosition = position - } - } + class AlbumCoverFragment : Fragment() { - class AlbumCoverFragment : Fragment() { + lateinit var albumCover: ImageView + private var isColorReady: Boolean = false + private var color: Int = 0 + private lateinit var song: Song + private var colorReceiver: ColorReceiver? = null + private var request: Int = 0 - lateinit var albumCover: ImageView - private var isColorReady: Boolean = false - private var color: Int = 0 - private lateinit var song: Song - private var colorReceiver: ColorReceiver? = null - private var request: Int = 0 + private val layout: Int + get() { + return when (PreferenceUtil.getInstance(activity).albumCoverStyle) { + AlbumCoverStyle.NORMAL -> R.layout.fragment_album_cover + AlbumCoverStyle.FLAT -> R.layout.fragment_album_flat_cover + AlbumCoverStyle.CIRCLE -> R.layout.fragment_album_circle_cover + AlbumCoverStyle.CARD -> R.layout.fragment_album_card_cover + AlbumCoverStyle.MATERIAL -> R.layout.fragment_album_material_cover + AlbumCoverStyle.FULL -> R.layout.fragment_album_full_cover + AlbumCoverStyle.FULL_CARD -> R.layout.fragment_album_full_card_cover + else -> R.layout.fragment_album_cover + } + } - private val layout: Int - get() { - return when (PreferenceUtil.getInstance(activity).albumCoverStyle) { - AlbumCoverStyle.NORMAL -> R.layout.fragment_album_cover - AlbumCoverStyle.FLAT -> R.layout.fragment_album_flat_cover - AlbumCoverStyle.CIRCLE -> R.layout.fragment_album_circle_cover - AlbumCoverStyle.CARD -> R.layout.fragment_album_card_cover - AlbumCoverStyle.MATERIAL -> R.layout.fragment_album_material_cover - AlbumCoverStyle.FULL -> R.layout.fragment_album_full_cover - AlbumCoverStyle.FULL_CARD -> R.layout.fragment_album_full_card_cover - else -> R.layout.fragment_album_cover - } - } + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + if (arguments != null) { + song = arguments!!.getParcelable(SONG_ARG)!! + } + } - override fun onCreate(savedInstanceState: Bundle?) { - super.onCreate(savedInstanceState) - if (arguments != null) { - song = arguments!!.getParcelable(SONG_ARG)!! - } - } + override fun onCreateView( + inflater: LayoutInflater, + container: ViewGroup?, + savedInstanceState: Bundle? + ): View? { + val finalLayout = when { + PreferenceUtil.getInstance(activity).carouselEffect() -> R.layout.fragment_album_carousel_cover + else -> layout + } + val view = inflater.inflate(finalLayout, container, false) + albumCover = view.findViewById(R.id.player_image) + albumCover.setOnClickListener { - override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { - val finalLayout = when { - PreferenceUtil.getInstance(activity).carouselEffect() -> R.layout.fragment_album_carousel_cover - else -> layout - } - val view = inflater.inflate(finalLayout, container, false) - albumCover = view.findViewById(R.id.player_image) - albumCover.setOnClickListener { + NavigationUtil.goToLyrics(requireActivity()) + } + return view + } - NavigationUtil.goToLyrics(requireActivity()) - } - return view - } + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + loadAlbumCover() + } - override fun onViewCreated(view: View, savedInstanceState: Bundle?) { - super.onViewCreated(view, savedInstanceState) - loadAlbumCover() - } + override fun onDestroyView() { + super.onDestroyView() + colorReceiver = null + } + private fun loadAlbumCover() { + SongGlideRequest.Builder.from(Glide.with(requireContext()), song) + .checkIgnoreMediaStore(activity).generatePalette(activity).build() + .into(object : RetroMusicColoredTarget(albumCover) { + override fun onColorReady(color: Int) { + setColor(color) + } + }) + } - override fun onDestroyView() { - super.onDestroyView() - colorReceiver = null - } + private fun setColor(color: Int) { + this.color = color + isColorReady = true + if (colorReceiver != null) { + colorReceiver!!.onColorReady(color, request) + colorReceiver = null + } + } - private fun loadAlbumCover() { - SongGlideRequest.Builder.from(Glide.with(requireContext()), song) - .checkIgnoreMediaStore(activity) - .generatePalette(activity).build() - .into(object : RetroMusicColoredTarget(albumCover) { - override fun onColorReady(color: Int) { - setColor(color) - } - }) - } + internal fun receiveColor(colorReceiver: ColorReceiver, request: Int) { + if (isColorReady) { + colorReceiver.onColorReady(color, request) + } else { + this.colorReceiver = colorReceiver + this.request = request + } + } - private fun setColor(color: Int) { - this.color = color - isColorReady = true - if (colorReceiver != null) { - colorReceiver!!.onColorReady(color, request) - colorReceiver = null - } - } + interface ColorReceiver { + fun onColorReady(color: Int, request: Int) + } - internal fun receiveColor(colorReceiver: ColorReceiver, request: Int) { - if (isColorReady) { - colorReceiver.onColorReady(color, request) - } else { - this.colorReceiver = colorReceiver - this.request = request - } - } + companion object { - interface ColorReceiver { - fun onColorReady(color: Int, request: Int) - } + private const val SONG_ARG = "song" - companion object { + fun newInstance(song: Song): AlbumCoverFragment { + val frag = AlbumCoverFragment() + val args = Bundle() + args.putParcelable(SONG_ARG, song) + frag.arguments = args + return frag + } + } + } - private const val SONG_ARG = "song" - - fun newInstance(song: Song): AlbumCoverFragment { - val frag = AlbumCoverFragment() - val args = Bundle() - args.putParcelable(SONG_ARG, song) - frag.arguments = args - return frag - } - } - } - - companion object { - val TAG: String = AlbumCoverPagerAdapter::class.java.simpleName - } + companion object { + val TAG: String = AlbumCoverPagerAdapter::class.java.simpleName + } } diff --git a/app/src/main/java/code/name/monkey/retromusic/adapter/album/AlbumFullWidthAdapter.kt b/app/src/main/java/code/name/monkey/retromusic/adapter/album/AlbumFullWidthAdapter.kt index 84d30facf..a3cc654f1 100644 --- a/app/src/main/java/code/name/monkey/retromusic/adapter/album/AlbumFullWidthAdapter.kt +++ b/app/src/main/java/code/name/monkey/retromusic/adapter/album/AlbumFullWidthAdapter.kt @@ -15,69 +15,87 @@ */ package code.name.monkey.retromusic.adapter.album -import android.app.Activity -import android.app.ActivityOptions +import android.app.* import android.util.DisplayMetrics -import android.view.LayoutInflater -import android.view.View -import android.view.ViewGroup +import android.view.* import code.name.monkey.retromusic.R -import code.name.monkey.retromusic.glide.RetroMusicColoredTarget -import code.name.monkey.retromusic.glide.SongGlideRequest +import code.name.monkey.retromusic.glide.* import code.name.monkey.retromusic.helper.MusicPlayerRemote import code.name.monkey.retromusic.model.Album import code.name.monkey.retromusic.util.NavigationUtil import code.name.monkey.retromusic.views.MetalRecyclerViewPager import com.bumptech.glide.Glide -class AlbumFullWidthAdapter(private val activity: Activity, private val dataSet: ArrayList, metrics: DisplayMetrics) : - MetalRecyclerViewPager.MetalAdapter(metrics) { +class AlbumFullWidthAdapter( + private val activity: Activity, + private val dataSet: ArrayList, + metrics: DisplayMetrics +) : MetalRecyclerViewPager.MetalAdapter(metrics) { - override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): FullMetalViewHolder { - return FullMetalViewHolder(LayoutInflater.from(parent.context).inflate(R.layout.pager_item, parent, false)) - } + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): FullMetalViewHolder { + return FullMetalViewHolder( + LayoutInflater.from(parent.context).inflate( + R.layout.pager_item, + parent, + false + ) + ) + } - override fun onBindViewHolder(holder: FullMetalViewHolder, position: Int) { - // don't forget about calling supper.onBindViewHolder! - super.onBindViewHolder(holder, position) - val album = dataSet[position] - holder.title?.text = getAlbumTitle(album) - holder.text?.text = getAlbumText(album) - holder.playSongs?.setOnClickListener { album.songs?.let { songs -> MusicPlayerRemote.openQueue(songs, 0, true) } } - loadAlbumCover(album, holder) - } + override fun onBindViewHolder(holder: FullMetalViewHolder, position: Int) { + // don't forget about calling supper.onBindViewHolder! + super.onBindViewHolder(holder, position) + val album = dataSet[position] + holder.title?.text = getAlbumTitle(album) + holder.text?.text = getAlbumText(album) + holder.playSongs?.setOnClickListener { + album.songs?.let { songs -> + MusicPlayerRemote.openQueue( + songs, + 0, + true + ) + } + } + loadAlbumCover(album, holder) + } - private fun getAlbumTitle(album: Album): String? { - return album.title - } + private fun getAlbumTitle(album: Album): String? { + return album.title + } - private fun getAlbumText(album: Album): String? { - return album.artistName - } + private fun getAlbumText(album: Album): String? { + return album.artistName + } - private fun loadAlbumCover(album: Album, holder: FullMetalViewHolder) { - if (holder.image == null) { - return - } - SongGlideRequest.Builder.from(Glide.with(activity), album.safeGetFirstSong()) - .checkIgnoreMediaStore(activity) - .generatePalette(activity).build() - .into(object : RetroMusicColoredTarget(holder.image!!) { - override fun onColorReady(color: Int) { + private fun loadAlbumCover(album: Album, holder: FullMetalViewHolder) { + if (holder.image == null) { + return + } + SongGlideRequest.Builder.from(Glide.with(activity), album.safeGetFirstSong()) + .checkIgnoreMediaStore(activity).generatePalette(activity).build() + .into(object : RetroMusicColoredTarget(holder.image!!) { + override fun onColorReady(color: Int) { - } - }) - } + } + }) + } - override fun getItemCount(): Int { - return dataSet.size - } + override fun getItemCount(): Int { + return dataSet.size + } - inner class FullMetalViewHolder(itemView: View) : MetalRecyclerViewPager.MetalViewHolder(itemView) { + inner class FullMetalViewHolder(itemView: View) : MetalRecyclerViewPager.MetalViewHolder( + itemView + ) { - override fun onClick(v: View?) { - val activityOptions = ActivityOptions.makeSceneTransitionAnimation(activity, image, activity.getString(R.string.transition_album_art)) - NavigationUtil.goToAlbumOptions(activity, dataSet[adapterPosition].id, activityOptions) - } - } + override fun onClick(v: View?) { + val activityOptions = ActivityOptions.makeSceneTransitionAnimation( + activity, + image, + activity.getString(R.string.transition_album_art) + ) + NavigationUtil.goToAlbumOptions(activity, dataSet[adapterPosition].id, activityOptions) + } + } } \ No newline at end of file diff --git a/app/src/main/java/code/name/monkey/retromusic/adapter/album/HorizontalAlbumAdapter.kt b/app/src/main/java/code/name/monkey/retromusic/adapter/album/HorizontalAlbumAdapter.kt index efe9d9fcf..f381a579e 100644 --- a/app/src/main/java/code/name/monkey/retromusic/adapter/album/HorizontalAlbumAdapter.kt +++ b/app/src/main/java/code/name/monkey/retromusic/adapter/album/HorizontalAlbumAdapter.kt @@ -1,13 +1,10 @@ package code.name.monkey.retromusic.adapter.album import android.graphics.drawable.Drawable -import android.view.View -import android.view.ViewGroup +import android.view.* import androidx.appcompat.app.AppCompatActivity -import code.name.monkey.appthemehelper.util.ColorUtil -import code.name.monkey.appthemehelper.util.MaterialValueHelper -import code.name.monkey.retromusic.glide.RetroMusicColoredTarget -import code.name.monkey.retromusic.glide.SongGlideRequest +import code.name.monkey.appthemehelper.util.* +import code.name.monkey.retromusic.glide.* import code.name.monkey.retromusic.helper.HorizontalAdapterHelper import code.name.monkey.retromusic.interfaces.CabHolder import code.name.monkey.retromusic.model.Album @@ -15,65 +12,71 @@ import code.name.monkey.retromusic.util.MusicUtil import com.bumptech.glide.Glide import java.util.* - class HorizontalAlbumAdapter( - activity: AppCompatActivity, - dataSet: ArrayList, - usePalette: Boolean, - cabHolder: CabHolder? + activity: AppCompatActivity, + dataSet: ArrayList, + usePalette: Boolean, + cabHolder: CabHolder? ) : AlbumAdapter( - activity, - dataSet, - HorizontalAdapterHelper.LAYOUT_RES, - usePalette, - cabHolder + activity, dataSet, HorizontalAdapterHelper.LAYOUT_RES, usePalette, cabHolder ) { - override fun createViewHolder(view: View, viewType: Int): ViewHolder { - val params = view.layoutParams as ViewGroup.MarginLayoutParams - HorizontalAdapterHelper.applyMarginToLayoutParams(activity, params, viewType) - return ViewHolder(view) - } + override fun createViewHolder(view: View, viewType: Int): ViewHolder { + val params = view.layoutParams as ViewGroup.MarginLayoutParams + HorizontalAdapterHelper.applyMarginToLayoutParams(activity, params, viewType) + return ViewHolder(view) + } - override fun setColors(color: Int, holder: ViewHolder) { - holder.title?.setTextColor(MaterialValueHelper.getPrimaryTextColor(activity, ColorUtil.isColorLight(color))) - holder.text?.setTextColor(MaterialValueHelper.getSecondaryTextColor(activity, ColorUtil.isColorLight(color))) - } + override fun setColors(color: Int, holder: ViewHolder) { + holder.title?.setTextColor( + MaterialValueHelper.getPrimaryTextColor( + activity, + ColorUtil.isColorLight( + color + ) + ) + ) + holder.text?.setTextColor( + MaterialValueHelper.getSecondaryTextColor( + activity, + ColorUtil.isColorLight( + color + ) + ) + ) + } - override fun loadAlbumCover(album: Album, holder: ViewHolder) { - if (holder.image == null) return + override fun loadAlbumCover(album: Album, holder: ViewHolder) { + if (holder.image == null) return - SongGlideRequest.Builder.from(Glide.with(activity), album.safeGetFirstSong()) - .checkIgnoreMediaStore(activity) - .generatePalette(activity).build() - .into(object : RetroMusicColoredTarget(holder.image!!) { - override fun onLoadCleared(placeholder: Drawable?) { - super.onLoadCleared(placeholder) - setColors(albumArtistFooterColor, holder) - } + SongGlideRequest.Builder.from(Glide.with(activity), album.safeGetFirstSong()) + .checkIgnoreMediaStore(activity).generatePalette(activity).build() + .into(object : RetroMusicColoredTarget(holder.image!!) { + override fun onLoadCleared(placeholder: Drawable?) { + super.onLoadCleared(placeholder) + setColors(albumArtistFooterColor, holder) + } - override fun onColorReady(color: Int) { - if (usePalette) - setColors(color, holder) - else - setColors(albumArtistFooterColor, holder) - } - }) - } + override fun onColorReady(color: Int) { + if (usePalette) setColors(color, holder) + else setColors(albumArtistFooterColor, holder) + } + }) + } - override fun getAlbumText(album: Album): String? { - return MusicUtil.getYearString(album.year) - } + override fun getAlbumText(album: Album): String? { + return MusicUtil.getYearString(album.year) + } - override fun getItemViewType(position: Int): Int { - return HorizontalAdapterHelper.getItemViewtype(position, itemCount) - } + override fun getItemViewType(position: Int): Int { + return HorizontalAdapterHelper.getItemViewtype(position, itemCount) + } - override fun getItemCount(): Int { - return dataSet.size - } + override fun getItemCount(): Int { + return dataSet.size + } - companion object { - val TAG: String = AlbumAdapter::class.java.simpleName - } + companion object { + val TAG: String = AlbumAdapter::class.java.simpleName + } } diff --git a/app/src/main/java/code/name/monkey/retromusic/adapter/artist/ArtistAdapter.kt b/app/src/main/java/code/name/monkey/retromusic/adapter/artist/ArtistAdapter.kt index 75cb73324..fd4dcfa98 100644 --- a/app/src/main/java/code/name/monkey/retromusic/adapter/artist/ArtistAdapter.kt +++ b/app/src/main/java/code/name/monkey/retromusic/adapter/artist/ArtistAdapter.kt @@ -3,145 +3,150 @@ package code.name.monkey.retromusic.adapter.artist import android.app.ActivityOptions import android.content.res.ColorStateList import android.graphics.drawable.Drawable -import android.view.LayoutInflater -import android.view.MenuItem -import android.view.View -import android.view.ViewGroup -import androidx.annotation.LayoutRes +import android.view.* import androidx.appcompat.app.AppCompatActivity -import code.name.monkey.appthemehelper.util.ColorUtil -import code.name.monkey.appthemehelper.util.MaterialValueHelper +import code.name.monkey.appthemehelper.util.* import code.name.monkey.retromusic.R -import code.name.monkey.retromusic.adapter.base.AbsMultiSelectAdapter -import code.name.monkey.retromusic.adapter.base.MediaEntryViewHolder -import code.name.monkey.retromusic.glide.ArtistGlideRequest -import code.name.monkey.retromusic.glide.RetroMusicColoredTarget +import code.name.monkey.retromusic.adapter.base.* +import code.name.monkey.retromusic.glide.* import code.name.monkey.retromusic.helper.menu.SongsMenuHelper import code.name.monkey.retromusic.interfaces.CabHolder -import code.name.monkey.retromusic.model.Artist -import code.name.monkey.retromusic.model.Song -import code.name.monkey.retromusic.util.MusicUtil -import code.name.monkey.retromusic.util.NavigationUtil +import code.name.monkey.retromusic.model.* +import code.name.monkey.retromusic.util.* import com.bumptech.glide.Glide import com.simplecityapps.recyclerview_fastscroll.views.FastScrollRecyclerView import java.util.* +class ArtistAdapter( + val activity: AppCompatActivity, + var dataSet: ArrayList, + var itemLayoutRes: Int, + var usePalette: Boolean, + cabHolder: CabHolder? +) : AbsMultiSelectAdapter( + activity, cabHolder, R.menu.menu_media_selection +), FastScrollRecyclerView.SectionedAdapter { -class ArtistAdapter(val activity: AppCompatActivity, - var dataSet: ArrayList, - @LayoutRes var itemLayoutRes: Int, - var usePalette: Boolean, - cabHolder: CabHolder? -) : AbsMultiSelectAdapter(activity, cabHolder, R.menu.menu_media_selection), FastScrollRecyclerView.SectionedAdapter { + fun swapDataSet(dataSet: ArrayList) { + this.dataSet = dataSet + notifyDataSetChanged() + } - fun swapDataSet(dataSet: ArrayList) { - this.dataSet = dataSet - notifyDataSetChanged() - } + fun usePalette(usePalette: Boolean) { + this.usePalette = usePalette + notifyDataSetChanged() + } - fun usePalette(usePalette: Boolean) { - this.usePalette = usePalette - notifyDataSetChanged() - } + override fun getItemId(position: Int): Long { + return dataSet[position].id.toLong() + } - override fun getItemId(position: Int): Long { - return dataSet[position].id.toLong() - } + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder { + val view = LayoutInflater.from(activity).inflate(itemLayoutRes, parent, false) + return createViewHolder(view) + } - override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder { - val view = LayoutInflater.from(activity).inflate(itemLayoutRes, parent, false) - return createViewHolder(view) - } + private fun createViewHolder(view: View): ViewHolder { + return ViewHolder(view) + } - private fun createViewHolder(view: View): ViewHolder { - return ViewHolder(view) - } + override fun onBindViewHolder(holder: ViewHolder, position: Int) { + val artist = dataSet[position] + val isChecked = isChecked(artist) + holder.itemView.isActivated = isChecked + holder.title?.text = artist.name + holder.text?.visibility = View.GONE + loadArtistImage(artist, holder) + } - override fun onBindViewHolder(holder: ViewHolder, position: Int) { - val artist = dataSet[position] - val isChecked = isChecked(artist) - holder.itemView.isActivated = isChecked - holder.title?.text = artist.name - holder.text?.visibility = View.GONE - loadArtistImage(artist, holder) - } + fun setColors(color: Int, holder: ViewHolder) { + if (holder.paletteColorContainer != null) { + holder.paletteColorContainer?.setBackgroundColor(color) + holder.title?.setTextColor( + MaterialValueHelper.getPrimaryTextColor( + activity, ColorUtil.isColorLight( + color + ) + ) + ) + } - fun setColors(color: Int, holder: ViewHolder) { - if (holder.paletteColorContainer != null) { - holder.paletteColorContainer?.setBackgroundColor(color) - holder.title?.setTextColor(MaterialValueHelper.getPrimaryTextColor(activity, ColorUtil.isColorLight(color))) - } + holder.mask?.backgroundTintList = ColorStateList.valueOf(color) + } - holder.mask?.backgroundTintList = ColorStateList.valueOf(color) - } + private fun loadArtistImage(artist: Artist, holder: ViewHolder) { + if (holder.image == null) { + return + } + ArtistGlideRequest.Builder.from(Glide.with(activity), artist).generatePalette(activity) + .build().into(object : RetroMusicColoredTarget(holder.image!!) { + override fun onLoadCleared(placeholder: Drawable?) { + super.onLoadCleared(placeholder) + setColors(defaultFooterColor, holder) + } - private fun loadArtistImage(artist: Artist, holder: ViewHolder) { - if (holder.image == null) { - return - } - ArtistGlideRequest.Builder.from(Glide.with(activity), artist) - .generatePalette(activity).build() - .into(object : RetroMusicColoredTarget(holder.image!!) { - override fun onLoadCleared(placeholder: Drawable?) { - super.onLoadCleared(placeholder) - setColors(defaultFooterColor, holder) - } + override fun onColorReady(color: Int) { + setColors(color, holder) + } + }) + } - override fun onColorReady(color: Int) { - setColors(color, holder) - } - }) - } + override fun getItemCount(): Int { + return dataSet.size + } - override fun getItemCount(): Int { - return dataSet.size - } + override fun getIdentifier(position: Int): Artist? { + return dataSet[position] + } - override fun getIdentifier(position: Int): Artist? { - return dataSet[position] - } + override fun getName(artist: Artist): String { + return artist.name + } - override fun getName(artist: Artist): String { - return artist.name - } + override fun onMultipleItemAction( + menuItem: MenuItem, selection: ArrayList + ) { + SongsMenuHelper.handleMenuClick(activity, getSongList(selection), menuItem.itemId) + } - override fun onMultipleItemAction(menuItem: MenuItem, - selection: ArrayList) { - SongsMenuHelper.handleMenuClick(activity, getSongList(selection), menuItem.itemId) - } + private fun getSongList(artists: List): ArrayList { + val songs = ArrayList() + for (artist in artists) { + songs.addAll(artist.songs) // maybe async in future? + } + return songs + } - private fun getSongList(artists: List): ArrayList { - val songs = ArrayList() - for (artist in artists) { - songs.addAll(artist.songs) // maybe async in future? - } - return songs - } + override fun getSectionName(position: Int): String { + return MusicUtil.getSectionName(dataSet[position].name) + } - override fun getSectionName(position: Int): String { - return MusicUtil.getSectionName(dataSet[position].name) - } + inner class ViewHolder(itemView: View) : MediaEntryViewHolder(itemView) { - inner class ViewHolder(itemView: View) : MediaEntryViewHolder(itemView) { + init { + setImageTransitionName(activity.getString(R.string.transition_artist_image)) + menu?.visibility = View.GONE + } - init { - setImageTransitionName(activity.getString(R.string.transition_artist_image)) - menu?.visibility = View.GONE - } + override fun onClick(v: View?) { + super.onClick(v) + if (isInQuickSelectMode) { + toggleChecked(adapterPosition) + } else { + val activityOptions = ActivityOptions.makeSceneTransitionAnimation( + activity, image, activity.getString( + R.string.transition_artist_image + ) + ) + NavigationUtil.goToArtistOptions( + activity, dataSet[adapterPosition].id, activityOptions + ) + } + } - override fun onClick(v: View?) { - super.onClick(v) - if (isInQuickSelectMode) { - toggleChecked(adapterPosition) - } else { - val activityOptions = ActivityOptions.makeSceneTransitionAnimation(activity, image, activity.getString(R.string.transition_artist_image)) - NavigationUtil.goToArtistOptions(activity, dataSet[adapterPosition].id, activityOptions) - } - } - - override fun onLongClick(v: View?): Boolean { - toggleChecked(adapterPosition) - return super.onLongClick(v) - } - } + override fun onLongClick(v: View?): Boolean { + toggleChecked(adapterPosition) + return super.onLongClick(v) + } + } } diff --git a/app/src/main/java/code/name/monkey/retromusic/adapter/base/AbsMultiSelectAdapter.java b/app/src/main/java/code/name/monkey/retromusic/adapter/base/AbsMultiSelectAdapter.java index f184337ba..36bbe6bdf 100644 --- a/app/src/main/java/code/name/monkey/retromusic/adapter/base/AbsMultiSelectAdapter.java +++ b/app/src/main/java/code/name/monkey/retromusic/adapter/base/AbsMultiSelectAdapter.java @@ -1,12 +1,13 @@ package code.name.monkey.retromusic.adapter.base; import android.content.Context; +import android.view.Menu; +import android.view.MenuItem; + import androidx.annotation.MenuRes; import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.recyclerview.widget.RecyclerView; -import android.view.Menu; -import android.view.MenuItem; import com.afollestad.materialcab.MaterialCab; diff --git a/app/src/main/java/code/name/monkey/retromusic/adapter/playlist/PlaylistAdapter.kt b/app/src/main/java/code/name/monkey/retromusic/adapter/playlist/PlaylistAdapter.kt index 8d040588e..641e55e41 100755 --- a/app/src/main/java/code/name/monkey/retromusic/adapter/playlist/PlaylistAdapter.kt +++ b/app/src/main/java/code/name/monkey/retromusic/adapter/playlist/PlaylistAdapter.kt @@ -1,212 +1,222 @@ package code.name.monkey.retromusic.adapter.playlist import android.graphics.drawable.Drawable -import android.view.LayoutInflater -import android.view.MenuItem -import android.view.View -import android.view.ViewGroup +import android.view.* import androidx.appcompat.app.AppCompatActivity import androidx.appcompat.widget.PopupMenu import code.name.monkey.appthemehelper.ThemeStore -import code.name.monkey.appthemehelper.util.ATHUtil -import code.name.monkey.appthemehelper.util.TintHelper +import code.name.monkey.appthemehelper.util.* import code.name.monkey.retromusic.R -import code.name.monkey.retromusic.adapter.base.AbsMultiSelectAdapter -import code.name.monkey.retromusic.adapter.base.MediaEntryViewHolder -import code.name.monkey.retromusic.dialogs.ClearSmartPlaylistDialog -import code.name.monkey.retromusic.dialogs.DeletePlaylistDialog -import code.name.monkey.retromusic.helper.menu.PlaylistMenuHelper -import code.name.monkey.retromusic.helper.menu.SongsMenuHelper +import code.name.monkey.retromusic.adapter.base.* +import code.name.monkey.retromusic.dialogs.* +import code.name.monkey.retromusic.helper.menu.* import code.name.monkey.retromusic.interfaces.CabHolder import code.name.monkey.retromusic.loaders.PlaylistSongsLoader -import code.name.monkey.retromusic.model.AbsCustomPlaylist -import code.name.monkey.retromusic.model.Playlist -import code.name.monkey.retromusic.model.Song -import code.name.monkey.retromusic.model.smartplaylist.AbsSmartPlaylist -import code.name.monkey.retromusic.model.smartplaylist.LastAddedPlaylist -import code.name.monkey.retromusic.util.MusicUtil -import code.name.monkey.retromusic.util.NavigationUtil +import code.name.monkey.retromusic.model.* +import code.name.monkey.retromusic.model.smartplaylist.* +import code.name.monkey.retromusic.util.* import java.util.* +class PlaylistAdapter( + private val activity: AppCompatActivity, + var dataSet: ArrayList, + private var itemLayoutRes: Int, + cabHolder: CabHolder? +) : AbsMultiSelectAdapter( + activity, + cabHolder, + R.menu.menu_playlists_selection +) { -class PlaylistAdapter(private val activity: AppCompatActivity, - var dataSet: ArrayList, - private var itemLayoutRes: Int, - cabHolder: CabHolder?) : AbsMultiSelectAdapter(activity, cabHolder, R.menu.menu_playlists_selection) { + var songs = ArrayList() - var songs = ArrayList() + init { + setHasStableIds(true) + } + fun swapDataSet(dataSet: ArrayList) { + this.dataSet = dataSet + notifyDataSetChanged() + } - init { - setHasStableIds(true) - } + override fun getItemId(position: Int): Long { + return dataSet[position].id.toLong() + } - fun swapDataSet(dataSet: ArrayList) { - this.dataSet = dataSet - notifyDataSetChanged() - } + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder { + val view = LayoutInflater.from(activity).inflate(itemLayoutRes, parent, false) + return createViewHolder(view) + } - override fun getItemId(position: Int): Long { - return dataSet[position].id.toLong() - } + protected fun createViewHolder(view: View): ViewHolder { + return ViewHolder(view) + } - override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder { - val view = LayoutInflater.from(activity) - .inflate(itemLayoutRes, parent, false) - return createViewHolder(view) - } + protected fun getPlaylistTitle(playlist: Playlist): String { + return playlist.name + } - protected fun createViewHolder(view: View): ViewHolder { - return ViewHolder(view) - } + protected fun getPlaylistText(playlist: Playlist): String { + return MusicUtil.getPlaylistInfoString(activity, getSongs(playlist)) + } - protected fun getPlaylistTitle(playlist: Playlist): String { - return playlist.name - } + override fun onBindViewHolder(holder: ViewHolder, position: Int) { + val playlist = dataSet[position] + holder.itemView.isActivated = isChecked(playlist) + holder.title?.text = getPlaylistTitle(playlist) + holder.text?.text = getPlaylistText(playlist) + holder.image?.setImageDrawable(getIconRes(playlist)) + } - protected fun getPlaylistText(playlist: Playlist): String { - return MusicUtil.getPlaylistInfoString(activity, getSongs(playlist)) - } + private fun getIconRes(playlist: Playlist): Drawable { + if (playlist is AbsSmartPlaylist) { + return TintHelper.createTintedDrawable( + activity, + playlist.iconRes, + ATHUtil.resolveColor(activity, R.attr.iconColor) + )!! + } + return if (MusicUtil.isFavoritePlaylist( + activity, + playlist + )) TintHelper.createTintedDrawable( + activity, + R.drawable.ic_favorite_white_24dp, + ThemeStore.accentColor(activity) + )!! + else TintHelper.createTintedDrawable( + activity, + R.drawable.ic_playlist_play_white_24dp, + ATHUtil.resolveColor(activity, R.attr.iconColor) + )!! + } - override fun onBindViewHolder(holder: ViewHolder, position: Int) { - val playlist = dataSet[position] - holder.itemView.isActivated = isChecked(playlist) - holder.title?.text = getPlaylistTitle(playlist) - holder.text?.text = getPlaylistText(playlist) - holder.image?.setImageDrawable(getIconRes(playlist)) - } + override fun getItemViewType(position: Int): Int { + return if (dataSet[position] is AbsSmartPlaylist) SMART_PLAYLIST else DEFAULT_PLAYLIST + } - private fun getIconRes(playlist: Playlist): Drawable { - if (playlist is AbsSmartPlaylist) { - return TintHelper.createTintedDrawable(activity, playlist.iconRes, ATHUtil.resolveColor(activity, R.attr.iconColor))!! - } - return if (MusicUtil.isFavoritePlaylist(activity, playlist)) - TintHelper.createTintedDrawable(activity, R.drawable.ic_favorite_white_24dp, ThemeStore.accentColor(activity))!! - else - TintHelper.createTintedDrawable(activity, R.drawable.ic_playlist_play_white_24dp, ATHUtil.resolveColor(activity, R.attr.iconColor))!! - } + override fun getItemCount(): Int { + return dataSet.size + } - override fun getItemViewType(position: Int): Int { - return if (dataSet[position] is AbsSmartPlaylist) SMART_PLAYLIST else DEFAULT_PLAYLIST - } + override fun getIdentifier(position: Int): Playlist? { + return dataSet[position] + } - override fun getItemCount(): Int { - return dataSet.size - } + override fun getName(playlist: Playlist): String { + return playlist.name + } - override fun getIdentifier(position: Int): Playlist? { - return dataSet[position] - } + override fun onMultipleItemAction(menuItem: MenuItem, selection: ArrayList) { + when (menuItem.itemId) { + R.id.action_delete_playlist -> { + var i = 0 + while (i < selection.size) { + val playlist = selection[i] + if (playlist is AbsSmartPlaylist) { + ClearSmartPlaylistDialog.create(playlist).show( + activity.supportFragmentManager, "CLEAR_PLAYLIST_" + playlist.name + ) + selection.remove(playlist) + i-- + } + i++ + } + if (selection.size > 0) { + DeletePlaylistDialog.create(selection) + .show(activity.supportFragmentManager, "DELETE_PLAYLIST") + } + } + else -> SongsMenuHelper.handleMenuClick( + activity, + getSongList(selection), + menuItem.itemId + ) + } + } - override fun getName(playlist: Playlist): String { - return playlist.name - } + private fun getSongList(playlists: List): ArrayList { + val songs = ArrayList() + for (playlist in playlists) { + if (playlist is AbsCustomPlaylist) { + songs.addAll(playlist.getSongs(activity)) + } else { + songs.addAll(PlaylistSongsLoader.getPlaylistSongList(activity, playlist.id)) + } + } + return songs + } - override fun onMultipleItemAction(menuItem: MenuItem, selection: ArrayList) { - when (menuItem.itemId) { - R.id.action_delete_playlist -> { - var i = 0 - while (i < selection.size) { - val playlist = selection[i] - if (playlist is AbsSmartPlaylist) { - ClearSmartPlaylistDialog.create(playlist) - .show(activity.supportFragmentManager, - "CLEAR_PLAYLIST_" + playlist.name) - selection.remove(playlist) - i-- - } - i++ - } - if (selection.size > 0) { - DeletePlaylistDialog.create(selection) - .show(activity.supportFragmentManager, "DELETE_PLAYLIST") - } - } - else -> SongsMenuHelper.handleMenuClick(activity, getSongList(selection), menuItem.itemId) - } - } + private fun getSongs(playlist: Playlist): ArrayList { + val songs = ArrayList() + if (playlist is AbsSmartPlaylist) { + songs.addAll(playlist.getSongs(activity)) + } else { + songs.addAll(PlaylistSongsLoader.getPlaylistSongList(activity, playlist.id)) + } + return songs + } - private fun getSongList(playlists: List): ArrayList { - val songs = ArrayList() - for (playlist in playlists) { - if (playlist is AbsCustomPlaylist) { - songs.addAll(playlist.getSongs(activity)) - } else { - songs.addAll(PlaylistSongsLoader.getPlaylistSongList(activity, playlist.id)) - } - } - return songs - } + inner class ViewHolder(itemView: View) : MediaEntryViewHolder(itemView) { + init { - private fun getSongs(playlist: Playlist): ArrayList { - val songs = ArrayList() - if (playlist is AbsSmartPlaylist) { - songs.addAll(playlist.getSongs(activity)) - } else { - songs.addAll(PlaylistSongsLoader.getPlaylistSongList(activity, playlist.id)) - } - return songs - } + image?.apply { + val iconPadding = activity.resources.getDimensionPixelSize(R.dimen.list_item_image_icon_padding) + setPadding(iconPadding, iconPadding, iconPadding, iconPadding) + //setColorFilter(ATHUtil.resolveColor(activity, R.attr.iconColor), PorterDuff.Mode.SRC_IN) + } + menu?.setOnClickListener { view -> + val playlist = dataSet[adapterPosition] + val popupMenu = PopupMenu(activity, view) + popupMenu.inflate( + if (itemViewType == SMART_PLAYLIST) R.menu.menu_item_smart_playlist + else R.menu.menu_item_playlist + ) + if (playlist is LastAddedPlaylist) { + popupMenu.menu.findItem(R.id.action_clear_playlist).isVisible = false + } + popupMenu.setOnMenuItemClickListener { item -> + if (item.itemId == R.id.action_clear_playlist) { + if (playlist is AbsSmartPlaylist) { + ClearSmartPlaylistDialog.create(playlist).show( + activity.supportFragmentManager, + "CLEAR_SMART_PLAYLIST_" + playlist.name + ) + return@setOnMenuItemClickListener true + } + } + PlaylistMenuHelper.handleMenuClick( + activity, dataSet[adapterPosition], item + ) + } + popupMenu.show() + } - inner class ViewHolder(itemView: View) : MediaEntryViewHolder(itemView) { - init { + imageTextContainer?.apply { + cardElevation = 0f + setCardBackgroundColor(ATHUtil.resolveColor(activity, R.attr.colorPrimary)) + } + } - image?.apply { - val iconPadding = activity.resources.getDimensionPixelSize(R.dimen.list_item_image_icon_padding) - setPadding(iconPadding, iconPadding, iconPadding, iconPadding) - //setColorFilter(ATHUtil.resolveColor(activity, R.attr.iconColor), PorterDuff.Mode.SRC_IN) - } + override fun onClick(v: View?) { + if (isInQuickSelectMode) { + toggleChecked(adapterPosition) + } else { + val playlist = dataSet[adapterPosition] + NavigationUtil.goToPlaylistNew(activity, playlist) + } + } - menu?.setOnClickListener { view -> - val playlist = dataSet[adapterPosition] - val popupMenu = PopupMenu(activity, view) - popupMenu.inflate(if (itemViewType == SMART_PLAYLIST) - R.menu.menu_item_smart_playlist - else - R.menu.menu_item_playlist) - if (playlist is LastAddedPlaylist) { - popupMenu.menu.findItem(R.id.action_clear_playlist).isVisible = false - } - popupMenu.setOnMenuItemClickListener { item -> - if (item.itemId == R.id.action_clear_playlist) { - if (playlist is AbsSmartPlaylist) { - ClearSmartPlaylistDialog.create(playlist) - .show(activity.supportFragmentManager, - "CLEAR_SMART_PLAYLIST_" + playlist.name) - return@setOnMenuItemClickListener true - } - } - PlaylistMenuHelper.handleMenuClick( - activity, dataSet[adapterPosition], item) - } - popupMenu.show() - } + override fun onLongClick(v: View?): Boolean { + toggleChecked(adapterPosition) + return true + } + } - imageTextContainer?.apply { - cardElevation = 0f - setCardBackgroundColor(ATHUtil.resolveColor(activity, R.attr.colorPrimary)) - } - } - - override fun onClick(v: View?) { - if (isInQuickSelectMode) { - toggleChecked(adapterPosition) - } else { - val playlist = dataSet[adapterPosition] - NavigationUtil.goToPlaylistNew(activity, playlist) - } - } - - override fun onLongClick(v: View?): Boolean { - toggleChecked(adapterPosition) - return true - } - } - - companion object { - val TAG: String = PlaylistAdapter::class.java.simpleName - private const val SMART_PLAYLIST = 0 - private const val DEFAULT_PLAYLIST = 1 - } + companion object { + val TAG: String = PlaylistAdapter::class.java.simpleName + private const val SMART_PLAYLIST = 0 + private const val DEFAULT_PLAYLIST = 1 + } } diff --git a/app/src/main/java/code/name/monkey/retromusic/adapter/song/AbsOffsetSongAdapter.kt b/app/src/main/java/code/name/monkey/retromusic/adapter/song/AbsOffsetSongAdapter.kt index 53b3d2e2e..9cf2aaf12 100644 --- a/app/src/main/java/code/name/monkey/retromusic/adapter/song/AbsOffsetSongAdapter.kt +++ b/app/src/main/java/code/name/monkey/retromusic/adapter/song/AbsOffsetSongAdapter.kt @@ -1,8 +1,6 @@ package code.name.monkey.retromusic.adapter.song -import android.view.LayoutInflater -import android.view.View -import android.view.ViewGroup +import android.view.* import androidx.annotation.LayoutRes import androidx.appcompat.app.AppCompatActivity import code.name.monkey.retromusic.R @@ -11,75 +9,87 @@ import code.name.monkey.retromusic.interfaces.CabHolder import code.name.monkey.retromusic.model.Song import java.util.* - abstract class AbsOffsetSongAdapter : SongAdapter { - constructor(activity: AppCompatActivity, dataSet: ArrayList, @LayoutRes itemLayoutRes: Int, usePalette: Boolean, cabHolder: CabHolder?) : super(activity, dataSet, itemLayoutRes, usePalette, cabHolder) + constructor( + activity: AppCompatActivity, + dataSet: ArrayList, @LayoutRes itemLayoutRes: Int, + usePalette: Boolean, + cabHolder: CabHolder? + ) : super(activity, dataSet, itemLayoutRes, usePalette, cabHolder) - constructor(activity: AppCompatActivity, dataSet: ArrayList, @LayoutRes itemLayoutRes: Int, usePalette: Boolean, cabHolder: CabHolder?, showSectionName: Boolean) : super(activity, dataSet, itemLayoutRes, usePalette, cabHolder, showSectionName) {} + constructor( + activity: AppCompatActivity, + dataSet: ArrayList, @LayoutRes itemLayoutRes: Int, + usePalette: Boolean, + cabHolder: CabHolder?, + showSectionName: Boolean + ) : super(activity, dataSet, itemLayoutRes, usePalette, cabHolder, showSectionName) { + } - override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): SongAdapter.ViewHolder { - if (viewType == OFFSET_ITEM) { - val view = LayoutInflater.from(activity).inflate(R.layout.item_list_quick_actions, parent, false) - return createViewHolder(view) - } - return super.onCreateViewHolder(parent, viewType) - } + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): SongAdapter.ViewHolder { + if (viewType == OFFSET_ITEM) { + val view = LayoutInflater.from(activity) + .inflate(R.layout.item_list_quick_actions, parent, false) + return createViewHolder(view) + } + return super.onCreateViewHolder(parent, viewType) + } - override fun createViewHolder(view: View): SongAdapter.ViewHolder { - return ViewHolder(view) - } + override fun createViewHolder(view: View): SongAdapter.ViewHolder { + return ViewHolder(view) + } - override fun getItemId(position: Int): Long { - var positionFinal = position - positionFinal-- - return if (positionFinal < 0) -2 else super.getItemId(positionFinal) - } + override fun getItemId(position: Int): Long { + var positionFinal = position + positionFinal-- + return if (positionFinal < 0) -2 else super.getItemId(positionFinal) + } - override fun getIdentifier(position: Int): Song? { - var positionFinal = position - positionFinal-- - return if (positionFinal < 0) null else super.getIdentifier(positionFinal) - } + override fun getIdentifier(position: Int): Song? { + var positionFinal = position + positionFinal-- + return if (positionFinal < 0) null else super.getIdentifier(positionFinal) + } - override fun getItemCount(): Int { - val superItemCount = super.getItemCount() - return if (superItemCount == 0) 0 else superItemCount + 1 - } + override fun getItemCount(): Int { + val superItemCount = super.getItemCount() + return if (superItemCount == 0) 0 else superItemCount + 1 + } - override fun getItemViewType(position: Int): Int { - return if (position == 0) OFFSET_ITEM else SONG - } + override fun getItemViewType(position: Int): Int { + return if (position == 0) OFFSET_ITEM else SONG + } - override fun getSectionName(position: Int): String { - var positionF = position - positionF-- - return if (positionF < 0) "" else super.getSectionName(positionF) - } + override fun getSectionName(position: Int): String { + var positionF = position + positionF-- + return if (positionF < 0) "" else super.getSectionName(positionF) + } - open inner class ViewHolder(itemView: View) : SongAdapter.ViewHolder(itemView) { + open inner class ViewHolder(itemView: View) : SongAdapter.ViewHolder(itemView) { - override// could also return null, just to be safe return empty song - val song: Song - get() = if (itemViewType == OFFSET_ITEM) Song.emptySong else dataSet[adapterPosition - 1] + override // could also return null, just to be safe return empty song + val song: Song + get() = if (itemViewType == OFFSET_ITEM) Song.emptySong else dataSet[adapterPosition - 1] - override fun onClick(v: View?) { - if (isInQuickSelectMode && itemViewType != OFFSET_ITEM) { - toggleChecked(adapterPosition) - } else { - MusicPlayerRemote.openQueue(dataSet, adapterPosition - 1, true) - } - } + override fun onClick(v: View?) { + if (isInQuickSelectMode && itemViewType != OFFSET_ITEM) { + toggleChecked(adapterPosition) + } else { + MusicPlayerRemote.openQueue(dataSet, adapterPosition - 1, true) + } + } - override fun onLongClick(v: View?): Boolean { - if (itemViewType == OFFSET_ITEM) return false - toggleChecked(adapterPosition) - return true - } - } + override fun onLongClick(v: View?): Boolean { + if (itemViewType == OFFSET_ITEM) return false + toggleChecked(adapterPosition) + return true + } + } - companion object { - const val OFFSET_ITEM = 0 - const val SONG = 1 - } + companion object { + const val OFFSET_ITEM = 0 + const val SONG = 1 + } } \ No newline at end of file diff --git a/app/src/main/java/code/name/monkey/retromusic/adapter/song/OrderablePlaylistSongAdapter.kt b/app/src/main/java/code/name/monkey/retromusic/adapter/song/OrderablePlaylistSongAdapter.kt index 2753c13c8..5095a4408 100644 --- a/app/src/main/java/code/name/monkey/retromusic/adapter/song/OrderablePlaylistSongAdapter.kt +++ b/app/src/main/java/code/name/monkey/retromusic/adapter/song/OrderablePlaylistSongAdapter.kt @@ -1,133 +1,134 @@ package code.name.monkey.retromusic.adapter.song -import android.view.MenuItem -import android.view.View -import androidx.annotation.LayoutRes +import android.view.* import androidx.appcompat.app.AppCompatActivity import code.name.monkey.retromusic.R import code.name.monkey.retromusic.dialogs.RemoveFromPlaylistDialog import code.name.monkey.retromusic.interfaces.CabHolder -import code.name.monkey.retromusic.model.PlaylistSong -import code.name.monkey.retromusic.model.Song +import code.name.monkey.retromusic.model.* import code.name.monkey.retromusic.util.ViewUtil -import com.h6ah4i.android.widget.advrecyclerview.draggable.DraggableItemAdapter -import com.h6ah4i.android.widget.advrecyclerview.draggable.DraggableItemViewHolder -import com.h6ah4i.android.widget.advrecyclerview.draggable.ItemDraggableRange +import com.h6ah4i.android.widget.advrecyclerview.draggable.* import com.h6ah4i.android.widget.advrecyclerview.draggable.annotation.DraggableItemStateFlags +class OrderablePlaylistSongAdapter( + activity: AppCompatActivity, + dataSet: ArrayList, + itemLayoutRes: Int, + usePalette: Boolean, + cabHolder: CabHolder?, + private val onMoveItemListener: OnMoveItemListener? +) : PlaylistSongAdapter( + activity, dataSet, itemLayoutRes, usePalette, cabHolder +), DraggableItemAdapter { -class OrderablePlaylistSongAdapter(activity: AppCompatActivity, - dataSet: ArrayList, - @LayoutRes itemLayoutRes: Int, - usePalette: Boolean, - cabHolder: CabHolder?, - private val onMoveItemListener: OnMoveItemListener?) : PlaylistSongAdapter(activity, dataSet, itemLayoutRes, usePalette, cabHolder), DraggableItemAdapter { + init { + setMultiSelectMenuRes(code.name.monkey.retromusic.R.menu.menu_playlists_songs_selection) + } - init { - setMultiSelectMenuRes(code.name.monkey.retromusic.R.menu.menu_playlists_songs_selection) - } + override fun createViewHolder(view: View): SongAdapter.ViewHolder { + return ViewHolder(view) + } - override fun createViewHolder(view: View): SongAdapter.ViewHolder { - return ViewHolder(view) - } + override fun getItemId(position: Int): Long { + var positionFinal = position + positionFinal-- - override fun getItemId(position: Int): Long { - var positionFinal = position - positionFinal-- + var long: Long = 0 + if (positionFinal < 0) { + long = -2 + } else { + if (dataSet[positionFinal] is PlaylistSong) { + long = (dataSet[positionFinal] as PlaylistSong).idInPlayList.toLong() + } + } + return long + } - var long: Long = 0 - if (positionFinal < 0) { - long = -2 - } else { - if (dataSet[positionFinal] is PlaylistSong) { - long = (dataSet[positionFinal] as PlaylistSong).idInPlayList.toLong() - } - } - return long - } + override fun onMultipleItemAction(menuItem: MenuItem, selection: ArrayList) { + when (menuItem.itemId) { + R.id.action_remove_from_playlist -> { + RemoveFromPlaylistDialog.create(selection as ArrayList) + .show(activity.supportFragmentManager, "ADD_PLAYLIST") + return + } + } + super.onMultipleItemAction(menuItem, selection) + } - override fun onMultipleItemAction(menuItem: MenuItem, selection: ArrayList) { - when (menuItem.itemId) { - R.id.action_remove_from_playlist -> { - RemoveFromPlaylistDialog.create(selection as ArrayList).show(activity.supportFragmentManager, "ADD_PLAYLIST") - return - } - } - super.onMultipleItemAction(menuItem, selection) - } + override fun onCheckCanStartDrag(holder: ViewHolder, position: Int, x: Int, y: Int): Boolean { + return onMoveItemListener != null && position > 0 && (ViewUtil.hitTest( + holder.dragView!!, x, y + ) || ViewUtil.hitTest(holder.image!!, x, y)) + } - override fun onCheckCanStartDrag(holder: ViewHolder, position: Int, x: Int, y: Int): Boolean { - return onMoveItemListener != null && position > 0 && - (ViewUtil.hitTest(holder.dragView!!, x, y) || ViewUtil.hitTest(holder.image!!, x, y)) - } + override fun onGetItemDraggableRange(holder: ViewHolder, position: Int): ItemDraggableRange { + return ItemDraggableRange(1, dataSet.size) + } - override fun onGetItemDraggableRange(holder: ViewHolder, position: Int): ItemDraggableRange { - return ItemDraggableRange(1, dataSet.size) - } + override fun onMoveItem(fromPosition: Int, toPosition: Int) { + if (onMoveItemListener != null && fromPosition != toPosition) { + onMoveItemListener.onMoveItem(fromPosition - 1, toPosition - 1) + } + } - override fun onMoveItem(fromPosition: Int, toPosition: Int) { - if (onMoveItemListener != null && fromPosition != toPosition) { - onMoveItemListener.onMoveItem(fromPosition - 1, toPosition - 1) - } - } + override fun onCheckCanDrop(draggingPosition: Int, dropPosition: Int): Boolean { + return dropPosition > 0 + } - override fun onCheckCanDrop(draggingPosition: Int, dropPosition: Int): Boolean { - return dropPosition > 0 - } + override fun onItemDragStarted(position: Int) { + notifyDataSetChanged() + } - override fun onItemDragStarted(position: Int) { - notifyDataSetChanged() - } + override fun onItemDragFinished(fromPosition: Int, toPosition: Int, result: Boolean) { + notifyDataSetChanged() + } - override fun onItemDragFinished(fromPosition: Int, toPosition: Int, result: Boolean) { - notifyDataSetChanged() - } + interface OnMoveItemListener { + fun onMoveItem(fromPosition: Int, toPosition: Int) + } - interface OnMoveItemListener { - fun onMoveItem(fromPosition: Int, toPosition: Int) - } + inner class ViewHolder(itemView: View) : PlaylistSongAdapter.ViewHolder(itemView), DraggableItemViewHolder { + @DraggableItemStateFlags + private var mDragStateFlags: Int = 0 - inner class ViewHolder(itemView: View) : PlaylistSongAdapter.ViewHolder(itemView), DraggableItemViewHolder { - @DraggableItemStateFlags - private var mDragStateFlags: Int = 0 + override var songMenuRes: Int + get() = code.name.monkey.retromusic.R.menu.menu_item_playlist_song + set(value) { + super.songMenuRes = value + } - override var songMenuRes: Int - get() = code.name.monkey.retromusic.R.menu.menu_item_playlist_song - set(value) { - super.songMenuRes = value - } + init { + if (dragView != null) { + if (onMoveItemListener != null) { + dragView?.visibility = View.VISIBLE + } else { + dragView?.visibility = View.GONE + } + } + } - init { - if (dragView != null) { - if (onMoveItemListener != null) { - dragView?.visibility = View.VISIBLE - } else { - dragView?.visibility = View.GONE - } - } - } + override fun onSongMenuItemClick(item: MenuItem): Boolean { + when (item.itemId) { + code.name.monkey.retromusic.R.id.action_remove_from_playlist -> { + RemoveFromPlaylistDialog.create(song as PlaylistSong) + .show(activity.supportFragmentManager, "REMOVE_FROM_PLAYLIST") + return true + } + } + return super.onSongMenuItemClick(item) + } - override fun onSongMenuItemClick(item: MenuItem): Boolean { - when (item.itemId) { - code.name.monkey.retromusic.R.id.action_remove_from_playlist -> { - RemoveFromPlaylistDialog.create(song as PlaylistSong).show(activity.supportFragmentManager, "REMOVE_FROM_PLAYLIST") - return true - } - } - return super.onSongMenuItemClick(item) - } + @DraggableItemStateFlags + override fun getDragStateFlags(): Int { + return mDragStateFlags + } - @DraggableItemStateFlags - override fun getDragStateFlags(): Int { - return mDragStateFlags - } + override fun setDragStateFlags(@DraggableItemStateFlags flags: Int) { + mDragStateFlags = flags + } + } - override fun setDragStateFlags(@DraggableItemStateFlags flags: Int) { - mDragStateFlags = flags - } - } - - companion object { - val TAG: String = OrderablePlaylistSongAdapter::class.java.simpleName - } + companion object { + val TAG: String = OrderablePlaylistSongAdapter::class.java.simpleName + } } diff --git a/app/src/main/java/code/name/monkey/retromusic/adapter/song/PlayingQueueAdapter.kt b/app/src/main/java/code/name/monkey/retromusic/adapter/song/PlayingQueueAdapter.kt index 1f388554a..66f927d67 100644 --- a/app/src/main/java/code/name/monkey/retromusic/adapter/song/PlayingQueueAdapter.kt +++ b/app/src/main/java/code/name/monkey/retromusic/adapter/song/PlayingQueueAdapter.kt @@ -1,171 +1,167 @@ package code.name.monkey.retromusic.adapter.song -import android.graphics.Color -import android.graphics.PorterDuff -import android.view.MenuItem -import android.view.View +import android.graphics.* +import android.view.* import android.widget.ImageView import androidx.appcompat.app.AppCompatActivity import code.name.monkey.retromusic.R import code.name.monkey.retromusic.helper.MusicPlayerRemote import code.name.monkey.retromusic.model.Song -import code.name.monkey.retromusic.util.MusicUtil -import code.name.monkey.retromusic.util.ViewUtil -import com.h6ah4i.android.widget.advrecyclerview.draggable.DraggableItemAdapter -import com.h6ah4i.android.widget.advrecyclerview.draggable.DraggableItemViewHolder -import com.h6ah4i.android.widget.advrecyclerview.draggable.ItemDraggableRange +import code.name.monkey.retromusic.util.* +import com.h6ah4i.android.widget.advrecyclerview.draggable.* import com.h6ah4i.android.widget.advrecyclerview.draggable.annotation.DraggableItemStateFlags import java.util.* - -class PlayingQueueAdapter(activity: AppCompatActivity, - dataSet: ArrayList, - private var current: Int, - itemLayoutRes: Int) : SongAdapter( - activity, - dataSet, - itemLayoutRes, - false, - null +class PlayingQueueAdapter( + activity: AppCompatActivity, + dataSet: ArrayList, + private var current: Int, + itemLayoutRes: Int +) : SongAdapter( + activity, dataSet, itemLayoutRes, false, null ), DraggableItemAdapter { - private var color = -1 + private var color = -1 - override fun createViewHolder(view: View): SongAdapter.ViewHolder { - return ViewHolder(view) - } + override fun createViewHolder(view: View): SongAdapter.ViewHolder { + return ViewHolder(view) + } - override fun onBindViewHolder(holder: SongAdapter.ViewHolder, position: Int) { - super.onBindViewHolder(holder, position) - holder.imageText?.text = (position - current).toString() - holder.time?.text = MusicUtil.getReadableDurationString(dataSet[position].duration) - if (holder.itemViewType == HISTORY || holder.itemViewType == CURRENT) { - setAlpha(holder, 0.5f) - } - if (usePalette) { - setColor(holder, Color.WHITE) - } - } + override fun onBindViewHolder(holder: SongAdapter.ViewHolder, position: Int) { + super.onBindViewHolder(holder, position) + holder.imageText?.text = (position - current).toString() + holder.time?.text = MusicUtil.getReadableDurationString(dataSet[position].duration) + if (holder.itemViewType == HISTORY || holder.itemViewType == CURRENT) { + setAlpha(holder, 0.5f) + } + if (usePalette) { + setColor(holder, Color.WHITE) + } + } - private fun setColor(holder: SongAdapter.ViewHolder, white: Int) { + private fun setColor(holder: SongAdapter.ViewHolder, white: Int) { - if (holder.title != null) { - holder.title!!.setTextColor(white) - if (color != -1) { - holder.title!!.setTextColor(color) - } - } + if (holder.title != null) { + holder.title!!.setTextColor(white) + if (color != -1) { + holder.title!!.setTextColor(color) + } + } - holder.text?.setTextColor(white) - holder.time?.setTextColor(white) - holder.imageText?.setTextColor(white) - if (holder.menu != null) { - (holder.menu as ImageView).setColorFilter(white, PorterDuff.Mode.SRC_IN) - } - } + holder.text?.setTextColor(white) + holder.time?.setTextColor(white) + holder.imageText?.setTextColor(white) + if (holder.menu != null) { + (holder.menu as ImageView).setColorFilter(white, PorterDuff.Mode.SRC_IN) + } + } - override fun usePalette(usePalette: Boolean) { - super.usePalette(usePalette) - this.usePalette = usePalette - notifyDataSetChanged() - } + override fun usePalette(usePalette: Boolean) { + super.usePalette(usePalette) + this.usePalette = usePalette + notifyDataSetChanged() + } - override fun getItemViewType(position: Int): Int { - if (position < current) { - return HISTORY - } else if (position > current) { - return UP_NEXT - } - return CURRENT - } + override fun getItemViewType(position: Int): Int { + if (position < current) { + return HISTORY + } else if (position > current) { + return UP_NEXT + } + return CURRENT + } - override fun loadAlbumCover(song: Song, holder: SongAdapter.ViewHolder) { - // We don't want to load it in this adapter - } + override fun loadAlbumCover(song: Song, holder: SongAdapter.ViewHolder) { + // We don't want to load it in this adapter + } - fun swapDataSet(dataSet: ArrayList, position: Int) { - this.dataSet = dataSet - current = position - notifyDataSetChanged() - } + fun swapDataSet(dataSet: ArrayList, position: Int) { + this.dataSet = dataSet + current = position + notifyDataSetChanged() + } - fun setCurrent(current: Int) { - this.current = current - notifyDataSetChanged() - } + fun setCurrent(current: Int) { + this.current = current + notifyDataSetChanged() + } - private fun setAlpha(holder: SongAdapter.ViewHolder, alpha: Float) { - holder.image?.alpha = alpha - holder.title?.alpha = alpha - holder.text?.alpha = alpha - holder.imageText?.alpha = alpha - holder.paletteColorContainer?.alpha = alpha - } + private fun setAlpha(holder: SongAdapter.ViewHolder, alpha: Float) { + holder.image?.alpha = alpha + holder.title?.alpha = alpha + holder.text?.alpha = alpha + holder.imageText?.alpha = alpha + holder.paletteColorContainer?.alpha = alpha + } - override fun onCheckCanStartDrag(holder: ViewHolder, position: Int, x: Int, y: Int): Boolean { - return ViewUtil.hitTest(holder.imageText!!, x, y) || ViewUtil.hitTest(holder.dragView!!, x, y) - } + override fun onCheckCanStartDrag(holder: ViewHolder, position: Int, x: Int, y: Int): Boolean { + return ViewUtil.hitTest(holder.imageText!!, x, y) || ViewUtil.hitTest( + holder.dragView!!, + x, + y + ) + } - override fun onGetItemDraggableRange(holder: ViewHolder, position: Int): ItemDraggableRange? { - return null - } + override fun onGetItemDraggableRange(holder: ViewHolder, position: Int): ItemDraggableRange? { + return null + } - override fun onMoveItem(fromPosition: Int, toPosition: Int) { - MusicPlayerRemote.moveSong(fromPosition, toPosition) - } + override fun onMoveItem(fromPosition: Int, toPosition: Int) { + MusicPlayerRemote.moveSong(fromPosition, toPosition) + } - override fun onCheckCanDrop(draggingPosition: Int, dropPosition: Int): Boolean { - return true - } + override fun onCheckCanDrop(draggingPosition: Int, dropPosition: Int): Boolean { + return true + } - override fun onItemDragStarted(position: Int) { - notifyDataSetChanged() - } + override fun onItemDragStarted(position: Int) { + notifyDataSetChanged() + } - override fun onItemDragFinished(fromPosition: Int, toPosition: Int, result: Boolean) { - notifyDataSetChanged() - } + override fun onItemDragFinished(fromPosition: Int, toPosition: Int, result: Boolean) { + notifyDataSetChanged() + } - inner class ViewHolder(itemView: View) : SongAdapter.ViewHolder(itemView), DraggableItemViewHolder { + inner class ViewHolder(itemView: View) : SongAdapter.ViewHolder(itemView), DraggableItemViewHolder { - @DraggableItemStateFlags - private var mDragStateFlags: Int = 0 + @DraggableItemStateFlags + private var mDragStateFlags: Int = 0 - override var songMenuRes: Int - get() = R.menu.menu_item_playing_queue_song - set(value: Int) { - super.songMenuRes = value - } + override var songMenuRes: Int + get() = R.menu.menu_item_playing_queue_song + set(value: Int) { + super.songMenuRes = value + } - init { - imageText?.visibility = View.VISIBLE - dragView?.visibility = View.VISIBLE - } + init { + imageText?.visibility = View.VISIBLE + dragView?.visibility = View.VISIBLE + } - override fun onSongMenuItemClick(item: MenuItem): Boolean { - when (item.itemId) { - R.id.action_remove_from_playing_queue -> { - MusicPlayerRemote.removeFromQueue(adapterPosition) - return true - } - } - return super.onSongMenuItemClick(item) - } + override fun onSongMenuItemClick(item: MenuItem): Boolean { + when (item.itemId) { + R.id.action_remove_from_playing_queue -> { + MusicPlayerRemote.removeFromQueue(adapterPosition) + return true + } + } + return super.onSongMenuItemClick(item) + } - @DraggableItemStateFlags - override fun getDragStateFlags(): Int { - return mDragStateFlags - } + @DraggableItemStateFlags + override fun getDragStateFlags(): Int { + return mDragStateFlags + } - override fun setDragStateFlags(@DraggableItemStateFlags flags: Int) { - mDragStateFlags = flags - } - } + override fun setDragStateFlags(@DraggableItemStateFlags flags: Int) { + mDragStateFlags = flags + } + } - companion object { + companion object { - private const val HISTORY = 0 - private const val CURRENT = 1 - private const val UP_NEXT = 2 - } + private const val HISTORY = 0 + private const val CURRENT = 1 + private const val UP_NEXT = 2 + } } diff --git a/app/src/main/java/code/name/monkey/retromusic/adapter/song/PlaylistSongAdapter.kt b/app/src/main/java/code/name/monkey/retromusic/adapter/song/PlaylistSongAdapter.kt index 95dc7690a..0dde0b58f 100644 --- a/app/src/main/java/code/name/monkey/retromusic/adapter/song/PlaylistSongAdapter.kt +++ b/app/src/main/java/code/name/monkey/retromusic/adapter/song/PlaylistSongAdapter.kt @@ -2,89 +2,95 @@ package code.name.monkey.retromusic.adapter.song import android.app.ActivityOptions import android.content.res.ColorStateList -import android.view.MenuItem -import android.view.View -import androidx.annotation.LayoutRes +import android.view.* import androidx.appcompat.app.AppCompatActivity -import code.name.monkey.appthemehelper.util.ColorUtil -import code.name.monkey.appthemehelper.util.MaterialValueHelper +import code.name.monkey.appthemehelper.util.* import code.name.monkey.retromusic.R import code.name.monkey.retromusic.helper.MusicPlayerRemote import code.name.monkey.retromusic.interfaces.CabHolder import code.name.monkey.retromusic.model.Song -import code.name.monkey.retromusic.util.NavigationUtil -import code.name.monkey.retromusic.util.RetroColorUtil +import code.name.monkey.retromusic.util.* import com.google.android.material.button.MaterialButton import java.util.* +open class PlaylistSongAdapter( + activity: AppCompatActivity, + dataSet: ArrayList, + itemLayoutRes: Int, + usePalette: Boolean, + cabHolder: CabHolder? +) : AbsOffsetSongAdapter(activity, dataSet, itemLayoutRes, usePalette, cabHolder, false) { -open class PlaylistSongAdapter(activity: AppCompatActivity, - dataSet: ArrayList, - @LayoutRes itemLayoutRes: Int, - usePalette: Boolean, - cabHolder: CabHolder?) : - AbsOffsetSongAdapter(activity, dataSet, itemLayoutRes, usePalette, cabHolder, false) { + init { + this.setMultiSelectMenuRes(R.menu.menu_cannot_delete_single_songs_playlist_songs_selection) + } - init { - this.setMultiSelectMenuRes(R.menu.menu_cannot_delete_single_songs_playlist_songs_selection) - } + override fun createViewHolder(view: View): SongAdapter.ViewHolder { + return ViewHolder(view) + } - override fun createViewHolder(view: View): SongAdapter.ViewHolder { - return ViewHolder(view) - } + override fun onBindViewHolder(holder: SongAdapter.ViewHolder, position: Int) { - override fun onBindViewHolder(holder: SongAdapter.ViewHolder, position: Int) { + if (holder.itemViewType == OFFSET_ITEM) { - if (holder.itemViewType == OFFSET_ITEM) { + val buttonColor = RetroColorUtil.toolbarColor(activity) + val textColor = MaterialValueHelper.getPrimaryTextColor( + activity, ColorUtil.isColorLight( + buttonColor + ) + ) + val viewHolder = holder as ViewHolder - val buttonColor = RetroColorUtil.toolbarColor(activity) - val textColor = MaterialValueHelper.getPrimaryTextColor(activity, ColorUtil.isColorLight(buttonColor)) - val viewHolder = holder as ViewHolder + viewHolder.playAction?.let { + it.backgroundTintList = ColorStateList.valueOf(buttonColor) + it.setTextColor(textColor) + it.iconTint = ColorStateList.valueOf(textColor) + it.setOnClickListener { + MusicPlayerRemote.openQueue(dataSet, 0, true) + } + } + viewHolder.shuffleAction?.let { + it.backgroundTintList = ColorStateList.valueOf(buttonColor) + it.setTextColor(textColor) + it.iconTint = ColorStateList.valueOf(textColor) + it.setOnClickListener { + MusicPlayerRemote.openAndShuffleQueue(dataSet, true) + } + } - viewHolder.playAction?.let { - it.backgroundTintList = ColorStateList.valueOf(buttonColor) - it.setTextColor(textColor) - it.iconTint = ColorStateList.valueOf(textColor) - it.setOnClickListener { - MusicPlayerRemote.openQueue(dataSet, 0, true) - } - } - viewHolder.shuffleAction?.let { - it.backgroundTintList = ColorStateList.valueOf(buttonColor) - it.setTextColor(textColor) - it.iconTint = ColorStateList.valueOf(textColor) - it.setOnClickListener { - MusicPlayerRemote.openAndShuffleQueue(dataSet, true) - } - } + } else { + super.onBindViewHolder(holder, position - 1) + } + } - } else { - super.onBindViewHolder(holder, position - 1) - } - } + open inner class ViewHolder(itemView: View) : AbsOffsetSongAdapter.ViewHolder(itemView) { - open inner class ViewHolder(itemView: View) : AbsOffsetSongAdapter.ViewHolder(itemView) { + val playAction: MaterialButton? = itemView.findViewById(R.id.playAction) + val shuffleAction: MaterialButton? = itemView.findViewById(R.id.shuffleAction) - val playAction: MaterialButton? = itemView.findViewById(R.id.playAction) - val shuffleAction: MaterialButton? = itemView.findViewById(R.id.shuffleAction) + override var songMenuRes: Int + get() = R.menu.menu_item_cannot_delete_single_songs_playlist_song + set(value) { + super.songMenuRes = value + } - override var songMenuRes: Int - get() = R.menu.menu_item_cannot_delete_single_songs_playlist_song - set(value) { - super.songMenuRes = value - } + override fun onSongMenuItemClick(item: MenuItem): Boolean { + if (item.itemId == R.id.action_go_to_album) { + val activityOptions = ActivityOptions.makeSceneTransitionAnimation( + activity, image, activity.getString( + R.string.transition_album_art + ) + ) + NavigationUtil.goToAlbumOptions( + activity, dataSet[adapterPosition - 1].albumId, activityOptions + ) + return true + } + return super.onSongMenuItemClick(item) + } + } - override fun onSongMenuItemClick(item: MenuItem): Boolean { - if (item.itemId == R.id.action_go_to_album) { - val activityOptions = ActivityOptions.makeSceneTransitionAnimation(activity, image, activity.getString(R.string.transition_album_art)) - NavigationUtil.goToAlbumOptions(activity, dataSet[adapterPosition - 1].albumId, activityOptions) - return true - } - return super.onSongMenuItemClick(item) - } - } - - companion object { - val TAG: String = PlaylistSongAdapter::class.java.simpleName - } + companion object { + val TAG: String = PlaylistSongAdapter::class.java.simpleName + } } \ No newline at end of file diff --git a/app/src/main/java/code/name/monkey/retromusic/adapter/song/ShuffleButtonSongAdapter.kt b/app/src/main/java/code/name/monkey/retromusic/adapter/song/ShuffleButtonSongAdapter.kt index fe1136787..a0e63ae71 100644 --- a/app/src/main/java/code/name/monkey/retromusic/adapter/song/ShuffleButtonSongAdapter.kt +++ b/app/src/main/java/code/name/monkey/retromusic/adapter/song/ShuffleButtonSongAdapter.kt @@ -1,7 +1,6 @@ package code.name.monkey.retromusic.adapter.song import android.view.View -import androidx.annotation.LayoutRes import androidx.appcompat.app.AppCompatActivity import code.name.monkey.retromusic.R import code.name.monkey.retromusic.helper.MusicPlayerRemote @@ -10,45 +9,46 @@ import code.name.monkey.retromusic.model.Song import com.google.android.material.button.MaterialButton import java.util.* +class ShuffleButtonSongAdapter( + activity: AppCompatActivity, + dataSet: ArrayList, + itemLayoutRes: Int, + usePalette: Boolean, + cabHolder: CabHolder? +) : AbsOffsetSongAdapter(activity, dataSet, itemLayoutRes, usePalette, cabHolder) { -class ShuffleButtonSongAdapter(activity: AppCompatActivity, - dataSet: ArrayList, - @LayoutRes itemLayoutRes: Int, - usePalette: Boolean, - cabHolder: CabHolder?) : AbsOffsetSongAdapter(activity, dataSet, itemLayoutRes, usePalette, cabHolder) { + override fun createViewHolder(view: View): SongAdapter.ViewHolder { + return ViewHolder(view) + } - override fun createViewHolder(view: View): SongAdapter.ViewHolder { - return ViewHolder(view) - } + override fun onBindViewHolder(holder: SongAdapter.ViewHolder, position: Int) { + if (holder.itemViewType == OFFSET_ITEM) { + val viewHolder = holder as ViewHolder + viewHolder.playAction?.let { + it.setOnClickListener { + MusicPlayerRemote.openQueue(dataSet, 0, true) + } + } + viewHolder.shuffleAction?.let { + it.setOnClickListener { + MusicPlayerRemote.openAndShuffleQueue(dataSet, true) + } + } + } else { + super.onBindViewHolder(holder, position - 1) + } + } - override fun onBindViewHolder(holder: SongAdapter.ViewHolder, position: Int) { - if (holder.itemViewType == OFFSET_ITEM) { - val viewHolder = holder as ViewHolder - viewHolder.playAction?.let { - it.setOnClickListener { - MusicPlayerRemote.openQueue(dataSet, 0, true) - } - } - viewHolder.shuffleAction?.let { - it.setOnClickListener { - MusicPlayerRemote.openAndShuffleQueue(dataSet, true) - } - } - } else { - super.onBindViewHolder(holder, position - 1) - } - } + inner class ViewHolder(itemView: View) : AbsOffsetSongAdapter.ViewHolder(itemView) { + val playAction: MaterialButton? = itemView.findViewById(R.id.playAction) + val shuffleAction: MaterialButton? = itemView.findViewById(R.id.shuffleAction) - inner class ViewHolder(itemView: View) : AbsOffsetSongAdapter.ViewHolder(itemView) { - val playAction: MaterialButton? = itemView.findViewById(R.id.playAction) - val shuffleAction: MaterialButton? = itemView.findViewById(R.id.shuffleAction) - - override fun onClick(v: View?) { - if (itemViewType == OFFSET_ITEM) { - MusicPlayerRemote.openAndShuffleQueue(dataSet, true) - return - } - super.onClick(v) - } - } + override fun onClick(v: View?) { + if (itemViewType == OFFSET_ITEM) { + MusicPlayerRemote.openAndShuffleQueue(dataSet, true) + return + } + super.onClick(v) + } + } } \ No newline at end of file diff --git a/app/src/main/java/code/name/monkey/retromusic/adapter/song/SimpleSongAdapter.kt b/app/src/main/java/code/name/monkey/retromusic/adapter/song/SimpleSongAdapter.kt index 4193c58a4..5c5b96080 100755 --- a/app/src/main/java/code/name/monkey/retromusic/adapter/song/SimpleSongAdapter.kt +++ b/app/src/main/java/code/name/monkey/retromusic/adapter/song/SimpleSongAdapter.kt @@ -1,38 +1,34 @@ package code.name.monkey.retromusic.adapter.song -import android.view.LayoutInflater -import android.view.ViewGroup -import androidx.annotation.LayoutRes +import android.view.* import androidx.appcompat.app.AppCompatActivity import code.name.monkey.retromusic.model.Song import code.name.monkey.retromusic.util.MusicUtil import java.util.* +class SimpleSongAdapter( + context: AppCompatActivity, songs: ArrayList, i: Int +) : SongAdapter(context, songs, i, false, null) { -class SimpleSongAdapter(context: AppCompatActivity, - songs: ArrayList, - @LayoutRes i: Int) : SongAdapter(context, songs, i, false, null) { + override fun swapDataSet(dataSet: ArrayList) { + this.dataSet.clear() + this.dataSet = dataSet + notifyDataSetChanged() + } + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder { + return ViewHolder(LayoutInflater.from(activity).inflate(itemLayoutRes, parent, false)) + } - override fun swapDataSet(dataSet: ArrayList) { - this.dataSet.clear() - this.dataSet = dataSet - notifyDataSetChanged() - } + override fun onBindViewHolder(holder: ViewHolder, position: Int) { + super.onBindViewHolder(holder, position) + val fixedTrackNumber = MusicUtil.getFixedTrackNumber(dataSet[position].trackNumber) - override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder { - return ViewHolder(LayoutInflater.from(activity).inflate(itemLayoutRes, parent, false)) - } + holder.imageText?.text = if (fixedTrackNumber > 0) fixedTrackNumber.toString() else "-" + holder.time?.text = MusicUtil.getReadableDurationString(dataSet[position].duration) + } - override fun onBindViewHolder(holder: ViewHolder, position: Int) { - super.onBindViewHolder(holder, position) - val fixedTrackNumber = MusicUtil.getFixedTrackNumber(dataSet[position].trackNumber) - - holder.imageText?.text = if (fixedTrackNumber > 0) fixedTrackNumber.toString() else "-" - holder.time?.text = MusicUtil.getReadableDurationString(dataSet[position].duration) - } - - override fun getItemCount(): Int { - return dataSet.size - } + override fun getItemCount(): Int { + return dataSet.size + } } diff --git a/app/src/main/java/code/name/monkey/retromusic/adapter/song/SongAdapter.kt b/app/src/main/java/code/name/monkey/retromusic/adapter/song/SongAdapter.kt index f36d1d19c..f185b9124 100644 --- a/app/src/main/java/code/name/monkey/retromusic/adapter/song/SongAdapter.kt +++ b/app/src/main/java/code/name/monkey/retromusic/adapter/song/SongAdapter.kt @@ -2,209 +2,214 @@ package code.name.monkey.retromusic.adapter.song import android.app.ActivityOptions import android.graphics.drawable.Drawable -import android.view.LayoutInflater -import android.view.MenuItem -import android.view.View -import android.view.ViewGroup +import android.view.* import androidx.appcompat.app.AppCompatActivity -import code.name.monkey.appthemehelper.util.ColorUtil -import code.name.monkey.appthemehelper.util.MaterialValueHelper +import code.name.monkey.appthemehelper.util.* import code.name.monkey.retromusic.R -import code.name.monkey.retromusic.adapter.base.AbsMultiSelectAdapter -import code.name.monkey.retromusic.adapter.base.MediaEntryViewHolder -import code.name.monkey.retromusic.glide.RetroMusicColoredTarget -import code.name.monkey.retromusic.glide.SongGlideRequest -import code.name.monkey.retromusic.helper.MusicPlayerRemote -import code.name.monkey.retromusic.helper.SortOrder -import code.name.monkey.retromusic.helper.menu.SongMenuHelper -import code.name.monkey.retromusic.helper.menu.SongsMenuHelper +import code.name.monkey.retromusic.adapter.base.* +import code.name.monkey.retromusic.glide.* +import code.name.monkey.retromusic.helper.* +import code.name.monkey.retromusic.helper.menu.* import code.name.monkey.retromusic.interfaces.CabHolder import code.name.monkey.retromusic.model.Song -import code.name.monkey.retromusic.util.MusicUtil -import code.name.monkey.retromusic.util.NavigationUtil -import code.name.monkey.retromusic.util.PreferenceUtil +import code.name.monkey.retromusic.util.* import com.afollestad.materialcab.MaterialCab import com.bumptech.glide.Glide import com.simplecityapps.recyclerview_fastscroll.views.FastScrollRecyclerView import java.util.* - /** * Created by hemanths on 13/08/17. */ -open class SongAdapter @JvmOverloads constructor( - protected val activity: AppCompatActivity, - dataSet: ArrayList, - protected var itemLayoutRes: Int, - usePalette: Boolean, - cabHolder: CabHolder?, - showSectionName: Boolean = true -) : AbsMultiSelectAdapter(activity, cabHolder, R.menu.menu_media_selection), MaterialCab.Callback, FastScrollRecyclerView.SectionedAdapter { - var dataSet: ArrayList +open class SongAdapter( + protected val activity: AppCompatActivity, + dataSet: ArrayList, + protected var itemLayoutRes: Int, + usePalette: Boolean, + cabHolder: CabHolder?, + showSectionName: Boolean = true +) : AbsMultiSelectAdapter( + activity, cabHolder, R.menu.menu_media_selection +), MaterialCab.Callback, FastScrollRecyclerView.SectionedAdapter { + var dataSet: ArrayList - protected var usePalette = false - private var showSectionName = true + protected var usePalette = false + private var showSectionName = true - init { - this.dataSet = dataSet - this.usePalette = usePalette - this.showSectionName = showSectionName - this.setHasStableIds(true) - } + init { + this.dataSet = dataSet + this.usePalette = usePalette + this.showSectionName = showSectionName + this.setHasStableIds(true) + } - open fun swapDataSet(dataSet: ArrayList) { - this.dataSet = dataSet - notifyDataSetChanged() - } + open fun swapDataSet(dataSet: ArrayList) { + this.dataSet = dataSet + notifyDataSetChanged() + } - open fun usePalette(usePalette: Boolean) { - this.usePalette = usePalette - notifyDataSetChanged() - } + open fun usePalette(usePalette: Boolean) { + this.usePalette = usePalette + notifyDataSetChanged() + } - override fun getItemId(position: Int): Long { - return dataSet[position].id.toLong() - } + override fun getItemId(position: Int): Long { + return dataSet[position].id.toLong() + } - override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder { - val view = LayoutInflater.from(activity).inflate(itemLayoutRes, parent, false) - return createViewHolder(view) - } + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder { + val view = LayoutInflater.from(activity).inflate(itemLayoutRes, parent, false) + return createViewHolder(view) + } - protected open fun createViewHolder(view: View): ViewHolder { - return ViewHolder(view) - } + protected open fun createViewHolder(view: View): ViewHolder { + return ViewHolder(view) + } - override fun onBindViewHolder(holder: ViewHolder, position: Int) { - val song = dataSet[position] - val isChecked = isChecked(song) - holder.itemView.isActivated = isChecked - holder.title?.text = getSongTitle(song) - holder.text?.text = getSongText(song) - loadAlbumCover(song, holder) - } + override fun onBindViewHolder(holder: ViewHolder, position: Int) { + val song = dataSet[position] + val isChecked = isChecked(song) + holder.itemView.isActivated = isChecked + holder.title?.text = getSongTitle(song) + holder.text?.text = getSongText(song) + loadAlbumCover(song, holder) + } - private fun setColors(color: Int, holder: ViewHolder) { - if (holder.paletteColorContainer != null) { - holder.paletteColorContainer?.setBackgroundColor(color) - holder.title?.setTextColor(MaterialValueHelper.getPrimaryTextColor(activity, ColorUtil.isColorLight(color))) - holder.text?.setTextColor(MaterialValueHelper.getSecondaryTextColor(activity, ColorUtil.isColorLight(color))) - } - } + private fun setColors(color: Int, holder: ViewHolder) { + if (holder.paletteColorContainer != null) { + holder.paletteColorContainer?.setBackgroundColor(color) + holder.title?.setTextColor( + MaterialValueHelper.getPrimaryTextColor( + activity, ColorUtil.isColorLight( + color + ) + ) + ) + holder.text?.setTextColor( + MaterialValueHelper.getSecondaryTextColor( + activity, ColorUtil.isColorLight( + color + ) + ) + ) + } + } - protected open fun loadAlbumCover(song: Song, holder: ViewHolder) { - if (holder.image == null) { - return - } - SongGlideRequest.Builder.from(Glide.with(activity), song) - .checkIgnoreMediaStore(activity) - .generatePalette(activity).build() - .into(object : RetroMusicColoredTarget(holder.image!!) { - override fun onLoadCleared(placeholder: Drawable?) { - super.onLoadCleared(placeholder) - setColors(defaultFooterColor, holder) - } + protected open fun loadAlbumCover(song: Song, holder: ViewHolder) { + if (holder.image == null) { + return + } + SongGlideRequest.Builder.from(Glide.with(activity), song).checkIgnoreMediaStore(activity) + .generatePalette(activity).build() + .into(object : RetroMusicColoredTarget(holder.image!!) { + override fun onLoadCleared(placeholder: Drawable?) { + super.onLoadCleared(placeholder) + setColors(defaultFooterColor, holder) + } - override fun onColorReady(color: Int) { - if (usePalette) - setColors(color, holder) - else - setColors(defaultFooterColor, holder) - } - }) - } + override fun onColorReady(color: Int) { + if (usePalette) setColors(color, holder) + else setColors(defaultFooterColor, holder) + } + }) + } - private fun getSongTitle(song: Song): String? { - return song.title - } + private fun getSongTitle(song: Song): String? { + return song.title + } - private fun getSongText(song: Song): String? { - return song.artistName - } + private fun getSongText(song: Song): String? { + return song.artistName + } - override fun getItemCount(): Int { - return dataSet.size - } + override fun getItemCount(): Int { + return dataSet.size + } - override fun getIdentifier(position: Int): Song? { - return dataSet[position] - } + override fun getIdentifier(position: Int): Song? { + return dataSet[position] + } - override fun getName(song: Song): String { - return song.title - } + override fun getName(song: Song): String { + return song.title + } - override fun onMultipleItemAction(menuItem: MenuItem, - selection: ArrayList) { - SongsMenuHelper.handleMenuClick(activity, selection, menuItem.itemId) - } + override fun onMultipleItemAction( + menuItem: MenuItem, selection: ArrayList + ) { + SongsMenuHelper.handleMenuClick(activity, selection, menuItem.itemId) + } - override fun getSectionName(position: Int): String { - if (!showSectionName) { - return "" - } - val sectionName: String? = when (PreferenceUtil.getInstance(activity).songSortOrder) { - SortOrder.SongSortOrder.SONG_A_Z, SortOrder.SongSortOrder.SONG_Z_A -> dataSet[position].title - SortOrder.SongSortOrder.SONG_ALBUM -> dataSet[position].albumName - SortOrder.SongSortOrder.SONG_ARTIST -> dataSet[position].artistName - SortOrder.SongSortOrder.SONG_YEAR -> return MusicUtil.getYearString(dataSet[position].year) - SortOrder.SongSortOrder.COMPOSER -> dataSet[position].composer - else -> { - return "" - } - } - return MusicUtil.getSectionName(sectionName) - } + override fun getSectionName(position: Int): String { + if (!showSectionName) { + return "" + } + val sectionName: String? = when (PreferenceUtil.getInstance(activity).songSortOrder) { + SortOrder.SongSortOrder.SONG_A_Z, SortOrder.SongSortOrder.SONG_Z_A -> dataSet[position].title + SortOrder.SongSortOrder.SONG_ALBUM -> dataSet[position].albumName + SortOrder.SongSortOrder.SONG_ARTIST -> dataSet[position].artistName + SortOrder.SongSortOrder.SONG_YEAR -> return MusicUtil.getYearString( + dataSet[position].year + ) + SortOrder.SongSortOrder.COMPOSER -> dataSet[position].composer + else -> { + return "" + } + } + return MusicUtil.getSectionName(sectionName) + } - open inner class ViewHolder(itemView: View) : MediaEntryViewHolder(itemView) { - protected open var songMenuRes = SongMenuHelper.MENU_RES - protected open val song: Song - get() = dataSet[adapterPosition] + open inner class ViewHolder(itemView: View) : MediaEntryViewHolder(itemView) { + protected open var songMenuRes = SongMenuHelper.MENU_RES + protected open val song: Song + get() = dataSet[adapterPosition] - init { - setImageTransitionName(activity.getString(R.string.transition_album_art)) - menu?.setOnClickListener(object : SongMenuHelper.OnClickSongMenu(activity) { - override val song: Song - get() = this@ViewHolder.song + init { + setImageTransitionName(activity.getString(R.string.transition_album_art)) + menu?.setOnClickListener(object : SongMenuHelper.OnClickSongMenu(activity) { + override val song: Song + get() = this@ViewHolder.song - override val menuRes: Int - get() = songMenuRes + override val menuRes: Int + get() = songMenuRes - override fun onMenuItemClick(item: MenuItem): Boolean { - return onSongMenuItemClick(item) || super.onMenuItemClick(item) - } - }) - } + override fun onMenuItemClick(item: MenuItem): Boolean { + return onSongMenuItemClick(item) || super.onMenuItemClick(item) + } + }) + } - protected open fun onSongMenuItemClick(item: MenuItem): Boolean { - if (image != null && image!!.visibility == View.VISIBLE) { - when (item.itemId) { - R.id.action_go_to_album -> { - val options: ActivityOptions = ActivityOptions.makeSceneTransitionAnimation(activity, image, activity.getString(R.string.transition_album_art)) - NavigationUtil.goToAlbumOptions(activity, song.albumId, options) - return true - } - } - } - return false - } + protected open fun onSongMenuItemClick(item: MenuItem): Boolean { + if (image != null && image!!.visibility == View.VISIBLE) { + when (item.itemId) { + R.id.action_go_to_album -> { + val options: ActivityOptions = ActivityOptions.makeSceneTransitionAnimation( + activity, image, activity.getString(R.string.transition_album_art) + ) + NavigationUtil.goToAlbumOptions(activity, song.albumId, options) + return true + } + } + } + return false + } - override fun onClick(v: View?) { - if (isInQuickSelectMode) { - toggleChecked(adapterPosition) - } else { - MusicPlayerRemote.openQueue(dataSet, adapterPosition, true) - } - } + override fun onClick(v: View?) { + if (isInQuickSelectMode) { + toggleChecked(adapterPosition) + } else { + MusicPlayerRemote.openQueue(dataSet, adapterPosition, true) + } + } - override fun onLongClick(v: View?): Boolean { - return toggleChecked(adapterPosition) - } - } + override fun onLongClick(v: View?): Boolean { + return toggleChecked(adapterPosition) + } + } - companion object { + companion object { - val TAG: String = SongAdapter::class.java.simpleName - } + val TAG: String = SongAdapter::class.java.simpleName + } } diff --git a/app/src/main/java/code/name/monkey/retromusic/appshortcuts/AppShortcutIconGenerator.kt b/app/src/main/java/code/name/monkey/retromusic/appshortcuts/AppShortcutIconGenerator.kt index 5660d5853..70565d5aa 100644 --- a/app/src/main/java/code/name/monkey/retromusic/appshortcuts/AppShortcutIconGenerator.kt +++ b/app/src/main/java/code/name/monkey/retromusic/appshortcuts/AppShortcutIconGenerator.kt @@ -15,67 +15,69 @@ package code.name.monkey.retromusic.appshortcuts import android.content.Context -import android.graphics.Bitmap -import android.graphics.Canvas -import android.graphics.drawable.Drawable -import android.graphics.drawable.Icon -import android.graphics.drawable.LayerDrawable +import android.graphics.* +import android.graphics.drawable.* import android.os.Build import android.util.TypedValue - import androidx.annotation.RequiresApi import code.name.monkey.appthemehelper.ThemeStore import code.name.monkey.retromusic.R -import code.name.monkey.retromusic.util.PreferenceUtil -import code.name.monkey.retromusic.util.RetroUtil +import code.name.monkey.retromusic.util.* @RequiresApi(Build.VERSION_CODES.N_MR1) object AppShortcutIconGenerator { - fun generateThemedIcon(context: Context, iconId: Int): Icon { - return if (PreferenceUtil.getInstance(context).coloredAppShortcuts()) { - generateUserThemedIcon(context, iconId) - } else { - generateDefaultThemedIcon(context, iconId) - } - } + fun generateThemedIcon(context: Context, iconId: Int): Icon { + return if (PreferenceUtil.getInstance(context).coloredAppShortcuts()) { + generateUserThemedIcon(context, iconId) + } else { + generateDefaultThemedIcon(context, iconId) + } + } - private fun generateDefaultThemedIcon(context: Context, iconId: Int): Icon { - // Return an Icon of iconId with default colors - return generateThemedIcon(context, iconId, - context.getColor(R.color.app_shortcut_default_foreground), - context.getColor(R.color.app_shortcut_default_background) - ) - } + private fun generateDefaultThemedIcon(context: Context, iconId: Int): Icon { + // Return an Icon of iconId with default colors + return generateThemedIcon( + context, + iconId, + context.getColor(R.color.app_shortcut_default_foreground), + context.getColor(R.color.app_shortcut_default_background) + ) + } - private fun generateUserThemedIcon(context: Context, iconId: Int): Icon { - // Get background color from context's theme - val typedColorBackground = TypedValue() - context.theme.resolveAttribute(android.R.attr.colorBackground, typedColorBackground, true) + private fun generateUserThemedIcon(context: Context, iconId: Int): Icon { + // Get background color from context's theme + val typedColorBackground = TypedValue() + context.theme.resolveAttribute(android.R.attr.colorBackground, typedColorBackground, true) - // Return an Icon of iconId with those colors - return generateThemedIcon(context, iconId, - ThemeStore.accentColor(context), - typedColorBackground.data - ) - } + // Return an Icon of iconId with those colors + return generateThemedIcon( + context, iconId, ThemeStore.accentColor(context), typedColorBackground.data + ) + } - private fun generateThemedIcon(context: Context, iconId: Int, foregroundColor: Int, backgroundColor: Int): Icon { - // Get and tint foreground and background drawables - val vectorDrawable = RetroUtil.getTintedVectorDrawable(context, iconId, foregroundColor) - val backgroundDrawable = RetroUtil.getTintedVectorDrawable(context, R.drawable.ic_app_shortcut_background, backgroundColor) + private fun generateThemedIcon( + context: Context, iconId: Int, foregroundColor: Int, backgroundColor: Int + ): Icon { + // Get and tint foreground and background drawables + val vectorDrawable = RetroUtil.getTintedVectorDrawable(context, iconId, foregroundColor) + val backgroundDrawable = RetroUtil.getTintedVectorDrawable( + context, R.drawable.ic_app_shortcut_background, backgroundColor + ) - // Squash the two drawables together - val layerDrawable = LayerDrawable(arrayOf(backgroundDrawable, vectorDrawable)) + // Squash the two drawables together + val layerDrawable = LayerDrawable(arrayOf(backgroundDrawable, vectorDrawable)) - // Return as an Icon - return Icon.createWithBitmap(drawableToBitmap(layerDrawable)) - } + // Return as an Icon + return Icon.createWithBitmap(drawableToBitmap(layerDrawable)) + } - private fun drawableToBitmap(drawable: Drawable): Bitmap { - val bitmap = Bitmap.createBitmap(drawable.intrinsicWidth, drawable.intrinsicHeight, Bitmap.Config.ARGB_8888) - val canvas = Canvas(bitmap) - drawable.setBounds(0, 0, canvas.width, canvas.height) - drawable.draw(canvas) - return bitmap - } + private fun drawableToBitmap(drawable: Drawable): Bitmap { + val bitmap = Bitmap.createBitmap( + drawable.intrinsicWidth, drawable.intrinsicHeight, Bitmap.Config.ARGB_8888 + ) + val canvas = Canvas(bitmap) + drawable.setBounds(0, 0, canvas.width, canvas.height) + drawable.draw(canvas) + return bitmap + } } diff --git a/app/src/main/java/code/name/monkey/retromusic/appshortcuts/AppShortcutLauncherActivity.kt b/app/src/main/java/code/name/monkey/retromusic/appshortcuts/AppShortcutLauncherActivity.kt index 9c8b1b709..0426ff654 100644 --- a/app/src/main/java/code/name/monkey/retromusic/appshortcuts/AppShortcutLauncherActivity.kt +++ b/app/src/main/java/code/name/monkey/retromusic/appshortcuts/AppShortcutLauncherActivity.kt @@ -18,74 +18,71 @@ import android.app.Activity import android.content.Intent import android.os.Bundle import code.name.monkey.retromusic.activities.SearchActivity -import code.name.monkey.retromusic.appshortcuts.shortcuttype.LastAddedShortcutType -import code.name.monkey.retromusic.appshortcuts.shortcuttype.SearchShortCutType -import code.name.monkey.retromusic.appshortcuts.shortcuttype.ShuffleAllShortcutType -import code.name.monkey.retromusic.appshortcuts.shortcuttype.TopTracksShortcutType +import code.name.monkey.retromusic.appshortcuts.shortcuttype.* import code.name.monkey.retromusic.model.Playlist -import code.name.monkey.retromusic.model.smartplaylist.LastAddedPlaylist -import code.name.monkey.retromusic.model.smartplaylist.MyTopTracksPlaylist -import code.name.monkey.retromusic.model.smartplaylist.ShuffleAllPlaylist +import code.name.monkey.retromusic.model.smartplaylist.* import code.name.monkey.retromusic.service.MusicService import code.name.monkey.retromusic.service.MusicService.* - class AppShortcutLauncherActivity : Activity() { - public override fun onCreate(savedInstanceState: Bundle?) { - super.onCreate(savedInstanceState) + public override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) - var shortcutType = SHORTCUT_TYPE_NONE + var shortcutType = SHORTCUT_TYPE_NONE - // Set shortcutType from the intent extras - val extras = intent.extras - if (extras != null) { - shortcutType = extras.getInt(KEY_SHORTCUT_TYPE, SHORTCUT_TYPE_NONE) - } + // Set shortcutType from the intent extras + val extras = intent.extras + if (extras != null) { + shortcutType = extras.getInt(KEY_SHORTCUT_TYPE, SHORTCUT_TYPE_NONE) + } - when (shortcutType) { - SHORTCUT_TYPE_SHUFFLE_ALL -> { - startServiceWithPlaylist(MusicService.SHUFFLE_MODE_SHUFFLE, - ShuffleAllPlaylist(applicationContext)) - DynamicShortcutManager.reportShortcutUsed(this, ShuffleAllShortcutType.id) - } - SHORTCUT_TYPE_TOP_TRACKS -> { - startServiceWithPlaylist(MusicService.SHUFFLE_MODE_NONE, - MyTopTracksPlaylist(applicationContext)) - DynamicShortcutManager.reportShortcutUsed(this, TopTracksShortcutType.id) - } - SHORTCUT_TYPE_LAST_ADDED -> { - startServiceWithPlaylist(MusicService.SHUFFLE_MODE_NONE, - LastAddedPlaylist(applicationContext)) - DynamicShortcutManager.reportShortcutUsed(this, LastAddedShortcutType.id) - } - SHORTCUT_TYPE_SEARCH -> { - startActivity(Intent(this, SearchActivity::class.java)) - DynamicShortcutManager.reportShortcutUsed(this, SearchShortCutType.id) - } - } - finish() - } + when (shortcutType) { + SHORTCUT_TYPE_SHUFFLE_ALL -> { + startServiceWithPlaylist( + MusicService.SHUFFLE_MODE_SHUFFLE, ShuffleAllPlaylist(applicationContext) + ) + DynamicShortcutManager.reportShortcutUsed(this, ShuffleAllShortcutType.id) + } + SHORTCUT_TYPE_TOP_TRACKS -> { + startServiceWithPlaylist( + MusicService.SHUFFLE_MODE_NONE, MyTopTracksPlaylist(applicationContext) + ) + DynamicShortcutManager.reportShortcutUsed(this, TopTracksShortcutType.id) + } + SHORTCUT_TYPE_LAST_ADDED -> { + startServiceWithPlaylist( + MusicService.SHUFFLE_MODE_NONE, LastAddedPlaylist(applicationContext) + ) + DynamicShortcutManager.reportShortcutUsed(this, LastAddedShortcutType.id) + } + SHORTCUT_TYPE_SEARCH -> { + startActivity(Intent(this, SearchActivity::class.java)) + DynamicShortcutManager.reportShortcutUsed(this, SearchShortCutType.id) + } + } + finish() + } - private fun startServiceWithPlaylist(shuffleMode: Int, playlist: Playlist) { - val intent = Intent(this, MusicService::class.java) - intent.action = ACTION_PLAY_PLAYLIST + private fun startServiceWithPlaylist(shuffleMode: Int, playlist: Playlist) { + val intent = Intent(this, MusicService::class.java) + intent.action = ACTION_PLAY_PLAYLIST - val bundle = Bundle() - bundle.putParcelable(INTENT_EXTRA_PLAYLIST, playlist) - bundle.putInt(INTENT_EXTRA_SHUFFLE_MODE, shuffleMode) + val bundle = Bundle() + bundle.putParcelable(INTENT_EXTRA_PLAYLIST, playlist) + bundle.putInt(INTENT_EXTRA_SHUFFLE_MODE, shuffleMode) - intent.putExtras(bundle) + intent.putExtras(bundle) - startService(intent) - } + startService(intent) + } - companion object { - const val KEY_SHORTCUT_TYPE = "code.name.monkey.retromusic.appshortcuts.ShortcutType" - const val SHORTCUT_TYPE_SHUFFLE_ALL = 0 - const val SHORTCUT_TYPE_TOP_TRACKS = 1 - const val SHORTCUT_TYPE_LAST_ADDED = 2 - const val SHORTCUT_TYPE_SEARCH = 3 - const val SHORTCUT_TYPE_NONE = 4 - } + companion object { + const val KEY_SHORTCUT_TYPE = "code.name.monkey.retromusic.appshortcuts.ShortcutType" + const val SHORTCUT_TYPE_SHUFFLE_ALL = 0 + const val SHORTCUT_TYPE_TOP_TRACKS = 1 + const val SHORTCUT_TYPE_LAST_ADDED = 2 + const val SHORTCUT_TYPE_SEARCH = 3 + const val SHORTCUT_TYPE_NONE = 4 + } } diff --git a/app/src/main/java/code/name/monkey/retromusic/appshortcuts/DynamicShortcutManager.kt b/app/src/main/java/code/name/monkey/retromusic/appshortcuts/DynamicShortcutManager.kt index 76a69e6f1..790afe573 100644 --- a/app/src/main/java/code/name/monkey/retromusic/appshortcuts/DynamicShortcutManager.kt +++ b/app/src/main/java/code/name/monkey/retromusic/appshortcuts/DynamicShortcutManager.kt @@ -15,56 +15,52 @@ package code.name.monkey.retromusic.appshortcuts import android.annotation.TargetApi -import android.content.Context -import android.content.Intent -import android.content.pm.ShortcutInfo -import android.content.pm.ShortcutManager +import android.content.* +import android.content.pm.* import android.graphics.drawable.Icon import android.os.Build - -import java.util.Arrays - -import code.name.monkey.retromusic.appshortcuts.shortcuttype.LastAddedShortcutType -import code.name.monkey.retromusic.appshortcuts.shortcuttype.SearchShortCutType -import code.name.monkey.retromusic.appshortcuts.shortcuttype.ShuffleAllShortcutType -import code.name.monkey.retromusic.appshortcuts.shortcuttype.TopTracksShortcutType +import code.name.monkey.retromusic.appshortcuts.shortcuttype.* +import java.util.* @TargetApi(Build.VERSION_CODES.N_MR1) class DynamicShortcutManager(private val context: Context) { - private val shortcutManager: ShortcutManager = this.context.getSystemService(ShortcutManager::class.java) + private val shortcutManager: ShortcutManager = this.context.getSystemService(ShortcutManager::class.java) - private val defaultShortcuts: List - get() = Arrays.asList( - SearchShortCutType(context).shortcutInfo, - ShuffleAllShortcutType(context).shortcutInfo, - TopTracksShortcutType(context).shortcutInfo, - LastAddedShortcutType(context).shortcutInfo + private val defaultShortcuts: List + get() = Arrays.asList( + SearchShortCutType(context).shortcutInfo, + ShuffleAllShortcutType(context).shortcutInfo, + TopTracksShortcutType(context).shortcutInfo, + LastAddedShortcutType(context).shortcutInfo - ) + ) - fun initDynamicShortcuts() { - //if (shortcutManager.dynamicShortcuts.size == 0) { - shortcutManager.dynamicShortcuts = defaultShortcuts - //} - } + fun initDynamicShortcuts() { + //if (shortcutManager.dynamicShortcuts.size == 0) { + shortcutManager.dynamicShortcuts = defaultShortcuts + //} + } - fun updateDynamicShortcuts() { - shortcutManager.updateShortcuts(defaultShortcuts) - } + fun updateDynamicShortcuts() { + shortcutManager.updateShortcuts(defaultShortcuts) + } - companion object { + companion object { - fun createShortcut(context: Context, id: String, shortLabel: String, longLabel: String, icon: Icon, intent: Intent): ShortcutInfo { - return ShortcutInfo.Builder(context, id) - .setShortLabel(shortLabel) - .setLongLabel(longLabel) - .setIcon(icon) - .setIntent(intent) - .build() - } + fun createShortcut( + context: Context, + id: String, + shortLabel: String, + longLabel: String, + icon: Icon, + intent: Intent + ): ShortcutInfo { + return ShortcutInfo.Builder(context, id).setShortLabel(shortLabel) + .setLongLabel(longLabel).setIcon(icon).setIntent(intent).build() + } - fun reportShortcutUsed(context: Context, shortcutId: String) { - context.getSystemService(ShortcutManager::class.java).reportShortcutUsed(shortcutId) - } - } + fun reportShortcutUsed(context: Context, shortcutId: String) { + context.getSystemService(ShortcutManager::class.java).reportShortcutUsed(shortcutId) + } + } } diff --git a/app/src/main/java/code/name/monkey/retromusic/appshortcuts/shortcuttype/BaseShortcutType.kt b/app/src/main/java/code/name/monkey/retromusic/appshortcuts/shortcuttype/BaseShortcutType.kt index 1ae9b3487..5ca1284df 100644 --- a/app/src/main/java/code/name/monkey/retromusic/appshortcuts/shortcuttype/BaseShortcutType.kt +++ b/app/src/main/java/code/name/monkey/retromusic/appshortcuts/shortcuttype/BaseShortcutType.kt @@ -15,37 +15,34 @@ package code.name.monkey.retromusic.appshortcuts.shortcuttype import android.annotation.TargetApi -import android.content.Context -import android.content.Intent +import android.content.* import android.content.pm.ShortcutInfo -import android.os.Build -import android.os.Bundle - +import android.os.* import code.name.monkey.retromusic.appshortcuts.AppShortcutLauncherActivity @TargetApi(Build.VERSION_CODES.N_MR1) abstract class BaseShortcutType(internal var context: Context) { - internal abstract val shortcutInfo: ShortcutInfo + internal abstract val shortcutInfo: ShortcutInfo - /** - * Creates an Intent that will launch MainActivtiy and immediately play {@param songs} in either shuffle or normal mode - * - * @param shortcutType Describes the type of shortcut to create (ShuffleAll, TopTracks, custom playlist, etc.) - * @return - */ - internal fun getPlaySongsIntent(shortcutType: Int): Intent { - val intent = Intent(context, AppShortcutLauncherActivity::class.java) - intent.action = Intent.ACTION_VIEW - val b = Bundle() - b.putInt(AppShortcutLauncherActivity.KEY_SHORTCUT_TYPE, shortcutType) - intent.putExtras(b) - return intent - } + /** + * Creates an Intent that will launch MainActivtiy and immediately play {@param songs} in either shuffle or normal mode + * + * @param shortcutType Describes the type of shortcut to create (ShuffleAll, TopTracks, custom playlist, etc.) + * @return + */ + internal fun getPlaySongsIntent(shortcutType: Int): Intent { + val intent = Intent(context, AppShortcutLauncherActivity::class.java) + intent.action = Intent.ACTION_VIEW + val b = Bundle() + b.putInt(AppShortcutLauncherActivity.KEY_SHORTCUT_TYPE, shortcutType) + intent.putExtras(b) + return intent + } - companion object { - internal const val ID_PREFIX = "code.name.monkey.retromusic.appshortcuts.id." - val id: String - get() = ID_PREFIX + "invalid" - } + companion object { + internal const val ID_PREFIX = "code.name.monkey.retromusic.appshortcuts.id." + val id: String + get() = ID_PREFIX + "invalid" + } } diff --git a/app/src/main/java/code/name/monkey/retromusic/appshortcuts/shortcuttype/LastAddedShortcutType.kt b/app/src/main/java/code/name/monkey/retromusic/appshortcuts/shortcuttype/LastAddedShortcutType.kt index 199d1ad5d..df92969bc 100644 --- a/app/src/main/java/code/name/monkey/retromusic/appshortcuts/shortcuttype/LastAddedShortcutType.kt +++ b/app/src/main/java/code/name/monkey/retromusic/appshortcuts/shortcuttype/LastAddedShortcutType.kt @@ -19,23 +19,27 @@ import android.content.Context import android.content.pm.ShortcutInfo import android.os.Build import code.name.monkey.retromusic.R -import code.name.monkey.retromusic.appshortcuts.AppShortcutIconGenerator -import code.name.monkey.retromusic.appshortcuts.AppShortcutLauncherActivity +import code.name.monkey.retromusic.appshortcuts.* @TargetApi(Build.VERSION_CODES.N_MR1) class LastAddedShortcutType(context: Context) : BaseShortcutType(context) { - override val shortcutInfo: ShortcutInfo - get() = ShortcutInfo.Builder(context, id) - .setShortLabel(context.getString(R.string.app_shortcut_last_added_short)) - .setLongLabel(context.getString(R.string.app_shortcut_last_added_long)) - .setIcon(AppShortcutIconGenerator.generateThemedIcon(context, R.drawable.ic_app_shortcut_last_added)) - .setIntent(getPlaySongsIntent(AppShortcutLauncherActivity.SHORTCUT_TYPE_LAST_ADDED)) - .build() + override val shortcutInfo: ShortcutInfo + get() = ShortcutInfo.Builder( + context, + id + ).setShortLabel(context.getString(R.string.app_shortcut_last_added_short)).setLongLabel( + context.getString(R.string.app_shortcut_last_added_long) + ).setIcon( + AppShortcutIconGenerator.generateThemedIcon( + context, + R.drawable.ic_app_shortcut_last_added + ) + ).setIntent(getPlaySongsIntent(AppShortcutLauncherActivity.SHORTCUT_TYPE_LAST_ADDED)).build() - companion object { + companion object { - val id: String - get() = BaseShortcutType.ID_PREFIX + "last_added" - } + val id: String + get() = BaseShortcutType.ID_PREFIX + "last_added" + } } diff --git a/app/src/main/java/code/name/monkey/retromusic/appshortcuts/shortcuttype/SearchShortCutType.kt b/app/src/main/java/code/name/monkey/retromusic/appshortcuts/shortcuttype/SearchShortCutType.kt index c4ecd4fdb..ca2e7c4a0 100644 --- a/app/src/main/java/code/name/monkey/retromusic/appshortcuts/shortcuttype/SearchShortCutType.kt +++ b/app/src/main/java/code/name/monkey/retromusic/appshortcuts/shortcuttype/SearchShortCutType.kt @@ -19,22 +19,24 @@ import android.content.Context import android.content.pm.ShortcutInfo import android.os.Build import code.name.monkey.retromusic.R -import code.name.monkey.retromusic.appshortcuts.AppShortcutIconGenerator -import code.name.monkey.retromusic.appshortcuts.AppShortcutLauncherActivity +import code.name.monkey.retromusic.appshortcuts.* @TargetApi(Build.VERSION_CODES.N_MR1) class SearchShortCutType(context: Context) : BaseShortcutType(context) { - companion object { + companion object { - val id: String - get() = BaseShortcutType.ID_PREFIX + "search" - } + val id: String + get() = BaseShortcutType.ID_PREFIX + "search" + } - override val shortcutInfo: ShortcutInfo - get() = ShortcutInfo.Builder(context, id) - .setShortLabel(context.getString(R.string.action_search)) - .setLongLabel(context.getString(R.string.search_hint)) - .setIcon(AppShortcutIconGenerator.generateThemedIcon(context, R.drawable.ic_app_shortcut_search)) - .setIntent(getPlaySongsIntent(AppShortcutLauncherActivity.SHORTCUT_TYPE_SEARCH)) - .build() + override val shortcutInfo: ShortcutInfo + get() = ShortcutInfo.Builder( + context, + id + ).setShortLabel(context.getString(R.string.action_search)).setLongLabel(context.getString(R.string.search_hint)).setIcon( + AppShortcutIconGenerator.generateThemedIcon( + context, + R.drawable.ic_app_shortcut_search + ) + ).setIntent(getPlaySongsIntent(AppShortcutLauncherActivity.SHORTCUT_TYPE_SEARCH)).build() } \ No newline at end of file diff --git a/app/src/main/java/code/name/monkey/retromusic/appshortcuts/shortcuttype/ShuffleAllShortcutType.kt b/app/src/main/java/code/name/monkey/retromusic/appshortcuts/shortcuttype/ShuffleAllShortcutType.kt index fad1d4c78..c5b7f24cd 100644 --- a/app/src/main/java/code/name/monkey/retromusic/appshortcuts/shortcuttype/ShuffleAllShortcutType.kt +++ b/app/src/main/java/code/name/monkey/retromusic/appshortcuts/shortcuttype/ShuffleAllShortcutType.kt @@ -18,26 +18,26 @@ import android.annotation.TargetApi import android.content.Context import android.content.pm.ShortcutInfo import android.os.Build - import code.name.monkey.retromusic.R -import code.name.monkey.retromusic.appshortcuts.AppShortcutIconGenerator -import code.name.monkey.retromusic.appshortcuts.AppShortcutLauncherActivity -import java.security.AccessController.getContext +import code.name.monkey.retromusic.appshortcuts.* @TargetApi(Build.VERSION_CODES.N_MR1) class ShuffleAllShortcutType(context: Context) : BaseShortcutType(context) { - override val shortcutInfo: ShortcutInfo - get() = ShortcutInfo.Builder(context, id) - .setShortLabel(context.getString(R.string.app_shortcut_shuffle_all_short)) - .setLongLabel(context.getString(R.string.app_shortcut_shuffle_all_long)) - .setIcon(AppShortcutIconGenerator.generateThemedIcon(context, R.drawable.ic_app_shortcut_shuffle_all)) - .setIntent(getPlaySongsIntent(AppShortcutLauncherActivity.SHORTCUT_TYPE_SHUFFLE_ALL)) - .build() + override val shortcutInfo: ShortcutInfo + get() = ShortcutInfo.Builder( + context, id + ).setShortLabel(context.getString(R.string.app_shortcut_shuffle_all_short)).setLongLabel( + context.getString(R.string.app_shortcut_shuffle_all_long) + ).setIcon( + AppShortcutIconGenerator.generateThemedIcon( + context, R.drawable.ic_app_shortcut_shuffle_all + ) + ).setIntent(getPlaySongsIntent(AppShortcutLauncherActivity.SHORTCUT_TYPE_SHUFFLE_ALL)).build() - companion object { + companion object { - val id: String - get() = BaseShortcutType.ID_PREFIX + "shuffle_all" - } + val id: String + get() = BaseShortcutType.ID_PREFIX + "shuffle_all" + } } diff --git a/app/src/main/java/code/name/monkey/retromusic/appshortcuts/shortcuttype/TopTracksShortcutType.kt b/app/src/main/java/code/name/monkey/retromusic/appshortcuts/shortcuttype/TopTracksShortcutType.kt index 497990a44..32e53e412 100644 --- a/app/src/main/java/code/name/monkey/retromusic/appshortcuts/shortcuttype/TopTracksShortcutType.kt +++ b/app/src/main/java/code/name/monkey/retromusic/appshortcuts/shortcuttype/TopTracksShortcutType.kt @@ -19,23 +19,25 @@ import android.content.Context import android.content.pm.ShortcutInfo import android.os.Build import code.name.monkey.retromusic.R -import code.name.monkey.retromusic.appshortcuts.AppShortcutIconGenerator -import code.name.monkey.retromusic.appshortcuts.AppShortcutLauncherActivity +import code.name.monkey.retromusic.appshortcuts.* @TargetApi(Build.VERSION_CODES.N_MR1) class TopTracksShortcutType(context: Context) : BaseShortcutType(context) { - override val shortcutInfo: ShortcutInfo - get() = ShortcutInfo.Builder(context, id) - .setShortLabel(context.getString(R.string.app_shortcut_top_tracks_short)) - .setLongLabel(context.getString(R.string.app_shortcut_top_tracks_long)) - .setIcon(AppShortcutIconGenerator.generateThemedIcon(context, R.drawable.ic_app_shortcut_top_tracks)) - .setIntent(getPlaySongsIntent(AppShortcutLauncherActivity.SHORTCUT_TYPE_TOP_TRACKS)) - .build() + override val shortcutInfo: ShortcutInfo + get() = ShortcutInfo.Builder( + context, id + ).setShortLabel(context.getString(R.string.app_shortcut_top_tracks_short)).setLongLabel( + context.getString(R.string.app_shortcut_top_tracks_long) + ).setIcon( + AppShortcutIconGenerator.generateThemedIcon( + context, R.drawable.ic_app_shortcut_top_tracks + ) + ).setIntent(getPlaySongsIntent(AppShortcutLauncherActivity.SHORTCUT_TYPE_TOP_TRACKS)).build() - companion object { + companion object { - val id: String - get() = BaseShortcutType.ID_PREFIX + "top_tracks" - } + val id: String + get() = BaseShortcutType.ID_PREFIX + "top_tracks" + } } diff --git a/app/src/main/java/code/name/monkey/retromusic/appwidgets/base/BaseAppWidget.kt b/app/src/main/java/code/name/monkey/retromusic/appwidgets/base/BaseAppWidget.kt index 362f97c4d..13b9347ee 100644 --- a/app/src/main/java/code/name/monkey/retromusic/appwidgets/base/BaseAppWidget.kt +++ b/app/src/main/java/code/name/monkey/retromusic/appwidgets/base/BaseAppWidget.kt @@ -15,154 +15,170 @@ package code.name.monkey.retromusic.appwidgets.base import android.app.PendingIntent -import android.appwidget.AppWidgetManager -import android.appwidget.AppWidgetProvider -import android.content.ComponentName -import android.content.Context -import android.content.Intent +import android.appwidget.* +import android.content.* import android.content.res.Resources import android.graphics.* -import android.graphics.drawable.BitmapDrawable -import android.graphics.drawable.Drawable +import android.graphics.drawable.* import android.os.Build import android.text.TextUtils import android.widget.RemoteViews import androidx.core.content.ContextCompat -import code.name.monkey.retromusic.App -import code.name.monkey.retromusic.R +import code.name.monkey.retromusic.* import code.name.monkey.retromusic.model.Song import code.name.monkey.retromusic.service.MusicService import code.name.monkey.retromusic.service.MusicService.* abstract class BaseAppWidget : AppWidgetProvider() { - /** - * {@inheritDoc} - */ - override fun onUpdate(context: Context, appWidgetManager: AppWidgetManager, - appWidgetIds: IntArray) { - defaultAppWidget(context, appWidgetIds) - val updateIntent = Intent(APP_WIDGET_UPDATE) - updateIntent.putExtra(EXTRA_APP_WIDGET_NAME, NAME) - updateIntent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS, appWidgetIds) - updateIntent.addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY) - context.sendBroadcast(updateIntent) - } + /** + * {@inheritDoc} + */ + override fun onUpdate( + context: Context, appWidgetManager: AppWidgetManager, appWidgetIds: IntArray + ) { + defaultAppWidget(context, appWidgetIds) + val updateIntent = Intent(APP_WIDGET_UPDATE) + updateIntent.putExtra(EXTRA_APP_WIDGET_NAME, NAME) + updateIntent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS, appWidgetIds) + updateIntent.addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY) + context.sendBroadcast(updateIntent) + } - /** - * Handle a change notification coming over from [MusicService] - */ - fun notifyChange(service: MusicService, what: String) { - if (hasInstances(service)) { - if (META_CHANGED == what || PLAY_STATE_CHANGED == what) { - performUpdate(service, null) - } - } - } + /** + * Handle a change notification coming over from [MusicService] + */ + fun notifyChange(service: MusicService, what: String) { + if (hasInstances(service)) { + if (META_CHANGED == what || PLAY_STATE_CHANGED == what) { + performUpdate(service, null) + } + } + } - protected fun pushUpdate(context: Context, appWidgetIds: IntArray?, - views: RemoteViews) { - val appWidgetManager = AppWidgetManager.getInstance(context) - if (appWidgetIds != null) { - appWidgetManager.updateAppWidget(appWidgetIds, views) - } else { - appWidgetManager.updateAppWidget(ComponentName(context, javaClass), views) - } - } + protected fun pushUpdate( + context: Context, appWidgetIds: IntArray?, views: RemoteViews + ) { + val appWidgetManager = AppWidgetManager.getInstance(context) + if (appWidgetIds != null) { + appWidgetManager.updateAppWidget(appWidgetIds, views) + } else { + appWidgetManager.updateAppWidget(ComponentName(context, javaClass), views) + } + } - /** - * Check against [AppWidgetManager] if there are any instances of this widget. - */ - private fun hasInstances(context: Context): Boolean { - val appWidgetManager = AppWidgetManager.getInstance(context) - val mAppWidgetIds = appWidgetManager.getAppWidgetIds(ComponentName(context, - javaClass)) - return mAppWidgetIds.isNotEmpty() - } + /** + * Check against [AppWidgetManager] if there are any instances of this widget. + */ + private fun hasInstances(context: Context): Boolean { + val appWidgetManager = AppWidgetManager.getInstance(context) + val mAppWidgetIds = appWidgetManager.getAppWidgetIds( + ComponentName( + context, javaClass + ) + ) + return mAppWidgetIds.isNotEmpty() + } - protected fun buildPendingIntent(context: Context, action: String, - serviceName: ComponentName): PendingIntent { - val intent = Intent(action) - intent.component = serviceName - return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { - PendingIntent.getForegroundService(context, 0, intent, 0) - } else { - PendingIntent.getService(context, 0, intent, 0) - } - } + protected fun buildPendingIntent( + context: Context, action: String, serviceName: ComponentName + ): PendingIntent { + val intent = Intent(action) + intent.component = serviceName + return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { + PendingIntent.getForegroundService(context, 0, intent, 0) + } else { + PendingIntent.getService(context, 0, intent, 0) + } + } - protected abstract fun defaultAppWidget(context: Context, appWidgetIds: IntArray) + protected abstract fun defaultAppWidget(context: Context, appWidgetIds: IntArray) - abstract fun performUpdate(service: MusicService, appWidgetIds: IntArray?) + abstract fun performUpdate(service: MusicService, appWidgetIds: IntArray?) - protected fun getAlbumArtDrawable(resources: Resources, bitmap: Bitmap?): Drawable { - return if (bitmap == null) { - ContextCompat.getDrawable(App.getContext(), R.drawable.default_album_art)!! - } else { - BitmapDrawable(resources, bitmap) - } - } + protected fun getAlbumArtDrawable(resources: Resources, bitmap: Bitmap?): Drawable { + return if (bitmap == null) { + ContextCompat.getDrawable(App.getContext(), R.drawable.default_album_art)!! + } else { + BitmapDrawable(resources, bitmap) + } + } - protected fun getSongArtistAndAlbum(song: Song): String { - val builder = StringBuilder() - builder.append(song.artistName) - if (!TextUtils.isEmpty(song.artistName) && !TextUtils.isEmpty(song.albumName)) { - builder.append(" • ") - } - builder.append(song.albumName) - return builder.toString() - } + protected fun getSongArtistAndAlbum(song: Song): String { + val builder = StringBuilder() + builder.append(song.artistName) + if (!TextUtils.isEmpty(song.artistName) && !TextUtils.isEmpty(song.albumName)) { + builder.append(" • ") + } + builder.append(song.albumName) + return builder.toString() + } - companion object { + companion object { - const val NAME: String = "app_widget" + const val NAME: String = "app_widget" + fun createRoundedBitmap( + drawable: Drawable?, + width: Int, + height: Int, + tl: Float, + tr: Float, + bl: Float, + br: Float + ): Bitmap? { + if (drawable == null) { + return null + } - fun createRoundedBitmap(drawable: Drawable?, width: Int, height: Int, tl: Float, - tr: Float, bl: Float, br: Float): Bitmap? { - if (drawable == null) { - return null - } + val bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888) + val c = Canvas(bitmap) + drawable.setBounds(0, 0, width, height) + drawable.draw(c) - val bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888) - val c = Canvas(bitmap) - drawable.setBounds(0, 0, width, height) - drawable.draw(c) + val rounded = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888) - val rounded = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888) + val canvas = Canvas(rounded) + val paint = Paint() + paint.shader = BitmapShader(bitmap, Shader.TileMode.CLAMP, Shader.TileMode.CLAMP) + paint.isAntiAlias = true + canvas.drawPath( + composeRoundedRectPath( + RectF(0f, 0f, width.toFloat(), height.toFloat()), tl, tr, bl, br + ), paint + ) - val canvas = Canvas(rounded) - val paint = Paint() - paint.shader = BitmapShader(bitmap, Shader.TileMode.CLAMP, Shader.TileMode.CLAMP) - paint.isAntiAlias = true - canvas.drawPath(composeRoundedRectPath(RectF(0f, 0f, width.toFloat(), height.toFloat()), tl, tr, bl, br), paint) + return rounded + } - return rounded - } + fun createBitmap(drawable: Drawable, sizeMultiplier: Float): Bitmap { + val bitmap = Bitmap.createBitmap( + (drawable.intrinsicWidth * sizeMultiplier).toInt(), + (drawable.intrinsicHeight * sizeMultiplier).toInt(), + Bitmap.Config.ARGB_8888 + ) + val c = Canvas(bitmap) + drawable.setBounds(0, 0, c.width, c.height) + drawable.draw(c) + return bitmap + } - fun createBitmap(drawable: Drawable, sizeMultiplier: Float): Bitmap { - val bitmap = Bitmap.createBitmap((drawable.intrinsicWidth * sizeMultiplier).toInt(), - (drawable.intrinsicHeight * sizeMultiplier).toInt(), Bitmap.Config.ARGB_8888) - val c = Canvas(bitmap) - drawable.setBounds(0, 0, c.width, c.height) - drawable.draw(c) - return bitmap - } + protected fun composeRoundedRectPath( + rect: RectF, tl: Float, tr: Float, bl: Float, br: Float + ): Path { + val path = Path() + path.moveTo(rect.left + tl, rect.top) + path.lineTo(rect.right - tr, rect.top) + path.quadTo(rect.right, rect.top, rect.right, rect.top + tr) + path.lineTo(rect.right, rect.bottom - br) + path.quadTo(rect.right, rect.bottom, rect.right - br, rect.bottom) + path.lineTo(rect.left + bl, rect.bottom) + path.quadTo(rect.left, rect.bottom, rect.left, rect.bottom - bl) + path.lineTo(rect.left, rect.top + tl) + path.quadTo(rect.left, rect.top, rect.left + tl, rect.top) + path.close() - protected fun composeRoundedRectPath(rect: RectF, tl: Float, tr: Float, bl: Float, br: Float): Path { - val path = Path() - path.moveTo(rect.left + tl, rect.top) - path.lineTo(rect.right - tr, rect.top) - path.quadTo(rect.right, rect.top, rect.right, rect.top + tr) - path.lineTo(rect.right, rect.bottom - br) - path.quadTo(rect.right, rect.bottom, rect.right - br, rect.bottom) - path.lineTo(rect.left + bl, rect.bottom) - path.quadTo(rect.left, rect.bottom, rect.left, rect.bottom - bl) - path.lineTo(rect.left, rect.top + tl) - path.quadTo(rect.left, rect.top, rect.left + tl, rect.top) - path.close() - - return path - } - } + return path + } + } } diff --git a/app/src/main/java/code/name/monkey/retromusic/fragments/player/color/ColorFragment.kt b/app/src/main/java/code/name/monkey/retromusic/fragments/player/color/ColorFragment.kt index b9eec9c62..83f94ac0e 100644 --- a/app/src/main/java/code/name/monkey/retromusic/fragments/player/color/ColorFragment.kt +++ b/app/src/main/java/code/name/monkey/retromusic/fragments/player/color/ColorFragment.kt @@ -4,19 +4,13 @@ import android.animation.ValueAnimator import android.graphics.Color import android.graphics.drawable.Drawable import android.os.Bundle -import android.view.LayoutInflater -import android.view.View -import android.view.ViewGroup +import android.view.* import androidx.appcompat.widget.Toolbar import androidx.palette.graphics.Palette -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.ToolbarContentTintHelper +import code.name.monkey.appthemehelper.util.* import code.name.monkey.retromusic.R import code.name.monkey.retromusic.fragments.base.AbsPlayerFragment -import code.name.monkey.retromusic.glide.RetroMusicColoredTarget -import code.name.monkey.retromusic.glide.SongGlideRequest +import code.name.monkey.retromusic.glide.* import code.name.monkey.retromusic.glide.palette.BitmapPaletteWrapper import code.name.monkey.retromusic.helper.MusicPlayerRemote import code.name.monkey.retromusic.model.Song @@ -27,160 +21,169 @@ import kotlinx.android.synthetic.main.fragment_color_player.* class ColorFragment : AbsPlayerFragment() { - private var lastColor: Int = 0 - private var backgroundColor: Int = 0 - private var playbackControlsFragment: ColorPlaybackControlsFragment? = null - private var valueAnimator: ValueAnimator? = null + private var lastColor: Int = 0 + private var backgroundColor: Int = 0 + private var playbackControlsFragment: ColorPlaybackControlsFragment? = null + private var valueAnimator: ValueAnimator? = null - override fun playerToolbar(): Toolbar { - return playerToolbar - } + override fun playerToolbar(): Toolbar { + return playerToolbar + } - override val paletteColor: Int - get() = backgroundColor + override val paletteColor: Int + get() = backgroundColor - override fun onColorChanged(color: Int) { + override fun onColorChanged(color: Int) { - } + } - override fun onFavoriteToggled() { + override fun onFavoriteToggled() { - } + } - override fun onShow() { - playbackControlsFragment!!.show() - } + override fun onShow() { + playbackControlsFragment!!.show() + } - override fun onHide() { - playbackControlsFragment!!.hide() - onBackPressed() - } + override fun onHide() { + playbackControlsFragment!!.hide() + onBackPressed() + } - override fun onBackPressed(): Boolean { - return false - } + override fun onBackPressed(): Boolean { + return false + } - override fun toolbarIconColor(): Int { - return lastColor - } + override fun toolbarIconColor(): Int { + return lastColor + } - override fun toggleFavorite(song: Song) { - super.toggleFavorite(song) - if (song.id == MusicPlayerRemote.currentSong.id) { - updateIsFavorite() - } - } + override fun toggleFavorite(song: Song) { + super.toggleFavorite(song) + if (song.id == MusicPlayerRemote.currentSong.id) { + updateIsFavorite() + } + } - override fun onDestroyView() { - super.onDestroyView() - if (valueAnimator != null) { - valueAnimator!!.cancel() - valueAnimator = null - } - } + override fun onDestroyView() { + super.onDestroyView() + if (valueAnimator != null) { + valueAnimator!!.cancel() + valueAnimator = null + } + } - override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, - savedInstanceState: Bundle?): View? { + override fun onCreateView( + inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? + ): View? { - return inflater.inflate(R.layout.fragment_color_player, container, false) - } + return inflater.inflate(R.layout.fragment_color_player, container, false) + } - override fun onViewCreated(view: View, savedInstanceState: Bundle?) { - super.onViewCreated(view, savedInstanceState) - setUpSubFragments() - setUpPlayerToolbar() - } + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + setUpSubFragments() + setUpPlayerToolbar() + } - private fun setUpSubFragments() { - playbackControlsFragment = childFragmentManager.findFragmentById(R.id.playbackControlsFragment) as ColorPlaybackControlsFragment? + private fun setUpSubFragments() { + playbackControlsFragment = childFragmentManager.findFragmentById( + R.id.playbackControlsFragment + ) as ColorPlaybackControlsFragment? - } + } - private fun setUpPlayerToolbar() { - playerToolbar.apply { - inflateMenu(R.menu.menu_player) - setNavigationOnClickListener { requireActivity().onBackPressed() } - setOnMenuItemClickListener(this@ColorFragment) - ToolbarContentTintHelper.colorizeToolbar(this, ATHUtil.resolveColor(context, R.attr.iconColor), activity) - } - } + private fun setUpPlayerToolbar() { + playerToolbar.apply { + inflateMenu(R.menu.menu_player) + setNavigationOnClickListener { requireActivity().onBackPressed() } + setOnMenuItemClickListener(this@ColorFragment) + ToolbarContentTintHelper.colorizeToolbar( + this, ATHUtil.resolveColor( + context, R.attr.iconColor + ), activity + ) + } + } - override fun onPlayingMetaChanged() { - super.onPlayingMetaChanged() - updateSong() - } + override fun onPlayingMetaChanged() { + super.onPlayingMetaChanged() + updateSong() + } - override fun onServiceConnected() { - super.onServiceConnected() - updateSong() - } + override fun onServiceConnected() { + super.onServiceConnected() + updateSong() + } - private fun updateSong() { - SongGlideRequest.Builder.from(Glide.with(requireActivity()), MusicPlayerRemote.currentSong) - .checkIgnoreMediaStore(requireContext()) - .generatePalette(requireContext()) - .build() - .into(object : RetroMusicColoredTarget(playerImage) { - override fun onColorReady(color: Int) { + private fun updateSong() { + SongGlideRequest.Builder.from(Glide.with(requireActivity()), MusicPlayerRemote.currentSong) + .checkIgnoreMediaStore(requireContext()).generatePalette(requireContext()).build() + .into(object : RetroMusicColoredTarget(playerImage) { + override fun onColorReady(color: Int) { - } + } - override fun onResourceReady(resource: BitmapPaletteWrapper?, glideAnimation: GlideAnimation?) { - super.onResourceReady(resource, glideAnimation) - resource?.let { - val background = resource.palette.getColor() + override fun onResourceReady( + resource: BitmapPaletteWrapper?, + glideAnimation: GlideAnimation? + ) { + super.onResourceReady(resource, glideAnimation) + resource?.let { + val background = resource.palette.getColor() - val palette = resource.palette - val swatch = RetroColorUtil.getSwatch(palette) + val palette = resource.palette + val swatch = RetroColorUtil.getSwatch(palette) - val textColor = RetroColorUtil.getTextColor(palette) - val backgroundColor = swatch.rgb + val textColor = RetroColorUtil.getTextColor(palette) + val backgroundColor = swatch.rgb - setColors(backgroundColor, textColor) - } + setColors(backgroundColor, textColor) + } - } + } - override fun onLoadFailed(e: Exception?, errorDrawable: Drawable?) { - super.onLoadFailed(e, errorDrawable) - val backgroundColor = defaultFooterColor - val textColor = if (ColorUtil.isColorLight(defaultFooterColor)) - MaterialValueHelper.getPrimaryTextColor(context, true) - else - MaterialValueHelper.getPrimaryTextColor(context, false) + override fun onLoadFailed(e: Exception?, errorDrawable: Drawable?) { + super.onLoadFailed(e, errorDrawable) + val backgroundColor = defaultFooterColor + val textColor = if (ColorUtil.isColorLight(defaultFooterColor)) MaterialValueHelper.getPrimaryTextColor( + context, + true + ) + else MaterialValueHelper.getPrimaryTextColor(context, false) - setColors(backgroundColor, textColor) - } - }) - } + setColors(backgroundColor, textColor) + } + }) + } - private fun setColors(backgroundColor: Int, textColor: Int) { - playbackControlsFragment!!.setDark(textColor, backgroundColor) - colorGradientBackground?.setBackgroundColor(backgroundColor) - ToolbarContentTintHelper.colorizeToolbar(playerToolbar, textColor, activity) - lastColor = textColor - this.backgroundColor = backgroundColor - playerActivity?.setLightNavigationBar(ColorUtil.isColorLight(backgroundColor)) - callbacks?.onPaletteColorChanged() - } + private fun setColors( + backgroundColor: Int, textColor: Int + ) { + playbackControlsFragment?.setDark(textColor, backgroundColor) + colorGradientBackground?.setBackgroundColor(backgroundColor) + ToolbarContentTintHelper.colorizeToolbar(playerToolbar, textColor, activity) + lastColor = textColor + this.backgroundColor = backgroundColor + playerActivity?.setLightNavigationBar(ColorUtil.isColorLight(backgroundColor)) + callbacks?.onPaletteColorChanged() + } - companion object { - - fun newInstance(): ColorFragment { - val args = Bundle() - val fragment = ColorFragment() - fragment.arguments = args - return fragment - } - } + companion object { + fun newInstance(): ColorFragment { + val args = Bundle() + val fragment = ColorFragment() + fragment.arguments = args + return fragment + } + } } - fun Palette.getColor(): Int { - return when { - darkMutedSwatch != null -> darkMutedSwatch!!.rgb - mutedSwatch != null -> mutedSwatch!!.rgb - lightMutedSwatch != null -> lightMutedSwatch!!.rgb - else -> Palette.Swatch(Color.BLACK, 1).rgb - } + return when { + darkMutedSwatch != null -> darkMutedSwatch!!.rgb + mutedSwatch != null -> mutedSwatch!!.rgb + lightMutedSwatch != null -> lightMutedSwatch!!.rgb + else -> Palette.Swatch(Color.BLACK, 1).rgb + } } diff --git a/app/src/main/java/code/name/monkey/retromusic/helper/LastChanceHandler.kt b/app/src/main/java/code/name/monkey/retromusic/helper/LastChanceHandler.kt deleted file mode 100644 index 67b387561..000000000 --- a/app/src/main/java/code/name/monkey/retromusic/helper/LastChanceHandler.kt +++ /dev/null @@ -1,53 +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.helper - -import android.content.Intent -import androidx.core.app.ActivityCompat -import code.name.monkey.retromusic.App -import code.name.monkey.retromusic.activities.bugreport.ErrorHandlerActivity - -class TopExceptionHandler() : Thread.UncaughtExceptionHandler { - private val defaultUEH: Thread.UncaughtExceptionHandler = Thread.getDefaultUncaughtExceptionHandler() - - override fun uncaughtException(t: Thread, e: Throwable) { - var arr = e.stackTrace - var report = e.toString() + "\n\n" - - report += "--------- Stack trace ---------\n\n" - for (i in arr.indices) { - report += " " + arr[i].toString() + "\n" - } - report += "-------------------------------\n\n" - - // If the exception was thrown in a background thread inside - // AsyncTask, then the actual exception can be found with getCause - - report += "--------- Cause ---------\n\n" - val cause = e.cause - if (cause != null) { - report += cause.toString() + "\n\n" - arr = cause.stackTrace - for (i in arr.indices) { - report += " " + arr[i].toString() + "\n" - } - } - report += "-------------------------------\n\n" - ActivityCompat.startActivity(App.getContext(), Intent(App.getContext(), ErrorHandlerActivity::class.java) - .addFlags(Intent.FLAG_ACTIVITY_NEW_TASK) - .putExtra("error", report), null) - defaultUEH.uncaughtException(t, e) - } -} \ No newline at end of file diff --git a/app/src/main/java/code/name/monkey/retromusic/util/LyricUtil.java b/app/src/main/java/code/name/monkey/retromusic/util/LyricUtil.java index 6214c25da..c94e8d586 100644 --- a/app/src/main/java/code/name/monkey/retromusic/util/LyricUtil.java +++ b/app/src/main/java/code/name/monkey/retromusic/util/LyricUtil.java @@ -14,7 +14,9 @@ package code.name.monkey.retromusic.util; +import android.text.TextUtils; import android.util.Base64; +import android.util.Log; import androidx.annotation.NonNull; @@ -78,35 +80,38 @@ public class LyricUtil { @NonNull public static File getLocalLyricFile(@NonNull String title, @NonNull String artist) { - try{ - File file = new File(getLrcPath(title, artist)); - File file2 = new File(getLrcPath2(title, artist)); - if (file.exists()) { - - return file; - } else if (file2.exists()) { - - return file2; - } - else { + try { + File file = new File(getLrcPath(title, artist)); + File file2 = new File(getLrcPath2(title, artist)); + if (file.exists()) { - return new File("lyric file not exist"); - }} catch (Exception dfs){ + return file; + } else if (file2.exists()) { + + return file2; + } else { + + return new File("lyric file not exist"); + } + } catch (Exception dfs) { dfs.printStackTrace(); return new File("lyric file not exist"); } } + public static String getLrcPath2(String title, String artist) { - String x2; - if(title.endsWith(".flac")||title.endsWith(".mogg")||title.endsWith(".alac")||title.endsWith(".aiff")||title.endsWith(".webv")){ - x2= title.substring(0, title.length() -5 ) + ".lrc"; + Log.i("HEM", "getLrcPath2: " + title); + if (!TextUtils.isEmpty(title)) { + String x2; + if (title.endsWith(".flac") || title.endsWith(".mogg") || title.endsWith(".alac") || title.endsWith(".aiff") || title.endsWith(".webv")) { + x2 = title.substring(0, title.length() - 5) + ".lrc"; + } else { + x2 = title.substring(0, title.length() - 4) + ".lrc"; + } + return x2; } - else{ - x2= title.substring(0, title.length() -4 ) + ".lrc";} - - - return x2; + return ""; } public static String getLrcPath(String title, String artist) { @@ -135,7 +140,7 @@ public class LyricUtil { File file; File file2 = new File(getLrcPath(title, artist)); File file3 = new File(getLrcPath2(title, artist)); - if(file2.exists()){ + if (file2.exists()) { file = file2; } else { file = file3; @@ -143,7 +148,7 @@ public class LyricUtil { FileInputStream fin = new FileInputStream(file); String ret = convertStreamToString(fin); fin.close(); - // Log.d("damn2",ret); + // Log.d("damn2",ret); return ret; } diff --git a/gradle.properties b/gradle.properties index 959ebc9ba..c9729751a 100644 --- a/gradle.properties +++ b/gradle.properties @@ -6,4 +6,6 @@ android.useAndroidX=true android.enabelR8=true android.enableR8.fullMode=false android.enableJetifier=true -android.debug.obsoleteApi=true \ No newline at end of file +android.debug.obsoleteApi=true +android.enableBuildCache=true +android.jetifier.blacklist = butterknife.*\\.jar \ No newline at end of file