package com.sdsmdg.harjot.MusicDNA.activities; import android.app.Activity; import android.app.Dialog; import android.app.NotificationManager; import android.content.ComponentName; import android.content.ContentResolver; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; import android.content.ServiceConnection; import android.content.SharedPreferences; import android.content.pm.PackageInfo; import android.content.pm.PackageManager; import android.content.res.ColorStateList; import android.database.Cursor; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.drawable.ColorDrawable; import android.net.ConnectivityManager; import android.net.NetworkInfo; import android.net.Uri; import android.os.AsyncTask; import android.os.Build; import android.os.Bundle; import android.os.Environment; import android.os.Handler; import android.os.IBinder; import android.provider.MediaStore; import android.support.design.widget.CollapsingToolbarLayout; import android.support.design.widget.NavigationView; import android.support.v4.view.GravityCompat; import android.support.v4.widget.DrawerLayout; import android.support.v7.app.ActionBar; import android.support.v7.app.ActionBarDrawerToggle; import android.support.v7.app.AppCompatActivity; import android.support.v7.widget.DefaultItemAnimator; import android.support.v7.widget.LinearLayoutManager; import android.support.v7.widget.PopupMenu; import android.support.v7.widget.RecyclerView; import android.support.v7.widget.SearchView; import android.support.v7.widget.Toolbar; import android.telephony.PhoneStateListener; import android.telephony.TelephonyManager; import android.text.TextPaint; import android.util.Log; import android.view.Display; import android.view.Menu; import android.view.MenuItem; import android.view.View; import android.view.ViewGroup; import android.view.Window; import android.view.WindowManager; import android.view.animation.AccelerateDecelerateInterpolator; import android.view.inputmethod.InputMethodManager; import android.widget.AdapterView; import android.widget.Button; import android.widget.CheckBox; import android.widget.EditText; import android.widget.FrameLayout; import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.ListView; import android.widget.RelativeLayout; import android.widget.TextView; import android.widget.Toast; import android.view.HapticFeedbackConstants; import com.github.amlcurran.showcaseview.ShowcaseView; import com.github.amlcurran.showcaseview.targets.ViewTarget; import com.google.gson.Gson; import com.lantouzi.wheelview.WheelView; import com.sdsmdg.harjot.MusicDNA.adapters.playlistdialogadapter.AddToPlaylistAdapter; import com.sdsmdg.harjot.MusicDNA.clickitemtouchlistener.ClickItemTouchListener; import com.sdsmdg.harjot.MusicDNA.Config; import com.sdsmdg.harjot.MusicDNA.custombottomsheets.CustomGeneralBottomSheetDialog; import com.sdsmdg.harjot.MusicDNA.custombottomsheets.CustomLocalBottomSheetDialog; import com.sdsmdg.harjot.MusicDNA.customviews.CustomLinearGradient; import com.sdsmdg.harjot.MusicDNA.fragments.AboutFragment.AboutFragment; import com.sdsmdg.harjot.MusicDNA.fragments.AllPlaylistsFragment.AllPlaylistsFragment; import com.sdsmdg.harjot.MusicDNA.fragments.EditSongFragment.EditLocalSongFragment; import com.sdsmdg.harjot.MusicDNA.fragments.EqualizerFragment.EqualizerFragment; import com.sdsmdg.harjot.MusicDNA.fragments.FavouritesFragment.FavouritesFragment; import com.sdsmdg.harjot.MusicDNA.fragments.FolderContentFragment.FolderContentFragment; import com.sdsmdg.harjot.MusicDNA.fragments.AllFoldersFragment.FolderFragment; import com.sdsmdg.harjot.MusicDNA.fragments.LocalMusicFragments.RecentlyAddedSongsFragment; import com.sdsmdg.harjot.MusicDNA.fragments.NewPlaylistFragment.NewPlaylistFragment; import com.sdsmdg.harjot.MusicDNA.fragments.QueueFragment.QueueFragment; import com.sdsmdg.harjot.MusicDNA.fragments.RecentsFragment.RecentsFragment; import com.sdsmdg.harjot.MusicDNA.fragments.SettingsFragment.SettingsFragment; import com.sdsmdg.harjot.MusicDNA.fragments.StreamFragment.StreamMusicFragment; import com.sdsmdg.harjot.MusicDNA.fragments.ViewAlbumFragment.ViewAlbumFragment; import com.sdsmdg.harjot.MusicDNA.fragments.ViewArtistFragment.ViewArtistFragment; import com.sdsmdg.harjot.MusicDNA.fragments.ViewPlaylistFragment.PlaylistTrackAdapter; import com.sdsmdg.harjot.MusicDNA.fragments.ViewPlaylistFragment.ViewPlaylistFragment; import com.sdsmdg.harjot.MusicDNA.fragments.ViewSavedDNAsFragment.ViewSavedDNA; import com.sdsmdg.harjot.MusicDNA.fragments.LocalMusicFragments.LocalMusicViewPagerFragment; import com.sdsmdg.harjot.MusicDNA.headsethandler.HeadSetReceiver; import com.sdsmdg.harjot.MusicDNA.adapters.horizontalrecycleradapters.LocalTracksHorizontalAdapter; import com.sdsmdg.harjot.MusicDNA.adapters.horizontalrecycleradapters.PlayListsHorizontalAdapter; import com.sdsmdg.harjot.MusicDNA.adapters.horizontalrecycleradapters.RecentsListHorizontalAdapter; import com.sdsmdg.harjot.MusicDNA.adapters.horizontalrecycleradapters.StreamTracksHorizontalAdapter; import com.sdsmdg.harjot.MusicDNA.interfaces.ServiceCallbacks; import com.sdsmdg.harjot.MusicDNA.interfaces.StreamService; import com.sdsmdg.harjot.MusicDNA.fragments.LocalMusicFragments.AlbumFragment; import com.sdsmdg.harjot.MusicDNA.fragments.LocalMusicFragments.ArtistFragment; import com.sdsmdg.harjot.MusicDNA.fragments.LocalMusicFragments.LocalMusicFragment; import com.sdsmdg.harjot.MusicDNA.models.Album; import com.sdsmdg.harjot.MusicDNA.models.AllMusicFolders; import com.sdsmdg.harjot.MusicDNA.models.AllPlaylists; import com.sdsmdg.harjot.MusicDNA.models.AllSavedDNA; import com.sdsmdg.harjot.MusicDNA.models.Artist; import com.sdsmdg.harjot.MusicDNA.models.EqualizerModel; import com.sdsmdg.harjot.MusicDNA.models.Favourite; import com.sdsmdg.harjot.MusicDNA.models.LocalTrack; import com.sdsmdg.harjot.MusicDNA.models.MusicFolder; import com.sdsmdg.harjot.MusicDNA.models.Playlist; import com.sdsmdg.harjot.MusicDNA.models.Queue; import com.sdsmdg.harjot.MusicDNA.models.RecentlyPlayed; import com.sdsmdg.harjot.MusicDNA.models.SavedDNA; import com.sdsmdg.harjot.MusicDNA.models.Settings; import com.sdsmdg.harjot.MusicDNA.models.Track; import com.sdsmdg.harjot.MusicDNA.models.UnifiedTrack; import com.sdsmdg.harjot.MusicDNA.MusicDNAApplication; import com.sdsmdg.harjot.MusicDNA.notificationmanager.Constants; import com.sdsmdg.harjot.MusicDNA.notificationmanager.MediaPlayerService; import com.sdsmdg.harjot.MusicDNA.fragments.PlayerFragment.PlayerFragment; import com.sdsmdg.harjot.MusicDNA.R; import com.sdsmdg.harjot.MusicDNA.utilities.CommonUtils; import com.sdsmdg.harjot.MusicDNA.utilities.comparators.AlbumComparator; import com.sdsmdg.harjot.MusicDNA.utilities.comparators.ArtistComparator; import com.sdsmdg.harjot.MusicDNA.utilities.comparators.LocalMusicComparator; import com.sdsmdg.harjot.MusicDNA.utilities.FileUtils; import com.sdsmdg.harjot.MusicDNA.utilities.MediaCacheUtils; import com.sdsmdg.harjot.MusicDNA.visualizers.VisualizerView; import com.sdsmdg.harjot.MusicDNA.imageloader.ImageLoader; import com.squareup.leakcanary.RefWatcher; import java.io.File; import java.io.FileNotFoundException; import java.io.InputStream; import java.util.ArrayList; import java.util.Collections; import java.util.List; import java.util.Random; import de.hdodenhof.circleimageview.CircleImageView; import jp.wasabeef.recyclerview.adapters.AlphaInAnimationAdapter; import retrofit2.Call; import retrofit2.Callback; //import retrofit2.GsonConverterFactory; import retrofit2.Response; import retrofit2.Retrofit; import retrofit2.converter.gson.GsonConverterFactory; import static android.view.View.GONE; public class HomeActivity extends AppCompatActivity implements NavigationView.OnNavigationItemSelectedListener, SearchView.OnQueryTextListener, PlayerFragment.PlayerFragmentCallbackListener, PlayerFragment.onPlayPauseListener, LocalMusicFragment.OnLocalTrackSelectedListener, RecentlyAddedSongsFragment.OnLocalTrackSelectedListener, StreamMusicFragment.OnTrackSelectedListener, QueueFragment.queueCallbackListener, ViewPlaylistFragment.playlistCallbackListener, FavouritesFragment.favouriteFragmentCallback, EqualizerFragment.onCheckChangedListener, AllPlaylistsFragment.allPlaylistCallbackListener, PlaylistTrackAdapter.onPlaylistEmptyListener, FolderFragment.onFolderClickedListener, FolderContentFragment.folderCallbackListener, AlbumFragment.onAlbumClickListener, ViewAlbumFragment.albumCallbackListener, ArtistFragment.onArtistClickListener, ViewArtistFragment.artistCallbackListener, RecentsFragment.recentsCallbackListener, SettingsFragment.SettingsFragmentCallbackListener, NewPlaylistFragment.NewPlaylistFragmentCallbackListener, HeadSetReceiver.onHeadsetEventListener, EditLocalSongFragment.EditFragmentCallbackListener, ServiceCallbacks { public static List<LocalTrack> localTrackList = new ArrayList<>(); public static List<LocalTrack> finalLocalSearchResultList = new ArrayList<>(); public static List<LocalTrack> finalSelectedTracks = new ArrayList<>(); public static List<LocalTrack> recentlyAddedTrackList = new ArrayList<>(); public static List<LocalTrack> finalRecentlyAddedTrackSearchResultList = new ArrayList<>(); public static List<Track> streamingTrackList = new ArrayList<>(); public static List<Album> albums = new ArrayList<>(); public static List<Album> finalAlbums = new ArrayList<>(); public static List<Artist> artists = new ArrayList<>(); public static List<Artist> finalArtists = new ArrayList<>(); public static List<UnifiedTrack> continuePlayingList = new ArrayList<>(); public String versionName; public int versionCode; public int prevVersionCode = -1; public TextView copyrightText; public static Canvas cacheCanvas; public static Album tempAlbum; public static Artist tempArtist; private Dialog progress; public static float ratio; public static float ratio2; public Toolbar spHome; public ImageView playerControllerHome; public FrameLayout bottomToolbar; public CircleImageView spImgHome; public TextView spTitleHome; public Bitmap selectedImage; public SharedPreferences mPrefs; public static SharedPreferences.Editor prefsEditor; public static Gson gson; public ImageLoader imgLoader; public ConnectivityManager connManager; public NetworkInfo mWifi; public static RecentlyPlayed recentlyPlayed; public static Favourite favouriteTracks; public static Settings settings; public static Queue queue; public static Queue originalQueue; public static Playlist tempPlaylist; public static int tempPlaylistNumber; public static int renamePlaylistNumber; public static AllPlaylists allPlaylists; public static AllMusicFolders allMusicFolders; public static AllSavedDNA savedDNAs; public static SavedDNA tempSavedDNA; public static EqualizerModel equalizerModel; public static List<LocalTrack> tempFolderContent; public static MusicFolder tempMusicFolder; public PlayerFragment playerFragment; public static boolean shuffleEnabled = false; public static boolean repeatEnabled = false; public static boolean repeatOnceEnabled = false; public static boolean nextControllerClicked = false; public static boolean isFavourite = false; public static boolean isReloaded = true; public static int queueCurrentIndex = 0; public int originalQueueIndex = 0; public static boolean isSaveDNAEnabled = false; public Context ctx; public static boolean queueCall = false; boolean wasMediaPlayerPlaying = false; public DrawerLayout drawer; public static NotificationManager notificationManager; public PhoneStateListener phoneStateListener; public LocalTracksHorizontalAdapter adapter; public StreamTracksHorizontalAdapter sAdapter; public PlayListsHorizontalAdapter pAdapter; public RecentsListHorizontalAdapter rAdapter; NavigationView navigationView; Call<List<Track>> call; SearchView searchView; MenuItem searchItem; RecyclerView soundcloudRecyclerView; RecyclerView localsongsRecyclerView; RecyclerView playlistsRecycler; RecyclerView recentsRecycler; RelativeLayout localRecyclerContainer; RelativeLayout recentsRecyclerContainer; RelativeLayout streamRecyclerContainer; RelativeLayout playlistRecyclerContainer; RelativeLayout localBanner; ImageView favBanner; ImageView recentBanner; ImageView folderBanner; ImageView savedDNABanner; ImageView localBannerPlayAll; ImageView navImageView; TextView localViewAll, streamViewAll; TextView localNothingText; TextView streamNothingText; TextView recentsNothingText; TextView playlistNothingText; public static int screen_width; public static int screen_height; Toolbar toolbar; public CollapsingToolbarLayout collapsingToolbar; ImageView[] imgView = new ImageView[10]; public CustomLinearGradient customLinearGradient; TextView recentsViewAll, playlistsViewAll; public static int themeColor = Color.parseColor("#B24242"); public static float minAudioStrength = 0.40f; public static TextPaint tp; public Activity main; public static float seekBarColor; public byte[] mBytes; public HeadSetReceiver headSetReceiver; ShowcaseView showCase; View playerContainer; ServiceConnection serviceConnection; private MediaPlayerService myService; private boolean bound = false; android.support.v4.app.FragmentManager fragMan; public static boolean isPlayerVisible = false; public static boolean isLocalVisible = false; public static boolean isStreamVisible = false; public static boolean isQueueVisible = false; public static boolean isPlaylistVisible = false; public static boolean isEqualizerVisible = false; public static boolean isFavouriteVisible = false; public static boolean isAllPlaylistVisible = false; public static boolean isAllFolderVisible = false; public static boolean isFolderContentVisible = false; public static boolean isAllSavedDnaVisisble = false; public static boolean isSavedDNAVisible = false; public static boolean isAlbumVisible = false; public static boolean isArtistVisible = false; public static boolean isRecentVisible = false; public static boolean isFullScreenEnabled = false; public static boolean isSettingsVisible = false; public static boolean isNewPlaylistVisible = false; public static boolean isAboutVisible = false; public static boolean isEditVisible = false; public boolean isPlayerTransitioning = false; static boolean isSaveRecentsRunning = false; static boolean isSaveFavouritesRunning = false; static boolean isSaveSettingsRunning = false; static boolean isSaveDNAsRunning = false; static boolean isSaveQueueRunning = false; static boolean isSavePLaylistsRunning = false; static boolean isSaveEqualizerRunning = false; public static boolean hasQueueEnded = false; public static boolean isEqualizerEnabled = false; public static boolean isEqualizerReloaded = false; public static int[] seekbarpos = new int[5]; public static int presetPos; public static short reverbPreset = -1; public static short bassStrength = -1; boolean isNotificationVisible = false; public static LocalTrack localSelectedTrack; public static Track selectedTrack; public static LocalTrack editSong; public static boolean localSelected = false; public static boolean streamSelected = false; Button mEndButton; public static int statusBarHeightinDp; public static int navBarHeightSizeinDp; public static boolean hasSoftNavbar = false; public static RelativeLayout.LayoutParams lps; boolean isSleepTimerEnabled = false; boolean isSleepTimerTimeout = false; long timerSetTime = 0; int timerTimeOutDuration = 0; List<String> minuteList; Handler sleepHandler; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); getWindow().requestFeature(Window.FEATURE_ACTION_BAR); getWindow().addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN); WindowManager wm = (WindowManager) this.getSystemService(Context.WINDOW_SERVICE); Display display = wm.getDefaultDisplay(); screen_width = display.getWidth(); screen_height = display.getHeight(); ratio = (float) screen_height / (float) 1920; ratio2 = (float) screen_width / (float) 1080; ratio = Math.min(ratio, ratio2); setContentView(R.layout.activity_home); headSetReceiver = new HeadSetReceiver(); IntentFilter filter = new IntentFilter(Intent.ACTION_HEADSET_PLUG); registerReceiver(headSetReceiver, filter); PackageInfo pInfo; try { pInfo = getPackageManager().getPackageInfo(getPackageName(), 0); versionName = pInfo.versionName; versionCode = pInfo.versionCode; } catch (PackageManager.NameNotFoundException e) { e.printStackTrace(); } mEndButton = new Button(this); mEndButton.setBackgroundColor(themeColor); mEndButton.setTextColor(Color.WHITE); tp = new TextPaint(); tp.setColor(themeColor); tp.setTextSize(65 * ratio); tp.setFakeBoldText(true); recentsViewAll = (TextView) findViewById(R.id.recents_view_all); recentsViewAll.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { showFragment("recent"); } }); playlistsViewAll = (TextView) findViewById(R.id.playlists_view_all); playlistsViewAll.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { showFragment("allPlaylists"); } }); copyrightText = (TextView) findViewById(R.id.copyright_text); copyrightText.setText("Music DNA v" + versionName); if (SplashActivity.tf4 != null) { try { copyrightText.setTypeface(SplashActivity.tf4); } catch (Exception e) { e.printStackTrace(); } } imgLoader = new ImageLoader(this); ctx = this; initializeHeaderImages(); hasSoftNavbar = CommonUtils.hasNavBar(this); statusBarHeightinDp = CommonUtils.getStatusBarHeight(this); navBarHeightSizeinDp = hasSoftNavbar ? CommonUtils.getNavBarHeight(this) : 0; serviceConnection = new ServiceConnection() { @Override public void onServiceConnected(ComponentName className, IBinder service) { // cast the IBinder and get MyService instance MediaPlayerService.LocalBinder binder = (MediaPlayerService.LocalBinder) service; myService = binder.getService(); bound = true; myService.setCallbacks(HomeActivity.this); // register } @Override public void onServiceDisconnected(ComponentName arg0) { bound = false; } }; minuteList = new ArrayList<>(); for (int i = 1; i < 25; i++) { minuteList.add(String.valueOf(i * 5)); } sleepHandler = new Handler(); lps = new RelativeLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT); lps.addRule(RelativeLayout.ALIGN_PARENT_BOTTOM); lps.addRule(RelativeLayout.ALIGN_PARENT_RIGHT); int margin = ((Number) (getResources().getDisplayMetrics().density * 12)).intValue(); lps.setMargins(margin, margin, margin, navBarHeightSizeinDp + ((Number) (getResources().getDisplayMetrics().density * 5)).intValue()); fragMan = getSupportFragmentManager(); toolbar = (Toolbar) findViewById(R.id.toolbar); setSupportActionBar(toolbar); collapsingToolbar = (CollapsingToolbarLayout) findViewById(R.id.collapsing_toolbar); if (SplashActivity.tf4 != null) { collapsingToolbar.setCollapsedTitleTypeface(SplashActivity.tf4); collapsingToolbar.setExpandedTitleTypeface(SplashActivity.tf4); } customLinearGradient = (CustomLinearGradient) findViewById(R.id.custom_linear_gradient); customLinearGradient.setAlpha(170); customLinearGradient.invalidate(); drawer = (DrawerLayout) findViewById(R.id.drawer_layout); ActionBarDrawerToggle toggle = new ActionBarDrawerToggle( this, drawer, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close); drawer.setDrawerListener(toggle); toggle.syncState(); navigationView = (NavigationView) findViewById(R.id.nav_view); if (navigationView != null) { navigationView.setNavigationItemSelectedListener(this); } navigationView.setCheckedItem(R.id.nav_home); View header = navigationView.getHeaderView(0); navImageView = (ImageView) header.findViewById(R.id.nav_image_view); if (navImageView != null) { navImageView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { PlayerFragment pFrag = getPlayerFragment(); if (pFrag != null) { if (pFrag.mMediaPlayer != null && pFrag.mMediaPlayer.isPlaying()) { onBackPressed(); isPlayerVisible = true; // hideTabs(); showPlayer(); } } } }); } connManager = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE); mWifi = connManager.getNetworkInfo(ConnectivityManager.TYPE_WIFI); phoneStateListener = new PhoneStateListener() { @Override public void onCallStateChanged(int state, String incomingNumber) { PlayerFragment pFrag = playerFragment; if (playerFragment != null) { if (state == TelephonyManager.CALL_STATE_RINGING) { //Incoming call: Pause music if (pFrag.mMediaPlayer != null && pFrag.mMediaPlayer.isPlaying()) { wasMediaPlayerPlaying = true; pFrag.togglePlayPause(); } else { wasMediaPlayerPlaying = false; } } else if (state == TelephonyManager.CALL_STATE_IDLE) { //Not in call: Play music if (pFrag.mMediaPlayer != null && !pFrag.mMediaPlayer.isPlaying() && wasMediaPlayerPlaying) { pFrag.togglePlayPause(); } } else if (state == TelephonyManager.CALL_STATE_OFFHOOK) { //A call is dialing, active or on hold if (playerFragment.mMediaPlayer != null && pFrag.mMediaPlayer.isPlaying()) { wasMediaPlayerPlaying = true; pFrag.togglePlayPause(); } else { wasMediaPlayerPlaying = false; } } } super.onCallStateChanged(state, incomingNumber); } }; TelephonyManager mgr = (TelephonyManager) getSystemService(TELEPHONY_SERVICE); if (mgr != null) { mgr.listen(phoneStateListener, PhoneStateListener.LISTEN_CALL_STATE); } mPrefs = getPreferences(MODE_PRIVATE); prefsEditor = mPrefs.edit(); gson = new Gson(); main = this; localBanner = (RelativeLayout) findViewById(R.id.localBanner); favBanner = (ImageView) findViewById(R.id.favBanner); recentBanner = (ImageView) findViewById(R.id.recentBanner); folderBanner = (ImageView) findViewById(R.id.folderBanner); savedDNABanner = (ImageView) findViewById(R.id.savedDNABanner); localBannerPlayAll = (ImageView) findViewById(R.id.local_banner_play_all); localBanner.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { showFragment("local"); } }); favBanner.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { showFragment("favourite"); } }); recentBanner.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { showFragment("recent"); } }); folderBanner.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { showFragment("allFolders"); } }); savedDNABanner.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { showFragment("allSavedDNAs"); } }); localBannerPlayAll.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { queue.getQueue().clear(); for (int i = 0; i < localTrackList.size(); i++) { UnifiedTrack ut = new UnifiedTrack(true, localTrackList.get(i), null); queue.getQueue().add(ut); } if (queue.getQueue().size() > 0) { Random r = new Random(); int tmp = r.nextInt(queue.getQueue().size()); queueCurrentIndex = tmp; LocalTrack track = localTrackList.get(tmp); localSelectedTrack = track; streamSelected = false; localSelected = true; queueCall = false; isReloaded = false; onLocalTrackSelected(-1); } } }); bottomToolbar = (FrameLayout) findViewById(R.id.bottomMargin); spHome = (Toolbar) findViewById(R.id.smallPlayer_home); playerControllerHome = (ImageView) findViewById(R.id.player_control_sp_home); spImgHome = (CircleImageView) findViewById(R.id.selected_track_image_sp_home); spTitleHome = (TextView) findViewById(R.id.selected_track_title_sp_home); playerControllerHome.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { if (queue != null && queue.getQueue().size() > 0) { onQueueItemClicked(queueCurrentIndex); bottomToolbar.setVisibility(View.INVISIBLE); } } }); playerControllerHome.setImageResource(R.drawable.ic_play_arrow_white_48dp); spHome.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { if (queue != null && queue.getQueue().size() > 0) { onQueueItemClicked(queueCurrentIndex); bottomToolbar.setVisibility(View.INVISIBLE); } } }); localRecyclerContainer = (RelativeLayout) findViewById(R.id.localRecyclerContainer); recentsRecyclerContainer = (RelativeLayout) findViewById(R.id.recentsRecyclerContainer); streamRecyclerContainer = (RelativeLayout) findViewById(R.id.streamRecyclerContainer); playlistRecyclerContainer = (RelativeLayout) findViewById(R.id.playlistRecyclerContainer); if (SplashActivity.tf4 != null) { try { ((TextView) findViewById(R.id.playListRecyclerLabel)).setTypeface(SplashActivity.tf4); ((TextView) findViewById(R.id.recentsRecyclerLabel)).setTypeface(SplashActivity.tf4); } catch (Exception e) { e.printStackTrace(); } } localNothingText = (TextView) findViewById(R.id.localNothingText); streamNothingText = (TextView) findViewById(R.id.streamNothingText); recentsNothingText = (TextView) findViewById(R.id.recentsNothingText); playlistNothingText = (TextView) findViewById(R.id.playlistNothingText); localViewAll = (TextView) findViewById(R.id.localViewAll); localViewAll.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { showFragment("local"); } }); streamViewAll = (TextView) findViewById(R.id.streamViewAll); streamViewAll.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { showFragment("stream"); } }); progress = new Dialog(ctx); progress.setCancelable(false); progress.requestWindowFeature(Window.FEATURE_NO_TITLE); progress.setContentView(R.layout.custom_progress_dialog); progress.getWindow().setBackgroundDrawable(new ColorDrawable(android.graphics.Color.TRANSPARENT)); progress.show(); showCase = new ShowcaseView.Builder(this) .blockAllTouches() .singleShot(0) .setStyle(R.style.CustomShowcaseTheme) .useDecorViewAsParent() .replaceEndButton(mEndButton) .setContentTitlePaint(tp) .setTarget(new ViewTarget(R.id.recentsRecyclerLabel, this)) .setContentTitle("Recents and Playlists") .setContentText("Here all you recent songs and playlists will be listed." + "Long press the cards or playlists for more options \n" + "\n" + "(Press Next to continue / Press back to Hide)") .build(); showCase.setButtonText("Next"); showCase.setButtonPosition(lps); showCase.overrideButtonClick(new View.OnClickListener() { int count1 = 0; @Override public void onClick(View v) { count1++; switch (count1) { case 1: showCase.setTarget(new ViewTarget(R.id.local_banner_alt_showcase, (Activity) ctx)); showCase.setContentTitle("Local Songs"); showCase.setContentText("See all songs available locally, classified on basis of Artist and Album"); showCase.setButtonPosition(lps); showCase.setButtonText("Next"); break; case 2: showCase.setTarget(new ViewTarget(searchView.getId(), (Activity) ctx)); showCase.setContentTitle("Search"); showCase.setContentText("Search for songs from local library and SoundCloudâ„¢"); showCase.setButtonPosition(lps); showCase.setButtonText("Done"); break; case 3: showCase.hide(); break; } } }); new loadSavedData().execute(); } //////////////////////////////////////////////////////////////////////////////////////////////// /* * Methods for playing selected songs * onTrackSelected -> Used to stream tracks from soundcloud * onLocalTrackSelected -> Used to play local songs */ public void onTrackSelected(int position) { isReloaded = false; HideBottomFakeToolbar(); if (!queueCall) { CommonUtils.hideKeyboard(this); searchView.setQuery("", false); searchView.setIconified(true); new Thread(new CancelCall()).start(); isPlayerVisible = true; PlayerFragment frag = playerFragment; android.support.v4.app.FragmentManager fm = getSupportFragmentManager(); PlayerFragment newFragment = new PlayerFragment(); if (frag == null) { playerFragment = newFragment; int flag = 0; for (int i = 0; i < favouriteTracks.getFavourite().size(); i++) { UnifiedTrack ut = favouriteTracks.getFavourite().get(i); if (!ut.getType() && ut.getStreamTrack().getTitle().equals(selectedTrack.getTitle())) { flag = 1; isFavourite = true; break; } } if (flag == 0) { isFavourite = false; } playerFragment.localIsPlaying = false; playerFragment.track = selectedTrack; fm.beginTransaction() .setCustomAnimations(R.anim.slide_up, R.anim.slide_down, R.anim.slide_up, R.anim.slide_down) .add(R.id.player_frag_container, newFragment, "player") .show(newFragment) .addToBackStack(null) .commitAllowingStateLoss(); } else { if (playerFragment.track != null && !playerFragment.localIsPlaying && selectedTrack.getTitle() == playerFragment.track.getTitle()) { } else { int flag = 0; for (int i = 0; i < favouriteTracks.getFavourite().size(); i++) { UnifiedTrack ut = favouriteTracks.getFavourite().get(i); if (!ut.getType() && ut.getStreamTrack().getTitle().equals(selectedTrack.getTitle())) { flag = 1; isFavourite = true; break; } } if (flag == 0) { isFavourite = false; } playerFragment.localIsPlaying = false; playerFragment.track = selectedTrack; frag.refresh(); } } if (!isQueueVisible) showPlayer(); } else { PlayerFragment frag = playerFragment; playerFragment.localIsPlaying = false; playerFragment.track = selectedTrack; int flag = 0; for (int i = 0; i < favouriteTracks.getFavourite().size(); i++) { UnifiedTrack ut = favouriteTracks.getFavourite().get(i); if (!ut.getType() && ut.getStreamTrack().getTitle().equals(selectedTrack.getTitle())) { flag = 1; isFavourite = true; break; } } if (flag == 0) { isFavourite = false; } frag.refresh(); } if (playerFragment != null && playerFragment.snappyRecyclerView != null) { playerFragment.snappyRecyclerView.getAdapter().notifyDataSetChanged(); playerFragment.snappyRecyclerView.setTransparency(); } QueueFragment qFrag = (QueueFragment) fragMan.findFragmentByTag("queue"); if (qFrag != null) { qFrag.updateQueueAdapter(); } UnifiedTrack track = new UnifiedTrack(false, null, playerFragment.track); for (int i = 0; i < recentlyPlayed.getRecentlyPlayed().size(); i++) { if (!recentlyPlayed.getRecentlyPlayed().get(i).getType() && recentlyPlayed.getRecentlyPlayed().get(i).getStreamTrack().getTitle().equals(track.getStreamTrack().getTitle())) { recentlyPlayed.getRecentlyPlayed().remove(i); // rAdapter.notifyItemRemoved(i); break; } } recentlyPlayed.getRecentlyPlayed().add(0, track); if (recentlyPlayed.getRecentlyPlayed().size() > 50) { recentlyPlayed.getRecentlyPlayed().remove(50); } recentsRecycler.setVisibility(View.VISIBLE); recentsNothingText.setVisibility(View.INVISIBLE); continuePlayingList.clear(); for (int i = 0; i < Math.min(10, recentlyPlayed.getRecentlyPlayed().size()); i++) { continuePlayingList.add(recentlyPlayed.getRecentlyPlayed().get(i)); } rAdapter.notifyDataSetChanged(); refreshHeaderImages(); RecentsFragment rFrag = (RecentsFragment) fragMan.findFragmentByTag("recent"); if (rFrag != null && rFrag.rtAdpater != null) { rFrag.rtAdpater.notifyDataSetChanged(); } } public void onLocalTrackSelected(int position) { isReloaded = false; HideBottomFakeToolbar(); if (!queueCall) { CommonUtils.hideKeyboard(this); searchView.setQuery("", true); searchView.setIconified(true); new Thread(new CancelCall()).start(); // hideTabs(); isPlayerVisible = true; PlayerFragment frag = playerFragment; android.support.v4.app.FragmentManager fm = getSupportFragmentManager(); PlayerFragment newFragment = new PlayerFragment(); if (frag == null) { playerFragment = newFragment; int flag = 0; for (int i = 0; i < favouriteTracks.getFavourite().size(); i++) { UnifiedTrack ut = favouriteTracks.getFavourite().get(i); if (ut.getType() && ut.getLocalTrack().getTitle().equals(localSelectedTrack.getTitle())) { flag = 1; isFavourite = true; break; } } if (flag == 0) { isFavourite = false; } playerFragment.localIsPlaying = true; playerFragment.localTrack = localSelectedTrack; fm.beginTransaction() .setCustomAnimations(R.anim.slide_up, R.anim.slide_down, R.anim.slide_up, R.anim.slide_down) .add(R.id.player_frag_container, newFragment, "player") .show(newFragment) .commitAllowingStateLoss(); } else { if (playerFragment.localTrack != null && playerFragment.localIsPlaying && localSelectedTrack.getTitle() == playerFragment.localTrack.getTitle()) { } else { int flag = 0; for (int i = 0; i < favouriteTracks.getFavourite().size(); i++) { UnifiedTrack ut = favouriteTracks.getFavourite().get(i); if (ut.getType() && ut.getLocalTrack().getTitle().equals(localSelectedTrack.getTitle())) { flag = 1; isFavourite = true; break; } } if (flag == 0) { isFavourite = false; } playerFragment.localIsPlaying = true; playerFragment.localTrack = localSelectedTrack; frag.refresh(); } } if (!isQueueVisible) showPlayer(); } else { PlayerFragment frag = playerFragment; playerFragment.localIsPlaying = true; playerFragment.localTrack = localSelectedTrack; int flag = 0; for (int i = 0; i < favouriteTracks.getFavourite().size(); i++) { UnifiedTrack ut = favouriteTracks.getFavourite().get(i); if (ut.getType() && ut.getLocalTrack().getTitle().equals(localSelectedTrack.getTitle())) { flag = 1; isFavourite = true; break; } } if (flag == 0) { isFavourite = false; } if (frag != null) frag.refresh(); } if (playerFragment != null && playerFragment.snappyRecyclerView != null) { playerFragment.snappyRecyclerView.getAdapter().notifyDataSetChanged(); playerFragment.snappyRecyclerView.setTransparency(); } QueueFragment qFrag = (QueueFragment) fragMan.findFragmentByTag("queue"); if (qFrag != null) { qFrag.updateQueueAdapter(); } UnifiedTrack track = new UnifiedTrack(true, playerFragment.localTrack, null); for (int i = 0; i < recentlyPlayed.getRecentlyPlayed().size(); i++) { if (recentlyPlayed.getRecentlyPlayed().get(i).getType() && recentlyPlayed.getRecentlyPlayed().get(i).getLocalTrack().getTitle().equals(track.getLocalTrack().getTitle())) { recentlyPlayed.getRecentlyPlayed().remove(i); // rAdapter.notifyItemRemoved(i); break; } } recentlyPlayed.getRecentlyPlayed().add(0, track); if (recentlyPlayed.getRecentlyPlayed().size() == 51) { recentlyPlayed.getRecentlyPlayed().remove(50); } recentsRecycler.setVisibility(View.VISIBLE); recentsNothingText.setVisibility(View.INVISIBLE); continuePlayingList.clear(); for (int i = 0; i < Math.min(10, recentlyPlayed.getRecentlyPlayed().size()); i++) { continuePlayingList.add(recentlyPlayed.getRecentlyPlayed().get(i)); } rAdapter.notifyDataSetChanged(); refreshHeaderImages(); RecentsFragment rFrag = (RecentsFragment) fragMan.findFragmentByTag("recent"); if (rFrag != null && rFrag.rtAdpater != null) { rFrag.rtAdpater.notifyDataSetChanged(); } } //////////////////////////////////////////////////////////////////////////////////////////////// /* * Methods and Classes for loading local songs, albums, artists and folder * loadSavedData -> AsyncTask that executes getSavedData() in background. * getSavedData() -> Method that actually gets the saved data from sharedPreferences. * getLocalSongs()-> Loads local songs. * checkTrack() / checkArtist() / checkAlbum -> checks if localtrack, artist or album already exists. * getFolder() -> gets MusicFolder based on folder name. */ public class loadSavedData extends AsyncTask<String, Void, String> { @Override protected String doInBackground(String... params) { getSavedData(); return "done"; } @Override protected void onPostExecute(String aVoid) { super.onPostExecute(aVoid); progress.dismiss(); main.runOnUiThread(new Runnable() { @Override public void run() { if (settings == null) { settings = new Settings(); } themeColor = settings.getThemeColor(); minAudioStrength = settings.getMinAudioStrength(); navigationView.setItemIconTintList(ColorStateList.valueOf(themeColor)); collapsingToolbar.setContentScrimColor(themeColor); customLinearGradient.setStartColor(themeColor); customLinearGradient.invalidate(); try { if (Build.VERSION.SDK_INT >= 21) { Window window = ((Activity) ctx).getWindow(); window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS); window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS); window.setStatusBarColor(CommonUtils.getDarkColor(themeColor)); } } catch (Exception e) { e.printStackTrace(); } if (prevVersionCode == -1 || prevVersionCode <= 30) { savedDNAs = null; } if (allPlaylists == null) { allPlaylists = new AllPlaylists(); } if (tempPlaylist == null) { tempPlaylist = new Playlist(null, null); } if (queue == null) { queue = new Queue(); } if (favouriteTracks == null) { favouriteTracks = new Favourite(); } if (recentlyPlayed == null) { recentlyPlayed = new RecentlyPlayed(); } if (allMusicFolders == null) { allMusicFolders = new AllMusicFolders(); } if (savedDNAs == null) { savedDNAs = new AllSavedDNA(); } if (equalizerModel == null) { equalizerModel = new EqualizerModel(); isEqualizerEnabled = true; isEqualizerReloaded = false; } else { isEqualizerEnabled = equalizerModel.isEqualizerEnabled(); isEqualizerReloaded = true; seekbarpos = equalizerModel.getSeekbarpos(); presetPos = equalizerModel.getPresetPos(); reverbPreset = equalizerModel.getReverbPreset(); bassStrength = equalizerModel.getBassStrength(); } new SaveVersionCode().executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR); getLocalSongs(); refreshHeaderImages(); if (queue != null && queue.getQueue().size() != 0) { UnifiedTrack utHome = queue.getQueue().get(queueCurrentIndex); if (utHome.getType()) { imgLoader.DisplayImage(utHome.getLocalTrack().getPath(), spImgHome); spTitleHome.setText(utHome.getLocalTrack().getTitle()); } else { imgLoader.DisplayImage(utHome.getStreamTrack().getArtworkURL(), spImgHome); spTitleHome.setText(utHome.getStreamTrack().getTitle()); } } else { bottomToolbar.setVisibility(GONE); } for (int i = 0; i < Math.min(10, recentlyPlayed.getRecentlyPlayed().size()); i++) { continuePlayingList.add(recentlyPlayed.getRecentlyPlayed().get(i)); } rAdapter = new RecentsListHorizontalAdapter(continuePlayingList, ctx); recentsRecycler = (RecyclerView) findViewById(R.id.recentsMusicList_home); recentsRecycler.setNestedScrollingEnabled(false); LinearLayoutManager mLayoutManager3 = new LinearLayoutManager(ctx, LinearLayoutManager.HORIZONTAL, false); recentsRecycler.setLayoutManager(mLayoutManager3); recentsRecycler.setItemAnimator(new DefaultItemAnimator()); AlphaInAnimationAdapter alphaAdapter3 = new AlphaInAnimationAdapter(rAdapter); alphaAdapter3.setFirstOnly(false); recentsRecycler.setAdapter(alphaAdapter3); recentsRecycler.addOnItemTouchListener(new ClickItemTouchListener(recentsRecycler) { @Override public boolean onClick(RecyclerView parent, View view, final int position, long id) { UnifiedTrack ut = continuePlayingList.get(position); boolean isRepeat = false; int pos = 0; for (int i = 0; i < queue.getQueue().size(); i++) { UnifiedTrack ut1 = queue.getQueue().get(i); if (ut1.getType() && ut.getType() && ut1.getLocalTrack().getTitle().equals(ut.getLocalTrack().getTitle())) { isRepeat = true; pos = i; break; } if (!ut1.getType() && !ut.getType() && ut1.getStreamTrack().getTitle().equals(ut.getStreamTrack().getTitle())) { isRepeat = true; pos = i; break; } } if (!isRepeat) { if (ut.getType()) { LocalTrack track = ut.getLocalTrack(); if (queue.getQueue().size() == 0) { queueCurrentIndex = 0; queue.getQueue().add(new UnifiedTrack(true, track, null)); } else if (queueCurrentIndex == queue.getQueue().size() - 1) { queueCurrentIndex++; queue.getQueue().add(new UnifiedTrack(true, track, null)); } else if (isReloaded) { isReloaded = false; queueCurrentIndex = queue.getQueue().size(); queue.getQueue().add(new UnifiedTrack(true, track, null)); } else { queue.getQueue().add(++queueCurrentIndex, new UnifiedTrack(true, track, null)); } localSelectedTrack = track; streamSelected = false; localSelected = true; queueCall = false; isReloaded = false; onLocalTrackSelected(position); } else { Track track = ut.getStreamTrack(); if (queue.getQueue().size() == 0) { queueCurrentIndex = 0; queue.getQueue().add(new UnifiedTrack(false, null, track)); } else if (queueCurrentIndex == queue.getQueue().size() - 1) { queueCurrentIndex++; queue.getQueue().add(new UnifiedTrack(false, null, track)); } else if (isReloaded) { isReloaded = false; queueCurrentIndex = queue.getQueue().size(); queue.getQueue().add(new UnifiedTrack(false, null, track)); } else { queue.getQueue().add(++queueCurrentIndex, new UnifiedTrack(false, null, track)); } selectedTrack = track; streamSelected = true; localSelected = false; queueCall = false; isReloaded = false; onTrackSelected(position); } } else { onQueueItemClicked(pos); } return true; } @Override public boolean onLongClick(RecyclerView parent, View view, final int position, long id) { final UnifiedTrack ut = continuePlayingList.get(position); CustomGeneralBottomSheetDialog generalBottomSheetDialog = new CustomGeneralBottomSheetDialog(); generalBottomSheetDialog.setPosition(position); generalBottomSheetDialog.setTrack(ut); generalBottomSheetDialog.setFragment("RecentHorizontalList"); generalBottomSheetDialog.show(getSupportFragmentManager(), "general_bottom_sheet_dialog"); return true; } @Override public void onRequestDisallowInterceptTouchEvent(boolean disallowIntercept) { } }); pAdapter = new PlayListsHorizontalAdapter(allPlaylists.getPlaylists(), ctx); playlistsRecycler = (RecyclerView) findViewById(R.id.playlist_home); playlistsRecycler.setNestedScrollingEnabled(false); LinearLayoutManager mLayoutManager2 = new LinearLayoutManager(ctx, LinearLayoutManager.HORIZONTAL, false); playlistsRecycler.setLayoutManager(mLayoutManager2); playlistsRecycler.setItemAnimator(new DefaultItemAnimator()); AlphaInAnimationAdapter alphaAdapter2 = new AlphaInAnimationAdapter(pAdapter); alphaAdapter2.setFirstOnly(false); playlistsRecycler.setAdapter(alphaAdapter2); playlistsRecycler.addOnItemTouchListener(new ClickItemTouchListener(playlistsRecycler) { @Override public boolean onClick(RecyclerView parent, View view, final int position, long id) { tempPlaylist = allPlaylists.getPlaylists().get(position); tempPlaylistNumber = position; showFragment("playlist"); return true; } @Override public boolean onLongClick(RecyclerView parent, View view, final int position, long id) { PopupMenu popup = new PopupMenu(ctx, view); popup.getMenuInflater().inflate(R.menu.playlist_popup, popup.getMenu()); popup.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() { @Override public boolean onMenuItemClick(MenuItem item) { if (item.getTitle().equals("Play")) { tempPlaylist = allPlaylists.getPlaylists().get(position); tempPlaylistNumber = position; int size = tempPlaylist.getSongList().size(); queue.getQueue().clear(); for (int i = 0; i < size; i++) { queue.addToQueue(tempPlaylist.getSongList().get(i)); } queueCurrentIndex = 0; onPlaylistPlayAll(); } else if (item.getTitle().equals("Add to Queue")) { Playlist pl = allPlaylists.getPlaylists().get(position); for (UnifiedTrack ut : pl.getSongList()) { queue.addToQueue(ut); } } else if (item.getTitle().equals("Delete")) { allPlaylists.getPlaylists().remove(position); AllPlaylistsFragment plFrag = (AllPlaylistsFragment) fragMan.findFragmentByTag("allPlaylists"); if (plFrag != null) { plFrag.itemRemoved(position); } pAdapter.notifyItemRemoved(position); new SavePlaylists().executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR); } else if (item.getTitle().equals("Rename")) { renamePlaylistNumber = position; renamePlaylistDialog(allPlaylists.getPlaylists().get(position).getPlaylistName()); } return true; } }); popup.show(); return true; } @Override public void onRequestDisallowInterceptTouchEvent(boolean disallowIntercept) { } }); adapter = new LocalTracksHorizontalAdapter(finalLocalSearchResultList, ctx); localsongsRecyclerView = (RecyclerView) findViewById(R.id.localMusicList_home); LinearLayoutManager mLayoutManager = new LinearLayoutManager(ctx, LinearLayoutManager.HORIZONTAL, false); localsongsRecyclerView.setLayoutManager(mLayoutManager); localsongsRecyclerView.setItemAnimator(new DefaultItemAnimator()); AlphaInAnimationAdapter alphaAdapter = new AlphaInAnimationAdapter(adapter); alphaAdapter.setFirstOnly(false); localsongsRecyclerView.setAdapter(alphaAdapter); localsongsRecyclerView.addOnItemTouchListener(new ClickItemTouchListener(localsongsRecyclerView) { @Override public boolean onClick(RecyclerView parent, View view, int position, long id) { LocalTrack track = finalLocalSearchResultList.get(position); if (queue.getQueue().size() == 0) { queueCurrentIndex = 0; queue.getQueue().add(new UnifiedTrack(true, track, null)); } else if (queueCurrentIndex == queue.getQueue().size() - 1) { queueCurrentIndex++; queue.getQueue().add(new UnifiedTrack(true, track, null)); } else if (isReloaded) { isReloaded = false; queueCurrentIndex = queue.getQueue().size(); queue.getQueue().add(new UnifiedTrack(true, track, null)); } else { queue.getQueue().add(++queueCurrentIndex, new UnifiedTrack(true, track, null)); } localSelectedTrack = track; streamSelected = false; localSelected = true; queueCall = false; isReloaded = false; onLocalTrackSelected(position); return true; } @Override public boolean onLongClick(RecyclerView parent, View view, final int position, long id) { CustomLocalBottomSheetDialog localBottomSheetDialog = new CustomLocalBottomSheetDialog(); localBottomSheetDialog.setPosition(position); localBottomSheetDialog.setLocalTrack(finalLocalSearchResultList.get(position)); localBottomSheetDialog.show(getSupportFragmentManager(), "local_song_bottom_sheet"); return true; } @Override public void onRequestDisallowInterceptTouchEvent(boolean disallowIntercept) { } }); soundcloudRecyclerView = (RecyclerView) findViewById(R.id.trackList_home); soundcloudRecyclerView.addOnItemTouchListener(new ClickItemTouchListener(soundcloudRecyclerView) { @Override public boolean onClick(RecyclerView parent, View view, int position, long id) { Track track = streamingTrackList.get(position); if (queue.getQueue().size() == 0) { queueCurrentIndex = 0; queue.getQueue().add(new UnifiedTrack(false, null, track)); } else if (queueCurrentIndex == queue.getQueue().size() - 1) { queueCurrentIndex++; queue.getQueue().add(new UnifiedTrack(false, null, track)); } else if (isReloaded) { isReloaded = false; queueCurrentIndex = queue.getQueue().size(); queue.getQueue().add(new UnifiedTrack(false, null, track)); } else { queue.getQueue().add(++queueCurrentIndex, new UnifiedTrack(false, null, track)); } selectedTrack = track; streamSelected = true; localSelected = false; queueCall = false; isReloaded = false; onTrackSelected(position); return true; } @Override public boolean onLongClick(RecyclerView parent, View view, final int position, long id) { CustomGeneralBottomSheetDialog generalBottomSheetDialog = new CustomGeneralBottomSheetDialog(); generalBottomSheetDialog.setPosition(position); generalBottomSheetDialog.setTrack(new UnifiedTrack(false, null, streamingTrackList.get(position))); generalBottomSheetDialog.setFragment("Stream"); generalBottomSheetDialog.show(getSupportFragmentManager(), "general_bottom_sheet_dialog"); return true; } @Override public void onRequestDisallowInterceptTouchEvent(boolean disallowIntercept) { } }); playerContainer = findViewById(R.id.player_frag_container); if (finalLocalSearchResultList.size() == 0) { localsongsRecyclerView.setVisibility(GONE); localNothingText.setVisibility(View.VISIBLE); } else { localsongsRecyclerView.setVisibility(View.VISIBLE); localNothingText.setVisibility(View.INVISIBLE); } if (recentlyPlayed.getRecentlyPlayed().size() == 0) { recentsRecycler.setVisibility(GONE); recentsNothingText.setVisibility(View.VISIBLE); } else { recentsRecycler.setVisibility(View.VISIBLE); recentsNothingText.setVisibility(View.INVISIBLE); } if (streamingTrackList.size() == 0) { streamRecyclerContainer.setVisibility(GONE); streamNothingText.setVisibility(View.VISIBLE); } else { streamRecyclerContainer.setVisibility(View.VISIBLE); streamNothingText.setVisibility(View.INVISIBLE); } if (allPlaylists.getPlaylists().size() == 0) { playlistsRecycler.setVisibility(GONE); playlistNothingText.setVisibility(View.VISIBLE); } else { playlistsRecycler.setVisibility(View.VISIBLE); playlistNothingText.setVisibility(View.INVISIBLE); } } }); } } private void getSavedData() { try { Gson gson = new Gson(); Log.d("TIME", "start"); String json2 = mPrefs.getString("allPlaylists", ""); allPlaylists = gson.fromJson(json2, AllPlaylists.class); Log.d("TIME", "allPlaylists"); String json3 = mPrefs.getString("queue", ""); queue = gson.fromJson(json3, Queue.class); Log.d("TIME", "queue"); String json4 = mPrefs.getString("recentlyPlayed", ""); recentlyPlayed = gson.fromJson(json4, RecentlyPlayed.class); Log.d("TIME", "recents"); String json5 = mPrefs.getString("favouriteTracks", ""); favouriteTracks = gson.fromJson(json5, Favourite.class); Log.d("TIME", "fav"); String json6 = mPrefs.getString("queueCurrentIndex", ""); queueCurrentIndex = gson.fromJson(json6, Integer.class); Log.d("TIME", "queueCurrentindex"); String json8 = mPrefs.getString("settings", ""); settings = gson.fromJson(json8, Settings.class); Log.d("TIME", "settings"); String json9 = mPrefs.getString("equalizer", ""); equalizerModel = gson.fromJson(json9, EqualizerModel.class); Log.d("TIME", "equalizer"); String json = mPrefs.getString("savedDNAs", ""); savedDNAs = gson.fromJson(json, AllSavedDNA.class); Log.d("TIME", "savedDNAs"); } catch (Exception e) { e.printStackTrace(); } try { String json7 = mPrefs.getString("versionCode", ""); prevVersionCode = gson.fromJson(json7, Integer.class); Log.d("TIME", "VersionCode : " + prevVersionCode + " : " + versionCode); } catch (Exception e) { e.printStackTrace(); } } private void getLocalSongs() { localTrackList.clear(); recentlyAddedTrackList.clear(); finalLocalSearchResultList.clear(); finalRecentlyAddedTrackSearchResultList.clear(); albums.clear(); finalAlbums.clear(); artists.clear(); finalArtists.clear(); ContentResolver musicResolver = this.getContentResolver(); Uri musicUri = android.provider.MediaStore.Audio.Media.EXTERNAL_CONTENT_URI; Cursor musicCursor = musicResolver.query(musicUri, null, null, null, MediaStore.MediaColumns.DATE_ADDED + " DESC"); if (musicCursor != null && musicCursor.moveToFirst()) { //get columns int titleColumn = musicCursor.getColumnIndex (android.provider.MediaStore.Audio.Media.TITLE); int idColumn = musicCursor.getColumnIndex (android.provider.MediaStore.Audio.Media._ID); int artistColumn = musicCursor.getColumnIndex (android.provider.MediaStore.Audio.Media.ARTIST); int albumColumn = musicCursor.getColumnIndex (MediaStore.Audio.Media.ALBUM); int pathColumn = musicCursor.getColumnIndex (android.provider.MediaStore.Audio.Media.DATA); int durationColumn = musicCursor.getColumnIndex (MediaStore.Audio.Media.DURATION); //add songs to list do { long thisId = musicCursor.getLong(idColumn); String thisTitle = musicCursor.getString(titleColumn); String thisArtist = musicCursor.getString(artistColumn); String thisAlbum = musicCursor.getString(albumColumn); String path = musicCursor.getString(pathColumn); long duration = musicCursor.getLong(durationColumn); if (duration > 10000) { LocalTrack lt = new LocalTrack(thisId, thisTitle, thisArtist, thisAlbum, path, duration); localTrackList.add(lt); finalLocalSearchResultList.add(lt); if (recentlyAddedTrackList.size() <= 50) { recentlyAddedTrackList.add(lt); finalRecentlyAddedTrackSearchResultList.add(lt); } int pos; if (thisAlbum != null) { pos = checkAlbum(thisAlbum); if (pos != -1) { albums.get(pos).getAlbumSongs().add(lt); } else { List<LocalTrack> llt = new ArrayList<>(); llt.add(lt); Album ab = new Album(thisAlbum, llt); albums.add(ab); } if (pos != -1) { finalAlbums.get(pos).getAlbumSongs().add(lt); } else { List<LocalTrack> llt = new ArrayList<>(); llt.add(lt); Album ab = new Album(thisAlbum, llt); finalAlbums.add(ab); } } if (thisArtist != null) { pos = checkArtist(thisArtist); if (pos != -1) { artists.get(pos).getArtistSongs().add(lt); } else { List<LocalTrack> llt = new ArrayList<>(); llt.add(lt); Artist ab = new Artist(thisArtist, llt); artists.add(ab); } if (pos != -1) { finalArtists.get(pos).getArtistSongs().add(lt); } else { List<LocalTrack> llt = new ArrayList<>(); llt.add(lt); Artist ab = new Artist(thisArtist, llt); finalArtists.add(ab); } } File f = new File(path); String dirName = f.getParentFile().getName(); if (getFolder(dirName) == null) { MusicFolder mf = new MusicFolder(dirName); mf.getLocalTracks().add(lt); allMusicFolders.getMusicFolders().add(mf); } else { getFolder(dirName).getLocalTracks().add(lt); } } } while (musicCursor.moveToNext()); } if (musicCursor != null) musicCursor.close(); System.setProperty("java.util.Arrays.useLegacyMergeSort", "true"); try { if (localTrackList.size() > 0) { Collections.sort(localTrackList, new LocalMusicComparator()); Collections.sort(finalLocalSearchResultList, new LocalMusicComparator()); } if (albums.size() > 0) { Collections.sort(albums, new AlbumComparator()); Collections.sort(finalAlbums, new AlbumComparator()); } if (artists.size() > 0) { Collections.sort(artists, new ArtistComparator()); Collections.sort(finalArtists, new ArtistComparator()); } } catch (Exception e) { e.printStackTrace(); } List<UnifiedTrack> tmp = new ArrayList<>(); boolean queueCurrentIndexCollision = false; int indexCorrection = 0; for (int i = 0; i < queue.getQueue().size(); i++) { UnifiedTrack ut = queue.getQueue().get(i); if (ut.getType()) { if (!checkTrack(ut.getLocalTrack())) { if (i == queueCurrentIndex) { queueCurrentIndexCollision = true; } else if (i < queueCurrentIndex) { indexCorrection++; } tmp.add(ut); } } } for (int i = 0; i < tmp.size(); i++) { queue.getQueue().remove(tmp.get(i)); } if (queueCurrentIndexCollision) { if (queue.getQueue().size() > 0) { queueCurrentIndex = 0; } else { queue = new Queue(); } } else { queueCurrentIndex -= indexCorrection; } tmp.clear(); for (int i = 0; i < recentlyPlayed.getRecentlyPlayed().size(); i++) { UnifiedTrack ut = recentlyPlayed.getRecentlyPlayed().get(i); if (ut.getType()) { if (!checkTrack(ut.getLocalTrack())) { tmp.add(ut); } } } for (int i = 0; i < tmp.size(); i++) { recentlyPlayed.getRecentlyPlayed().remove(tmp.get(i)); } List<UnifiedTrack> temp = new ArrayList<>(); List<Playlist> tmpPL = new ArrayList<>(); for (int i = 0; i < allPlaylists.getPlaylists().size(); i++) { Playlist pl = allPlaylists.getPlaylists().get(i); for (int j = 0; j < pl.getSongList().size(); j++) { UnifiedTrack ut = pl.getSongList().get(j); if (ut.getType()) { if (!checkTrack(ut.getLocalTrack())) { temp.add(ut); } } } for (int j = 0; j < temp.size(); j++) { pl.getSongList().remove(temp.get(j)); } temp.clear(); if (pl.getSongList().size() == 0) { tmpPL.add(pl); } } for (int i = 0; i < tmpPL.size(); i++) { allPlaylists.getPlaylists().remove(tmpPL.get(i)); } tmpPL.clear(); } public boolean checkTrack(LocalTrack lt) { for (int i = 0; i < localTrackList.size(); i++) { LocalTrack localTrack = localTrackList.get(i); if (localTrack.getTitle().equals(lt.getTitle())) { return true; } } return false; } public int checkAlbum(String album) { for (int i = 0; i < albums.size(); i++) { Album ab = albums.get(i); if (ab.getName().equals(album)) { return i; } } return -1; } public int checkArtist(String artist) { for (int i = 0; i < artists.size(); i++) { Artist at = artists.get(i); if (at.getName().equals(artist)) { return i; } } return -1; } public MusicFolder getFolder(String folderName) { MusicFolder mf = null; for (int i = 0; i < allMusicFolders.getMusicFolders().size(); i++) { MusicFolder mf1 = allMusicFolders.getMusicFolders().get(i); if (mf1.getFolderName().equals(folderName)) { mf = mf1; break; } } return mf; } //////////////////////////////////////////////////////////////////////////////////////////////// /* * Standard Activity methods */ @Override public void onBackPressed() { PlayerFragment plFrag = playerFragment; LocalMusicViewPagerFragment flmFrag = (LocalMusicViewPagerFragment) fragMan.findFragmentByTag("local"); LocalMusicFragment lFrag = null; if (flmFrag != null) { lFrag = (LocalMusicFragment) flmFrag.getFragmentByPosition(0); } QueueFragment qFrag = (QueueFragment) fragMan.findFragmentByTag("queue"); EqualizerFragment eqFrag = (EqualizerFragment) fragMan.findFragmentByTag("equalizer"); ViewSavedDNA vsdFrag = (ViewSavedDNA) fragMan.findFragmentByTag("allSavedDNAs"); DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout); if (drawer.isDrawerOpen(GravityCompat.START)) { drawer.closeDrawer(GravityCompat.START); } else if (showCase != null && showCase.isShowing()) { showCase.hide(); } else if (plFrag != null && plFrag.isShowcaseVisible()) { plFrag.hideShowcase(); } else if (lFrag != null && lFrag.isShowcaseVisible()) { lFrag.hideShowcase(); } else if (qFrag != null && qFrag.isShowcaseVisible()) { qFrag.hideShowcase(); } else if (eqFrag != null && eqFrag.isShowcaseVisible()) { eqFrag.hideShowcase(); } else if (vsdFrag != null && vsdFrag.isShowcaseVisible()) { vsdFrag.hideShowcase(); } else if (isFullScreenEnabled) { isFullScreenEnabled = false; plFrag.bottomContainer.setVisibility(View.VISIBLE); plFrag.seekBarContainer.setVisibility(View.VISIBLE); plFrag.toggleContainer.setVisibility(View.VISIBLE); plFrag.spToolbar.setVisibility(View.VISIBLE); onFullScreen(); } else if (isEqualizerVisible) { showPlayer2(); } else if (isQueueVisible) { showPlayer3(); } else if (isPlayerVisible && !isPlayerTransitioning && playerFragment.smallPlayer != null) { hidePlayer(); // showTabs(); isPlayerVisible = false; } else if (isLocalVisible && flmFrag != null && flmFrag.searchBox != null && flmFrag.isSearchboxVisible) { flmFrag.searchBox.setText(""); flmFrag.searchBox.setVisibility(View.INVISIBLE); flmFrag.isSearchboxVisible = false; InputMethodManager imm = (InputMethodManager) getSystemService(INPUT_METHOD_SERVICE); imm.toggleSoftInput(InputMethodManager.SHOW_FORCED, InputMethodManager.HIDE_IMPLICIT_ONLY); flmFrag.searchIcon.setImageResource(R.drawable.ic_search); flmFrag.fragTitle.setVisibility(View.VISIBLE); } else if (!searchView.isIconified()) { searchView.setQuery("", true); searchView.setIconified(true); new Thread(new CancelCall()).start(); if (localRecyclerContainer.getVisibility() == View.VISIBLE || streamRecyclerContainer.getVisibility() == View.VISIBLE) { localRecyclerContainer.setVisibility(GONE); streamRecyclerContainer.setVisibility(GONE); } } else if (localRecyclerContainer.getVisibility() == View.VISIBLE || streamRecyclerContainer.getVisibility() == View.VISIBLE) { localRecyclerContainer.setVisibility(GONE); streamRecyclerContainer.setVisibility(GONE); } else { if (isEditVisible) { hideFragment("Edit"); } else if (isAlbumVisible) { hideFragment("viewAlbum"); } else if (isArtistVisible) { hideFragment("viewArtist"); } else { if (isLocalVisible) { hideFragment("local"); setTitle("Music DNA"); } else if (isQueueVisible) { hideFragment("queue"); setTitle("Music DNA"); } else if (isStreamVisible) { hideFragment("stream"); setTitle("Music DNA"); } else if (isPlaylistVisible) { hideFragment("playlist"); setTitle("Music DNA"); } else if (isNewPlaylistVisible) { hideFragment("newPlaylist"); setTitle("Music DNA"); } else if (isEqualizerVisible) { finalSelectedTracks.clear(); hideFragment("equalizer"); setTitle("Music DNA"); } else if (isFavouriteVisible) { hideFragment("favourite"); setTitle("Music DNA"); } else if (isAllPlaylistVisible) { hideFragment("allPlaylists"); setTitle("Music DNA"); } else if (isFolderContentVisible) { hideFragment("folderContent"); setTitle("Folders"); } else if (isAllFolderVisible) { hideFragment("allFolders"); setTitle("Music DNA"); } else if (isAllSavedDnaVisisble) { hideFragment("allSavedDNAs"); setTitle("Music DNA"); } else if (isSavedDNAVisible) { hideFragment("savedDNA"); setTitle("Music DNA"); } else if (isRecentVisible) { hideFragment("recent"); setTitle("Music DNA"); } else if (isAboutVisible) { hideFragment("About"); setTitle("Settings"); } else if (isSettingsVisible) { hideFragment("settings"); new SaveSettings().executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR); setTitle("Music DNA"); } else if (!isPlayerTransitioning) { startActivity(new Intent(Intent.ACTION_MAIN).addCategory(Intent.CATEGORY_HOME)); } } } } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.home, menu); searchItem = menu.findItem(R.id.menu_search); searchView = (SearchView) searchItem.getActionView(); searchView.setOnQueryTextListener(this); return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { // Handle action bar item clicks here. The action bar will // automatically handle clicks on the Home/Up button, so long // as you specify a parent activity in AndroidManifest.xml. int id = item.getItemId(); //noinspection SimplifiableIfStatement if (id == R.id.action_settings) { showFragment("settings"); return true; } if (id == R.id.action_sleep) { showSleepDialog(); return true; } return super.onOptionsItemSelected(item); } @SuppressWarnings("StatementWithEmptyBody") @Override public boolean onNavigationItemSelected(MenuItem item) { // Handle navigation view item clicks here. int id = item.getItemId(); if (id == R.id.nav_home) { hideAllFrags(); hideFragment("allPlaylists"); } else if (id == R.id.nav_local) { showFragment("local"); } else if (id == R.id.nav_playlists) { showFragment("allPlaylists"); } else if (id == R.id.nav_recent) { showFragment("recent"); } else if (id == R.id.nav_fav) { showFragment("favourite"); } else if (id == R.id.nav_folder) { showFragment("allFolders"); } else if (id == R.id.nav_view) { showFragment("allSavedDNAs"); } else if (id == R.id.nav_settings) { showFragment("settings"); } DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout); drawer.closeDrawer(GravityCompat.START); return true; } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if (resultCode == RESULT_OK) { if (requestCode == 1) { try { final Uri imageUri = data.getData(); String path = imageUri.getPath(); Toast.makeText(this, path + "", Toast.LENGTH_SHORT).show(); final InputStream imageStream = getContentResolver().openInputStream(imageUri); selectedImage = BitmapFactory.decodeStream(imageStream); EditLocalSongFragment editSongFragment = (EditLocalSongFragment) getSupportFragmentManager().findFragmentByTag("Edit"); if (editSongFragment != null) { editSongFragment.updateCoverArt(selectedImage, imageUri); } } catch (FileNotFoundException e) { e.printStackTrace(); } } } } @Override protected void onPause() { super.onPause(); new SaveVersionCode().executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR); new SaveData().executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR); new SaveSettings().executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR); new SaveQueue().executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR); try { prefsEditor.commit(); } catch (Exception e) { e.printStackTrace(); } } @Override protected void onStop() { super.onStop(); } @Override protected void onDestroy() { super.onDestroy(); unregisterReceiver(headSetReceiver); RefWatcher refWatcher = MusicDNAApplication.getRefWatcher(this); refWatcher.watch(this); TelephonyManager mgr = (TelephonyManager) getSystemService(TELEPHONY_SERVICE); if (mgr != null) { mgr.listen(phoneStateListener, PhoneStateListener.LISTEN_NONE); } if (bound) { myService.setCallbacks(null); // unregister unbindService(serviceConnection); bound = false; } } //////////////////////////////////////////////////////////////////////////////////////////////// /* * Query change listeners for searchview and required methods for searching and updating recycler views. * onQueryTextSubmit(String query) -> updates lists based on query when entered is pressed on keyboard. * onQueryTextChange(String query) -> updates lists based on query while text is being entered into the search view. * updateLocalList() / updateAlbumList() / updateArtistList() / updateStreamingList() -> helper methods to update corresponding recyclers. */ @Override public boolean onQueryTextSubmit(String query) { CommonUtils.hideKeyboard(this); updateLocalList(query.trim()); updateStreamingList(query.trim()); updateAlbumList(query.trim()); updateArtistList(query.trim()); updateRecentlyAddedLocalList(query.trim()); return true; } @Override public boolean onQueryTextChange(String newText) { updateLocalList(newText.trim()); updateStreamingList(newText.trim()); updateAlbumList(newText.trim()); updateArtistList(newText.trim()); updateRecentlyAddedLocalList(newText.trim()); return true; } private void updateLocalList(String query) { LocalMusicViewPagerFragment flmFrag = (LocalMusicViewPagerFragment) fragMan.findFragmentByTag("local"); LocalMusicFragment lFrag = null; if (flmFrag != null) lFrag = (LocalMusicFragment) flmFrag.getFragmentByPosition(0); if (lFrag != null) lFrag.hideShuffleFab(); /*Update the Local List*/ if (!isLocalVisible) localRecyclerContainer.setVisibility(View.VISIBLE); finalLocalSearchResultList.clear(); for (int i = 0; i < localTrackList.size(); i++) { LocalTrack lt = localTrackList.get(i); String tmp1 = lt.getTitle().toLowerCase(); String tmp2 = query.toLowerCase(); if (tmp1.contains(tmp2)) { finalLocalSearchResultList.add(lt); } } if (!isLocalVisible && localsongsRecyclerView != null) { if (finalLocalSearchResultList.size() == 0) { localsongsRecyclerView.setVisibility(GONE); localNothingText.setVisibility(View.VISIBLE); } else { localsongsRecyclerView.setVisibility(View.VISIBLE); localNothingText.setVisibility(View.INVISIBLE); } (localsongsRecyclerView.getAdapter()).notifyDataSetChanged(); } if (lFrag != null) lFrag.updateAdapter(); if (query.equals("")) { localRecyclerContainer.setVisibility(GONE); } if (query.equals("") && isLocalVisible) { if (lFrag != null) lFrag.showShuffleFab(); } } private void updateRecentlyAddedLocalList(String query) { LocalMusicViewPagerFragment flmFrag = (LocalMusicViewPagerFragment) fragMan.findFragmentByTag("local"); RecentlyAddedSongsFragment rasFrag = null; if (flmFrag != null) rasFrag = (RecentlyAddedSongsFragment) flmFrag.getFragmentByPosition(3); if (rasFrag != null) rasFrag.hidePlayAllFab(); /*Update the Local List*/ if (!isLocalVisible) localRecyclerContainer.setVisibility(View.VISIBLE); finalRecentlyAddedTrackSearchResultList.clear(); for (int i = 0; i < recentlyAddedTrackList.size(); i++) { LocalTrack lt = recentlyAddedTrackList.get(i); String tmp1 = lt.getTitle().toLowerCase(); String tmp2 = query.toLowerCase(); if (tmp1.contains(tmp2)) { finalRecentlyAddedTrackSearchResultList.add(lt); } } if (!isLocalVisible && localsongsRecyclerView != null) { if (finalRecentlyAddedTrackSearchResultList.size() == 0) { localsongsRecyclerView.setVisibility(GONE); localNothingText.setVisibility(View.VISIBLE); } else { localsongsRecyclerView.setVisibility(View.VISIBLE); localNothingText.setVisibility(View.INVISIBLE); } (localsongsRecyclerView.getAdapter()).notifyDataSetChanged(); } if (rasFrag != null) rasFrag.updateAdapter(); if (query.equals("")) { localRecyclerContainer.setVisibility(GONE); } if (query.equals("") && isLocalVisible) { if (rasFrag != null) rasFrag.showPlayAllFab(); } } private void updateAlbumList(String query) { finalAlbums.clear(); for (int i = 0; i < albums.size(); i++) { Album album = albums.get(i); String tmp1 = album.getName().toLowerCase(); String tmp2 = query.toLowerCase(); if (tmp1.contains(tmp2)) { finalAlbums.add(album); } } LocalMusicViewPagerFragment flmFrag = (LocalMusicViewPagerFragment) fragMan.findFragmentByTag("local"); if (flmFrag != null) { AlbumFragment aFrag = (AlbumFragment) flmFrag.getFragmentByPosition(1); if (aFrag != null) { aFrag.updateAdapter(); } } } private void updateArtistList(String query) { finalArtists.clear(); for (int i = 0; i < artists.size(); i++) { Artist artist = artists.get(i); String tmp1 = artist.getName().toLowerCase(); String tmp2 = query.toLowerCase(); if (tmp1.contains(tmp2)) { finalArtists.add(artist); } } LocalMusicViewPagerFragment flmFrag = (LocalMusicViewPagerFragment) fragMan.findFragmentByTag("local"); if (flmFrag != null) { ArtistFragment aFrag = (ArtistFragment) flmFrag.getFragmentByPosition(2); if (aFrag != null) { aFrag.updateAdapter(); } } } private void updateStreamingList(String query) { if (!isLocalVisible) { mWifi = connManager.getNetworkInfo(ConnectivityManager.TYPE_WIFI); if ((settings.isStreamOnlyOnWifiEnabled() && mWifi.isConnected()) || (!settings.isStreamOnlyOnWifiEnabled())) { new Thread(new CancelCall()).start(); /*Update the Streaming List*/ if (!query.equals("")) { streamRecyclerContainer.setVisibility(View.VISIBLE); startLoadingIndicator(); Retrofit client = new Retrofit.Builder() .baseUrl(Config.API_URL) .addConverterFactory(GsonConverterFactory.create()) .build(); StreamService ss = client.create(StreamService.class); call = ss.getTracks(query, 75); call.enqueue(new Callback<List<Track>>() { @Override public void onResponse(Call<List<Track>> call, Response<List<Track>> response) { if (response.isSuccessful()) { streamingTrackList = response.body(); sAdapter = new StreamTracksHorizontalAdapter(streamingTrackList, ctx); LinearLayoutManager mLayoutManager = new LinearLayoutManager(ctx, LinearLayoutManager.HORIZONTAL, false); soundcloudRecyclerView.setLayoutManager(mLayoutManager); soundcloudRecyclerView.setItemAnimator(new DefaultItemAnimator()); soundcloudRecyclerView.setAdapter(sAdapter); if (streamingTrackList.size() == 0) { streamRecyclerContainer.setVisibility(GONE); } else { streamRecyclerContainer.setVisibility(View.VISIBLE); } stopLoadingIndicator(); (soundcloudRecyclerView.getAdapter()).notifyDataSetChanged(); StreamMusicFragment sFrag = (StreamMusicFragment) fragMan.findFragmentByTag("stream"); if (sFrag != null) { sFrag.dataChanged(); } } else { stopLoadingIndicator(); } Log.d("RETRO", response.body() + ""); } @Override public void onFailure(Call<List<Track>> call, Throwable t) { Log.d("RETRO1", t.getMessage()); } }); } else { stopLoadingIndicator(); streamRecyclerContainer.setVisibility(GONE); } } else { stopLoadingIndicator(); streamRecyclerContainer.setVisibility(GONE); } } } //////////////////////////////////////////////////////////////////////////////////////////////// /* * Methods to control the transitions of the player fragment * hidePlayer() / showPlayer() -> the vertical animation to hide/show the visualizer * hidePlayer2() / showPlayer2() -> the horizontal animation to hide/show the equalizer * hidePlayer3() / showPlayer3() -> the horizontal animation to hide/show the queue */ public void hidePlayer() { if (playerFragment != null && playerFragment.mVisualizerView != null) { playerFragment.mVisualizerView.setVisibility(View.GONE); playerFragment.lyricsContainer.setVisibility(View.GONE); } drawer.setDrawerLockMode(DrawerLayout.LOCK_MODE_UNLOCKED); if (Build.VERSION.SDK_INT >= 21) { Window window = ((Activity) (ctx)).getWindow(); window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS); window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS); window.setStatusBarColor(CommonUtils.getDarkColor(themeColor)); } isPlayerVisible = false; if (playerFragment != null && playerFragment.cpb != null) { playerFragment.cpb.setAlpha(0.0f); playerFragment.cpb.setVisibility(View.VISIBLE); playerFragment.cpb.animate() .alpha(1.0f); } if (playerFragment != null && playerFragment.smallPlayer != null) { playerFragment.smallPlayer.setAlpha(0.0f); playerFragment.smallPlayer.setVisibility(View.VISIBLE); playerFragment.smallPlayer.animate() .alpha(1.0f); } if (playerFragment != null && playerFragment.spToolbar != null) { playerFragment.spToolbar.animate() .alpha(0.0f) .withEndAction(new Runnable() { @Override public void run() { playerFragment.spToolbar.setVisibility(GONE); } }); } playerContainer.setVisibility(View.VISIBLE); if (playerFragment != null) { playerContainer.animate() .translationY(playerContainer.getHeight() - playerFragment.smallPlayer.getHeight()) .setDuration(300); } else { playerContainer.animate() .translationY(playerContainer.getHeight() - playerFragment.smallPlayer.getHeight()) .setDuration(300) .setStartDelay(500); } if (playerFragment != null) { playerFragment.player_controller.setAlpha(0.0f); playerFragment.player_controller.setImageDrawable(playerFragment.mainTrackController.getDrawable()); playerFragment.player_controller.animate() .alpha(1.0f); playerFragment.snappyRecyclerView.animate() .alpha(0.0f) .withEndAction(new Runnable() { @Override public void run() { playerFragment.snappyRecyclerView.setVisibility(GONE); } }); } } public void showPlayer() { if (Build.VERSION.SDK_INT >= 21) { Window window = ((Activity) (ctx)).getWindow(); window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS); window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS); window.setStatusBarColor(Color.parseColor("#000000")); } drawer.setDrawerLockMode(DrawerLayout.LOCK_MODE_LOCKED_CLOSED); searchView.setQuery("", false); searchView.setIconified(true); new Thread(new CancelCall()).start(); isPlayerVisible = true; isEqualizerVisible = false; isQueueVisible = false; playerContainer.setVisibility(View.VISIBLE); if (playerFragment != null && playerFragment.mVisualizerView != null) playerFragment.mVisualizerView.setVisibility(View.INVISIBLE); if (playerFragment != null && playerFragment.player_controller != null) { playerFragment.player_controller.setAlpha(1.0f); playerFragment.player_controller.animate() .setDuration(300) .alpha(0.0f); } if (playerFragment != null && playerFragment.cpb != null) { playerFragment.cpb.animate() .alpha(0.0f); } if (playerFragment != null && playerFragment.smallPlayer != null) { playerFragment.smallPlayer.animate() .alpha(0.0f); } if (playerFragment != null && playerFragment.spToolbar != null) { playerFragment.spToolbar.setVisibility(View.VISIBLE); playerFragment.spToolbar.animate().alpha(1.0f); } isPlayerTransitioning = true; playerContainer.animate() .setDuration(300) .translationY(0) .withEndAction(new Runnable() { @Override public void run() { isPlayerTransitioning = false; if (playerFragment != null && playerFragment.snappyRecyclerView != null) { playerFragment.snappyRecyclerView.setTransparency(); } } }); if (playerFragment != null && playerFragment.snappyRecyclerView != null) { playerFragment.snappyRecyclerView.setVisibility(View.VISIBLE); playerFragment.snappyRecyclerView.animate() .alpha(1.0f) .setDuration(300); } final Handler handler2 = new Handler(); handler2.postDelayed(new Runnable() { @Override public void run() { if (playerFragment != null && playerFragment.mVisualizerView != null){ if (playerFragment.isLyricsVisisble) { playerFragment.mVisualizerView.setVisibility(GONE); playerFragment.lyricsContainer.setVisibility(View.VISIBLE); } else { playerFragment.mVisualizerView.setVisibility(View.VISIBLE); } } } }, 400); } public void hidePlayer2() { isEqualizerVisible = true; if (playerFragment.mVisualizerView != null) playerFragment.mVisualizerView.setVisibility(View.GONE); final Handler handler2 = new Handler(); handler2.postDelayed(new Runnable() { @Override public void run() { playerContainer.animate() .setInterpolator(new AccelerateDecelerateInterpolator()) .translationX(playerContainer.getWidth()); } }, 50); playerContainer.setVisibility(View.VISIBLE); } public void showPlayer2() { isPlayerVisible = true; isEqualizerVisible = false; isQueueVisible = false; final Handler handler = new Handler(); handler.postDelayed(new Runnable() { @Override public void run() { hideFragment("equalizer"); } }, 350); playerContainer.setVisibility(View.VISIBLE); if (playerFragment.mVisualizerView != null) playerFragment.mVisualizerView.setVisibility(View.INVISIBLE); isPlayerTransitioning = true; playerContainer.animate() .setDuration(300) .translationX(0) .withEndAction(new Runnable() { @Override public void run() { isPlayerTransitioning = false; if (playerFragment != null && playerFragment.snappyRecyclerView != null) { playerFragment.snappyRecyclerView.setTransparency(); } if (!playerFragment.isLyricsVisisble) { playerFragment.mVisualizerView.setVisibility(View.VISIBLE); } } }); } public void hidePlayer3() { isQueueVisible = true; if (playerFragment.mVisualizerView != null) playerFragment.mVisualizerView.setVisibility(View.INVISIBLE); final Handler handler2 = new Handler(); handler2.postDelayed(new Runnable() { @Override public void run() { playerContainer.animate() .setInterpolator(new AccelerateDecelerateInterpolator()) .translationX(-1 * playerContainer.getWidth()); } }, 50); playerContainer.setVisibility(View.VISIBLE); } public void showPlayer3() { isPlayerVisible = true; isEqualizerVisible = false; isQueueVisible = false; if (playerFragment.mVisualizerView != null) playerFragment.mVisualizerView.setVisibility(View.INVISIBLE); isPlayerTransitioning = true; playerContainer.animate() .setDuration(300) .translationX(0) .withEndAction(new Runnable() { @Override public void run() { isPlayerTransitioning = false; if (playerFragment != null && playerFragment.snappyRecyclerView != null) { playerFragment.snappyRecyclerView.setTransparency(); } if (!playerFragment.isLyricsVisisble) { playerFragment.mVisualizerView.setVisibility(View.VISIBLE); } } }); final Handler handler2 = new Handler(); handler2.postDelayed(new Runnable() { @Override public void run() { hideFragment("queue"); } }, 400); } //////////////////////////////////////////////////////////////////////////////////////////////// /* * Methods and classes for updating visualizer. * MyAsyncTask -> AsyncTask to update visualiser in background thread. * updatePoints() -> Actual method to render the DNA. */ public void updateVisualizer(byte[] bytes) { mBytes = bytes; try { new MyAsyncTask().executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR); } catch (Exception e) { e.printStackTrace(); } } public class MyAsyncTask extends AsyncTask<Void, Void, Void> { @Override protected Void doInBackground(Void... params) { updatePoints(); return null; } @Override protected void onPostExecute(Void aVoid) { super.onPostExecute(aVoid); main.runOnUiThread(new Runnable() { @Override public void run() { playerFragment.mVisualizerView.updateVisualizer(mBytes); if (playerFragment.mVisualizerView.bmp != null) { if (navImageView != null) { try { Bitmap croppedBmp = Bitmap.createBitmap(playerFragment.mVisualizerView.bmp, 0, (int) (75 * ratio), screen_width, screen_width); navImageView.setImageBitmap(croppedBmp); } catch (Exception | OutOfMemoryError e) { e.printStackTrace(); } } } } }); } } public void updatePoints() { try { playerFragment.mVisualizerView.outerRadius = (float) (Math.min(playerFragment.mVisualizerView.width, playerFragment.mVisualizerView.height) * 0.42); playerFragment.mVisualizerView.normalizedPosition = ((float) (playerFragment.mMediaPlayer.getCurrentPosition()) / (float) (playerFragment.durationInMilliSec)); if (mBytes == null) { return; } playerFragment.mVisualizerView.angle = (float) (Math.PI - playerFragment.mVisualizerView.normalizedPosition * playerFragment.mVisualizerView.TAU); playerFragment.mVisualizerView.color = 0; playerFragment.mVisualizerView.lnDataDistance = 0; playerFragment.mVisualizerView.distance = 0; playerFragment.mVisualizerView.size = 0; playerFragment.mVisualizerView.volume = 0; playerFragment.mVisualizerView.power = 0; } catch (Exception e) { } float x, y; int midx = (int) (playerFragment.mVisualizerView.width / 2); int midy = (int) (playerFragment.mVisualizerView.height / 2); // calculate min and max amplitude for current byte array float max = Integer.MIN_VALUE, min = Integer.MAX_VALUE; for (int a = 16; a < (mBytes.length / 2); a++) { float amp = mBytes[(a * 2)] * mBytes[(a * 2)] + mBytes[(a * 2) + 1] * mBytes[(a * 2) + 1]; if (amp > max) { max = amp; } if (amp < min) { min = amp; } } /** * Number Fishing is all that is used here to get the best looking DNA * Number fishing is HOW YOU WIN AT LIFE. -- paullewis :) * **/ for (int a = 16; a < (mBytes.length / 2); a++) { if (max <= 10.0) { break; } // scale the amplitude to the range [0,1] float amp = mBytes[(a * 2) + 0] * mBytes[(a * 2) + 0] + mBytes[(a * 2) + 1] * mBytes[(a * 2) + 1]; if (max != min) amp = (amp - min) / (max - min); else { amp = 0; } playerFragment.mVisualizerView.volume = (amp); // converting polar to cartesian (distance calculated afterwards acts as radius for polar co-ords) x = (float) Math.sin(playerFragment.mVisualizerView.angle); y = (float) Math.cos(playerFragment.mVisualizerView.angle); // filtering low amplitude if (playerFragment.mVisualizerView.volume < minAudioStrength) { continue; } // color ( value of hue inn HSV ) calculated based on current progress of the song or audio clip playerFragment.mVisualizerView.color = (float) (playerFragment.mVisualizerView.normalizedPosition - 0.12 + Math.random() * 0.24); playerFragment.mVisualizerView.color = Math.round(playerFragment.mVisualizerView.color * 360); seekBarColor = (float) (playerFragment.mVisualizerView.normalizedPosition); seekBarColor = Math.round(seekBarColor * 360); // calculating distance from center ( 'r' in polar coordinates) playerFragment.mVisualizerView.lnDataDistance = (float) ((Math.log(a - 4) / playerFragment.mVisualizerView.LOG_MAX) - playerFragment.mVisualizerView.BASE); playerFragment.mVisualizerView.distance = playerFragment.mVisualizerView.lnDataDistance * playerFragment.mVisualizerView.outerRadius; // size of the circle to be rendered at the calculated position playerFragment.mVisualizerView.size = ratio * ((float) (4.5 * playerFragment.mVisualizerView.volume * playerFragment.mVisualizerView.MAX_DOT_SIZE + Math.random() * 2)); // alpha also based on volume ( amplitude ) playerFragment.mVisualizerView.alpha = (float) (playerFragment.mVisualizerView.volume * 0.09); // final cartesian coordinates for drawing on canvas x = x * playerFragment.mVisualizerView.distance; y = y * playerFragment.mVisualizerView.distance; float[] hsv = new float[3]; hsv[0] = playerFragment.mVisualizerView.color; hsv[1] = (float) 0.9; hsv[2] = (float) 0.9; // setting color of the Paint playerFragment.mVisualizerView.mForePaint.setColor(Color.HSVToColor(hsv)); if (playerFragment.mVisualizerView.size >= 8.0 && playerFragment.mVisualizerView.size < 29.0) { playerFragment.mVisualizerView.mForePaint.setAlpha(17); } else if (playerFragment.mVisualizerView.size >= 29.0 && playerFragment.mVisualizerView.size <= 60.0) { playerFragment.mVisualizerView.mForePaint.setAlpha(9); } else if (playerFragment.mVisualizerView.size > 60.0) { playerFragment.mVisualizerView.mForePaint.setAlpha(3); } else { playerFragment.mVisualizerView.mForePaint.setAlpha((int) (playerFragment.mVisualizerView.alpha * 1000)); } // Draw to the *temp* canvas, this is done to deal with gaps in rendering, when canvas is out of focus cacheCanvas.drawCircle(midx + x, midy + y, playerFragment.mVisualizerView.size, playerFragment.mVisualizerView.mForePaint); } } //////////////////////////////////////////////////////////////////////////////////////////////// /* * PlayerFragment callbacks START * onComplete() -> called when a song ends or next button is clicked in player or notification. * onPreviousTrack() -> called when previous button is clicked in player or notification. * onEqualizerClicked() -> called when equalizer icon is clicked. * onQueueCLicked() -> called when queue icon is clicked. * onPrepared() -> called when media player prepareAsync() is completed. * onSettingsClicked() -> called when settings menu item is selected. * onFullScreen() -> called when fullscreen menu item is selected or player is long pressed. * onAddedtoFavfromPlayer() -> called when favourite icon is clicked. * onShuffleEnabled() / onShuffleEnabled() -> shuffle enebled or disabled. * onSmallPlayerTouched() -> called when the down icon at the top of the player ic clicked to hide the player. * */ @Override public void onComplete() { // Check for sleep timer and whether it has timed out if (isSleepTimerEnabled && isSleepTimerTimeout) { Toast.makeText(ctx, "Sleep timer timed out, closing app", Toast.LENGTH_SHORT).show(); if (playerFragment != null && playerFragment.timer != null) playerFragment.timer.cancel(); // Remove the notification notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE); notificationManager.cancel(1); // Finish the activity finish(); return; } // Save the DNA if saving is enabled if (isSaveDNAEnabled) { new SaveTheDNAs().executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR); } QueueFragment qFrag = (QueueFragment) fragMan.findFragmentByTag("queue"); queueCall = true; PlayerFragment plFrag = playerFragment; if (repeatOnceEnabled && !nextControllerClicked) { /* * Executed if repeat once is enabled and user did not click the next button from player. */ // Set Progress bar to 0 plFrag.progressBar.setProgress(0); plFrag.progressBar.setSecondaryProgress(0); // Get Visualizer and Visualizer View to initial state plFrag.mVisualizer.setEnabled(true); VisualizerView.w = screen_width; VisualizerView.h = screen_height; VisualizerView.conf = Bitmap.Config.ARGB_8888; VisualizerView.bmp = Bitmap.createBitmap(VisualizerView.w, VisualizerView.h, VisualizerView.conf); cacheCanvas = new Canvas(VisualizerView.bmp); // Play the song again by seeking media player to 0 plFrag.mMediaPlayer.seekTo(0); // Setup the icons plFrag.mainTrackController.setImageResource(R.drawable.ic_pause_white_48dp); plFrag.isReplayIconVisible = false; plFrag.player_controller.setImageResource(R.drawable.ic_pause_white_48dp); // Resume the MediaPlayer plFrag.isPrepared = true; plFrag.mMediaPlayer.start(); } else { /* * Executed if repeat once is disabled. * Execution depends on the current position in queue and whether the next button was clicked or not. * If current position is at the end of the queue, then number of elements in the queue are checked. */ if (queueCurrentIndex < queue.getQueue().size() - 1) { queueCurrentIndex++; nextControllerClicked = false; hasQueueEnded = false; if (qFrag != null) { qFrag.updateQueueAdapter(); } if (queue.getQueue().get(queueCurrentIndex).getType()) { localSelectedTrack = queue.getQueue().get(queueCurrentIndex).getLocalTrack(); streamSelected = false; localSelected = true; onLocalTrackSelected(-1); } else { selectedTrack = queue.getQueue().get(queueCurrentIndex).getStreamTrack(); streamSelected = true; localSelected = false; onTrackSelected(-1); } } else { if ((repeatEnabled || repeatOnceEnabled) && (queue.getQueue().size() > 1)) { nextControllerClicked = false; hasQueueEnded = false; queueCurrentIndex = 0; if (qFrag != null) { qFrag.updateQueueAdapter(); } onQueueItemClicked(0); } else if ((repeatEnabled || repeatOnceEnabled) && (queue.getQueue().size() == 1)) { nextControllerClicked = false; hasQueueEnded = false; plFrag.progressBar.setProgress(0); plFrag.progressBar.setSecondaryProgress(0); plFrag.mVisualizer.setEnabled(true); plFrag.mMediaPlayer.seekTo(0); plFrag.mainTrackController.setImageResource(R.drawable.ic_pause_white_48dp); plFrag.isReplayIconVisible = false; plFrag.player_controller.setImageResource(R.drawable.ic_pause_white_48dp); plFrag.isPrepared = true; plFrag.mMediaPlayer.start(); } else { if ((nextControllerClicked || hasQueueEnded) && (queue.getQueue().size() > 1)) { nextControllerClicked = false; hasQueueEnded = false; queueCurrentIndex = 0; if (qFrag != null) { qFrag.updateQueueAdapter(); } onQueueItemClicked(0); } else if ((nextControllerClicked || hasQueueEnded) && (queue.getQueue().size() == 1)) { nextControllerClicked = false; hasQueueEnded = false; plFrag.progressBar.setProgress(0); plFrag.progressBar.setSecondaryProgress(0); if (plFrag.mVisualizer != null) plFrag.mVisualizer.setEnabled(true); plFrag.mMediaPlayer.seekTo(0); plFrag.mainTrackController.setImageResource(R.drawable.ic_pause_white_48dp); plFrag.isReplayIconVisible = false; plFrag.player_controller.setImageResource(R.drawable.ic_pause_white_48dp); plFrag.isPrepared = true; plFrag.mMediaPlayer.start(); } else { // keep queue at last track or you are doomed } } } } } @Override public void onPreviousTrack() { QueueFragment qFrag = (QueueFragment) fragMan.findFragmentByTag("queue"); /* * Execution depends on the current position in the queue */ if (queueCurrentIndex > 0) { queueCall = true; queueCurrentIndex--; if (qFrag != null) { qFrag.updateQueueAdapter(); } if (queue.getQueue().get(queueCurrentIndex).getType()) { localSelectedTrack = queue.getQueue().get(queueCurrentIndex).getLocalTrack(); streamSelected = false; localSelected = true; onLocalTrackSelected(-1); } else { selectedTrack = queue.getQueue().get(queueCurrentIndex).getStreamTrack(); streamSelected = true; localSelected = false; onTrackSelected(-1); } } else { // keep queue at 0 } } @Override public void onEqualizerClicked() { hideAllFrags(); hidePlayer2(); showFragment("equalizer"); } @Override public void onQueueClicked() { hideAllFrags(); hidePlayer3(); showFragment("queue"); } @Override public void onPrepared() { showNotification(); } @Override public void onFullScreen() { //Adds Haptic Feedback(Vibration) on entering and exiting full screen mode of video player View view = findViewById(R.id.root_view); view.performHapticFeedback(HapticFeedbackConstants.VIRTUAL_KEY); if (isFullScreenEnabled) { Toast.makeText(this, "Long Press to Exit", Toast.LENGTH_SHORT).show(); ActionBar actionBar = getSupportActionBar(); actionBar.hide(); } else { ActionBar actionBar = getSupportActionBar(); actionBar.show(); } } @Override public void onSettingsClicked() { if (playerFragment.smallPlayer != null) { hidePlayer(); isPlayerVisible = false; showFragment("settings"); } } @Override public void onAddedtoFavfromPlayer() { FavouritesFragment favouritesFragment = (FavouritesFragment) fragMan.findFragmentByTag("favourite"); if (favouritesFragment != null) { favouritesFragment.updateData(); } } @Override public void onShuffleEnabled() { originalQueue = new Queue(); for (UnifiedTrack ut : queue.getQueue()) { originalQueue.addToQueue(ut); } originalQueueIndex = queueCurrentIndex; UnifiedTrack ut = queue.getQueue().get(queueCurrentIndex); Collections.shuffle(queue.getQueue()); for (int i = 0; i < queue.getQueue().size(); i++) { if (ut.equals(queue.getQueue().get(i))) { queue.getQueue().remove(i); break; } } queue.getQueue().add(0, ut); queueCurrentIndex = 0; new SaveQueue().executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR); } @Override public void onShuffleDisabled() { UnifiedTrack ut1 = queue.getQueue().get(queueCurrentIndex); for (int i = 0; i < queue.getQueue().size(); i++) { UnifiedTrack ut = queue.getQueue().get(i); if (!originalQueue.getQueue().contains(ut)) { originalQueue.getQueue().add(ut); } } queue.getQueue().clear(); for (UnifiedTrack ut : originalQueue.getQueue()) { queue.addToQueue(ut); } for (int i = 0; i < queue.getQueue().size(); i++) { if (ut1.equals(queue.getQueue().get(i))) { queueCurrentIndex = i; break; } } new SaveQueue().executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR); } @Override public void onSmallPlayerTouched() { if (!isPlayerVisible) { isPlayerVisible = true; showPlayer(); } else { isPlayerVisible = false; hidePlayer(); } } @Override public void addCurrentSongtoPlaylist(UnifiedTrack ut) { showAddToPlaylistDialog(ut); } @Override public void onPlayPause() { showNotification(); } //////////////////////////////////////////////////////////////////////////////////////////////// /* * ViewPlaylistFragment callbacks START * onPlaylistPlayAll() -> when play all fab is clciked in a playlist. * onPlaylistItemClicked() -> when a song is selected from a playlist. * playlistRename() -> when playlist rename is selected. * playlistAddToQueue() -> when playlist add to queue is selected. * onPlaylistEmpty() -> called when playlist becomes empty due to swipin out of last element. */ @Override public void onPlaylistPlayAll() { onQueueItemClicked(0); hideFragment("playlist"); setTitle("Music DNA"); } @Override public void onPlaylistItemClicked(int position) { UnifiedTrack ut = tempPlaylist.getSongList().get(position); if (ut.getType()) { LocalTrack track = ut.getLocalTrack(); if (queue.getQueue().size() == 0) { queueCurrentIndex = 0; queue.getQueue().add(new UnifiedTrack(true, track, null)); } else if (queueCurrentIndex == queue.getQueue().size() - 1) { queueCurrentIndex++; queue.getQueue().add(new UnifiedTrack(true, track, null)); } else if (isReloaded) { isReloaded = false; queueCurrentIndex = queue.getQueue().size(); queue.getQueue().add(new UnifiedTrack(true, track, null)); } else { queue.getQueue().add(++queueCurrentIndex, new UnifiedTrack(true, track, null)); } localSelectedTrack = track; streamSelected = false; localSelected = true; queueCall = false; isReloaded = false; onLocalTrackSelected(position); } else { Track track = ut.getStreamTrack(); if (queue.getQueue().size() == 0) { queueCurrentIndex = 0; queue.getQueue().add(new UnifiedTrack(false, null, track)); } else if (queueCurrentIndex == queue.getQueue().size() - 1) { queueCurrentIndex++; queue.getQueue().add(new UnifiedTrack(false, null, track)); } else if (isReloaded) { isReloaded = false; queueCurrentIndex = queue.getQueue().size(); queue.getQueue().add(new UnifiedTrack(false, null, track)); } else { queue.getQueue().add(++queueCurrentIndex, new UnifiedTrack(false, null, track)); } selectedTrack = track; streamSelected = true; localSelected = false; queueCall = false; isReloaded = false; onTrackSelected(position); } } @Override public void playlistRename() { renamePlaylistNumber = tempPlaylistNumber; renamePlaylistDialog(tempPlaylist.getPlaylistName()); } @Override public void playlistAddToQueue() { Playlist pl = HomeActivity.allPlaylists.getPlaylists().get(tempPlaylistNumber); for (UnifiedTrack ut : pl.getSongList()) { HomeActivity.queue.addToQueue(ut); } if (playerFragment != null && playerFragment.snappyRecyclerView != null) { playerFragment.snappyRecyclerView.getAdapter().notifyDataSetChanged(); playerFragment.snappyRecyclerView.setTransparency(); } Toast.makeText(ctx, "Added " + pl.getSongList().size() + " song(s) to queue", Toast.LENGTH_SHORT).show(); } @Override public void onPlaylistEmpty() { AllPlaylistsFragment plFrag = (AllPlaylistsFragment) fragMan.findFragmentByTag("allPlaylists"); if (plFrag != null && plFrag.vpAdapter != null) { plFrag.vpAdapter.notifyItemRemoved(tempPlaylistNumber); } if (pAdapter != null) { pAdapter.notifyItemRemoved(tempPlaylistNumber); } } //////////////////////////////////////////////////////////////////////////////////////////////// /* * FavouriteFragment callbacks START * onFavouriteItemClicked() -> when a song is selected from favourites. * onFavouritePlayAll() -> when favourite play all fab is selected. * addFavToQueue() -> when `add favourite to queue` is selected. */ @Override public void onFavouriteItemClicked(int position) { UnifiedTrack ut = favouriteTracks.getFavourite().get(position); if (ut.getType()) { LocalTrack track = ut.getLocalTrack(); if (queue.getQueue().size() == 0) { queueCurrentIndex = 0; queue.getQueue().add(new UnifiedTrack(true, track, null)); } else if (queueCurrentIndex == queue.getQueue().size() - 1) { queueCurrentIndex++; queue.getQueue().add(new UnifiedTrack(true, track, null)); } else if (isReloaded) { isReloaded = false; queueCurrentIndex = queue.getQueue().size(); queue.getQueue().add(new UnifiedTrack(true, track, null)); } else { queue.getQueue().add(++queueCurrentIndex, new UnifiedTrack(true, track, null)); } localSelectedTrack = track; streamSelected = false; localSelected = true; queueCall = false; isReloaded = false; onLocalTrackSelected(position); } else { Track track = ut.getStreamTrack(); if (queue.getQueue().size() == 0) { queueCurrentIndex = 0; queue.getQueue().add(new UnifiedTrack(false, null, track)); } else if (queueCurrentIndex == queue.getQueue().size() - 1) { queueCurrentIndex++; queue.getQueue().add(new UnifiedTrack(false, null, track)); } else if (isReloaded) { isReloaded = false; queueCurrentIndex = queue.getQueue().size(); queue.getQueue().add(new UnifiedTrack(false, null, track)); } else { queue.getQueue().add(++queueCurrentIndex, new UnifiedTrack(false, null, track)); } selectedTrack = track; streamSelected = true; localSelected = false; queueCall = false; isReloaded = false; onTrackSelected(position); } } @Override public void onFavouritePlayAll() { if (queue.getQueue().size() > 0) { onQueueItemClicked(0); hideFragment("favourite"); } } @Override public void addFavToQueue() { for (UnifiedTrack ut : favouriteTracks.getFavourite()) { queue.addToQueue(ut); } if (playerFragment != null && playerFragment.snappyRecyclerView != null) { playerFragment.snappyRecyclerView.getAdapter().notifyDataSetChanged(); playerFragment.snappyRecyclerView.setTransparency(); } Toast.makeText(ctx, "Added " + favouriteTracks.getFavourite().size() + " song(s) to queue", Toast.LENGTH_SHORT).show(); } //////////////////////////////////////////////////////////////////////////////////////////////// /* * QueueFragment callbacks START * onQueueItemClicked() -> when a song is selected from queue. * onQueueSave() -> queue save as playlist fab is clicked. * onQueueClear() -> when queue clear option is selected. */ @Override public void onQueueItemClicked(final int position) { if (isPlayerVisible && isQueueVisible) showPlayer3(); final Handler handler = new Handler(); handler.postDelayed(new Runnable() { @Override public void run() { queueCurrentIndex = position; UnifiedTrack ut = queue.getQueue().get(position); if (ut.getType()) { LocalTrack track = ut.getLocalTrack(); localSelectedTrack = track; streamSelected = false; localSelected = true; queueCall = false; isReloaded = false; onLocalTrackSelected(position); } else { Track track = ut.getStreamTrack(); selectedTrack = track; streamSelected = true; localSelected = false; queueCall = false; isReloaded = false; onTrackSelected(position); } } }, 500); } @Override public void onQueueSave() { showSaveQueueDialog(); } @Override public void onQueueClear() { clearQueue(); new SaveQueue().executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR); } //////////////////////////////////////////////////////////////////////////////////////////////// /* * AllPlaylistsFragment callbacks START */ @Override public void onPlaylistSelected(int pos) { tempPlaylist = allPlaylists.getPlaylists().get(pos); tempPlaylistNumber = pos; showFragment("playlist"); } @Override public void onPlaylistMenuPLayAll() { onPlaylistPlayAll(); } @Override public void onPlaylistRename() { renamePlaylistDialog(allPlaylists.getPlaylists().get(renamePlaylistNumber).getPlaylistName()); } @Override public void newPlaylistListener() { showFragment("newPlaylist"); } //////////////////////////////////////////////////////////////////////////////////////////////// /* * FolderFragment callbacks START */ @Override public void onFolderClicked(int pos) { tempMusicFolder = allMusicFolders.getMusicFolders().get(pos); tempFolderContent = tempMusicFolder.getLocalTracks(); showFragment("folderContent"); } //////////////////////////////////////////////////////////////////////////////////////////////// /* * FolderContentFragment callbacks START */ @Override public void onFolderContentPlayAll() { queue.getQueue().clear(); for (int i = 0; i < tempFolderContent.size(); i++) { queue.getQueue().add(new UnifiedTrack(true, tempFolderContent.get(i), null)); } queueCurrentIndex = 0; onPlaylistMenuPLayAll(); } @Override public void onFolderContentItemClick(int position) { onLocalTrackSelected(position); } @Override public void folderAddToQueue() { List<LocalTrack> list = tempFolderContent; for (LocalTrack lt : list) { HomeActivity.queue.addToQueue(new UnifiedTrack(true, lt, null)); } if (playerFragment != null && playerFragment.snappyRecyclerView != null) { playerFragment.snappyRecyclerView.getAdapter().notifyDataSetChanged(); playerFragment.snappyRecyclerView.setTransparency(); } Toast.makeText(ctx, "Added " + list.size() + " song(s) to queue", Toast.LENGTH_SHORT).show(); } //////////////////////////////////////////////////////////////////////////////////////////////// /* * AlbumFragment callbacks START * onAlbumClick() -> a particular album is selected from all albums list. */ @Override public void onAlbumClick() { showFragment("viewAlbum"); } //////////////////////////////////////////////////////////////////////////////////////////////// /* * ViewAlbumFragment callbacks START * onAlbumPlayAll() -> play all fab is selected in view album fragment. * addAlbumToQueue() -> add to queue button is selected in view album fragment. * onAlbumSongClick() -> a song is selected in view album fragment. */ @Override public void onAlbumPlayAll() { onQueueItemClicked(0); showPlayer(); } @Override public void addAlbumToQueue() { List<LocalTrack> list = tempAlbum.getAlbumSongs(); for (LocalTrack lt : list) { HomeActivity.queue.addToQueue(new UnifiedTrack(true, lt, null)); } if (playerFragment != null && playerFragment.snappyRecyclerView != null) { playerFragment.snappyRecyclerView.getAdapter().notifyDataSetChanged(); playerFragment.snappyRecyclerView.setTransparency(); } Toast.makeText(ctx, "Added " + list.size() + " song(s) to queue", Toast.LENGTH_SHORT).show(); } @Override public void onAlbumSongClick() { onLocalTrackSelected(-1); } //////////////////////////////////////////////////////////////////////////////////////////////// /* * ArtistFragment callbacks START * onArtistClick() -> a particular artist is selected from all artists list. */ @Override public void onArtistClick() { searchView.setQuery("", true); searchView.setIconified(true); showFragment("viewArtist"); } //////////////////////////////////////////////////////////////////////////////////////////////// /* * ViewArtistFragment callbacks START * onArtistPlayAll() -> play all fab is selected in view artist fragment. * addArtistToQueue() -> add to queue button is selected in view artist fragment. * onArtistSongClick() -> a song is selected in view artist fragment. */ @Override public void onArtistPlayAll() { onQueueItemClicked(0); showPlayer(); } @Override public void addArtistToQueue() { List<LocalTrack> list = tempArtist.getArtistSongs(); for (LocalTrack lt : list) { HomeActivity.queue.addToQueue(new UnifiedTrack(true, lt, null)); } if (playerFragment != null && playerFragment.snappyRecyclerView != null) { playerFragment.snappyRecyclerView.getAdapter().notifyDataSetChanged(); playerFragment.snappyRecyclerView.setTransparency(); } Toast.makeText(ctx, "Added " + list.size() + " song(s) to queue", Toast.LENGTH_SHORT).show(); } @Override public void onArtistSongClick() { onLocalTrackSelected(-1); } //////////////////////////////////////////////////////////////////////////////////////////////// /* * RecentsFragment callbacks START * onRecentItemClicked() -> a song is selected from the recents fragment. * onRecentFromQueue() -> when a song is selected from recents that is already in queue. * addRecentsToQueue() -> add recents to queue option is selcted */ @Override public void onRecentItemClicked(boolean isLocal) { if (isLocal) { onLocalTrackSelected(-1); } else { onTrackSelected(-1); } } @Override public void onRecentFromQueue(int pos) { onQueueItemClicked(pos); } @Override public void addRecentsToQueue() { for (UnifiedTrack ut : recentlyPlayed.getRecentlyPlayed()) { queue.addToQueue(ut); } if (playerFragment != null && playerFragment.snappyRecyclerView != null) { playerFragment.snappyRecyclerView.getAdapter().notifyDataSetChanged(); playerFragment.snappyRecyclerView.setTransparency(); } Toast.makeText(ctx, "Added " + recentlyPlayed.getRecentlyPlayed().size() + " song(s) to queue", Toast.LENGTH_SHORT).show(); } //////////////////////////////////////////////////////////////////////////////////////////////// /* * SettingsFragment callbacks START * onColorChanged() -> called when theme color is selected from the colorPicker * onAlbumArtBackgroundChangedVisibility() -> callback to handle toggling of album art behind DNA * onAboutClicked() -> callback to show the about fragment. */ @Override public void onColorChanged() { navigationView.setItemIconTintList(ColorStateList.valueOf(themeColor)); } @Override public void onAlbumArtBackgroundChangedVisibility(int visibility) { PlayerFragment plFrag = getPlayerFragment(); if (plFrag != null) { plFrag.toggleAlbumArtBackground(); } } @Override public void onAboutClicked() { showFragment("About"); } //////////////////////////////////////////////////////////////////////////////////////////////// /* * NewPlaylistFragment callbacks START * onCancel() -> callback to handle cancellation of creating new playlist. * onDone() -> callback to handle completion of creating new playlist. */ @Override public void onCancel() { finalSelectedTracks.clear(); } @Override public void onDone() { if (finalSelectedTracks.size() == 0) { finalSelectedTracks.clear(); onBackPressed(); } else { newPlaylistNameDialog(); } } //////////////////////////////////////////////////////////////////////////////////////////////// /* * HeadsetReceiver callbacks START * onHeadsetRemoved() -> callback to check when the headset is removed from the device. * onHeadsetNextClicked() -> callback to handle the next button click on a headset. * onHeadsetPreviousClicked() -> callback to handle the previous button click on a headset. * onHeadsetPlayPauseClicked() -> callback to handle the play/pause button click on a headset. */ @Override public void onHeadsetRemoved() { PlayerFragment pFrag = getPlayerFragment(); if (pFrag != null) { if (pFrag.mMediaPlayer != null && pFrag.mMediaPlayer.isPlaying()) { if (pFrag.isReplayIconVisible) { } else { if (!pFrag.pauseClicked) { pFrag.pauseClicked = true; } pFrag.togglePlayPause(); } } } } @Override public void onHeadsetNextClicked() { PlayerFragment pFrag = getPlayerFragment(); if (pFrag != null && !isReloaded) { pFrag.nextTrackController.performClick(); } } @Override public void onHeadsetPreviousClicked() { PlayerFragment pFrag = getPlayerFragment(); if (pFrag != null && !isReloaded) { pFrag.previousTrackController.performClick(); } } @Override public void onHeadsetPlayPauseClicked() { PlayerFragment pFrag = getPlayerFragment(); if (pFrag != null && !isReloaded) { if (pFrag.mMediaPlayer != null && pFrag.mMediaPlayer.isPlaying()) { if (pFrag.isReplayIconVisible) { hasQueueEnded = true; onComplete(); } else { if (!pFrag.pauseClicked) { pFrag.pauseClicked = true; } pFrag.togglePlayPause(); } } } } //////////////////////////////////////////////////////////////////////////////////////////////// /* * EditSongFragment callbacks START * onEditSongSave() -> called when save is clicked to store edited fields. * deleteMediaStoreCache() -> used to delete the media store cache so that it is rebuilt and new album art is cached. * getNewBitmap() -> called to statr the image picker intent for album art. */ @Override public void onEditSongSave(boolean wasSaveSuccessful) { hideFragment("Edit"); if (!wasSaveSuccessful) { Toast.makeText(this, "Error occured while editing", Toast.LENGTH_SHORT).show(); return; } MediaCacheUtils.updateMediaCache(editSong.getTitle(), editSong.getArtist(), editSong.getAlbum(), editSong.getId(), this); refreshAlbumAndArtists(); if (isAlbumVisible) { hideFragment("viewAlbum"); } else if (isArtistVisible) { hideFragment("viewArtist"); } LocalMusicViewPagerFragment flmFrag = (LocalMusicViewPagerFragment) fragMan.findFragmentByTag("local"); LocalMusicFragment lFrag = null; if (flmFrag != null) { lFrag = (LocalMusicFragment) flmFrag.getFragmentByPosition(0); } if (lFrag != null) { lFrag.updateAdapter(); } ArtistFragment artFrag = null; if (flmFrag != null) { artFrag = (ArtistFragment) flmFrag.getFragmentByPosition(2); } if (artFrag != null) { artFrag.updateAdapter(); } AlbumFragment albFrag = null; if (flmFrag != null) { albFrag = (AlbumFragment) flmFrag.getFragmentByPosition(1); } if (albFrag != null) { albFrag.updateAdapter(); } } @Override public void deleteMediaStoreCache() { File dir = new File(Environment.getExternalStorageDirectory() + "/Android/data/com.android.providers.media/albumthumbs"); if (dir.isDirectory()) { Toast.makeText(this, "Clearing cache", Toast.LENGTH_SHORT).show(); String[] children = dir.list(); for (int i = 0; i < children.length; i++) { new File(dir, children[i]).delete(); } } } @Override public void getNewBitmap() { Intent photoPickerIntent = new Intent(Intent.ACTION_PICK); photoPickerIntent.setType("image/*"); startActivityForResult(photoPickerIntent, 1); } //////////////////////////////////////////////////////////////////////////////////////////////// /* * EqualizerFragment callbacks START * onCheckChanged() -> when equalizer switch state is changed. */ @Override public void onCheckChanged(boolean isChecked) { EqualizerFragment eqFrag = (EqualizerFragment) fragMan.findFragmentByTag("equalizer"); if (isChecked) { try { isEqualizerEnabled = true; int pos = presetPos; if (pos != 0) { playerFragment.mEqualizer.usePreset((short) (pos - 1)); } else { for (short i = 0; i < 5; i++) { playerFragment.mEqualizer.setBandLevel(i, (short) seekbarpos[i]); } } if (bassStrength != -1 && reverbPreset != -1) { playerFragment.bassBoost.setEnabled(true); playerFragment.bassBoost.setStrength(bassStrength); playerFragment.presetReverb.setEnabled(true); playerFragment.presetReverb.setPreset(reverbPreset); } playerFragment.mMediaPlayer.setAuxEffectSendLevel(1.0f); if (eqFrag != null) eqFrag.setBlockerVisibility(View.GONE); } catch (Exception e) { e.printStackTrace(); } } else { try { isEqualizerEnabled = false; playerFragment.mEqualizer.usePreset((short) 0); playerFragment.bassBoost.setStrength((short) (((float) 1000 / 19) * (1))); playerFragment.presetReverb.setPreset((short) 0); if (eqFrag != null) eqFrag.setBlockerVisibility(View.VISIBLE); } catch (Exception e) { e.printStackTrace(); } } equalizerModel.isEqualizerEnabled = isChecked; } //////////////////////////////////////////////////////////////////////////////////////////////// /* * ServiceCallbacks callbacks START * getPlayerFragment() -> returns an instance of the player fragment. */ @Override public PlayerFragment getPlayerFragment() { return playerFragment; } //////////////////////////////////////////////////////////////////////////////////////////////// class CancelCall implements Runnable { @Override public void run() { if (call != null) call.cancel(); } } public void onQueueItemClicked2(int position) { if (position <= (queue.getQueue().size() - 1)) { queueCurrentIndex = position; UnifiedTrack ut = queue.getQueue().get(position); if (ut.getType()) { LocalTrack track = ut.getLocalTrack(); localSelectedTrack = track; streamSelected = false; localSelected = true; queueCall = true; isReloaded = false; onLocalTrackSelected(position); } else { Track track = ut.getStreamTrack(); selectedTrack = track; streamSelected = true; localSelected = false; queueCall = true; isReloaded = false; onTrackSelected(position); } } } public void newPlaylistNameDialog() { final Dialog dialog = new Dialog(ctx); dialog.requestWindowFeature(Window.FEATURE_NO_TITLE); dialog.setContentView(R.layout.save_image_dialog); TextView titleText = (TextView) dialog.findViewById(R.id.dialog_title); titleText.setText("Playlist Name"); if (SplashActivity.tf4 != null) titleText.setTypeface(SplashActivity.tf4); Button btn = (Button) dialog.findViewById(R.id.save_image_btn); final EditText newName = (EditText) dialog.findViewById(R.id.save_image_filename_text); CheckBox cb = (CheckBox) dialog.findViewById(R.id.text_checkbox); cb.setVisibility(GONE); btn.setBackgroundColor(themeColor); btn.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { boolean isNameRepeat = false; if (newName.getText().toString().trim().equals("")) { newName.setError("Enter Playlist Name!"); } else { for (int i = 0; i < allPlaylists.getPlaylists().size(); i++) { if (newName.getText().toString().equals(allPlaylists.getPlaylists().get(i).getPlaylistName())) { isNameRepeat = true; newName.setError("Playlist with same name exists!"); break; } } if (!isNameRepeat) { UnifiedTrack ut; Playlist pl = new Playlist(newName.getText().toString()); for (int i = 0; i < finalSelectedTracks.size(); i++) { ut = new UnifiedTrack(true, finalSelectedTracks.get(i), null); pl.getSongList().add(ut); } allPlaylists.addPlaylist(pl); finalSelectedTracks.clear(); if (pAdapter != null) { pAdapter.notifyDataSetChanged(); if (allPlaylists.getPlaylists().size() > 0) { playlistsRecycler.setVisibility(View.VISIBLE); playlistNothingText.setVisibility(View.INVISIBLE); } } AllPlaylistsFragment plFrag = (AllPlaylistsFragment) fragMan.findFragmentByTag("allPlaylists"); if (plFrag != null) { plFrag.dataChanged(); } new SavePlaylists().executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR); dialog.dismiss(); onBackPressed(); } } } }); dialog.show(); } public void renamePlaylistDialog(String oldName) { final Dialog dialog = new Dialog(ctx); dialog.requestWindowFeature(Window.FEATURE_NO_TITLE); dialog.setContentView(R.layout.save_image_dialog); TextView titleText = (TextView) dialog.findViewById(R.id.dialog_title); titleText.setText("Rename"); if (SplashActivity.tf4 != null) titleText.setTypeface(SplashActivity.tf4); Button btn = (Button) dialog.findViewById(R.id.save_image_btn); final EditText newName = (EditText) dialog.findViewById(R.id.save_image_filename_text); CheckBox cb = (CheckBox) dialog.findViewById(R.id.text_checkbox); cb.setVisibility(GONE); newName.setText(oldName); btn.setBackgroundColor(themeColor); btn.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { boolean isNameRepeat = false; if (newName.getText().toString().trim().equals("")) { newName.setError("Enter Playlist Name!"); } else { for (int i = 0; i < allPlaylists.getPlaylists().size(); i++) { if (newName.getText().toString().equals(allPlaylists.getPlaylists().get(i).getPlaylistName())) { isNameRepeat = true; newName.setError("Playlist with same name exists!"); break; } } if (!isNameRepeat) { allPlaylists.getPlaylists().get(renamePlaylistNumber).setPlaylistName(newName.getText().toString()); if (pAdapter != null) { pAdapter.notifyItemChanged(renamePlaylistNumber); } AllPlaylistsFragment plFrag = (AllPlaylistsFragment) fragMan.findFragmentByTag("allPlaylists"); if (plFrag != null) { plFrag.itemChanged(renamePlaylistNumber); } if (isPlaylistVisible) { ViewPlaylistFragment vplFragment = (ViewPlaylistFragment) fragMan.findFragmentByTag("playlist"); vplFragment.updateViewPlaylistFragment(); } new SavePlaylists().executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR); dialog.dismiss(); } } } }); dialog.show(); } public void showAddToPlaylistDialog(final UnifiedTrack track) { final Dialog dialog = new Dialog(ctx); dialog.setContentView(R.layout.add_to_playlist_dialog); dialog.setTitle("Add to Playlist"); ListView lv = (ListView) dialog.findViewById(R.id.playlist_list); AddToPlaylistAdapter adapter; if (allPlaylists.getPlaylists() != null && allPlaylists.getPlaylists().size() != 0) { adapter = new AddToPlaylistAdapter(allPlaylists.getPlaylists(), ctx); lv.setAdapter(adapter); lv.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { Playlist temp = allPlaylists.getPlaylists().get(position); boolean isRepeat = false; for (UnifiedTrack ut : temp.getSongList()) { if (track.getType() && ut.getType() && track.getLocalTrack().getTitle().equals(ut.getLocalTrack().getTitle())) { isRepeat = true; break; } else if (!track.getType() && !ut.getType() && track.getStreamTrack().getTitle().equals(ut.getStreamTrack().getTitle())) { isRepeat = true; break; } } if (!isRepeat) { temp.addSong(track); playlistsRecycler.setVisibility(View.VISIBLE); playlistNothingText.setVisibility(View.INVISIBLE); pAdapter.notifyDataSetChanged(); Toast.makeText(ctx, "Added to Playlist : " + temp.getPlaylistName(), Toast.LENGTH_SHORT).show(); new SavePlaylists().executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR); dialog.dismiss(); } else { Toast.makeText(ctx, "Song already present in Playlist", Toast.LENGTH_SHORT).show(); } } }); } else { lv.setVisibility(GONE); } // set the custom dialog components - text, image and button final EditText text = (EditText) dialog.findViewById(R.id.new_playlist_name); ImageView image = (ImageView) dialog.findViewById(R.id.confirm_button); // if button is clicked, close the custom dialog image.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { boolean isNameRepeat = false; if (text.getText().toString().trim().equals("")) { text.setError("Enter Playlist Name!"); } else { for (int i = 0; i < allPlaylists.getPlaylists().size(); i++) { if (text.getText().toString().equals(allPlaylists.getPlaylists().get(i).getPlaylistName())) { isNameRepeat = true; text.setError("Playlist with same name exists!"); break; } } if (!isNameRepeat) { List<UnifiedTrack> l = new ArrayList<UnifiedTrack>(); l.add(track); Playlist pl = new Playlist(l, text.getText().toString().trim()); allPlaylists.addPlaylist(pl); playlistsRecycler.setVisibility(View.VISIBLE); playlistNothingText.setVisibility(View.INVISIBLE); pAdapter.notifyDataSetChanged(); dialog.dismiss(); new SavePlaylists().executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR); } } } }); dialog.show(); } public void showSaveQueueDialog() { final Dialog dialog = new Dialog(ctx); dialog.setContentView(R.layout.add_to_playlist_dialog); dialog.setTitle("Save Queue"); ListView lv = (ListView) dialog.findViewById(R.id.playlist_list); lv.setVisibility(GONE); // set the custom dialog components - text, image and button final EditText text = (EditText) dialog.findViewById(R.id.new_playlist_name); ImageView image = (ImageView) dialog.findViewById(R.id.confirm_button); // if button is clicked, close the custom dialog image.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { boolean isNameRepeat = false; if (text.getText().toString().trim().equals("")) { text.setError("Enter Playlist Name!"); } else { for (int i = 0; i < allPlaylists.getPlaylists().size(); i++) { if (text.getText().toString().equals(allPlaylists.getPlaylists().get(i).getPlaylistName())) { isNameRepeat = true; text.setError("Playlist with same name exists!"); break; } } if (!isNameRepeat) { Playlist pl = new Playlist(text.getText().toString()); for (int i = 0; i < queue.getQueue().size(); i++) { pl.getSongList().add(queue.getQueue().get(i)); } allPlaylists.addPlaylist(pl); playlistsRecycler.setVisibility(View.VISIBLE); playlistNothingText.setVisibility(View.INVISIBLE); pAdapter.notifyDataSetChanged(); new SavePlaylists().executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR); Toast.makeText(HomeActivity.this, "Queue saved!", Toast.LENGTH_SHORT).show(); dialog.dismiss(); } } } }); dialog.show(); } public void startLoadingIndicator() { findViewById(R.id.loadingIndicator).setVisibility(View.VISIBLE); soundcloudRecyclerView.setVisibility(View.INVISIBLE); streamNothingText.setVisibility(View.INVISIBLE); } public void stopLoadingIndicator() { findViewById(R.id.loadingIndicator).setVisibility(View.INVISIBLE); soundcloudRecyclerView.setVisibility(View.VISIBLE); if (streamingTrackList.size() == 0) { streamNothingText.setVisibility(View.VISIBLE); } } public void showFragment(String type) { if (!type.equals("viewAlbum") && !type.equals("folderContent") && !type.equals("viewArtist") && !type.equals("playlist") && !type.equals("newPlaylist") && !type.equals("About") && !type.equals("Edit")) hideAllFrags(); if (!searchView.isIconified()) { searchView.setQuery("", true); searchView.setIconified(true); streamRecyclerContainer.setVisibility(GONE); new Thread(new CancelCall()).start(); } if (type.equals("local") && !isLocalVisible) { navigationView.setCheckedItem(R.id.nav_local); isLocalVisible = true; android.support.v4.app.FragmentManager fm = getSupportFragmentManager(); LocalMusicViewPagerFragment newFragment = (LocalMusicViewPagerFragment) fm.findFragmentByTag("local"); if (newFragment == null) { newFragment = new LocalMusicViewPagerFragment(); } fm.beginTransaction() .setCustomAnimations(R.anim.slide_left, R.anim.slide_right, R.anim.slide_left, R.anim.slide_right) .add(R.id.fragContainer, newFragment, "local") .show(newFragment) .addToBackStack(null) .commitAllowingStateLoss(); } else if (type.equals("queue") && !isQueueVisible) { hideAllFrags(); isQueueVisible = true; android.support.v4.app.FragmentManager fm = getSupportFragmentManager(); QueueFragment newFragment = (QueueFragment) fm.findFragmentByTag("queue"); if (newFragment == null) { newFragment = new QueueFragment(); } fm.beginTransaction() .add(R.id.equalizer_queue_frag_container, newFragment, "queue") .show(newFragment) .addToBackStack(null) .commitAllowingStateLoss(); } else if (type.equals("stream") && !isStreamVisible) { isStreamVisible = true; android.support.v4.app.FragmentManager fm = getSupportFragmentManager(); StreamMusicFragment newFragment = (StreamMusicFragment) fm.findFragmentByTag("stream"); if (newFragment == null) { newFragment = new StreamMusicFragment(); } fm.beginTransaction() .setCustomAnimations(R.anim.slide_left, R.anim.slide_right, R.anim.slide_left, R.anim.slide_right) .add(R.id.fragContainer, newFragment, "stream") .show(newFragment) .addToBackStack(null) .commitAllowingStateLoss(); } else if (type.equals("playlist") && !isPlaylistVisible) { isPlaylistVisible = true; android.support.v4.app.FragmentManager fm = getSupportFragmentManager(); ViewPlaylistFragment newFragment = (ViewPlaylistFragment) fm.findFragmentByTag("playlist"); if (newFragment == null) { newFragment = new ViewPlaylistFragment(); } fm.beginTransaction() .setCustomAnimations(R.anim.slide_left, R.anim.slide_right, R.anim.slide_left, R.anim.slide_right) .add(R.id.content_frag, newFragment, "playlist") .show(newFragment) .addToBackStack(null) .commitAllowingStateLoss(); } else if (type.equals("equalizer") && !isEqualizerVisible) { isEqualizerVisible = true; android.support.v4.app.FragmentManager fm = getSupportFragmentManager(); EqualizerFragment newFragment = (EqualizerFragment) fm.findFragmentByTag("equalizer"); if (newFragment == null) { newFragment = new EqualizerFragment(); } fm.beginTransaction() .add(R.id.equalizer_queue_frag_container, newFragment, "equalizer") .show(newFragment) .addToBackStack(null) .commitAllowingStateLoss(); } else if (type.equals("favourite") && !isFavouriteVisible) { navigationView.setCheckedItem(R.id.nav_fav); isFavouriteVisible = true; android.support.v4.app.FragmentManager fm = getSupportFragmentManager(); FavouritesFragment newFragment = (FavouritesFragment) fm.findFragmentByTag("favourite"); if (newFragment == null) { newFragment = new FavouritesFragment(); } fm.beginTransaction() .setCustomAnimations(R.anim.slide_left, R.anim.slide_right, R.anim.slide_left, R.anim.slide_right) .add(R.id.fragContainer, newFragment, "favourite") .show(newFragment) .addToBackStack(null) .commitAllowingStateLoss(); } else if (type.equals("newPlaylist") && !isNewPlaylistVisible) { navigationView.setCheckedItem(R.id.nav_playlists); isNewPlaylistVisible = true; android.support.v4.app.FragmentManager fm = getSupportFragmentManager(); NewPlaylistFragment newFragment = (NewPlaylistFragment) fm.findFragmentByTag("newPlaylist"); if (newFragment == null) { newFragment = new NewPlaylistFragment(); } fm.beginTransaction() .setCustomAnimations(R.anim.slide_left, R.anim.slide_right, R.anim.slide_left, R.anim.slide_right) .add(R.id.content_frag, newFragment, "newPlaylist") .show(newFragment) .addToBackStack(null) .commitAllowingStateLoss(); } else if (type.equals("allPlaylists") && !isAllPlaylistVisible) { navigationView.setCheckedItem(R.id.nav_playlists); isAllPlaylistVisible = true; android.support.v4.app.FragmentManager fm = getSupportFragmentManager(); AllPlaylistsFragment newFragment = (AllPlaylistsFragment) fm.findFragmentByTag("allPlaylists"); if (newFragment == null) { newFragment = new AllPlaylistsFragment(); } fm.beginTransaction() .setCustomAnimations(R.anim.slide_left, R.anim.slide_right, R.anim.slide_left, R.anim.slide_right) .add(R.id.fragContainer, newFragment, "allPlaylists") .show(newFragment) .addToBackStack(null) .commitAllowingStateLoss(); } else if (type.equals("folderContent") && !isFolderContentVisible) { isFolderContentVisible = true; android.support.v4.app.FragmentManager fm = getSupportFragmentManager(); FolderContentFragment newFragment = (FolderContentFragment) fm.findFragmentByTag("folderContent"); if (newFragment == null) { newFragment = new FolderContentFragment(); } fm.beginTransaction() .setCustomAnimations(R.anim.slide_left, R.anim.slide_right, R.anim.slide_left, R.anim.slide_right) .add(R.id.content_frag, newFragment, "folderContent") .show(newFragment) .addToBackStack(null) .commitAllowingStateLoss(); } else if (type.equals("allFolders") && !isAllFolderVisible) { navigationView.setCheckedItem(R.id.nav_folder); isAllFolderVisible = true; android.support.v4.app.FragmentManager fm = getSupportFragmentManager(); FolderFragment newFragment = (FolderFragment) fm.findFragmentByTag("allFolders"); if (newFragment == null) { newFragment = new FolderFragment(); } fm.beginTransaction() .setCustomAnimations(R.anim.slide_left, R.anim.slide_right, R.anim.slide_left, R.anim.slide_right) .add(R.id.fragContainer, newFragment, "allFolders") .show(newFragment) .addToBackStack(null) .commitAllowingStateLoss(); } else if (type.equals("allSavedDNAs") && !isAllSavedDnaVisisble) { navigationView.setCheckedItem(R.id.nav_view); isAllSavedDnaVisisble = true; android.support.v4.app.FragmentManager fm = getSupportFragmentManager(); ViewSavedDNA newFragment = (ViewSavedDNA) fm.findFragmentByTag("allSavedDNAs"); if (newFragment == null) { newFragment = new ViewSavedDNA(); } fm.beginTransaction() .setCustomAnimations(R.anim.slide_left, R.anim.slide_right, R.anim.slide_left, R.anim.slide_right) .add(R.id.fragContainer, newFragment, "allSavedDNAs") .show(newFragment) .addToBackStack(null) .commitAllowingStateLoss(); } else if (type.equals("viewAlbum") && !isAlbumVisible) { isAlbumVisible = true; android.support.v4.app.FragmentManager fm = getSupportFragmentManager(); ViewAlbumFragment newFragment = (ViewAlbumFragment) fm.findFragmentByTag("viewAlbum"); if (newFragment == null) { newFragment = new ViewAlbumFragment(); } fm.beginTransaction() .setCustomAnimations(R.anim.slide_left, R.anim.slide_right, R.anim.slide_left, R.anim.slide_right) .add(R.id.fragContainer, newFragment, "viewAlbum") .show(newFragment) .addToBackStack(null) .commitAllowingStateLoss(); } else if (type.equals("viewArtist") && !isArtistVisible) { isArtistVisible = true; android.support.v4.app.FragmentManager fm = getSupportFragmentManager(); ViewArtistFragment newFragment = (ViewArtistFragment) fm.findFragmentByTag("viewArtist"); if (newFragment == null) { newFragment = new ViewArtistFragment(); } fm.beginTransaction() .setCustomAnimations(R.anim.slide_left, R.anim.slide_right, R.anim.slide_left, R.anim.slide_right) .add(R.id.fragContainer, newFragment, "viewArtist") .show(newFragment) .addToBackStack(null) .commitAllowingStateLoss(); } else if (type.equals("recent") && !isRecentVisible) { navigationView.setCheckedItem(R.id.nav_recent); isRecentVisible = true; android.support.v4.app.FragmentManager fm = getSupportFragmentManager(); RecentsFragment newFragment = (RecentsFragment) fm.findFragmentByTag("recent"); if (newFragment == null) { newFragment = new RecentsFragment(); } fm.beginTransaction() .setCustomAnimations(R.anim.slide_left, R.anim.slide_right, R.anim.slide_left, R.anim.slide_right) .add(R.id.fragContainer, newFragment, "recent") .show(newFragment) .addToBackStack(null) .commitAllowingStateLoss(); } else if (type.equals("settings") && !isSettingsVisible) { isSettingsVisible = true; android.support.v4.app.FragmentManager fm = getSupportFragmentManager(); SettingsFragment newFragment = (SettingsFragment) fm.findFragmentByTag("settings"); if (newFragment == null) { newFragment = new SettingsFragment(); } fm.beginTransaction() .setCustomAnimations(R.anim.slide_left, R.anim.slide_right, R.anim.slide_left, R.anim.slide_right) .add(R.id.fragContainer, newFragment, "settings") .show(newFragment) .addToBackStack(null) .commitAllowingStateLoss(); } else if (type.equals("About") && !isAboutVisible) { setTitle("About"); isAboutVisible = true; android.support.v4.app.FragmentManager fm = getSupportFragmentManager(); AboutFragment newFragment = (AboutFragment) fm.findFragmentByTag("About"); if (newFragment == null) { newFragment = new AboutFragment(); } fm.beginTransaction() .setCustomAnimations(R.anim.slide_left, R.anim.slide_right, R.anim.slide_left, R.anim.slide_right) .add(R.id.content_frag, newFragment, "About") .show(newFragment) .addToBackStack(null) .commitAllowingStateLoss(); } else if (type.equals("Edit") && !isEditVisible) { isEditVisible = true; android.support.v4.app.FragmentManager fm = getSupportFragmentManager(); EditLocalSongFragment newFragment = (EditLocalSongFragment) fm.findFragmentByTag("Edit"); if (newFragment == null) { newFragment = new EditLocalSongFragment(); } fm.beginTransaction() .setCustomAnimations(R.anim.slide_left, R.anim.slide_right, R.anim.slide_left, R.anim.slide_right) .add(R.id.content_frag, newFragment, "Edit") .show(newFragment) .addToBackStack(null) .commitAllowingStateLoss(); } } public void hideFragment(String type) { if (type.equals("local")) { isLocalVisible = false; setTitle("Music DNA"); navigationView.setCheckedItem(R.id.nav_home); android.support.v4.app.FragmentManager fm = getSupportFragmentManager(); android.support.v4.app.Fragment frag = fm.findFragmentByTag("local"); if (frag != null) { fm.beginTransaction() .remove(frag) .commitAllowingStateLoss(); } } else if (type.equals("queue")) { isQueueVisible = false; navigationView.setCheckedItem(R.id.nav_home); android.support.v4.app.FragmentManager fm = getSupportFragmentManager(); android.support.v4.app.Fragment frag = fm.findFragmentByTag("queue"); if (frag != null) { fm.beginTransaction() .remove(frag) .commitAllowingStateLoss(); } } else if (type.equals("stream")) { isStreamVisible = false; setTitle("Music DNA"); navigationView.setCheckedItem(R.id.nav_home); android.support.v4.app.FragmentManager fm = getSupportFragmentManager(); android.support.v4.app.Fragment frag = fm.findFragmentByTag("stream"); if (frag != null) { fm.beginTransaction() .remove(frag) .commitAllowingStateLoss(); } } else if (type.equals("playlist")) { isPlaylistVisible = false; android.support.v4.app.FragmentManager fm = getSupportFragmentManager(); android.support.v4.app.Fragment frag = fm.findFragmentByTag("playlist"); if (frag != null) { fm.beginTransaction() .remove(frag) .commitAllowingStateLoss(); } } else if (type.equals("equalizer")) { isEqualizerVisible = false; new SaveEqualizer().executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR); android.support.v4.app.FragmentManager fm = getSupportFragmentManager(); android.support.v4.app.Fragment frag = fm.findFragmentByTag("equalizer"); if (frag != null) { fm.beginTransaction() .remove(frag) .commitAllowingStateLoss(); } } else if (type.equals("favourite")) { isFavouriteVisible = false; setTitle("Music DNA"); navigationView.setCheckedItem(R.id.nav_home); android.support.v4.app.FragmentManager fm = getSupportFragmentManager(); android.support.v4.app.Fragment frag = fm.findFragmentByTag("favourite"); if (frag != null) { fm.beginTransaction() .remove(frag) .commitAllowingStateLoss(); } } else if (type.equals("newPlaylist")) { isNewPlaylistVisible = false; navigationView.setCheckedItem(R.id.nav_home); android.support.v4.app.FragmentManager fm = getSupportFragmentManager(); android.support.v4.app.Fragment frag = fm.findFragmentByTag("newPlaylist"); if (frag != null) { fm.beginTransaction() .remove(frag) .commitAllowingStateLoss(); } } else if (type.equals("allPlaylists")) { isAllPlaylistVisible = false; setTitle("Music DNA"); navigationView.setCheckedItem(R.id.nav_home); android.support.v4.app.FragmentManager fm = getSupportFragmentManager(); android.support.v4.app.Fragment frag = fm.findFragmentByTag("allPlaylists"); if (frag != null) { fm.beginTransaction() .remove(frag) .commitAllowingStateLoss(); } } else if (type.equals("folderContent")) { isFolderContentVisible = false; android.support.v4.app.FragmentManager fm = getSupportFragmentManager(); android.support.v4.app.Fragment frag = fm.findFragmentByTag("folderContent"); if (frag != null) { fm.beginTransaction() .remove(frag) .commitAllowingStateLoss(); } } else if (type.equals("allFolders")) { isAllFolderVisible = false; setTitle("Music DNA"); navigationView.setCheckedItem(R.id.nav_home); android.support.v4.app.FragmentManager fm = getSupportFragmentManager(); android.support.v4.app.Fragment frag = fm.findFragmentByTag("allFolders"); if (frag != null) { fm.beginTransaction() .remove(frag) .commitAllowingStateLoss(); } } else if (type.equals("allSavedDNAs")) { isAllSavedDnaVisisble = false; setTitle("Music DNA"); navigationView.setCheckedItem(R.id.nav_home); android.support.v4.app.FragmentManager fm = getSupportFragmentManager(); android.support.v4.app.Fragment frag = fm.findFragmentByTag("allSavedDNAs"); if (frag != null) { fm.beginTransaction() .remove(frag) .commitAllowingStateLoss(); } } else if (type.equals("viewAlbum")) { isAlbumVisible = false; android.support.v4.app.FragmentManager fm = getSupportFragmentManager(); android.support.v4.app.Fragment frag = fm.findFragmentByTag("viewAlbum"); if (frag != null) { fm.beginTransaction() .remove(frag) .commitAllowingStateLoss(); } } else if (type.equals("viewArtist")) { isArtistVisible = false; android.support.v4.app.FragmentManager fm = getSupportFragmentManager(); android.support.v4.app.Fragment frag = fm.findFragmentByTag("viewArtist"); if (frag != null) { fm.beginTransaction() .remove(frag) .commitAllowingStateLoss(); } } else if (type.equals("recent")) { isRecentVisible = false; setTitle("Music DNA"); navigationView.setCheckedItem(R.id.nav_home); android.support.v4.app.FragmentManager fm = getSupportFragmentManager(); android.support.v4.app.Fragment frag = fm.findFragmentByTag("recent"); if (frag != null) { fm.beginTransaction() .remove(frag) .commitAllowingStateLoss(); } } else if (type.equals("settings")) { isSettingsVisible = false; setTitle("Music DNA"); navigationView.setCheckedItem(R.id.nav_home); android.support.v4.app.FragmentManager fm = getSupportFragmentManager(); android.support.v4.app.Fragment frag = fm.findFragmentByTag("settings"); if (frag != null) { fm.beginTransaction() .remove(frag) .commitAllowingStateLoss(); } } else if (type.equals("About")) { isAboutVisible = false; android.support.v4.app.FragmentManager fm = getSupportFragmentManager(); android.support.v4.app.Fragment frag = fm.findFragmentByTag("About"); if (frag != null) { fm.beginTransaction() .remove(frag) .commitAllowingStateLoss(); } } else if (type.equals("Edit")) { isEditVisible = false; android.support.v4.app.FragmentManager fm = getSupportFragmentManager(); android.support.v4.app.Fragment frag = fm.findFragmentByTag("Edit"); if (frag != null) { fm.beginTransaction() .remove(frag) .commitAllowingStateLoss(); } } } public void hideAllFrags() { hideFragment("local"); hideFragment("queue"); hideFragment("stream"); hideFragment("playlist"); hideFragment("newPlaylist"); hideFragment("allPlaylists"); hideFragment("equalizer"); hideFragment("favourite"); hideFragment("folderContent"); hideFragment("allFolders"); hideFragment("allSavedDNAs"); hideFragment("viewAlbum"); hideFragment("viewArtist"); hideFragment("recent"); hideFragment("settings"); hideFragment("About"); navigationView.setCheckedItem(R.id.nav_home); setTitle("Music DNA"); } public void showNotification() { if (!isNotificationVisible) { Intent intent = new Intent(this, MediaPlayerService.class); intent.setAction(Constants.ACTION_PLAY); startService(intent); isNotificationVisible = true; } } public void HideBottomFakeToolbar() { bottomToolbar.setVisibility(View.INVISIBLE); } public static void addToFavourites(UnifiedTrack ut) { boolean isRepeat = false; for (int i = 0; i < favouriteTracks.getFavourite().size(); i++) { UnifiedTrack ut1 = favouriteTracks.getFavourite().get(i); if (ut.getType() && ut1.getType()) { if (ut.getLocalTrack().getTitle().equals(ut1.getLocalTrack().getTitle())) { isRepeat = true; break; } } else if (!ut.getType() && !ut1.getType()) { if (ut.getStreamTrack().getTitle().equals(ut1.getStreamTrack().getTitle())) { isRepeat = true; break; } } } if (!isRepeat) favouriteTracks.getFavourite().add(ut); } public class SaveData extends AsyncTask<Void, Void, Void> { @Override protected Void doInBackground(Void... params) { try { String json6 = gson.toJson(queueCurrentIndex); prefsEditor.putString("queueCurrentIndex", json6); } catch (Exception e) { } return null; } } public class SaveVersionCode extends AsyncTask<Void, Void, Void> { @Override protected Void doInBackground(Void... params) { try { String json7 = gson.toJson(versionCode); prefsEditor.putString("versionCode", json7); } catch (Exception e) { e.printStackTrace(); } return null; } } public static class SaveRecents extends AsyncTask<Void, Void, Void> { @Override protected Void doInBackground(Void... params) { if (!isSaveRecentsRunning) { isSaveRecentsRunning = true; try { String json4 = gson.toJson(recentlyPlayed); prefsEditor.putString("recentlyPlayed", json4); } catch (Exception e) { } isSaveRecentsRunning = false; } return null; } } public static class SaveFavourites extends AsyncTask<Void, Void, Void> { @Override protected Void doInBackground(Void... params) { if (!isSaveFavouritesRunning) { isSaveFavouritesRunning = true; try { String json5 = gson.toJson(favouriteTracks); prefsEditor.putString("favouriteTracks", json5); } catch (Exception e) { } isSaveFavouritesRunning = false; } return null; } } public static class SaveSettings extends AsyncTask<Void, Void, Void> { @Override protected Void doInBackground(Void... params) { if (!isSaveSettingsRunning) { isSaveSettingsRunning = true; try { String json8 = gson.toJson(settings); prefsEditor.putString("settings", json8); } catch (Exception e) { } isSaveSettingsRunning = false; } return null; } } public static class SaveTheDNAs extends AsyncTask<Void, Void, Void> { @Override protected Void doInBackground(Void... params) { if (!isSaveDNAsRunning) { isSaveDNAsRunning = true; try { String json = gson.toJson(savedDNAs); prefsEditor.putString("savedDNAs", json); } catch (Exception e) { } isSaveDNAsRunning = false; } return null; } } public static class SaveQueue extends AsyncTask<Void, Void, Void> { @Override protected Void doInBackground(Void... params) { if (!isSaveQueueRunning) { isSaveQueueRunning = true; try { String json3 = gson.toJson(queue); prefsEditor.putString("queue", json3); String json6 = gson.toJson(queueCurrentIndex); prefsEditor.putString("queueCurrentIndex", json6); } catch (Exception e) { } isSaveQueueRunning = false; } return null; } } public static class SavePlaylists extends AsyncTask<Void, Void, Void> { @Override protected Void doInBackground(Void... params) { if (!isSavePLaylistsRunning) { isSavePLaylistsRunning = true; try { String json2 = gson.toJson(allPlaylists); prefsEditor.putString("allPlaylists", json2); } catch (Exception e) { } isSavePLaylistsRunning = false; } return null; } } public static class SaveEqualizer extends AsyncTask<Void, Void, Void> { @Override protected Void doInBackground(Void... params) { if (!isSaveEqualizerRunning) { isSaveEqualizerRunning = true; try { String json2 = gson.toJson(equalizerModel); prefsEditor.putString("equalizer", json2); } catch (Exception e) { } isSaveEqualizerRunning = false; } return null; } } public void clearQueue() { QueueFragment qFrag = (QueueFragment) fragMan.findFragmentByTag("queue"); for (int i = 0; i < queue.getQueue().size(); i++) { if (i < queueCurrentIndex) { queue.getQueue().remove(i); queueCurrentIndex--; if (qFrag != null) { qFrag.notifyAdapterItemRemoved(i); } i--; } else if (i > queueCurrentIndex) { queue.getQueue().remove(i); if (qFrag != null) { qFrag.notifyAdapterItemRemoved(i); } i--; } } if (playerFragment != null && playerFragment.snappyRecyclerView != null) { playerFragment.snappyRecyclerView.getAdapter().notifyDataSetChanged(); playerFragment.snappyRecyclerView.setTransparency(); } } public void bottomSheetListener(int position, String action, String fragment, boolean type) { UnifiedTrack ut = null; if (fragment == null) { ut = new UnifiedTrack(true, finalLocalSearchResultList.get(position), null); } else if (fragment.equals("Artist")) { ut = new UnifiedTrack(true, tempArtist.getArtistSongs().get(position), null); } else if (fragment.equals("Album")) { ut = new UnifiedTrack(true, tempAlbum.getAlbumSongs().get(position), null); } else if (fragment.equals("Folder")) { ut = new UnifiedTrack(true, tempMusicFolder.getLocalTracks().get(position), null); } else if (fragment.equals("Recents")) { ut = recentlyPlayed.getRecentlyPlayed().get(position); } else if (fragment.equals("RecentHorizontalList")) { ut = continuePlayingList.get(position); } else if (fragment.equals("Stream")) { ut = new UnifiedTrack(false, null, streamingTrackList.get(position)); } if (action.equals("Add to Playlist")) { showAddToPlaylistDialog(ut); pAdapter.notifyDataSetChanged(); } if (action.equals("Add to Queue")) { queue.getQueue().add(ut); updateVisualizerRecycler(); } if (action.equals("Play")) { if (queue.getQueue().size() == 0) { queueCurrentIndex = 0; queue.getQueue().add(ut); } else if (queueCurrentIndex == queue.getQueue().size() - 1) { queueCurrentIndex++; queue.getQueue().add(ut); } else if (isReloaded) { isReloaded = false; queueCurrentIndex = queue.getQueue().size(); queue.getQueue().add(ut); } else { queue.getQueue().add(++queueCurrentIndex, ut); } streamSelected = !type; localSelected = type; queueCall = false; isReloaded = false; if (type) { localSelectedTrack = ut.getLocalTrack(); onLocalTrackSelected(position); } else { selectedTrack = ut.getStreamTrack(); onTrackSelected(position); } updateVisualizerRecycler(); } if (action.equals("Play Next")) { if (queue.getQueue().size() == 0) { queueCurrentIndex = 0; queue.getQueue().add(ut); streamSelected = !type; localSelected = type; queueCall = false; isReloaded = false; if (type) { localSelectedTrack = ut.getLocalTrack(); onLocalTrackSelected(position); } else { selectedTrack = ut.getStreamTrack(); onTrackSelected(position); } } else if (queueCurrentIndex == queue.getQueue().size() - 1) { queue.getQueue().add(ut); } else if (isReloaded) { isReloaded = false; queueCurrentIndex = queue.getQueue().size(); queue.getQueue().add(ut); streamSelected = !type; localSelected = type; queueCall = false; isReloaded = false; if (type) { localSelectedTrack = ut.getLocalTrack(); onLocalTrackSelected(position); } else { selectedTrack = ut.getStreamTrack(); onTrackSelected(position); } } else { queue.getQueue().add(queueCurrentIndex + 1, ut); } updateVisualizerRecycler(); } if (action.equals("Add to Favourites")) { addToFavourites(ut); } if (action.equals("Share")) { FileUtils.shareLocalSong(ut.getLocalTrack().getPath(), this); } if (action.equals("Edit")) { editSong = ut.getLocalTrack(); showFragment("Edit"); } } public void refreshAlbumAndArtists() { albums.clear(); finalAlbums.clear(); artists.clear(); finalArtists.clear(); for (int i = 0; i < localTrackList.size(); i++) { LocalTrack lt = localTrackList.get(i); String thisAlbum = lt.getAlbum(); int pos = checkAlbum(thisAlbum); if (pos != -1) { albums.get(pos).getAlbumSongs().add(lt); } else { List<LocalTrack> llt = new ArrayList<>(); llt.add(lt); Album ab = new Album(thisAlbum, llt); albums.add(ab); } if (pos != -1) { finalAlbums.get(pos).getAlbumSongs().add(lt); } else { List<LocalTrack> llt = new ArrayList<>(); llt.add(lt); Album ab = new Album(thisAlbum, llt); finalAlbums.add(ab); } String thisArtist = lt.getArtist(); pos = checkArtist(thisArtist); if (pos != -1) { artists.get(pos).getArtistSongs().add(lt); } else { List<LocalTrack> llt = new ArrayList<>(); llt.add(lt); Artist ab = new Artist(thisArtist, llt); artists.add(ab); } if (pos != -1) { finalArtists.get(pos).getArtistSongs().add(lt); } else { List<LocalTrack> llt = new ArrayList<>(); llt.add(lt); Artist ab = new Artist(thisArtist, llt); finalArtists.add(ab); } } System.setProperty("java.util.Arrays.useLegacyMergeSort", "true"); try { if (localTrackList.size() > 0) { Collections.sort(localTrackList, new LocalMusicComparator()); Collections.sort(finalLocalSearchResultList, new LocalMusicComparator()); } if (albums.size() > 0) { Collections.sort(albums, new AlbumComparator()); Collections.sort(finalAlbums, new AlbumComparator()); } if (artists.size() > 0) { Collections.sort(artists, new ArtistComparator()); Collections.sort(finalArtists, new ArtistComparator()); } } catch (Exception e) { e.printStackTrace(); } } public void showSleepDialog() { final Dialog dialog = new Dialog(this); dialog.requestWindowFeature(Window.FEATURE_NO_TITLE); dialog.setContentView(R.layout.sleep_timer_dialog); final WheelView wheelPicker = (WheelView) dialog.findViewById(R.id.wheelPicker); wheelPicker.setItems(minuteList); TextView title = (TextView) dialog.findViewById(R.id.sleep_dialog_title_text); if (SplashActivity.tf4 != null) title.setTypeface(SplashActivity.tf4); Button setBtn = (Button) dialog.findViewById(R.id.set_button); Button cancelBtn = (Button) dialog.findViewById(R.id.cancel_button); final Button removerBtn = (Button) dialog.findViewById(R.id.remove_timer_button); final LinearLayout buttonWrapper = (LinearLayout) dialog.findViewById(R.id.button_wrapper); final TextView timerSetText = (TextView) dialog.findViewById(R.id.timer_set_text); setBtn.setBackgroundColor(themeColor); removerBtn.setBackgroundColor(themeColor); cancelBtn.setBackgroundColor(Color.WHITE); if (isSleepTimerEnabled) { wheelPicker.setVisibility(View.GONE); buttonWrapper.setVisibility(View.GONE); removerBtn.setVisibility(View.VISIBLE); timerSetText.setVisibility(View.VISIBLE); long currentTime = System.currentTimeMillis(); long difference = currentTime - timerSetTime; int minutesLeft = (int) (timerTimeOutDuration - ((difference / 1000) / 60)); if (minutesLeft > 1) { timerSetText.setText("Timer set for " + minutesLeft + " minutes from now."); } else if (minutesLeft == 1) { timerSetText.setText("Timer set for " + 1 + " minute from now."); } else { timerSetText.setText("Music will stop after completion of current song"); } } else { wheelPicker.setVisibility(View.VISIBLE); buttonWrapper.setVisibility(View.VISIBLE); removerBtn.setVisibility(View.GONE); timerSetText.setVisibility(View.GONE); } removerBtn.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { isSleepTimerEnabled = false; isSleepTimerTimeout = false; timerTimeOutDuration = 0; timerSetTime = 0; sleepHandler.removeCallbacksAndMessages(null); Toast.makeText(ctx, "Timer removed", Toast.LENGTH_SHORT).show(); dialog.dismiss(); } }); setBtn.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { isSleepTimerEnabled = true; int minutes = Integer.parseInt(wheelPicker.getItems().get(wheelPicker.getSelectedPosition())); timerTimeOutDuration = minutes; timerSetTime = System.currentTimeMillis(); sleepHandler.postDelayed(new Runnable() { @Override public void run() { isSleepTimerTimeout = true; if (playerFragment.mMediaPlayer == null || !playerFragment.mMediaPlayer.isPlaying()) { main.runOnUiThread(new Runnable() { @Override public void run() { Toast.makeText(ctx, "Sleep timer timed out, closing app", Toast.LENGTH_SHORT).show(); if (playerFragment != null && playerFragment.timer != null) playerFragment.timer.cancel(); notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE); try { notificationManager.cancel(1); } catch (Exception e) { e.printStackTrace(); } finally { finish(); } } }); } } }, minutes * 60 * 1000); Toast.makeText(ctx, "Timer set for " + minutes + " minutes", Toast.LENGTH_SHORT).show(); dialog.dismiss(); } }); cancelBtn.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { isSleepTimerEnabled = false; isSleepTimerTimeout = false; dialog.dismiss(); } }); dialog.show(); } public void updateVisualizerRecycler() { if (playerFragment != null && playerFragment.snappyRecyclerView != null) { playerFragment.snappyRecyclerView.getAdapter().notifyDataSetChanged(); playerFragment.snappyRecyclerView.scrollToPosition(queueCurrentIndex); playerFragment.snappyRecyclerView.setTransparency(); } } public void updateAllPlaylistFragment() { AllPlaylistsFragment playListFragment = (AllPlaylistsFragment) fragMan.findFragmentByTag("allPlaylists"); if (playListFragment != null && playListFragment.allPlaylistRecycler != null) { playListFragment.allPlaylistRecycler.getAdapter().notifyDataSetChanged(); } } public void initializeHeaderImages() { imgView[0] = (ImageView) findViewById(R.id.home_header_img_1); imgView[1] = (ImageView) findViewById(R.id.home_header_img_2); imgView[2] = (ImageView) findViewById(R.id.home_header_img_3); imgView[3] = (ImageView) findViewById(R.id.home_header_img_4); imgView[4] = (ImageView) findViewById(R.id.home_header_img_5); imgView[5] = (ImageView) findViewById(R.id.home_header_img_6); imgView[6] = (ImageView) findViewById(R.id.home_header_img_7); imgView[7] = (ImageView) findViewById(R.id.home_header_img_8); imgView[8] = (ImageView) findViewById(R.id.home_header_img_9); imgView[9] = (ImageView) findViewById(R.id.home_header_img_10); } public void refreshHeaderImages() { int numSongs = localTrackList.size(); int numRecents = recentlyPlayed.getRecentlyPlayed().size(); if (numRecents == 0) { if (numSongs == 0) { for (int i = 0; i < 10; i++) { imgLoader.DisplayImage(null, imgView[i]); } } else if (numSongs < 10) { for (int i = 0; i < numSongs; i++) { imgLoader.DisplayImage(localTrackList.get(i).getPath(), imgView[i]); } for (int i = numSongs; i < 10; i++) { imgLoader.DisplayImage(null, imgView[i]); } } else { for (int i = 0; i < 10; i++) { imgLoader.DisplayImage(localTrackList.get(i).getPath(), imgView[i]); } } } else if (numRecents < 10) { UnifiedTrack ut; for (int i = 0; i < numRecents; i++) { ut = recentlyPlayed.getRecentlyPlayed().get(i); if (ut.getType()) imgLoader.DisplayImage(ut.getLocalTrack().getPath(), imgView[i]); else imgLoader.DisplayImage(ut.getStreamTrack().getArtworkURL(), imgView[i]); } for (int i = numRecents; i < Math.min(numRecents + numSongs, 10); i++) { imgLoader.DisplayImage(localTrackList.get(i - numRecents).getPath(), imgView[i]); } if (numRecents + numSongs < 10) { for (int i = numRecents + numSongs; i < 10; i++) { imgLoader.DisplayImage(null, imgView[i]); } } } else { UnifiedTrack ut; for (int i = 0; i < 10; i++) { ut = recentlyPlayed.getRecentlyPlayed().get(i); if (ut.getType()) imgLoader.DisplayImage(ut.getLocalTrack().getPath(), imgView[i]); else imgLoader.DisplayImage(ut.getStreamTrack().getArtworkURL(), imgView[i]); } } } }