package io.hefuyi.listener.ui.activity; import android.Manifest; import android.content.Intent; import android.graphics.PorterDuff; import android.graphics.drawable.Drawable; import android.os.Bundle; import android.os.Handler; 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.text.TextUtils; 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.bumptech.glide.Glide; import com.sothree.slidinguppanel.SlidingUpPanelLayout; import java.util.HashMap; import java.util.Map; import butterknife.BindView; import butterknife.ButterKnife; import io.hefuyi.listener.Constants; import io.hefuyi.listener.MusicPlayer; import io.hefuyi.listener.R; import io.hefuyi.listener.RxBus; import io.hefuyi.listener.event.MetaChangedEvent; import io.hefuyi.listener.listener.PanelSlideListener; import io.hefuyi.listener.permission.PermissionCallback; import io.hefuyi.listener.permission.PermissionManager; import io.hefuyi.listener.ui.fragment.AlbumDetailFragment; import io.hefuyi.listener.ui.fragment.ArtistDetailFragment; import io.hefuyi.listener.ui.fragment.FoldersFragment; import io.hefuyi.listener.ui.fragment.MainFragment; import io.hefuyi.listener.ui.fragment.PlayRankingFragment; import io.hefuyi.listener.ui.fragment.PlaylistFragment; import io.hefuyi.listener.ui.fragment.SearchFragment; import io.hefuyi.listener.util.ATEUtil; import io.hefuyi.listener.util.ListenerUtil; import rx.Subscription; import rx.android.schedulers.AndroidSchedulers; import rx.functions.Action1; import rx.schedulers.Schedulers; public class MainActivity extends BaseActivity implements ATEActivityThemeCustomizer { @BindView(R.id.sliding_layout) SlidingUpPanelLayout panelLayout; @BindView(R.id.nav_view) NavigationView navigationView; @BindView(R.id.drawer_layout) DrawerLayout mDrawerLayout; private TextView songtitle; private TextView songartist; private ImageView albumart; private String action; private Map<String, Runnable> navigationMap = new HashMap<String, Runnable>(); private Handler navDrawerRunnable = new Handler(); private Runnable runnable; private PanelSlideListener mPanelSlideListener; private boolean listenerSeted = false; private boolean isDarkTheme; private final PermissionCallback permissionReadstorageCallback = new PermissionCallback() { @Override public void permissionGranted() { loadEverything(); } @Override public void permissionRefused() { finish(); } }; private Runnable navigateLibrary = new Runnable() { public void run() { navigationView.getMenu().findItem(R.id.nav_library).setChecked(true); Fragment fragment = MainFragment.newInstance(Constants.NAVIGATE_ALLSONG); FragmentTransaction transaction = getSupportFragmentManager().beginTransaction(); transaction.replace(R.id.fragment_container, fragment).commitAllowingStateLoss(); } }; private 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(); } }; private Runnable navigateFavourate = new Runnable() { public void run() { navigationView.getMenu().findItem(R.id.nav_favourate).setChecked(true); Fragment fragment = MainFragment.newInstance(Constants.NAVIGATE_PLAYLIST_FAVOURATE); FragmentTransaction transaction = getSupportFragmentManager().beginTransaction(); transaction.replace(R.id.fragment_container, fragment).commit(); } }; private Runnable navigateFolders = 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(); } }; private Runnable navigateRecentPlay = new Runnable() { public void run() { navigationView.getMenu().findItem(R.id.nav_recent_play).setChecked(true); Fragment fragment = MainFragment.newInstance(Constants.NAVIGATE_PLAYLIST_RECENTPLAY); FragmentTransaction transaction = getSupportFragmentManager().beginTransaction(); transaction.replace(R.id.fragment_container, fragment).commit(); } }; private Runnable navigateRecentAdd = new Runnable() { public void run() { navigationView.getMenu().findItem(R.id.nav_recent_add).setChecked(true); Fragment fragment = MainFragment.newInstance(Constants.NAVIGATE_PLAYLIST_RECENTADD); FragmentTransaction transaction = getSupportFragmentManager().beginTransaction(); transaction.replace(R.id.fragment_container, fragment).commit(); } }; private Runnable navigatePlayRanking = new Runnable() { public void run() { navigationView.getMenu().findItem(R.id.nav_play_ranking).setChecked(true); Fragment fragment = new PlayRankingFragment(); FragmentTransaction transaction = getSupportFragmentManager().beginTransaction(); transaction.replace(R.id.fragment_container, fragment).commit(); } }; private Runnable navigateSearch = new Runnable() { public void run() { Fragment fragment = new SearchFragment(); FragmentTransaction transaction = getSupportFragmentManager().beginTransaction(); transaction.hide(getSupportFragmentManager().findFragmentById(R.id.fragment_container)); transaction.add(R.id.fragment_container, fragment); transaction.addToBackStack(null).commit(); } }; private Runnable navigateSetting = new Runnable() { public void run() { final Intent intent = new Intent(MainActivity.this, SettingActivity.class); MainActivity.this.startActivity(intent); } }; private Runnable navigateAlbum = new Runnable() { public void run() { long albumID = getIntent().getExtras().getLong(Constants.ALBUM_ID); String albumName = getIntent().getExtras().getString(Constants.ALBUM_NAME); Fragment fragment = AlbumDetailFragment.newInstance(albumID, albumName, false, null); FragmentManager fragmentManager = getSupportFragmentManager(); fragmentManager.beginTransaction() .replace(R.id.fragment_container, fragment).commit(); } }; private Runnable navigateArtist = new Runnable() { public void run() { long artistID = getIntent().getExtras().getLong(Constants.ARTIST_ID); String artistName = getIntent().getExtras().getString(Constants.ARTIST_NAME); Fragment fragment = ArtistDetailFragment.newInstance(artistID, artistName, false, null); FragmentManager fragmentManager = getSupportFragmentManager(); fragmentManager.beginTransaction() .replace(R.id.fragment_container, fragment).commit(); } }; @Override public void onCreate(Bundle savedInstanceState) { action = getIntent().getAction(); isDarkTheme = ATEUtil.getATEKey(this).equals("dark_theme"); super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); ButterKnife.bind(this); navigationMap.put(Constants.NAVIGATE_LIBRARY, navigateLibrary); navigationMap.put(Constants.NAVIGATE_ALBUM, navigateAlbum); navigationMap.put(Constants.NAVIGATE_ARTIST, navigateArtist); 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); navDrawerRunnable.postDelayed(new Runnable() { @Override public void run() { setupDrawerContent(navigationView); setupNavigationIcons(navigationView); } }, 700); if (ListenerUtil.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(); } }, 350); } subscribeMetaChangedEvent(); } @Override protected void onDestroy() { super.onDestroy(); RxBus.getInstance().unSubscribe(this); if (mPanelSlideListener != null) { RxBus.getInstance().unSubscribe(mPanelSlideListener); } } 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 (PermissionManager.checkPermission(Manifest.permission.READ_EXTERNAL_STORAGE)) { loadEverything(); } else { if (PermissionManager.shouldShowRequestPermissionRationale(this, Manifest.permission.READ_EXTERNAL_STORAGE)) { Snackbar.make(panelLayout, "Listener will need to read external storage to display songs on your device.", Snackbar.LENGTH_INDEFINITE) .setAction(android.R.string.ok, new View.OnClickListener() { @Override public void onClick(View view) { PermissionManager.askForPermission(MainActivity.this, Manifest.permission.READ_EXTERNAL_STORAGE, permissionReadstorageCallback); } }).show(); } else { PermissionManager.askForPermission(this, Manifest.permission.READ_EXTERNAL_STORAGE, permissionReadstorageCallback); } } } /** * 监听menu点击 * @param navigationView */ private void setupDrawerContent(NavigationView navigationView) { navigationView.setNavigationItemSelectedListener( new NavigationView.OnNavigationItemSelectedListener() { @Override public boolean onNavigationItemSelected(final MenuItem menuItem) { updatePosition(menuItem); return true; } }); } /** * 设置图标 * @param navigationView */ 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.ic_music_note_black_48dp); navigationView.getMenu().findItem(R.id.nav_playlists).setIcon(R.drawable.ic_queue_music_black_48dp); navigationView.getMenu().findItem(R.id.nav_folders).setIcon(R.drawable.ic_folder_black_48dp); navigationView.getMenu().findItem(R.id.nav_favourate).setIcon(R.drawable.ic_favorite_black_48dp); navigationView.getMenu().findItem(R.id.nav_recent_play).setIcon(R.drawable.ic_watch_later_black_48dp); navigationView.getMenu().findItem(R.id.nav_recent_add).setIcon(R.drawable.ic_add_box_black_48dp); navigationView.getMenu().findItem(R.id.nav_play_ranking).setIcon(R.drawable.ic_sort_black_48dp); navigationView.getMenu().findItem(R.id.nav_settings).setIcon(R.drawable.ic_settings_black_48dp); navigationView.getMenu().findItem(R.id.nav_exit).setIcon(R.drawable.ic_exit_to_app_black_48dp); } else { navigationView.getMenu().findItem(R.id.nav_library).setIcon(R.drawable.ic_music_note_white_48dp); navigationView.getMenu().findItem(R.id.nav_playlists).setIcon(R.drawable.ic_queue_music_white_48dp); navigationView.getMenu().findItem(R.id.nav_folders).setIcon(R.drawable.ic_folder_white_48dp); navigationView.getMenu().findItem(R.id.nav_favourate).setIcon(R.drawable.ic_favorite_white_48dp); navigationView.getMenu().findItem(R.id.nav_recent_play).setIcon(R.drawable.ic_watch_later_white_48dp); navigationView.getMenu().findItem(R.id.nav_recent_add).setIcon(R.drawable.ic_add_box_white_48dp); navigationView.getMenu().findItem(R.id.nav_play_ranking).setIcon(R.drawable.ic_sort_white_48dp); navigationView.getMenu().findItem(R.id.nav_settings).setIcon(R.drawable.ic_settings_white_48dp); navigationView.getMenu().findItem(R.id.nav_exit).setIcon(R.drawable.ic_exit_to_app_white_48dp); } } /** * 导航 * @param menuItem */ 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 = navigateFolders; break; case R.id.nav_favourate: runnable = navigateFavourate; break; case R.id.nav_recent_play: runnable = navigateRecentPlay; break; case R.id.nav_recent_add: runnable = navigateRecentAdd; break; case R.id.nav_play_ranking: runnable = navigatePlayRanking; break; case R.id.nav_settings: runnable = navigateSetting; break; case R.id.nav_exit: this.finish(); break; } if (runnable != null) { mDrawerLayout.closeDrawers(); Handler handler = new Handler(); handler.postDelayed(new Runnable() { @Override public void run() { runnable.run(); } }, 350); } } /** * 设置导航栏header部分信息 */ private void setDetailsToHeader() { String name = MusicPlayer.getTrackName(); String artist = MusicPlayer.getArtistName(); if (TextUtils.isEmpty(name) || TextUtils.isEmpty(artist)) { songtitle.setText(R.string.app_name); songartist.setText(""); Drawable defaultHeader = getResources().getDrawable(R.drawable.icon_drawer_theme_bg); defaultHeader.setColorFilter(ATEUtil.getThemePrimaryColor(this), PorterDuff.Mode.DARKEN); albumart.setImageDrawable(defaultHeader); return; } songtitle.setText(name); songartist.setText(artist); Drawable defaultHeader = getResources().getDrawable(R.drawable.icon_drawer_theme_bg); defaultHeader.setColorFilter(ATEUtil.getThemePrimaryColor(this), PorterDuff.Mode.DARKEN); Glide.with(this).load(ListenerUtil.getAlbumArtUri(MusicPlayer.getCurrentAlbumId()).toString()) .error(defaultHeader) .centerCrop() .into(albumart); } private boolean isNavigatingMain() { Fragment currentFragment = getSupportFragmentManager().findFragmentById(R.id.fragment_container); return (currentFragment instanceof MainFragment || currentFragment instanceof PlaylistFragment || currentFragment instanceof PlayRankingFragment|| currentFragment instanceof FoldersFragment); } private void addBackstackListener() { getSupportFragmentManager().addOnBackStackChangedListener(new FragmentManager.OnBackStackChangedListener() { @Override public void onBackStackChanged() { getSupportFragmentManager().findFragmentById(R.id.fragment_container).onResume(); } }); } @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 (panelLayout.getPanelState() == SlidingUpPanelLayout.PanelState.EXPANDED){ panelLayout.setPanelState(SlidingUpPanelLayout.PanelState.COLLAPSED); }else if(isNavigatingMain()) { mDrawerLayout.openDrawer(GravityCompat.START); } else super.onBackPressed(); return true; } case R.id.action_search: navigateSearch.run(); return true; } return super.onOptionsItemSelected(item); } @Override public void onBackPressed() { if (panelLayout.getPanelState() == SlidingUpPanelLayout.PanelState.EXPANDED) { panelLayout.setPanelState(SlidingUpPanelLayout.PanelState.COLLAPSED); } else { super.onBackPressed(); } } @Override public void onWindowFocusChanged(boolean hasFocus) { super.onWindowFocusChanged(hasFocus); if (!listenerSeted && panelLayout.findViewById(R.id.topContainer) != null) { mPanelSlideListener = new PanelSlideListener(panelLayout); panelLayout.addPanelSlideListener(mPanelSlideListener); listenerSeted = true; } } private void subscribeMetaChangedEvent() { Subscription subscription = RxBus.getInstance() .toObservable(MetaChangedEvent.class) .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .distinctUntilChanged() .subscribe(new Action1<MetaChangedEvent>() { @Override public void call(MetaChangedEvent event) { setDetailsToHeader(); } }, new Action1<Throwable>() { @Override public void call(Throwable throwable) { } }); RxBus.getInstance().addSubscription(this, subscription); } @Override public void onRequestPermissionsResult( int requestCode, String[] permissions, int[] grantResults) { PermissionManager.onRequestPermissionsResult(requestCode, permissions, grantResults); } @Override public int getActivityTheme() { return isDarkTheme ? R.style.AppThemeDark : R.style.AppThemeLight; } }