/* * Copyright (C) 2015 Naman Dwivedi * * Licensed under the GNU General Public License v3 * * This is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or (at your option) any later version. * * This software is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * See the GNU General Public License for more details. */ package com.naman14.timber.activities; import android.Manifest; import android.content.Intent; import android.os.Bundle; import android.os.Handler; import android.preference.PreferenceManager; import android.support.design.widget.NavigationView; import android.support.design.widget.Snackbar; import android.support.v4.app.Fragment; import android.support.v4.app.FragmentManager; import android.support.v4.app.FragmentTransaction; import android.support.v4.view.GravityCompat; import android.support.v4.widget.DrawerLayout; import android.view.Menu; import android.view.MenuItem; import android.view.View; import android.widget.ImageView; import android.widget.TextView; import com.afollestad.appthemeengine.customizers.ATEActivityThemeCustomizer; import com.anjlab.android.iab.v3.BillingProcessor; import com.naman14.timber.MusicPlayer; import com.naman14.timber.R; import com.naman14.timber.fragments.AlbumDetailFragment; import com.naman14.timber.fragments.ArtistDetailFragment; import com.naman14.timber.fragments.FoldersFragment; import com.naman14.timber.fragments.MainFragment; import com.naman14.timber.fragments.PlaylistFragment; import com.naman14.timber.fragments.QueueFragment; import com.naman14.timber.permissions.Nammu; import com.naman14.timber.permissions.PermissionCallback; import com.naman14.timber.slidinguppanel.SlidingUpPanelLayout; import com.naman14.timber.utils.Constants; import com.naman14.timber.utils.Helpers; import com.naman14.timber.utils.NavigationUtils; import com.naman14.timber.utils.TimberUtils; import com.nostra13.universalimageloader.core.DisplayImageOptions; import com.nostra13.universalimageloader.core.ImageLoader; import java.util.HashMap; import java.util.Map; public class MainActivity extends BaseActivity implements ATEActivityThemeCustomizer { private static MainActivity sMainActivity; SlidingUpPanelLayout panelLayout; NavigationView navigationView; TextView songtitle, songartist; ImageView albumart; String action; Map<String, Runnable> navigationMap = new HashMap<String, Runnable>(); Handler navDrawerRunnable = new Handler(); Runnable runnable; Runnable navigateLibrary = new Runnable() { public void run() { navigationView.getMenu().findItem(R.id.nav_library).setChecked(true); Fragment fragment = new MainFragment(); FragmentTransaction transaction = getSupportFragmentManager().beginTransaction(); transaction.replace(R.id.fragment_container, fragment).commitAllowingStateLoss(); } }; Runnable navigateNowplaying = new Runnable() { public void run() { navigateLibrary.run(); startActivity(new Intent(MainActivity.this, NowPlayingActivity.class)); } }; final PermissionCallback permissionReadstorageCallback = new PermissionCallback() { @Override public void permissionGranted() { loadEverything(); } @Override public void permissionRefused() { finish(); } }; Runnable navigatePlaylist = new Runnable() { public void run() { navigationView.getMenu().findItem(R.id.nav_playlists).setChecked(true); Fragment fragment = new PlaylistFragment(); FragmentTransaction transaction = getSupportFragmentManager().beginTransaction(); transaction.hide(getSupportFragmentManager().findFragmentById(R.id.fragment_container)); transaction.replace(R.id.fragment_container, fragment).commit(); } }; Runnable navigateFolder = new Runnable() { public void run() { navigationView.getMenu().findItem(R.id.nav_folders).setChecked(true); Fragment fragment = new FoldersFragment(); FragmentTransaction transaction = getSupportFragmentManager().beginTransaction(); transaction.hide(getSupportFragmentManager().findFragmentById(R.id.fragment_container)); transaction.replace(R.id.fragment_container, fragment).commit(); } }; Runnable navigateQueue = new Runnable() { public void run() { navigationView.getMenu().findItem(R.id.nav_queue).setChecked(true); Fragment fragment = new QueueFragment(); FragmentTransaction transaction = getSupportFragmentManager().beginTransaction(); transaction.hide(getSupportFragmentManager().findFragmentById(R.id.fragment_container)); transaction.replace(R.id.fragment_container, fragment).commit(); } }; Runnable navigateAlbum = new Runnable() { public void run() { long albumID = getIntent().getExtras().getLong(Constants.ALBUM_ID); Fragment fragment = AlbumDetailFragment.newInstance(albumID, false, null); FragmentManager fragmentManager = getSupportFragmentManager(); fragmentManager.beginTransaction() .replace(R.id.fragment_container, fragment).commit(); } }; Runnable navigateArtist = new Runnable() { public void run() { long artistID = getIntent().getExtras().getLong(Constants.ARTIST_ID); Fragment fragment = ArtistDetailFragment.newInstance(artistID, false, null); FragmentManager fragmentManager = getSupportFragmentManager(); fragmentManager.beginTransaction() .replace(R.id.fragment_container, fragment).commit(); } }; private DrawerLayout mDrawerLayout; private boolean isDarkTheme; public static MainActivity getInstance() { return sMainActivity; } @Override public void onCreate(Bundle savedInstanceState) { sMainActivity = this; action = getIntent().getAction(); isDarkTheme = PreferenceManager.getDefaultSharedPreferences(this).getBoolean("dark_theme", false); super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); navigationMap.put(Constants.NAVIGATE_LIBRARY, navigateLibrary); navigationMap.put(Constants.NAVIGATE_PLAYLIST, navigatePlaylist); navigationMap.put(Constants.NAVIGATE_QUEUE, navigateQueue); navigationMap.put(Constants.NAVIGATE_NOWPLAYING, navigateNowplaying); navigationMap.put(Constants.NAVIGATE_ALBUM, navigateAlbum); navigationMap.put(Constants.NAVIGATE_ARTIST, navigateArtist); mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout); panelLayout = (SlidingUpPanelLayout) findViewById(R.id.sliding_layout); navigationView = (NavigationView) findViewById(R.id.nav_view); View header = navigationView.inflateHeaderView(R.layout.nav_header); albumart = (ImageView) header.findViewById(R.id.album_art); songtitle = (TextView) header.findViewById(R.id.song_title); songartist = (TextView) header.findViewById(R.id.song_artist); setPanelSlideListeners(panelLayout); navDrawerRunnable.postDelayed(new Runnable() { @Override public void run() { setupDrawerContent(navigationView); setupNavigationIcons(navigationView); } }, 700); if (TimberUtils.isMarshmallow()) { checkPermissionAndThenLoad(); } else { loadEverything(); } addBackstackListener(); if(Intent.ACTION_VIEW.equals(action)) { Handler handler = new Handler(); handler.postDelayed(new Runnable() { @Override public void run() { MusicPlayer.clearQueue(); MusicPlayer.openFile(getIntent().getData().getPath()); MusicPlayer.playOrPause(); navigateNowplaying.run(); } }, 350); } } private void loadEverything() { Runnable navigation = navigationMap.get(action); if (navigation != null) { navigation.run(); } else { navigateLibrary.run(); } new initQuickControls().execute(""); } private void checkPermissionAndThenLoad() { //check for permission if (Nammu.checkPermission(Manifest.permission.READ_EXTERNAL_STORAGE)) { loadEverything(); } else { if (Nammu.shouldShowRequestPermissionRationale(this, Manifest.permission.READ_EXTERNAL_STORAGE)) { Snackbar.make(panelLayout, "Timber will need to read external storage to display songs on your device.", Snackbar.LENGTH_INDEFINITE) .setAction("OK", new View.OnClickListener() { @Override public void onClick(View view) { Nammu.askForPermission(MainActivity.this, Manifest.permission.READ_EXTERNAL_STORAGE, permissionReadstorageCallback); } }).show(); } else { Nammu.askForPermission(this, Manifest.permission.READ_EXTERNAL_STORAGE, permissionReadstorageCallback); } } } @Override public boolean onCreateOptionsMenu(Menu menu) { super.onCreateOptionsMenu(menu); return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case android.R.id.home: { if (isNavigatingMain()) { mDrawerLayout.openDrawer(GravityCompat.START); } else super.onBackPressed(); return true; } } return super.onOptionsItemSelected(item); } @Override public void onBackPressed() { if (panelLayout.isPanelExpanded()) { panelLayout.collapsePanel(); } else if (mDrawerLayout.isDrawerOpen(GravityCompat.START)) { mDrawerLayout.closeDrawer(GravityCompat.START); } else { super.onBackPressed(); } } private void setupDrawerContent(NavigationView navigationView) { navigationView.setNavigationItemSelectedListener( new NavigationView.OnNavigationItemSelectedListener() { @Override public boolean onNavigationItemSelected(final MenuItem menuItem) { updatePosition(menuItem); return true; } }); } private void setupNavigationIcons(NavigationView navigationView) { //material-icon-lib currently doesn't work with navigationview of design support library 22.2.0+ //set icons manually for now //https://github.com/code-mc/material-icon-lib/issues/15 if (!isDarkTheme) { navigationView.getMenu().findItem(R.id.nav_library).setIcon(R.drawable.library_music); navigationView.getMenu().findItem(R.id.nav_playlists).setIcon(R.drawable.playlist_play); navigationView.getMenu().findItem(R.id.nav_queue).setIcon(R.drawable.music_note); navigationView.getMenu().findItem(R.id.nav_folders).setIcon(R.drawable.ic_folder_open_black_24dp); navigationView.getMenu().findItem(R.id.nav_nowplaying).setIcon(R.drawable.bookmark_music); navigationView.getMenu().findItem(R.id.nav_settings).setIcon(R.drawable.settings); navigationView.getMenu().findItem(R.id.nav_about).setIcon(R.drawable.information); navigationView.getMenu().findItem(R.id.nav_donate).setIcon(R.drawable.payment_black); } else { navigationView.getMenu().findItem(R.id.nav_library).setIcon(R.drawable.library_music_white); navigationView.getMenu().findItem(R.id.nav_playlists).setIcon(R.drawable.playlist_play_white); navigationView.getMenu().findItem(R.id.nav_queue).setIcon(R.drawable.music_note_white); navigationView.getMenu().findItem(R.id.nav_folders).setIcon(R.drawable.ic_folder_open_white_24dp); navigationView.getMenu().findItem(R.id.nav_nowplaying).setIcon(R.drawable.bookmark_music_white); navigationView.getMenu().findItem(R.id.nav_settings).setIcon(R.drawable.settings_white); navigationView.getMenu().findItem(R.id.nav_about).setIcon(R.drawable.information_white); navigationView.getMenu().findItem(R.id.nav_donate).setIcon(R.drawable.payment_white); } try { if (!BillingProcessor.isIabServiceAvailable(this)) { navigationView.getMenu().removeItem(R.id.nav_donate); } } catch (Exception e) { e.printStackTrace(); } } private void updatePosition(final MenuItem menuItem) { runnable = null; switch (menuItem.getItemId()) { case R.id.nav_library: runnable = navigateLibrary; break; case R.id.nav_playlists: runnable = navigatePlaylist; break; case R.id.nav_folders: runnable = navigateFolder; break; case R.id.nav_nowplaying: NavigationUtils.navigateToNowplaying(MainActivity.this, false); break; case R.id.nav_queue: runnable = navigateQueue; break; case R.id.nav_settings: NavigationUtils.navigateToSettings(MainActivity.this); break; case R.id.nav_about: mDrawerLayout.closeDrawers(); Handler handler = new Handler(); handler.postDelayed(new Runnable() { @Override public void run() { Helpers.showAbout(MainActivity.this); } }, 350); break; case R.id.nav_donate: startActivity(new Intent(MainActivity.this, DonateActivity.class)); break; } if (runnable != null) { menuItem.setChecked(true); mDrawerLayout.closeDrawers(); Handler handler = new Handler(); handler.postDelayed(new Runnable() { @Override public void run() { runnable.run(); } }, 350); } } public void setDetailsToHeader() { String name = MusicPlayer.getTrackName(); String artist = MusicPlayer.getArtistName(); if (name != null && artist != null) { songtitle.setText(name); songartist.setText(artist); } ImageLoader.getInstance().displayImage(TimberUtils.getAlbumArtUri(MusicPlayer.getCurrentAlbumId()).toString(), albumart, new DisplayImageOptions.Builder().cacheInMemory(true) .showImageOnFail(R.drawable.ic_empty_music2) .resetViewBeforeLoading(true) .build()); } @Override public void onMetaChanged() { super.onMetaChanged(); setDetailsToHeader(); } @Override public void onResume() { super.onResume(); sMainActivity = this; } @Override public void onRequestPermissionsResult( int requestCode, String[] permissions, int[] grantResults) { Nammu.onRequestPermissionsResult(requestCode, permissions, grantResults); } private boolean isNavigatingMain() { Fragment currentFragment = getSupportFragmentManager().findFragmentById(R.id.fragment_container); return (currentFragment instanceof MainFragment || currentFragment instanceof QueueFragment || currentFragment instanceof PlaylistFragment || currentFragment instanceof FoldersFragment); } private void addBackstackListener() { getSupportFragmentManager().addOnBackStackChangedListener(new FragmentManager.OnBackStackChangedListener() { @Override public void onBackStackChanged() { getSupportFragmentManager().findFragmentById(R.id.fragment_container).onResume(); } }); } @Override public int getActivityTheme() { return isDarkTheme ? R.style.AppThemeNormalDark : R.style.AppThemeNormalLight; } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); getSupportFragmentManager().findFragmentById(R.id.fragment_container).onActivityResult(requestCode, resultCode, data); } }