package com.marverenic.music.viewmodel; import android.content.Context; import android.databinding.BaseObservable; import android.support.v4.app.FragmentManager; import android.support.v7.widget.PopupMenu; import android.view.Gravity; import android.view.View; import com.marverenic.music.JockeyApplication; import com.marverenic.music.R; import com.marverenic.music.activity.instance.GenreActivity; import com.marverenic.music.data.store.MusicStore; import com.marverenic.music.dialog.AppendPlaylistDialogFragment; import com.marverenic.music.model.Genre; import com.marverenic.music.player.PlayerController; import javax.inject.Inject; import timber.log.Timber; public class GenreViewModel extends BaseObservable { private static final String TAG_PLAYLIST_DIALOG = "GenreViewModel.PlaylistDialog"; @Inject MusicStore mMusicStore; @Inject PlayerController mPlayerController; private Context mContext; private FragmentManager mFragmentManager; private Genre mGenre; public GenreViewModel(Context context, FragmentManager fragmentManager) { mContext = context; mFragmentManager = fragmentManager; JockeyApplication.getComponent(mContext).inject(this); } public void setGenre(Genre genre) { mGenre = genre; notifyChange(); } public String getName() { return mGenre.getGenreName(); } public View.OnClickListener onClickGenre() { return v -> mContext.startActivity(GenreActivity.newIntent(mContext, mGenre)); } public View.OnClickListener onClickMenu() { return v -> { final PopupMenu menu = new PopupMenu(mContext, v, Gravity.END); menu.inflate(R.menu.instance_genre); menu.setOnMenuItemClickListener(onMenuItemClick()); menu.show(); }; } private PopupMenu.OnMenuItemClickListener onMenuItemClick() { return menuItem -> { switch (menuItem.getItemId()) { case R.id.menu_item_queue_item_next: mMusicStore.getSongs(mGenre).subscribe( mPlayerController::queueNext, throwable -> { Timber.e(throwable, "Failed to get songs"); }); return true; case R.id.menu_item_queue_item_last: mMusicStore.getSongs(mGenre).subscribe( mPlayerController::queueLast, throwable -> { Timber.e(throwable, "Failed to get songs"); }); return true; case R.id.menu_item_add_to_playlist: mMusicStore.getSongs(mGenre).subscribe( songs -> { new AppendPlaylistDialogFragment.Builder(mContext, mFragmentManager) .setSongs(songs, mGenre.getGenreName()) .showSnackbarIn(R.id.list) .show(TAG_PLAYLIST_DIALOG); }, throwable -> { Timber.e(throwable, "Failed to get songs"); }); return true; } return false; }; } }