package com.ideabag.playtunes.activity; import java.util.ArrayList; import com.crashlytics.android.Crashlytics; import com.google.android.gms.ads.AdRequest; import com.google.android.gms.ads.AdView; import com.ideabag.playtunes.R; import com.ideabag.playtunes.PlaylistManager; import com.ideabag.playtunes.dialog.RateAppDialogFragment; import com.ideabag.playtunes.fragment.BaseNavigationFragment; import com.ideabag.playtunes.fragment.FooterControlsFragment; import com.ideabag.playtunes.fragment.NavigationDrawerFragment; import com.ideabag.playtunes.media.PlaylistMediaPlayer.PlaybackListener; import com.ideabag.playtunes.service.MusicPlayerService; import com.ideabag.playtunes.service.PlaybackNotification; import com.ideabag.playtunes.util.AdmobUtil; import com.ideabag.playtunes.util.CheckRemoteVersionFileTask; import android.support.v4.app.Fragment; import android.support.v4.app.FragmentTransaction; import android.support.v7.app.ActionBarActivity; import android.view.KeyEvent; import android.view.Menu; import android.view.MenuInflater; import android.view.MenuItem; import android.content.ComponentName; import android.content.Context; import android.content.Intent; import android.content.ServiceConnection; import android.content.SharedPreferences; import android.content.res.Configuration; import android.os.Bundle; import android.os.IBinder; import io.fabric.sdk.android.Fabric; public class MainActivity extends ActionBarActivity { public MusicPlayerService mBoundService; public boolean mIsBound = false; public BaseNavigationFragment NavigationFragment; public PlaylistManager PlaylistManager; public boolean mShouldHideActionItems; // AdView private AdView mAdView; @Override public void onCreate( Bundle savedInstanceState ) { super.onCreate( savedInstanceState ); Fabric.with(this, new Crashlytics()); setContentView( R.layout.activity_main ); // // Weird fix for bug on Android 2.3 and something about Play Services // try {Class.forName("android.os.AsyncTask");} catch(Throwable ignore) {} PlaylistManager = new PlaylistManager( this ); // mFooterControlsFragment = ( FooterControlsFragment ) getSupportFragmentManager().findFragmentById( R.id.FooterControlsFragment ); NavigationFragment = ( BaseNavigationFragment ) getSupportFragmentManager().findFragmentById( R.id.left_drawer ); mAdView = ( AdView ) findViewById( R.id.adView ); AdRequest.Builder adRequestBuilder = new AdRequest.Builder().addTestDevice( AdRequest.DEVICE_ID_EMULATOR ); AdmobUtil.AddTestDevices( this, adRequestBuilder ); AdRequest adRequest = adRequestBuilder.build(); // Start loading the ad in the background. mAdView.loadAd( adRequest ); } @Override protected void onNewIntent( Intent intent ) { super.onNewIntent( intent ); if ( intent.hasExtra( PlaybackNotification.NOW_PLAYING_EXTRA ) && mBoundService != null && mBoundService.mPlaylistFragmentClass != null ) { NavigationFragment.showNowPlaying();//loadNowPlayingFragment(); //showNowPlayingActivity(); // TODO: Slide up expanded controls } } public void setActionbarTitle( String titleString ) { if ( null != NavigationFragment ) { NavigationFragment.setActionbarTitle( titleString ); } } public void setActionbarSubtitle( String subtitleString ) { if ( null != NavigationFragment ) { NavigationFragment.setActionbarSubtitle( subtitleString ); } } @Override public void onStart() { super.onStart(); SharedPreferences prefs = getSharedPreferences( getString( R.string.prefs_file) , Context.MODE_PRIVATE ); //SharedPreferences.Editor edit = prefs.edit(); int openCount = prefs.getInt( getString( R.string.pref_key_appopen ), 0 ); int rateAppPromptCount = getResources().getInteger( R.integer.rate_app_prompt_count ); if ( openCount == rateAppPromptCount ) { // Show rate dialog FragmentTransaction ft = getSupportFragmentManager().beginTransaction(); Fragment prev = getSupportFragmentManager().findFragmentByTag( "dialog" ); if ( prev != null ) { ft.remove( prev ); } RateAppDialogFragment rateFragment = new RateAppDialogFragment(); rateFragment.show( ft, "dialog" ); } else { // We don't want to show multiple dialogs new CheckRemoteVersionFileTask( this ).execute( ); } if ( openCount <= getResources().getInteger( R.integer.rate_app_prompt_count ) ) { openCount++; SharedPreferences.Editor edit = prefs.edit(); edit.putInt( getString( R.string.pref_key_appopen ), openCount ); edit.commit(); } } @Override public void onResume() { super.onResume(); mAdView.resume(); if ( !mIsBound || mBoundService == null ) { doBindService(); } } @Override public void onPause() { super.onPause(); mAdView.pause(); if ( mIsBound || mBoundService != null ) { doUnbindService(); } } @Override public void onStop() { super.onStop(); } @Override public void onDestroy() { super.onDestroy(); mAdView.destroy(); if ( mIsBound || mBoundService != null ) { doUnbindService(); } } // // Now the hardware menu button will toggle the drawer layout // @Override public boolean onKeyDown( int keycode, KeyEvent e ) { if ( NavigationFragment.onKeyDown( keycode, e ) ) { return true; } return super.onKeyDown( keycode, e ); } public void transactFragment( Fragment mFragment ) { NavigationFragment.transactFragment( mFragment ); } private ArrayList< PlaybackListener > mListeners = null; public void addPlaybackListener( PlaybackListener listener ) { if ( null == mListeners ) { mListeners = new ArrayList< PlaybackListener >(); } mListeners.add( listener ); } public void removePlaybackListener( PlaybackListener listener ) { if ( mListeners != null && mListeners.contains( listener ) ) { mListeners.remove( listener ); } else { mBoundService.removePlaybackListener( listener ); } } private ServiceConnection mConnection = new ServiceConnection() { public void onServiceConnected( ComponentName className, IBinder service ) { // This is called when the connection with the service has been // established, giving us the service object we can use to // interact with the service. Because we have bound to a explicit // service that we know is running in our own process, we can // cast its IBinder to a concrete class and directly access it. mBoundService = ( ( MusicPlayerService.MusicPlayerServiceBinder ) service ).getService(); mBoundService.addPlaybackListener( mPlaybackListener ); mIsBound = true; } public void onServiceDisconnected( ComponentName className ) { // This is called when the connection with the service has been // unexpectedly disconnected -- that is, its process crashed. // Because it is running in our same process, we should never // see this happen. mBoundService = null; mIsBound = false; } }; void doBindService() { // Establish a connection with the service. We use an explicit // class name because we want a specific service implementation that // we know will be running in our own process (and thus won't be // supporting component replacement by other applications). bindService( new Intent( MainActivity.this, MusicPlayerService.class ), mConnection, Context.BIND_AUTO_CREATE ); } void doUnbindService() { if ( mIsBound ) { // Remove service's reference to local object mBoundService.removePlaybackListener( mPlaybackListener ); //BoundService.doDetachActivity(); //android.util.Log.i("Detached from service", "Main Activity disconnected from service." ); // Detach our existing connection. unbindService( mConnection ); mIsBound = false; } } // // We use the onActivityResult mechanism to return from the NowPlayingActivity // and display the Fragment of the currently playing playlist, if it's not already displayed. // @Override protected void onActivityResult( int requestCode, int resultCode, Intent data ) { if ( resultCode == RESULT_OK ) { NavigationFragment.showNowPlaying(); } } // // Menu and MenuItem related code goes here // // // @Override public boolean onCreateOptionsMenu( Menu menu ) { return NavigationFragment.onCreateOptionsMenu( menu ); } @Override public boolean onOptionsItemSelected( MenuItem item ) { if ( NavigationFragment.onOptionsItemSelected( item ) ) { return true; } return super.onOptionsItemSelected( item ); } /* @Override public boolean onPrepareOptionsMenu( Menu menu ) { // If the nav drawer is open, hide action items related to the content view boolean drawerOpen = mShouldHideActionItems; hideMenuItems( menu, !drawerOpen ); return super.onPrepareOptionsMenu( menu ); } /* public boolean mShowSearch = true; private void hideMenuItems( Menu menu, boolean visible ) { for ( int i = 0; i < menu.size(); i++ ) { MenuItem item = menu.getItem( i ); int id = item.getItemId(); if ( id == R.id.MenuSearch ) { item.setVisible( mShowSearch ); } else { item.setVisible( visible ); } } } */ @Override protected void onPostCreate(Bundle savedInstanceState) { super.onPostCreate(savedInstanceState); // Sync the toggle state after onRestoreInstanceState has occurred. try { ( ( NavigationDrawerFragment ) NavigationFragment ).mDrawerToggle.syncState(); } catch (Exception e) { } } @Override public void onConfigurationChanged( Configuration newConfig ) { super.onConfigurationChanged( newConfig ); // Pass any configuration change to the drawer toggls try { ( ( NavigationDrawerFragment ) NavigationFragment ).mDrawerToggle.onConfigurationChanged( newConfig ); } catch (Exception e) { } } private PlaybackListener mPlaybackListener = new PlaybackListener() { @Override public void onTrackChanged( String media_id ) { if ( null != mListeners ) { for ( int i = 0, count = mListeners.size(); i < count; i++ ) { mListeners.get( i ).onTrackChanged( media_id ); } } } @Override public void onPlay() { if ( null != mListeners ) { for ( int i = 0, count = mListeners.size(); i < count; i++ ) { mListeners.get( i ).onPlay(); } } } @Override public void onPause() { if ( null != mListeners ) { for ( int i = 0, count = mListeners.size(); i < count; i++ ) { mListeners.get( i ).onPause(); } } } @Override public void onPlaylistDone() { if ( null != mListeners ) { for ( int i = 0, count = mListeners.size(); i < count; i++ ) { mListeners.get( i ).onPlaylistDone(); } } } @Override public void onLoopingChanged( int loop ) { if ( null != mListeners ) { for ( int i = 0, count = mListeners.size(); i < count; i++ ) { mListeners.get( i ).onLoopingChanged( loop ); } } } @Override public void onShuffleChanged( boolean isShuffling ) { if ( null != mListeners ) { for ( int i = 0, count = mListeners.size(); i < count; i++ ) { mListeners.get( i ).onShuffleChanged( isShuffling ); } } } @Override public void onDurationChanged( int position, int duration ) { if ( null != mListeners ) { for ( int i = 0, count = mListeners.size(); i < count; i++ ) { mListeners.get( i ).onDurationChanged( position, duration ); } } } }; }