diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 0019439..36aa176 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -31,7 +31,7 @@ - diff --git a/app/src/main/java/com/vpaliy/melophile/di/component/ApplicationComponent.java b/app/src/main/java/com/vpaliy/melophile/di/component/ApplicationComponent.java index 7f8cf7f..0677ea1 100644 --- a/app/src/main/java/com/vpaliy/melophile/di/component/ApplicationComponent.java +++ b/app/src/main/java/com/vpaliy/melophile/di/component/ApplicationComponent.java @@ -6,20 +6,18 @@ import com.vpaliy.data.source.RemoteSource; import com.vpaliy.data.source.remote.Filter; import com.vpaliy.domain.executor.BaseSchedulerProvider; -import com.vpaliy.domain.interactor.FollowUser; -import com.vpaliy.domain.interactor.GetMe; +import com.vpaliy.domain.interactor.FavoritePlaylistInteractor; +import com.vpaliy.domain.interactor.FavoriteTrackInteractor; import com.vpaliy.domain.interactor.GetPlaylist; import com.vpaliy.domain.interactor.GetPlaylists; -import com.vpaliy.domain.interactor.PlaylistHistory; -import com.vpaliy.domain.interactor.TrackHistory; import com.vpaliy.domain.interactor.GetTrack; import com.vpaliy.domain.interactor.GetTracks; -import com.vpaliy.domain.interactor.GetUserDetails; import com.vpaliy.domain.interactor.GetUserFavorites; import com.vpaliy.domain.interactor.GetUserFollowers; -import com.vpaliy.domain.interactor.LoveTrack; +import com.vpaliy.domain.interactor.HistoryPlaylistInteractor; +import com.vpaliy.domain.interactor.HistoryTrackInteractor; +import com.vpaliy.domain.interactor.PersonalUserInteractor; import com.vpaliy.domain.interactor.PlaylistSearch; -import com.vpaliy.domain.interactor.SaveInteractor; import com.vpaliy.domain.interactor.TrackSearch; import com.vpaliy.domain.interactor.UserSearch; import com.vpaliy.domain.model.Track; @@ -61,19 +59,16 @@ public interface ApplicationComponent { GetPlaylists playlistsInteractor(); GetTracks tracksInteractor(); GetPlaylist playlistInteractor(); - GetTrack trackInteractor(); - GetUserDetails userDetailsInteractor(); GetUserFollowers userFollowersInteractor(); GetUserFavorites userFavoritesInteractor(); TrackSearch trackSearchInteractor(); PlaylistSearch playlistSearchInteractor(); UserSearch userSearchInteractor(); - SaveInteractor saveInteractor(); - GetMe meInteractor(); - FollowUser followUserInteractor(); - LoveTrack loveTrackInteractor(); - PlaylistHistory recentPlaylistsInteractor(); - TrackHistory recentTracksInteractor(); - + GetTrack trackInteractor(); + PersonalUserInteractor personalUserInteractor(); + FavoritePlaylistInteractor favoritePlaylistInteractor(); + FavoriteTrackInteractor favoriteTrackInteractor(); + HistoryTrackInteractor historyTrackInteractor(); + HistoryPlaylistInteractor historyPlaylistInteractor(); Mapper mapper(); } diff --git a/app/src/main/java/com/vpaliy/melophile/di/component/PlayerComponent.java b/app/src/main/java/com/vpaliy/melophile/di/component/PlayerComponent.java index d0b1f8b..1af6b42 100644 --- a/app/src/main/java/com/vpaliy/melophile/di/component/PlayerComponent.java +++ b/app/src/main/java/com/vpaliy/melophile/di/component/PlayerComponent.java @@ -2,14 +2,14 @@ import com.vpaliy.melophile.di.module.PlaybackModule; import com.vpaliy.melophile.playback.service.MusicPlaybackService; +import com.vpaliy.melophile.ui.player.PlayerActivity; import dagger.Component; import com.vpaliy.domain.playback.PlayerScope; -import com.vpaliy.melophile.ui.track.TrackFragment; @PlayerScope @Component(dependencies = ApplicationComponent.class, modules = PlaybackModule.class) public interface PlayerComponent { void inject(MusicPlaybackService service); - void inject(TrackFragment fragment); + void inject(PlayerActivity fragment); } diff --git a/app/src/main/java/com/vpaliy/melophile/di/component/ViewComponent.java b/app/src/main/java/com/vpaliy/melophile/di/component/ViewComponent.java index d9a2bcf..c132b64 100644 --- a/app/src/main/java/com/vpaliy/melophile/di/component/ViewComponent.java +++ b/app/src/main/java/com/vpaliy/melophile/di/component/ViewComponent.java @@ -3,10 +3,9 @@ import com.vpaliy.melophile.di.module.PresenterModule; import com.vpaliy.melophile.di.scope.ViewScope; import com.vpaliy.melophile.ui.personal.PersonalFragment; -import com.vpaliy.melophile.ui.playlist.PlaylistFragment; +import com.vpaliy.melophile.ui.playlist.PlaylistActivity; import com.vpaliy.melophile.ui.playlists.PlaylistsFragment; import com.vpaliy.melophile.ui.search.SearchActivity; -import com.vpaliy.melophile.ui.track.TrackFragment; import com.vpaliy.melophile.ui.tracks.TracksFragment; import com.vpaliy.melophile.ui.user.PersonFragment; import com.vpaliy.melophile.ui.user.info.FavoriteFragment; @@ -21,7 +20,7 @@ public interface ViewComponent { void inject(PlaylistsFragment fragment); void inject(TracksFragment fragment); void inject(PersonalFragment fragment); - void inject(PlaylistFragment fragment); + void inject(PlaylistActivity activity); void inject(PersonFragment fragment); void inject(FavoriteFragment fragment); void inject(FollowersFragment fragment); diff --git a/app/src/main/java/com/vpaliy/melophile/di/module/ApplicationModule.java b/app/src/main/java/com/vpaliy/melophile/di/module/ApplicationModule.java index d71fcda..a9821b4 100644 --- a/app/src/main/java/com/vpaliy/melophile/di/module/ApplicationModule.java +++ b/app/src/main/java/com/vpaliy/melophile/di/module/ApplicationModule.java @@ -18,21 +18,26 @@ public ApplicationModule(Context context){ this.context=context; } - @Singleton @Provides Context context(){ + @Singleton + @Provides + Context context(){ return context; } - @Singleton @Provides + @Singleton + @Provides RxBus rxBus(){ return new RxBus(); } - @Singleton @Provides + @Singleton + @Provides BaseSchedulerProvider schedulerProvider(){ return new SchedulerProvider(); } - @Singleton @Provides + @Singleton + @Provides Navigator navigator(){ return new Navigator(); } diff --git a/app/src/main/java/com/vpaliy/melophile/di/module/DataModule.java b/app/src/main/java/com/vpaliy/melophile/di/module/DataModule.java index 18113a9..bb6467c 100644 --- a/app/src/main/java/com/vpaliy/melophile/di/module/DataModule.java +++ b/app/src/main/java/com/vpaliy/melophile/di/module/DataModule.java @@ -19,37 +19,44 @@ @Module public class DataModule { - @Singleton @Provides + @Singleton + @Provides Repository repository(MusicRepository repository){ return repository; } - @Singleton @Provides + @Singleton + @Provides RemoteSource remoteSource(MusicRemoteSource remote){ return remote; } - @Singleton @Provides + @Singleton + @Provides Filter filter(){ return new Filter(); } - @Singleton @Provides + @Singleton + @Provides SearchRepository searchRepository(MusicSearchRepository repository){ return repository; } - @Singleton @Provides + @Singleton + @Provides SearchSource searchSource(RemoteSearchSource remote){ return remote; } - @Singleton @Provides + @Singleton + @Provides PersonalRepository personalRepository(MusicPersonalRepository repository){ return repository; } - @Singleton @Provides + @Singleton + @Provides LocalSource localSource(LocalMusicSource local){ return local; } diff --git a/app/src/main/java/com/vpaliy/melophile/di/module/InteractorModule.java b/app/src/main/java/com/vpaliy/melophile/di/module/InteractorModule.java index d16ad57..9d43d9e 100644 --- a/app/src/main/java/com/vpaliy/melophile/di/module/InteractorModule.java +++ b/app/src/main/java/com/vpaliy/melophile/di/module/InteractorModule.java @@ -1,15 +1,21 @@ package com.vpaliy.melophile.di.module; import com.vpaliy.domain.executor.BaseSchedulerProvider; +import com.vpaliy.domain.interactor.FavoritePlaylistInteractor; +import com.vpaliy.domain.interactor.FavoriteTrackInteractor; import com.vpaliy.domain.interactor.GetPlaylist; import com.vpaliy.domain.interactor.GetPlaylists; import com.vpaliy.domain.interactor.GetTrack; import com.vpaliy.domain.interactor.GetTracks; import com.vpaliy.domain.interactor.GetUserFavorites; import com.vpaliy.domain.interactor.GetUserFollowers; +import com.vpaliy.domain.interactor.HistoryPlaylistInteractor; +import com.vpaliy.domain.interactor.HistoryTrackInteractor; +import com.vpaliy.domain.interactor.PersonalUserInteractor; import com.vpaliy.domain.interactor.PlaylistSearch; import com.vpaliy.domain.interactor.TrackSearch; import com.vpaliy.domain.interactor.UserSearch; +import com.vpaliy.domain.repository.PersonalRepository; import com.vpaliy.domain.repository.Repository; import com.vpaliy.domain.repository.SearchRepository; import javax.inject.Singleton; @@ -18,52 +24,98 @@ @Module public class InteractorModule { - @Singleton @Provides + @Singleton + @Provides GetPlaylists getPlaylists(Repository repository, BaseSchedulerProvider schedulerProvider){ return new GetPlaylists(schedulerProvider,repository); } - @Singleton @Provides + @Singleton + @Provides GetTracks getTracks(Repository repository, BaseSchedulerProvider schedulerProvider){ return new GetTracks(schedulerProvider,repository); } - @Singleton @Provides + @Singleton + @Provides GetTrack getTrack(Repository repository, BaseSchedulerProvider schedulerProvider){ return new GetTrack(schedulerProvider,repository); } - @Singleton @Provides + @Singleton + @Provides GetPlaylist getPlaylist(Repository repository, BaseSchedulerProvider schedulerProvider){ return new GetPlaylist(schedulerProvider,repository); } + @Singleton + @Provides + PersonalUserInteractor personalUserInteractor(PersonalRepository repository, + BaseSchedulerProvider schedulerProvider){ + return new PersonalUserInteractor(repository,schedulerProvider); + } + + @Singleton + @Provides + FavoriteTrackInteractor favoriteTrackInteractor(PersonalRepository repository, + BaseSchedulerProvider schedulerProvider){ + return new FavoriteTrackInteractor(repository,schedulerProvider); + } + + @Singleton + @Provides + FavoritePlaylistInteractor favoritePlaylistInteractor(PersonalRepository repository, + BaseSchedulerProvider schedulerProvider){ + return new FavoritePlaylistInteractor(repository,schedulerProvider); + } + + @Singleton + @Provides + HistoryPlaylistInteractor historyPlaylistInteractor(PersonalRepository repository, + BaseSchedulerProvider schedulerProvider){ + return new HistoryPlaylistInteractor(repository,schedulerProvider); + } + + @Singleton + @Provides + HistoryTrackInteractor historyTrackInteractor(PersonalRepository repository, + BaseSchedulerProvider schedulerProvider){ + return new HistoryTrackInteractor(repository,schedulerProvider); + } + + + /* @Singleton @Provides GetUserDetails getUserDetails(Repository repository, BaseSchedulerProvider schedulerProvider){ return new GetUserDetails(schedulerProvider,repository); } */ - @Singleton @Provides + @Singleton + @Provides GetUserFollowers getUserFollowers(Repository repository, BaseSchedulerProvider schedulerProvider){ return new GetUserFollowers(repository,schedulerProvider); } - @Singleton @Provides + @Singleton + @Provides GetUserFavorites getUserFavorites(Repository repository, BaseSchedulerProvider schedulerProvider){ return new GetUserFavorites(repository,schedulerProvider); } - @Singleton @Provides + @Singleton + @Provides TrackSearch trackSearch(BaseSchedulerProvider schedulerProvider, SearchRepository repository){ return new TrackSearch(repository,schedulerProvider); } - @Singleton @Provides + @Singleton + @Provides UserSearch userSearch(BaseSchedulerProvider schedulerProvider,SearchRepository repository){ return new UserSearch(repository,schedulerProvider); } - @Singleton @Provides + @Singleton + @Provides PlaylistSearch playlistSearch(BaseSchedulerProvider schedulerProvider, SearchRepository repository){ return new PlaylistSearch(repository,schedulerProvider); } diff --git a/app/src/main/java/com/vpaliy/melophile/di/module/PlaybackModule.java b/app/src/main/java/com/vpaliy/melophile/di/module/PlaybackModule.java index 82aae91..8fb43d9 100644 --- a/app/src/main/java/com/vpaliy/melophile/di/module/PlaybackModule.java +++ b/app/src/main/java/com/vpaliy/melophile/di/module/PlaybackModule.java @@ -5,7 +5,6 @@ import android.net.wifi.WifiManager; import android.os.Build; import com.vpaliy.data.mapper.Mapper; -import com.vpaliy.domain.interactor.SaveInteractor; import com.vpaliy.domain.model.Track; import com.vpaliy.domain.playback.Playback; import com.vpaliy.melophile.playback.MediaPlayback; @@ -32,7 +31,7 @@ Playback playback(Context context){ } @PlayerScope @Provides - PlaybackManager playbackManager(Playback playback, Mapper mapper, SaveInteractor saveInteractor){ - return new PlaybackManager(playback,mapper,saveInteractor); + PlaybackManager playbackManager(Playback playback, Mapper mapper){ + return new PlaybackManager(playback,mapper); } } diff --git a/app/src/main/java/com/vpaliy/melophile/playback/PlaybackManager.java b/app/src/main/java/com/vpaliy/melophile/playback/PlaybackManager.java index 0181547..63f6a72 100644 --- a/app/src/main/java/com/vpaliy/melophile/playback/PlaybackManager.java +++ b/app/src/main/java/com/vpaliy/melophile/playback/PlaybackManager.java @@ -6,7 +6,6 @@ import android.support.v4.media.session.MediaSessionCompat; import android.support.v4.media.session.PlaybackStateCompat; import com.vpaliy.data.mapper.Mapper; -import com.vpaliy.domain.interactor.SaveInteractor; import com.vpaliy.domain.model.Track; import com.vpaliy.domain.playback.Playback; import com.vpaliy.domain.playback.QueueManager; @@ -26,18 +25,16 @@ public class PlaybackManager implements Playback.Callback { private MetadataUpdateListener updateListener; private QueueManager queueManager; private Playback playback; - private SaveInteractor saveInteractor; private boolean isRepeat; private boolean isShuffle; private int lastState; @Inject - public PlaybackManager(Playback playback, Mapper mapper, SaveInteractor saveInteractor){ + public PlaybackManager(Playback playback, Mapper mapper){ this.mediaSessionCallback=new MediaSessionCallback(); this.playback=playback; this.playback.setCallback(this); this.mapper=mapper; - this.saveInteractor=saveInteractor; } public void setUpdateListener(MetadataUpdateListener updateListener) { @@ -54,7 +51,7 @@ public void setQueueManager(QueueManager queueManager) { public void handlePlayRequest(Track track){ if(track!=null) { - saveInteractor.saveTrack(track); + //saveInteractor.saveTrack(track); playback.play(track.getStreamUrl()); updateMetadata(); } diff --git a/app/src/main/java/com/vpaliy/melophile/playback/service/MusicPlaybackService.java b/app/src/main/java/com/vpaliy/melophile/playback/service/MusicPlaybackService.java index ecf5324..9ed2a66 100644 --- a/app/src/main/java/com/vpaliy/melophile/playback/service/MusicPlaybackService.java +++ b/app/src/main/java/com/vpaliy/melophile/playback/service/MusicPlaybackService.java @@ -13,7 +13,7 @@ import android.support.v4.media.session.PlaybackStateCompat; import com.vpaliy.melophile.App; import com.vpaliy.melophile.playback.PlaybackManager; -import com.vpaliy.melophile.ui.track.TrackActivity; +import com.vpaliy.melophile.ui.player.PlayerActivity; import static com.vpaliy.melophile.playback.MediaHelper.MEDIA_ID_EMPTY_ROOT; import static com.vpaliy.melophile.playback.MediaHelper.MEDIA_ID_ROOT; import android.support.annotation.NonNull; @@ -47,7 +47,7 @@ public void onCreate() { MediaSessionCompat.FLAG_HANDLES_TRANSPORT_CONTROLS); setSessionToken(mediaSession.getSessionToken()); Context context = getApplicationContext(); - Intent intent = new Intent(context, TrackActivity.class); + Intent intent = new Intent(context, PlayerActivity.class); PendingIntent pi = PendingIntent.getActivity(context, 99, intent, PendingIntent.FLAG_UPDATE_CURRENT); mediaSession.setSessionActivity(pi); diff --git a/app/src/main/java/com/vpaliy/melophile/playback/service/TrackNotification.java b/app/src/main/java/com/vpaliy/melophile/playback/service/TrackNotification.java index 7c3ace8..99d1dd3 100644 --- a/app/src/main/java/com/vpaliy/melophile/playback/service/TrackNotification.java +++ b/app/src/main/java/com/vpaliy/melophile/playback/service/TrackNotification.java @@ -18,7 +18,7 @@ import com.bumptech.glide.request.animation.GlideAnimation; import com.bumptech.glide.request.target.SimpleTarget; import com.vpaliy.melophile.R; -import com.vpaliy.melophile.ui.track.TrackActivity; +import com.vpaliy.melophile.ui.player.PlayerActivity; public class TrackNotification { @@ -105,7 +105,7 @@ public void pauseNotification(){ } private PendingIntent contentIntent(Context context){ - Intent startActivityIntent=new Intent(context, TrackActivity.class); + Intent startActivityIntent=new Intent(context, PlayerActivity.class); startActivityIntent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP | Intent.FLAG_ACTIVITY_CLEAR_TOP); return PendingIntent.getActivity(context, diff --git a/app/src/main/java/com/vpaliy/melophile/ui/base/BaseActivity.java b/app/src/main/java/com/vpaliy/melophile/ui/base/BaseActivity.java index e484651..73c75b3 100644 --- a/app/src/main/java/com/vpaliy/melophile/ui/base/BaseActivity.java +++ b/app/src/main/java/com/vpaliy/melophile/ui/base/BaseActivity.java @@ -7,7 +7,6 @@ import android.support.annotation.CallSuper; import android.support.annotation.NonNull; import android.support.annotation.Nullable; -import android.util.Log; import javax.inject.Inject; @@ -16,7 +15,7 @@ public abstract class BaseActivity extends AppCompatActivity { protected CompositeDisposable disposables; @Inject - protected RxBus eventBus; + protected RxBus rxBus; @Inject protected Navigator navigator; @@ -42,7 +41,7 @@ protected void onCreate(@Nullable Bundle savedInstanceState) { @Override protected void onResume() { super.onResume(); - disposables.add(eventBus.asFlowable() + disposables.add(rxBus.asFlowable() .subscribe(this::processEvent)); } diff --git a/app/src/main/java/com/vpaliy/melophile/ui/base/BaseAdapter.java b/app/src/main/java/com/vpaliy/melophile/ui/base/BaseAdapter.java index d09b7ab..914bfa2 100644 --- a/app/src/main/java/com/vpaliy/melophile/ui/base/BaseAdapter.java +++ b/app/src/main/java/com/vpaliy/melophile/ui/base/BaseAdapter.java @@ -1,9 +1,8 @@ package com.vpaliy.melophile.ui.base; + import android.content.Context; -import android.os.Handler; import android.support.annotation.LayoutRes; import android.support.v7.widget.RecyclerView; -import android.util.Log; import android.view.LayoutInflater; import android.view.View; import java.util.ArrayList; diff --git a/app/src/main/java/com/vpaliy/melophile/ui/base/BaseFragment.java b/app/src/main/java/com/vpaliy/melophile/ui/base/BaseFragment.java index b62c8e6..283d170 100644 --- a/app/src/main/java/com/vpaliy/melophile/ui/base/BaseFragment.java +++ b/app/src/main/java/com/vpaliy/melophile/ui/base/BaseFragment.java @@ -1,20 +1,18 @@ package com.vpaliy.melophile.ui.base; import android.os.Bundle; -import android.support.annotation.LayoutRes; -import android.support.annotation.StringRes; import android.support.design.widget.Snackbar; import android.support.v4.app.Fragment; import android.view.LayoutInflater; import android.view.View; - import com.vpaliy.melophile.R; import com.vpaliy.melophile.ui.base.bus.RxBus; import butterknife.ButterKnife; import butterknife.Unbinder; -import android.support.annotation.Nullable; import android.view.ViewGroup; - +import android.support.annotation.Nullable; +import android.support.annotation.LayoutRes; +import android.support.annotation.StringRes; import javax.inject.Inject; public abstract class BaseFragment extends Fragment { @@ -51,12 +49,18 @@ public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, return view; } - protected void showMessage(@StringRes int res){ + public void showMessage(@StringRes int res){ if(getView()!=null){ Snackbar.make(getView(),res,getResources().getInteger(R.integer.message_duration)); } } + public void showMessage(String message){ + if(getView()!=null){ + Snackbar.make(getView(),message,getResources().getInteger(R.integer.message_duration)); + } + } + @LayoutRes protected int layoutId(){ return -1; } diff --git a/app/src/main/java/com/vpaliy/melophile/ui/base/BasePresenter.java b/app/src/main/java/com/vpaliy/melophile/ui/base/BasePresenter.java index 5353dfd..e83cdf9 100644 --- a/app/src/main/java/com/vpaliy/melophile/ui/base/BasePresenter.java +++ b/app/src/main/java/com/vpaliy/melophile/ui/base/BasePresenter.java @@ -1,6 +1,5 @@ package com.vpaliy.melophile.ui.base; -import android.support.annotation.NonNull; public interface BasePresenter { - void attachView(@NonNull V view); + void attachView(V view); } \ No newline at end of file diff --git a/app/src/main/java/com/vpaliy/melophile/ui/base/BaseView.java b/app/src/main/java/com/vpaliy/melophile/ui/base/BaseView.java index 721ca07..21d5a08 100644 --- a/app/src/main/java/com/vpaliy/melophile/ui/base/BaseView.java +++ b/app/src/main/java/com/vpaliy/melophile/ui/base/BaseView.java @@ -1,7 +1,5 @@ package com.vpaliy.melophile.ui.base; -import android.support.annotation.NonNull; - public interface BaseView

> { - void attachPresenter(@NonNull P presenter); + void attachPresenter(P presenter); } \ No newline at end of file diff --git a/app/src/main/java/com/vpaliy/melophile/ui/base/Navigator.java b/app/src/main/java/com/vpaliy/melophile/ui/base/Navigator.java index e5860b7..f0a4ef4 100644 --- a/app/src/main/java/com/vpaliy/melophile/ui/base/Navigator.java +++ b/app/src/main/java/com/vpaliy/melophile/ui/base/Navigator.java @@ -6,11 +6,10 @@ import android.support.v4.app.ActivityOptionsCompat; import android.support.v4.util.Pair; import android.view.View; - import com.vpaliy.melophile.ui.base.bus.event.ExposeEvent; import com.vpaliy.melophile.ui.playlist.PlaylistActivity; import com.vpaliy.melophile.ui.search.SearchActivity; -import com.vpaliy.melophile.ui.track.TrackActivity; +import com.vpaliy.melophile.ui.player.PlayerActivity; import com.vpaliy.melophile.ui.user.PersonActivity; import com.vpaliy.melophile.ui.utils.Constants; import com.vpaliy.melophile.ui.utils.Permission; @@ -21,7 +20,7 @@ public void navigate(Activity activity, ExposeEvent exposeEvent){ Class clazz=PlaylistActivity.class; switch (exposeEvent.code){ case ExposeEvent.PLAYER: - clazz= TrackActivity.class; + clazz= PlayerActivity.class; break; case ExposeEvent.USER: clazz= PersonActivity.class; diff --git a/app/src/main/java/com/vpaliy/melophile/ui/home/HomeActivity.java b/app/src/main/java/com/vpaliy/melophile/ui/home/HomeActivity.java index c9982c7..7c16866 100644 --- a/app/src/main/java/com/vpaliy/melophile/ui/home/HomeActivity.java +++ b/app/src/main/java/com/vpaliy/melophile/ui/home/HomeActivity.java @@ -142,7 +142,7 @@ private void showFavorites(InfoEvent event){ } private void setHomePager(){ - homePager.setAdapter(new HomePagerAdapter(getSupportFragmentManager(),this)); + homePager.setAdapter(new HomePagerAdapter(getSupportFragmentManager())); homePager.setOffscreenPageLimit(4); } diff --git a/app/src/main/java/com/vpaliy/melophile/ui/home/HomePagerAdapter.java b/app/src/main/java/com/vpaliy/melophile/ui/home/HomePagerAdapter.java index 184a687..4eb8961 100644 --- a/app/src/main/java/com/vpaliy/melophile/ui/home/HomePagerAdapter.java +++ b/app/src/main/java/com/vpaliy/melophile/ui/home/HomePagerAdapter.java @@ -1,21 +1,16 @@ package com.vpaliy.melophile.ui.home; -import android.content.Context; import android.support.v4.app.Fragment; import android.support.v4.app.FragmentManager; import android.support.v4.app.FragmentStatePagerAdapter; - import com.vpaliy.melophile.ui.personal.PersonalFragment; import com.vpaliy.melophile.ui.playlists.PlaylistsFragment; import com.vpaliy.melophile.ui.tracks.TracksFragment; public class HomePagerAdapter extends FragmentStatePagerAdapter { - private Context context; - - public HomePagerAdapter(FragmentManager manager, Context context){ + HomePagerAdapter(FragmentManager manager){ super(manager); - this.context=context; } @Override @@ -34,5 +29,4 @@ public Fragment getItem(int position) { return new PersonalFragment(); } } - } \ No newline at end of file diff --git a/app/src/main/java/com/vpaliy/melophile/ui/personal/PersonalAdapter.java b/app/src/main/java/com/vpaliy/melophile/ui/personal/PersonalAdapter.java index b8c6a15..f1812a2 100644 --- a/app/src/main/java/com/vpaliy/melophile/ui/personal/PersonalAdapter.java +++ b/app/src/main/java/com/vpaliy/melophile/ui/personal/PersonalAdapter.java @@ -13,7 +13,6 @@ import com.vpaliy.melophile.ui.base.BaseAdapter; import com.vpaliy.melophile.ui.base.bus.RxBus; import com.vpaliy.melophile.ui.user.info.InfoEvent; -import java.util.Locale; import butterknife.ButterKnife; import butterknife.BindView; import android.support.annotation.NonNull; diff --git a/app/src/main/java/com/vpaliy/melophile/ui/personal/PersonalContract.java b/app/src/main/java/com/vpaliy/melophile/ui/personal/PersonalContract.java index 6cea991..5096945 100644 --- a/app/src/main/java/com/vpaliy/melophile/ui/personal/PersonalContract.java +++ b/app/src/main/java/com/vpaliy/melophile/ui/personal/PersonalContract.java @@ -9,15 +9,14 @@ public interface PersonalContract { interface View extends BaseView { - void attachPresenter(@NonNull Presenter presenter); - void showTrackHistory(@NonNull List tracks); + void attachPresenter(Presenter presenter); + void showTrackHistory(List tracks); void showMyself(User user); - void showEmptyHistoryMessage(); - void showErrorMessage(); + void showMessage(String message); } interface Presenter extends BasePresenter { - void attachView(@NonNull View view); + void attachView(View view); void start(); void stop(); void clearTracks(); diff --git a/app/src/main/java/com/vpaliy/melophile/ui/personal/PersonalFragment.java b/app/src/main/java/com/vpaliy/melophile/ui/personal/PersonalFragment.java index 25a6586..f712133 100644 --- a/app/src/main/java/com/vpaliy/melophile/ui/personal/PersonalFragment.java +++ b/app/src/main/java/com/vpaliy/melophile/ui/personal/PersonalFragment.java @@ -13,7 +13,6 @@ import android.support.v7.widget.RecyclerView; import android.view.View; import static com.vpaliy.melophile.ui.personal.PersonalContract.Presenter; - import android.support.annotation.Nullable; import android.support.annotation.NonNull; import javax.inject.Inject; @@ -59,15 +58,11 @@ public void onViewCreated(View view, @Nullable Bundle savedInstanceState) { } } - @Override + /* @Override public void showEmptyHistoryMessage() { adapter.addItem(PersonalAdapter.CategoryWrapper.wrap(getString(R.string.no_played_history_label),null)); - } + } */ - @Override - public void showErrorMessage() { - - } @Override public void showTrackHistory(@NonNull List tracks) { diff --git a/app/src/main/java/com/vpaliy/melophile/ui/personal/PersonalPresenter.java b/app/src/main/java/com/vpaliy/melophile/ui/personal/PersonalPresenter.java index 98766e6..50682df 100644 --- a/app/src/main/java/com/vpaliy/melophile/ui/personal/PersonalPresenter.java +++ b/app/src/main/java/com/vpaliy/melophile/ui/personal/PersonalPresenter.java @@ -18,6 +18,8 @@ public class PersonalPresenter implements PersonalContract.Presenter{ private SingleInteractor myself; private SingleInteractor,Void> trackHistory; private SingleInteractor,Void> playlistHistory; + private SingleInteractor,Void> favoritePlaylists; + private SingleInteractor,Void> favoriteTracks; @Inject public PersonalPresenter(SingleInteractor trackHistory, @@ -45,7 +47,7 @@ public void stop() { private void catchTrackHistory(List tracks){ if(tracks==null||tracks.isEmpty()){ - view.showEmptyHistoryMessage(); + // view.showEmptyHistoryMessage(); return; } view.showTrackHistory(tracks); @@ -63,7 +65,7 @@ public void clearTracks() { } private void catchError(Throwable ex){ - view.showErrorMessage(); + // view.showErrorMessage(); ex.printStackTrace(); } } diff --git a/app/src/main/java/com/vpaliy/melophile/ui/track/TrackFragment.java b/app/src/main/java/com/vpaliy/melophile/ui/player/PlayerActivity.java similarity index 83% rename from app/src/main/java/com/vpaliy/melophile/ui/track/TrackFragment.java rename to app/src/main/java/com/vpaliy/melophile/ui/player/PlayerActivity.java index 581ddcd..7cde6d2 100644 --- a/app/src/main/java/com/vpaliy/melophile/ui/track/TrackFragment.java +++ b/app/src/main/java/com/vpaliy/melophile/ui/player/PlayerActivity.java @@ -1,10 +1,23 @@ -package com.vpaliy.melophile.ui.track; +package com.vpaliy.melophile.ui.player; import android.content.ComponentName; -import android.content.res.Configuration; +import android.content.Intent; import android.graphics.Bitmap; -import android.graphics.drawable.GradientDrawable; import android.os.Bundle; +import com.bumptech.glide.Glide; +import com.bumptech.glide.Priority; +import com.bumptech.glide.request.target.ImageViewTarget; +import com.google.gson.reflect.TypeToken; +import com.ohoussein.playpause.PlayPauseView; +import com.vpaliy.domain.playback.QueueManager; +import com.vpaliy.melophile.App; +import com.vpaliy.melophile.R; +import com.vpaliy.melophile.playback.PlaybackManager; +import com.vpaliy.melophile.playback.service.MusicPlaybackService; +import com.vpaliy.melophile.ui.base.BaseActivity; +import com.vpaliy.melophile.ui.utils.BundleUtils; +import com.vpaliy.melophile.ui.utils.Constants; +import com.vpaliy.melophile.ui.utils.PresentationUtils; import android.os.Handler; import android.os.RemoteException; import android.os.SystemClock; @@ -21,38 +34,24 @@ import android.widget.ImageView; import android.widget.SeekBar; import android.widget.TextView; -import com.bumptech.glide.Glide; -import com.bumptech.glide.Priority; -import com.bumptech.glide.request.target.ImageViewTarget; -import com.google.gson.reflect.TypeToken; -import com.ohoussein.playpause.PlayPauseView; -import com.vpaliy.domain.playback.Playback; -import com.vpaliy.domain.playback.QueueManager; -import com.vpaliy.melophile.App; -import com.vpaliy.melophile.R; -import com.vpaliy.melophile.playback.service.MusicPlaybackService; -import com.vpaliy.melophile.playback.PlaybackManager; -import com.vpaliy.melophile.ui.base.BaseFragment; -import com.vpaliy.melophile.ui.utils.BundleUtils; -import com.vpaliy.melophile.ui.utils.Constants; -import com.vpaliy.melophile.ui.utils.PresentationUtils; - -import java.util.Locale; import java.util.concurrent.Executors; import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.ScheduledFuture; import java.util.concurrent.TimeUnit; import jp.wasabeef.blurry.Blurry; + import static android.view.View.INVISIBLE; import static android.view.View.VISIBLE; -import butterknife.OnClick; + import javax.inject.Inject; -import android.support.annotation.Nullable; import butterknife.BindView; +import butterknife.OnClick; +import android.support.annotation.NonNull; +import android.support.annotation.Nullable; -public class TrackFragment extends BaseFragment { +public class PlayerActivity extends BaseActivity { - private static final String TAG=TrackFragment.class.getSimpleName(); + private static final String TAG=PlayerActivity.class.getSimpleName(); @BindView(R.id.background) protected ImageView background; @@ -109,10 +108,10 @@ public void onConnected() { super.onConnected(); MediaSessionCompat.Token token=browserCompat.getSessionToken(); try { - MediaControllerCompat mediaController =new MediaControllerCompat(getActivity(), token); + MediaControllerCompat mediaController =new MediaControllerCompat(PlayerActivity.this, token); // Save the controller mediaController.registerCallback(controllerCallback); - MediaControllerCompat.setMediaController(getActivity(), mediaController); + MediaControllerCompat.setMediaController(PlayerActivity.this, mediaController); //inject the passed query inject(); }catch (RemoteException ex){ @@ -136,6 +135,35 @@ public void onMetadataChanged(MediaMetadataCompat metadata) { } }; + @Override + protected void onCreate(@Nullable Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_playlist); + getWindow().getDecorView().setSystemUiVisibility( + View.SYSTEM_UI_FLAG_LAYOUT_STABLE | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN); + postponeEnterTransition(); + loadArt(); + browserCompat=new MediaBrowserCompat(this, + new ComponentName(this, MusicPlaybackService.class), connectionCallback,null); + progress.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() { + @Override + public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) { + startTime.setText(DateUtils.formatElapsedTime(progress/1000)); + } + + @Override + public void onStartTrackingTouch(SeekBar seekBar) { + stopSeekBarUpdate(); + } + + @Override + public void onStopTrackingTouch(SeekBar seekBar) { + getControls().seekTo(seekBar.getProgress()); + startSeekBarUpdate(); + } + }); + } + @Override public void onStart() { super.onStart(); @@ -151,14 +179,14 @@ public void onStop() { if(browserCompat!=null){ browserCompat.disconnect(); } - MediaControllerCompat controllerCompat=MediaControllerCompat.getMediaController(getActivity()); + MediaControllerCompat controllerCompat=MediaControllerCompat.getMediaController(this); if(controllerCompat!=null){ controllerCompat.unregisterCallback(controllerCallback); } } private void startSeekBarUpdate(){ - scheduledFuture = executorService.scheduleAtFixedRate(()-> handler.post(TrackFragment.this::updateProgress), + scheduledFuture = executorService.scheduleAtFixedRate(()-> handler.post(PlayerActivity.this::updateProgress), PROGRESS_UPDATE_INITIAL_INTERVAL, PROGRESS_UPDATE_INTERNAL, TimeUnit.MILLISECONDS); } @@ -179,7 +207,7 @@ public void onDestroy() { @OnClick(R.id.play_pause) public void playPause(){ lastState=null; - MediaControllerCompat controllerCompat=MediaControllerCompat.getMediaController(getActivity()); + MediaControllerCompat controllerCompat=MediaControllerCompat.getMediaController(this); PlaybackStateCompat stateCompat=controllerCompat.getPlaybackState(); if(stateCompat!=null){ MediaControllerCompat.TransportControls controls= @@ -248,12 +276,15 @@ private boolean isActionApplied(long actions, long action){ @Inject public void updateQueue(PlaybackManager manager){ - QueueManager queueManager=BundleUtils.fetchHeavyObject(new TypeToken() {}.getType(), - getArguments(),Constants.EXTRA_QUEUE); - if(queueManager!=null) { - manager.setQueueManager(queueManager); - manager.handleResumeRequest(); - playPause.change(false); + final Intent intent=getIntent(); + if(intent!=null) { + QueueManager queueManager = BundleUtils.fetchHeavyObject(new TypeToken() {}. + getType(), intent.getExtras(),Constants.EXTRA_QUEUE); + if (queueManager != null) { + manager.setQueueManager(queueManager); + manager.handleResumeRequest(); + playPause.change(false); + } } } @@ -268,7 +299,7 @@ public void playPrev(){ } private MediaControllerCompat.TransportControls transportControls(){ - MediaControllerCompat controllerCompat=MediaControllerCompat.getMediaController(getActivity()); + MediaControllerCompat controllerCompat=MediaControllerCompat.getMediaController(this); return controllerCompat.getTransportControls(); } @@ -286,50 +317,17 @@ private void updateProgress() { } } - public static TrackFragment newInstance(Bundle args){ - TrackFragment fragment=new TrackFragment(); - fragment.setArguments(args); - return fragment; - } - - private void inject(){ - if(!isInjected) { - isInjected=true; - App.appInstance() - .playerComponent() - .inject(this); - } + @Override + public void inject() { + App.appInstance().appComponent().inject(this); } @Override - public void onViewCreated(View view, @Nullable Bundle savedInstanceState) { - super.onViewCreated(view, savedInstanceState); - getActivity().supportPostponeEnterTransition(); - loadArt(); - browserCompat=new MediaBrowserCompat(getActivity(), - new ComponentName(getActivity(), MusicPlaybackService.class), - connectionCallback,null); - progress.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() { - @Override - public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) { - startTime.setText(DateUtils.formatElapsedTime(progress/1000)); - } - - @Override - public void onStartTrackingTouch(SeekBar seekBar) { - stopSeekBarUpdate(); - } - - @Override - public void onStopTrackingTouch(SeekBar seekBar) { - getControls().seekTo(seekBar.getProgress()); - startSeekBarUpdate(); - } - }); + public void handleEvent(@NonNull Object event) { } private void loadArt(){ - Bundle bundle=getArguments(); + Bundle bundle=getIntent().getExtras(); if(bundle!=null){ String art=bundle.getString(Constants.EXTRA_DATA,null); if(art!=null){ @@ -339,13 +337,13 @@ private void loadArt(){ } private MediaControllerCompat.TransportControls getControls(){ - return MediaControllerCompat.getMediaController(getActivity()).getTransportControls(); + return MediaControllerCompat.getMediaController(this).getTransportControls(); } public void showArt(String artUrl){ if(!TextUtils.equals(lastArtUrl,artUrl)) { lastArtUrl=artUrl; - Glide.with(getContext()) + Glide.with(this) .load(artUrl) .asBitmap() .priority(Priority.IMMEDIATE) @@ -354,10 +352,10 @@ public void showArt(String artUrl){ protected void setResource(Bitmap resource) { smallImage.setImageBitmap(resource); smallImage.post(()->{ - Blurry.with(getContext()) + Blurry.with(PlayerActivity.this) .async(bitmap->{ background.setImageDrawable(bitmap); - getActivity().supportStartPostponedEnterTransition(); + supportStartPostponedEnterTransition(); }) .from(resource) .into(background); @@ -368,14 +366,14 @@ protected void setResource(Bitmap resource) { } private void updateShuffleMode(boolean isShuffled){ - int color=isShuffled ? ContextCompat.getColor(getContext(),R.color.enabled_action) : - ContextCompat.getColor(getContext(),R.color.white_50); + int color=isShuffled ? ContextCompat.getColor(this,R.color.enabled_action) : + ContextCompat.getColor(this,R.color.white_50); PresentationUtils.setDrawableColor(shuffle,color); } private void updateRepeatMode(boolean isRepeat){ - int color=isRepeat ? ContextCompat.getColor(getContext(),R.color.enabled_action) : - ContextCompat.getColor(getContext(),R.color.white_50); + int color=isRepeat ? ContextCompat.getColor(this,R.color.enabled_action) : + ContextCompat.getColor(this,R.color.white_50); PresentationUtils.setDrawableColor(repeat,color); } @@ -408,9 +406,4 @@ private void updateArt(MediaMetadataCompat metadataCompat){ String imageUrl=metadataCompat.getString(MediaMetadataCompat.METADATA_KEY_ALBUM_ART_URI); showArt(imageUrl); } - - @Override - protected int layoutId() { - return R.layout.fragment_player; - } } diff --git a/app/src/main/java/com/vpaliy/melophile/ui/playlist/PlaylistActivity.java b/app/src/main/java/com/vpaliy/melophile/ui/playlist/PlaylistActivity.java index 48560c5..e7411f2 100644 --- a/app/src/main/java/com/vpaliy/melophile/ui/playlist/PlaylistActivity.java +++ b/app/src/main/java/com/vpaliy/melophile/ui/playlist/PlaylistActivity.java @@ -1,51 +1,343 @@ package com.vpaliy.melophile.ui.playlist; +import android.animation.Animator; +import android.animation.AnimatorListenerAdapter; +import android.content.res.ColorStateList; +import android.graphics.Bitmap; import android.os.Bundle; -import com.vpaliy.melophile.App; +import com.bumptech.glide.Glide; +import com.bumptech.glide.Priority; +import com.bumptech.glide.request.target.ImageViewTarget; +import com.google.gson.reflect.TypeToken; +import com.vpaliy.domain.model.Track; +import com.vpaliy.domain.model.User; +import com.vpaliy.domain.playback.QueueManager; import com.vpaliy.melophile.R; import com.vpaliy.melophile.ui.base.BaseActivity; import com.vpaliy.melophile.ui.base.bus.event.ExposeEvent; +import com.vpaliy.melophile.ui.utils.BundleUtils; import com.vpaliy.melophile.ui.utils.Constants; - +import com.vpaliy.melophile.ui.view.Chips; +import com.vpaliy.melophile.ui.view.FabToggle; +import com.vpaliy.melophile.ui.view.ParallaxRatioImageView; +import com.vpaliy.melophile.ui.view.TranslatableLayout; +import android.support.v4.util.Pair; +import android.support.v4.view.ViewCompat; +import android.support.v7.graphics.Palette; +import android.support.v7.widget.RecyclerView; +import android.view.View; +import android.view.ViewAnimationUtils; +import android.view.ViewGroup; +import android.view.animation.OvershootInterpolator; +import android.widget.ImageView; +import android.widget.TextView; +import java.util.Arrays; +import java.util.List; import android.support.annotation.NonNull; import android.support.annotation.Nullable; -import android.view.View; +import javax.inject.Inject; +import butterknife.BindView; +import butterknife.OnClick; + +public class PlaylistActivity extends BaseActivity + implements PlaylistContract.View { + + private PlaylistContract.Presenter presenter; + private String id; + + @BindView(R.id.playlist_art) + protected ParallaxRatioImageView playlistArt; + + @BindView(R.id.tracks) + protected RecyclerView tracks; + + @BindView(R.id.play) + protected FabToggle toggle; + + @BindView(R.id.parent) + protected TranslatableLayout parent; + + @BindView(R.id.playlist_title) + protected TextView playlistTitle; + + @BindView(R.id.tracks_number) + protected TextView trackNumber; -public class PlaylistActivity extends BaseActivity { + @BindView(R.id.share) + protected TextView shareButton; - private Bundle data; + @BindView(R.id.back) + protected ImageView back; + + @BindView(R.id.author) + protected TextView user; + + @BindView(R.id.user_avatar) + protected ImageView userAvatar; + + @BindView(R.id.time) + protected TextView duration; + + @BindView(R.id.title_background) + protected View titleBackground; + + @BindView(R.id.chips) + protected Chips chipsLayout; + + private PlaylistTrackAdapter adapter; + + private boolean loaded; + + private User userModel; @Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); - setContentView(R.layout.activity_playlist); - getWindow().getDecorView().setSystemUiVisibility( - View.SYSTEM_UI_FLAG_LAYOUT_STABLE - | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN); - if(savedInstanceState==null) { + setContentView(R.layout.fragment_playlist); + getWindow().getDecorView() + .setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_STABLE + |View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN); + postponeEnterTransition(); + if(savedInstanceState==null){ savedInstanceState=getIntent().getExtras(); } - data=savedInstanceState.getBundle(Constants.EXTRA_DATA); - getSupportFragmentManager().beginTransaction() - .replace(R.id.frame, PlaylistFragment.newInstance(data)) - .commit(); + parent.addOnLayoutChangeListener(((v, left, top, right, bottom, oldLeft, oldTop, oldRight, oldBottom) -> { + View blank=adapter.getBlank(); + if(blank!=null) { + ViewGroup.LayoutParams params = blank.getLayoutParams(); + params.height = playlistArt.getHeight() + parent.getHeight(); + blank.setLayoutParams(params); + } + })); + adapter=new PlaylistTrackAdapter(this,null); + tracks.setAdapter(adapter); + loadCover(savedInstanceState); + extractId(savedInstanceState); + + } + + private void loadCover(Bundle bundle){ + showPlaylistArt(bundle.getString(Constants.EXTRA_DATA)); + } + + private void extractId(Bundle bundle){ + id=bundle.getString(Constants.EXTRA_ID); + } + + @Override + protected void onStart() { + super.onStart(); + if(presenter!=null){ + presenter.start(id); + } + } + + @Override + public void showTrackNumber(int trackNumber) { + this.trackNumber.setText(getResources() + .getQuantityString(R.plurals.likes,trackNumber, trackNumber)); } @Override public void inject() { - App.appInstance().appComponent().inject(this); + + } + + @Override + public void handleEvent(@NonNull Object event) { + + } + + @Override + public void showMessage(int resource) { + + } + + @Override + public void showTitle(String title) { + playlistTitle.setText(title); + playlistTitle.setScaleX(0);playlistTitle.setScaleY(0); + titleBackground.post(()->{ + int cx=titleBackground.getWidth()/2; + int cy=titleBackground.getHeight()/2; + Animator animator= ViewAnimationUtils.createCircularReveal(titleBackground,cx,cy,0, + (int)Math.hypot(titleBackground.getWidth(),titleBackground.getHeight())); + animator.setDuration(400); + animator.addListener(new AnimatorListenerAdapter() { + @Override + public void onAnimationStart(Animator animation) { + super.onAnimationStart(animation); + titleBackground.setVisibility(View.VISIBLE); + playlistTitle.animate() + .setDuration(400) + .scaleX(1).scaleY(1) + .setInterpolator(new OvershootInterpolator()) + .start(); + } + }); + animator.start(); + }); } @Override - protected void onSaveInstanceState(Bundle outState) { + public void showTags(List tags) { + chipsLayout.setTags(tags); + /* chipsLayout.setOnTouchListener((view,event)->{ + tracks.dispatchTouchEvent(event); + return false; + }); */ + } + + @Override + public void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); - outState.putBundle(Constants.EXTRA_DATA,data); + outState.putString(id, Constants.EXTRA_ID); } @Override - public void handleEvent(@NonNull Object event) { - if(event instanceof ExposeEvent){ - navigator.navigate(this,(ExposeEvent)(event)); + public void showButtons() { + List buttons= Arrays.asList(shareButton,trackNumber,duration); + for(int index=0;index(playlistArt) { + @Override + protected void setResource(Bitmap resource) { + final int imageHeight=playlistArt.getHeight(); + playlistArt.setImageBitmap(resource); + parent.setStaticOffset(imageHeight); + parent.setOffset(imageHeight); + toggle.setStaticOffset(imageHeight- toggle.getHeight()/2); + toggle.setOffset(imageHeight- toggle.getHeight()/2); + toggle.setMinOffset(ViewCompat.getMinimumHeight(playlistArt)- toggle.getHeight()/2); + tracks.addOnScrollListener(listener); + tracks.setOnFlingListener(flingListener); + new Palette.Builder(resource).generate(PlaylistActivity.this::applyPalette); + supportStartPostponedEnterTransition(); + } + }); + } + } + + @OnClick(R.id.play) + public void play(){ + List tracks=adapter.getTracks(); + if(tracks!=null && !tracks.isEmpty()){ + QueueManager queueManager=QueueManager.createQueue(tracks,0); + Bundle data=new Bundle(); + BundleUtils.packHeavyObject(data,Constants.EXTRA_QUEUE,queueManager, + new TypeToken(){}.getType()); + rxBus.sendWithLock(ExposeEvent.exposeTrack(data,null)); + } + } + + private void applyPalette(Palette palette){ + Palette.Swatch swatch=palette.getDarkVibrantSwatch(); + if(swatch==null) swatch=palette.getDominantSwatch(); + if(swatch!=null){ + toggle.setBackgroundTintList(ColorStateList.valueOf(swatch.getRgb())); + } + } + + @Override + public void showDuration(String duration) { + this.duration.setText(duration); + } + + @Override + public void showTracks(List tracks) { + adapter.setData(tracks); + } + + @Override + public void showUser(User user) { + this.userModel=user; + Glide.with(this) + .load(user.getAvatarUrl()) + .asBitmap() + .priority(Priority.IMMEDIATE) + .into(userAvatar); + this.user.setText(user.getNickName()); + } + + @OnClick(R.id.back) + public void goBack(){ + supportFinishAfterTransition(); + } + + @Inject + @Override + public void attachPresenter(@NonNull PlaylistContract.Presenter presenter) { + this.presenter=presenter; + this.presenter.attachView(this); + } + + private RecyclerView.OnFlingListener flingListener = new RecyclerView.OnFlingListener() { + @Override + public boolean onFling(int velocityX, int velocityY) { + playlistArt.setImmediatePin(true); + return false; + } + }; + + private RecyclerView.OnScrollListener listener=new RecyclerView.OnScrollListener() { + @Override + public void onScrollStateChanged(RecyclerView recyclerView, int newState) { + super.onScrollStateChanged(recyclerView, newState); + playlistArt.setImmediatePin(newState==RecyclerView.SCROLL_STATE_SETTLING); + } + + @Override + public void onScrolled(RecyclerView recyclerView, int dx, int dy) { + super.onScrolled(recyclerView, dx, dy); + final int scrollY= adapter.getBlank().getTop(); + playlistArt.setOffset(scrollY); + parent.setOffset(parent.getStaticOffset()+scrollY); + toggle.setOffset(toggle.getStaticOffset()+scrollY); + } + }; + + @Override + public void onStop() { + super.onStop(); + if(presenter!=null){ + presenter.stop(); + } + } + + @OnClick(R.id.user_avatar) + public void userClick(){ + if(userModel!=null) { + Bundle data = new Bundle(); + data.putString(Constants.EXTRA_ID,userModel.getId()); + data.putString(Constants.EXTRA_DATA,userModel.getAvatarUrl()); + preserveParent(); + rxBus.send(ExposeEvent.exposeUser(data, + Pair.create(userAvatar,getString(R.string.user_trans_name)))); + } + } + + private void preserveParent(){ + ViewGroup.LayoutParams params=parent.getLayoutParams(); + if(params.height!=parent.getBottom()){ + params.height=parent.getBottom(); + parent.setLayoutParams(params); } } } diff --git a/app/src/main/java/com/vpaliy/melophile/ui/playlist/PlaylistContract.java b/app/src/main/java/com/vpaliy/melophile/ui/playlist/PlaylistContract.java index 4abceed..7b41f7e 100644 --- a/app/src/main/java/com/vpaliy/melophile/ui/playlist/PlaylistContract.java +++ b/app/src/main/java/com/vpaliy/melophile/ui/playlist/PlaylistContract.java @@ -1,6 +1,6 @@ package com.vpaliy.melophile.ui.playlist; -import android.support.annotation.NonNull; +import android.support.annotation.StringRes; import com.vpaliy.domain.model.Track; import com.vpaliy.domain.model.User; @@ -11,7 +11,7 @@ public interface PlaylistContract { interface View extends BaseView { - void attachPresenter(@NonNull Presenter presenter); + void attachPresenter(Presenter presenter); void showPlaylistArt(String artUrl); void showTracks(List tracks); void showTags(List tags); @@ -20,13 +20,16 @@ interface View extends BaseView { void showButtons(); void showTrackNumber(int trackNumber); void showUser(User user); - void showErrorMessage(); - void showEmptyMessage(); + void showMessage(@StringRes int resource); } interface Presenter extends BasePresenter { - void attachView(@NonNull View view); + void attachView(View view); void stop(); void start(String id); + void save(); + void like(); + void unlike(); + void remove(); } } diff --git a/app/src/main/java/com/vpaliy/melophile/ui/playlist/PlaylistFragment.java b/app/src/main/java/com/vpaliy/melophile/ui/playlist/PlaylistFragment.java deleted file mode 100644 index dad9ea0..0000000 --- a/app/src/main/java/com/vpaliy/melophile/ui/playlist/PlaylistFragment.java +++ /dev/null @@ -1,378 +0,0 @@ -package com.vpaliy.melophile.ui.playlist; - -import android.animation.Animator; -import android.animation.AnimatorListenerAdapter; -import android.content.Intent; -import android.content.res.ColorStateList; -import android.graphics.Bitmap; -import android.os.Bundle; -import android.support.design.widget.Snackbar; -import android.support.v4.app.SharedElementCallback; -import android.support.v4.graphics.drawable.TintAwareDrawable; -import android.support.v4.util.Pair; -import android.support.v4.view.ViewCompat; -import android.support.v7.graphics.Palette; -import android.support.v7.widget.DividerItemDecoration; -import android.support.v7.widget.LinearLayoutManager; -import android.support.v7.widget.RecyclerView; -import android.util.Log; -import android.view.MotionEvent; -import android.view.View; -import android.view.ViewAnimationUtils; -import android.view.ViewGroup; -import com.bumptech.glide.Glide; -import com.bumptech.glide.Priority; -import com.bumptech.glide.request.target.ImageViewTarget; -import com.google.gson.reflect.TypeToken; -import com.vpaliy.chips_lover.ChipsLayout; -import com.vpaliy.domain.model.Track; -import com.vpaliy.domain.model.User; -import com.vpaliy.domain.playback.QueueManager; -import com.vpaliy.melophile.App; -import com.vpaliy.melophile.R; -import com.vpaliy.melophile.di.component.DaggerViewComponent; -import com.vpaliy.melophile.di.module.PresenterModule; -import com.vpaliy.melophile.ui.base.BaseFragment; -import com.vpaliy.melophile.ui.base.bus.event.ExposeEvent; -import com.vpaliy.melophile.ui.utils.BundleUtils; -import com.vpaliy.melophile.ui.utils.Constants; -import com.vpaliy.melophile.ui.view.Chips; -import com.vpaliy.melophile.ui.view.FabToggle; -import com.vpaliy.melophile.ui.view.ParallaxRatioImageView; -import com.vpaliy.melophile.ui.view.TranslatableLayout; - -import java.text.NumberFormat; -import java.util.Arrays; -import java.util.List; -import android.view.ViewTreeObserver; -import android.view.animation.OvershootInterpolator; -import android.widget.ImageView; -import android.widget.TextView; -import android.support.annotation.NonNull; -import android.support.annotation.Nullable; -import javax.inject.Inject; -import butterknife.BindView; -import butterknife.OnClick; - -import static com.vpaliy.melophile.ui.playlist.PlaylistContract.Presenter; - -public class PlaylistFragment extends BaseFragment - implements PlaylistContract.View{ - - private Presenter presenter; - private String id; - - @BindView(R.id.playlist_art) - protected ParallaxRatioImageView playlistArt; - - @BindView(R.id.tracks) - protected RecyclerView tracks; - - @BindView(R.id.play) - protected FabToggle toggle; - - @BindView(R.id.parent) - protected TranslatableLayout parent; - - @BindView(R.id.playlist_title) - protected TextView playlistTitle; - - @BindView(R.id.tracks_number) - protected TextView trackNumber; - - @BindView(R.id.share) - protected TextView shareButton; - - @BindView(R.id.back) - protected ImageView back; - - @BindView(R.id.author) - protected TextView user; - - @BindView(R.id.user_avatar) - protected ImageView userAvatar; - - @BindView(R.id.time) - protected TextView duration; - - @BindView(R.id.title_background) - protected View titleBackground; - - @BindView(R.id.chips) - protected Chips chipsLayout; - - private PlaylistTrackAdapter adapter; - - private boolean loaded; - - private User userModel; - - public static PlaylistFragment newInstance(Bundle args){ - PlaylistFragment fragment=new PlaylistFragment(); - fragment.setArguments(args); - return fragment; - } - - @Override - public void initializeDependencies() { - DaggerViewComponent.builder() - .applicationComponent(App.appInstance().appComponent()) - .presenterModule(new PresenterModule()) - .build().inject(this); - } - - @Override - public void onCreate(@Nullable Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - extractId(savedInstanceState); - } - - @Override - protected int layoutId() { - return R.layout.fragment_playlist; - } - - @Override - public void onViewCreated(View view, @Nullable Bundle savedInstanceState) { - super.onViewCreated(view, savedInstanceState); - getActivity().supportPostponeEnterTransition(); - if(view!=null){ - parent.addOnLayoutChangeListener(((v, left, top, right, bottom, oldLeft, oldTop, oldRight, oldBottom) -> { - View blank=adapter.getBlank(); - if(blank!=null) { - ViewGroup.LayoutParams params = blank.getLayoutParams(); - params.height = playlistArt.getHeight() + parent.getHeight(); - blank.setLayoutParams(params); - } - })); - adapter=new PlaylistTrackAdapter(getContext(),rxBus); - tracks.setAdapter(adapter); - loadCover(savedInstanceState); - } - } - - @Override - public void onStart() { - super.onStart(); - if(presenter!=null){ - presenter.start(id); - } - } - - private void loadCover(Bundle bundle){ - if(bundle==null){ - bundle=getArguments(); - } - showPlaylistArt(bundle.getString(Constants.EXTRA_DATA)); - } - - private void extractId(Bundle bundle){ - if(bundle==null){ - bundle=getArguments(); - } - id=bundle.getString(Constants.EXTRA_ID); - } - - @Override - public void showEmptyMessage() { - showMessage(R.string.empty_message); - } - - @Override - public void showErrorMessage() { - showMessage(R.string.error_message); - } - - @Override - public void showTrackNumber(int trackNumber) { - this.trackNumber.setText(getResources().getQuantityString(R.plurals.likes,trackNumber, trackNumber)); - } - - @Override - public void showTitle(String title) { - playlistTitle.setText(title); - playlistTitle.setScaleX(0);playlistTitle.setScaleY(0); - titleBackground.post(()->{ - int cx=titleBackground.getWidth()/2; - int cy=titleBackground.getHeight()/2; - Animator animator=ViewAnimationUtils.createCircularReveal(titleBackground,cx,cy,0, - (int)Math.hypot(titleBackground.getWidth(),titleBackground.getHeight())); - animator.setDuration(400); - animator.addListener(new AnimatorListenerAdapter() { - @Override - public void onAnimationStart(Animator animation) { - super.onAnimationStart(animation); - titleBackground.setVisibility(View.VISIBLE); - playlistTitle.animate() - .setDuration(400) - .scaleX(1).scaleY(1) - .setInterpolator(new OvershootInterpolator()) - .start(); - } - }); - animator.start(); - }); - } - - @Override - public void showTags(List tags) { - chipsLayout.setTags(tags); - chipsLayout.setOnTouchListener((view,event)->{ - tracks.dispatchTouchEvent(event); - return false; - }); - } - - @Override - public void onSaveInstanceState(Bundle outState) { - super.onSaveInstanceState(outState); - outState.putString(id,Constants.EXTRA_ID); - } - - @Override - public void showButtons() { - List buttons= Arrays.asList(shareButton,trackNumber,duration); - for(int index=0;index(playlistArt) { - @Override - protected void setResource(Bitmap resource) { - final int imageHeight=playlistArt.getHeight(); - playlistArt.setImageBitmap(resource); - parent.setStaticOffset(imageHeight); - parent.setOffset(imageHeight); - toggle.setStaticOffset(imageHeight- toggle.getHeight()/2); - toggle.setOffset(imageHeight- toggle.getHeight()/2); - toggle.setMinOffset(ViewCompat.getMinimumHeight(playlistArt)- toggle.getHeight()/2); - tracks.addOnScrollListener(listener); - tracks.setOnFlingListener(flingListener); - new Palette.Builder(resource).generate(PlaylistFragment.this::applyPalette); - getActivity().supportStartPostponedEnterTransition(); - } - }); - } - } - - @OnClick(R.id.play) - public void play(){ - List tracks=adapter.getTracks(); - if(tracks!=null && !tracks.isEmpty()){ - QueueManager queueManager=QueueManager.createQueue(tracks,0); - Bundle data=new Bundle(); - BundleUtils.packHeavyObject(data,Constants.EXTRA_QUEUE,queueManager, - new TypeToken(){}.getType()); - rxBus.sendWithLock(ExposeEvent.exposeTrack(data,null)); - } - } - - private void applyPalette(Palette palette){ - Palette.Swatch swatch=palette.getDarkVibrantSwatch(); - if(swatch==null) swatch=palette.getDominantSwatch(); - if(swatch!=null){ - toggle.setBackgroundTintList(ColorStateList.valueOf(swatch.getRgb())); - } - } - - @Override - public void showDuration(String duration) { - this.duration.setText(duration); - } - - @Override - public void showTracks(List tracks) { - adapter.setData(tracks); - } - - @Override - public void showUser(User user) { - this.userModel=user; - Glide.with(getContext()) - .load(user.getAvatarUrl()) - .asBitmap() - .priority(Priority.IMMEDIATE) - .into(userAvatar); - this.user.setText(user.getNickName()); - } - - @OnClick(R.id.back) - public void goBack(){ - getActivity().supportFinishAfterTransition(); - } - - @Inject - @Override - public void attachPresenter(@NonNull Presenter presenter) { - this.presenter=presenter; - this.presenter.attachView(this); - } - - private RecyclerView.OnFlingListener flingListener = new RecyclerView.OnFlingListener() { - @Override - public boolean onFling(int velocityX, int velocityY) { - playlistArt.setImmediatePin(true); - return false; - } - }; - - private RecyclerView.OnScrollListener listener=new RecyclerView.OnScrollListener() { - @Override - public void onScrollStateChanged(RecyclerView recyclerView, int newState) { - super.onScrollStateChanged(recyclerView, newState); - playlistArt.setImmediatePin(newState==RecyclerView.SCROLL_STATE_SETTLING); - } - - @Override - public void onScrolled(RecyclerView recyclerView, int dx, int dy) { - super.onScrolled(recyclerView, dx, dy); - final int scrollY= adapter.getBlank().getTop(); - playlistArt.setOffset(scrollY); - parent.setOffset(parent.getStaticOffset()+scrollY); - toggle.setOffset(toggle.getStaticOffset()+scrollY); - } - }; - - @Override - public void onStop() { - super.onStop(); - if(presenter!=null){ - presenter.stop(); - } - } - - @OnClick(R.id.user_avatar) - public void userClick(){ - if(userModel!=null) { - Bundle data = new Bundle(); - data.putString(Constants.EXTRA_ID,userModel.getId()); - data.putString(Constants.EXTRA_DATA,userModel.getAvatarUrl()); - preserveParent(); - rxBus.send(ExposeEvent.exposeUser(data, - Pair.create(userAvatar,getString(R.string.user_trans_name)))); - } - } - - private void preserveParent(){ - ViewGroup.LayoutParams params=parent.getLayoutParams(); - if(params.height!=parent.getBottom()){ - params.height=parent.getBottom(); - parent.setLayoutParams(params); - } - } -} diff --git a/app/src/main/java/com/vpaliy/melophile/ui/playlist/PlaylistPresenter.java b/app/src/main/java/com/vpaliy/melophile/ui/playlist/PlaylistPresenter.java index 3541cca..b03d42e 100644 --- a/app/src/main/java/com/vpaliy/melophile/ui/playlist/PlaylistPresenter.java +++ b/app/src/main/java/com/vpaliy/melophile/ui/playlist/PlaylistPresenter.java @@ -1,9 +1,11 @@ package com.vpaliy.melophile.ui.playlist; +import com.vpaliy.domain.interactor.ModifyInteractor; import com.vpaliy.domain.interactor.SingleInteractor; import com.vpaliy.domain.model.Playlist; import java.util.LinkedList; import java.util.List; +import com.vpaliy.melophile.R; import static com.vpaliy.melophile.ui.playlist.PlaylistContract.View; import com.vpaliy.melophile.di.scope.ViewScope; import javax.inject.Inject; @@ -13,7 +15,9 @@ public class PlaylistPresenter implements PlaylistContract.Presenter { private SingleInteractor playlistInteractor; + private View view; + private Playlist playlist; @Inject public PlaylistPresenter(SingleInteractor playlistUseCase){ @@ -27,6 +31,7 @@ public void start(String id) { private void catchData(Playlist playlist){ if(playlist!=null){ + this.playlist=playlist; List tags=tags(playlist); if(!tags.isEmpty()) { view.showTags(tags); @@ -39,7 +44,7 @@ private void catchData(Playlist playlist){ view.showDuration(playlist.getDuration()); view.showPlaylistArt(playlist.getArtUrl()); }else{ - view.showEmptyMessage(); + view.showMessage(R.string.empty_message); } } @@ -56,7 +61,7 @@ private List tags(Playlist playlist){ } private void catchError(Throwable ex){ ex.printStackTrace(); - view.showErrorMessage(); + } @Override @@ -64,6 +69,25 @@ public void stop() { playlistInteractor.dispose(); } + @Override + public void like() { + } + + @Override + public void unlike() { + + } + + @Override + public void save() { + + } + + @Override + public void remove() { + + } + @Override public void attachView(@NonNull View view) { this.view=view; diff --git a/app/src/main/java/com/vpaliy/melophile/ui/playlists/PlaylistsContract.java b/app/src/main/java/com/vpaliy/melophile/ui/playlists/PlaylistsContract.java index 9d8c8ff..de504a3 100644 --- a/app/src/main/java/com/vpaliy/melophile/ui/playlists/PlaylistsContract.java +++ b/app/src/main/java/com/vpaliy/melophile/ui/playlists/PlaylistsContract.java @@ -4,7 +4,10 @@ import com.vpaliy.melophile.ui.base.BasePresenter; import com.vpaliy.melophile.ui.base.BaseView; +import android.content.Context; +import android.support.annotation.IntegerRes; import android.support.annotation.NonNull; +import android.support.annotation.StringRes; public interface PlaylistsContract { interface View extends BaseView { @@ -12,8 +15,7 @@ interface View extends BaseView { void showPlaylists(@NonNull PlaylistSet playlistSet); void showLoading(); void hideLoading(); - void showErrorMessage(); - void showEmptyMessage(); + void showMessage(@StringRes int resource); } interface Presenter extends BasePresenter { diff --git a/app/src/main/java/com/vpaliy/melophile/ui/playlists/PlaylistsFragment.java b/app/src/main/java/com/vpaliy/melophile/ui/playlists/PlaylistsFragment.java index 3997dd6..72fb074 100644 --- a/app/src/main/java/com/vpaliy/melophile/ui/playlists/PlaylistsFragment.java +++ b/app/src/main/java/com/vpaliy/melophile/ui/playlists/PlaylistsFragment.java @@ -45,16 +45,6 @@ public void onViewCreated(View view, @Nullable Bundle savedInstanceState) { } } - @Override - public void showEmptyMessage() { - showMessage(R.string.empty_message); - } - - @Override - public void showErrorMessage() { - showMessage(R.string.error_message); - } - @Override public void onStart() { super.onStart(); diff --git a/app/src/main/java/com/vpaliy/melophile/ui/playlists/PlaylistsPresenter.java b/app/src/main/java/com/vpaliy/melophile/ui/playlists/PlaylistsPresenter.java index 58790e2..e383d93 100644 --- a/app/src/main/java/com/vpaliy/melophile/ui/playlists/PlaylistsPresenter.java +++ b/app/src/main/java/com/vpaliy/melophile/ui/playlists/PlaylistsPresenter.java @@ -5,11 +5,14 @@ import com.vpaliy.domain.model.PlaylistSet; import java.util.Arrays; import java.util.List; +import com.vpaliy.melophile.R; + import static com.vpaliy.melophile.ui.playlists.PlaylistsContract.View; import static dagger.internal.Preconditions.checkNotNull; + import com.vpaliy.melophile.di.scope.ViewScope; -import javax.inject.Inject; import android.support.annotation.NonNull; +import javax.inject.Inject; @ViewScope public class PlaylistsPresenter implements PlaylistsContract.Presenter{ @@ -30,22 +33,25 @@ public void start() { MelophileTheme.create("Relaxing","relax","relaxing","chills"), MelophileTheme.create("Chilling","chills","party","friends"), MelophileTheme.create("Working out","working out","sweet","moment")); + view.showLoading(); for(MelophileTheme theme:themes){ playlistInteractor.execute(this::catchData,this::catchError,theme); } } private void catchData(PlaylistSet set){ + view.hideLoading(); if(set!=null){ view.showPlaylists(set); return; } - view.showEmptyMessage(); + view.showMessage(R.string.empty_message); } private void catchError(Throwable ex){ ex.printStackTrace(); - view.showErrorMessage(); + view.hideLoading(); + view.showMessage(R.string.error_message); } @Override diff --git a/app/src/main/java/com/vpaliy/melophile/ui/search/SearchActivity.java b/app/src/main/java/com/vpaliy/melophile/ui/search/SearchActivity.java index 528234c..b418b2c 100644 --- a/app/src/main/java/com/vpaliy/melophile/ui/search/SearchActivity.java +++ b/app/src/main/java/com/vpaliy/melophile/ui/search/SearchActivity.java @@ -18,6 +18,8 @@ import com.vpaliy.melophile.ui.user.info.UserAdapter; import com.vpaliy.melophile.ui.view.TransitionAdapterListener; import java.util.List; + +import android.support.annotation.StringRes; import android.support.design.widget.Snackbar; import android.support.design.widget.TabLayout; import android.support.v4.view.ViewPager; @@ -152,13 +154,13 @@ public void handleEvent(@NonNull Object event) { private void handleRequest(MoreEvent event){ switch (searchAdapter.getType(event.result)){ case SearchAdapter.TYPE_TRACKS: - presenter.moreTracks(); + presenter.nextTrackPage(); break; case SearchAdapter.TYPE_PLAYLISTS: - presenter.morePlaylists(); + presenter.nextPlaylistPage(); break; case SearchAdapter.TYPE_USERS: - presenter.moreUsers(); + presenter.nextUserPage(); break; } } @@ -221,7 +223,7 @@ public void attachPresenter(@NonNull Presenter presenter) { @Override public void showTracks(@NonNull List tracks) { gotResult(); - TracksAdapter adapter=new TracksAdapter(this,eventBus); + TracksAdapter adapter=new TracksAdapter(this, rxBus); adapter.setData(tracks); searchAdapter.setTracks(adapter); } @@ -229,7 +231,7 @@ public void showTracks(@NonNull List tracks) { @Override public void showPlaylists(@NonNull List playlists) { gotResult(); - PlaylistsAdapter adapter=new PlaylistsAdapter(this,eventBus); + PlaylistsAdapter adapter=new PlaylistsAdapter(this, rxBus); adapter.setData(playlists); searchAdapter.setPlaylists(adapter); } @@ -237,38 +239,32 @@ public void showPlaylists(@NonNull List playlists) { @Override public void showUsers(@NonNull List users) { gotResult(); - UserAdapter adapter=new UserAdapter(this,eventBus,false); + UserAdapter adapter=new UserAdapter(this, rxBus,false); adapter.setData(users); searchAdapter.setUsers(adapter); } @Override - public void appendPlaylists(@NonNull List playlists) { + public void updatePlaylistPage(@NonNull List playlists) { gotResult(); searchAdapter.appendPlaylists(playlists); } @Override - public void appendTracks(@NonNull List tracks) { + public void updateTrackPage(@NonNull List tracks) { gotResult(); searchAdapter.appendTracks(tracks); } @Override - public void appendUsers(@NonNull List users) { + public void updateUserPage(@NonNull List users) { gotResult(); searchAdapter.appendUsers(users); } @Override - public void showEmptyMessage() { - Snackbar.make(root,R.string.empty_message, - getResources().getInteger(R.integer.message_duration)); - } - - @Override - public void showErrorMessage() { - Snackbar.make(root,R.string.error_message, + public void showMessage(@StringRes int resource) { + Snackbar.make(root,resource, getResources().getInteger(R.integer.message_duration)); } } diff --git a/app/src/main/java/com/vpaliy/melophile/ui/search/SearchContract.java b/app/src/main/java/com/vpaliy/melophile/ui/search/SearchContract.java index c15f29c..15324c8 100644 --- a/app/src/main/java/com/vpaliy/melophile/ui/search/SearchContract.java +++ b/app/src/main/java/com/vpaliy/melophile/ui/search/SearchContract.java @@ -1,34 +1,31 @@ package com.vpaliy.melophile.ui.search; -import android.support.annotation.NonNull; - import com.vpaliy.domain.model.Playlist; import com.vpaliy.domain.model.Track; import com.vpaliy.domain.model.User; import com.vpaliy.melophile.ui.base.BasePresenter; import com.vpaliy.melophile.ui.base.BaseView; - import java.util.List; +import android.support.annotation.StringRes; public interface SearchContract { interface View extends BaseView { - void attachPresenter(@NonNull Presenter presenter); - void showTracks(@NonNull List tracks); - void showPlaylists(@NonNull List playlists); - void showUsers(@NonNull List users); - void appendUsers(@NonNull List users); - void appendPlaylists(@NonNull List playlists); - void appendTracks(@NonNull List tracks); - void showErrorMessage(); - void showEmptyMessage(); + void attachPresenter(Presenter presenter); + void showTracks(List tracks); + void showPlaylists(List playlists); + void showUsers(List users); + void updateUserPage(List users); + void updatePlaylistPage(List playlists); + void updateTrackPage(List tracks); + void showMessage(@StringRes int resource); } interface Presenter extends BasePresenter { - void attachView(@NonNull View view); + void attachView(View view); void query(String query); - void moreTracks(); - void morePlaylists(); - void moreUsers(); + void nextTrackPage(); + void nextPlaylistPage(); + void nextUserPage(); void stop(); } } diff --git a/app/src/main/java/com/vpaliy/melophile/ui/search/SearchPresenter.java b/app/src/main/java/com/vpaliy/melophile/ui/search/SearchPresenter.java index 84144f1..cee2993 100644 --- a/app/src/main/java/com/vpaliy/melophile/ui/search/SearchPresenter.java +++ b/app/src/main/java/com/vpaliy/melophile/ui/search/SearchPresenter.java @@ -5,39 +5,41 @@ import com.vpaliy.domain.model.Track; import com.vpaliy.domain.model.User; import java.util.List; +import com.vpaliy.melophile.R; + import static com.vpaliy.melophile.ui.search.SearchContract.View; import static dagger.internal.Preconditions.checkNotNull; + import com.vpaliy.melophile.di.scope.ViewScope; -import android.support.annotation.NonNull; import javax.inject.Inject; @ViewScope public class SearchPresenter implements SearchContract.Presenter { - private SearchInteractor> trackSearchUseCase; - private SearchInteractor> playlistSearchUseCase; - private SearchInteractor> userSearchUseCase; + private SearchInteractor> trackSearch; + private SearchInteractor> playlistSearch; + private SearchInteractor> userSearch; private View view; @Inject - public SearchPresenter(SearchInteractor> trackSearchUseCase, - SearchInteractor> playlistSearchUseCase, - SearchInteractor> userSearchUseCase){ - this.trackSearchUseCase=trackSearchUseCase; - this.playlistSearchUseCase=playlistSearchUseCase; - this.userSearchUseCase=userSearchUseCase; + public SearchPresenter(SearchInteractor> trackSearch, + SearchInteractor> playlistSearch, + SearchInteractor> userSearch){ + this.trackSearch = trackSearch; + this.playlistSearch = playlistSearch; + this.userSearch = userSearch; } @Override - public void attachView(@NonNull View view) { + public void attachView(View view) { this.view=checkNotNull(view); } @Override public void query(String query) { - trackSearchUseCase.search(query,this::catchTracks,this::catchError); - playlistSearchUseCase.search(query,this::catchPlaylists,this::catchError); - userSearchUseCase.search(query,this::catchUsers,this::catchError); + trackSearch.search(query,this::catchTracks,this::catchError); + playlistSearch.search(query,this::catchPlaylists,this::catchError); + userSearch.search(query,this::catchUsers,this::catchError); } private void catchTracks(List result){ @@ -54,7 +56,7 @@ private void catchPlaylists(List playlists){ private void catchError(Throwable ex){ ex.printStackTrace(); - view.showErrorMessage(); + view.showMessage(R.string.error_message); } private void catchUsers(List result){ @@ -64,40 +66,37 @@ private void catchUsers(List result){ } @Override - public void morePlaylists() { - playlistSearchUseCase.nextPage(this::appendPlaylists,this::catchError); + public void nextPlaylistPage() { + playlistSearch.nextPage(this::appendPlaylists,this::catchError); } @Override - public void moreTracks() { - trackSearchUseCase.nextPage(this::appendTracks,this::catchError); + public void nextTrackPage() { + trackSearch.nextPage(this::appendTracks,this::catchError); } @Override - public void moreUsers() { - userSearchUseCase.nextPage(this::appendUsers,this::catchError); + public void nextUserPage() { + userSearch.nextPage(this::appendUsers,this::catchError); } private void appendTracks(List tracks){ if(tracks==null||tracks.isEmpty()) return; - view.appendTracks(tracks); + view.updateTrackPage(tracks); } private void appendPlaylists(List playlists){ if(playlists==null||playlists.isEmpty()) return; - view.showPlaylists(playlists); + view.updatePlaylistPage(playlists); } private void appendUsers(List users){ if(users==null||users.isEmpty()) return; - view.showUsers(users); + view.updateUserPage(users); } @Override public void stop() { - /* trackSearchUseCase.dispose(); - playlistSearchUseCase.dispose(); - userSearchUseCase.dispose(); */ view=null; } } diff --git a/app/src/main/java/com/vpaliy/melophile/ui/track/AlbumAdapter.java b/app/src/main/java/com/vpaliy/melophile/ui/track/AlbumAdapter.java deleted file mode 100644 index 1e62fe6..0000000 --- a/app/src/main/java/com/vpaliy/melophile/ui/track/AlbumAdapter.java +++ /dev/null @@ -1,104 +0,0 @@ -package com.vpaliy.melophile.ui.track; - - -import android.content.Context; -import android.graphics.Bitmap; -import android.support.annotation.NonNull; -import android.support.v4.view.PagerAdapter; -import android.view.LayoutInflater; -import android.view.View; -import android.view.ViewGroup; -import android.widget.ImageView; - -import com.bumptech.glide.Glide; -import com.bumptech.glide.Priority; -import com.bumptech.glide.load.engine.DiskCacheStrategy; -import com.bumptech.glide.request.target.ImageViewTarget; -import com.vpaliy.domain.model.Track; -import com.vpaliy.melophile.R; - -import java.util.ArrayList; -import java.util.List; - -import butterknife.ButterKnife; - -public class AlbumAdapter extends PagerAdapter{ - - private List albums; - private LayoutInflater inflater; - private volatile boolean isLoaded=false; - private Callback callback; - private volatile int current; - - public AlbumAdapter(Context context){ - this.albums =new ArrayList<>(); - this.inflater= LayoutInflater.from(context); - } - - public void setCallback(Callback callback) { - this.callback = callback; - } - - @Override - public View instantiateItem(ViewGroup container, int position) { - View view=inflater.inflate(R.layout.adapter_album,container,false); - ImageView image= ButterKnife.findById(view,R.id.image); - - Glide.with(container.getContext()) - .load(albums.get(position).getArtworkUrl()) - .asBitmap() - .priority(Priority.IMMEDIATE) - .diskCacheStrategy(DiskCacheStrategy.RESULT) - .into(new ImageViewTarget(image) { - @Override - protected void setResource(Bitmap resource) { - image.setImageBitmap(resource); - if (position == current && !isLoaded) { - isLoaded = true; - if (callback != null) { - callback.onTransitionImageLoaded(image,resource); - } - } - } - }); - container.addView(view); - return view; - } - - public void appendData(List data){ - this.albums =data; - notifyDataSetChanged(); - } - - @Override - public int getCount() { - if(albums.size()>=5) return 5; - return albums.size(); - } - - @Override - public float getPageWidth(int position) { - return 0.5f; - } - - public void setData(@NonNull List tracks, int position){ - this.albums =tracks; - this.current=position; - notifyDataSetChanged(); - } - - @Override - public boolean isViewFromObject(View view, Object object) { - return view==object; - } - - @Override - public void destroyItem(ViewGroup container, int position, Object object) { - View view=View.class.cast(object); - container.removeView(view); - } - - public interface Callback { - void onTransitionImageLoaded(ImageView image, Bitmap bitmap); - } -} \ No newline at end of file diff --git a/app/src/main/java/com/vpaliy/melophile/ui/track/TrackActivity.java b/app/src/main/java/com/vpaliy/melophile/ui/track/TrackActivity.java deleted file mode 100644 index 8fc4e32..0000000 --- a/app/src/main/java/com/vpaliy/melophile/ui/track/TrackActivity.java +++ /dev/null @@ -1,40 +0,0 @@ -package com.vpaliy.melophile.ui.track; - - -import android.os.Bundle; -import com.vpaliy.melophile.App; -import com.vpaliy.melophile.R; -import com.vpaliy.melophile.ui.base.BaseActivity; -import com.vpaliy.melophile.ui.utils.Constants; -import android.support.annotation.NonNull; -import android.support.annotation.Nullable; -import android.view.View; - -public class TrackActivity extends BaseActivity { - - @Override - protected void onCreate(@Nullable Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - setContentView(R.layout.activity_playlist); - getWindow().getDecorView().setSystemUiVisibility( - View.SYSTEM_UI_FLAG_LAYOUT_STABLE - | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN); - if(savedInstanceState==null){ - if(getIntent().getExtras()!=null) { - savedInstanceState = getIntent().getExtras().getBundle(Constants.EXTRA_DATA); - } - getSupportFragmentManager().beginTransaction() - .replace(R.id.frame, TrackFragment.newInstance(savedInstanceState)) - .commit(); - } - } - - @Override - public void inject() { - App.appInstance().appComponent().inject(this); - } - - @Override - public void handleEvent(@NonNull Object event) { - } -} diff --git a/app/src/main/java/com/vpaliy/melophile/ui/tracks/TracksContract.java b/app/src/main/java/com/vpaliy/melophile/ui/tracks/TracksContract.java index 8286087..9794ed8 100644 --- a/app/src/main/java/com/vpaliy/melophile/ui/tracks/TracksContract.java +++ b/app/src/main/java/com/vpaliy/melophile/ui/tracks/TracksContract.java @@ -1,6 +1,8 @@ package com.vpaliy.melophile.ui.tracks; import android.support.annotation.NonNull; +import android.support.annotation.StringRes; + import com.vpaliy.domain.model.TrackSet; import com.vpaliy.melophile.ui.base.BasePresenter; import com.vpaliy.melophile.ui.base.BaseView; @@ -9,10 +11,9 @@ public interface TracksContract { interface View extends BaseView { void attachPresenter(@NonNull Presenter presenter); void showTrackSet(@NonNull TrackSet trackSet); - void showErrorMessage(); - void showEmptyMessage(); void showLoading(); void hideLoading(); + void showMessage(@StringRes int resource); } interface Presenter extends BasePresenter { diff --git a/app/src/main/java/com/vpaliy/melophile/ui/tracks/TracksFragment.java b/app/src/main/java/com/vpaliy/melophile/ui/tracks/TracksFragment.java index 17dcd76..b15c6a5 100644 --- a/app/src/main/java/com/vpaliy/melophile/ui/tracks/TracksFragment.java +++ b/app/src/main/java/com/vpaliy/melophile/ui/tracks/TracksFragment.java @@ -58,16 +58,6 @@ public void onStart() { } } - @Override - public void showErrorMessage() { - showMessage(R.string.error_message); - } - - @Override - public void showEmptyMessage() { - showMessage(R.string.empty_message); - } - @Override public void showTrackSet(@NonNull TrackSet trackSet) { TracksAdapter tracksAdapter=new TracksAdapter(getContext(),rxBus); diff --git a/app/src/main/java/com/vpaliy/melophile/ui/tracks/TracksPresenter.java b/app/src/main/java/com/vpaliy/melophile/ui/tracks/TracksPresenter.java index 80eb52b..02f2223 100644 --- a/app/src/main/java/com/vpaliy/melophile/ui/tracks/TracksPresenter.java +++ b/app/src/main/java/com/vpaliy/melophile/ui/tracks/TracksPresenter.java @@ -7,6 +7,8 @@ import java.util.List; import javax.inject.Inject; import android.support.annotation.NonNull; + +import com.vpaliy.melophile.R; import com.vpaliy.melophile.di.scope.ViewScope; import static com.vpaliy.melophile.ui.tracks.TracksContract.View; @@ -40,12 +42,12 @@ private void catchData(TrackSet trackSet){ view.showTrackSet(trackSet); return; } - view.showEmptyMessage(); + view.showMessage(R.string.empty_message); } private void catchError(Throwable ex){ ex.printStackTrace(); - view.showErrorMessage(); + view.showMessage(R.string.error_message); } @Override diff --git a/app/src/main/java/com/vpaliy/melophile/ui/user/PersonContract.java b/app/src/main/java/com/vpaliy/melophile/ui/user/PersonContract.java index da20e1a..4994995 100644 --- a/app/src/main/java/com/vpaliy/melophile/ui/user/PersonContract.java +++ b/app/src/main/java/com/vpaliy/melophile/ui/user/PersonContract.java @@ -1,6 +1,7 @@ package com.vpaliy.melophile.ui.user; import android.support.annotation.NonNull; +import android.support.annotation.StringRes; import com.vpaliy.domain.model.Playlist; import com.vpaliy.domain.model.Track; @@ -18,13 +19,11 @@ interface View extends BaseView { void showPlaylists(List playlists); void showAvatar(String avatarUrl); void showDescription(String description); + void showMessage(@StringRes int resource); void showTitle(String title); void showFollowersCount(int count); void showLikedCount(int count); void showTracksCount(int count); - void showEmptyMediaMessage(); - void showEmptyMessage(); - void showErrorMessage(); void enableFollow(); void disableFollow(); void showLoading(); diff --git a/app/src/main/java/com/vpaliy/melophile/ui/user/PersonFragment.java b/app/src/main/java/com/vpaliy/melophile/ui/user/PersonFragment.java index 4035076..ee76ad6 100644 --- a/app/src/main/java/com/vpaliy/melophile/ui/user/PersonFragment.java +++ b/app/src/main/java/com/vpaliy/melophile/ui/user/PersonFragment.java @@ -167,11 +167,6 @@ public void showTitle(String title) { scaleAnimation(username); } - @Override - public void showErrorMessage() { - showMessage(R.string.error_message); - } - @Override public void showLikedCount(int count) { likes.setText(getResources().getQuantityString(R.plurals.likes,count,count)); @@ -286,16 +281,6 @@ public void onAnimationEnd(Animator animation) { }).start(); } - @Override - public void showEmptyMediaMessage() { - emptyMessage.setVisibility(View.VISIBLE); - } - - @Override - public void showEmptyMessage() { - showMessage(R.string.empty_message); - } - @Override public void showPlaylists(List playlists) { media.setVisibility(View.VISIBLE); diff --git a/app/src/main/java/com/vpaliy/melophile/ui/user/PersonPresenter.java b/app/src/main/java/com/vpaliy/melophile/ui/user/PersonPresenter.java index 7554914..c9550e2 100644 --- a/app/src/main/java/com/vpaliy/melophile/ui/user/PersonPresenter.java +++ b/app/src/main/java/com/vpaliy/melophile/ui/user/PersonPresenter.java @@ -6,6 +6,8 @@ import java.util.List; import static com.vpaliy.melophile.ui.user.PersonContract.View; import static dagger.internal.Preconditions.checkNotNull; + +import com.vpaliy.melophile.R; import com.vpaliy.melophile.di.scope.ViewScope; import javax.inject.Inject; import android.support.annotation.NonNull; @@ -44,7 +46,7 @@ private void catchData(UserDetails details){ if(!isEmpty(details.getPlaylists())) { view.showPlaylists(details.getPlaylists()); }else if(isEmpty){ - view.showEmptyMediaMessage(); + //view.showEmptyMediaMessage(); } user=details.getUser(); if(user!=null){ @@ -56,7 +58,7 @@ private void catchData(UserDetails details){ manageFollowing(); } }else{ - view.showEmptyMessage(); + view.showMessage(R.string.empty_message); } } @@ -67,7 +69,7 @@ private boolean isEmpty(List items){ private void catchError(Throwable ex){ view.hideLoading(); ex.printStackTrace(); - view.showErrorMessage(); + view.showMessage(R.string.error_message); } private void manageFollowing(){ diff --git a/app/src/main/java/com/vpaliy/melophile/ui/user/info/BaseInfoFragment.java b/app/src/main/java/com/vpaliy/melophile/ui/user/info/BaseInfoFragment.java index 687b612..69f6e9b 100644 --- a/app/src/main/java/com/vpaliy/melophile/ui/user/info/BaseInfoFragment.java +++ b/app/src/main/java/com/vpaliy/melophile/ui/user/info/BaseInfoFragment.java @@ -78,11 +78,6 @@ public void close(){ .beginTransaction().remove(this).commit(); } - @Override - public void showError() { - //TODO add an error message - } - private void extractId(Bundle bundle){ if(bundle==null) bundle=getArguments(); id=bundle.getString(Constants.EXTRA_ID); diff --git a/app/src/main/java/com/vpaliy/melophile/ui/user/info/FavoriteFragment.java b/app/src/main/java/com/vpaliy/melophile/ui/user/info/FavoriteFragment.java index f66fbf2..4bb4fbe 100644 --- a/app/src/main/java/com/vpaliy/melophile/ui/user/info/FavoriteFragment.java +++ b/app/src/main/java/com/vpaliy/melophile/ui/user/info/FavoriteFragment.java @@ -35,9 +35,18 @@ protected void inject() { } @Override - public void showEmpty() { + public void showEmptyState() { title.setText(R.string.no_loved_message); - handler.postDelayed(this::close,2000); + } + + @Override + public void showMessage(int resource) { + + } + + @Override + public void finishWithDelay(long delay) { + handler.postDelayed(this::close,delay); } @Override diff --git a/app/src/main/java/com/vpaliy/melophile/ui/user/info/FollowersFragment.java b/app/src/main/java/com/vpaliy/melophile/ui/user/info/FollowersFragment.java index 528cc76..adfff45 100644 --- a/app/src/main/java/com/vpaliy/melophile/ui/user/info/FollowersFragment.java +++ b/app/src/main/java/com/vpaliy/melophile/ui/user/info/FollowersFragment.java @@ -34,9 +34,18 @@ protected void inject() { } @Override - public void showEmpty() { + public void finishWithDelay(long delay) { + handler.postDelayed(this::close,delay); + } + + @Override + public void showEmptyState() { title.setText(R.string.no_followers_message); - handler.postDelayed(this::close,2000); + } + + @Override + public void showMessage(int resource) { + } @Override diff --git a/app/src/main/java/com/vpaliy/melophile/ui/user/info/UserInfoContract.java b/app/src/main/java/com/vpaliy/melophile/ui/user/info/UserInfoContract.java index f22241a..1a0c921 100644 --- a/app/src/main/java/com/vpaliy/melophile/ui/user/info/UserInfoContract.java +++ b/app/src/main/java/com/vpaliy/melophile/ui/user/info/UserInfoContract.java @@ -1,6 +1,8 @@ package com.vpaliy.melophile.ui.user.info; import android.support.annotation.NonNull; +import android.support.annotation.StringRes; + import com.vpaliy.melophile.ui.base.BasePresenter; import com.vpaliy.melophile.ui.base.BaseView; @@ -8,10 +10,11 @@ public interface UserInfoContract { interface View extends BaseView> { - void attachPresenter(@NonNull Presenter presenter); - void showError(); - void showEmpty(); - void showInfo(@NonNull List tracks); + void attachPresenter(Presenter presenter); + void showMessage(@StringRes int resource); + void showEmptyState(); + void finishWithDelay(long delay); + void showInfo(List tracks); void showTitle(); } diff --git a/app/src/main/java/com/vpaliy/melophile/ui/user/info/UserInfoPresenter.java b/app/src/main/java/com/vpaliy/melophile/ui/user/info/UserInfoPresenter.java index 4af278a..01d3a07 100644 --- a/app/src/main/java/com/vpaliy/melophile/ui/user/info/UserInfoPresenter.java +++ b/app/src/main/java/com/vpaliy/melophile/ui/user/info/UserInfoPresenter.java @@ -4,6 +4,8 @@ import static com.vpaliy.melophile.ui.user.info.UserInfoContract.View; import static dagger.internal.Preconditions.checkNotNull; import com.vpaliy.domain.interactor.SingleInteractor; +import com.vpaliy.melophile.R; + import android.support.annotation.NonNull; @SuppressWarnings("WeakerAccess") @@ -33,7 +35,8 @@ public void attachView(@NonNull View view) { protected void catchData(List data){ if(data==null||data.isEmpty()){ - view.showEmpty(); + view.showEmptyState(); + view.finishWithDelay(2000); }else{ view.showTitle(); view.showInfo(data); @@ -42,6 +45,6 @@ protected void catchData(List data){ protected void catchError(Throwable ex){ ex.printStackTrace(); - view.showError(); + view.showMessage(R.string.error_message); } } diff --git a/domain/src/main/java/com/vpaliy/domain/interactor/GetPlaylist.java b/domain/src/main/java/com/vpaliy/domain/interactor/GetPlaylist.java index ba23f6c..15b3890 100644 --- a/domain/src/main/java/com/vpaliy/domain/interactor/GetPlaylist.java +++ b/domain/src/main/java/com/vpaliy/domain/interactor/GetPlaylist.java @@ -1,31 +1,28 @@ package com.vpaliy.domain.interactor; +import android.text.TextUtils; import com.vpaliy.domain.executor.BaseSchedulerProvider; import com.vpaliy.domain.model.Playlist; import com.vpaliy.domain.repository.Repository; - +import io.reactivex.Single; import javax.inject.Inject; import javax.inject.Singleton; -import io.reactivex.Single; - @Singleton public class GetPlaylist extends SingleInteractor { private Repository repository; @Inject - public GetPlaylist(BaseSchedulerProvider schedulerProvider, - Repository repository){ + public GetPlaylist(BaseSchedulerProvider schedulerProvider, Repository repository){ super(schedulerProvider); this.repository=repository; } @Override public Single buildUseCase(String id) { - if(id==null||id.isEmpty()){ - return Single.error(new IllegalArgumentException("Id is null")); - } - return repository.getPlaylistBy(id); + return !TextUtils.isEmpty(id) + ? repository.getPlaylistBy(id) + :Single.error(new IllegalArgumentException("Id is null")); } } diff --git a/domain/src/main/java/com/vpaliy/domain/interactor/GetPlaylists.java b/domain/src/main/java/com/vpaliy/domain/interactor/GetPlaylists.java index 88ced37..5fc964a 100644 --- a/domain/src/main/java/com/vpaliy/domain/interactor/GetPlaylists.java +++ b/domain/src/main/java/com/vpaliy/domain/interactor/GetPlaylists.java @@ -4,20 +4,17 @@ import com.vpaliy.domain.model.MelophileTheme; import com.vpaliy.domain.model.PlaylistSet; import com.vpaliy.domain.repository.Repository; - +import io.reactivex.Single; import javax.inject.Inject; import javax.inject.Singleton; -import io.reactivex.Single; - @Singleton public class GetPlaylists extends SingleInteractor { private Repository repository; @Inject - public GetPlaylists(BaseSchedulerProvider schedulerProvider, - Repository repository){ + public GetPlaylists(BaseSchedulerProvider schedulerProvider, Repository repository){ super(schedulerProvider); this.repository=repository; } diff --git a/domain/src/main/java/com/vpaliy/domain/interactor/GetTrack.java b/domain/src/main/java/com/vpaliy/domain/interactor/GetTrack.java index 1fabd15..945d170 100644 --- a/domain/src/main/java/com/vpaliy/domain/interactor/GetTrack.java +++ b/domain/src/main/java/com/vpaliy/domain/interactor/GetTrack.java @@ -1,5 +1,6 @@ package com.vpaliy.domain.interactor; +import android.text.TextUtils; import com.vpaliy.domain.executor.BaseSchedulerProvider; import com.vpaliy.domain.model.Track; import com.vpaliy.domain.repository.Repository; @@ -13,17 +14,15 @@ public class GetTrack extends SingleInteractor { private Repository repository; @Inject - public GetTrack(BaseSchedulerProvider schedulerProvider, - Repository repository){ + public GetTrack(BaseSchedulerProvider schedulerProvider, Repository repository){ super(schedulerProvider); this.repository=repository; } @Override public Single buildUseCase(String id) { - if(id==null||id.isEmpty()){ - return Single.error(new IllegalArgumentException("Id is null")); - } - return repository.getTrackBy(id); + return !TextUtils.isEmpty(id) + ? repository.getTrackBy(id) + :Single.error(new IllegalArgumentException("Id is null")); } } diff --git a/domain/src/main/java/com/vpaliy/domain/interactor/GetUsers.java b/domain/src/main/java/com/vpaliy/domain/interactor/GetUsers.java index 25d5bb9..5c39e97 100644 --- a/domain/src/main/java/com/vpaliy/domain/interactor/GetUsers.java +++ b/domain/src/main/java/com/vpaliy/domain/interactor/GetUsers.java @@ -3,17 +3,14 @@ import com.vpaliy.domain.executor.BaseSchedulerProvider; import com.vpaliy.domain.model.User; import com.vpaliy.domain.repository.Repository; - import java.util.List; - import io.reactivex.Single; public class GetUsers extends SingleInteractor,String> { private Repository repository; - public GetUsers(BaseSchedulerProvider schedulerProvider, - Repository repository){ + public GetUsers(BaseSchedulerProvider schedulerProvider, Repository repository){ super(schedulerProvider); this.repository=repository; }