/* * Copyright 2016 Substance Mobile * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.animbus.music.ui.activity.mainScreen; import android.Manifest; import android.animation.Animator; import android.annotation.SuppressLint; import android.content.Intent; import android.content.pm.PackageManager; import android.content.res.Configuration; import android.graphics.Color; import android.preference.PreferenceManager; import android.support.design.widget.NavigationView; import android.support.design.widget.TabLayout; import android.support.v4.app.ActivityCompat; import android.support.v4.app.ActivityOptionsCompat; import android.support.v4.app.AppLaunchChecker; import android.support.v4.content.ContextCompat; import android.support.v4.media.session.PlaybackStateCompat; import android.support.v4.util.Pair; import android.support.v4.view.GravityCompat; import android.support.v4.view.PagerAdapter; import android.support.v4.view.animation.FastOutSlowInInterpolator; import android.support.v4.widget.DrawerLayout; import android.support.v7.widget.GridLayoutManager; import android.support.v7.widget.LinearLayoutManager; import android.support.v7.widget.RecyclerView; import android.view.Gravity; import android.view.MenuItem; import android.view.View; import android.view.ViewGroup; import android.widget.ImageButton; import android.widget.ImageView; import android.widget.TextView; import com.afollestad.appthemeengine.ATE; import com.afollestad.appthemeengine.util.ATEUtil; import com.animbus.music.BuildConfig; import com.animbus.music.R; import com.animbus.music.media.Library; import com.animbus.music.media.PlaybackRemote; import com.animbus.music.media.objects.Album; import com.animbus.music.media.objects.Artist; import com.animbus.music.media.objects.Playlist; import com.animbus.music.media.objects.Song; import com.animbus.music.ui.activity.issue.IssueReportingActivity; import com.animbus.music.ui.activity.nowPlaying.NowPlaying; import com.animbus.music.ui.activity.search.SearchActivity; import com.animbus.music.ui.activity.settings.Settings; import com.animbus.music.ui.activity.setup.SetupActivity; import com.animbus.music.ui.custom.activity.ThemeActivity; import com.animbus.music.ui.custom.view.LockableViewPager; import com.animbus.music.ui.list.ListAdapter; import com.animbus.music.util.GEMUtil; import com.animbus.music.util.Options; import com.pluscubed.recyclerfastscroll.RecyclerFastScroller; import com.pluscubed.recyclerfastscroll.RecyclerFastScrollerUtils; import butterknife.Bind; import butterknife.BindString; public class MainScreen extends ThemeActivity implements NavigationView.OnNavigationItemSelectedListener { @Bind(R.id.drawer_layout) DrawerLayout mDrawerLayout; @Bind(R.id.main_tab_layout) TabLayout mTabs; @Bind(R.id.main_view_pager) LockableViewPager mPager; @Bind(R.id.navigation) NavigationView mNavigationView; @Bind(R.id.main_screen_now_playing_toolbar) View quickToolbar; @BindString(R.string.title_activity_main) String mScreenName; private static final int RESET_AT = 16; @Override protected int getLayout() { return R.layout.activity_main; } @Override protected void setUp() { //noinspection ConstantConditions, PointlessBooleanExpression; if ((BuildConfig.VERSION_CODE == RESET_AT || BuildConfig.BUILD_TYPE.equals("debug")) && !PreferenceManager.getDefaultSharedPreferences(this).getBoolean("did_reset", false)) { Options.resetPrefs(); Options.restartApp(); } //Play a song if the intent wants it to if (getIntent().getAction() != null && getIntent().getAction().equals(Intent.ACTION_VIEW)) PlaybackRemote.play(getIntent().getData()); //The rest of the UI setUpNavigation(); mPager.setAdapter(new RecyclerPagerAdapter()); mPager.setOffscreenPageLimit(3); switchToArtists(); setTitle(mScreenName); setUpNowPlayingBar(null, null); requestPermissions(); } /////////////////////////////////////////////////////////////////////////// // Permissions /////////////////////////////////////////////////////////////////////////// @SuppressLint("NewApi") public void requestPermissions() { if (GEMUtil.isMarshmallow() && (checkSelfPermission(Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED)) startActivityForResult(new Intent(this, SetupActivity.class), 1); else { if (AppLaunchChecker.hasStartedFromLauncher(this)) startActivity(new Intent(this, SetupActivity.class)); Library.build(); } } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { if (requestCode == 1) recreate(); } /////////////////////////////////////////////////////////////////////////// // Configuration and setup /////////////////////////////////////////////////////////////////////////// @Override protected void onResume() { super.onResume(); setUpDrawerHeader(PlaybackRemote.getCurrentSong()); Library.registerMediaStoreListeners(); } @Override protected void onPause() { super.onPause(); Library.unregisterMediaStoreListeners(); } private void setUpDrawerHeader(Song song) { if (song != null) { View header = mNavigationView.getHeaderView(0); if (header != null) { song.getAlbum().requestArt((ImageView) header.findViewById(R.id.navdrawer_header_image)); header.findViewById(R.id.navdrawer_header_clickable).setBackground(ContextCompat.getDrawable(this, !ATEUtil.isColorLight(song.getAlbum().getBackgroundColor()) ? R.drawable.ripple_dark : R.drawable.ripple_light)); } } if (PlaybackRemote.isActive() && mNavigationView.getHeaderCount() == 0) mNavigationView.inflateHeaderView(R.layout.drawer_header); else mNavigationView.removeHeaderView(mNavigationView.getHeaderView(0)); } private void setUpNavigation() { /////////////////////// // Navigation Drawer // /////////////////////// mNavigationView.setNavigationItemSelectedListener(this); PlaybackRemote.registerStateListener(new PlaybackRemote.StateChangedListener() { @Override public void onStateChanged(PlaybackStateCompat newState) { setUpDrawerHeader(null); } }); PlaybackRemote.registerSongListener(new PlaybackRemote.SongChangedListener() { @Override public void onSongChanged(Song newSong) { setUpDrawerHeader(newSong); } }); if (GEMUtil.isLollipop()) { getWindow().setStatusBarColor(Color.TRANSPARENT); getWindow().setNavigationBarColor(Color.RED); } mDrawerLayout.setStatusBarBackgroundColor(getPrimaryDarkColor()); ////////// // Tabs // ////////// if (!Options.usingTabs()) { mPager.lock(); mTabs.setVisibility(View.GONE); return; } //Makes tabs scrollable or fixed based on setting mTabs.setTabMode(Options.usingScrollableTabs() ? TabLayout.MODE_SCROLLABLE : TabLayout.MODE_FIXED); if (!Options.usingScrollableTabs()) mTabs.setPadding(0, 0, 0, 0); //Configures and adds tabs TabLayout.Tab songsTab, albumsTab, playlistsTab, artistsTab; if (!Options.usingIconTabs()) { songsTab = mTabs.newTab().setText(R.string.page_songs); albumsTab = mTabs.newTab().setText(R.string.page_albums); artistsTab = mTabs.newTab().setText(R.string.page_artists); playlistsTab = mTabs.newTab().setText(R.string.page_playlists); } else { songsTab = mTabs.newTab().setIcon(R.drawable.ic_audiotrack_24dp); albumsTab = mTabs.newTab().setIcon(R.drawable.ic_album_24dp); artistsTab = mTabs.newTab().setIcon(R.drawable.ic_artist_24dp); playlistsTab = mTabs.newTab().setIcon(R.drawable.ic_queue_music_black_24dp); } mTabs.addTab(songsTab); mTabs.addTab(albumsTab); mTabs.addTab(artistsTab); mTabs.addTab(playlistsTab); //Allows the tabs to sync to the view pager mTabs.setOnTabSelectedListener(new TabLayout.ViewPagerOnTabSelectedListener(mPager)); mPager.addOnPageChangeListener(new TabLayout.TabLayoutOnPageChangeListener(mTabs)); } private void setUpNowPlayingBar(Song song, PlaybackStateCompat state) { //noinspection StatementWithEmptyBody if (!PlaybackRemote.isActive()) { /*quickToolbar.setVisibility(View.GONE);*/ //TODO: Add This } else { setUpNowPlayingBar(PlaybackRemote.getCurrentSong(), PlaybackRemote.getState()); } PlaybackRemote.registerSongListener(new PlaybackRemote.SongChangedListener() { @Override public void onSongChanged(Song newSong) { setUpNowPlayingBar(newSong, null); } }); PlaybackRemote.registerStateListener(new PlaybackRemote.StateChangedListener() { @Override public void onStateChanged(PlaybackStateCompat newState) { setUpNowPlayingBar(null, newState); } }); quickToolbar.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { @SuppressWarnings("unchecked") ActivityOptionsCompat options = ActivityOptionsCompat.makeSceneTransitionAnimation(MainScreen.this, new Pair<>(v.findViewById(R.id.main_screen_now_playing_toolbar_art), "art"), new Pair<>(v.findViewById(R.id.main_screen_now_playing_toolbar_controls_transition), "controls"), new Pair<>(v.findViewById(R.id.main_screen_now_playing_toolbar_title), "title"), new Pair<>(v.findViewById(R.id.main_screen_now_playing_toolbar_artist), "artist") ); ActivityCompat.startActivity(MainScreen.this, new Intent(MainScreen.this, NowPlaying.class), options.toBundle()); } }); if (song != null) { song.getAlbum().requestArt((ImageView) findViewById(R.id.main_screen_now_playing_toolbar_art)); TextView title = (TextView) quickToolbar.findViewById(R.id.main_screen_now_playing_toolbar_title), artist = (TextView) quickToolbar.findViewById(R.id.main_screen_now_playing_toolbar_artist); title.setText(song.getTitle()); artist.setText(song.getSongArtist()); } if (state != null) { if (state.getState() == PlaybackStateCompat.STATE_STOPPED || state.getState() == PlaybackStateCompat.STATE_NONE) { if (quickToolbar.getVisibility() != View.GONE) { quickToolbar.setTranslationY(0f); quickToolbar.animate().translationY(200f).setInterpolator(new FastOutSlowInInterpolator()) .setListener(new Animator.AnimatorListener() { @Override public void onAnimationStart(Animator animation) { } @Override public void onAnimationEnd(Animator animation) { quickToolbar.setVisibility(View.GONE); } @Override public void onAnimationCancel(Animator animation) { } @Override public void onAnimationRepeat(Animator animation) { } }).start(); } } else { if (quickToolbar.getVisibility() != View.VISIBLE) { quickToolbar.setTranslationY(200f); quickToolbar.setVisibility(View.VISIBLE); quickToolbar.animate().translationY(0f).setInterpolator(new FastOutSlowInInterpolator()).start(); } //For inconsistency sake quickToolbar.setVisibility(View.VISIBLE); } ImageButton button = (ImageButton) findViewById(R.id.main_screen_now_playing_toolbar_playpause); assert button != null; boolean isPaused = state.getState() == PlaybackStateCompat.STATE_PAUSED; if (isPaused) { button.setImageResource(R.drawable.ic_play_arrow_white_48dp); button.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { PlaybackRemote.resume(); } }); } else { button.setImageResource(R.drawable.ic_pause_white_48dp); button.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { PlaybackRemote.pause(); } }); } } } @Override protected boolean shouldKeepAppBarShadow() { return Options.usingTabs(); } /////////////////////////////////////////////////////////////////////////// // Navigation /////////////////////////////////////////////////////////////////////////// @Override protected int getOptionsMenu() { return R.menu.menu_main; } @Override protected boolean processMenuItem(int id) { switch (id) { case android.R.id.home: mDrawerLayout.openDrawer(GravityCompat.START); return true; case R.id.action_search: /*View searchMenuView = mToolbar.findViewById(R.id.action_search); int[] loc = new int[2]; searchMenuView.getLocationOnScreen(loc); Intent intent = SearchActivity.createStartIntent(this, loc[0], loc[0] + (searchMenuView.getWidth() / 2)); ActivityCompat.startActivity(this, intent, ActivityOptionsCompat.makeSceneTransitionAnimation(this).toBundle()); searchMenuView.setAlpha(0f);*/ startActivity(new Intent(this, SearchActivity.class)); return true; } return super.processMenuItem(id); } @Override protected boolean overrideUpBehavior() { return true; } @Override public void onBackPressed() { if (mDrawerLayout.isDrawerOpen(GravityCompat.START)) mDrawerLayout.closeDrawers(); else super.onBackPressed(); } @Override public boolean onNavigationItemSelected(MenuItem menuItem) { switch (menuItem.getItemId()) { case R.id.navdrawer_songs: switchToSongs(); break; case R.id.navdrawer_album_icon: switchToAlbum(); break; case R.id.navdrawer_artists: switchToArtists(); break; case R.id.navdrawer_playlists: switchToPlaylists(); break; case R.id.navdrawer_settings: startActivity(new Intent(this, Settings.class)); break; case R.id.navdrawer_report_bug: startActivity(new Intent(this, IssueReportingActivity.class)); break; } return true; } public void switchTab(int pos) { try { //noinspection ConstantConditions mTabs.getTabAt(pos).select(); } catch (Exception e) { e.printStackTrace(); } } /////////////////////////////////////////////////////////////////////////// // Pages /////////////////////////////////////////////////////////////////////////// public void switchToSongs() { mNavigationView.setCheckedItem(R.id.navdrawer_songs); switchTab(0); mPager.setCurrentItem(0); if (Options.usingCategoryNames()) { mScreenName = getResources().getString(R.string.page_songs); setTitle(mScreenName); } //Closes the Navdrawer mDrawerLayout.closeDrawers(); } public void switchToAlbum() { mNavigationView.setCheckedItem(R.id.navdrawer_album_icon); switchTab(1); mPager.setCurrentItem(1); if (Options.usingCategoryNames()) { mScreenName = getResources().getString(R.string.page_albums); setTitle(mScreenName); } //Closes the Navdrawer mDrawerLayout.closeDrawers(); } public void switchToArtists() { //Sets the current screen mScreenName = getResources().getString(R.string.page_artists); mNavigationView.setCheckedItem(R.id.navdrawer_artists); switchTab(2); mPager.setCurrentItem(2); if (Options.usingCategoryNames()) { mScreenName = getResources().getString(R.string.page_artists); setTitle(mScreenName); } //Closes the Navdrawer mDrawerLayout.closeDrawers(); } public void switchToPlaylists() { mNavigationView.setCheckedItem(R.id.navdrawer_playlists); switchTab(3); mPager.setCurrentItem(3); if (Options.usingCategoryNames()) { mScreenName = getResources().getString(R.string.page_playlists); setTitle(mScreenName); } //Closes the Navdrawer mDrawerLayout.closeDrawers(); } class RecyclerPagerAdapter extends PagerAdapter { private String[] titles = new String[]{ getResources().getString(R.string.page_songs), getResources().getString(R.string.page_albums), getResources().getString(R.string.page_artists), getResources().getString(R.string.page_playlists) }; @Override public int getCount() { return titles.length; } private void configureRecycler(RecyclerView recycler, RecyclerFastScroller scroller, int pos) { switch (pos) { case 0: configureAsSongs(recycler); break; case 1: configureAsAlbums(recycler); break; case 2: configureAsArtists(recycler); break; case 3: configureAsPlaylists(recycler); break; } scroller.attachRecyclerView(recycler); scroller.setTouchTargetWidth(RecyclerFastScrollerUtils.convertDpToPx(MainScreen.this, 16)); scroller.setHandlePressedColor(getAccentColor()); } private void configureAsSongs(RecyclerView list) { list.setAdapter(new ListAdapter<Song>(ListAdapter.Type.Song, MainScreen.this)); list.setLayoutManager(new LinearLayoutManager(MainScreen.this, LinearLayoutManager.VERTICAL, false)); } private void configureAsAlbums(RecyclerView list) { list.setAdapter(new ListAdapter<Album>(ListAdapter.Type.Album, MainScreen.this).withTransitionActivity(MainScreen.this)); list.setItemAnimator(new ListAdapter.AlbumAnimator()); list.addItemDecoration(new ListAdapter.AlbumDecor(MainScreen.this)); if (MainScreen.this.getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT) list.setLayoutManager(new GridLayoutManager(MainScreen.this, 2, GridLayoutManager.VERTICAL, false)); else list.setLayoutManager(new GridLayoutManager(MainScreen.this, 3, GridLayoutManager.VERTICAL, false)); } private void configureAsArtists(RecyclerView list) { list.setAdapter(new ListAdapter<Artist>(ListAdapter.Type.Artist, MainScreen.this)); list.setLayoutManager(new LinearLayoutManager(MainScreen.this, LinearLayoutManager.VERTICAL, false)); } private void configureAsPlaylists(RecyclerView list) { list.setAdapter(new ListAdapter<Playlist>(ListAdapter.Type.Playlist, MainScreen.this).withTransitionActivity(MainScreen.this)); list.setLayoutManager(new LinearLayoutManager(MainScreen.this, LinearLayoutManager.VERTICAL, false)); } @Override public Object instantiateItem(ViewGroup container, int position) { if (position != 2) { View root = getLayoutInflater().inflate(R.layout.blank_page, container, false); RecyclerView list = (RecyclerView) root.findViewById(R.id.main_screen_page_recycler); RecyclerFastScroller scroller = (RecyclerFastScroller) root.findViewById(R.id.main_screen_page_scroller); configureRecycler(list, scroller, position); container.addView(root, ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT); ATE.themeView(root, getATEKey()); return root; } else { TextView text = new TextView(MainScreen.this); text.setSingleLine(); text.setText(R.string.msg_coming_soon); text.setGravity(Gravity.CENTER); container.addView(text, ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT); return text; } } @Override public CharSequence getPageTitle(int position) { return titles[position]; } @Override public boolean isViewFromObject(View view, Object object) { return view.equals(object); } } }