reduce calls to loader classes for backend changes

This commit is contained in:
dkanada 2019-07-16 03:00:40 -07:00
commit 9923a4c1e0
36 changed files with 7 additions and 463 deletions

View file

@ -1,211 +0,0 @@
package com.kabouzeid.gramophone.adapter;
import android.graphics.PorterDuff;
import android.graphics.drawable.Drawable;
import androidx.annotation.LayoutRes;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;
import android.view.LayoutInflater;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import com.bumptech.glide.Glide;
import com.bumptech.glide.load.engine.DiskCacheStrategy;
import com.bumptech.glide.signature.MediaStoreSignature;
import com.kabouzeid.appthemehelper.util.ATHUtil;
import com.kabouzeid.gramophone.R;
import com.kabouzeid.gramophone.adapter.base.AbsMultiSelectAdapter;
import com.kabouzeid.gramophone.adapter.base.MediaEntryViewHolder;
import com.kabouzeid.gramophone.glide.audiocover.AudioFileCover;
import com.kabouzeid.gramophone.interfaces.CabHolder;
import com.kabouzeid.gramophone.util.ImageUtil;
import com.simplecityapps.recyclerview_fastscroll.views.FastScrollRecyclerView;
import java.io.File;
import java.text.DecimalFormat;
import java.util.ArrayList;
import java.util.List;
public class SongFileAdapter extends AbsMultiSelectAdapter<SongFileAdapter.ViewHolder, File> implements FastScrollRecyclerView.SectionedAdapter {
private static final int FILE = 0;
private static final int FOLDER = 1;
private final AppCompatActivity activity;
private List<File> dataSet;
private final int itemLayoutRes;
@Nullable
private final Callbacks callbacks;
public SongFileAdapter(@NonNull AppCompatActivity activity, @NonNull List<File> songFiles, @LayoutRes int itemLayoutRes, @Nullable Callbacks callback, @Nullable CabHolder cabHolder) {
super(activity, cabHolder, R.menu.menu_media_selection);
this.activity = activity;
this.dataSet = songFiles;
this.itemLayoutRes = itemLayoutRes;
this.callbacks = callback;
setHasStableIds(true);
}
@Override
public int getItemViewType(int position) {
return dataSet.get(position).isDirectory() ? FOLDER : FILE;
}
@Override
public long getItemId(int position) {
return dataSet.get(position).hashCode();
}
public void swapDataSet(@NonNull List<File> songFiles) {
this.dataSet = songFiles;
notifyDataSetChanged();
}
@Override
@NonNull
public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
return new ViewHolder(LayoutInflater.from(activity).inflate(itemLayoutRes, parent, false));
}
@Override
public void onBindViewHolder(@NonNull ViewHolder holder, int index) {
final File file = dataSet.get(index);
holder.itemView.setActivated(isChecked(file));
if (holder.getAdapterPosition() == getItemCount() - 1) {
if (holder.shortSeparator != null) {
holder.shortSeparator.setVisibility(View.GONE);
}
} else {
if (holder.shortSeparator != null) {
holder.shortSeparator.setVisibility(View.VISIBLE);
}
}
if (holder.title != null) {
holder.title.setText(getFileTitle(file));
}
if (holder.text != null) {
if (holder.getItemViewType() == FILE) {
holder.text.setText(getFileText(file));
} else {
holder.text.setVisibility(View.GONE);
}
}
if (holder.image != null) {
loadFileImage(file, holder);
}
}
protected String getFileTitle(File file) {
return file.getName();
}
protected String getFileText(File file) {
return file.isDirectory() ? null : readableFileSize(file.length());
}
@SuppressWarnings("ConstantConditions")
protected void loadFileImage(File file, final ViewHolder holder) {
final int iconColor = ATHUtil.resolveColor(activity, R.attr.iconColor);
if (file.isDirectory()) {
holder.image.setColorFilter(iconColor, PorterDuff.Mode.SRC_IN);
holder.image.setImageResource(R.drawable.ic_folder_white_24dp);
} else {
Drawable error = ImageUtil.getTintedVectorDrawable(activity, R.drawable.ic_file_music_white_24dp, iconColor);
Glide.with(activity)
.load(new AudioFileCover(file.getPath()))
.diskCacheStrategy(DiskCacheStrategy.NONE)
.error(error)
.placeholder(error)
.animate(android.R.anim.fade_in)
.signature(new MediaStoreSignature("", file.lastModified(), 0))
.into(holder.image);
}
}
public static String readableFileSize(long size) {
if (size <= 0) return size + " B";
final String[] units = new String[]{"B", "KB", "MB", "GB", "TB"};
int digitGroups = (int) (Math.log10(size) / Math.log10(1024));
return new DecimalFormat("#,##0.##").format(size / Math.pow(1024, digitGroups)) + " " + units[digitGroups];
}
@Override
public int getItemCount() {
return dataSet.size();
}
@Override
protected File getIdentifier(int position) {
return dataSet.get(position);
}
@Override
protected String getName(File object) {
return getFileTitle(object);
}
@Override
protected void onMultipleItemAction(MenuItem menuItem, List<File> selection) {
if (callbacks == null) return;
callbacks.onMultipleItemAction(menuItem, selection);
}
@NonNull
@Override
public String getSectionName(int position) {
return String.valueOf(dataSet.get(position).getName().charAt(0)).toUpperCase();
}
public class ViewHolder extends MediaEntryViewHolder {
public ViewHolder(View itemView) {
super(itemView);
if (menu != null && callbacks != null) {
menu.setOnClickListener(v -> {
int position = getAdapterPosition();
if (isPositionInRange(position)) {
callbacks.onFileMenuClicked(dataSet.get(position), v);
}
});
}
}
@Override
public void onClick(View v) {
int position = getAdapterPosition();
if (isPositionInRange(position)) {
if (isInQuickSelectMode()) {
toggleChecked(position);
} else {
if (callbacks != null) {
callbacks.onFileSelected(dataSet.get(position));
}
}
}
}
@Override
public boolean onLongClick(View view) {
int position = getAdapterPosition();
return isPositionInRange(position) && toggleChecked(position);
}
private boolean isPositionInRange(int position) {
return position >= 0 && position < dataSet.size();
}
}
public interface Callbacks {
void onFileSelected(File file);
void onFileMenuClicked(File file, View view);
void onMultipleItemAction(MenuItem item, List<File> files);
}
}

