package com.ideabag.playtunes.fragment.xlarge;
import com.google.android.gms.analytics.HitBuilders;
import com.ideabag.playtunes.PlaylistManager;
import com.ideabag.playtunes.R;
import com.ideabag.playtunes.activity.MainActivity;
import com.ideabag.playtunes.activity.SettingsActivity;
import com.ideabag.playtunes.adapter.AlbumsAllAdapter;
import com.ideabag.playtunes.adapter.ArtistsAllAdapter;
import com.ideabag.playtunes.adapter.GenresAllAdapter;
import com.ideabag.playtunes.adapter.PlaylistsAllAdapter;
import com.ideabag.playtunes.adapter.PlaylistsOneAdapter;
import com.ideabag.playtunes.adapter.SongsAllAdapter;
import com.ideabag.playtunes.database.MediaQuery;
import com.ideabag.playtunes.dialog.CreatePlaylistDialogFragment;
import com.ideabag.playtunes.dialog.PlaylistMenuDialogFragment;
import com.ideabag.playtunes.dialog.SettingsDialogFragment;
import com.ideabag.playtunes.fragment.ArtistsAllFragment;
import com.ideabag.playtunes.fragment.BaseNavigationFragment;
import com.ideabag.playtunes.fragment.GenresAllFragment;
import com.ideabag.playtunes.fragment.MusicBrowserFragment;
import com.ideabag.playtunes.fragment.PlaylistsAllFragment;
import com.ideabag.playtunes.fragment.PlaylistsOneFragment;
import com.ideabag.playtunes.fragment.SongsFragment;
import com.ideabag.playtunes.fragment.xlarge.browser.BrowseSongsFragment;
import com.ideabag.playtunes.util.QueryCountTask;
import com.ideabag.playtunes.util.SearchHistory;
import com.ideabag.playtunes.util.GAEvent.Categories;
import com.ideabag.playtunes.util.GAEvent.Playlist;
import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.database.ContentObserver;
import android.os.Bundle;
import android.os.Handler;
import android.provider.MediaStore;
import android.support.v4.app.DialogFragment;
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.v7.app.ActionBar;
import android.support.v7.app.ActionBarActivity;
import android.support.v7.widget.Toolbar;
import android.support.v7.widget.Toolbar.OnMenuItemClickListener;
import android.view.Gravity;
import android.view.KeyEvent;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.view.View.OnClickListener;
import android.view.ViewGroup.LayoutParams;
import android.view.inputmethod.EditorInfo;
import android.widget.AutoCompleteTextView;
import android.widget.LinearLayout;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.TextView.OnEditorActionListener;
import android.widget.AdapterView;
/*
This fragment handles a lot.
LargeNavigationFragment is a hybrid of NavigationFragment and PlaylistsAllFragment.
The layout view_basic_navigation.xml is used as the ListView header while the list is
backed by a PlaylistsAllAdapter.
A Toolbar is another header on the ListView and is used instead of the ActionBar from PlaylistsAllFragment.
Lastly, it manages the Search field and autocomplete terms found on the top ActionBar.
*/
public class LargeNavigationFragment extends BaseNavigationFragment implements View.OnClickListener, AdapterView.OnItemClickListener {
public static final String TAG = "NavigationFragment";
protected MainActivity mActivity;
protected FragmentManager mFragmentManager;
//protected ActionBar mActionBar;
protected Toolbar mMusicBrowserToolbar;
protected Toolbar mActionBarToolbar;
protected PlaylistManager mPlaylistManager;
protected MusicBrowserFragment MusicBrowserFragment;
protected LinearLayout mBasicNavigationView;
protected ListView mNavigationListView;
PlaylistsAllAdapter adapter;
Toolbar mPlaylistToolbar;
private TextView mBadgeSongsAll;
private TextView mBadgeAlbumsAll;
private TextView mBadgeArtistsAll;
//private TextView mBadgeGenresAll;
//private TextView mBadgePlaylistsAll;
private TextView mBadgeStarredCount;
MediaQuery mArtistsAllQuery;
MediaQuery mGenresAllQuery;
MediaQuery mPlaylistsAllQuery;
MediaQuery mStarredCountQuery;
MediaQuery mSongsAllQuery;
MediaQuery mAlbumsAllQuery;
//
// Search functionality
//
public AutoCompleteTextView mQueryTextView;
protected String mSearchQuery = null;
SearchHistory mSearchHistory;
// Have we warned the user that pressing Back will close the app?
protected boolean mCloseWarningOn = false;
public CharSequence mActionbarTitle, mActionbarSubtitle;
@Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
return inflater.inflate( R.layout.fragment_navigation, container, false );
}
@Override public void onAttach( Activity activity ) {
super.onAttach( activity );
mActivity = ( MainActivity ) activity;
mPlaylistManager = new PlaylistManager( getActivity() );
/*
mActionBar = mActivity.getSupportActionBar();
mActionBar.setDisplayShowHomeEnabled( true );
mActionBar.setIcon( R.drawable.ic_launcher );
mActionBar.setDisplayHomeAsUpEnabled( false );
mActionBar.setTitle( null );
*/
mFragmentManager = mActivity.getSupportFragmentManager();
}
@Override public void onActivityCreated( Bundle savedInstanceState ) {
super.onActivityCreated( savedInstanceState );
if ( null != savedInstanceState ) {
mSearchQuery = savedInstanceState.getString( getString( R.string.key_state_query_string ) );
}
//
// Set up new ActionBar (Toolbar) and toolbar for the music browser, specific to the large layout
//
mMusicBrowserToolbar = ( Toolbar ) getActivity().findViewById( R.id.MusicBrowserToolbar );
mActivity.setSupportActionBar( mMusicBrowserToolbar );
mActionBarToolbar = ( Toolbar ) getActivity().findViewById( R.id.ActionBarToolbar );
mActionBarToolbar.setLogo( R.drawable.ic_launcher );
//
// Set up the sidebar listview
//
mNavigationListView = ( ListView ) getView().findViewById( R.id.LargeNavigationListView );
LayoutInflater inflater = ( LayoutInflater ) mActivity.getSystemService( Context.LAYOUT_INFLATER_SERVICE );
mBasicNavigationView = ( LinearLayout ) inflater.inflate( R.layout.view_basic_navigation, null, false );
mNavigationListView.addHeaderView( mBasicNavigationView );
mPlaylistToolbar = ( Toolbar ) inflater.inflate( R.layout.view_toolbar_playlists, null, false );
mPlaylistToolbar.inflateMenu( R.menu.menu_playlists_all );
mPlaylistToolbar.setTitle( R.string.playlists_plural );
//mPlaylistToolbar.setLogo( R.drawable.ic_action_list_2 );
mPlaylistToolbar.setOnMenuItemClickListener( PlaylistOnMenuItemClickListener );
mNavigationListView.addHeaderView( mPlaylistToolbar );
mNavigationListView.setOnItemClickListener( this );
//
// Add headers before setting the adapter
//
adapter = new PlaylistsAllAdapter( getActivity(), playlistMenuClickListener );
mNavigationListView.setAdapter( adapter );
mBadgeStarredCount = ( TextView ) getView().findViewById( R.id.BadgeStarredCount );
mBadgeSongsAll = ( TextView ) getView().findViewById( R.id.BadgeSongsAll );
mBadgeAlbumsAll = ( TextView ) getView().findViewById( R.id.BadgeAlbumsAll );
mBadgeArtistsAll = ( TextView ) getView().findViewById( R.id.BadgeArtistsAll );
//mBadgeGenresAll = ( TextView ) getView().findViewById( R.id.BadgeGenresAll );
//mBadgePlaylistsAll = ( TextView ) getView().findViewById( R.id.BadgePlaylistsAll );
mArtistsAllQuery = new MediaQuery(
MediaStore.Audio.Artists.EXTERNAL_CONTENT_URI,
ArtistsAllAdapter.SELECTION,
null,
null,
MediaStore.Audio.Artists.DEFAULT_SORT_ORDER
);
mGenresAllQuery = new MediaQuery(
MediaStore.Audio.Genres.EXTERNAL_CONTENT_URI,
GenresAllAdapter.SELECTION,
null,
null,
MediaStore.Audio.Genres.DEFAULT_SORT_ORDER
);
String mStarredId = mPlaylistManager.createStarredIfNotExist();
/*
mPlaylistsAllQuery = new MediaQuery(
MediaStore.Audio.Playlists.EXTERNAL_CONTENT_URI,
PlaylistsAllAdapter.SELECTION,
MediaStore.Audio.Playlists._ID + " !=?",
new String[] {
mStarredId
},
null
);
*/
mStarredCountQuery = new MediaQuery(
MediaStore.Audio.Playlists.Members.getContentUri( "external", Long.parseLong( mStarredId ) ),
PlaylistsOneAdapter.SELECTION,
MediaStore.Audio.Playlists.Members.PLAYLIST_ID + "=?",
new String[] {
mStarredId
},
null
);
mSongsAllQuery = new MediaQuery(
MediaStore.Audio.Media.EXTERNAL_CONTENT_URI,
SongsAllAdapter.SELECTION,
MediaStore.Audio.Media.IS_MUSIC + " != 0",
null,
null
);
mAlbumsAllQuery = new MediaQuery(MediaStore.Audio.Albums.EXTERNAL_CONTENT_URI,
AlbumsAllAdapter.SELECTION,
MediaStore.Audio.Media.ALBUM + "!=?",
new String[] {
getString( R.string.no_album_string )
},
MediaStore.Audio.Albums.DEFAULT_SORT_ORDER
);
mBasicNavigationView.findViewById( R.id.NavigationArtistsAll ).setOnClickListener( this );
mBasicNavigationView.findViewById( R.id.NavigationAlbumsAll ).setOnClickListener( this );
mBasicNavigationView.findViewById( R.id.NavigationStarred ).setOnClickListener( this );
mBasicNavigationView.findViewById( R.id.NavigationSongsAll ).setOnClickListener( this );
updateBadges();
getActivity().getContentResolver().registerContentObserver(
MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, true, mediaStoreChanged );
getActivity().getContentResolver().registerContentObserver(
MediaStore.Audio.Playlists.Members.getContentUri( "external",
Long.parseLong( mPlaylistManager.createStarredIfNotExist() ) ), true, mediaStoreChanged );
MusicBrowserFragment = ( MusicBrowserFragment ) getActivity().getSupportFragmentManager().findFragmentById( R.id.MusicBrowserFragment );
//
// Search functionality
//
Toolbar.LayoutParams mSearchInputParams = new Toolbar.LayoutParams( LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT );
mSearchInputParams.gravity = Gravity.CENTER;
//mActionBar.setCustomView( R.layout.view_search_compat );
//mActionBar.getCustomView().setLayoutParams( mSearchInputParams );
//mActionBar.setDisplayShowCustomEnabled( true );
LinearLayout mSearchView = ( LinearLayout ) getActivity().getLayoutInflater().inflate( R.layout.view_search_compat, null );
mActionBarToolbar.addView( mSearchView, mSearchInputParams );
mActionBarToolbar.inflateMenu( R.menu.menu_settings );
mActionBarToolbar.setOnMenuItemClickListener( new OnMenuItemClickListener() {
@Override public boolean onMenuItemClick( MenuItem item ) {
if ( item.getItemId() == R.id.MenuItemSettings ) {
FragmentTransaction ft = getActivity().getSupportFragmentManager().beginTransaction();
SettingsDialogFragment newFragment = new SettingsDialogFragment();
newFragment.show( ft, "dialog" );
return true;
}
return false;
}
});
mSearchView.findViewById( R.id.SearchButton ).setOnClickListener( new OnClickListener() {
@Override public void onClick( View v ) {
String mQueryString = mQueryTextView.getEditableText().toString();
//setMediaID( mQueryString );
}
});
mSearchView.findViewById( R.id.ClearSearchButton ).setOnClickListener( new OnClickListener() {
@Override public void onClick( View v ) {
mQueryTextView.setText( "" );
//setMediaID( null );
}
});
mQueryTextView = ( AutoCompleteTextView ) mSearchView.findViewById( R.id.SearchQueryTextView );
mQueryTextView.setOnEditorActionListener( new OnEditorActionListener() {
@Override public boolean onEditorAction( TextView view, int actionId, KeyEvent event ) {
boolean mConsumed = false;
String query = mQueryTextView.getEditableText().toString();
if ( event != null && event.getKeyCode() == KeyEvent.KEYCODE_ENTER ) {
android.util.Log.i( TAG, "Enter");
SearchFragment mSearchFragment = new SearchFragment();
mSearchFragment.setMediaID( query );
transactFragment( mSearchFragment );
mQueryTextView.clearFocus();
mConsumed = true;
} else if ( event != null && event.getAction() == KeyEvent.ACTION_DOWN ) {
//setMediaID( query );
android.util.Log.i( TAG, "Action Down");
mConsumed = true;
} else if ( actionId == EditorInfo.IME_ACTION_SEARCH ) {
//setMediaID( query );
android.util.Log.i( TAG, "Search");
mConsumed = true;
}
return mConsumed;
}
});
mSearchHistory = new SearchHistory( getActivity() );
mQueryTextView.setAdapter( mSearchHistory.getAdapter() );
}
@Override public void onPause() {
super.onPause();
}
@Override public void onDestroy() {
super.onDestroy();
getActivity().getContentResolver().unregisterContentObserver( mediaStoreChanged );
}
@Override public void onClick( View v ) {
int id = v.getId();
load( id );
}
protected void load( int id ) {
Fragment mNewFragment = null;
switch ( id ) {
case R.id.NavigationArtistsAll:
mNewFragment = new ArtistsAllFragment();
break;
case R.id.NavigationAlbumsAll:
mNewFragment = new AlbumsAllFragment();
break;
case R.id.NavigationGenresAll:
mNewFragment = new GenresAllFragment();
break;
case R.id.NavigationSongsAll:
mNewFragment = new BrowseSongsFragment();
break;
case R.id.NavigationStarred:
mNewFragment = new PlaylistsOneFragment();
((PlaylistsOneFragment)mNewFragment).setMediaID( mPlaylistManager.createStarredIfNotExist() );
break;
case R.id.NavigationSearch:
mNewFragment = new SearchFragment();
break;
case R.id.SettingsButton:
Intent launchSettingsIntent = new Intent( getActivity(), SettingsActivity.class);
getActivity().startActivity( launchSettingsIntent );
break;
default:
mNewFragment = new PlaylistsAllFragment();
break;
}
if ( null != mNewFragment ) {
transactFragment( mNewFragment );
}
}
ContentObserver mediaStoreChanged = new ContentObserver(new Handler()) {
@Override public void onChange( boolean selfChange ) {
mActivity.runOnUiThread( new Runnable() {
@Override public void run() {
adapter.notifyDataSetChanged();
updateBadges();
}
});
super.onChange( selfChange );
}
};
public void showNowPlaying() {
MusicBrowserFragment.showNowPlaying();
}
public void showSearch() {
Fragment mSearchFragment = new SearchFragment();
transactFragment( mSearchFragment );
}
public void transactFragment( Fragment mFragment ) {
MusicBrowserFragment.transactFragment( mFragment );
mCloseWarningOn = false;
}
public boolean onKeyDown( int keycode, KeyEvent e ) {
switch ( keycode ) {
case KeyEvent.KEYCODE_SEARCH:
showSearch();
return true;
case KeyEvent.KEYCODE_BACK:
if ( mFragmentManager.getBackStackEntryCount() == 0 ) {
if ( !mCloseWarningOn ) {
android.widget.Toast.makeText( mActivity, getString( R.string.back_warning ), android.widget.Toast.LENGTH_LONG ).show();
mCloseWarningOn = true;
return true;
}
} else {
mCloseWarningOn = false;
}
break;
}
return false;
}
// TODO:
// How do we want to deal with the Actionbar on big tablets?
@Override public void setActionbarTitle( String titleString ) {
mActionbarTitle = ( CharSequence ) titleString;
mMusicBrowserToolbar.setTitle( mActionbarTitle );
}
@Override public void setActionbarSubtitle( String subtitleString ) {
mActionbarSubtitle = ( CharSequence ) subtitleString;
mMusicBrowserToolbar.setSubtitle( mActionbarSubtitle );
}
public View.OnClickListener playlistMenuClickListener = new View.OnClickListener() {
@Override public void onClick(View v) {
//int id = v.getId();
ViewGroup list_item = ( ViewGroup ) v.getParent();
String playlist_id = ( String ) list_item.getTag( R.id.tag_playlist_id);
showPlaylistMenuDialog( playlist_id );
}
};
private void showPlaylistMenuDialog( String playlist_id ) {
FragmentTransaction ft = getActivity().getSupportFragmentManager().beginTransaction();
PlaylistMenuDialogFragment newFragment = new PlaylistMenuDialogFragment();
newFragment.setMediaID( playlist_id );
newFragment.show( ft, "dialog" );
}
@Override public boolean onCreateOptionsMenu( Menu menu ) {
//MenuInflater inflater = getActivity().getMenuInflater();
//inflater.inflate( R.menu.menu_settings, menu );
return false;
}
public void updateBadges() {
new QueryCountTask( mBadgeSongsAll ).execute( mSongsAllQuery );
new QueryCountTask( mBadgeArtistsAll ).execute( mArtistsAllQuery );
new QueryCountTask( mBadgeAlbumsAll ).execute( mAlbumsAllQuery );
//new QueryCountTask( mBadgePlaylistsAll ).execute( mPlaylistsAllQuery );
new QueryCountTask( mBadgeSongsAll ).execute( mSongsAllQuery );
//new QueryCountTask( mBadgeGenresAll ).execute( mGenresAllQuery );
new QueryCountTask( mBadgeStarredCount ).execute( mStarredCountQuery );
}
Toolbar.OnMenuItemClickListener PlaylistOnMenuItemClickListener = new Toolbar.OnMenuItemClickListener() {
@Override public boolean onMenuItemClick( MenuItem item ) {
int id = item.getItemId();
if ( id == R.id.MenuPlaylistsAdd ) {
FragmentTransaction ft = getActivity().getSupportFragmentManager().beginTransaction();
DialogFragment newFragment = new CreatePlaylistDialogFragment();
newFragment.show( ft, "dialog" );
}
return false;
}
};
@Override public void onItemClick( AdapterView<?> parent, View v, int position, long id) {
String playlist_id = ( String ) v.getTag( R.id.tag_playlist_id );
PlaylistsOneFragment playlistFragment = new PlaylistsOneFragment();
playlistFragment.setMediaID( playlist_id );
mActivity.transactFragment( playlistFragment );
/*
mTracker.send( new HitBuilders.EventBuilder()
.setCategory( Categories.PLAYLIST )
.setAction( Playlist.ACTION_CLICK )
.setValue( position )
.build());
*/
}
}