package com.nf2m.fragment;
import android.animation.Animator;
import android.annotation.TargetApi;
import android.app.AlertDialog;
import android.app.SearchManager;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.DialogInterface;
import android.content.DialogInterface.OnClickListener;
import android.content.Intent;
import android.content.IntentFilter;
import android.database.Cursor;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.drawable.Drawable;
import android.net.Uri;
import android.os.AsyncTask;
import android.os.Build;
import android.os.Bundle;
import android.provider.BaseColumns;
import android.provider.MediaStore;
import android.provider.MediaStore.Audio.PlaylistsColumns;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.v4.app.Fragment;
import android.support.v4.app.LoaderManager;
import android.support.v4.content.ContextCompat;
import android.support.v4.content.CursorLoader;
import android.support.v4.content.Loader;
import android.support.v4.view.MenuItemCompat;
import android.support.v7.graphics.Palette;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.support.v7.widget.SearchView;
import android.support.v7.widget.SearchView.OnQueryTextListener;
import android.text.Editable;
import android.text.TextUtils;
import android.text.TextWatcher;
import android.transition.Slide;
import android.transition.Transition;
import android.util.Log;
import android.view.ActionMode;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.view.WindowManager;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;
import com.nf2m.R;
import com.nf2m.activity.TarMediaPlayerActivity;
import com.nf2m.adapter.LibraryCursorAdapter;
import com.nf2m.listener.OnItemLongClickListener;
import com.nf2m.model.Library;
import com.nf2m.model.Playlists;
import com.nf2m.model.Songs;
import com.nf2m.preferences.Preferences;
import com.nf2m.service.MediaPlayerService;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
import xyz.danoz.recyclerviewfastscroller.sectionindicator.title.SectionTitleIndicator;
import xyz.danoz.recyclerviewfastscroller.vertical.VerticalRecyclerViewFastScroller;
public abstract class BaseFragment extends Fragment implements
ActionMode.Callback, View.OnClickListener, OnItemLongClickListener {
private static final String STATE_ADD = "add";
private static final String STATE_CREATE = "create";
public static final String ACTION_SONG_DETAIL = "action_song_detail";
public static final String KEY_SONG_TITLE = "key_song_title";
public static final String KEY_ALBUM_ART_PATH = "key_album_art_path";
public static final String ACTION_PLAY_STATE = "action_play_state";
private static final String STATE_DELETE = "delete";
private static final String SONG_ID_TAG = "OnlineSong ids";
private static Menu menu;
static String artistName;
static String numberOfSongs;
static String albumName;
View view;
static boolean isFilter;
private int playlistId;
private String state;
private String searchSelection;
private RecyclerView lvLibraryList;
private Library libraries;
@Nullable
private Cursor libraryCursor;
private LibraryCursorAdapter libraryAdapter;
int selectionNumber;
private String title_selectedNumber;
private String title_addNewPlaylist;
private String title_save;
private String title_cancel;
private String title_success_addNewPlaylist;
private String title_ok;
private String title_warning;
private String playlistName;
private String title_answer_delete;
private String title_success_delete;
private String title_success_addToPlaylist;
private int selectedSongNumber;
private String title_songSetAsRingtone;
private String title_text_new_playlist;
private String title_error;
private ImageView ivPlayerPlay;
private ImageView ivPlayerNext;
private ImageView ivPlayerPrevious;
private TextView tvSongDetails;
private boolean isRegReciever;
@Nullable
private String filterText;
private String where;
private String[] selectionArgs;
private ArrayList<String> selectionArray;
@Nullable
ActionMode actionMode;
SearchView searchView;
private boolean isNowPlayingList;
public static boolean isAlbumSong = false;
public static boolean isArtist = false;
static String albumArtPath;
@NonNull
private final BroadcastReceiver playerReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, @NonNull Intent intent) {
if (intent.getAction().equalsIgnoreCase(ACTION_SONG_DETAIL)) {
Bundle data = intent.getExtras();
String songTitle = data.getString(KEY_SONG_TITLE);
String albumArtPath = data.getString(KEY_ALBUM_ART_PATH);
Drawable albumArt = Drawable.createFromPath(albumArtPath);
initPlayer(songTitle, albumArt);
NowPlayingFragment.songTitle = songTitle;
libraryAdapter.notifyDataSetChanged();
} else if (intent.getAction().equalsIgnoreCase(ACTION_PLAY_STATE)) {
Drawable playDrawable = choicePlayDrawable();
ivPlayerPlay.setImageDrawable(playDrawable);
libraryAdapter.notifyDataSetChanged();
}
}
};
@NonNull
private final OnQueryTextListener onQueryTextListener = new OnQueryTextListener() {
@Override
public boolean onQueryTextSubmit(String query) {
return false;
}
@Override
public boolean onQueryTextChange(String newText) {
filterText = !TextUtils.isEmpty(newText) ? newText : null;
getLoaderManager().restartLoader(0, null, loaderCallbacks);
return true;
}
};
@Nullable
private final LoaderManager.LoaderCallbacks<Cursor> loaderCallbacks = new LoaderManager.LoaderCallbacks<Cursor>() {
@NonNull
@Override
public Loader<Cursor> onCreateLoader(int i, Bundle bundle) {
if (filterText == null) {
isFilter = false;
return new CursorLoader(getActivity(), libraries.getUri(), null, where, selectionArgs, libraries.getSortOrder());
} else {
isFilter = true;
String searchValueFirst = filterText + "%";
String searchValueMiddle = "%" + filterText + "%";
String searchValueLast = "%" + filterText;
//album artist gibi şarkılar içinden ayrı bi liste oluşturulan yapılar için where kullanılır.
if (where != null) {
return new CursorLoader(getActivity(), libraries.getUri(), null, where + " AND ( " +
searchSelection + " LIKE ? OR " + searchSelection
+ " LIKE ? OR " + searchSelection + " LIKE ? )",
new String[]{selectionArgs[0], searchValueFirst, searchValueMiddle,
searchValueLast}, libraries.getSortOrder());
} else {
System.out.println(libraries.getUri() + " " + libraries.getSortOrder());
return new CursorLoader(getActivity(), libraries.getUri(),
null, searchSelection + " LIKE ? OR " + searchSelection
+ " LIKE ? OR " + searchSelection + " LIKE ? ",
new String[]{searchValueFirst, searchValueMiddle,
searchValueLast}, libraries.getSortOrder());
}
}
}
@Override
public void onLoadFinished(Loader<Cursor> loader, @Nullable Cursor cursor) {
if (cursor == null) {
cursor = libraries.getCursor();
}
libraryAdapter.swapCursor(cursor);
libraryCursor = cursor;
}
@Override
public void onLoaderReset(Loader<Cursor> loader) {
libraryAdapter.swapCursor(null);
}
};
private Cursor playlistCursor;
private AlertDialog dialog;
VerticalRecyclerViewFastScroller fastScroller;
private SectionTitleIndicator sectionTitleIndicator;
private Preferences preferences;
private ViewGroup playerCustomView;
private Cursor tempCursor;
LinearLayoutManager linearLayoutManager;
private ViewGroup albumSongLayout;
private ImageView ivPlayerAlbumArt;
private int primaryColor;
private int primaryDarkColor;
@TargetApi(Build.VERSION_CODES.KITKAT)
@Override
public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
view = inflater.inflate(R.layout.list_layout, container, false);
initMessages();
setHasOptionsMenu(true);
initPlayerVariables();
initListener();
initReceiver();
initAlbumSong();
return view;
}
@Override
public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
initPlayer(NowPlayingFragment.songTitle, initAlbumPath());
}
private Drawable initAlbumPath() {
if (isAlbumSong) {
if (albumArtPath != null) {
return Drawable.createFromPath(albumArtPath);
}
} else if (MediaPlayerService.songsCursor != null && MediaPlayerService.songsCursor.getCount() != 0) {
String albumId = MediaPlayerService.songsCursor.getString(MediaPlayerService.songsCursor.getColumnIndexOrThrow(MediaStore.Audio.AudioColumns.ALBUM_ID));
albumArtPath = NowPlayingFragment.getAlbumPath(albumId, getContext());
if (albumArtPath != null) {
return Drawable.createFromPath(albumArtPath);
}
}
albumArtPath = null;
return null;
}
private void initAlbumSong() {
if (isAlbumSong) {
Drawable albumArt;
albumSongLayout.setVisibility(View.VISIBLE);
String songSize = getResources().getQuantityString(R.plurals.title_s_song, Integer.decode(numberOfSongs), Integer.decode(numberOfSongs));
ImageView ivASAlbumArt = (ImageView) view.findViewById(R.id.ivASAlbumArt);
TextView tvASAlbumName = (TextView) view.findViewById(R.id.tvASAlbumName);
TextView tvASArtistName = (TextView) view.findViewById(R.id.tvASArtistName);
TextView tvASSongSize = (TextView) view.findViewById(R.id.tvASSongSize);
if (albumArtPath != null) {
albumArt = Drawable.createFromPath(albumArtPath);
} else {
albumArt = getDrawable(R.drawable.ic_default_albumart);
}
ivASAlbumArt.setImageDrawable(albumArt);
tvASAlbumName.setText(albumName);
tvASArtistName.setText(artistName);
tvASSongSize.setText(songSize);
}
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
preferences = Preferences.newInstance(getContext());
}
private void initLoader() {
getLoaderManager().initLoader(0, null, loaderCallbacks);
}
private void initReceiver() {
IntentFilter filter = new IntentFilter();
filter.addAction(ACTION_SONG_DETAIL);
filter.addAction(ACTION_PLAY_STATE);
getActivity().registerReceiver(playerReceiver, filter);
isRegReciever = true;
}
private void initListener() {
ivPlayerPlay.setOnClickListener(this);
ivPlayerNext.setOnClickListener(this);
ivPlayerPrevious.setOnClickListener(this);
tvSongDetails.setOnClickListener(this);
}
private void initPlayerVariables() {
ivPlayerPlay = (ImageView) view.findViewById(R.id.ivPlayerPlay);
ivPlayerNext = (ImageView) view.findViewById(R.id.ivPlayerNext);
ivPlayerPrevious = (ImageView) view.findViewById(R.id.ivPlayerPrevious);
ivPlayerAlbumArt = (ImageView) view.findViewById(R.id.ivPlayerAlbumArt);
tvSongDetails = (TextView) view.findViewById(R.id.tvPlayerSongDetail);
playerCustomView = (ViewGroup) view.findViewById(R.id.playerCustomView);
albumSongLayout = (ViewGroup) view.findViewById(R.id.albumSongCustomFrame);
}
private void initPlayer(@Nullable String songTitle, Drawable albumArt) {
if (albumArt != null) {
ivPlayerAlbumArt.setImageDrawable(albumArt);
} else {
albumArt = getDrawable(R.drawable.ic_default_albumart);
ivPlayerAlbumArt.setImageDrawable(albumArt);
}
initColor(albumArtPath);
if (TarMediaPlayerActivity.sdkInt >= Build.VERSION_CODES.LOLLIPOP) {
setAnimMaterial(primaryColor, primaryDarkColor);
} else {
setAnim(primaryColor);
}
if (tvSongDetails != null && songTitle != null) {
tvSongDetails.setText(songTitle);
}
Drawable playDrawable = choicePlayDrawable();
ivPlayerPlay.setImageDrawable(playDrawable);
}
private void initColor(String albumArtPath) {
Bitmap bitmap = BitmapFactory.decodeFile(albumArtPath);
if (bitmap != null) {
Palette palette = Palette.from(bitmap).generate();
primaryColor = palette.getVibrantColor(getColor(R.color.primary_text));
primaryDarkColor = palette.getDarkVibrantColor(getColor(R.color.primary_text));
} else {
primaryColor = getColor(R.color.primary);
primaryDarkColor = getColor(R.color.primary_dark);
}
}
private int getColor(int id) {
return ContextCompat.getColor(getContext(), id);
}
private Drawable choicePlayDrawable() {
if (MediaPlayerService.isPlaying) {
return getDrawable(R.drawable.ic_pause);
} else {
return getDrawable(R.drawable.ic_play);
}
}
private Drawable getDrawable(int id) {
return ContextCompat.getDrawable(getContext(), id);
}
@Override
public void onClick(@NonNull View v) {
switch (v.getId()) {
case R.id.ivPlayerPlay:
Intent playIntent = new Intent(MediaPlayerService.ACTION_PLAY);
getActivity().sendBroadcast(playIntent);
break;
case R.id.ivPlayerNext:
Intent nextIntent = new Intent(MediaPlayerService.ACTION_NEXT);
getActivity().sendBroadcast(nextIntent);
break;
case R.id.ivPlayerPrevious:
Intent previousIntent = new Intent(MediaPlayerService.ACTION_PREVIOUS);
getActivity().sendBroadcast(previousIntent);
break;
case R.id.bAddNewPlaylist:
addNewPlaylist(tempCursor);
dialog.dismiss();
actionMode.finish();
break;
case R.id.tvPlayerSongDetail:
TarMediaPlayerActivity.item_state = TarMediaPlayerActivity.ITEM_STATE_NOW;
getActivity().onBackPressed();
break;
}
}
@Override
public void onDestroy() {
if (isRegReciever) {
getActivity().unregisterReceiver(playerReceiver);
}
super.onDestroy();
}
@NonNull
MenuInflater getMenuInflater() {
return getActivity().getMenuInflater();
}
@NonNull
LayoutInflater getLayoutInflater() {
return getActivity().getLayoutInflater();
}
// ------------------------GET-SET------------------------------------------
String getWhere() {
return where;
}
ArrayList<String> getSelectionArray() {
return selectionArray;
}
boolean isNowPlayingList() {
return isNowPlayingList;
}
void setLvLibraryList(@NonNull RecyclerView lvLibraryList) {
this.lvLibraryList = lvLibraryList;
lvLibraryList.setHasFixedSize(true);
fastScroller = (VerticalRecyclerViewFastScroller) view.findViewById(R.id.fast_scroller);
sectionTitleIndicator =
(SectionTitleIndicator) view.findViewById(R.id.fast_scroller_section_title_indicator);
fastScroller.setRecyclerView(lvLibraryList);
lvLibraryList.addOnScrollListener(fastScroller.getOnScrollListener());
fastScroller.setSectionIndicator(sectionTitleIndicator);
}
void setLibraryAdapter(final LibraryCursorAdapter libraryAdapter) {
this.libraryAdapter = libraryAdapter;
}
void setLibraryCursor(Cursor libraryCursor) {
this.libraryCursor = libraryCursor;
}
void setLibraries(Library libraries) {
this.libraries = libraries;
}
void setSearchSelection(String searchSelection) {
this.searchSelection = searchSelection;
}
void setSelectedSongNumber(int selectedSongNumber) {
this.selectedSongNumber = selectedSongNumber;
}
void setWhere(String where) {
this.where = where;
}
void setSelectionArgs(String[] selectionArgs) {
this.selectionArgs = selectionArgs;
}
void setSelectionArray(ArrayList<String> selectionArray) {
this.selectionArray = selectionArray;
}
void setNowPlayingList(boolean nowPlayingList) {
isNowPlayingList = nowPlayingList;
}
// ------------------------GET-SET------------------------------------------
// ------------------------INIT-MESSAGE-------------------------------------
/**
* Xmlden mesajlar getirilir.
*/
private void initMessages() {
title_selectedNumber = getMessage(R.string.title_selectedNumber);
title_addNewPlaylist = getMessage(R.string.title_addNewPlaylist);
title_save = getMessage(R.string.title_save);
title_cancel = getMessage(R.string.title_cancel);
title_success_addNewPlaylist = getMessage(R.string.title_success_addNewPlaylist);
title_ok = getMessage(R.string.title_ok);
title_warning = getMessage(R.string.title_warning);
title_songSetAsRingtone = getMessage(R.string.title_songAsPhoneRingtone);
title_text_new_playlist = getMessage(R.string.title_text_new_playlist);
title_error = getMessage(R.string.titleDeleteError);
}
private String successAddToPlaylistMessage() {
return getResources().getQuantityString(R.plurals.title_p_success_addToPlaylist,
selectedSongNumber, selectedSongNumber);
}
private String answerDeleteMessage() {
return getResources().getQuantityString(R.plurals.title_p_answer_delete, selectedSongNumber);
}
private String successDeleteMessage() {
return getResources().getQuantityString(R.plurals.title_p_success_delete,
selectedSongNumber, selectedSongNumber);
}
private String getMessage(int resource) {
return getResources().getString(resource);
}
// ------------------------INIT-MESSAGE-------------------------------------
// ------------------------INIT-SELECTED-CURSOR------------------------------
/**
* Seçilmiş itemler üzerinde işlemler(silme,ekleme vb.) yapmak için library
* sınıfının cursorü set edilir. Bu cursor içinde seçilmiş sarkılar vardır.
*/
@Nullable
protected abstract Cursor initSelectedItemCursor();
/**
* Adapterden alınan seçilmiş itemların özellikleri bir string arraye
* kaydedilir.
*/
@NonNull
String[] getStringArray(String uri) {
List<String> stringList = getStringListInLibrary(uri);
String[] libraryStrings = new String[stringList.size()];
stringList.toArray(libraryStrings);
return libraryStrings;
}
/**
* Adapterdeki seçilmiş itemların listviewdeki posizyonları alınıp bu
* itemların özellikleri alınır. Ve bir liste eklenir.
*/
@NonNull
private List<String> getStringListInLibrary(String uri) {
List positionList = libraryAdapter.getPositionList();
List<String> stringList = new LinkedList<>();
for (int i = 0; i < positionList.size(); i++) {
stringList.add(getStringInLibraryCursor((Integer) positionList.get(i), uri));
}
Log.i(SONG_ID_TAG, stringList.toString());
return stringList;
}
/**
* Cursordeki bir ögenin özellikleri alınır.
*/
private String getStringInLibraryCursor(int position, String uri) {
libraryCursor.moveToPosition(position);
return libraryCursor.getString(getColumnIndex(uri));
}
/**
* Cursordeki bir sütunun indexi alınır.
*/
private int getColumnIndex(String uri) {
return libraryCursor.getColumnIndexOrThrow(uri);
}
/**
* Seçilmiş itemların şarkı cursorde bulunması için kullanılır.
*/
String getSelection(String column, @NonNull String[] args) {
String selection = column + " IN (";
for (int i = 0; i < args.length; i++) {
selection += args[i];
if (i < args.length - 1) {
selection += ",";
}
}
selection += ")";
return selection;
}
// ------------------------INIT-SELECTED-CURSOR------------------------------
// ------------------------ITEM-LONG-CLICK------------------------------------
@Override
public void onItemLongClick(int position) {
if (actionMode != null) {
return;
}
actionMode = TarMediaPlayerActivity.toolbar.startActionMode(this);
toggleSelection(position);
}
// ------------------------ITEM-LONG-CLICK------------------------------------
// ------------------------TOUCH-LISTENER--------------------------------------
/**
* Bir öge sürüklenirse ekranın sağında bir oynatma listesi çıkar.Bu
* listenin oluşturulması burada yapılır.
*
* @param songCursor
*/
private void createPlaylistView(final Cursor songCursor) {
final ArrayAdapter<String> arrayAdapter = new ArrayAdapter<>(
getActivity(),
android.R.layout.simple_selectable_list_item);
View popupLayout = getLayoutInflater().inflate(
R.layout.playlist_popup_layout, null);
AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
builder.setView(popupLayout);
Button bAddNewPlaylist = (Button) popupLayout
.findViewById(R.id.bAddNewPlaylist);
bAddNewPlaylist.setOnClickListener(this);
tempCursor = songCursor;
Library playlist = new Playlists(getContext());
playlistCursor = playlist.getCursor();
if (playlistCursor.getCount() != 0) {
playlistCursor.moveToFirst();
do {
String playlistName = playlistCursor.getString(playlistCursor.getColumnIndexOrThrow(PlaylistsColumns.NAME));
arrayAdapter.add(playlistName);
} while (playlistCursor.moveToNext());
}
builder.setAdapter(arrayAdapter, new OnClickListener() {
@Override
public void onClick(@NonNull DialogInterface dialog, int which) {
addToPlaylist(which, songCursor);
dialog.dismiss();
actionMode.finish();
}
});
dialog = builder.create();
dialog.show();
}
// ------------------------MULTICHOICE-LISTENER---------------------------------------
// @Override
public boolean onCreateActionMode(ActionMode mode, @NonNull Menu menu) {
BaseFragment.menu = menu;
getMenuInflater().inflate(R.menu.song_activity_context_menu, menu);
menu.findItem(R.id.scmRemove).setVisible(false);
menu.findItem(R.id.scmRemoveSelect).setVisible(false);
return true;
}
// ------------------------TOUCH-LISTENER--------------------------------------
// ------------------------DRAG-LISTENER---------------------------------------
@Override
public boolean onPrepareActionMode(ActionMode mode, Menu menu) {
return false;
}
// ------------------------DRAG-LISTENER---------------------------------------------
@Override
public boolean onActionItemClicked(@NonNull ActionMode mode, @NonNull MenuItem item) {
Cursor songCursor = initSelectedItemCursor();
switch (item.getItemId()) {
case R.id.scmSelectAll:
menu.findItem(R.id.scmRemoveSelect).setVisible(true);
menu.findItem(R.id.scmSelectAll).setVisible(false);
libraryAdapter.selectAllItem();
selectionNumber = libraryCursor.getCount();
mode.setTitle(selectionNumber + " " + title_selectedNumber);
break;
case R.id.scmRemoveSelect:
menu.findItem(R.id.scmRemoveSelect).setVisible(false);
menu.findItem(R.id.scmSelectAll).setVisible(true);
libraryAdapter.removeSelectAllItems();
selectionNumber = 1;
mode.setTitle(selectionNumber + " " + title_selectedNumber);
break;
case R.id.scmDelete:
deleteSongsDialog(songCursor);
break;
case R.id.scmAddToPlaylist:
createPlaylistView(songCursor);
break;
case R.id.scmSetAsPhoneRingtone:
libraries.setAsPhoneRingtone(songCursor);
toastMassege(title_songSetAsRingtone);
actionMode.finish();
break;
case R.id.scmShare:
libraries.share(songCursor);
actionMode.finish();
break;
case R.id.scmSearch:
String search = libraryCursor
.getString(getColumnIndex(searchSelection));
libraries.search(search);
actionMode.finish();
break;
case R.id.scmDetails:
actionMode.finish();
break;
}
return true;
}
/**
* Silme işlemi yapılır.
*/
private void deleteSongsDialog(final Cursor songCursor) {
AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
builder.setTitle(title_warning);
choicePluralOrSingularMessage();
builder.setMessage(title_answer_delete);
builder.setPositiveButton(title_ok, new OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
state = STATE_DELETE;
new BackgroundTask(songCursor).execute();
actionMode.finish();
}
});
builder.setNegativeButton(title_cancel, new OnClickListener() {
@Override
public void onClick(@NonNull DialogInterface dialog, int which) {
dialog.cancel();
}
});
AlertDialog dialog = builder.create();
dialog.show();
}
@Override
public void onDestroyActionMode(ActionMode mode) {
libraryAdapter.clearSelection();
selectionNumber = 0;
actionMode = null;
}
// ------------------------DELETE---------------------------------------
void toggleSelection(int position) {
if (!libraryAdapter.isPositionChecked(position)) {
libraryAdapter.addNewSelection(position, true);
selectionNumber++;
} else {
libraryAdapter.removeSelection(position);
selectionNumber--;
}
if (selectionNumber == 0) {
actionMode.finish();
return;
}
actionMode.setTitle(selectionNumber + " " + title_selectedNumber);
}
// ------------------------DELETE---------------------------------------
/**
* Tekil veya çoğul mesajları seçer.Eğer bir şarkı seçildiyse tekil birden
* fazla şarkı seçilirse çoğul mesaj set edilir.
*/
private void choicePluralOrSingularMessage() {
title_answer_delete = answerDeleteMessage();
title_success_delete = successDeleteMessage();
title_success_addToPlaylist = successAddToPlaylistMessage();
}
private void toastMassege(String message) {
Toast.makeText(getContext(), message, Toast.LENGTH_SHORT)
.show();
}
// ------------------------MULTICHOICE-LISTENER---------------------------------------
// ------------------------BACKGROUND-TASK--------------------------------------------
/**
* Arama çubuğu eklendi. Bulunduğu listenin tipine göre arama yapmaktadır.
* Şarkı listesi ise bu listeden şarkı araması yapmaktadpır.
*/
@Override
public void onCreateOptionsMenu(@NonNull Menu menu, @NonNull MenuInflater inflater) {
super.onCreateOptionsMenu(menu, inflater);
inflater.inflate(R.menu.base_options_menu, menu);
menu.findItem(R.id.omAddNewPlaylist).setVisible(false);
initSearchItem(menu);
}
private void initSearchItem(@NonNull Menu menu) {
initLoader();
final SearchManager manager = (SearchManager) getContext().getSystemService(Context.SEARCH_SERVICE);
MenuItem item = menu.findItem(
R.id.omSearchView);
searchView = (SearchView) MenuItemCompat.getActionView(item);
searchView.setSearchableInfo(manager
.getSearchableInfo(getActivity().getComponentName()));
searchView.setOnQueryTextListener(onQueryTextListener);
}
/**
* Eğer liste filtrelenmiş ise bizim ana listedeki pozisyonu döndürür.
* Filtrelenmiş listedeki pozisyonu alıp gerçek listedeki yeri bulunur.
*/
int getPositionInMainCursor(int filteredPosition) {
Cursor mainCursor = libraries.getCursor();
mainCursor.moveToFirst();
libraryCursor.moveToPosition(filteredPosition);
int songId = libraryCursor.getInt(libraryCursor.getColumnIndexOrThrow(MediaStore.Audio.AudioColumns._ID));
do {
int tempSongId = mainCursor.getInt(mainCursor.getColumnIndexOrThrow(MediaStore.Audio.AudioColumns._ID));
if (songId == tempSongId) {
break;
}
} while (mainCursor.moveToNext());
return mainCursor.getPosition();
}
/**
* Eğer edittext boş ise save butonu işlemez hale gelir
*/
void playlistNameKeyListener(@NonNull final AlertDialog dialog, @NonNull final EditText etNewPlaylistName) {
etNewPlaylistName.addTextChangedListener(new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
if (etNewPlaylistName.getText().toString().isEmpty()) {
dialog.getButton(AlertDialog.BUTTON_POSITIVE).setEnabled(false);
} else {
dialog.getButton(AlertDialog.BUTTON_POSITIVE).setEnabled(true);
}
}
@Override
public void afterTextChanged(Editable s) {
}
});
}
/**
* Yeni bir şarkı listesi oluşturulacağı zaman varsayılan olarak bir
* isim verilir.
*/
@Nullable
String createNewPlaylistName(@NonNull Cursor playlistCursor) {
String newPlaylistName = null;
try {
for (int i = 1; i <= playlistCursor.getCount() + 1; i++) {
boolean existName = false;
newPlaylistName = title_text_new_playlist + i;
if (playlistCursor.getCount() != 0) {
playlistCursor.moveToFirst();
do {
String playlistName = playlistCursor
.getString(playlistCursor
.getColumnIndexOrThrow(PlaylistsColumns.NAME));
if (playlistName.equals(newPlaylistName)) {
existName = true;
break;
}
} while (playlistCursor.moveToNext());
if (!existName) {
break;
}
}
}
playlistCursor.close();
} catch (NullPointerException e) {
e.printStackTrace();
newPlaylistName = title_text_new_playlist;
}
return newPlaylistName;
}
Uri getPlaylistUri() {
return MediaStore.Audio.Playlists.EXTERNAL_CONTENT_URI;
}
// -------------------------SONG LIST REMOVE AND ADD------------------
// -------------------------SONG LIST REMOVE AND ADD------------------
/**
* Oynatma listeslerinden herhangi birine öge eklenir.
*/
private void addToPlaylist(int position, Cursor songCursor) {
playlistCursor.moveToPosition(position);
playlistId = playlistCursor.getInt(playlistCursor
.getColumnIndexOrThrow(BaseColumns._ID));
state = STATE_ADD;
new BackgroundTask(songCursor).execute();
}
// ------------------------DRAG-LISTENER-ENTERED-------------------------------------
// ------------------------DRAG-LISTENER-DROP-------------------------------------
/**
* Yeni bir oynatma listesi eklenir.
*/
private void addNewPlaylist(final Cursor songCursor) {
AlertDialog.Builder builder = new AlertDialog.Builder(
getActivity());
View newPlaylistView = getLayoutInflater().inflate(
R.layout.add_newplaylist_alert_dialog_tv, null);
final EditText etNewPlaylistName = (EditText) newPlaylistView
.findViewById(R.id.etNewPlaylistName);
String newPlaylistName = createNewPlaylistName(playlistCursor);
etNewPlaylistName.setText(newPlaylistName);
builder.setView(etNewPlaylistName);
final AlertDialog dialog = builder.create();
etNewPlaylistName.setOnFocusChangeListener(new View.OnFocusChangeListener() {
@Override
public void onFocusChange(View v, boolean hasFocus) {
if (hasFocus) {
dialog.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);
}
}
});
playlistNameKeyListener(dialog, etNewPlaylistName);
dialog.setTitle(title_addNewPlaylist);
dialog.setButton(AlertDialog.BUTTON_POSITIVE, title_save, new OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
playlistName = etNewPlaylistName.getText().toString();
if (!playlistName.isEmpty()) {
state = STATE_CREATE;
new BackgroundTask(songCursor).execute();
}
}
});
dialog.setButton(AlertDialog.BUTTON_NEGATIVE, title_cancel, new OnClickListener() {
@Override
public void onClick(@NonNull DialogInterface dialog, int which) {
dialog.cancel();
}
});
dialog.show();
}
// ------------------------DRAG-LISTENER-DROP-------------------------------------
// -------------------------SONG ASYNCTASK---------------------------
/**
* Silme , ekleme ve oluşturma işlemleri bir arka plan servislerinde
* yapılır.
*/
private class BackgroundTask extends AsyncTask<Void, Void, Void> {
private boolean deleteSuccess;
private final Cursor songCursor;
BackgroundTask(Cursor songCursor) {
this.songCursor = songCursor;
}
@Override
protected void onPreExecute() {
super.onPreExecute();
choicePluralOrSingularMessage();
}
@Nullable
@Override
protected Void doInBackground(Void... params) {
if (state.equalsIgnoreCase(STATE_DELETE)) {
deleteSuccess = libraries.deletedSongs(songCursor);
} else if (state.equalsIgnoreCase(STATE_ADD)) {
libraries.addToPlaylist(playlistId, songCursor);
} else if (state.equalsIgnoreCase(STATE_CREATE)) {
libraries.createPlaylist(playlistName, getPlaylistUri(), songCursor);
}
return null;
}
@Override
protected void onPostExecute(Void result) {
super.onPostExecute(result);
if (state.equalsIgnoreCase(STATE_DELETE)) {
if (deleteSuccess) {
if (!libraries.getCursor().isClosed()) {
libraryAdapter.notifyDataSetChanged();
libraries.getCursor().requery();
toastMassege(title_success_delete);
}
} else {
toastMassege(title_error);
}
} else if (state.equalsIgnoreCase(STATE_ADD)) {
toastMassege(title_success_addToPlaylist);
} else if (state.equalsIgnoreCase(STATE_CREATE)) {
toastMassege(title_success_addNewPlaylist);
toastMassege(title_success_addToPlaylist);
}
}
}
// ---------------------NOW PLAYING LIST ADD SONG TASK --------------------------------
/**
* recycler view layout managera bağlanır
*/
void setLayoutManager() {
linearLayoutManager = new LinearLayoutManager(getContext());
linearLayoutManager.setOrientation(LinearLayoutManager.VERTICAL);
scroll();
lvLibraryList.setLayoutManager(linearLayoutManager);
}
private void scroll() {
if (NowPlayingFragment.play_state.equalsIgnoreCase(NowPlayingFragment.PAUSE)) {
linearLayoutManager.scrollToPosition(preferences.getPrefSongPosition());
} else {
linearLayoutManager.scrollToPosition(0);
}
}
@TargetApi(Build.VERSION_CODES.LOLLIPOP)
void setAnimMaterial(int primaryColor, int primaryColorDark) {
getActivity().getWindow().setStatusBarColor(primaryColorDark);
TarMediaPlayerActivity.toolbar.setBackgroundColor(primaryColor);
playerCustomView.setBackgroundColor(primaryColor);
sectionTitleIndicator.setBackgroundColor(primaryColor);
}
void setAnim(int primaryColor) {
TarMediaPlayerActivity.toolbar.setBackgroundColor(primaryColor);
playerCustomView.setBackgroundColor(primaryColor);
sectionTitleIndicator.setBackgroundColor(primaryColor);
}
@TargetApi(Build.VERSION_CODES.LOLLIPOP)
void initAnim(@NonNull Fragment fragment) {
TarMediaPlayerActivity.slideTransition = new Slide();
TarMediaPlayerActivity.slideTransition.addListener(new Transition.TransitionListener() {
@Override
public void onTransitionStart(Transition transition) {
}
@Override
public void onTransitionEnd(Transition transition) {
}
@Override
public void onTransitionCancel(Transition transition) {
}
@Override
public void onTransitionPause(Transition transition) {
}
@Override
public void onTransitionResume(Transition transition) {
}
});
TarMediaPlayerActivity.slideTransition.setSlideEdge(Gravity.LEFT);
TarMediaPlayerActivity.slideTransition.setDuration(200);
fragment.setEnterTransition(TarMediaPlayerActivity.slideTransition);
}
}