View file

@ -18,18 +18,19 @@ import java.util.List;
* @author Karim Abou Zeid (kabouzeid)
*/
public abstract class AbsMultiSelectAdapter<VH extends RecyclerView.ViewHolder, I> extends RecyclerView.Adapter<VH> implements MaterialCab.Callback {
@Nullable
private final Context context;
private final CabHolder cabHolder;
private int menuRes;
private MaterialCab cab;
private List<I> checked;
private int menuRes;
private final Context context;
public AbsMultiSelectAdapter(Context context, @Nullable CabHolder cabHolder, @MenuRes int menuRes) {
this.cabHolder = cabHolder;
checked = new ArrayList<>();
this.menuRes = menuRes;
this.context = context;
this.cabHolder = cabHolder;
this.menuRes = menuRes;
this.checked = new ArrayList<>();
}
protected void setMultiSelectMenuRes(@MenuRes int menuRes) {

View file

@ -1,93 +0,0 @@
package com.kabouzeid.gramophone.helper;
import android.app.SearchManager;
import android.content.Context;
import android.os.Bundle;
import android.provider.MediaStore;
import androidx.annotation.NonNull;
import com.kabouzeid.gramophone.loader.SongLoader;
import com.kabouzeid.gramophone.model.Song;
import java.util.ArrayList;
import java.util.List;
/**
* @author Karim Abou Zeid (kabouzeid)
*/
public class SearchQueryHelper {
private static final String TITLE_SELECTION = "lower(" + MediaStore.Audio.AudioColumns.TITLE + ") = ?";
private static final String ALBUM_SELECTION = "lower(" + MediaStore.Audio.AudioColumns.ALBUM + ") = ?";
private static final String ARTIST_SELECTION = "lower(" + MediaStore.Audio.AudioColumns.ARTIST + ") = ?";
private static final String AND = " AND ";
@NonNull
public static List<Song> getSongs(@NonNull final Context context, @NonNull final Bundle extras) {
final String query = extras.getString(SearchManager.QUERY, null);
final String artistName = extras.getString(MediaStore.EXTRA_MEDIA_ARTIST, null);
final String albumName = extras.getString(MediaStore.EXTRA_MEDIA_ALBUM, null);
final String titleName = extras.getString(MediaStore.EXTRA_MEDIA_TITLE, null);
List<Song> songs = new ArrayList<>();
if (artistName != null && albumName != null && titleName != null) {
songs = SongLoader.getSongs(SongLoader.makeSongCursor(context, ARTIST_SELECTION + AND + ALBUM_SELECTION + AND + TITLE_SELECTION, new String[]{artistName.toLowerCase().trim(), albumName.toLowerCase().trim(), titleName.toLowerCase().trim()}));
}
if (!songs.isEmpty()) {
return songs;
}
if (artistName != null && titleName != null) {
songs = SongLoader.getSongs(SongLoader.makeSongCursor(context, ARTIST_SELECTION + AND + TITLE_SELECTION, new String[]{artistName.toLowerCase().trim(), titleName.toLowerCase().trim()}));
}
if (!songs.isEmpty()) {
return songs;
}
if (albumName != null && titleName != null) {
songs = SongLoader.getSongs(SongLoader.makeSongCursor(context, ALBUM_SELECTION + AND + TITLE_SELECTION, new String[]{albumName.toLowerCase().trim(), titleName.toLowerCase().trim()}));
}
if (!songs.isEmpty()) {
return songs;
}
if (artistName != null) {
songs = SongLoader.getSongs(SongLoader.makeSongCursor(context, ARTIST_SELECTION, new String[]{artistName.toLowerCase().trim()}));
}
if (!songs.isEmpty()) {
return songs;
}
if (albumName != null) {
songs = SongLoader.getSongs(SongLoader.makeSongCursor(context, ALBUM_SELECTION, new String[]{albumName.toLowerCase().trim()}));
}
if (!songs.isEmpty()) {
return songs;
}
if (titleName != null) {
songs = SongLoader.getSongs(SongLoader.makeSongCursor(context, TITLE_SELECTION, new String[]{titleName.toLowerCase().trim()}));
}
if (!songs.isEmpty()) {
return songs;
}
songs = SongLoader.getSongs(SongLoader.makeSongCursor(context, ARTIST_SELECTION, new String[]{query.toLowerCase().trim()}));
if (!songs.isEmpty()) {
return songs;
}
songs = SongLoader.getSongs(SongLoader.makeSongCursor(context, ALBUM_SELECTION, new String[]{query.toLowerCase().trim()}));
if (!songs.isEmpty()) {
return songs;
}
songs = SongLoader.getSongs(SongLoader.makeSongCursor(context, TITLE_SELECTION, new String[]{query.toLowerCase().trim()}));
if (!songs.isEmpty()) {
return songs;
}
return SongLoader.getSongs(context, query);
}
}

View file

@ -2,17 +2,14 @@ package com.kabouzeid.gramophone.ui.activities;
import android.annotation.SuppressLint;
import android.content.Intent;
import android.net.Uri;
import android.os.Build;
import android.os.Bundle;
import android.os.Handler;
import android.provider.MediaStore;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import com.google.android.material.navigation.NavigationView;
import androidx.fragment.app.Fragment;
import androidx.drawerlayout.widget.DrawerLayout;
import android.util.Log;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
@ -24,25 +21,16 @@ import com.bumptech.glide.Glide;
import com.kabouzeid.appthemehelper.ThemeStore;
import com.kabouzeid.appthemehelper.util.ATHUtil;
import com.kabouzeid.appthemehelper.util.NavigationViewUtil;
import com.kabouzeid.gramophone.App;
import com.kabouzeid.gramophone.R;
import com.kabouzeid.gramophone.glide.SongGlideRequest;
import com.kabouzeid.gramophone.helper.MusicPlayerRemote;
import com.kabouzeid.gramophone.helper.SearchQueryHelper;
import com.kabouzeid.gramophone.loader.AlbumLoader;
import com.kabouzeid.gramophone.loader.ArtistLoader;
import com.kabouzeid.gramophone.loader.PlaylistSongLoader;
import com.kabouzeid.gramophone.model.Song;
import com.kabouzeid.gramophone.service.MusicService;
import com.kabouzeid.gramophone.ui.activities.base.AbsSlidingMusicPanelActivity;
import com.kabouzeid.gramophone.ui.fragments.mainactivity.library.LibraryFragment;
import com.kabouzeid.gramophone.util.MusicUtil;
import com.sothree.slidinguppanel.SlidingUpPanelLayout;
import java.util.ArrayList;
import java.util.List;
import butterknife.BindView;
import butterknife.ButterKnife;
@ -102,7 +90,6 @@ public class MainActivity extends AbsSlidingMusicPanelActivity {
NavigationViewUtil.setItemIconColors(navigationView, ATHUtil.resolveColor(this, R.attr.iconColor, ThemeStore.textColorSecondary(this)), accentColor);
NavigationViewUtil.setItemTextColors(navigationView, ThemeStore.textColorPrimary(this), accentColor);
checkSetUpPro();
navigationView.setNavigationItemSelectedListener(menuItem -> {
drawerLayout.closeDrawers();
switch (menuItem.getItemId()) {
@ -110,9 +97,6 @@ public class MainActivity extends AbsSlidingMusicPanelActivity {
navigationView.setCheckedItem(R.id.nav_library);
setCurrentFragment(LibraryFragment.newInstance());
break;
case R.id.buy_pro:
new Handler().postDelayed(() -> startActivity(new Intent(MainActivity.this, PurchaseActivity.class)), 200);
break;
case R.id.nav_settings:
new Handler().postDelayed(() -> startActivity(new Intent(MainActivity.this, SettingsActivity.class)), 200);
break;
@ -124,16 +108,6 @@ public class MainActivity extends AbsSlidingMusicPanelActivity {
});
}
private void checkSetUpPro() {
if (App.isProVersion()) {
setUpPro();
}
}
private void setUpPro() {
navigationView.getMenu().removeGroup(R.id.navigation_drawer_menu_category_buy_pro);
}
private void setUpDrawerLayout() {
setUpNavigationView();
}
@ -174,7 +148,6 @@ public class MainActivity extends AbsSlidingMusicPanelActivity {
public void onServiceConnected() {
super.onServiceConnected();
updateNavigationDrawerHeader();
handlePlaybackIntent(getIntent());
}
@Override
@ -199,71 +172,6 @@ public class MainActivity extends AbsSlidingMusicPanelActivity {
return super.handleBackPress() || (currentFragment != null && currentFragment.handleBackPress());
}
private void handlePlaybackIntent(@Nullable Intent intent) {
if (intent == null) {
return;
}
Uri uri = intent.getData();
String mimeType = intent.getType();
boolean handled = false;
if (intent.getAction() != null && intent.getAction().equals(MediaStore.INTENT_ACTION_MEDIA_PLAY_FROM_SEARCH)) {
final List<Song> songs = SearchQueryHelper.getSongs(this, intent.getExtras());
if (MusicPlayerRemote.getShuffleMode() == MusicService.SHUFFLE_MODE_SHUFFLE) {
MusicPlayerRemote.openAndShuffleQueue(songs, true);
} else {
MusicPlayerRemote.openQueue(songs, 0, true);
}
handled = true;
}
if (uri != null && uri.toString().length() > 0) {
MusicPlayerRemote.playFromUri(uri);
handled = true;
} else if (MediaStore.Audio.Playlists.CONTENT_TYPE.equals(mimeType)) {
final int id = (int) parseIdFromIntent(intent, "playlistId", "playlist");
if (id >= 0) {
int position = intent.getIntExtra("position", 0);
List<Song> songs = new ArrayList<>(PlaylistSongLoader.getPlaylistSongList(this, id));
MusicPlayerRemote.openQueue(songs, position, true);
handled = true;
}
} else if (MediaStore.Audio.Albums.CONTENT_TYPE.equals(mimeType)) {
final int id = (int) parseIdFromIntent(intent, "albumId", "album");
if (id >= 0) {
int position = intent.getIntExtra("position", 0);
MusicPlayerRemote.openQueue(AlbumLoader.getAlbum(this, id).songs, position, true);
handled = true;
}
} else if (MediaStore.Audio.Artists.CONTENT_TYPE.equals(mimeType)) {
final int id = (int) parseIdFromIntent(intent, "artistId", "artist");
if (id >= 0) {
int position = intent.getIntExtra("position", 0);
MusicPlayerRemote.openQueue(ArtistLoader.getArtist(this, id).getSongs(), position, true);
handled = true;
}
}
if (handled) {
setIntent(new Intent());
}
}
private long parseIdFromIntent(@NonNull Intent intent, String longKey, String stringKey) {
long id = intent.getLongExtra(longKey, -1);
if (id < 0) {
String idString = intent.getStringExtra(stringKey);
if (idString != null) {
try {
id = Long.parseLong(idString);
} catch (NumberFormatException e) {
Log.e(TAG, e.getMessage());
}
}
}
return id;
}
@Override
public void onPanelExpanded(View view) {
super.onPanelExpanded(view);

View file

@ -53,7 +53,7 @@ public class PurchaseActivity extends AbsBaseActivity implements BillingProcesso
setSupportActionBar(toolbar);
//noinspection ConstantConditions
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
getSupportActionBar().setTitle(getString(R.string.buy_pro));
getSupportActionBar().setTitle(getString(R.string.app_name));
restoreButton.setEnabled(false);
purchaseButton.setEnabled(false);

View file

@ -9,7 +9,6 @@ import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import androidx.appcompat.widget.SearchView;
import androidx.appcompat.widget.Toolbar;
import android.text.TextUtils;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
@ -19,9 +18,6 @@ import com.kabouzeid.appthemehelper.ThemeStore;
import com.kabouzeid.gramophone.R;
import com.kabouzeid.gramophone.adapter.SearchAdapter;
import com.kabouzeid.gramophone.interfaces.LoaderIds;
import com.kabouzeid.gramophone.loader.AlbumLoader;
import com.kabouzeid.gramophone.loader.ArtistLoader;
import com.kabouzeid.gramophone.loader.SongLoader;
import com.kabouzeid.gramophone.misc.WrappedAsyncTaskLoader;
import com.kabouzeid.gramophone.ui.activities.base.AbsMusicServiceActivity;
import com.kabouzeid.gramophone.util.Util;
@ -192,25 +188,6 @@ public class SearchActivity extends AbsMusicServiceActivity implements SearchVie
@Override
public List<Object> loadInBackground() {
List<Object> results = new ArrayList<>();
if (!TextUtils.isEmpty(query)) {
List songs = SongLoader.getSongs(getContext(), query.trim());
if (!songs.isEmpty()) {
results.add(getContext().getResources().getString(R.string.songs));
results.addAll(songs);
}
List artists = ArtistLoader.getArtists(getContext(), query.trim());
if (!artists.isEmpty()) {
results.add(getContext().getResources().getString(R.string.artists));
results.addAll(artists);
}
List albums = AlbumLoader.getAlbums(getContext(), query.trim());
if (!albums.isEmpty()) {
results.add(getContext().getResources().getString(R.string.albums));
results.addAll(albums);
}
}
return results;
}
}