package com.nf2m.fragment; import android.annotation.TargetApi; import android.app.Activity; import android.content.Intent; import android.database.Cursor; import android.graphics.Bitmap; import android.graphics.Bitmap.CompressFormat; import android.graphics.BitmapFactory; import android.net.Uri; import android.os.AsyncTask; import android.os.Build; import android.os.Bundle; import android.provider.BaseColumns; import android.provider.MediaStore.Audio.AlbumColumns; import android.provider.MediaStore.Audio.AudioColumns; import android.support.annotation.NonNull; import android.support.annotation.Nullable; import android.support.v4.content.ContextCompat; import android.support.v7.graphics.Palette; import android.support.v7.widget.RecyclerView; import android.view.View; import android.widget.AbsListView; import android.widget.RelativeLayout; import android.widget.Toast; import com.nf2m.R; import com.nf2m.activity.TarMediaPlayerActivity; import com.nf2m.adapter.AlbumCursorAdapter; import com.nf2m.listener.ActionItemClick; import com.nf2m.listener.OnItemClickListener; import com.nf2m.model.Albums; import com.nf2m.model.Library; import com.nf2m.model.Songs; import com.nf2m.util.ImageCache; import com.nf2m.util.ImageFetcher; import com.nf2m.util.Utils; import com.nf2m.view.AutofitRecyclerView; import java.io.File; import java.io.FileOutputStream; public class AlbumsFragment extends BaseFragment implements ActionItemClick, OnItemClickListener { public static final String EXTRA_ALBUM = "album"; private static final String ALBUM_ART_PATH = "album_art_path"; private static final int REQUEST_CODE_GALLERY = 1; public static final String EXTRA_ALBUM_ID = "album_id"; private AutofitRecyclerView lvAlbumList; private Cursor albumCursor; private AlbumCursorAdapter albumAdapter; private static final String IMAGE_CACHE_DIR = "thumbs"; public static ImageFetcher mImageFetcher; @TargetApi(Build.VERSION_CODES.KITKAT) @Override public void onViewCreated(View view, Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); ((TarMediaPlayerActivity) getActivity()).setActionBarTitle(getString(R.string.title_albums)); } void initFragment(@NonNull Cursor albumCursor, Albums albums) { initImageFetcher(); initLvAlbumList(); initAlbums(albums); initAlbumCursor(albumCursor); initAlbumCursorAdapter(); lvAlbumListSetSongAdapter(); setLayoutManager(); setListeners(); setSearchSelection(AlbumColumns.ALBUM); if (albumCursor.getCount() == 0) { //RelativeLayout noSongs = (RelativeLayout) view.findViewById(R.id.noSongs); //noSongs.setVisibility(View.VISIBLE); } } private void initImageFetcher() { int mImageThumbSize = getResources().getDimensionPixelSize(R.dimen.image_thumbnail_size); ImageCache.ImageCacheParams cacheParams = new ImageCache.ImageCacheParams(getActivity(), IMAGE_CACHE_DIR); cacheParams.setMemCacheSizePercent(0.25f); // Set memory cache to 25% of app memory // The ImageFetcher takes care of loading images into our ImageView children asynchronously mImageFetcher = new ImageFetcher(getActivity(), mImageThumbSize); mImageFetcher.setLoadingImage(R.drawable.empty_photo); mImageFetcher.addImageCache(getActivity().getSupportFragmentManager(), cacheParams); } private void setListeners() { albumAdapter.setOnItemClickListener(this); albumAdapter.setOnLongItemClickListener(this); lvAlbumList.addOnScrollListener(new RecyclerView.OnScrollListener() { @Override public void onScrollStateChanged(RecyclerView recyclerView, int newState) { if (newState == AbsListView.OnScrollListener.SCROLL_STATE_FLING) { // Before Honeycomb pause image loading on scroll to help with performance if (!Utils.hasHoneycomb()) { mImageFetcher.setPauseWork(true); } } else { mImageFetcher.setPauseWork(false); } } }); } private void lvAlbumListSetSongAdapter() { lvAlbumList.setAdapter(albumAdapter); setLvLibraryList(lvAlbumList); fastScroller.setVisibility(View.GONE); } private void initAlbumCursorAdapter() { albumAdapter = new AlbumCursorAdapter(getActivity(), albumCursor, this); setLibraryAdapter(albumAdapter); } private void initAlbumCursor(Cursor albumCursor) { this.albumCursor = albumCursor; setLibraryCursor(albumCursor); } private void initAlbums(Albums albums) { setLibraries(albums); } private void initLvAlbumList() { lvAlbumList = (AutofitRecyclerView) view.findViewById(R.id.lvList); } @Nullable @Override public Cursor initSelectedItemCursor() { Library songs = new Songs(getContext()); String[] albumsName = getStringArray(AudioColumns.ALBUM); String selection = getSelection(AudioColumns.ALBUM, albumsName); Cursor cursor = getContext().getContentResolver().query(songs.getUri(), null, selection, null, null); assert cursor != null; setSelectedSongNumber(cursor.getCount()); return cursor; } @Override public void onActivityResult(int requestCode, int resultCode, Intent data) { if (resultCode == Activity.RESULT_OK) { if (requestCode == REQUEST_CODE_GALLERY) { new AlbumArtChangeTask(data).execute(); } } } private class AlbumArtChangeTask extends AsyncTask<Void, Void, Void> { private final Intent data; public AlbumArtChangeTask(Intent data) { this.data = data; } @Nullable @Override protected Void doInBackground(Void... params) { try { Uri imageUri = data.getData(); Bundle bundle = getActivity().getIntent().getExtras(); String albumArtPath = bundle.getString(ALBUM_ART_PATH); String albumThumbPath = bundle.getString(AlbumCursorAdapter.ALBUM_THUMB_PATH); File albumArtFile = new File(albumArtPath); File albumThumbFile = new File(albumThumbPath); Bitmap imageBitmap = BitmapFactory .decodeStream(getContext().getContentResolver().openInputStream( imageUri)); FileOutputStream fosArt = new FileOutputStream( albumArtFile); FileOutputStream fosThumb = new FileOutputStream(albumThumbFile); if (imageBitmap != null) { Bitmap sbArt = Bitmap.createScaledBitmap(imageBitmap, 800, 800, true); sbArt.compress(CompressFormat.JPEG, 55, fosArt); Bitmap sbThumb = Bitmap.createScaledBitmap(imageBitmap, 200, 200, true); sbThumb.compress(CompressFormat.JPEG, 55, fosThumb); } fosArt.close(); fosThumb.close(); if (mImageFetcher != null) { mImageFetcher.clearCache(); } getActivity().runOnUiThread(new Runnable() { @Override public void run() { albumAdapter.notifyDataSetChanged(); } }); } catch (Exception e) { e.printStackTrace(); Toast.makeText(getContext(), R.string.title_image_error, Toast.LENGTH_SHORT).show(); } return null; } } private String getStringInCursor(@NonNull Cursor cursor, String uri) { return cursor.getString(albumCursor.getColumnIndexOrThrow(uri)); } @Override public void actionClick(int position) { albumCursor.moveToPosition(position); String albumId = getStringInCursor(albumCursor, BaseColumns._ID); String albumName = getStringInCursor(albumCursor, AudioColumns.ALBUM); String albumArtPath = getStringInCursor(albumCursor, AlbumColumns.ALBUM_ART); String artistName = getStringInCursor(albumCursor, AlbumColumns.ARTIST); String numberOfSongs = getStringInCursor(albumCursor, AlbumColumns.NUMBER_OF_SONGS); AlbumSongFragment albumsFragment = new AlbumSongFragment(); Bundle bundle = new Bundle(); bundle.putString(EXTRA_ALBUM, albumName); bundle.putString(EXTRA_ALBUM_ID, albumId); albumsFragment.setArguments(bundle); if (TarMediaPlayerActivity.sdkInt >= Build.VERSION_CODES.LOLLIPOP) { initAnim(albumsFragment); } getFragmentManager().beginTransaction().replace(R.id.container, albumsFragment) .addToBackStack(albumsFragment.getClass().getName()).commit(); BaseFragment.isAlbumSong = true; BaseFragment.albumArtPath = albumArtPath; BaseFragment.artistName = artistName; BaseFragment.numberOfSongs = numberOfSongs; BaseFragment.albumName = albumName; } @Override public void onItemClick(int position) { if (actionMode != null) { toggleSelection(position); return; } if (isFilter) { position = getPositionInMainCursor(position); actionClick(position); searchView.clearFocus(); searchView.onActionViewCollapsed(); } else { actionClick(position); } } @Override public void onPause() { super.onPause(); mImageFetcher.setPauseWork(false); mImageFetcher.setExitTasksEarly(true); mImageFetcher.flushCache(); } @Override public void onResume() { super.onResume(); mImageFetcher.setExitTasksEarly(false); albumAdapter.notifyDataSetChanged(); } @Override public void onDestroy() { mImageFetcher.closeCache(); albumCursor.close(); super.onDestroy(); } @Override public void setLayoutManager() { lvAlbumList.setHasFixedSize(true); } }