diff --git a/app/build.gradle b/app/build.gradle index 266fbde92..1ff417ace 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -137,11 +137,9 @@ dependencies { implementation "com.squareup.retrofit2:retrofit:$retrofit_version" implementation "com.squareup.retrofit2:converter-gson:$retrofit_version" - def material_dialog_version = "3.1.1" + def material_dialog_version = "0.9.6.0" implementation "com.afollestad.material-dialogs:core:$material_dialog_version" - implementation "com.afollestad.material-dialogs:input:$material_dialog_version" - implementation "com.afollestad.material-dialogs:color:$material_dialog_version" - implementation "com.afollestad.material-dialogs:bottomsheets:$material_dialog_version" + implementation "com.afollestad.material-dialogs:commons:$material_dialog_version" implementation 'com.afollestad:material-cab:0.1.12' implementation 'com.github.bumptech.glide:glide:3.8.0' diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 9815250cc..99aa70d9e 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -105,7 +105,7 @@ - + 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 6b2154a66..f16f28714 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 @@ -22,6 +22,7 @@ import code.name.monkey.retromusic.activities.base.AbsSlidingMusicPanelActivity 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.extensions.extraNotNull import code.name.monkey.retromusic.extensions.ripAlpha import code.name.monkey.retromusic.extensions.show import code.name.monkey.retromusic.extensions.surfaceColor @@ -95,21 +96,13 @@ class ArtistDetailActivity : AbsSlidingMusicPanelActivity(), ArtistDetailsView, setLightNavigationBar(true) setBottomBarVisibility(View.GONE) window.sharedElementsUseOverlay = true + windowEnterTransition() App.musicComponent.inject(this) artistDetailsPresenter.attachView(this) + val artistId = extraNotNull(EXTRA_ARTIST_ID).value + artistDetailsPresenter.loadArtist(artistId) - if (intent.extras!!.containsKey(EXTRA_ARTIST_ID)) { - intent.extras?.getInt(EXTRA_ARTIST_ID)?.let { - artistDetailsPresenter.loadArtist(it) - val name = "${getString(R.string.transition_artist_image)}_$it" - artistCoverContainer?.transitionName = name - } - } else { - finish() - } - - windowEnterTransition() ActivityCompat.postponeEnterTransition(this) setupRecyclerView() 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 a6d5dd39f..224d85e9a 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 @@ -6,7 +6,6 @@ import android.content.res.ColorStateList import android.os.AsyncTask import android.os.Build import android.os.Bundle -import android.text.InputType import android.text.TextUtils import android.view.* import androidx.annotation.StringRes @@ -16,12 +15,14 @@ import androidx.fragment.app.FragmentManager import androidx.fragment.app.FragmentStatePagerAdapter import androidx.viewpager.widget.ViewPager import code.name.monkey.appthemehelper.ThemeStore -import code.name.monkey.appthemehelper.util.* import code.name.monkey.appthemehelper.util.ATHUtil.resolveColor +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.ToolbarContentTintHelper import code.name.monkey.retromusic.App import code.name.monkey.retromusic.R import code.name.monkey.retromusic.activities.base.AbsMusicServiceActivity -import code.name.monkey.retromusic.activities.tageditor.WriteTagsAsyncTask import code.name.monkey.retromusic.extensions.surfaceColor import code.name.monkey.retromusic.extensions.textColorSecondary import code.name.monkey.retromusic.fragments.base.AbsMusicServiceFragment @@ -34,18 +35,10 @@ import code.name.monkey.retromusic.model.lyrics.Lyrics import code.name.monkey.retromusic.util.LyricUtil import code.name.monkey.retromusic.util.MusicUtil import code.name.monkey.retromusic.util.PreferenceUtilKT -import code.name.monkey.retromusic.util.RetroUtil -import com.afollestad.materialdialogs.MaterialDialog -import com.afollestad.materialdialogs.input.getInputLayout -import com.afollestad.materialdialogs.input.input import kotlinx.android.synthetic.main.activity_lyrics.* import kotlinx.android.synthetic.main.fragment_lyrics.* import kotlinx.android.synthetic.main.fragment_synced.* -import org.jaudiotagger.tag.FieldKey import java.io.File -import java.util.* -import kotlin.collections.ArrayList -import kotlin.collections.set class LyricsActivity : AbsMusicServiceActivity(), View.OnClickListener, ViewPager.OnPageChangeListener { @@ -170,7 +163,7 @@ class LyricsActivity : AbsMusicServiceActivity(), View.OnClickListener, e.printStackTrace() } - val materialDialog = MaterialDialog(this) + /*val materialDialog = MaterialDialog(this) .show { title(R.string.add_time_framed_lryics) negativeButton(R.string.action_search) { @@ -188,7 +181,7 @@ class LyricsActivity : AbsMusicServiceActivity(), View.OnClickListener, } } - MaterialUtil.setTint(materialDialog.getInputLayout(), false) + MaterialUtil.setTint(materialDialog.getInputLayout(), false)*/ } private fun updateSong() { @@ -206,7 +199,7 @@ class LyricsActivity : AbsMusicServiceActivity(), View.OnClickListener, lyricsString!! } - val materialDialog = MaterialDialog( + /*val materialDialog = MaterialDialog( this ).show { @@ -231,7 +224,7 @@ class LyricsActivity : AbsMusicServiceActivity(), View.OnClickListener, updateSong() } } - MaterialUtil.setTint(materialDialog.getInputLayout(), false) + MaterialUtil.setTint(materialDialog.getInputLayout(), false)*/ } private fun getSongPaths(song: Song): 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 34be7380e..9b14e3e85 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 @@ -228,6 +228,12 @@ class MainActivity : AbsSlidingMusicPanelActivity(), menu.add(0, R.id.action_search, 0, getString(R.string.action_search)) .setIcon(R.drawable.ic_search_white_24dp) .setShowAsActionFlags(MenuItem.SHOW_AS_ACTION_ALWAYS) + ToolbarContentTintHelper.handleOnCreateOptionsMenu( + this, + toolbar, + menu, + getToolbarBackgroundColor(toolbar) + ) return super.onCreateOptionsMenu(menu) } 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 6872f1ea2..241d59c4b 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 @@ -4,13 +4,17 @@ import android.os.Bundle import android.view.MenuItem import androidx.annotation.StringRes import androidx.fragment.app.Fragment +import code.name.monkey.appthemehelper.ThemeStore +import code.name.monkey.appthemehelper.util.VersionUtils import code.name.monkey.retromusic.R import code.name.monkey.retromusic.activities.base.AbsBaseActivity +import code.name.monkey.retromusic.appshortcuts.DynamicShortcutManager import code.name.monkey.retromusic.extensions.applyToolbar import code.name.monkey.retromusic.fragments.settings.MainSettingsFragment +import com.afollestad.materialdialogs.color.ColorChooserDialog import kotlinx.android.synthetic.main.activity_settings.* -class SettingsActivity : AbsBaseActivity() { +class SettingsActivity : AbsBaseActivity(), ColorChooserDialog.ColorCallback { private val fragmentManager = supportFragmentManager @@ -69,4 +73,19 @@ class SettingsActivity : AbsBaseActivity() { companion object { const val TAG: String = "SettingsActivity" } + + override fun onColorSelection(dialog: ColorChooserDialog, selectedColor: Int) { + when (dialog.title) { + R.string.accent_color -> { + ThemeStore.editTheme(this).accentColor(selectedColor).commit() + if (VersionUtils.hasNougatMR()) + DynamicShortcutManager(this).updateDynamicShortcuts() + } + } + recreate() + } + + override fun onColorChooserDismissed(dialog: ColorChooserDialog) { + + } } diff --git a/app/src/main/java/code/name/monkey/retromusic/activities/AlbumDetailsActivity.kt b/app/src/main/java/code/name/monkey/retromusic/activities/albums/AlbumDetailsActivity.kt similarity index 90% rename from app/src/main/java/code/name/monkey/retromusic/activities/AlbumDetailsActivity.kt rename to app/src/main/java/code/name/monkey/retromusic/activities/albums/AlbumDetailsActivity.kt index c3c1c5e59..65d6a1cc2 100644 --- a/app/src/main/java/code/name/monkey/retromusic/activities/AlbumDetailsActivity.kt +++ b/app/src/main/java/code/name/monkey/retromusic/activities/albums/AlbumDetailsActivity.kt @@ -1,4 +1,4 @@ -package code.name.monkey.retromusic.activities +package code.name.monkey.retromusic.activities.albums import android.app.ActivityOptions import android.content.Intent @@ -10,13 +10,13 @@ import android.view.SubMenu import android.view.View import android.widget.ImageView import androidx.core.app.ActivityCompat +import androidx.lifecycle.ViewModelProvider import androidx.recyclerview.widget.DefaultItemAnimator import androidx.recyclerview.widget.GridLayoutManager import androidx.recyclerview.widget.LinearLayoutManager import code.name.monkey.appthemehelper.util.ATHUtil import code.name.monkey.appthemehelper.util.MaterialUtil import code.name.monkey.appthemehelper.util.ToolbarContentTintHelper -import code.name.monkey.retromusic.App import code.name.monkey.retromusic.R import code.name.monkey.retromusic.activities.base.AbsSlidingMusicPanelActivity import code.name.monkey.retromusic.activities.tageditor.AbsTagEditorActivity @@ -25,6 +25,7 @@ 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.extensions.extraNotNull import code.name.monkey.retromusic.extensions.ripAlpha import code.name.monkey.retromusic.extensions.show import code.name.monkey.retromusic.extensions.surfaceColor @@ -36,7 +37,6 @@ import code.name.monkey.retromusic.helper.SortOrder.AlbumSongSortOrder import code.name.monkey.retromusic.interfaces.CabHolder 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.rest.model.LastFmAlbum import code.name.monkey.retromusic.util.* @@ -46,7 +46,6 @@ import com.bumptech.glide.Glide import kotlinx.android.synthetic.main.activity_album.* import kotlinx.android.synthetic.main.activity_album_content.* import java.util.* -import javax.inject.Inject import android.util.Pair as UtilPair class AlbumDetailsActivity : AbsSlidingMusicPanelActivity(), AlbumDetailsView, CabHolder { @@ -69,6 +68,7 @@ class AlbumDetailsActivity : AbsSlidingMusicPanelActivity(), AlbumDetailsView, C return cab as MaterialCab } + private lateinit var viewModel: AlbumDetailsViewModel private lateinit var simpleSongAdapter: SimpleSongAdapter private lateinit var album: Album private lateinit var artistImage: ImageView @@ -80,9 +80,6 @@ class AlbumDetailsActivity : AbsSlidingMusicPanelActivity(), AlbumDetailsView, C return wrapSlidingMusicPanel(R.layout.activity_album) } - @Inject - lateinit var albumDetailsPresenter: AlbumDetailsPresenter - private fun windowEnterTransition() { val slide = Slide() slide.excludeTarget(R.id.appBarLayout, true) @@ -101,34 +98,30 @@ class AlbumDetailsActivity : AbsSlidingMusicPanelActivity(), AlbumDetailsView, C setLightNavigationBar(true) setBottomBarVisibility(View.GONE) window.sharedElementsUseOverlay = true - - App.musicComponent.inject(this) - albumDetailsPresenter.attachView(this) - - if (intent.extras!!.containsKey(EXTRA_ALBUM_ID)) { - intent.extras?.getInt(EXTRA_ALBUM_ID)?.let { - albumDetailsPresenter.loadAlbum(it) - albumCoverContainer?.transitionName = - "${getString(R.string.transition_album_art)}_$it" - } - } else { - finish() - } - windowEnterTransition() + + val albumId = extraNotNull(EXTRA_ALBUM_ID).value ActivityCompat.postponeEnterTransition(this) - - - artistImage = findViewById(R.id.artistImage) - + val viewModelFactory = AlbumDetailsViewModelFactory(application, albumId) + viewModel = ViewModelProvider(this, viewModelFactory).get(AlbumDetailsViewModel::class.java) + viewModel.getAlbum().observe(this, androidx.lifecycle.Observer { + ActivityCompat.startPostponedEnterTransition(this@AlbumDetailsActivity) + album(it) + }) + viewModel.getArtist().observe(this, androidx.lifecycle.Observer { + loadArtistImage(it) + }) + viewModel.getAlbumInfo().observe(this, androidx.lifecycle.Observer { + aboutAlbum(it) + }) setupRecyclerView() - + artistImage = findViewById(R.id.artistImage) artistImage.setOnClickListener { val artistPairs = ActivityOptions.makeSceneTransitionAnimation( this, UtilPair.create( artistImage, - "${getString(R.string.transition_artist_image)}_${album.artistId}" + getString(R.string.transition_artist_image) ) ) NavigationUtil.goToArtistOptions(this, album.artistId, artistPairs) @@ -159,11 +152,6 @@ class AlbumDetailsActivity : AbsSlidingMusicPanelActivity(), AlbumDetailsView, C } } - override fun onDestroy() { - super.onDestroy() - albumDetailsPresenter.detachView() - } - override fun complete() { ActivityCompat.startPostponedEnterTransition(this) } @@ -201,8 +189,8 @@ class AlbumDetailsActivity : AbsSlidingMusicPanelActivity(), AlbumDetailsView, C } loadAlbumCover() simpleSongAdapter.swapDataSet(album.songs) - albumDetailsPresenter.loadMore(album.artistId) - albumDetailsPresenter.aboutAlbum(album.artistName ?: "-", album.title ?: "-") + viewModel.loadArtistAsync(album.artistId) + viewModel.loadAlbumInfoAsync(album) } override fun moreAlbums(albums: List) { @@ -277,7 +265,6 @@ class AlbumDetailsActivity : AbsSlidingMusicPanelActivity(), AlbumDetailsView, C MaterialUtil.setTint(button = shuffleAction, color = buttonColor) MaterialUtil.setTint(button = playAction, color = buttonColor) - toolbar.setBackgroundColor(surfaceColor()) setSupportActionBar(toolbar) supportActionBar?.title = null @@ -332,7 +319,10 @@ class AlbumDetailsActivity : AbsSlidingMusicPanelActivity(), AlbumDetailsView, C albumCoverContainer, "${getString(R.string.transition_album_art)}_${album.id}" ) - startActivityForResult(intent, TAG_EDITOR_REQUEST, options.toBundle()) + startActivityForResult( + intent, + TAG_EDITOR_REQUEST, options.toBundle() + ) return true } /*Sort*/ @@ -389,18 +379,6 @@ class AlbumDetailsActivity : AbsSlidingMusicPanelActivity(), AlbumDetailsView, C album.songs?.let { simpleSongAdapter.swapDataSet(it) } } - 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() - } - } override fun onBackPressed() { if (cab != null && cab!!.isActive) { diff --git a/app/src/main/java/code/name/monkey/retromusic/activities/albums/AlbumDetailsViewModel.kt b/app/src/main/java/code/name/monkey/retromusic/activities/albums/AlbumDetailsViewModel.kt new file mode 100644 index 000000000..4debc3da7 --- /dev/null +++ b/app/src/main/java/code/name/monkey/retromusic/activities/albums/AlbumDetailsViewModel.kt @@ -0,0 +1,54 @@ +package code.name.monkey.retromusic.activities.albums + +import android.app.Application +import androidx.lifecycle.AndroidViewModel +import androidx.lifecycle.LiveData +import androidx.lifecycle.MutableLiveData +import androidx.lifecycle.viewModelScope +import code.name.monkey.retromusic.model.Album +import code.name.monkey.retromusic.model.Artist +import code.name.monkey.retromusic.providers.RepositoryImpl +import code.name.monkey.retromusic.rest.model.LastFmAlbum +import kotlinx.coroutines.Deferred +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.async +import kotlinx.coroutines.launch + +class AlbumDetailsViewModel( + application: Application, + private val albumId: Int +) : AndroidViewModel(application) { + private val _repository = RepositoryImpl(application.applicationContext) + private val _album = MutableLiveData() + private val _artist = MutableLiveData() + private val _lastFmAlbum = MutableLiveData() + + fun getAlbum(): LiveData = _album + fun getArtist(): LiveData = _artist + fun getAlbumInfo(): LiveData = _lastFmAlbum + + init { + loadDetails() + } + + private fun loadDetails() = viewModelScope.launch { + _album.postValue( + loadAlbumAsync.await() ?: throw NullPointerException("Album couldn't found") + ) + } + + fun loadAlbumInfoAsync(album: Album) = viewModelScope.launch(Dispatchers.IO) { + val lastFmAlbum = _repository.albumInfo(album.artistName ?: "-", album.title ?: "-") + _lastFmAlbum.postValue(lastFmAlbum) + } + + fun loadArtistAsync(artistId: Int) = viewModelScope.launch(Dispatchers.IO) { + val artist = _repository.artistById(artistId) + _artist.postValue(artist) + } + + private val loadAlbumAsync: Deferred + get() = viewModelScope.async(Dispatchers.IO) { + _repository.albumById(albumId) + } +} \ No newline at end of file diff --git a/app/src/main/java/code/name/monkey/retromusic/activities/albums/AlbumDetailsViewModelFactory.kt b/app/src/main/java/code/name/monkey/retromusic/activities/albums/AlbumDetailsViewModelFactory.kt new file mode 100644 index 000000000..7f5aa8476 --- /dev/null +++ b/app/src/main/java/code/name/monkey/retromusic/activities/albums/AlbumDetailsViewModelFactory.kt @@ -0,0 +1,19 @@ +package code.name.monkey.retromusic.activities.albums + +import android.app.Application +import androidx.lifecycle.ViewModel +import androidx.lifecycle.ViewModelProvider + +class AlbumDetailsViewModelFactory( + private val application: Application, + private val albumId: Int +) : + ViewModelProvider.AndroidViewModelFactory(application) { + override fun create(modelClass: Class): T { + return if (modelClass.isAssignableFrom(AlbumDetailsViewModel::class.java)) { + AlbumDetailsViewModel(application, albumId) as T + } else { + throw IllegalArgumentException("ViewModel Not Found") + } + } +} \ 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 fac356ecd..09b665755 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 @@ -14,6 +14,7 @@ import code.name.monkey.appthemehelper.ThemeStore 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.MaterialDialogsUtil import code.name.monkey.appthemehelper.util.VersionUtils import code.name.monkey.retromusic.LanguageContextWrapper import code.name.monkey.retromusic.R @@ -33,6 +34,7 @@ abstract class AbsThemeActivity : ATHToolbarActivity(), Runnable { setImmersiveFullscreen() registerSystemUiVisibility() toggleScreenOn() + MaterialDialogsUtil.updateMaterialDialogsThemeSingleton(this) } 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 4ee68b9b7..9e1bd13c0 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 @@ -28,8 +28,7 @@ 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.misc.DialogAsyncTask -import com.afollestad.materialdialogs.MaterialDialog -import com.afollestad.materialdialogs.callbacks.onCancel +import com.google.android.material.dialog.MaterialAlertDialogBuilder import com.google.android.material.floatingactionbutton.FloatingActionButton import com.google.android.material.textfield.TextInputLayout import kotlinx.android.synthetic.main.activity_bug_report.* @@ -278,27 +277,25 @@ open class BugReportActivity : AbsThemeActivity() { 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() } - } + RESULT_BAD_CREDENTIALS -> MaterialAlertDialogBuilder(context) + .setTitle(R.string.bug_report_failed) + .setMessage(R.string.bug_report_failed_wrong_credentials) + .setPositiveButton(android.R.string.ok, null) + .show() + RESULT_INVALID_TOKEN -> MaterialAlertDialogBuilder(context) + .setTitle(R.string.bug_report_failed) + .setMessage(R.string.bug_report_failed_invalid_token) + .setPositiveButton(android.R.string.ok, null).show() + RESULT_ISSUES_NOT_ENABLED -> MaterialAlertDialogBuilder(context) + .setTitle(R.string.bug_report_failed) + .setMessage(R.string.bug_report_failed_issues_not_available) + .setPositiveButton(android.R.string.ok, null) + + else -> MaterialAlertDialogBuilder(context) + .setTitle(R.string.bug_report_failed) + .setMessage(R.string.bug_report_failed_unknown) + .setPositiveButton(android.R.string.ok) { _, _ -> tryToFinishActivity() } + .setNegativeButton(android.R.string.cancel) { _, _ -> { tryToFinishActivity() } } } } @@ -309,6 +306,7 @@ open class BugReportActivity : AbsThemeActivity() { } } + companion object { fun report( 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 7d81bcee3..8b49a57c7 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 @@ -13,6 +13,7 @@ import android.util.Log import android.view.MenuItem import android.view.View import android.view.animation.OvershootInterpolator +import androidx.appcompat.app.AlertDialog import code.name.monkey.appthemehelper.ThemeStore import code.name.monkey.appthemehelper.util.ATHUtil import code.name.monkey.appthemehelper.util.ColorUtil @@ -24,9 +25,8 @@ import code.name.monkey.retromusic.activities.base.AbsBaseActivity import code.name.monkey.retromusic.activities.saf.SAFGuideActivity import code.name.monkey.retromusic.util.RetroUtil import code.name.monkey.retromusic.util.SAFUtil -import com.afollestad.materialdialogs.MaterialDialog -import com.afollestad.materialdialogs.list.listItems import com.google.android.material.button.MaterialButton +import com.google.android.material.dialog.MaterialAlertDialogBuilder import kotlinx.android.synthetic.main.activity_album_tag_editor.* import org.jaudiotagger.audio.AudioFile import org.jaudiotagger.audio.AudioFileIO @@ -48,17 +48,18 @@ abstract class AbsTagEditorActivity : AbsBaseActivity() { private var savedTags: Map? = null private var savedArtworkInfo: ArtworkInfo? = null - protected val show: MaterialDialog - get() = MaterialDialog(this).show { - title(R.string.update_image) - listItems(items = items) { _, position, _ -> - when (position) { - 0 -> startImagePicker() - 1 -> searchImageOnWeb() - 2 -> deleteImage() + protected val show: AlertDialog + get() = + MaterialAlertDialogBuilder(this) + .setTitle(R.string.update_image) + .setItems(items.toTypedArray()) { _, position -> + when (position) { + 0 -> startImagePicker() + 1 -> searchImageOnWeb() + 2 -> deleteImage() + } } - } - } + .show() protected abstract val contentViewLayout: Int internal val albumArtist: String? 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 b29684045..b66a0a496 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 @@ -91,7 +91,7 @@ class AlbumTagEditorActivity : AbsTagEditorActivity(), TextWatcher { setDrawUnderStatusBar() super.onCreate(savedInstanceState) window.sharedElementsUseOverlay = true - imageContainer?.transitionName = "${getString(R.string.transition_album_art)}_$id" + imageContainer?.transitionName = getString(R.string.transition_album_art) windowEnterTransition() setUpViews() setupToolbar() @@ -162,7 +162,7 @@ class AlbumTagEditorActivity : AbsTagEditorActivity(), TextWatcher { writeValuesToFiles( fieldKeyValueMap, - if (deleteAlbumArt) ArtworkInfo(id, null) + if (deleteAlbumArt) AbsTagEditorActivity.ArtworkInfo(id, null) else if (albumArtBitmap == null) null else ArtworkInfo(id, albumArtBitmap!!) ) } 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 83f97aee4..691852b51 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 @@ -180,7 +180,7 @@ open class AlbumAdapter( val activityOptions = ActivityOptions.makeSceneTransitionAnimation( activity, imageContainerCard ?: image, - "${activity.getString(R.string.transition_album_art)}_${dataSet[layoutPosition].id}" + activity.getString(R.string.transition_album_art) ) NavigationUtil.goToAlbumOptions( activity, 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 9986fe28e..5a774b20b 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 @@ -100,7 +100,7 @@ class AlbumFullWidthAdapter( val activityOptions = ActivityOptions.makeSceneTransitionAnimation( activity, imageContainerCard ?: image, - "${activity.getString(R.string.transition_album_art)}_${dataSet[layoutPosition].id}" + activity.getString(R.string.transition_album_art) ) NavigationUtil.goToAlbumOptions(activity, dataSet[layoutPosition].id, activityOptions) } 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 e85504d19..65aa15b5a 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 @@ -142,7 +142,7 @@ class ArtistAdapter( val activityOptions = ActivityOptions.makeSceneTransitionAnimation( activity, imageContainerCard ?: image, - "${activity.getString(R.string.transition_artist_image)}_${dataSet[layoutPosition].id}" + activity.getString(R.string.transition_artist_image) ) NavigationUtil.goToArtistOptions( activity, dataSet[layoutPosition].id, activityOptions 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 6ffc8942f..252c837aa 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 @@ -60,7 +60,7 @@ open class PlaylistSongAdapter( val activityOptions = ActivityOptions.makeSceneTransitionAnimation( activity, imageContainerCard ?: image, - "${activity.getString(R.string.transition_album_art)}_${song.albumId}" + activity.getString(R.string.transition_album_art) ) NavigationUtil.goToAlbumOptions(activity, song.albumId, activityOptions) return true 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 e82d05137..86fbf94ca 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 @@ -186,7 +186,7 @@ open class SongAdapter( val activityOptions = ActivityOptions.makeSceneTransitionAnimation( activity, imageContainerCard ?: image, - "${activity.getString(R.string.transition_album_art)}_${song.albumId}" + activity.getString(R.string.transition_album_art) ) NavigationUtil.goToAlbumOptions(activity, song.albumId, activityOptions) return true diff --git a/app/src/main/java/code/name/monkey/retromusic/dagger/MusicComponent.kt b/app/src/main/java/code/name/monkey/retromusic/dagger/MusicComponent.kt index 86703f4bb..7cd5ef8d0 100644 --- a/app/src/main/java/code/name/monkey/retromusic/dagger/MusicComponent.kt +++ b/app/src/main/java/code/name/monkey/retromusic/dagger/MusicComponent.kt @@ -14,7 +14,10 @@ package code.name.monkey.retromusic.dagger -import code.name.monkey.retromusic.activities.* +import code.name.monkey.retromusic.activities.ArtistDetailActivity +import code.name.monkey.retromusic.activities.GenreDetailsActivity +import code.name.monkey.retromusic.activities.PlaylistDetailActivity +import code.name.monkey.retromusic.activities.SearchActivity import code.name.monkey.retromusic.dagger.module.AppModule import code.name.monkey.retromusic.dagger.module.PresenterModule import code.name.monkey.retromusic.fragments.albums.AlbumsFragment @@ -50,8 +53,6 @@ interface MusicComponent { fun inject(artistDetailActivity: ArtistDetailActivity) - fun inject(albumDetailsActivity: AlbumDetailsActivity) - fun inject(playlistDetailActivity: PlaylistDetailActivity) fun inject(genreDetailsActivity: GenreDetailsActivity) diff --git a/app/src/main/java/code/name/monkey/retromusic/dialogs/BlacklistFolderChooserDialog.java b/app/src/main/java/code/name/monkey/retromusic/dialogs/BlacklistFolderChooserDialog.java new file mode 100644 index 000000000..a276db9c3 --- /dev/null +++ b/app/src/main/java/code/name/monkey/retromusic/dialogs/BlacklistFolderChooserDialog.java @@ -0,0 +1,157 @@ +package code.name.monkey.retromusic.dialogs; + +import android.Manifest; +import android.app.Dialog; +import android.content.pm.PackageManager; +import android.os.Build; +import android.os.Bundle; +import android.os.Environment; +import android.view.View; + +import androidx.annotation.NonNull; +import androidx.core.app.ActivityCompat; +import androidx.fragment.app.DialogFragment; + +import com.afollestad.materialdialogs.MaterialDialog; + +import java.io.File; +import java.util.ArrayList; +import java.util.Collections; +import java.util.Comparator; +import java.util.List; + +import code.name.monkey.retromusic.R; + +public class BlacklistFolderChooserDialog extends DialogFragment implements MaterialDialog.ListCallback { + + String initialPath = Environment.getExternalStorageDirectory().getAbsolutePath(); + private File parentFolder; + private File[] parentContents; + private boolean canGoUp = false; + private FolderCallback callback; + + public static BlacklistFolderChooserDialog create() { + return new BlacklistFolderChooserDialog(); + } + + private String[] getContentsArray() { + if (parentContents == null) { + if (canGoUp) { + return new String[]{".."}; + } + return new String[]{}; + } + String[] results = new String[parentContents.length + (canGoUp ? 1 : 0)]; + if (canGoUp) { + results[0] = ".."; + } + for (int i = 0; i < parentContents.length; i++) { + results[canGoUp ? i + 1 : i] = parentContents[i].getName(); + } + return results; + } + + private File[] listFiles() { + File[] contents = parentFolder.listFiles(); + List results = new ArrayList<>(); + if (contents != null) { + for (File fi : contents) { + if (fi.isDirectory()) { + results.add(fi); + } + } + Collections.sort(results, new FolderSorter()); + return results.toArray(new File[results.size()]); + } + return null; + } + + @NonNull + @Override + public Dialog onCreateDialog(Bundle savedInstanceState) { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M + && ActivityCompat.checkSelfPermission( + getActivity(), Manifest.permission.READ_EXTERNAL_STORAGE) + != PackageManager.PERMISSION_GRANTED) { + return new MaterialDialog.Builder(getActivity()) + .title(R.string.md_error_label) + .content(R.string.md_storage_perm_error) + .positiveText(android.R.string.ok) + .build(); + } + if (savedInstanceState == null) { + savedInstanceState = new Bundle(); + } + if (!savedInstanceState.containsKey("current_path")) { + savedInstanceState.putString("current_path", initialPath); + } + parentFolder = new File(savedInstanceState.getString("current_path", File.pathSeparator)); + checkIfCanGoUp(); + parentContents = listFiles(); + MaterialDialog.Builder builder = + new MaterialDialog.Builder(getActivity()) + .title(parentFolder.getAbsolutePath()) + .items((CharSequence[]) getContentsArray()) + .itemsCallback(this) + .autoDismiss(false) + .onPositive((dialog, which) -> { + dismiss(); + callback.onFolderSelection(BlacklistFolderChooserDialog.this, parentFolder); + }) + .onNegative((materialDialog, dialogAction) -> dismiss()) + .positiveText(R.string.add_action) + .negativeText(android.R.string.cancel); + return builder.build(); + } + + @Override + public void onSelection(MaterialDialog materialDialog, View view, int i, CharSequence s) { + if (canGoUp && i == 0) { + parentFolder = parentFolder.getParentFile(); + if (parentFolder.getAbsolutePath().equals("/storage/emulated")) { + parentFolder = parentFolder.getParentFile(); + } + checkIfCanGoUp(); + } else { + parentFolder = parentContents[canGoUp ? i - 1 : i]; + canGoUp = true; + if (parentFolder.getAbsolutePath().equals("/storage/emulated")) { + parentFolder = Environment.getExternalStorageDirectory(); + } + } + reload(); + } + + private void checkIfCanGoUp() { + canGoUp = parentFolder.getParent() != null; + } + + private void reload() { + parentContents = listFiles(); + MaterialDialog dialog = (MaterialDialog) getDialog(); + dialog.setTitle(parentFolder.getAbsolutePath()); + dialog.setItems((CharSequence[]) getContentsArray()); + } + + @Override + public void onSaveInstanceState(Bundle outState) { + super.onSaveInstanceState(outState); + outState.putString("current_path", parentFolder.getAbsolutePath()); + } + + public void setCallback(FolderCallback callback) { + this.callback = callback; + } + + public interface FolderCallback { + void onFolderSelection(@NonNull BlacklistFolderChooserDialog dialog, @NonNull File folder); + } + + private static class FolderSorter implements Comparator { + + @Override + public int compare(File lhs, File rhs) { + return lhs.getName().compareTo(rhs.getName()); + } + } +} \ No newline at end of file diff --git a/app/src/main/java/code/name/monkey/retromusic/dialogs/BlacklistFolderChooserDialog.kt b/app/src/main/java/code/name/monkey/retromusic/dialogs/BlacklistFolderChooserDialog.kt deleted file mode 100644 index 25ace5fa5..000000000 --- a/app/src/main/java/code/name/monkey/retromusic/dialogs/BlacklistFolderChooserDialog.kt +++ /dev/null @@ -1,180 +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.dialogs - -import android.Manifest -import android.app.Dialog -import android.content.pm.PackageManager -import android.os.Build -import android.os.Bundle -import android.os.Environment -import androidx.core.app.ActivityCompat -import androidx.fragment.app.DialogFragment -import code.name.monkey.retromusic.R -import com.afollestad.materialdialogs.MaterialDialog -import com.afollestad.materialdialogs.list.listItems -import java.io.File -import java.util.* -import kotlin.collections.ArrayList - -class BlacklistFolderChooserDialog : DialogFragment() { - - private val initialPath = Environment.getExternalStorageDirectory().absolutePath - private var parentFolder: File? = null - private var parentContents: Array? = null - private var canGoUp = false - private var callback: FolderCallback? = null - - - private fun contentsArray(): List { - if (parentContents == null) { - return if (canGoUp) { - return listOf("..") - } else listOf() - } - - val results = arrayOfNulls(parentContents!!.size + if (canGoUp) 1 else 0) - if (canGoUp) { - results[0] = ".." - } - for (i in parentContents!!.indices) { - results[if (canGoUp) i + 1 else i] = parentContents!![i].name - } - - val data = ArrayList() - for (i in results) { - data.add(i!!) - } - return data - } - - private fun listFiles(): Array? { - val contents = parentFolder!!.listFiles() - val results = ArrayList() - if (contents != null) { - for (fi in contents) { - if (fi.isDirectory) { - results.add(fi) - } - } - Collections.sort(results, FolderSorter()) - return results.toTypedArray() - } - return null - } - - override fun onCreateDialog(savedInstanceState: Bundle?): Dialog { - var savedInstanceStateFinal = savedInstanceState - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M && - ActivityCompat.checkSelfPermission( - requireActivity(), - Manifest.permission.READ_EXTERNAL_STORAGE - ) != PackageManager.PERMISSION_GRANTED - ) { - return MaterialDialog(requireActivity()).show { - title(R.string.md_error_label) - - message(R.string.md_storage_perm_error) - positiveButton(android.R.string.ok) - } - } - if (savedInstanceStateFinal == null) { - savedInstanceStateFinal = Bundle() - } - if (!savedInstanceStateFinal.containsKey("current_path")) { - savedInstanceStateFinal.putString("current_path", initialPath) - } - parentFolder = File(savedInstanceStateFinal.getString("current_path", File.pathSeparator)) - checkIfCanGoUp() - parentContents = listFiles() - - return MaterialDialog(requireContext()).show { - title(text = parentFolder!!.absolutePath) - - listItems(items = contentsArray(), waitForPositiveButton = false) { _, index, _ -> - onSelection(index) - } - noAutoDismiss() - positiveButton(R.string.add_action) { - dismiss() - callback!!.onFolderSelection(this@BlacklistFolderChooserDialog, parentFolder!!) - } - negativeButton(android.R.string.cancel) { - dismiss() - } - } - } - - private fun onSelection(i: Int) { - if (canGoUp && i == 0) { - parentFolder = parentFolder!!.parentFile - if (parentFolder!!.absolutePath == "/storage/emulated") { - parentFolder = parentFolder!!.parentFile - } - checkIfCanGoUp() - } else { - parentFolder = parentContents!![if (canGoUp) i - 1 else i] - canGoUp = true - if (parentFolder!!.absolutePath == "/storage/emulated") { - parentFolder = Environment.getExternalStorageDirectory() - } - } - reload() - } - - private fun checkIfCanGoUp() { - canGoUp = parentFolder!!.parent != null - } - - private fun reload() { - parentContents = listFiles() - val dialog = dialog as MaterialDialog? - - dialog?.apply { - - setTitle(parentFolder!!.absolutePath) - listItems(items = contentsArray()) { _, index, _ -> - onSelection(index) - } - } - } - - override fun onSaveInstanceState(outState: Bundle) { - super.onSaveInstanceState(outState) - outState.putString("current_path", parentFolder!!.absolutePath) - } - - fun setCallback(callback: FolderCallback) { - this.callback = callback - } - - interface FolderCallback { - fun onFolderSelection(dialog: BlacklistFolderChooserDialog, folder: File) - } - - private class FolderSorter : Comparator { - - override fun compare(lhs: File, rhs: File): Int { - return lhs.name.compareTo(rhs.name) - } - } - - companion object { - - fun create(): BlacklistFolderChooserDialog { - return BlacklistFolderChooserDialog() - } - } -} \ No newline at end of file diff --git a/app/src/main/java/code/name/monkey/retromusic/dialogs/SleepTimerDialog.kt b/app/src/main/java/code/name/monkey/retromusic/dialogs/SleepTimerDialog.kt index 4af19be45..a1e946cf1 100755 --- a/app/src/main/java/code/name/monkey/retromusic/dialogs/SleepTimerDialog.kt +++ b/app/src/main/java/code/name/monkey/retromusic/dialogs/SleepTimerDialog.kt @@ -36,9 +36,8 @@ import code.name.monkey.retromusic.service.MusicService import code.name.monkey.retromusic.service.MusicService.ACTION_PENDING_QUIT import code.name.monkey.retromusic.service.MusicService.ACTION_QUIT import code.name.monkey.retromusic.util.PreferenceUtilKT +import com.afollestad.materialdialogs.DialogAction import com.afollestad.materialdialogs.MaterialDialog -import com.afollestad.materialdialogs.WhichButton -import com.afollestad.materialdialogs.actions.getActionButton import com.google.android.material.dialog.MaterialAlertDialogBuilder class SleepTimerDialog : DialogFragment() { @@ -153,10 +152,10 @@ class SleepTimerDialog : DialogFragment() { private fun updateCancelButton() { val musicService = MusicPlayerRemote.musicService if (musicService != null && musicService.pendingQuit) { - materialDialog.getActionButton(WhichButton.NEGATIVE).text = + materialDialog.getActionButton(DialogAction.NEUTRAL).text = materialDialog.context.getString(R.string.cancel_current_timer) } else { - materialDialog.getActionButton(WhichButton.NEGATIVE).text = null + materialDialog.getActionButton(DialogAction.NEUTRAL).text = null } } diff --git a/app/src/main/java/code/name/monkey/retromusic/fragments/LibraryViewModel.kt b/app/src/main/java/code/name/monkey/retromusic/fragments/LibraryViewModel.kt index 754182fab..57604d500 100644 --- a/app/src/main/java/code/name/monkey/retromusic/fragments/LibraryViewModel.kt +++ b/app/src/main/java/code/name/monkey/retromusic/fragments/LibraryViewModel.kt @@ -5,8 +5,6 @@ import androidx.lifecycle.AndroidViewModel import androidx.lifecycle.LiveData import androidx.lifecycle.MutableLiveData import androidx.lifecycle.viewModelScope -import code.name.monkey.retromusic.Result.Error -import code.name.monkey.retromusic.Result.Success import code.name.monkey.retromusic.fragments.ReloadType.* import code.name.monkey.retromusic.interfaces.MusicServiceEventListener import code.name.monkey.retromusic.model.* @@ -60,8 +58,8 @@ class LibraryViewModel(application: Application) : _repository.favoritePlaylist() ) for (r in result) { - if (r is Success) { - list.add(r.data) + if (r != null) { + list.add(r) } } _homeSections.value = list @@ -69,41 +67,27 @@ class LibraryViewModel(application: Application) : private val loadSongs: Deferred> get() = viewModelScope.async(IO) { - when (val result = _repository.allSongs()) { - is Success -> result.data - is Error -> arrayListOf() - } + _repository.allSongs() } private val loadAlbums: Deferred> get() = viewModelScope.async(IO) { - when (val result = _repository.allAlbums()) { - is Success -> result.data - is Error -> arrayListOf() - } + _repository.allAlbums() } + private val loadArtists: Deferred> get() = viewModelScope.async(IO) { - when (val result = _repository.allArtists()) { - is Success -> result.data - is Error -> arrayListOf() - } + _repository.allArtists() } private val loadPlaylists: Deferred> get() = viewModelScope.async(IO) { - when (val result = _repository.allPlaylists()) { - is Success -> result.data - is Error -> arrayListOf() - } + _repository.allPlaylists() } private val loadGenres: Deferred> get() = viewModelScope.async(IO) { - when (val result = _repository.allGenres()) { - is Success -> result.data - is Error -> arrayListOf() - } + _repository.allGenres() } fun forceReload(reloadType: ReloadType) = viewModelScope.launch { diff --git a/app/src/main/java/code/name/monkey/retromusic/fragments/mainactivity/FoldersFragment.java b/app/src/main/java/code/name/monkey/retromusic/fragments/mainactivity/FoldersFragment.java index 679e5d91e..5016ba7ab 100644 --- a/app/src/main/java/code/name/monkey/retromusic/fragments/mainactivity/FoldersFragment.java +++ b/app/src/main/java/code/name/monkey/retromusic/fragments/mainactivity/FoldersFragment.java @@ -307,10 +307,10 @@ public class FoldersFragment extends AbsMainActivityFragment implements String.format(getString(R.string.not_listed_in_media_store), file1.getName())), Snackbar.LENGTH_LONG) .setAction(R.string.action_scan, - v -> new ListPathsAsyncTask(getActivity(), this::scanPaths) + v -> new ListPathsAsyncTask(requireActivity(), this::scanPaths) .execute( new ListPathsAsyncTask.LoadingInfo(finalFile, AUDIO_FILE_FILTER))) - .setActionTextColor(ThemeStore.Companion.accentColor(getActivity())) + .setActionTextColor(ThemeStore.Companion.accentColor(requireActivity())) .show(); } }).execute(new ListSongsAsyncTask.LoadingInfo(toList(file.getParentFile()), fileFilter, diff --git a/app/src/main/java/code/name/monkey/retromusic/fragments/settings/AbsSettingsFragment.kt b/app/src/main/java/code/name/monkey/retromusic/fragments/settings/AbsSettingsFragment.kt index 4c323310a..b7d51f06c 100644 --- a/app/src/main/java/code/name/monkey/retromusic/fragments/settings/AbsSettingsFragment.kt +++ b/app/src/main/java/code/name/monkey/retromusic/fragments/settings/AbsSettingsFragment.kt @@ -21,8 +21,8 @@ import android.view.View import android.widget.Toast import androidx.preference.ListPreference import androidx.preference.Preference -import androidx.preference.PreferenceFragmentCompat import androidx.preference.PreferenceManager +import code.name.monkey.appthemehelper.common.prefs.supportv7.ATEPreferenceFragmentCompat import code.name.monkey.appthemehelper.util.ATHUtil import code.name.monkey.retromusic.R import code.name.monkey.retromusic.preferences.* @@ -32,7 +32,7 @@ import code.name.monkey.retromusic.util.NavigationUtil * @author Hemanth S (h4h13). */ -abstract class AbsSettingsFragment : PreferenceFragmentCompat() { +abstract class AbsSettingsFragment : ATEPreferenceFragmentCompat() { internal fun showProToastAndNavigate(message: String) { Toast.makeText(requireContext(), "$message is Pro version feature.", Toast.LENGTH_SHORT) diff --git a/app/src/main/java/code/name/monkey/retromusic/fragments/settings/ImageSettingFragment.kt b/app/src/main/java/code/name/monkey/retromusic/fragments/settings/ImageSettingFragment.kt index 2f60f1ba1..9b5873fa0 100644 --- a/app/src/main/java/code/name/monkey/retromusic/fragments/settings/ImageSettingFragment.kt +++ b/app/src/main/java/code/name/monkey/retromusic/fragments/settings/ImageSettingFragment.kt @@ -31,7 +31,6 @@ class ImageSettingFragment : AbsSettingsFragment() { setSummary(autoDownloadImagesPolicy, o) true } - } override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) { diff --git a/app/src/main/java/code/name/monkey/retromusic/fragments/settings/NowPlayingSettingsFragment.kt b/app/src/main/java/code/name/monkey/retromusic/fragments/settings/NowPlayingSettingsFragment.kt index cc032d19e..7e2b70487 100644 --- a/app/src/main/java/code/name/monkey/retromusic/fragments/settings/NowPlayingSettingsFragment.kt +++ b/app/src/main/java/code/name/monkey/retromusic/fragments/settings/NowPlayingSettingsFragment.kt @@ -48,20 +48,23 @@ class NowPlayingSettingsFragment : AbsSettingsFragment(), } private fun updateAlbumCoverStyleSummary() { - val preference: Preference = findPreference(ALBUM_COVER_STYLE)!! - preference.setSummary(PreferenceUtilKT.albumCoverStyle.titleRes) + val preference: Preference? = findPreference(ALBUM_COVER_STYLE) + preference?.setSummary(PreferenceUtilKT.albumCoverStyle.titleRes) } private fun updateNowPlayingScreenSummary() { - val preference: Preference = findPreference(NOW_PLAYING_SCREEN_ID)!! - preference.setSummary(PreferenceUtilKT.nowPlayingScreen.titleRes) + val preference: Preference? = findPreference(NOW_PLAYING_SCREEN_ID) + preference?.setSummary(PreferenceUtilKT.nowPlayingScreen.titleRes) } override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) PreferenceUtilKT.registerOnSharedPreferenceChangedListener(this) - val preference: Preference = findPreference("album_cover_transform")!! - setSummary(preference) + val preference: Preference? = findPreference("album_cover_transform") + preference?.setOnPreferenceChangeListener { albumPrefs, newValue -> + setSummary(albumPrefs, newValue) + true + } } override fun onDestroyView() { diff --git a/app/src/main/java/code/name/monkey/retromusic/fragments/settings/OtherSettingsFragment.kt b/app/src/main/java/code/name/monkey/retromusic/fragments/settings/OtherSettingsFragment.kt index 398bd4eef..2338c6f7e 100644 --- a/app/src/main/java/code/name/monkey/retromusic/fragments/settings/OtherSettingsFragment.kt +++ b/app/src/main/java/code/name/monkey/retromusic/fragments/settings/OtherSettingsFragment.kt @@ -17,9 +17,8 @@ package code.name.monkey.retromusic.fragments.settings import android.os.Bundle import android.view.View import androidx.preference.Preference - +import code.name.monkey.appthemehelper.common.prefs.supportv7.ATEListPreference import code.name.monkey.retromusic.R -import code.name.monkey.retromusic.preferences.MaterialListPreference /** * @author Hemanth S (h4h13). @@ -27,8 +26,8 @@ import code.name.monkey.retromusic.preferences.MaterialListPreference class OtherSettingsFragment : AbsSettingsFragment() { override fun invalidateSettings() { - val languagePreference: MaterialListPreference = findPreference("language_name")!! - languagePreference.setOnPreferenceChangeListener { _, _ -> + val languagePreference: ATEListPreference? = findPreference("language_name") + languagePreference?.setOnPreferenceChangeListener { _, _ -> requireActivity().recreate() return@setOnPreferenceChangeListener true } @@ -40,9 +39,15 @@ class OtherSettingsFragment : AbsSettingsFragment() { override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) - val preference: Preference = findPreference("last_added_interval")!! - setSummary(preference) - val languagePreference: Preference = findPreference("language_name")!! - setSummary(languagePreference) + val preference: Preference? = findPreference("last_added_interval") + preference?.setOnPreferenceChangeListener { lastAdded, newValue -> + setSummary(lastAdded, newValue) + true + } + val languagePreference: Preference? = findPreference("language_name") + languagePreference?.setOnPreferenceChangeListener { prefs, newValue -> + setSummary(prefs, newValue) + true + } } } diff --git a/app/src/main/java/code/name/monkey/retromusic/fragments/settings/PersonalizeSettingsFragment.kt b/app/src/main/java/code/name/monkey/retromusic/fragments/settings/PersonalizeSettingsFragment.kt index bac4ba930..0a386b348 100644 --- a/app/src/main/java/code/name/monkey/retromusic/fragments/settings/PersonalizeSettingsFragment.kt +++ b/app/src/main/java/code/name/monkey/retromusic/fragments/settings/PersonalizeSettingsFragment.kt @@ -14,21 +14,15 @@ package code.name.monkey.retromusic.fragments.settings -import android.content.SharedPreferences import android.os.Bundle import android.view.View -import androidx.preference.Preference import androidx.preference.TwoStatePreference -import code.name.monkey.retromusic.CAROUSEL_EFFECT +import code.name.monkey.appthemehelper.common.prefs.supportv7.ATEListPreference import code.name.monkey.retromusic.R -import code.name.monkey.retromusic.util.PreferenceUtilKT - -class PersonalizeSettingsFragment : AbsSettingsFragment(), - SharedPreferences.OnSharedPreferenceChangeListener { +class PersonalizeSettingsFragment : AbsSettingsFragment() { override fun invalidateSettings() { - val toggleFullScreen: TwoStatePreference = findPreference("toggle_full_screen")!! toggleFullScreen.setOnPreferenceChangeListener { _, _ -> requireActivity().recreate() @@ -42,22 +36,15 @@ class PersonalizeSettingsFragment : AbsSettingsFragment(), override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) - PreferenceUtilKT.registerOnSharedPreferenceChangedListener(this) - - var preference: Preference? = findPreference("home_artist_grid_style") - setSummary(preference!!) - preference = findPreference("tab_text_mode") - setSummary(preference!!) - } - - override fun onDestroyView() { - super.onDestroyView() - PreferenceUtilKT.unregisterOnSharedPreferenceChangedListener(this) - } - - override fun onSharedPreferenceChanged(sharedPreferences: SharedPreferences, key: String) { - when (key) { - CAROUSEL_EFFECT -> invalidateSettings() + val homeArtistStyle: ATEListPreference? = findPreference("home_artist_grid_style") + homeArtistStyle?.setOnPreferenceChangeListener { preference, newValue -> + setSummary(preference, newValue) + true + } + val tabTextMode: ATEListPreference? = findPreference("tab_text_mode") + tabTextMode?.setOnPreferenceChangeListener { prefs, newValue -> + setSummary(prefs, newValue) + true } } } diff --git a/app/src/main/java/code/name/monkey/retromusic/fragments/settings/ThemeSettingsFragment.kt b/app/src/main/java/code/name/monkey/retromusic/fragments/settings/ThemeSettingsFragment.kt index 7471850cc..6568aa741 100644 --- a/app/src/main/java/code/name/monkey/retromusic/fragments/settings/ThemeSettingsFragment.kt +++ b/app/src/main/java/code/name/monkey/retromusic/fragments/settings/ThemeSettingsFragment.kt @@ -18,8 +18,6 @@ import android.os.Build import android.os.Bundle import androidx.preference.Preference import androidx.preference.TwoStatePreference -import code.name.monkey.appthemehelper.ACCENT_COLORS -import code.name.monkey.appthemehelper.ACCENT_COLORS_SUB import code.name.monkey.appthemehelper.ThemeStore import code.name.monkey.appthemehelper.common.prefs.supportv7.ATEColorPreference import code.name.monkey.appthemehelper.common.prefs.supportv7.ATESwitchPreference @@ -30,9 +28,7 @@ import code.name.monkey.retromusic.DESATURATED_COLOR import code.name.monkey.retromusic.R import code.name.monkey.retromusic.appshortcuts.DynamicShortcutManager import code.name.monkey.retromusic.util.PreferenceUtilKT -import com.afollestad.materialdialogs.MaterialDialog -import com.afollestad.materialdialogs.color.colorChooser - +import com.afollestad.materialdialogs.color.ColorChooserDialog /** * @author Hemanth S (h4h13). @@ -62,21 +58,12 @@ class ThemeSettingsFragment : AbsSettingsFragment() { accentColorPref.setColor(accentColor, ColorUtil.darkenColor(accentColor)) accentColorPref.setOnPreferenceClickListener { - MaterialDialog(requireActivity()).show { - title(R.string.accent_color) - positiveButton(R.string.set) - colorChooser( - colors = ACCENT_COLORS, - allowCustomArgb = true, - subColors = ACCENT_COLORS_SUB - ) { _, color -> - ThemeStore.editTheme(requireContext()).accentColor(color).commit() - if (VersionUtils.hasNougatMR()) - DynamicShortcutManager(requireContext()).updateDynamicShortcuts() - - requireActivity().recreate() - } - } + ColorChooserDialog.Builder(requireContext(), R.string.accent_color) + .accentMode(true) + .allowUserColorInput(true) + .allowUserColorInputAlpha(false) + .preselect(accentColor) + .show(requireActivity()) return@setOnPreferenceClickListener true } val blackTheme: ATESwitchPreference? = findPreference("black_theme") diff --git a/app/src/main/java/code/name/monkey/retromusic/mvp/presenter/AlbumDetailsPresenter.kt b/app/src/main/java/code/name/monkey/retromusic/mvp/presenter/AlbumDetailsPresenter.kt index 8b53f370e..be7e64e4a 100644 --- a/app/src/main/java/code/name/monkey/retromusic/mvp/presenter/AlbumDetailsPresenter.kt +++ b/app/src/main/java/code/name/monkey/retromusic/mvp/presenter/AlbumDetailsPresenter.kt @@ -14,14 +14,16 @@ package code.name.monkey.retromusic.mvp.presenter -import code.name.monkey.retromusic.Result.Success import code.name.monkey.retromusic.model.Album import code.name.monkey.retromusic.model.Artist import code.name.monkey.retromusic.mvp.Presenter import code.name.monkey.retromusic.mvp.PresenterImpl import code.name.monkey.retromusic.providers.interfaces.Repository import code.name.monkey.retromusic.rest.model.LastFmAlbum -import kotlinx.coroutines.* +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.Job +import kotlinx.coroutines.launch import javax.inject.Inject import kotlin.coroutines.CoroutineContext @@ -57,19 +59,15 @@ interface AlbumDetailsPresenter : Presenter { override fun loadMore(artistId: Int) { launch { - when (val result = repository.artistById(artistId)) { - is Success -> withContext(Dispatchers.Main) { showArtistImage(result.data) } - is Error -> withContext(Dispatchers.Main) {} - } + val result = repository.artistById(artistId) + showArtistImage(result) } } override fun aboutAlbum(artist: String, album: String) { launch { - when (val result = repository.albumInfo(artist, album)) { - is Success -> withContext(Dispatchers.Main) { view.aboutAlbum(result.data) } - is Error -> withContext(Dispatchers.Main) {} - } + val result = repository.albumInfo(artist, album) + view.aboutAlbum(result) } } @@ -83,13 +81,10 @@ interface AlbumDetailsPresenter : Presenter { override fun loadAlbum(albumId: Int) { launch { - when (val result = repository.albumById(albumId)) { - is Success -> withContext(Dispatchers.Main) { - album = result.data - view?.album(result.data) - } - is Error -> withContext(Dispatchers.Main) { view?.complete() } - } + val result = repository.albumById(albumId) + album = result + view?.album(result) + } } diff --git a/app/src/main/java/code/name/monkey/retromusic/mvp/presenter/AlbumPresenter.kt b/app/src/main/java/code/name/monkey/retromusic/mvp/presenter/AlbumPresenter.kt index 936fd44ba..0f97fde07 100644 --- a/app/src/main/java/code/name/monkey/retromusic/mvp/presenter/AlbumPresenter.kt +++ b/app/src/main/java/code/name/monkey/retromusic/mvp/presenter/AlbumPresenter.kt @@ -14,14 +14,15 @@ package code.name.monkey.retromusic.mvp.presenter -import code.name.monkey.retromusic.Result.Error -import code.name.monkey.retromusic.Result.Success import code.name.monkey.retromusic.model.Album import code.name.monkey.retromusic.mvp.BaseView import code.name.monkey.retromusic.mvp.Presenter import code.name.monkey.retromusic.mvp.PresenterImpl import code.name.monkey.retromusic.providers.interfaces.Repository -import kotlinx.coroutines.* +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.Job +import kotlinx.coroutines.launch import javax.inject.Inject import kotlin.coroutines.CoroutineContext @@ -53,10 +54,8 @@ interface AlbumsPresenter : Presenter { override fun loadAlbums() { launch { - when (val result = repository.allAlbums()) { - is Success -> withContext(Dispatchers.Main) { view?.albums(result.data) } - is Error -> withContext(Dispatchers.Main) { view?.showEmptyView() } - } + val result = repository.allAlbums() + view?.albums(result) } } } diff --git a/app/src/main/java/code/name/monkey/retromusic/mvp/presenter/ArtistDetailsPresenter.kt b/app/src/main/java/code/name/monkey/retromusic/mvp/presenter/ArtistDetailsPresenter.kt index 649df0946..4aa9d1d1e 100644 --- a/app/src/main/java/code/name/monkey/retromusic/mvp/presenter/ArtistDetailsPresenter.kt +++ b/app/src/main/java/code/name/monkey/retromusic/mvp/presenter/ArtistDetailsPresenter.kt @@ -14,15 +14,16 @@ package code.name.monkey.retromusic.mvp.presenter -import code.name.monkey.retromusic.Result.Error -import code.name.monkey.retromusic.Result.Success import code.name.monkey.retromusic.model.Artist import code.name.monkey.retromusic.mvp.BaseView import code.name.monkey.retromusic.mvp.Presenter import code.name.monkey.retromusic.mvp.PresenterImpl import code.name.monkey.retromusic.providers.interfaces.Repository import code.name.monkey.retromusic.rest.model.LastFmArtist -import kotlinx.coroutines.* +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.Job +import kotlinx.coroutines.launch import java.util.* import javax.inject.Inject import kotlin.coroutines.CoroutineContext @@ -60,19 +61,15 @@ interface ArtistDetailsPresenter : Presenter { override fun loadBiography(name: String, lang: String?, cache: String?) { launch { - when (val result = repository.artistInfo(name, lang, cache)) { - is Success -> withContext(Dispatchers.Main) { view?.artistInfo(result.data) } - is Error -> withContext(Dispatchers.Main) {} - } + val result = repository.artistInfo(name, lang, cache) + view?.artistInfo(result) } } override fun loadArtist(artistId: Int) { launch { - when (val result = repository.artistById(artistId)) { - is Success -> withContext(Dispatchers.Main) { view?.artist(result.data) } - is Error -> withContext(Dispatchers.Main) { view?.showEmptyView() } - } + val result = repository.artistById(artistId) + view?.artist(result) } } diff --git a/app/src/main/java/code/name/monkey/retromusic/mvp/presenter/ArtistPresenter.kt b/app/src/main/java/code/name/monkey/retromusic/mvp/presenter/ArtistPresenter.kt index 42a941da4..54a9481b2 100644 --- a/app/src/main/java/code/name/monkey/retromusic/mvp/presenter/ArtistPresenter.kt +++ b/app/src/main/java/code/name/monkey/retromusic/mvp/presenter/ArtistPresenter.kt @@ -14,14 +14,15 @@ package code.name.monkey.retromusic.mvp.presenter -import code.name.monkey.retromusic.Result.Error -import code.name.monkey.retromusic.Result.Success import code.name.monkey.retromusic.model.Artist import code.name.monkey.retromusic.mvp.BaseView import code.name.monkey.retromusic.mvp.Presenter import code.name.monkey.retromusic.mvp.PresenterImpl import code.name.monkey.retromusic.providers.interfaces.Repository -import kotlinx.coroutines.* +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.Job +import kotlinx.coroutines.launch import javax.inject.Inject import kotlin.coroutines.CoroutineContext @@ -49,10 +50,8 @@ interface ArtistsPresenter : Presenter { override fun loadArtists() { launch { - when (val result = repository.allArtists()) { - is Success -> withContext(Dispatchers.Main) { view?.artists(result.data) } - is Error -> withContext(Dispatchers.Main) { view?.showEmptyView() } - } + val result = repository.allArtists() + view?.artists(result) } } } diff --git a/app/src/main/java/code/name/monkey/retromusic/mvp/presenter/GenreDetailsPresenter.kt b/app/src/main/java/code/name/monkey/retromusic/mvp/presenter/GenreDetailsPresenter.kt index ed6641553..3db4517e6 100644 --- a/app/src/main/java/code/name/monkey/retromusic/mvp/presenter/GenreDetailsPresenter.kt +++ b/app/src/main/java/code/name/monkey/retromusic/mvp/presenter/GenreDetailsPresenter.kt @@ -14,14 +14,15 @@ package code.name.monkey.retromusic.mvp.presenter -import code.name.monkey.retromusic.Result.Error -import code.name.monkey.retromusic.Result.Success import code.name.monkey.retromusic.model.Song import code.name.monkey.retromusic.mvp.BaseView import code.name.monkey.retromusic.mvp.Presenter import code.name.monkey.retromusic.mvp.PresenterImpl import code.name.monkey.retromusic.providers.interfaces.Repository -import kotlinx.coroutines.* +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.Job +import kotlinx.coroutines.launch import javax.inject.Inject import kotlin.coroutines.CoroutineContext @@ -53,10 +54,8 @@ interface GenreDetailsPresenter : Presenter { override fun loadGenreSongs(genreId: Int) { launch { - when (val result = repository.getGenre(genreId)) { - is Success -> withContext(Dispatchers.Main) { view?.songs(result.data) } - is Error -> withContext(Dispatchers.Main) { view?.showEmptyView() } - } + val result = repository.getGenre(genreId) + view?.songs(result) } } } diff --git a/app/src/main/java/code/name/monkey/retromusic/mvp/presenter/GenrePresenter.kt b/app/src/main/java/code/name/monkey/retromusic/mvp/presenter/GenrePresenter.kt index 50f0722c8..f1908e435 100644 --- a/app/src/main/java/code/name/monkey/retromusic/mvp/presenter/GenrePresenter.kt +++ b/app/src/main/java/code/name/monkey/retromusic/mvp/presenter/GenrePresenter.kt @@ -14,14 +14,15 @@ package code.name.monkey.retromusic.mvp.presenter -import code.name.monkey.retromusic.Result.Error -import code.name.monkey.retromusic.Result.Success import code.name.monkey.retromusic.model.Genre import code.name.monkey.retromusic.mvp.BaseView import code.name.monkey.retromusic.mvp.Presenter import code.name.monkey.retromusic.mvp.PresenterImpl import code.name.monkey.retromusic.providers.interfaces.Repository -import kotlinx.coroutines.* +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.Job +import kotlinx.coroutines.launch import javax.inject.Inject import kotlin.coroutines.CoroutineContext @@ -52,10 +53,8 @@ interface GenresPresenter : Presenter { override fun loadGenres() { launch { - when (val result = repository.allGenres()) { - is Success -> withContext(Dispatchers.Main) { view?.genres(result.data) } - is Error -> withContext(Dispatchers.Main) { view?.showEmptyView() } - } + val result = repository.allGenres() + view?.genres(result) } } } diff --git a/app/src/main/java/code/name/monkey/retromusic/mvp/presenter/HomePresenter.kt b/app/src/main/java/code/name/monkey/retromusic/mvp/presenter/HomePresenter.kt index 1bdf66e92..8ea312d8a 100644 --- a/app/src/main/java/code/name/monkey/retromusic/mvp/presenter/HomePresenter.kt +++ b/app/src/main/java/code/name/monkey/retromusic/mvp/presenter/HomePresenter.kt @@ -14,7 +14,6 @@ package code.name.monkey.retromusic.mvp.presenter -import code.name.monkey.retromusic.Result import code.name.monkey.retromusic.model.Home import code.name.monkey.retromusic.mvp.BaseView import code.name.monkey.retromusic.mvp.Presenter @@ -56,9 +55,7 @@ interface HomePresenter : Presenter { repository.favoritePlaylist() ) for (r in recentArtistResult) { - when (r) { - is Result.Success -> list.add(r.data) - } + r?.let { list.add(it) } } withContext(Dispatchers.Main) { if (list.isNotEmpty()) view?.sections(list) else view?.showEmptyView() diff --git a/app/src/main/java/code/name/monkey/retromusic/mvp/presenter/PlaylistPresenter.kt b/app/src/main/java/code/name/monkey/retromusic/mvp/presenter/PlaylistPresenter.kt index dcd8d921b..ce1ab4568 100644 --- a/app/src/main/java/code/name/monkey/retromusic/mvp/presenter/PlaylistPresenter.kt +++ b/app/src/main/java/code/name/monkey/retromusic/mvp/presenter/PlaylistPresenter.kt @@ -14,13 +14,15 @@ package code.name.monkey.retromusic.mvp.presenter -import code.name.monkey.retromusic.Result import code.name.monkey.retromusic.model.Playlist import code.name.monkey.retromusic.mvp.BaseView import code.name.monkey.retromusic.mvp.Presenter import code.name.monkey.retromusic.mvp.PresenterImpl import code.name.monkey.retromusic.providers.interfaces.Repository -import kotlinx.coroutines.* +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.Job +import kotlinx.coroutines.launch import javax.inject.Inject import kotlin.coroutines.CoroutineContext @@ -53,10 +55,8 @@ interface PlaylistsPresenter : Presenter { override fun playlists() { launch { - when (val result = repository.allPlaylists()) { - is Result.Success -> withContext(Dispatchers.Main) { view?.playlists(result.data) } - is Result.Error -> withContext(Dispatchers.Main) { view?.showEmptyView() } - } + val result = repository.allPlaylists() + view?.playlists(result) } } } diff --git a/app/src/main/java/code/name/monkey/retromusic/mvp/presenter/PlaylistSongsPresenter.kt b/app/src/main/java/code/name/monkey/retromusic/mvp/presenter/PlaylistSongsPresenter.kt index d02bc52ab..494e0d66f 100644 --- a/app/src/main/java/code/name/monkey/retromusic/mvp/presenter/PlaylistSongsPresenter.kt +++ b/app/src/main/java/code/name/monkey/retromusic/mvp/presenter/PlaylistSongsPresenter.kt @@ -14,15 +14,16 @@ package code.name.monkey.retromusic.mvp.presenter -import code.name.monkey.retromusic.Result.Error -import code.name.monkey.retromusic.Result.Success import code.name.monkey.retromusic.model.Playlist import code.name.monkey.retromusic.model.Song import code.name.monkey.retromusic.mvp.BaseView import code.name.monkey.retromusic.mvp.Presenter import code.name.monkey.retromusic.mvp.PresenterImpl import code.name.monkey.retromusic.providers.interfaces.Repository -import kotlinx.coroutines.* +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.Job +import kotlinx.coroutines.launch import javax.inject.Inject import kotlin.coroutines.CoroutineContext @@ -48,10 +49,8 @@ interface PlaylistSongsPresenter : Presenter { override fun loadPlaylistSongs(playlist: Playlist) { launch { - when (val songs = repository.getPlaylistSongs(playlist)) { - is Success -> withContext(Dispatchers.Main) { view?.songs(songs.data) } - is Error -> withContext(Dispatchers.Main) { view?.showEmptyView() } - } + val songs = repository.getPlaylistSongs(playlist) + view?.songs(songs) } } diff --git a/app/src/main/java/code/name/monkey/retromusic/mvp/presenter/SearchPresenter.kt b/app/src/main/java/code/name/monkey/retromusic/mvp/presenter/SearchPresenter.kt index b371cb7b2..3c6441a3f 100644 --- a/app/src/main/java/code/name/monkey/retromusic/mvp/presenter/SearchPresenter.kt +++ b/app/src/main/java/code/name/monkey/retromusic/mvp/presenter/SearchPresenter.kt @@ -14,13 +14,14 @@ package code.name.monkey.retromusic.mvp.presenter -import code.name.monkey.retromusic.Result.Error -import code.name.monkey.retromusic.Result.Success import code.name.monkey.retromusic.mvp.BaseView import code.name.monkey.retromusic.mvp.Presenter import code.name.monkey.retromusic.mvp.PresenterImpl import code.name.monkey.retromusic.providers.interfaces.Repository -import kotlinx.coroutines.* +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.Job +import kotlinx.coroutines.launch import javax.inject.Inject import kotlin.coroutines.CoroutineContext @@ -53,10 +54,8 @@ interface SearchPresenter : Presenter { override fun search(query: String?) { launch { - when (val result = repository.search(query)) { - is Success -> withContext(Dispatchers.Main) { view?.showData(result.data) } - is Error -> withContext(Dispatchers.Main) { view?.showEmptyView() } - } + val result = repository.search(query) + view?.showData(result) } } } diff --git a/app/src/main/java/code/name/monkey/retromusic/mvp/presenter/SongPresenter.kt b/app/src/main/java/code/name/monkey/retromusic/mvp/presenter/SongPresenter.kt index ceb6b45c0..c837ca8d8 100644 --- a/app/src/main/java/code/name/monkey/retromusic/mvp/presenter/SongPresenter.kt +++ b/app/src/main/java/code/name/monkey/retromusic/mvp/presenter/SongPresenter.kt @@ -14,12 +14,14 @@ package code.name.monkey.retromusic.mvp.presenter -import code.name.monkey.retromusic.Result import code.name.monkey.retromusic.model.Song import code.name.monkey.retromusic.mvp.Presenter import code.name.monkey.retromusic.mvp.PresenterImpl import code.name.monkey.retromusic.providers.interfaces.Repository -import kotlinx.coroutines.* +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.Job +import kotlinx.coroutines.launch import javax.inject.Inject import kotlin.coroutines.CoroutineContext @@ -48,10 +50,8 @@ interface SongPresenter : Presenter { override fun loadSongs() { launch { - when (val songs = repository.allSongs()) { - is Result.Success -> withContext(Dispatchers.Main) { view?.songs(songs.data) } - is Result.Error -> withContext(Dispatchers.Main) { view?.showEmptyView() } - } + val songs = repository.allSongs() + view?.songs(songs) } } diff --git a/app/src/main/java/code/name/monkey/retromusic/preferences/BlacklistPreferenceDialog.kt b/app/src/main/java/code/name/monkey/retromusic/preferences/BlacklistPreferenceDialog.kt index ef8004226..e43b778db 100644 --- a/app/src/main/java/code/name/monkey/retromusic/preferences/BlacklistPreferenceDialog.kt +++ b/app/src/main/java/code/name/monkey/retromusic/preferences/BlacklistPreferenceDialog.kt @@ -16,7 +16,6 @@ package code.name.monkey.retromusic.preferences import android.app.Dialog import android.content.Context -import android.content.DialogInterface import android.os.Bundle import android.util.AttributeSet import androidx.core.graphics.BlendModeColorFilterCompat diff --git a/app/src/main/java/code/name/monkey/retromusic/preferences/MaterialListPreference.kt b/app/src/main/java/code/name/monkey/retromusic/preferences/MaterialListPreference.kt index a2f2ca6b7..75c7e83ce 100644 --- a/app/src/main/java/code/name/monkey/retromusic/preferences/MaterialListPreference.kt +++ b/app/src/main/java/code/name/monkey/retromusic/preferences/MaterialListPreference.kt @@ -23,13 +23,10 @@ import androidx.core.graphics.BlendModeColorFilterCompat import androidx.core.graphics.BlendModeCompat.SRC_IN import androidx.preference.ListPreference import androidx.preference.PreferenceDialogFragmentCompat -import code.name.monkey.appthemehelper.ThemeStore import code.name.monkey.retromusic.R import code.name.monkey.retromusic.extensions.colorControlNormal import com.afollestad.materialdialogs.MaterialDialog -import com.afollestad.materialdialogs.WhichButton -import com.afollestad.materialdialogs.actions.getActionButton -import com.afollestad.materialdialogs.list.listItemsSingleChoice +import com.google.android.material.dialog.MaterialAlertDialogBuilder class MaterialListPreference @JvmOverloads constructor( context: Context, @@ -72,30 +69,31 @@ class MaterialListPreferenceDialog : PreferenceDialogFragmentCompat() { val entries = arguments?.getStringArrayList(EXTRA_ENTRIES) val entriesValues = arguments?.getStringArrayList(EXTRA_ENTRIES_VALUES) val position: Int = arguments?.getInt(EXTRA_POSITION) ?: 0 - materialDialog = MaterialDialog(requireContext()) - .title(text = materialListPreference.title.toString()) - .positiveButton(R.string.set) - .listItemsSingleChoice( - items = entries, - initialSelection = position, - waitForPositiveButton = true - ) { _, index, _ -> - entriesValues?.let { - materialListPreference.callChangeListener(it[index]) - materialListPreference.setCustomValue(it[index]) - } - entries?.let { - materialListPreference.summary = it[index] - val value = materialListPreference.entryValues[index].toString() - if (materialListPreference.callChangeListener(value)) { - materialListPreference.value = value - } - } - dismiss() - } - materialDialog.getActionButton(WhichButton.POSITIVE) - .updateTextColor(ThemeStore.accentColor(requireContext())) - return materialDialog + /* materialDialog = MaterialDialog(requireContext()) + .title(text = materialListPreference.title.toString()) + .positiveButton(R.string.set) + .listItemsSingleChoice( + items = entries, + initialSelection = position, + waitForPositiveButton = true + ) { _, index, _ -> + entriesValues?.let { + materialListPreference.callChangeListener(it[index]) + materialListPreference.setCustomValue(it[index]) + } + entries?.let { + materialListPreference.summary = it[index] + val value = materialListPreference.entryValues[index].toString() + if (materialListPreference.callChangeListener(value)) { + materialListPreference.value = value + } + } + dismiss() + } + materialDialog.getActionButton(WhichButton.POSITIVE) + .updateTextColor(ThemeStore.accentColor(requireContext())) + return materialDialog*/ + return MaterialAlertDialogBuilder(requireContext()).create() } override fun onDestroyView() { diff --git a/app/src/main/java/code/name/monkey/retromusic/providers/RepositoryImpl.kt b/app/src/main/java/code/name/monkey/retromusic/providers/RepositoryImpl.kt index e54cd5d01..9f60056f7 100644 --- a/app/src/main/java/code/name/monkey/retromusic/providers/RepositoryImpl.kt +++ b/app/src/main/java/code/name/monkey/retromusic/providers/RepositoryImpl.kt @@ -16,9 +16,6 @@ package code.name.monkey.retromusic.providers import android.content.Context import code.name.monkey.retromusic.R -import code.name.monkey.retromusic.Result -import code.name.monkey.retromusic.Result.Error -import code.name.monkey.retromusic.Result.Success import code.name.monkey.retromusic.adapter.HomeAdapter import code.name.monkey.retromusic.loaders.* import code.name.monkey.retromusic.model.* @@ -26,268 +23,114 @@ import code.name.monkey.retromusic.providers.interfaces.Repository import code.name.monkey.retromusic.rest.LastFmClient import code.name.monkey.retromusic.rest.model.LastFmAlbum import code.name.monkey.retromusic.rest.model.LastFmArtist -import java.io.IOException import javax.inject.Inject class RepositoryImpl @Inject constructor(private val context: Context) : Repository { - override suspend fun allAlbums(): Result> { - return try { - val albums = AlbumLoader.getAllAlbums(context) - if (albums.isNotEmpty()) { - Success(albums) - } else { - Error(Throwable("No items found")) - } - } catch (e: Exception) { - Error(e) + override suspend fun allAlbums(): List = AlbumLoader.getAllAlbums(context) + + override suspend fun allArtists(): List = ArtistLoader.getAllArtists(context) + + override suspend fun allPlaylists(): List = PlaylistLoader.getAllPlaylists(context) + + override suspend fun allGenres(): List = GenreLoader.getAllGenres(context) + + override suspend fun allSongs(): List = SongLoader.getAllSongs(context) + + override suspend fun albumById(albumId: Int): Album = AlbumLoader.getAlbum(context, albumId) + + override suspend fun artistById(artistId: Int): Artist = + ArtistLoader.getArtist(context, artistId) + + override suspend fun search(query: String?): MutableList = + SearchLoader.searchAll(context, query) + + override suspend fun getPlaylistSongs(playlist: Playlist): ArrayList { + return if (playlist is AbsCustomPlaylist) { + playlist.getSongs(context) + } else { + PlaylistSongsLoader.getPlaylistSongList(context, playlist.id) } } - override suspend fun albumById(albumId: Int): Result { - return try { - val album = AlbumLoader.getAlbum(context, albumId) - if (album != null) { - Success(album) - } else { - Error(Throwable("No album")) - } - } catch (e: Exception) { - Error(e) - } + override suspend fun getGenre(genreId: Int): ArrayList = + GenreLoader.getSongs(context, genreId) + + override suspend fun recentArtists(): Home? { + val artists = LastAddedSongsLoader.getLastAddedArtists(context) + return if (artists.isNotEmpty()) Home( + 0, + R.string.recent_artists, + artists, + HomeAdapter.RECENT_ARTISTS, + R.drawable.ic_artist_white_24dp + ) else null } - override suspend fun allArtists(): Result> { - return try { - val artists = ArtistLoader.getAllArtists(context) - if (artists.isNotEmpty()) { - Success(artists) - } else { - Error(Throwable("No items found")) - } - } catch (e: Exception) { - Error(e) - } + override suspend fun recentAlbums(): Home? { + val albums = LastAddedSongsLoader.getLastAddedAlbums(context) + return if (albums.isNotEmpty()) { + Home( + 1, + R.string.recent_albums, + albums, + HomeAdapter.RECENT_ALBUMS, + R.drawable.ic_album_white_24dp + ) + } else null } - override suspend fun allPlaylists(): Result> { - return try { - val playlists = PlaylistLoader.getAllPlaylists(context) - if (playlists.isNotEmpty()) { - Success(playlists) - } else { - Error(Throwable("No items found")) - } - } catch (e: Exception) { - Error(e) - } + override suspend fun topAlbums(): Home? { + val albums = TopAndRecentlyPlayedTracksLoader.getTopAlbums(context) + return if (albums.isNotEmpty()) { + Home( + 3, + R.string.top_albums, + albums, + HomeAdapter.TOP_ALBUMS, + R.drawable.ic_album_white_24dp + ) + } else null } - override suspend fun allGenres(): Result> { - return try { - val genres = GenreLoader.getAllGenres(context) - if (genres.isNotEmpty()) { - Success(genres) - } else { - Error(Throwable("No items found")) - } - } catch (e: Exception) { - Error(e) - } + override suspend fun topArtists(): Home? { + + val artists = TopAndRecentlyPlayedTracksLoader.getTopArtists(context) + return if (artists.isNotEmpty()) { + Home( + 2, + R.string.top_artists, + artists, + HomeAdapter.TOP_ARTISTS, + R.drawable.ic_artist_white_24dp + ) + } else null + } - override suspend fun search(query: String?): Result> { - return try { - val result = SearchLoader.searchAll(context, query) - if (result.isNotEmpty()) { - Success(result) - } else { - Error(Throwable("No items found")) - } - } catch (e: Exception) { - Error(e) - } - } - - override suspend fun allSongs(): Result> { - return try { - val songs = SongLoader.getAllSongs(context) - if (songs.isEmpty()) { - Error(Throwable("No items found")) - } else { - Success(songs) - } - } catch (e: Exception) { - Error(e) - } - } - - override suspend fun getPlaylistSongs(playlist: Playlist): Result> { - return try { - val songs: ArrayList = if (playlist is AbsCustomPlaylist) { - playlist.getSongs(context) - } else { - PlaylistSongsLoader.getPlaylistSongList(context, playlist.id) - } - Success(songs) - } catch (e: Exception) { - Error(e) - } - } - - override suspend fun getGenre(genreId: Int): Result> { - return try { - val songs = GenreLoader.getSongs(context, genreId) - if (songs.isEmpty()) { - Error(Throwable("No items found")) - } else { - Success(songs) - } - } catch (e: Exception) { - Error(e) - } - } - - override suspend fun recentArtists(): Result { - return try { - val artists = LastAddedSongsLoader.getLastAddedArtists(context) - if (artists.isEmpty()) { - Error(Throwable("No items found")) - } else { - Success( - Home( - 0, - R.string.recent_artists, - artists, - HomeAdapter.RECENT_ARTISTS, - R.drawable.ic_artist_white_24dp - ) - ) - } - } catch (e: Exception) { - Error(e) - } - } - - override suspend fun recentAlbums(): Result { - return try { - val albums = LastAddedSongsLoader.getLastAddedAlbums(context) - if (albums.isEmpty()) { - Error(Throwable("No items found")) - } else { - Success( - Home( - 1, - R.string.recent_albums, - albums, - HomeAdapter.RECENT_ALBUMS, - R.drawable.ic_album_white_24dp - ) - ) - } - } catch (e: Exception) { - Error(e) - } - } - - override suspend fun topAlbums(): Result { - return try { - val albums = TopAndRecentlyPlayedTracksLoader.getTopAlbums(context) - if (albums.isEmpty()) { - Error(Throwable("No items found")) - } else { - Success( - Home( - 3, - R.string.top_albums, - albums, - HomeAdapter.TOP_ALBUMS, - R.drawable.ic_album_white_24dp - ) - ) - } - } catch (e: Exception) { - Error(e) - } - } - - override suspend fun topArtists(): Result { - return try { - val artists = TopAndRecentlyPlayedTracksLoader.getTopArtists(context) - if (artists.isEmpty()) { - Error(Throwable("No items found")) - } else { - Success( - Home( - 2, - R.string.top_artists, - artists, - HomeAdapter.TOP_ARTISTS, - R.drawable.ic_artist_white_24dp - ) - ) - } - } catch (e: Exception) { - Error(e) - } - } - - override suspend fun favoritePlaylist(): Result { - return try { - val playlists = PlaylistLoader.getFavoritePlaylist(context) - if (playlists.isEmpty()) { - Error(Throwable("No items found")) - } else { - Success( - Home( - 4, - R.string.favorites, - playlists, - HomeAdapter.PLAYLISTS, - R.drawable.ic_favorite_white_24dp - ) - ) - } - } catch (e: Exception) { - Error(e) - } + override suspend fun favoritePlaylist(): Home? { + val playlists = PlaylistLoader.getFavoritePlaylist(context) + return if (playlists.isNotEmpty()) { + Home( + 4, + R.string.favorites, + playlists, + HomeAdapter.PLAYLISTS, + R.drawable.ic_favorite_white_24dp + ) + } else null } override suspend fun artistInfo( name: String, lang: String?, cache: String? - ): Result = safeApiCall( - call = { - Success(LastFmClient.getApiService().artistInfo(name, lang, cache)) - }, - errorMessage = "Error" + ): LastFmArtist = LastFmClient.getApiService().artistInfo(name, lang, cache) - ) override suspend fun albumInfo( artist: String, album: String - ): Result = safeApiCall( - call = { - Success(LastFmClient.getApiService().albumInfo(artist, album)) - }, - errorMessage = "Error" - ) + ): LastFmAlbum = LastFmClient.getApiService().albumInfo(artist, album) - override suspend fun artistById(artistId: Int): Result { - return try { - val artist = ArtistLoader.getArtist(context, artistId) - return Success(artist) - } catch (e: Exception) { - Error(Throwable("Error loading artist")) - } - } -} - -suspend fun safeApiCall(call: suspend () -> Result, errorMessage: String): Result = - try { - call.invoke() - } catch (e: Exception) { - Error(IOException(errorMessage, e)) - } \ No newline at end of file +} \ No newline at end of file diff --git a/app/src/main/java/code/name/monkey/retromusic/providers/interfaces/Repository.kt b/app/src/main/java/code/name/monkey/retromusic/providers/interfaces/Repository.kt index a3e9f4d80..a3b613419 100644 --- a/app/src/main/java/code/name/monkey/retromusic/providers/interfaces/Repository.kt +++ b/app/src/main/java/code/name/monkey/retromusic/providers/interfaces/Repository.kt @@ -14,7 +14,6 @@ package code.name.monkey.retromusic.providers.interfaces -import code.name.monkey.retromusic.Result import code.name.monkey.retromusic.model.* import code.name.monkey.retromusic.rest.model.LastFmAlbum import code.name.monkey.retromusic.rest.model.LastFmArtist @@ -25,37 +24,37 @@ import code.name.monkey.retromusic.rest.model.LastFmArtist interface Repository { - suspend fun allAlbums(): Result> + suspend fun allAlbums(): List - suspend fun albumById(albumId: Int): Result + suspend fun albumById(albumId: Int): Album - suspend fun allSongs(): Result> + suspend fun allSongs(): List - suspend fun allArtists(): Result> + suspend fun allArtists(): List - suspend fun allPlaylists(): Result> + suspend fun allPlaylists(): List - suspend fun allGenres(): Result> + suspend fun allGenres(): List - suspend fun search(query: String?): Result> + suspend fun search(query: String?): MutableList - suspend fun getPlaylistSongs(playlist: Playlist): Result> + suspend fun getPlaylistSongs(playlist: Playlist): ArrayList - suspend fun getGenre(genreId: Int): Result> + suspend fun getGenre(genreId: Int): ArrayList - suspend fun recentArtists(): Result + suspend fun recentArtists(): Home? - suspend fun topArtists(): Result + suspend fun topArtists(): Home? - suspend fun topAlbums(): Result + suspend fun topAlbums(): Home? - suspend fun recentAlbums(): Result + suspend fun recentAlbums(): Home? - suspend fun favoritePlaylist(): Result + suspend fun favoritePlaylist(): Home? - suspend fun artistInfo(name: String, lang: String?, cache: String?): Result + suspend fun artistInfo(name: String, lang: String?, cache: String?): LastFmArtist - suspend fun albumInfo(artist: String, album: String): Result + suspend fun albumInfo(artist: String, album: String): LastFmAlbum - suspend fun artistById(artistId: Int): Result + suspend fun artistById(artistId: Int): Artist } \ No newline at end of file diff --git a/app/src/main/java/code/name/monkey/retromusic/util/AppRater.kt b/app/src/main/java/code/name/monkey/retromusic/util/AppRater.kt index 4c31a4a4f..3f06af688 100644 --- a/app/src/main/java/code/name/monkey/retromusic/util/AppRater.kt +++ b/app/src/main/java/code/name/monkey/retromusic/util/AppRater.kt @@ -17,12 +17,9 @@ package code.name.monkey.retromusic.util import android.content.Context import android.content.Intent import android.content.SharedPreferences -import android.graphics.Color import android.net.Uri import code.name.monkey.retromusic.R -import com.afollestad.materialdialogs.MaterialDialog -import com.afollestad.materialdialogs.WhichButton -import com.afollestad.materialdialogs.actions.getActionButton +import com.google.android.material.dialog.MaterialAlertDialogBuilder object AppRater { private const val DO_NOT_SHOW_AGAIN = "do_not_show_again"// Package Name @@ -64,30 +61,24 @@ object AppRater { } private fun showRateDialog(context: Context, editor: SharedPreferences.Editor) { - MaterialDialog(context) - .show { - title(text = "Rate this App") - message(text = "If you enjoy using Retro Music, please take a moment to rate it. Thanks for your support!") - positiveButton(R.string.app_name) { - context.startActivity( - Intent( - Intent.ACTION_VIEW, - Uri.parse("market://details?id=${context.packageName}") - ) + MaterialAlertDialogBuilder(context) + .setTitle("Rate this App") + .setMessage("If you enjoy using Retro Music, please take a moment to rate it. Thanks for your support!") + .setPositiveButton(R.string.app_name) { _, _ -> + context.startActivity( + Intent( + Intent.ACTION_VIEW, + Uri.parse("market://details?id=${context.packageName}") ) - editor.putBoolean(DO_NOT_SHOW_AGAIN, true) - editor.commit() - dismiss() - } - negativeButton(text = "Later") { - dismiss() - } - neutralButton(text = " No thanks") { - editor.putBoolean(DO_NOT_SHOW_AGAIN, true) - editor.commit() - dismiss() - } - getActionButton(WhichButton.POSITIVE).updateTextColor(Color.RED) + ) + editor.putBoolean(DO_NOT_SHOW_AGAIN, true) + editor.commit() } + .setNeutralButton("Not now", null) + .setNegativeButton("No thanks") { _, _ -> + editor.putBoolean(DO_NOT_SHOW_AGAIN, true) + editor.commit() + } + .show() } } \ No newline at end of file diff --git a/app/src/main/java/code/name/monkey/retromusic/util/NavigationUtil.java b/app/src/main/java/code/name/monkey/retromusic/util/NavigationUtil.java index 416d194f5..eb32f35b5 100755 --- a/app/src/main/java/code/name/monkey/retromusic/util/NavigationUtil.java +++ b/app/src/main/java/code/name/monkey/retromusic/util/NavigationUtil.java @@ -29,7 +29,7 @@ import org.jetbrains.annotations.NotNull; import code.name.monkey.retromusic.R; import code.name.monkey.retromusic.activities.AboutActivity; -import code.name.monkey.retromusic.activities.AlbumDetailsActivity; +import code.name.monkey.retromusic.activities.albums.AlbumDetailsActivity; import code.name.monkey.retromusic.activities.ArtistDetailActivity; import code.name.monkey.retromusic.activities.DriveModeActivity; import code.name.monkey.retromusic.activities.GenreDetailsActivity; diff --git a/app/src/main/java/code/name/monkey/retromusic/util/RingtoneManager.kt b/app/src/main/java/code/name/monkey/retromusic/util/RingtoneManager.kt index 6d99d0bb0..00052977a 100644 --- a/app/src/main/java/code/name/monkey/retromusic/util/RingtoneManager.kt +++ b/app/src/main/java/code/name/monkey/retromusic/util/RingtoneManager.kt @@ -23,10 +23,11 @@ import android.provider.BaseColumns import android.provider.MediaStore import android.provider.Settings import android.widget.Toast +import androidx.appcompat.app.AlertDialog import code.name.monkey.retromusic.R import code.name.monkey.retromusic.model.Song import code.name.monkey.retromusic.util.MusicUtil.getSongFileUri -import com.afollestad.materialdialogs.MaterialDialog +import com.google.android.material.dialog.MaterialAlertDialogBuilder class RingtoneManager(val context: Context) { fun setRingtone(song: Song) { @@ -72,17 +73,17 @@ class RingtoneManager(val context: Context) { return false } - fun getDialog(context: Context): MaterialDialog { - return MaterialDialog(context).show { - title(R.string.dialog_title_set_ringtone) - message(R.string.dialog_message_set_ringtone) - positiveButton(android.R.string.ok) { + fun getDialog(context: Context): AlertDialog { + return MaterialAlertDialogBuilder(context) + .setTitle(R.string.dialog_title_set_ringtone) + .setMessage(R.string.dialog_message_set_ringtone) + .setPositiveButton(android.R.string.ok) { _, _ -> val intent = Intent(Settings.ACTION_MANAGE_WRITE_SETTINGS) intent.data = Uri.parse("package:" + context.applicationContext.packageName) context.startActivity(intent) } - negativeButton(android.R.string.cancel) - } + .setNegativeButton(android.R.string.cancel, null) + .create() } } } \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_guitar_acoustic_white_24dp.xml b/app/src/main/res/drawable/ic_guitar_acoustic_white_24dp.xml deleted file mode 100644 index ee5d963b3..000000000 --- a/app/src/main/res/drawable/ic_guitar_acoustic_white_24dp.xml +++ /dev/null @@ -1,17 +0,0 @@ - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_guitar_white_24dp.xml b/app/src/main/res/drawable/ic_guitar_white_24dp.xml index 78369f653..7e0174a5c 100644 --- a/app/src/main/res/drawable/ic_guitar_white_24dp.xml +++ b/app/src/main/res/drawable/ic_guitar_white_24dp.xml @@ -15,13 +15,10 @@ + android:viewportWidth="24" + android:viewportHeight="24"> - + android:pathData="M19.59,3H22V5H20.41L16.17,9.24C15.8,8.68 15.32,8.2 14.76,7.83L19.59,3M12,8A4,4 0 0,1 16,12C16,13.82 14.77,15.42 13,15.87V16A5,5 0 0,1 8,21A5,5 0 0,1 3,16A5,5 0 0,1 8,11H8.13C8.58,9.24 10.17,8 12,8M12,10.5A1.5,1.5 0 0,0 10.5,12A1.5,1.5 0 0,0 12,13.5A1.5,1.5 0 0,0 13.5,12A1.5,1.5 0 0,0 12,10.5M6.94,14.24L6.23,14.94L9.06,17.77L9.77,17.06L6.94,14.24Z" /> \ No newline at end of file diff --git a/app/src/main/res/layout-land/activity_album.xml b/app/src/main/res/layout-land/activity_album.xml index da7fd961a..7402e4522 100644 --- a/app/src/main/res/layout-land/activity_album.xml +++ b/app/src/main/res/layout-land/activity_album.xml @@ -48,7 +48,7 @@ android:layout_marginEnd="16dp" android:transitionName="@string/transition_album_art" app:cardCornerRadius="24dp" - app:cardElevation="8dp" + app:cardElevation="0dp" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toStartOf="@+id/container" app:layout_constraintHorizontal_bias="0.5" diff --git a/app/src/main/res/layout-land/activity_artist_details.xml b/app/src/main/res/layout-land/activity_artist_details.xml index ff340527e..3f62c2eef 100644 --- a/app/src/main/res/layout-land/activity_artist_details.xml +++ b/app/src/main/res/layout-land/activity_artist_details.xml @@ -48,7 +48,7 @@ android:layout_marginEnd="16dp" android:transitionName="@string/transition_artist_image" app:cardCornerRadius="24dp" - app:cardElevation="8dp" + app:cardElevation="0dp" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toStartOf="@+id/container" app:layout_constraintHorizontal_bias="0.5" diff --git a/app/src/main/res/layout-land/pager_item.xml b/app/src/main/res/layout-land/pager_item.xml index 02c76dd95..9dac9266c 100644 --- a/app/src/main/res/layout-land/pager_item.xml +++ b/app/src/main/res/layout-land/pager_item.xml @@ -13,7 +13,8 @@ android:layout_width="match_parent" android:layout_height="156dp" android:layout_margin="8dp" - app:cardCornerRadius="16dp"> + app:cardCornerRadius="16dp" + app:cardElevation="0dp"> + app:cardCornerRadius="16dp" + app:cardElevation="0dp"> diff --git a/app/src/main/res/layout/activity_album.xml b/app/src/main/res/layout/activity_album.xml index d15929a7d..cacb70676 100755 --- a/app/src/main/res/layout/activity_album.xml +++ b/app/src/main/res/layout/activity_album.xml @@ -64,7 +64,7 @@ android:layout_marginEnd="16dp" android:transitionName="@string/transition_album_art" app:cardCornerRadius="24dp" - app:cardElevation="8dp" + app:cardElevation="0dp" app:layout_constraintDimensionRatio="1:1" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" diff --git a/app/src/main/res/layout/activity_artist_details.xml b/app/src/main/res/layout/activity_artist_details.xml index 72edc1233..fdbad70ce 100755 --- a/app/src/main/res/layout/activity_artist_details.xml +++ b/app/src/main/res/layout/activity_artist_details.xml @@ -63,7 +63,7 @@ android:layout_marginEnd="16dp" android:transitionName="@string/transition_artist_image" app:cardCornerRadius="24dp" - app:cardElevation="8dp" + app:cardElevation="0dp" app:layout_constraintDimensionRatio="1:1" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" @@ -74,7 +74,7 @@ android:layout_width="match_parent" android:layout_height="match_parent" android:scaleType="centerCrop" - tools:srcCompat="@tools:sample/backgrounds/scenic[16]" /> + tools:srcCompat="@tools:sample/backgrounds/scenic" /> @@ -94,7 +94,7 @@ app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@id/artistCoverContainer" tools:ignore="MissingPrefix" - tools:text="Title" /> + tools:text="@tools:sample/full_names" /> + tools:text="@tools:sample/full_names" /> + android:layout_margin="4dp" + app:cardCornerRadius="@dimen/about_card_radius"> - + app:layout_constraintTop_toBottomOf="@+id/sb1" + tools:itemCount="3" + tools:listitem="@layout/item_contributor" /> \ No newline at end of file diff --git a/app/src/main/res/layout/card_other.xml b/app/src/main/res/layout/card_other.xml index b21e81d70..2900a941a 100644 --- a/app/src/main/res/layout/card_other.xml +++ b/app/src/main/res/layout/card_other.xml @@ -3,8 +3,8 @@ xmlns:app="http://schemas.android.com/apk/res-auto" android:layout_width="match_parent" android:layout_height="wrap_content" - app:cardCornerRadius="@dimen/about_card_radius" - app:cardUseCompatPadding="true"> + android:layout_margin="4dp" + app:cardCornerRadius="@dimen/about_card_radius"> + android:layout_margin="4dp" + app:cardCornerRadius="@dimen/about_card_radius"> - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/layout/item_album_card.xml b/app/src/main/res/layout/item_album_card.xml index 6259691ba..12bf7fbc9 100644 --- a/app/src/main/res/layout/item_album_card.xml +++ b/app/src/main/res/layout/item_album_card.xml @@ -12,8 +12,8 @@ android:layout_width="112dp" android:layout_height="156dp" android:layout_margin="8dp" - app:cardCornerRadius="8dp" - app:cardElevation="4dp" + app:cardCornerRadius="12dp" + app:cardElevation="0dp" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent"> @@ -41,5 +41,5 @@ app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@+id/imageContainer" tools:ignore="MissingPrefix" - tools:text="@tools:sample/lorem/random" /> + tools:text="@tools:sample/full_names" /> \ No newline at end of file diff --git a/app/src/main/res/layout/item_artist_card.xml b/app/src/main/res/layout/item_artist_card.xml index f0558b04b..69d61f442 100644 --- a/app/src/main/res/layout/item_artist_card.xml +++ b/app/src/main/res/layout/item_artist_card.xml @@ -17,7 +17,8 @@ android:layout_width="128dp" android:layout_height="128dp" android:layout_margin="4dp" - app:cardCornerRadius="16dp"> + app:cardCornerRadius="16dp" + app:cardElevation="0dp"> + app:cardElevation="0dp"> + tools:srcCompat="@tools:sample/backgrounds/scenic" /> + tools:text="@tools:sample/lorem/random" /> \ No newline at end of file diff --git a/app/src/main/res/layout/item_donation_option.xml b/app/src/main/res/layout/item_donation_option.xml index d85ce0543..6d17dd960 100644 --- a/app/src/main/res/layout/item_donation_option.xml +++ b/app/src/main/res/layout/item_donation_option.xml @@ -10,6 +10,7 @@ android:layout_height="wrap_content" android:layout_margin="4dp" app:cardCornerRadius="8dp" + app:cardElevation="0dp" app:contentPadding="12dp"> + app:cardCornerRadius="6dp" + app:cardElevation="0dp"> @@ -63,11 +64,11 @@ android:ellipsize="end" android:maxLines="1" android:paddingStart="16dp" - app:layout_constraintStart_toStartOf="parent" android:paddingEnd="8dp" android:textAppearance="@style/TextViewSubtitle1" android:textStyle="bold" app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@id/text" tools:ignore="MissingPrefix" tools:text="@tools:sample/full_names" /> diff --git a/app/src/main/res/layout/preference_category_title.xml b/app/src/main/res/layout/preference_category_title.xml index 4a7563f71..cdbefb6fb 100644 --- a/app/src/main/res/layout/preference_category_title.xml +++ b/app/src/main/res/layout/preference_category_title.xml @@ -25,5 +25,5 @@ android:paddingTop="16dp" android:paddingEnd="16dp" android:textAppearance="@style/TextViewOverline" - tools:text="@string/about_settings_summary" /> + tools:text="@tools:sample/full_names" /> \ No newline at end of file diff --git a/app/src/main/res/values-v27/styles_parents.xml b/app/src/main/res/values-v27/styles_parents.xml index a6fca6f59..ca42d0971 100644 --- a/app/src/main/res/values-v27/styles_parents.xml +++ b/app/src/main/res/values-v27/styles_parents.xml @@ -32,7 +32,6 @@ - @@ -192,6 +192,7 @@ @font/google_san + diff --git a/app/src/main/res/xml/pref_advanced.xml b/app/src/main/res/xml/pref_advanced.xml index 490cc5f17..643cbcefc 100755 --- a/app/src/main/res/xml/pref_advanced.xml +++ b/app/src/main/res/xml/pref_advanced.xml @@ -70,7 +70,7 @@ app:showSeekBarValue="true" /> - - diff --git a/app/src/main/res/xml/pref_images.xml b/app/src/main/res/xml/pref_images.xml index b2dc9d11f..0ed214643 100755 --- a/app/src/main/res/xml/pref_images.xml +++ b/app/src/main/res/xml/pref_images.xml @@ -10,7 +10,7 @@ android:title="@string/pref_title_ignore_media_store_artwork" app:icon="@drawable/ic_image_white_24dp" /> - - - - { - mClickedDialogEntryIndex = i; + builder.setSingleChoiceItems(preference.getEntries(), mClickedDialogEntryIndex, (dialog, which) -> { + mClickedDialogEntryIndex = which; + onClick(dialog, which); + dismiss(); }); - builder.setPositiveButton("Ok", null); - builder.setNegativeButton("", null); - builder.setNeutralButton("", null); + /* + * The typical interaction for list-based dialogs is to have + * click-on-an-item dismiss the dialog instead of the user having to + * press 'Ok'. + */ + builder.setPositiveButton(null, null); + builder.setNegativeButton(null, null); + builder.setNeutralButton(null, null); } @Override public void onDialogClosed(boolean positiveResult) { final ListPreference preference = getListPreference(); + Log.i(TAG, "onDialogClosed: " + positiveResult); if (positiveResult && mClickedDialogEntryIndex >= 0 && preference.getEntryValues() != null) { String value = preference.getEntryValues()[mClickedDialogEntryIndex].toString(); + Log.i(TAG, "onDialogClosed: value " + value); if (preference.callChangeListener(value)) { preference.setValue(value); + Log.i(TAG, "onDialogClosed: set value "); } } } + + @Override + public void onClick(DialogInterface dialog, int which) { + Log.i(TAG, "onClick: " + which); + mClickedDialogEntryIndex = which; + super.onClick(dialog, DialogInterface.BUTTON_POSITIVE); + } } \ No newline at end of file diff --git a/appthemehelper/src/main/java/code/name/monkey/appthemehelper/common/prefs/supportv7/dialogs/ATEPreferenceDialogFragment.java b/appthemehelper/src/main/java/code/name/monkey/appthemehelper/common/prefs/supportv7/dialogs/ATEPreferenceDialogFragment.java index 2f886215f..2fb36a80c 100644 --- a/appthemehelper/src/main/java/code/name/monkey/appthemehelper/common/prefs/supportv7/dialogs/ATEPreferenceDialogFragment.java +++ b/appthemehelper/src/main/java/code/name/monkey/appthemehelper/common/prefs/supportv7/dialogs/ATEPreferenceDialogFragment.java @@ -14,16 +14,17 @@ package code.name.monkey.appthemehelper.common.prefs.supportv7.dialogs; - import android.app.Dialog; +import android.content.DialogInterface; import android.os.Bundle; +import android.util.Log; import android.view.Window; import androidx.annotation.NonNull; -import androidx.annotation.Nullable; import androidx.appcompat.app.AlertDialog; import androidx.fragment.app.DialogFragment; import androidx.fragment.app.Fragment; +import androidx.fragment.app.FragmentActivity; import androidx.preference.DialogPreference; import com.google.android.material.dialog.MaterialAlertDialogBuilder; @@ -33,10 +34,10 @@ import code.name.monkey.appthemehelper.R; /** * @author Karim Abou Zeid (kabouzeid) */ -public class ATEPreferenceDialogFragment extends DialogFragment { - - static final String ARG_KEY = "key"; - +public class ATEPreferenceDialogFragment extends DialogFragment implements DialogInterface.OnClickListener { + protected static final String ARG_KEY = "key"; + private static final String TAG = "ATEPreferenceDialog"; + private int mWhichButtonClicked; private DialogPreference mPreference; public static ATEPreferenceDialogFragment newInstance(String key) { @@ -59,34 +60,27 @@ public class ATEPreferenceDialogFragment extends DialogFragment { } } - public DialogPreference getPreference() { - return this.mPreference; - } - @NonNull - public Dialog onCreateDialog(@Nullable Bundle savedInstanceState) { - MaterialAlertDialogBuilder materialDialog = new MaterialAlertDialogBuilder(requireActivity(), + public Dialog onCreateDialog(Bundle savedInstanceState) { + FragmentActivity context = this.getActivity(); + MaterialAlertDialogBuilder builder = new MaterialAlertDialogBuilder(context, R.style.ThemeOverlay_MaterialComponents_Dialog_Alert) - .setTitle(mPreference.getTitle()) - .setIcon(mPreference.getIcon()) - .setMessage(mPreference.getDialogMessage()) - .setPositiveButton(mPreference.getPositiveButtonText(), (dialogInterface, i) -> { - onDialogClosed(true); - }) - .setNegativeButton(mPreference.getNegativeButtonText(), (dialogInterface, i) -> { - onDialogClosed(false); - }); + .setTitle(this.mPreference.getDialogTitle()) + .setIcon(this.mPreference.getDialogIcon()) + .setMessage(this.mPreference.getDialogMessage()) + .setPositiveButton(this.mPreference.getPositiveButtonText(), this) + .setNegativeButton(this.mPreference.getNegativeButtonText(), this); - //this.onPrepareDialogBuilder(materialDialog); - AlertDialog dialog = materialDialog.create(); + this.onPrepareDialogBuilder(builder); + AlertDialog dialog = builder.create(); if (this.needInputMethod()) { this.requestInputMethod(dialog); } return dialog; } - public void onDialogClosed(boolean positiveResult) { - + public DialogPreference getPreference() { + return this.mPreference; } protected void onPrepareDialogBuilder(MaterialAlertDialogBuilder builder) { @@ -100,4 +94,22 @@ public class ATEPreferenceDialogFragment extends DialogFragment { Window window = dialog.getWindow(); window.setSoftInputMode(5); } + + @Override + public void onDismiss(DialogInterface dialog) { + super.onDismiss(dialog); + Log.i(TAG, "onDismiss: " + mWhichButtonClicked); + onDialogClosed(mWhichButtonClicked == DialogInterface.BUTTON_POSITIVE); + } + + public void onDialogClosed(boolean positiveResult) { + + } + + @Override + public void onClick(DialogInterface dialog, int which) { + Log.i(TAG, "onClick: " + which); + mWhichButtonClicked = which; + onDialogClosed(which == DialogInterface.BUTTON_POSITIVE); + } } \ No newline at end of file diff --git a/appthemehelper/src/main/java/code/name/monkey/appthemehelper/util/MaterialDialogsUtil.kt b/appthemehelper/src/main/java/code/name/monkey/appthemehelper/util/MaterialDialogsUtil.kt new file mode 100644 index 000000000..5d2f38816 --- /dev/null +++ b/appthemehelper/src/main/java/code/name/monkey/appthemehelper/util/MaterialDialogsUtil.kt @@ -0,0 +1,25 @@ +package code.name.monkey.appthemehelper.util + +import android.content.Context +import android.content.res.ColorStateList +import code.name.monkey.appthemehelper.ThemeStore +import code.name.monkey.appthemehelper.util.ATHUtil.isWindowBackgroundDark +import com.afollestad.materialdialogs.internal.ThemeSingleton + +/** + * @author Karim Abou Zeid (kabouzeid) + */ +object MaterialDialogsUtil { + fun updateMaterialDialogsThemeSingleton(context: Context) { + val md = ThemeSingleton.get() + md.titleColor = ThemeStore.textColorPrimary(context) + md.contentColor = ThemeStore.textColorSecondary(context) + md.itemColor = md.titleColor + md.widgetColor = ThemeStore.accentColor(context) + md.linkColor = ColorStateList.valueOf(md.widgetColor) + md.positiveColor = ColorStateList.valueOf(md.widgetColor) + md.neutralColor = ColorStateList.valueOf(md.widgetColor) + md.negativeColor = ColorStateList.valueOf(md.widgetColor) + md.darkTheme = isWindowBackgroundDark(context) + } +} \ No newline at end of file diff --git a/appthemehelper/src/main/java/code/name/monkey/appthemehelper/util/MaterialUtil.kt b/appthemehelper/src/main/java/code/name/monkey/appthemehelper/util/MaterialUtil.kt index 388e3e376..4eca6ea19 100644 --- a/appthemehelper/src/main/java/code/name/monkey/appthemehelper/util/MaterialUtil.kt +++ b/appthemehelper/src/main/java/code/name/monkey/appthemehelper/util/MaterialUtil.kt @@ -1,9 +1,7 @@ package code.name.monkey.appthemehelper.util import android.content.res.ColorStateList -import androidx.appcompat.widget.AppCompatButton import code.name.monkey.appthemehelper.ThemeStore -import com.afollestad.materialdialogs.internal.button.DialogActionButton import com.google.android.material.button.MaterialButton import com.google.android.material.textfield.TextInputLayout @@ -54,30 +52,4 @@ object MaterialUtil { textInputLayout.isHintAnimationEnabled = true } } - - @JvmOverloads - @JvmStatic - fun setTint( - button: DialogActionButton, - color: Int = ThemeStore.accentColor(button.context), - background: Boolean = true - ) { - val temp = button as AppCompatButton - val context = temp.context - val colorState = ColorStateList.valueOf(color) - val textColor = - ColorStateList.valueOf( - MaterialValueHelper.getPrimaryTextColor( - context, - ColorUtil.isColorLight(color) - ) - ) - - if (background) { - temp.backgroundTintList = colorState - temp.setTextColor(textColor) - } else { - temp.setTextColor(colorState) - } - } }