diff --git a/app/build.gradle b/app/build.gradle index 4d8768b4..75e60e61 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -117,7 +117,7 @@ static def getDate() { dependencies { implementation fileTree(include: ['*.jar'], dir: 'libs') - implementation 'androidx.multidex:multidex:2.0.0' + implementation 'androidx.multidex:multidex:2.0.1' implementation "androidx.fragment:fragment:$supportLibVersion" implementation "androidx.appcompat:appcompat:1.0.2" implementation "androidx.recyclerview:recyclerview:$supportLibVersion" diff --git a/app/src/main/ic_launcher-web.png b/app/src/main/ic_launcher-web.png index 084d18d3..a148c696 100644 Binary files a/app/src/main/ic_launcher-web.png and b/app/src/main/ic_launcher-web.png differ diff --git a/app/src/main/java/code/name/monkey/retromusic/helper/MusicPlayerRemote.kt b/app/src/main/java/code/name/monkey/retromusic/helper/MusicPlayerRemote.kt index 07b28fd2..2ef65467 100644 --- a/app/src/main/java/code/name/monkey/retromusic/helper/MusicPlayerRemote.kt +++ b/app/src/main/java/code/name/monkey/retromusic/helper/MusicPlayerRemote.kt @@ -3,6 +3,7 @@ package code.name.monkey.retromusic.helper import android.annotation.TargetApi import android.app.Activity import android.content.* +import android.database.Cursor import android.net.Uri import android.os.Build import android.os.Environment @@ -116,15 +117,19 @@ object MusicPlayerRemote { val column = "_data" val projection = arrayOf(column) + var cursor: Cursor? = null try { - context.contentResolver.query(uri, projection, null, null, null)!!.use { cursor -> - if (cursor.moveToFirst()) { - val column_index = cursor.getColumnIndexOrThrow(column) - return cursor.getString(column_index) + cursor = context.contentResolver.query(uri, projection, null, null, null) + cursor.use { it -> + if (it.moveToFirst()) { + val columnIndex = it.getColumnIndexOrThrow(column) + return it.getString(columnIndex) } } } catch (e: Exception) { Log.e(TAG, e.message) + } finally { + cursor!!.close() } return null @@ -398,13 +403,6 @@ object MusicPlayerRemote { return DocumentsContract.getDocumentId(uri).split(":".toRegex()).dropLastWhile { it.isEmpty() }.toTypedArray()[1] } - internal annotation class PlaybackLocation { - companion object { - val REMOTE = 0 - val LOCAL = 1 - } - } - class ServiceBinder internal constructor(private val mCallback: ServiceConnection?) : ServiceConnection { override fun onServiceConnected(className: ComponentName, service: IBinder) { diff --git a/app/src/main/java/code/name/monkey/retromusic/model/Home.java b/app/src/main/java/code/name/monkey/retromusic/model/Home.java new file mode 100644 index 00000000..6e217343 --- /dev/null +++ b/app/src/main/java/code/name/monkey/retromusic/model/Home.java @@ -0,0 +1,44 @@ +package code.name.monkey.retromusic.model; + +import androidx.annotation.StringRes; + +import java.util.ArrayList; + +import code.name.monkey.retromusic.ui.adapter.HomeAdapter.Companion.HomeSection; + +public class Home { + @StringRes + int title; + @StringRes + int subtitle; + @HomeSection + int homeSection; + + ArrayList arrayList; + + public Home(int title, int subtitle, ArrayList arrayList, @HomeSection int homeSection) { + this.title = title; + this.subtitle = subtitle; + this.arrayList = arrayList; + this.homeSection = homeSection; + } + + @HomeSection + public int getHomeSection() { + return homeSection; + } + + @StringRes + public int getTitle() { + return title; + } + + @StringRes + public int getSubtitle() { + return subtitle; + } + + public ArrayList getArrayList() { + return arrayList; + } +} diff --git a/app/src/main/java/code/name/monkey/retromusic/mvp/contract/HomeContract.kt b/app/src/main/java/code/name/monkey/retromusic/mvp/contract/HomeContract.kt index d7272c33..84c89191 100644 --- a/app/src/main/java/code/name/monkey/retromusic/mvp/contract/HomeContract.kt +++ b/app/src/main/java/code/name/monkey/retromusic/mvp/contract/HomeContract.kt @@ -1,8 +1,6 @@ package code.name.monkey.retromusic.mvp.contract import code.name.monkey.retromusic.model.* -import java.util.ArrayList - import code.name.monkey.retromusic.mvp.BasePresenter import code.name.monkey.retromusic.mvp.BaseView @@ -10,7 +8,7 @@ interface HomeContract { interface HomeView : BaseView> { - fun recentArtist(artists: ArrayList) + /*fun recentArtist(artists: ArrayList) fun recentAlbum(albums: ArrayList) @@ -22,12 +20,14 @@ interface HomeContract { fun playlists(playlists: ArrayList) - fun geners(songs: ArrayList) + fun geners(songs: ArrayList)*/ + + fun loadHomes(homes: ArrayList) } interface HomePresenter : BasePresenter { - fun loadRecentAlbums() + /*fun loadRecentAlbums() fun loadTopAlbums() @@ -37,6 +37,7 @@ interface HomeContract { fun loadSuggestions() - fun loadGenres() + fun loadGenres()*/ + fun loadAll(); } } \ No newline at end of file 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 477e4079..4557a47c 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 @@ -1,36 +1,71 @@ package code.name.monkey.retromusic.mvp.presenter +import code.name.monkey.retromusic.R +import code.name.monkey.retromusic.model.* import code.name.monkey.retromusic.mvp.Presenter import code.name.monkey.retromusic.mvp.contract.HomeContract -import code.name.monkey.retromusic.util.PreferenceUtil +import code.name.monkey.retromusic.ui.adapter.HomeAdapter.Companion.GENRES +import code.name.monkey.retromusic.ui.adapter.HomeAdapter.Companion.PLAYLISTS +import code.name.monkey.retromusic.ui.adapter.HomeAdapter.Companion.RECENT_ALBUMS +import code.name.monkey.retromusic.ui.adapter.HomeAdapter.Companion.RECENT_ARTISTS +import code.name.monkey.retromusic.ui.adapter.HomeAdapter.Companion.SUGGESTIONS +import code.name.monkey.retromusic.ui.adapter.HomeAdapter.Companion.TOP_ALBUMS +import code.name.monkey.retromusic.ui.adapter.HomeAdapter.Companion.TOP_ARTISTS +import io.reactivex.Observable import io.reactivex.disposables.CompositeDisposable import io.reactivex.disposables.Disposable +import io.reactivex.functions.Function7 operator fun CompositeDisposable.plusAssign(disposable: Disposable) { add(disposable) } class HomePresenter(private val view: HomeContract.HomeView) : Presenter(), HomeContract.HomePresenter { + override fun loadAll() { + disposable += Observable.combineLatest(repository.suggestionSongs, repository.recentAlbums, + repository.topAlbums, repository.recentArtists, repository.topArtists, + repository.allGenres, repository.allPlaylists, + Function7, ArrayList, ArrayList, ArrayList, + ArrayList, ArrayList, ArrayList, List> + { suggestions: ArrayList, recentAlbums: ArrayList, + topAlbums: ArrayList, recentArtists: ArrayList, + topArtists: ArrayList, genres: ArrayList, + playlists: ArrayList -> + val homes: ArrayList = ArrayList() + if (suggestions.isNotEmpty()) homes.add(Home(R.string.suggestion_songs, 0, suggestions, SUGGESTIONS)) + if (recentArtists.isNotEmpty()) homes.add(Home(R.string.recent_artists, 0, recentArtists, RECENT_ARTISTS)) + if (recentAlbums.isNotEmpty()) homes.add(Home(R.string.recent_albums, 0, recentAlbums, RECENT_ALBUMS)) + if (topArtists.isNotEmpty()) homes.add(Home(R.string.top_artists, 0, topArtists, TOP_ARTISTS)) + if (topAlbums.isNotEmpty()) homes.add(Home(R.string.top_albums, 0, topAlbums, TOP_ALBUMS)) + if (genres.isNotEmpty()) homes.add(Home(R.string.genres, 0, genres, GENRES)) + if (playlists.isNotEmpty()) homes.add(Home(R.string.playlists, 0, playlists, PLAYLISTS)) + homes + }).subscribe { homes -> + if (homes.isNotEmpty()) { + view.loadHomes(homes as ArrayList) + } + } + } override fun subscribe() { - - loadRecentAlbums() + loadAll() + /*loadRecentAlbums() loadRecentArtists() loadTopAlbums() loadTopArtists() - loadSuggestions() + loadSuggestions()*/ - if (PreferenceUtil.getInstance().isGenreShown) loadGenres() + /*if (PreferenceUtil.getInstance().isGenreShown) loadGenres()*/ } override fun unsubscribe() { - if (!disposable.isDisposed) { + if (true) { disposable.dispose() } } - fun loadPlaylists() { + /*fun loadPlaylists() { disposable += repository.allPlaylists .observeOn(schedulerProvider.ui()) .subscribeOn(schedulerProvider.io()) @@ -109,5 +144,5 @@ class HomePresenter(private val view: HomeContract.HomeView) : Presenter(), Home view.geners(genres) } }, { view.showEmptyView() }, { view.completed() }) - } + }*/ } diff --git a/app/src/main/java/code/name/monkey/retromusic/providers/BlacklistStore.java b/app/src/main/java/code/name/monkey/retromusic/providers/BlacklistStore.java index 91fe2774..f77da536 100644 --- a/app/src/main/java/code/name/monkey/retromusic/providers/BlacklistStore.java +++ b/app/src/main/java/code/name/monkey/retromusic/providers/BlacklistStore.java @@ -8,15 +8,27 @@ import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteOpenHelper; import android.os.Environment; +import androidx.annotation.NonNull; + import java.io.File; import java.util.ArrayList; +import java.util.List; -import androidx.annotation.NonNull; -import code.name.monkey.retromusic.Constants; +import code.name.monkey.retromusic.App; +import code.name.monkey.retromusic.model.Album; +import code.name.monkey.retromusic.model.Artist; +import code.name.monkey.retromusic.model.Genre; +import code.name.monkey.retromusic.model.Home; +import code.name.monkey.retromusic.model.Playlist; +import code.name.monkey.retromusic.model.Song; import code.name.monkey.retromusic.util.FileUtil; import code.name.monkey.retromusic.util.PreferenceUtil; +import io.reactivex.Observable; +import io.reactivex.functions.Function7; import static code.name.monkey.retromusic.Constants.MEDIA_STORE_CHANGED; +import static code.name.monkey.retromusic.ui.adapter.HomeAdapter.RECENT_ALBUMS; +import static code.name.monkey.retromusic.ui.adapter.HomeAdapter.SUGGESTIONS; public class BlacklistStore extends SQLiteOpenHelper { public static final String DATABASE_NAME = "blacklist.db"; @@ -148,6 +160,45 @@ public class BlacklistStore extends SQLiteOpenHelper { return paths; } + private void hmm() { + RepositoryImpl repository = new RepositoryImpl(App.Companion.getContext()); + + + Observable.combineLatest(repository.getSuggestionSongs(), repository.getRecentAlbums(), + repository.getTopAlbums(), repository.getRecentArtists(), repository.getTopArtists(), + repository.getAllGenres(), repository.getAllPlaylists(), new Function7, ArrayList, ArrayList, ArrayList, ArrayList, ArrayList, ArrayList, List>() { + @Override + public List apply(ArrayList songs, ArrayList albums, ArrayList albums2, ArrayList artists, ArrayList artists2, ArrayList genres, ArrayList playlists) throws Exception { + List homes = new ArrayList<>(); + homes.add(new Home(0, 0, songs, SUGGESTIONS)); + homes.add(new Home(0, 0, albums, RECENT_ALBUMS)); + return homes; + + } + }).subscribe(homes -> { + if (homes.isEmpty()) { + + } + }); + + + Observable.combineLatest( + repository.getSuggestionSongs(), + repository.getRecentAlbums(), + repository.getTopAlbums(), + repository.getRecentArtists(), + repository.getTopArtists(), + repository.getAllGenres(), + repository.getAllPlaylists(), + (ArrayList suggestions, ArrayList recentAlbums, ArrayList topAlbums, + ArrayList recentArtists, ArrayList topArtists, + ArrayList genres, ArrayList playlists) -> { + List homes = new ArrayList<>(); + + return homes; + }).subscribe(); + } + public interface BlacklistStoreColumns { String NAME = "blacklist"; diff --git a/app/src/main/java/code/name/monkey/retromusic/ui/activities/LyricsActivity.kt b/app/src/main/java/code/name/monkey/retromusic/ui/activities/LyricsActivity.kt index 0b0072a8..7d942b24 100644 --- a/app/src/main/java/code/name/monkey/retromusic/ui/activities/LyricsActivity.kt +++ b/app/src/main/java/code/name/monkey/retromusic/ui/activities/LyricsActivity.kt @@ -250,13 +250,13 @@ class LyricsActivity : AbsMusicServiceActivity(), View.OnClickListener, ViewPage override fun onPostExecute(l: Lyrics?) { lyrics = l - offlineLyrics.visibility = View.VISIBLE + offlineLyrics?.visibility = View.VISIBLE if (l == null) { - offlineLyrics.setText(R.string.no_lyrics_found) + offlineLyrics?.setText(R.string.no_lyrics_found) return } (activity as LyricsActivity).lyricsString = l.data - offlineLyrics.text = l.data + offlineLyrics?.text = l.data } override fun onCancelled(s: Lyrics?) { diff --git a/app/src/main/java/code/name/monkey/retromusic/ui/adapter/HomeAdapter.kt b/app/src/main/java/code/name/monkey/retromusic/ui/adapter/HomeAdapter.kt new file mode 100644 index 00000000..908d0ba5 --- /dev/null +++ b/app/src/main/java/code/name/monkey/retromusic/ui/adapter/HomeAdapter.kt @@ -0,0 +1,177 @@ +package code.name.monkey.retromusic.ui.adapter + +import android.util.DisplayMetrics +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.ImageView +import android.widget.TextView +import androidx.annotation.IntDef +import androidx.appcompat.app.AppCompatActivity +import androidx.recyclerview.widget.GridLayoutManager +import androidx.recyclerview.widget.LinearLayoutManager +import androidx.recyclerview.widget.RecyclerView +import code.name.monkey.appthemehelper.ThemeStore +import code.name.monkey.appthemehelper.util.ColorUtil +import code.name.monkey.appthemehelper.util.MaterialValueHelper +import code.name.monkey.appthemehelper.util.TintHelper +import code.name.monkey.retromusic.R +import code.name.monkey.retromusic.glide.GlideApp +import code.name.monkey.retromusic.glide.RetroGlideExtension +import code.name.monkey.retromusic.glide.RetroMusicColoredTarget +import code.name.monkey.retromusic.helper.MusicPlayerRemote +import code.name.monkey.retromusic.model.* +import code.name.monkey.retromusic.ui.adapter.album.AlbumFullWidthAdapter +import code.name.monkey.retromusic.ui.adapter.artist.ArtistAdapter +import code.name.monkey.retromusic.util.PreferenceUtil +import code.name.monkey.retromusic.views.MetalRecyclerViewPager +import com.google.android.material.floatingactionbutton.FloatingActionButton + + +class HomeAdapter(private val activity: AppCompatActivity, private val homes: ArrayList, private val displayMetrics: DisplayMetrics) : RecyclerView.Adapter() { + + + override fun getItemViewType(position: Int): Int { + return homes[position].homeSection + } + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder { + val layout = LayoutInflater.from(activity).inflate(R.layout.section_recycler_view, parent, false) + return when (viewType) { + SUGGESTIONS -> SuggestionViewHolder(LayoutInflater.from(activity).inflate(R.layout.section_item_collage, parent, false)) + RECENT_ARTISTS, TOP_ARTISTS -> ArtistViewHolder(layout) + GENRES -> GenreViewHolder(layout) + else -> { + AlbumViewHolder(LayoutInflater.from(activity).inflate(R.layout.metal_section_recycler_view, parent, false)) + } + } + } + + override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) { + val home = homes[position] + when (getItemViewType(position)) { + SUGGESTIONS -> { + val viewHolder = holder as SuggestionViewHolder + viewHolder.bindView(home) + } + RECENT_ALBUMS, TOP_ALBUMS -> { + val viewHolder = holder as AlbumViewHolder + viewHolder.bindView(home) + } + RECENT_ARTISTS, TOP_ARTISTS -> { + val viewHolder = holder as ArtistViewHolder + viewHolder.bindView(home) + } + GENRES -> { + val viewHolder = holder as GenreViewHolder + viewHolder.bindView(home) + } + } + } + + override fun getItemCount(): Int { + return homes.size + } + + companion object { + + @IntDef(SUGGESTIONS, RECENT_ALBUMS, TOP_ALBUMS, RECENT_ARTISTS, TOP_ARTISTS, GENRES, PLAYLISTS) + @Retention(AnnotationRetention.SOURCE) + annotation class HomeSection + + const val SUGGESTIONS = 0 + const val RECENT_ALBUMS = 1 + const val TOP_ALBUMS = 2 + const val RECENT_ARTISTS = 3 + const val TOP_ARTISTS = 4 + const val GENRES = 5 + const val PLAYLISTS = 6 + + } + + private inner class SuggestionViewHolder(view: View) : RecyclerView.ViewHolder(view) { + private val ids: ArrayList = arrayListOf(R.id.image_1, R.id.image_2, R.id.image_3, R.id.image_4, R.id.image_5, R.id.image_6, R.id.image_7) + private var textView: TextView = itemView.findViewById(R.id.text) + private var playSuggestion: FloatingActionButton = itemView.findViewById(R.id.playSuggestions) + private var title: TextView = itemView.findViewById(R.id.sectionTitle) + + fun bindView(home: Home) { + val dataSet = home.arrayList as ArrayList + for (id in 0 until ids.size) { + val imageView = itemView.findViewById(ids[id]) + imageView.setOnClickListener { + MusicPlayerRemote.enqueue(dataSet[id]) + } + GlideApp.with(activity) + .asBitmapPalette() + .load(RetroGlideExtension.getSongModel(dataSet[id])) + .transition(RetroGlideExtension.getDefaultTransition()) + .songOptions(dataSet[id]) + .into(object : RetroMusicColoredTarget(imageView) { + override fun onColorReady(color: Int) { + + } + }) + } + + + val color = ThemeStore.accentColor(activity) + + textView.apply { + setBackgroundColor(color); + setTextColor(MaterialValueHelper.getPrimaryTextColor(context, ColorUtil.isColorLight(color))) + } + title.text = activity.getString(home.title) + + playSuggestion.apply { + TintHelper.setTintAuto(this, MaterialValueHelper.getPrimaryTextColor(context, ColorUtil.isColorLight(color)), false) + TintHelper.setTintAuto(this, color, true) + setOnClickListener { MusicPlayerRemote.openQueue(home.arrayList as ArrayList, 0, true) } + } + } + } + + private inner class AlbumViewHolder(view: View) : RecyclerView.ViewHolder(view) { + fun bindView(home: Home) { + recyclerView.apply { + adapter = AlbumFullWidthAdapter(activity, home.arrayList as ArrayList, displayMetrics) + } + title.text = activity.getString(home.title) + } + + val recyclerView: MetalRecyclerViewPager = view.findViewById(R.id.recyclerView) + val title: TextView = view.findViewById(R.id.sectionTitle) + + } + + private inner class ArtistViewHolder(view: View) : RecyclerView.ViewHolder(view) { + fun bindView(home: Home) { + recyclerView.apply { + layoutManager = GridLayoutManager(activity, 1, GridLayoutManager.HORIZONTAL, false) + val artistAdapter = ArtistAdapter(activity, home.arrayList as ArrayList, PreferenceUtil.getInstance().getHomeGridStyle(context!!), false, null) + adapter = artistAdapter + } + title.text = activity.getString(home.title) + } + + val recyclerView: RecyclerView = view.findViewById(R.id.recyclerView) + val title: TextView = view.findViewById(R.id.sectionTitle) + + } + + private inner class GenreViewHolder(view: View) : RecyclerView.ViewHolder(view) { + fun bindView(home: Home) { + recyclerView.apply { + val genreAdapter = GenreAdapter(activity, home.arrayList as ArrayList, R.layout.item_list) + layoutManager = LinearLayoutManager(context) + adapter = genreAdapter + + } + title.text = activity.getString(home.title) + } + + val recyclerView: RecyclerView = view.findViewById(R.id.recyclerView) + val title: TextView = view.findViewById(R.id.sectionTitle) + + } +} \ No newline at end of file diff --git a/app/src/main/java/code/name/monkey/retromusic/ui/adapter/SpanSongsAdapter.kt b/app/src/main/java/code/name/monkey/retromusic/ui/adapter/SpanSongsAdapter.kt new file mode 100644 index 00000000..f0b01396 --- /dev/null +++ b/app/src/main/java/code/name/monkey/retromusic/ui/adapter/SpanSongsAdapter.kt @@ -0,0 +1,20 @@ +package code.name.monkey.retromusic.ui.adapter + +import androidx.appcompat.app.AppCompatActivity +import androidx.recyclerview.widget.StaggeredGridLayoutManager +import code.name.monkey.retromusic.interfaces.CabHolder +import code.name.monkey.retromusic.model.Song +import code.name.monkey.retromusic.ui.adapter.song.SongAdapter +import java.util.* + +class SpanSongsAdapter(activity: AppCompatActivity, dataSet: ArrayList, itemLayoutRes: Int, usePalette: Boolean, cabHolder: CabHolder?) : SongAdapter(activity, dataSet, itemLayoutRes, usePalette, cabHolder) { + + override fun onBindViewHolder(holder: SongAdapter.ViewHolder, position: Int) { + super.onBindViewHolder(holder, position) + if (position == 0) { + val params = StaggeredGridLayoutManager.LayoutParams(StaggeredGridLayoutManager.LayoutParams.WRAP_CONTENT, StaggeredGridLayoutManager.LayoutParams.MATCH_PARENT) + params.isFullSpan = true + holder.itemView.layoutParams = params + } + } +} diff --git a/app/src/main/java/code/name/monkey/retromusic/ui/adapter/album/AlbumFullWithAdapter.kt b/app/src/main/java/code/name/monkey/retromusic/ui/adapter/album/AlbumFullWidthAdapter.kt similarity index 81% rename from app/src/main/java/code/name/monkey/retromusic/ui/adapter/album/AlbumFullWithAdapter.kt rename to app/src/main/java/code/name/monkey/retromusic/ui/adapter/album/AlbumFullWidthAdapter.kt index 465645c5..f7ef05fa 100644 --- a/app/src/main/java/code/name/monkey/retromusic/ui/adapter/album/AlbumFullWithAdapter.kt +++ b/app/src/main/java/code/name/monkey/retromusic/ui/adapter/album/AlbumFullWidthAdapter.kt @@ -20,7 +20,6 @@ import android.util.DisplayMetrics import android.view.LayoutInflater import android.view.View import android.view.ViewGroup -import android.widget.ImageView import androidx.core.util.Pair import code.name.monkey.retromusic.R import code.name.monkey.retromusic.glide.GlideApp @@ -30,21 +29,12 @@ import code.name.monkey.retromusic.helper.MusicPlayerRemote import code.name.monkey.retromusic.model.Album import code.name.monkey.retromusic.util.NavigationUtil import code.name.monkey.retromusic.views.MetalRecyclerViewPager -import java.util.* -class AlbumFullWithAdapter(private val activity: Activity, - metrics: DisplayMetrics) : MetalRecyclerViewPager.MetalAdapter(metrics) { - private var dataSet: List = ArrayList() - - fun swapData(list: ArrayList) { - dataSet = list - notifyDataSetChanged() - } +class AlbumFullWidthAdapter(private val activity: Activity, private val dataSet: ArrayList, metrics: DisplayMetrics) : + MetalRecyclerViewPager.MetalAdapter(metrics) { override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): FullMetalViewHolder { - val viewItem = LayoutInflater.from(parent.context) - .inflate(R.layout.pager_item, parent, false) - return FullMetalViewHolder(viewItem) + return FullMetalViewHolder(LayoutInflater.from(parent.context).inflate(R.layout.pager_item, parent, false)) } override fun onBindViewHolder(holder: FullMetalViewHolder, position: Int) { @@ -97,7 +87,7 @@ class AlbumFullWithAdapter(private val activity: Activity, inner class FullMetalViewHolder(itemView: View) : MetalRecyclerViewPager.MetalViewHolder(itemView) { override fun onClick(v: View?) { - val albumPairs = arrayOf>(Pair.create(image, activity.resources.getString(R.string.transition_album_art))) + val albumPairs = arrayOf>(Pair.create(image, activity.resources.getString(R.string.transition_album_art))) NavigationUtil.goToAlbum(activity, dataSet[adapterPosition].id, *albumPairs) } } diff --git a/app/src/main/java/code/name/monkey/retromusic/ui/fragments/VolumeFragment.kt b/app/src/main/java/code/name/monkey/retromusic/ui/fragments/VolumeFragment.kt index 30db5696..d181546e 100755 --- a/app/src/main/java/code/name/monkey/retromusic/ui/fragments/VolumeFragment.kt +++ b/app/src/main/java/code/name/monkey/retromusic/ui/fragments/VolumeFragment.kt @@ -11,6 +11,7 @@ import android.view.View import android.view.ViewGroup import android.widget.SeekBar import androidx.fragment.app.Fragment +import androidx.transition.TransitionManager import code.name.monkey.appthemehelper.ThemeStore import code.name.monkey.retromusic.R import code.name.monkey.retromusic.helper.MusicPlayerRemote @@ -57,6 +58,7 @@ class VolumeFragment : Fragment(), SeekBar.OnSeekBarChangeListener, OnAudioVolum if (volumeSeekBar == null) { return } + volumeSeekBar.max = maxVolume volumeSeekBar.progress = currentVolume volumeDown.setImageResource(if (currentVolume == 0) R.drawable.ic_volume_off_white_24dp else R.drawable.ic_volume_down_white_24dp) diff --git a/app/src/main/java/code/name/monkey/retromusic/ui/fragments/mainactivity/home/BannerHomeFragment.kt b/app/src/main/java/code/name/monkey/retromusic/ui/fragments/mainactivity/home/BannerHomeFragment.kt index 9e067cc2..8b5333e6 100644 --- a/app/src/main/java/code/name/monkey/retromusic/ui/fragments/mainactivity/home/BannerHomeFragment.kt +++ b/app/src/main/java/code/name/monkey/retromusic/ui/fragments/mainactivity/home/BannerHomeFragment.kt @@ -10,7 +10,6 @@ import android.view.ViewGroup import android.widget.ImageView import androidx.appcompat.widget.Toolbar import androidx.core.content.ContextCompat -import androidx.recyclerview.widget.GridLayoutManager import androidx.recyclerview.widget.LinearLayoutManager import code.name.monkey.appthemehelper.ThemeStore import code.name.monkey.appthemehelper.util.TintHelper @@ -21,31 +20,33 @@ import code.name.monkey.retromusic.glide.GlideApp import code.name.monkey.retromusic.helper.MusicPlayerRemote import code.name.monkey.retromusic.interfaces.MainActivityFragmentCallbacks import code.name.monkey.retromusic.loaders.SongLoader -import code.name.monkey.retromusic.model.* +import code.name.monkey.retromusic.model.Home import code.name.monkey.retromusic.model.smartplaylist.HistoryPlaylist import code.name.monkey.retromusic.model.smartplaylist.LastAddedPlaylist import code.name.monkey.retromusic.model.smartplaylist.MyTopTracksPlaylist import code.name.monkey.retromusic.mvp.contract.HomeContract import code.name.monkey.retromusic.mvp.presenter.HomePresenter -import code.name.monkey.retromusic.ui.adapter.CollageSongAdapter -import code.name.monkey.retromusic.ui.adapter.GenreAdapter -import code.name.monkey.retromusic.ui.adapter.album.AlbumFullWithAdapter -import code.name.monkey.retromusic.ui.adapter.artist.ArtistAdapter +import code.name.monkey.retromusic.ui.adapter.HomeAdapter import code.name.monkey.retromusic.ui.fragments.base.AbsMainActivityFragment import code.name.monkey.retromusic.util.Compressor import code.name.monkey.retromusic.util.NavigationUtil import code.name.monkey.retromusic.util.PreferenceUtil -import code.name.monkey.retromusic.util.RetroUtil import com.bumptech.glide.load.engine.DiskCacheStrategy import io.reactivex.android.schedulers.AndroidSchedulers import io.reactivex.disposables.CompositeDisposable import io.reactivex.schedulers.Schedulers import kotlinx.android.synthetic.main.fragment_banner_home.* -import kotlinx.android.synthetic.main.home_section_content.* import java.io.File import java.util.* class BannerHomeFragment : AbsMainActivityFragment(), MainActivityFragmentCallbacks, HomeContract.HomeView { + override fun loadHomes(homes: ArrayList) { + recyclerView.apply { + val homeAdapter = HomeAdapter(mainActivity, homes, displayMetrics) + layoutManager = LinearLayoutManager(mainActivity) + adapter = homeAdapter + } + } val disposable: CompositeDisposable = CompositeDisposable() private lateinit var homePresenter: HomePresenter @@ -208,19 +209,18 @@ class BannerHomeFragment : AbsMainActivityFragment(), MainActivityFragmentCallba //homeAdapter.swapDataSet(homes); } - override fun recentArtist(artists: ArrayList) { - recentArtistContainer.visibility = View.VISIBLE - recentArtist.apply { - val artistAdapter = ArtistAdapter(mainActivity, artists, PreferenceUtil.getInstance().getHomeGridStyle(context!!), false, null) - layoutManager = GridLayoutManager(mainActivity, 1, GridLayoutManager.HORIZONTAL, false) - adapter = artistAdapter - } + /*override fun recentArtist(artists: ArrayList) { + *//* recentArtistContainer.visibility = View.VISIBLE + recentArtist.apply { + val artistAdapter = ArtistAdapter(mainActivity, artists, PreferenceUtil.getInstance().getHomeGridStyle(context!!), false, null) + layoutManager = GridLayoutManager(mainActivity, 1, GridLayoutManager.HORIZONTAL, false) + adapter = artistAdapter + }*//* } override fun recentAlbum(albums: ArrayList) { recentAlbumsContainer.visibility = View.VISIBLE - val artistAdapter = AlbumFullWithAdapter(mainActivity, displayMetrics) - artistAdapter.swapData(albums) + val artistAdapter = AlbumFullWidthAdapter(mainActivity, albums, displayMetrics) recentAlbum.adapter = artistAdapter } @@ -236,17 +236,27 @@ class BannerHomeFragment : AbsMainActivityFragment(), MainActivityFragmentCallba override fun topAlbums(albums: ArrayList) { topAlbumsContainer.visibility = View.VISIBLE - val artistAdapter = AlbumFullWithAdapter(mainActivity, displayMetrics) - artistAdapter.swapData(albums) + val artistAdapter = AlbumFullWidthAdapter(mainActivity, albums, displayMetrics) topAlbum.adapter = artistAdapter } override fun suggestions(songs: ArrayList) { if (!songs.isEmpty()) { suggestionContainer.visibility = View.VISIBLE - val artistAdapter = CollageSongAdapter(mainActivity, songs) + val artistAdapter = SpanSongsAdapter(mainActivity, songs, R.layout.image, false, null) + val manager = GridLayoutManager(mainActivity, 2, GridLayoutManager.HORIZONTAL, false) + manager.spanSizeLookup = object : GridLayoutManager.SpanSizeLookup() { + override fun getSpanSize(position: Int): Int { + return when (position) { + 0 -> 2 + else -> { + 1 + } + } + } + } suggestionSongs.apply { - layoutManager = if (RetroUtil.isTablet()) GridLayoutManager(mainActivity, 2) else LinearLayoutManager(mainActivity) + layoutManager = if (RetroUtil.isTablet()) GridLayoutManager(mainActivity, 2) else manager adapter = artistAdapter } } @@ -264,7 +274,7 @@ class BannerHomeFragment : AbsMainActivityFragment(), MainActivityFragmentCallba adapter = genreAdapter } } - +*/ companion object { diff --git a/app/src/main/java/code/name/monkey/retromusic/ui/fragments/player/color/ColorFragment.kt b/app/src/main/java/code/name/monkey/retromusic/ui/fragments/player/color/ColorFragment.kt index fef05ac8..17035e2d 100644 --- a/app/src/main/java/code/name/monkey/retromusic/ui/fragments/player/color/ColorFragment.kt +++ b/app/src/main/java/code/name/monkey/retromusic/ui/fragments/player/color/ColorFragment.kt @@ -208,7 +208,7 @@ class ColorFragment : AbsPlayerFragment() { private fun setColors(backgroundColor: Int, textColor: Int) { playbackControlsFragment!!.setDark(textColor, backgroundColor) - colorGradientBackground.setBackgroundColor(backgroundColor) + colorGradientBackground?.setBackgroundColor(backgroundColor) ToolbarContentTintHelper.colorizeToolbar(playerToolbar, textColor, activity) @@ -230,7 +230,7 @@ class ColorFragment : AbsPlayerFragment() { valueAnimator = ValueAnimator.ofObject(ArgbEvaluator(), paletteColor, i) valueAnimator!!.addUpdateListener { animation -> - colorGradientBackground.setBackgroundColor(animation.animatedValue as Int) + colorGradientBackground?.setBackgroundColor(animation.animatedValue as Int) } valueAnimator!!.setDuration(ViewUtil.RETRO_MUSIC_ANIM_TIME.toLong()).start() } diff --git a/app/src/main/java/code/name/monkey/retromusic/ui/fragments/player/flat/FlatPlayerFragment.kt b/app/src/main/java/code/name/monkey/retromusic/ui/fragments/player/flat/FlatPlayerFragment.kt index be1f5b12..d4bad79b 100644 --- a/app/src/main/java/code/name/monkey/retromusic/ui/fragments/player/flat/FlatPlayerFragment.kt +++ b/app/src/main/java/code/name/monkey/retromusic/ui/fragments/player/flat/FlatPlayerFragment.kt @@ -56,7 +56,7 @@ class FlatPlayerFragment : AbsPlayerFragment(), PlayerAlbumCoverFragment.Callbac valueAnimator!!.addUpdateListener { animation -> val drawable = DrawableGradient(GradientDrawable.Orientation.TOP_BOTTOM, intArrayOf(animation.animatedValue as Int, android.R.color.transparent), 0) - colorGradientBackground!!.background = drawable + colorGradientBackground?.background = drawable } valueAnimator!!.setDuration(ViewUtil.RETRO_MUSIC_ANIM_TIME.toLong()).start() diff --git a/app/src/main/java/code/name/monkey/retromusic/ui/fragments/player/normal/PlayerFragment.kt b/app/src/main/java/code/name/monkey/retromusic/ui/fragments/player/normal/PlayerFragment.kt index fa1fcd1e..b56041c7 100644 --- a/app/src/main/java/code/name/monkey/retromusic/ui/fragments/player/normal/PlayerFragment.kt +++ b/app/src/main/java/code/name/monkey/retromusic/ui/fragments/player/normal/PlayerFragment.kt @@ -38,7 +38,7 @@ class PlayerFragment : AbsPlayerFragment(), PlayerAlbumCoverFragment.Callbacks { valueAnimator = ValueAnimator.ofObject(ArgbEvaluator(), android.R.color.transparent, i) valueAnimator!!.addUpdateListener { animation -> val drawable = DrawableGradient(GradientDrawable.Orientation.TOP_BOTTOM, intArrayOf(animation.animatedValue as Int, android.R.color.transparent), 0) - colorGradientBackground!!.background = drawable + colorGradientBackground?.background = drawable } valueAnimator!!.setDuration(ViewUtil.RETRO_MUSIC_ANIM_TIME.toLong()).start() } diff --git a/app/src/main/res/layout/fragment_banner_home.xml b/app/src/main/res/layout/fragment_banner_home.xml index cd28d74b..01032148 100644 --- a/app/src/main/res/layout/fragment_banner_home.xml +++ b/app/src/main/res/layout/fragment_banner_home.xml @@ -100,7 +100,11 @@ - + diff --git a/app/src/main/res/layout/fragment_home.xml b/app/src/main/res/layout/fragment_home.xml index 5d4e813e..bf811e38 100755 --- a/app/src/main/res/layout/fragment_home.xml +++ b/app/src/main/res/layout/fragment_home.xml @@ -67,7 +67,11 @@ - + diff --git a/app/src/main/res/layout/home_section_content.xml b/app/src/main/res/layout/home_section_content.xml index 6f58e7f7..82e44dd2 100644 --- a/app/src/main/res/layout/home_section_content.xml +++ b/app/src/main/res/layout/home_section_content.xml @@ -4,6 +4,7 @@ xmlns:app="http://schemas.android.com/apk/res-auto" android:layout_width="match_parent" android:layout_height="wrap_content" + xmlns:tools="http://schemas.android.com/tools" android:orientation="vertical"> diff --git a/app/src/main/res/layout/image.xml b/app/src/main/res/layout/image.xml index 375c45f9..73a0b250 100644 --- a/app/src/main/res/layout/image.xml +++ b/app/src/main/res/layout/image.xml @@ -2,7 +2,7 @@ diff --git a/app/src/main/res/layout/metal_section_recycler_view.xml b/app/src/main/res/layout/metal_section_recycler_view.xml new file mode 100644 index 00000000..4b7c177c --- /dev/null +++ b/app/src/main/res/layout/metal_section_recycler_view.xml @@ -0,0 +1,26 @@ + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/section_item_collage.xml b/app/src/main/res/layout/section_item_collage.xml new file mode 100644 index 00000000..2fe67344 --- /dev/null +++ b/app/src/main/res/layout/section_item_collage.xml @@ -0,0 +1,220 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/section_recycler_view.xml b/app/src/main/res/layout/section_recycler_view.xml new file mode 100644 index 00000000..a240fa75 --- /dev/null +++ b/app/src/main/res/layout/section_recycler_view.xml @@ -0,0 +1,26 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/mipmap-hdpi/ic_launcher.png b/app/src/main/res/mipmap-hdpi/ic_launcher.png index 3f04ce5a..0f29da67 100644 Binary files a/app/src/main/res/mipmap-hdpi/ic_launcher.png and b/app/src/main/res/mipmap-hdpi/ic_launcher.png differ diff --git a/app/src/main/res/mipmap-hdpi/ic_launcher_background.png b/app/src/main/res/mipmap-hdpi/ic_launcher_background.png index c53feb5d..8f735df7 100644 Binary files a/app/src/main/res/mipmap-hdpi/ic_launcher_background.png and b/app/src/main/res/mipmap-hdpi/ic_launcher_background.png differ diff --git a/app/src/main/res/mipmap-hdpi/ic_launcher_round.png b/app/src/main/res/mipmap-hdpi/ic_launcher_round.png index 3f04ce5a..0f29da67 100644 Binary files a/app/src/main/res/mipmap-hdpi/ic_launcher_round.png and b/app/src/main/res/mipmap-hdpi/ic_launcher_round.png differ diff --git a/app/src/main/res/mipmap-mdpi/ic_launcher.png b/app/src/main/res/mipmap-mdpi/ic_launcher.png index aea8b3b4..4d6b7e02 100644 Binary files a/app/src/main/res/mipmap-mdpi/ic_launcher.png and b/app/src/main/res/mipmap-mdpi/ic_launcher.png differ diff --git a/app/src/main/res/mipmap-mdpi/ic_launcher_background.png b/app/src/main/res/mipmap-mdpi/ic_launcher_background.png index 9ce5f724..1e0a695b 100644 Binary files a/app/src/main/res/mipmap-mdpi/ic_launcher_background.png and b/app/src/main/res/mipmap-mdpi/ic_launcher_background.png differ diff --git a/app/src/main/res/mipmap-mdpi/ic_launcher_round.png b/app/src/main/res/mipmap-mdpi/ic_launcher_round.png index aea8b3b4..4d6b7e02 100644 Binary files a/app/src/main/res/mipmap-mdpi/ic_launcher_round.png and b/app/src/main/res/mipmap-mdpi/ic_launcher_round.png differ diff --git a/app/src/main/res/mipmap-xhdpi/ic_launcher.png b/app/src/main/res/mipmap-xhdpi/ic_launcher.png index 401fd0d4..9cf3cf63 100644 Binary files a/app/src/main/res/mipmap-xhdpi/ic_launcher.png and b/app/src/main/res/mipmap-xhdpi/ic_launcher.png differ diff --git a/app/src/main/res/mipmap-xhdpi/ic_launcher_background.png b/app/src/main/res/mipmap-xhdpi/ic_launcher_background.png index ae2ee6f4..fc98956b 100644 Binary files a/app/src/main/res/mipmap-xhdpi/ic_launcher_background.png and b/app/src/main/res/mipmap-xhdpi/ic_launcher_background.png differ diff --git a/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png b/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png index 401fd0d4..9cf3cf63 100644 Binary files a/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png and b/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png differ diff --git a/app/src/main/res/mipmap-xxhdpi/ic_launcher.png b/app/src/main/res/mipmap-xxhdpi/ic_launcher.png index 19a04881..2ddd9807 100644 Binary files a/app/src/main/res/mipmap-xxhdpi/ic_launcher.png and b/app/src/main/res/mipmap-xxhdpi/ic_launcher.png differ diff --git a/app/src/main/res/mipmap-xxhdpi/ic_launcher_background.png b/app/src/main/res/mipmap-xxhdpi/ic_launcher_background.png index 841a0a2c..21c42401 100644 Binary files a/app/src/main/res/mipmap-xxhdpi/ic_launcher_background.png and b/app/src/main/res/mipmap-xxhdpi/ic_launcher_background.png differ diff --git a/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png b/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png index 19a04881..2ddd9807 100644 Binary files a/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png and b/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png differ diff --git a/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png index 13f0a3cb..a57038bc 100644 Binary files a/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png and b/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png differ diff --git a/app/src/main/res/mipmap-xxxhdpi/ic_launcher_background.png b/app/src/main/res/mipmap-xxxhdpi/ic_launcher_background.png index aa8d7167..263fbb58 100644 Binary files a/app/src/main/res/mipmap-xxxhdpi/ic_launcher_background.png and b/app/src/main/res/mipmap-xxxhdpi/ic_launcher_background.png differ diff --git a/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png b/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png index 13f0a3cb..a57038bc 100644 Binary files a/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png and b/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png differ diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index f1dbe256..42ad5d9b 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,4 +1,4 @@ -#Thu Dec 13 05:28:53 IST 2018 +#Fri Jan 18 19:55:16 IST 2019 distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME