migrate material-cab sections to kotlin and update library
This commit is contained in:
parent
ec649b5417
commit
76f37e4cab
21 changed files with 211 additions and 263 deletions
|
|
@ -86,7 +86,7 @@ dependencies {
|
|||
|
||||
implementation 'com.afollestad.material-dialogs:core:0.9.6.0'
|
||||
implementation 'com.afollestad.material-dialogs:commons:0.9.6.0'
|
||||
implementation 'com.afollestad:material-cab:0.1.12'
|
||||
implementation 'com.afollestad:material-cab:2.0.1'
|
||||
|
||||
implementation 'me.zhanghai.android.materialprogressbar:library:1.6.1'
|
||||
implementation 'com.github.QuadFlask:colorpicker:ef73ced217'
|
||||
|
|
|
|||
|
|
@ -14,7 +14,10 @@ import androidx.annotation.Nullable;
|
|||
import androidx.fragment.app.Fragment;
|
||||
import androidx.drawerlayout.widget.DrawerLayout;
|
||||
|
||||
import com.afollestad.materialcab.attached.AttachedCab;
|
||||
import com.afollestad.materialcab.attached.AttachedCabKt;
|
||||
import com.dkanada.gramophone.activities.base.AbsMusicContentActivity;
|
||||
import com.dkanada.gramophone.interfaces.CabHolder;
|
||||
import com.dkanada.gramophone.util.NavigationUtil;
|
||||
import com.dkanada.gramophone.util.PreferenceUtil;
|
||||
import com.dkanada.gramophone.util.ThemeUtil;
|
||||
|
|
@ -35,14 +38,14 @@ import org.jellyfin.apiclient.model.dto.BaseItemDto;
|
|||
|
||||
import java.util.List;
|
||||
|
||||
public class MainActivity extends AbsMusicContentActivity {
|
||||
public class MainActivity extends AbsMusicContentActivity implements CabHolder {
|
||||
private ActivityMainDrawerLayoutBinding binding;
|
||||
private ActivityMainContentBinding contentBinding;
|
||||
private NavigationDrawerHeaderBinding navigationBinding;
|
||||
private boolean onLogout;
|
||||
|
||||
@Nullable
|
||||
private MainActivityFragmentCallbacks currentFragment;
|
||||
private AttachedCab cab;
|
||||
|
||||
@Nullable
|
||||
private List<BaseItemDto> libraries;
|
||||
|
|
@ -93,8 +96,6 @@ public class MainActivity extends AbsMusicContentActivity {
|
|||
menu.getItem(0).setChecked(true);
|
||||
if (state == null) {
|
||||
setCurrentFragment(LibraryFragment.newInstance());
|
||||
} else {
|
||||
restoreCurrentFragment();
|
||||
}
|
||||
});
|
||||
}
|
||||
|
|
@ -112,11 +113,6 @@ public class MainActivity extends AbsMusicContentActivity {
|
|||
|
||||
private void setCurrentFragment(Fragment fragment) {
|
||||
getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container, fragment, null).commit();
|
||||
currentFragment = (MainActivityFragmentCallbacks) fragment;
|
||||
}
|
||||
|
||||
private void restoreCurrentFragment() {
|
||||
currentFragment = (MainActivityFragmentCallbacks) getSupportFragmentManager().findFragmentById(R.id.fragment_container);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
|
@ -225,6 +221,22 @@ public class MainActivity extends AbsMusicContentActivity {
|
|||
updateNavigationDrawerHeader();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onCreateCab(AttachedCab cab) {
|
||||
this.cab = cab;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onBackPressed() {
|
||||
if (binding.drawerLayout.isDrawerOpen(binding.navigationView)) {
|
||||
binding.drawerLayout.closeDrawers();
|
||||
} else if (cab != null && AttachedCabKt.isActive(cab)) {
|
||||
AttachedCabKt.destroy(cab);
|
||||
} else {
|
||||
super.onBackPressed();
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean onOptionsItemSelected(@NonNull MenuItem item) {
|
||||
if (item.getItemId() == android.R.id.home) {
|
||||
|
|
@ -240,16 +252,6 @@ public class MainActivity extends AbsMusicContentActivity {
|
|||
return super.onOptionsItemSelected(item);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean handleBackPress() {
|
||||
if (binding.drawerLayout.isDrawerOpen(binding.navigationView)) {
|
||||
binding.drawerLayout.closeDrawers();
|
||||
return true;
|
||||
}
|
||||
|
||||
return super.handleBackPress() || (currentFragment != null && currentFragment.handleBackPress());
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onPanelExpanded(View view) {
|
||||
super.onPanelExpanded(view);
|
||||
|
|
@ -261,8 +263,4 @@ public class MainActivity extends AbsMusicContentActivity {
|
|||
super.onPanelCollapsed(view);
|
||||
binding.drawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_UNLOCKED);
|
||||
}
|
||||
|
||||
public interface MainActivityFragmentCallbacks {
|
||||
boolean handleBackPress();
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -214,22 +214,6 @@ public abstract class AbsMusicPanelActivity extends AbsMusicServiceActivity impl
|
|||
return binding.getRoot();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onBackPressed() {
|
||||
if (!handleBackPress()) super.onBackPressed();
|
||||
}
|
||||
|
||||
public boolean handleBackPress() {
|
||||
if (binding.slidingLayout.getPanelHeight() != 0 && playerFragment.onBackPressed())
|
||||
return true;
|
||||
if (getPanelState() == SlidingUpPanelLayout.PanelState.EXPANDED) {
|
||||
collapsePanel();
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onPaletteColorChanged() {
|
||||
if (getPanelState() == SlidingUpPanelLayout.PanelState.EXPANDED) {
|
||||
|
|
@ -288,6 +272,17 @@ public abstract class AbsMusicPanelActivity extends AbsMusicServiceActivity impl
|
|||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onBackPressed() {
|
||||
boolean queuePanelCollapsed = playerFragment.onBackPressed();
|
||||
|
||||
if (!queuePanelCollapsed && getPanelState() == SlidingUpPanelLayout.PanelState.EXPANDED) {
|
||||
collapsePanel();
|
||||
} else if (!queuePanelCollapsed) {
|
||||
super.onBackPressed();
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setTaskDescriptionColor(int color) {
|
||||
taskDescriptionColor = color;
|
||||
|
|
|
|||
|
|
@ -10,7 +10,8 @@ import androidx.annotation.NonNull;
|
|||
import androidx.recyclerview.widget.GridLayoutManager;
|
||||
import androidx.recyclerview.widget.RecyclerView;
|
||||
|
||||
import com.afollestad.materialcab.MaterialCab;
|
||||
import com.afollestad.materialcab.attached.AttachedCab;
|
||||
import com.afollestad.materialcab.attached.AttachedCabKt;
|
||||
import com.dkanada.gramophone.BuildConfig;
|
||||
import com.dkanada.gramophone.activities.base.AbsMusicContentActivity;
|
||||
import com.dkanada.gramophone.databinding.ActivityAlbumDetailBinding;
|
||||
|
|
@ -40,7 +41,7 @@ public class AlbumDetailActivity extends AbsMusicContentActivity implements Pale
|
|||
|
||||
private ActivityAlbumDetailBinding binding;
|
||||
|
||||
private MaterialCab cab;
|
||||
private AttachedCab cab;
|
||||
private int headerViewHeight;
|
||||
private int toolbarColor;
|
||||
|
||||
|
|
@ -197,20 +198,16 @@ public class AlbumDetailActivity extends AbsMusicContentActivity implements Pale
|
|||
}
|
||||
|
||||
@Override
|
||||
public MaterialCab openCab(int menuRes, @NonNull final MaterialCab.Callback callback) {
|
||||
if (cab != null && cab.isActive()) cab.finish();
|
||||
cab = new MaterialCab(this, R.id.cab_stub)
|
||||
.setMenu(menuRes)
|
||||
.setCloseDrawableRes(R.drawable.ic_close_white_24dp)
|
||||
.setBackgroundColor(getPaletteColor())
|
||||
.start(callback);
|
||||
return cab;
|
||||
public void onCreateCab(AttachedCab cab) {
|
||||
cab.backgroundColor(null, getPaletteColor());
|
||||
|
||||
this.cab = cab;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onBackPressed() {
|
||||
if (cab != null && cab.isActive()) {
|
||||
cab.finish();
|
||||
if (cab != null && AttachedCabKt.isActive(cab)) {
|
||||
AttachedCabKt.destroy(cab);
|
||||
} else {
|
||||
binding.list.stopScroll();
|
||||
super.onBackPressed();
|
||||
|
|
|
|||
|
|
@ -11,7 +11,8 @@ import androidx.recyclerview.widget.GridLayoutManager;
|
|||
import androidx.recyclerview.widget.LinearLayoutManager;
|
||||
import androidx.recyclerview.widget.RecyclerView;
|
||||
|
||||
import com.afollestad.materialcab.MaterialCab;
|
||||
import com.afollestad.materialcab.attached.AttachedCab;
|
||||
import com.afollestad.materialcab.attached.AttachedCabKt;
|
||||
import com.dkanada.gramophone.BuildConfig;
|
||||
import com.dkanada.gramophone.activities.base.AbsMusicContentActivity;
|
||||
import com.dkanada.gramophone.adapter.song.SongAdapter;
|
||||
|
|
@ -42,7 +43,7 @@ public class ArtistDetailActivity extends AbsMusicContentActivity implements Pal
|
|||
|
||||
private ActivityArtistDetailBinding binding;
|
||||
|
||||
private MaterialCab cab;
|
||||
private AttachedCab cab;
|
||||
private int headerViewHeight;
|
||||
private int toolbarColor;
|
||||
|
||||
|
|
@ -225,20 +226,16 @@ public class ArtistDetailActivity extends AbsMusicContentActivity implements Pal
|
|||
}
|
||||
|
||||
@Override
|
||||
public MaterialCab openCab(int menuRes, @NonNull final MaterialCab.Callback callback) {
|
||||
if (cab != null && cab.isActive()) cab.finish();
|
||||
cab = new MaterialCab(this, R.id.cab_stub)
|
||||
.setMenu(menuRes)
|
||||
.setCloseDrawableRes(R.drawable.ic_close_white_24dp)
|
||||
.setBackgroundColor(getPaletteColor())
|
||||
.start(callback);
|
||||
return cab;
|
||||
public void onCreateCab(AttachedCab cab) {
|
||||
cab.backgroundColor(null, getPaletteColor());
|
||||
|
||||
this.cab = cab;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onBackPressed() {
|
||||
if (cab != null && cab.isActive()) {
|
||||
cab.finish();
|
||||
if (cab != null && AttachedCabKt.isActive(cab)) {
|
||||
AttachedCabKt.destroy(cab);
|
||||
} else {
|
||||
binding.albums.stopScroll();
|
||||
super.onBackPressed();
|
||||
|
|
|
|||
|
|
@ -9,7 +9,8 @@ import androidx.annotation.NonNull;
|
|||
import androidx.recyclerview.widget.LinearLayoutManager;
|
||||
import androidx.recyclerview.widget.RecyclerView;
|
||||
|
||||
import com.afollestad.materialcab.MaterialCab;
|
||||
import com.afollestad.materialcab.attached.AttachedCab;
|
||||
import com.afollestad.materialcab.attached.AttachedCabKt;
|
||||
import com.dkanada.gramophone.BuildConfig;
|
||||
import com.dkanada.gramophone.activities.base.AbsMusicContentActivity;
|
||||
import com.dkanada.gramophone.databinding.ActivityGenreDetailBinding;
|
||||
|
|
@ -34,7 +35,7 @@ public class GenreDetailActivity extends AbsMusicContentActivity implements CabH
|
|||
|
||||
private Genre genre;
|
||||
|
||||
private MaterialCab cab;
|
||||
private AttachedCab cab;
|
||||
private SongAdapter adapter;
|
||||
|
||||
@Override
|
||||
|
|
@ -110,21 +111,14 @@ public class GenreDetailActivity extends AbsMusicContentActivity implements CabH
|
|||
}
|
||||
|
||||
@Override
|
||||
public MaterialCab openCab(final int menu, final MaterialCab.Callback callback) {
|
||||
if (cab != null && cab.isActive()) cab.finish();
|
||||
cab = new MaterialCab(this, R.id.cab_stub)
|
||||
.setMenu(menu)
|
||||
.setCloseDrawableRes(R.drawable.ic_close_white_24dp)
|
||||
.setBackgroundColor(PreferenceUtil.getInstance(this).getPrimaryColor())
|
||||
.start(callback);
|
||||
|
||||
return cab;
|
||||
public void onCreateCab(AttachedCab cab) {
|
||||
this.cab = cab;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onBackPressed() {
|
||||
if (cab != null && cab.isActive()) {
|
||||
cab.finish();
|
||||
if (cab != null && AttachedCabKt.isActive(cab)) {
|
||||
AttachedCabKt.destroy(cab);
|
||||
} else {
|
||||
binding.recyclerView.stopScroll();
|
||||
super.onBackPressed();
|
||||
|
|
|
|||
|
|
@ -9,7 +9,8 @@ import androidx.annotation.NonNull;
|
|||
import androidx.recyclerview.widget.LinearLayoutManager;
|
||||
import androidx.recyclerview.widget.RecyclerView;
|
||||
|
||||
import com.afollestad.materialcab.MaterialCab;
|
||||
import com.afollestad.materialcab.attached.AttachedCab;
|
||||
import com.afollestad.materialcab.attached.AttachedCabKt;
|
||||
import com.dkanada.gramophone.BuildConfig;
|
||||
import com.dkanada.gramophone.activities.base.AbsMusicContentActivity;
|
||||
import com.dkanada.gramophone.databinding.ActivityPlaylistDetailBinding;
|
||||
|
|
@ -43,7 +44,7 @@ public class PlaylistDetailActivity extends AbsMusicContentActivity implements C
|
|||
|
||||
private Playlist playlist;
|
||||
|
||||
private MaterialCab cab;
|
||||
private AttachedCab cab;
|
||||
private SongAdapter adapter;
|
||||
|
||||
private RecyclerView.Adapter wrappedAdapter;
|
||||
|
|
@ -136,21 +137,14 @@ public class PlaylistDetailActivity extends AbsMusicContentActivity implements C
|
|||
}
|
||||
|
||||
@Override
|
||||
public MaterialCab openCab(final int menu, final MaterialCab.Callback callback) {
|
||||
if (cab != null && cab.isActive()) cab.finish();
|
||||
cab = new MaterialCab(this, R.id.cab_stub)
|
||||
.setMenu(menu)
|
||||
.setCloseDrawableRes(R.drawable.ic_close_white_24dp)
|
||||
.setBackgroundColor(PreferenceUtil.getInstance(this).getPrimaryColor())
|
||||
.start(callback);
|
||||
|
||||
return cab;
|
||||
public void onCreateCab(AttachedCab cab) {
|
||||
this.cab = cab;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onBackPressed() {
|
||||
if (cab != null && cab.isActive()) {
|
||||
cab.finish();
|
||||
if (cab != null && AttachedCabKt.isActive(cab)) {
|
||||
AttachedCabKt.destroy(cab);
|
||||
} else {
|
||||
binding.recyclerView.stopScroll();
|
||||
super.onBackPressed();
|
||||
|
|
|
|||
|
|
@ -35,7 +35,7 @@ public class PlaylistAdapter extends AbsMultiSelectAdapter<PlaylistAdapter.ViewH
|
|||
protected int itemLayoutRes;
|
||||
|
||||
public PlaylistAdapter(AppCompatActivity activity, List<Playlist> dataSet, @LayoutRes int itemLayoutRes, @Nullable CabHolder cabHolder) {
|
||||
super(activity, cabHolder, R.menu.menu_select_playlist);
|
||||
super(activity, R.id.cab_stub, R.menu.menu_select_playlist);
|
||||
|
||||
this.activity = activity;
|
||||
this.dataSet = dataSet;
|
||||
|
|
@ -178,7 +178,7 @@ public class PlaylistAdapter extends AbsMultiSelectAdapter<PlaylistAdapter.ViewH
|
|||
|
||||
@Override
|
||||
public void onClick(View view) {
|
||||
if (isInQuickSelectMode()) {
|
||||
if (isActive()) {
|
||||
toggleChecked(getBindingAdapterPosition());
|
||||
} else {
|
||||
Playlist playlist = dataSet.get(getBindingAdapterPosition());
|
||||
|
|
|
|||
|
|
@ -40,7 +40,7 @@ public class AlbumAdapter extends AbsMultiSelectAdapter<AlbumAdapter.ViewHolder,
|
|||
protected boolean usePalette;
|
||||
|
||||
public AlbumAdapter(@NonNull AppCompatActivity activity, List<Album> dataSet, @LayoutRes int itemLayoutRes, boolean usePalette, @Nullable CabHolder cabHolder) {
|
||||
super(activity, cabHolder, R.menu.menu_select_media);
|
||||
super(activity, R.id.cab_stub, R.menu.menu_select_media);
|
||||
|
||||
this.activity = activity;
|
||||
this.dataSet = dataSet;
|
||||
|
|
@ -214,7 +214,7 @@ public class AlbumAdapter extends AbsMultiSelectAdapter<AlbumAdapter.ViewHolder,
|
|||
|
||||
@Override
|
||||
public void onClick(View v) {
|
||||
if (isInQuickSelectMode()) {
|
||||
if (isActive()) {
|
||||
toggleChecked(getBindingAdapterPosition());
|
||||
} else {
|
||||
Pair transition = Pair.create(image, activity.getResources().getString(R.string.transition_album_image));
|
||||
|
|
|
|||
|
|
@ -40,7 +40,7 @@ public class ArtistAdapter extends AbsMultiSelectAdapter<ArtistAdapter.ViewHolde
|
|||
protected boolean usePalette;
|
||||
|
||||
public ArtistAdapter(@NonNull AppCompatActivity activity, List<Artist> dataSet, @LayoutRes int itemLayoutRes, boolean usePalette, @Nullable CabHolder cabHolder) {
|
||||
super(activity, cabHolder, R.menu.menu_select_media);
|
||||
super(activity, R.id.cab_stub, R.menu.menu_select_media);
|
||||
this.activity = activity;
|
||||
this.dataSet = dataSet;
|
||||
this.itemLayoutRes = itemLayoutRes;
|
||||
|
|
@ -188,7 +188,7 @@ public class ArtistAdapter extends AbsMultiSelectAdapter<ArtistAdapter.ViewHolde
|
|||
|
||||
@Override
|
||||
public void onClick(View v) {
|
||||
if (isInQuickSelectMode()) {
|
||||
if (isActive()) {
|
||||
toggleChecked(getBindingAdapterPosition());
|
||||
} else {
|
||||
Pair transition = Pair.create(image, activity.getResources().getString(R.string.transition_artist_image));
|
||||
|
|
|
|||
|
|
@ -1,126 +0,0 @@
|
|||
package com.dkanada.gramophone.adapter.base;
|
||||
|
||||
import android.content.Context;
|
||||
import android.view.Menu;
|
||||
import android.view.MenuItem;
|
||||
|
||||
import androidx.annotation.MenuRes;
|
||||
import androidx.annotation.Nullable;
|
||||
import androidx.recyclerview.widget.RecyclerView;
|
||||
|
||||
import com.afollestad.materialcab.MaterialCab;
|
||||
import com.dkanada.gramophone.R;
|
||||
import com.dkanada.gramophone.interfaces.CabHolder;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
public abstract class AbsMultiSelectAdapter<VH extends RecyclerView.ViewHolder, I> extends RecyclerView.Adapter<VH> implements MaterialCab.Callback {
|
||||
private final Context context;
|
||||
private final CabHolder cabHolder;
|
||||
private int menuRes;
|
||||
|
||||
private MaterialCab cab;
|
||||
private List<I> checked;
|
||||
|
||||
public AbsMultiSelectAdapter(Context context, @Nullable CabHolder cabHolder, @MenuRes int menuRes) {
|
||||
this.context = context;
|
||||
this.cabHolder = cabHolder;
|
||||
this.menuRes = menuRes;
|
||||
|
||||
this.checked = new ArrayList<>();
|
||||
}
|
||||
|
||||
protected void setMultiSelectMenuRes(@MenuRes int menuRes) {
|
||||
this.menuRes = menuRes;
|
||||
}
|
||||
|
||||
protected boolean toggleChecked(final int position) {
|
||||
if (cabHolder != null) {
|
||||
I identifier = getIdentifier(position);
|
||||
if (identifier == null) return false;
|
||||
|
||||
if (!checked.remove(identifier)) checked.add(identifier);
|
||||
|
||||
notifyItemChanged(position);
|
||||
updateCab();
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
protected void checkAll() {
|
||||
if (cabHolder != null) {
|
||||
checked.clear();
|
||||
for (int i = 0; i < getItemCount(); i++) {
|
||||
I identifier = getIdentifier(i);
|
||||
if (identifier != null) {
|
||||
checked.add(identifier);
|
||||
}
|
||||
}
|
||||
|
||||
notifyDataSetChanged();
|
||||
updateCab();
|
||||
}
|
||||
}
|
||||
|
||||
private void updateCab() {
|
||||
if (cabHolder != null) {
|
||||
if (cab == null || !cab.isActive()) {
|
||||
cab = cabHolder.openCab(menuRes, this);
|
||||
}
|
||||
|
||||
final int size = checked.size();
|
||||
if (size <= 0) cab.finish();
|
||||
else if (size == 1) cab.setTitle(getName(checked.get(0)));
|
||||
else cab.setTitle(context.getString(R.string.x_selected, size));
|
||||
}
|
||||
}
|
||||
|
||||
private void clearChecked() {
|
||||
checked.clear();
|
||||
notifyDataSetChanged();
|
||||
}
|
||||
|
||||
protected boolean isChecked(I identifier) {
|
||||
return checked.contains(identifier);
|
||||
}
|
||||
|
||||
protected boolean isInQuickSelectMode() {
|
||||
return cab != null && cab.isActive();
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean onCabCreated(MaterialCab materialCab, Menu menu) {
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean onCabItemClicked(MenuItem menuItem) {
|
||||
if (menuItem.getItemId() == R.id.action_select_all) {
|
||||
checkAll();
|
||||
} else {
|
||||
onMultipleItemAction(menuItem, new ArrayList<>(checked));
|
||||
cab.finish();
|
||||
clearChecked();
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean onCabFinished(MaterialCab materialCab) {
|
||||
clearChecked();
|
||||
return true;
|
||||
}
|
||||
|
||||
protected String getName(I object) {
|
||||
return object.toString();
|
||||
}
|
||||
|
||||
@Nullable
|
||||
protected abstract I getIdentifier(int position);
|
||||
|
||||
protected abstract void onMultipleItemAction(MenuItem menuItem, List<I> selection);
|
||||
}
|
||||
|
|
@ -0,0 +1,122 @@
|
|||
package com.dkanada.gramophone.adapter.base
|
||||
|
||||
import android.app.Activity
|
||||
import android.content.Context
|
||||
import android.view.MenuItem
|
||||
import androidx.recyclerview.widget.RecyclerView
|
||||
import com.afollestad.materialcab.attached.AttachedCab
|
||||
import com.afollestad.materialcab.attached.destroy
|
||||
import com.afollestad.materialcab.attached.isActive
|
||||
import com.afollestad.materialcab.attached.isDestroyed
|
||||
import com.afollestad.materialcab.createCab
|
||||
import com.dkanada.gramophone.R
|
||||
import com.dkanada.gramophone.interfaces.CabHolder
|
||||
import com.dkanada.gramophone.util.PreferenceUtil
|
||||
import java.util.*
|
||||
|
||||
abstract class AbsMultiSelectAdapter<VH : RecyclerView.ViewHolder, I>(
|
||||
private val context: Context,
|
||||
private val viewRes: Int,
|
||||
private var menuRes: Int,
|
||||
) : RecyclerView.Adapter<VH>() {
|
||||
private var checked: MutableList<I> = ArrayList()
|
||||
private var cab: AttachedCab? = null
|
||||
|
||||
protected fun isChecked(identifier: I): Boolean {
|
||||
return checked.contains(identifier)
|
||||
}
|
||||
|
||||
protected fun isActive(): Boolean {
|
||||
return cab.isActive()
|
||||
}
|
||||
|
||||
protected fun toggleChecked(position: Int): Boolean {
|
||||
val identifier = getIdentifier(position)
|
||||
|
||||
if (identifier != null && !checked.remove(identifier)) {
|
||||
checked.add(identifier)
|
||||
}
|
||||
|
||||
notifyItemChanged(position)
|
||||
updateCab()
|
||||
|
||||
return true
|
||||
}
|
||||
|
||||
protected fun setMenu(menuRes: Int) {
|
||||
this.menuRes = menuRes
|
||||
}
|
||||
|
||||
private fun updateCab() {
|
||||
when {
|
||||
cab == null || cab.isDestroyed() -> {
|
||||
val activity = context as Activity
|
||||
val cabHolder = context as CabHolder
|
||||
|
||||
cab = activity.createCab(viewRes) {
|
||||
menu(menuRes)
|
||||
|
||||
backgroundColor(literal = PreferenceUtil.getInstance(context).primaryColor)
|
||||
title(literal = getName(checked[0]))
|
||||
|
||||
onCreate { cab, _ -> cabHolder.onCreateCab(cab) }
|
||||
onSelection { item -> onSelectionCab(item) }
|
||||
onDestroy { onDestroyCab() }
|
||||
}
|
||||
}
|
||||
checked.size <= 0 && cab.isActive() -> {
|
||||
cab.destroy()
|
||||
}
|
||||
checked.size == 1 -> {
|
||||
cab?.title(literal = getName(checked[0]))
|
||||
}
|
||||
else -> {
|
||||
cab?.title(literal = context.getString(R.string.x_selected, checked.size))
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private fun checkAll() {
|
||||
checked.clear()
|
||||
|
||||
for (i in 0 until itemCount) {
|
||||
val identifier = getIdentifier(i)
|
||||
|
||||
if (identifier != null) {
|
||||
checked.add(identifier)
|
||||
}
|
||||
}
|
||||
|
||||
notifyDataSetChanged()
|
||||
updateCab()
|
||||
}
|
||||
|
||||
private fun checkNone() {
|
||||
checked.clear()
|
||||
notifyDataSetChanged()
|
||||
}
|
||||
|
||||
private fun onSelectionCab(menuItem: MenuItem): Boolean {
|
||||
if (menuItem.itemId == R.id.action_select_all) {
|
||||
checkAll()
|
||||
} else {
|
||||
onMultipleItemAction(menuItem, ArrayList(checked))
|
||||
cab.destroy()
|
||||
}
|
||||
|
||||
return true
|
||||
}
|
||||
|
||||
private fun onDestroyCab(): Boolean {
|
||||
checkNone()
|
||||
|
||||
return true
|
||||
}
|
||||
|
||||
protected abstract fun getName(identifier: I): String?
|
||||
|
||||
protected abstract fun getIdentifier(position: Int): I?
|
||||
|
||||
@JvmSuppressWildcards
|
||||
protected abstract fun onMultipleItemAction(menuItem: MenuItem, selection: List<I>)
|
||||
}
|
||||
|
|
@ -95,7 +95,7 @@ public abstract class AbsOffsetSongAdapter extends SongAdapter {
|
|||
|
||||
@Override
|
||||
public void onClick(View v) {
|
||||
if (isInQuickSelectMode() && getItemViewType() != OFFSET_ITEM) {
|
||||
if (isActive() && getItemViewType() != OFFSET_ITEM) {
|
||||
toggleChecked(getBindingAdapterPosition());
|
||||
} else {
|
||||
MusicPlayerRemote.openQueue(dataSet, getBindingAdapterPosition() - 1, true);
|
||||
|
|
|
|||
|
|
@ -20,7 +20,7 @@ import java.util.List;
|
|||
public class PlaylistSongAdapter extends AbsOffsetSongAdapter {
|
||||
public PlaylistSongAdapter(AppCompatActivity activity, @NonNull List<Song> dataSet, @LayoutRes int itemLayoutRes, boolean usePalette, @Nullable CabHolder cabHolder) {
|
||||
super(activity, dataSet, itemLayoutRes, usePalette, cabHolder, false);
|
||||
setMultiSelectMenuRes(R.menu.menu_select_playlist_song);
|
||||
setMenu(R.menu.menu_select_playlist_song);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
|
|
|||
|
|
@ -12,7 +12,6 @@ import androidx.annotation.Nullable;
|
|||
import androidx.core.util.Pair;
|
||||
import androidx.appcompat.app.AppCompatActivity;
|
||||
|
||||
import com.afollestad.materialcab.MaterialCab;
|
||||
import com.dkanada.gramophone.util.ThemeUtil;
|
||||
import com.dkanada.gramophone.R;
|
||||
import com.dkanada.gramophone.adapter.base.AbsMultiSelectAdapter;
|
||||
|
|
@ -32,7 +31,7 @@ import com.simplecityapps.recyclerview_fastscroll.views.FastScrollRecyclerView;
|
|||
|
||||
import java.util.List;
|
||||
|
||||
public class SongAdapter extends AbsMultiSelectAdapter<SongAdapter.ViewHolder, Song> implements MaterialCab.Callback, FastScrollRecyclerView.SectionedAdapter {
|
||||
public class SongAdapter extends AbsMultiSelectAdapter<SongAdapter.ViewHolder, Song> implements FastScrollRecyclerView.SectionedAdapter {
|
||||
protected final AppCompatActivity activity;
|
||||
protected List<Song> dataSet;
|
||||
|
||||
|
|
@ -46,7 +45,7 @@ public class SongAdapter extends AbsMultiSelectAdapter<SongAdapter.ViewHolder, S
|
|||
}
|
||||
|
||||
public SongAdapter(AppCompatActivity activity, List<Song> dataSet, @LayoutRes int itemLayoutRes, boolean usePalette, @Nullable CabHolder cabHolder, boolean showSectionName) {
|
||||
super(activity, cabHolder, R.menu.menu_select_media);
|
||||
super(activity, R.id.cab_stub, R.menu.menu_select_media);
|
||||
|
||||
this.activity = activity;
|
||||
this.dataSet = dataSet;
|
||||
|
|
@ -262,7 +261,7 @@ public class SongAdapter extends AbsMultiSelectAdapter<SongAdapter.ViewHolder, S
|
|||
|
||||
@Override
|
||||
public void onClick(View v) {
|
||||
if (isInQuickSelectMode()) {
|
||||
if (isActive()) {
|
||||
toggleChecked(getBindingAdapterPosition());
|
||||
} else {
|
||||
MusicPlayerRemote.openQueue(dataSet, getBindingAdapterPosition(), true);
|
||||
|
|
|
|||
|
|
@ -34,7 +34,7 @@ public class AlbumsFragment extends AbsLibraryPagerRecyclerViewCustomGridSizeFra
|
|||
notifyLayoutResChanged(itemLayoutRes);
|
||||
|
||||
List<Album> dataSet = getAdapter() == null ? new ArrayList<>() : getAdapter().getDataSet();
|
||||
return new AlbumAdapter(getLibraryFragment().getMainActivity(), dataSet, itemLayoutRes, loadUsePalette(), getLibraryFragment());
|
||||
return new AlbumAdapter(getLibraryFragment().getMainActivity(), dataSet, itemLayoutRes, loadUsePalette(), getLibraryFragment().getMainActivity());
|
||||
}
|
||||
|
||||
@NonNull
|
||||
|
|
|
|||
|
|
@ -36,7 +36,7 @@ public class ArtistsFragment extends AbsLibraryPagerRecyclerViewCustomGridSizeFr
|
|||
notifyLayoutResChanged(itemLayoutRes);
|
||||
|
||||
List<Artist> dataSet = getAdapter() == null ? new ArrayList<>() : getAdapter().getDataSet();
|
||||
return new ArtistAdapter(getLibraryFragment().getMainActivity(), dataSet, itemLayoutRes, loadUsePalette(), getLibraryFragment());
|
||||
return new ArtistAdapter(getLibraryFragment().getMainActivity(), dataSet, itemLayoutRes, loadUsePalette(), getLibraryFragment().getMainActivity());
|
||||
}
|
||||
|
||||
@NonNull
|
||||
|
|
|
|||
|
|
@ -29,7 +29,7 @@ public class PlaylistsFragment extends AbsLibraryPagerRecyclerViewFragment<Playl
|
|||
@Override
|
||||
protected PlaylistAdapter createAdapter() {
|
||||
List<Playlist> dataSet = getAdapter() == null ? new ArrayList<>() : getAdapter().getDataSet();
|
||||
return new PlaylistAdapter(getLibraryFragment().getMainActivity(), dataSet, R.layout.item_list_single_row, getLibraryFragment());
|
||||
return new PlaylistAdapter(getLibraryFragment().getMainActivity(), dataSet, R.layout.item_list_single_row, getLibraryFragment().getMainActivity());
|
||||
}
|
||||
|
||||
@NonNull
|
||||
|
|
|
|||
|
|
@ -45,14 +45,14 @@ public class SongsFragment extends AbsLibraryPagerRecyclerViewCustomGridSizeFrag
|
|||
dataSet,
|
||||
itemLayoutRes,
|
||||
usePalette,
|
||||
getLibraryFragment());
|
||||
getLibraryFragment().getMainActivity());
|
||||
} else {
|
||||
adapter = new SongAdapter(
|
||||
getLibraryFragment().getMainActivity(),
|
||||
dataSet,
|
||||
itemLayoutRes,
|
||||
usePalette,
|
||||
getLibraryFragment());
|
||||
getLibraryFragment().getMainActivity());
|
||||
}
|
||||
|
||||
return adapter;
|
||||
|
|
|
|||
|
|
@ -21,14 +21,11 @@ import com.dkanada.gramophone.helper.MusicPlayerRemote;
|
|||
import com.dkanada.gramophone.util.ShortcutUtil;
|
||||
import com.dkanada.gramophone.util.ThemeUtil;
|
||||
import com.google.android.material.appbar.AppBarLayout;
|
||||
import com.afollestad.materialcab.MaterialCab;
|
||||
import com.dkanada.gramophone.R;
|
||||
import com.dkanada.gramophone.adapter.MusicLibraryPagerAdapter;
|
||||
import com.dkanada.gramophone.dialogs.CreatePlaylistDialog;
|
||||
import com.dkanada.gramophone.model.SortMethod;
|
||||
import com.dkanada.gramophone.model.SortOrder;
|
||||
import com.dkanada.gramophone.interfaces.CabHolder;
|
||||
import com.dkanada.gramophone.activities.MainActivity;
|
||||
import com.dkanada.gramophone.activities.SearchActivity;
|
||||
import com.dkanada.gramophone.fragments.library.AbsLibraryPagerRecyclerViewCustomGridSizeFragment;
|
||||
import com.dkanada.gramophone.fragments.library.AlbumsFragment;
|
||||
|
|
@ -36,11 +33,10 @@ import com.dkanada.gramophone.fragments.library.PlaylistsFragment;
|
|||
import com.dkanada.gramophone.fragments.library.SongsFragment;
|
||||
import com.dkanada.gramophone.util.PreferenceUtil;
|
||||
|
||||
public class LibraryFragment extends AbsMainActivityFragment implements CabHolder, MainActivity.MainActivityFragmentCallbacks, ViewPager.OnPageChangeListener, SharedPreferences.OnSharedPreferenceChangeListener {
|
||||
public class LibraryFragment extends AbsMainActivityFragment implements ViewPager.OnPageChangeListener, SharedPreferences.OnSharedPreferenceChangeListener {
|
||||
private FragmentLibraryBinding binding;
|
||||
|
||||
private MusicLibraryPagerAdapter pagerAdapter;
|
||||
private MaterialCab cab;
|
||||
|
||||
public static LibraryFragment newInstance() {
|
||||
return new LibraryFragment();
|
||||
|
|
@ -130,18 +126,6 @@ public class LibraryFragment extends AbsMainActivityFragment implements CabHolde
|
|||
return getCurrentFragment() instanceof PlaylistsFragment;
|
||||
}
|
||||
|
||||
@Override
|
||||
public MaterialCab openCab(final int menuRes, final MaterialCab.Callback callback) {
|
||||
if (cab != null && cab.isActive()) cab.finish();
|
||||
cab = new MaterialCab(getMainActivity(), R.id.cab_stub)
|
||||
.setMenu(menuRes)
|
||||
.setCloseDrawableRes(R.drawable.ic_close_white_24dp)
|
||||
.setBackgroundColor(PreferenceUtil.getInstance(requireActivity()).getPrimaryColor())
|
||||
.start(callback);
|
||||
|
||||
return cab;
|
||||
}
|
||||
|
||||
public void addOnAppBarOffsetChangedListener(AppBarLayout.OnOffsetChangedListener onOffsetChangedListener) {
|
||||
binding.appbar.addOnOffsetChangedListener(onOffsetChangedListener);
|
||||
}
|
||||
|
|
@ -403,16 +387,6 @@ public class LibraryFragment extends AbsMainActivityFragment implements CabHolde
|
|||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean handleBackPress() {
|
||||
if (cab != null && cab.isActive()) {
|
||||
cab.finish();
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,9 +1,13 @@
|
|||
package com.dkanada.gramophone.interfaces;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
import android.view.MenuItem;
|
||||
|
||||
import com.afollestad.materialcab.MaterialCab;
|
||||
import com.afollestad.materialcab.attached.AttachedCab;
|
||||
|
||||
public interface CabHolder {
|
||||
MaterialCab openCab(final int menuRes, final MaterialCab.Callback callback);
|
||||
default void onCreateCab(AttachedCab cab) {}
|
||||
|
||||
default void onSelectionCab(MenuItem item) {}
|
||||
|
||||
default void onDestroyCab(AttachedCab cab) {}
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue