Java tutorial
/* * Copyright (C) 2014 Saravan Pantham * * 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.jams.music.player.GridViewFragment; import android.annotation.SuppressLint; import android.content.Context; import android.content.Intent; import android.database.Cursor; import android.graphics.BitmapFactory; import android.graphics.Paint; import android.os.AsyncTask; import android.os.Build; import android.os.Bundle; import android.os.Handler; import android.support.v4.app.Fragment; import android.support.v7.app.AppCompatActivity; import android.util.TypedValue; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.view.animation.AccelerateDecelerateInterpolator; import android.view.animation.Animation; import android.view.animation.Animation.AnimationListener; import android.view.animation.TranslateAnimation; import android.widget.AdapterView; import android.widget.AdapterView.OnItemClickListener; import android.widget.BaseAdapter; import android.widget.GridView; import android.widget.RelativeLayout; import android.widget.TextView; import com.andraskindler.quickscroll.QuickScrollGridView; import com.jams.music.player.BrowserSubGridActivity.BrowserSubGridActivity; import com.jams.music.player.BrowserSubListActivity.BrowserSubListActivity; import com.jams.music.player.DBHelpers.DBAccessHelper; import com.jams.music.player.Helpers.PauseOnScrollHelper; import com.jams.music.player.Helpers.TypefaceHelper; import com.jams.music.player.Helpers.UIElementsHelper; import com.jams.music.player.MainActivity.MainActivity; import com.jams.music.player.R; import com.jams.music.player.Utils.Common; import com.nhaarman.listviewanimations.swinginadapters.prepared.SwingBottomInAnimationAdapter; import java.util.HashMap; /** * Generic, multipurpose GridView fragment. * * @author Saravan Pantham */ public class GridViewFragment extends Fragment { private Context mContext; private GridViewFragment mFragment; private Common mApp; private View mRootView; private RelativeLayout mGridViewContainer; private int mFragmentId; private QuickScrollGridView mQuickScroll; private BaseAdapter mGridViewAdapter; private HashMap<Integer, String> mDBColumnsMap; private GridView mGridView; private TextView mEmptyTextView; public Handler mHandler = new Handler(); private Cursor mCursor; private String mFragmentTitle; private String mQuerySelection = ""; @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { mRootView = inflater.inflate(R.layout.fragment_grid_view, container, false); mContext = getActivity().getApplicationContext(); mApp = (Common) mContext; mFragment = this; //Set the background color and the partial color bleed. mRootView.setBackgroundColor(UIElementsHelper.getBackgroundColor(mContext)); //Grab the fragment. This will determine which data to load into the cursor. mFragmentId = getArguments().getInt(Common.FRAGMENT_ID); mFragmentTitle = getArguments().getString(MainActivity.FRAGMENT_HEADER); mDBColumnsMap = new HashMap<Integer, String>(); mQuickScroll = (QuickScrollGridView) mRootView.findViewById(R.id.quickscrollgrid); //Set the adapter for the outer gridview. mGridView = (GridView) mRootView.findViewById(R.id.generalGridView); mGridViewContainer = (RelativeLayout) mRootView.findViewById(R.id.fragment_grid_view_frontal_layout); mGridView.setVerticalScrollBarEnabled(false); //Set the number of gridview columns based on the screen density and orientation. if (mApp.isPhoneInLandscape() || mApp.isTabletInLandscape()) { mGridView.setNumColumns(4); } else if (mApp.isPhoneInPortrait()) { mGridView.setNumColumns(3);//Test only, 2 } else if (mApp.isTabletInPortrait()) { mGridView.setNumColumns(3); } //KitKat translucent navigation/status bar. if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { int topPadding = Common.getStatusBarHeight(mContext); //Calculate navigation bar height. int navigationBarHeight = 0; int resourceId = getResources().getIdentifier("navigation_bar_height", "dimen", "android"); if (resourceId > 0) { navigationBarHeight = getResources().getDimensionPixelSize(resourceId); } mGridViewContainer.setPadding(0, topPadding, 0, 0); mGridView.setClipToPadding(false); mGridView.setPadding(0, mGridView.getPaddingTop(), 0, navigationBarHeight); mQuickScroll.setPadding(0, 0, 0, navigationBarHeight); } //Set the empty views. mEmptyTextView = (TextView) mRootView.findViewById(R.id.empty_view_text); mEmptyTextView.setTypeface(TypefaceHelper.getTypeface(mContext, "Roboto-Light")); mEmptyTextView .setPaintFlags(mEmptyTextView.getPaintFlags() | Paint.ANTI_ALIAS_FLAG | Paint.SUBPIXEL_TEXT_FLAG); //Create a set of options to optimize the bitmap memory usage. final BitmapFactory.Options options = new BitmapFactory.Options(); options.inJustDecodeBounds = true; options.inJustDecodeBounds = false; options.inPurgeable = true; mHandler.postDelayed(queryRunnable, 250); return mRootView; } /** * Query runnable. */ public Runnable queryRunnable = new Runnable() { @Override public void run() { new AsyncRunQuery().executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR); } }; /** * Click listener for the "PLAY ALL" text. */ private View.OnClickListener playAllClickListener = new View.OnClickListener() { @Override public void onClick(View v) { if (mApp.isShuffleOn()) ((MainActivity) getActivity()).playAll(true); else ((MainActivity) getActivity()).playAll(false); } }; /** * Item click listener for the GridView/ListView. */ private OnItemClickListener onItemClickListener = new OnItemClickListener() { @Override public void onItemClick(AdapterView<?> arg0, View view, int index, long id) { //Determine the new activity's fragment id. int newFragmentId = getNewFragmentId(); Intent intent; if (newFragmentId == Common.ALBUMS_FLIPPED_FRAGMENT) { intent = new Intent(mContext, BrowserSubListActivity.class); } else { intent = new Intent(mContext, BrowserSubGridActivity.class); } Bundle bundle = new Bundle(); bundle.putString("headerImagePath", (String) view.getTag(R.string.album_art)); bundle.putString("headerText", (String) view.getTag(R.string.title_text)); bundle.putString("subText", (String) view.getTag(R.string.field_1)); bundle.putInt("fragmentId", newFragmentId); intent.putExtras(bundle); startActivity(intent); getActivity().overridePendingTransition(R.anim.fade_in, R.anim.fade_out); } }; /** * Determines the next activity's fragment id based on the * current activity's fragment id. */ private int getNewFragmentId() { switch (mFragmentId) { case Common.ARTISTS_FRAGMENT: return Common.ARTISTS_FLIPPED_FRAGMENT; case Common.ALBUM_ARTISTS_FRAGMENT: return Common.ALBUM_ARTISTS_FLIPPED_FRAGMENT; case Common.ALBUMS_FRAGMENT: return Common.ALBUMS_FLIPPED_FRAGMENT; case Common.GENRES_FRAGMENT: return Common.GENRES_FLIPPED_FRAGMENT; default: return -1; } } /** * Runs the correct DB query based on the passed in fragment id and * displays the GridView. * * @author Saravan Pantham */ public class AsyncRunQuery extends AsyncTask<Void, Void, Void> { @Override protected Void doInBackground(Void... params) { mCursor = mApp.getDBAccessHelper().getFragmentCursor(mContext, mQuerySelection, mFragmentId); loadDBColumnNames(); return null; } /** * Populates the DB column names based on the specifed fragment id. */ private void loadDBColumnNames() { switch (mFragmentId) { case Common.ARTISTS_FRAGMENT: mDBColumnsMap.put(GridViewCardsAdapter.TITLE_TEXT, DBAccessHelper.SONG_ARTIST); mDBColumnsMap.put(GridViewCardsAdapter.SOURCE, DBAccessHelper.SONG_SOURCE); mDBColumnsMap.put(GridViewCardsAdapter.FILE_PATH, DBAccessHelper.SONG_FILE_PATH); mDBColumnsMap.put(GridViewCardsAdapter.ARTWORK_PATH, DBAccessHelper.SONG_ALBUM_ART_PATH); mDBColumnsMap.put(GridViewCardsAdapter.FIELD_1, DBAccessHelper.ALBUMS_COUNT); break; case Common.ALBUM_ARTISTS_FRAGMENT: mDBColumnsMap.put(GridViewCardsAdapter.TITLE_TEXT, DBAccessHelper.SONG_ALBUM_ARTIST); mDBColumnsMap.put(GridViewCardsAdapter.SOURCE, DBAccessHelper.SONG_SOURCE); mDBColumnsMap.put(GridViewCardsAdapter.FILE_PATH, DBAccessHelper.SONG_FILE_PATH); mDBColumnsMap.put(GridViewCardsAdapter.ARTWORK_PATH, DBAccessHelper.SONG_ALBUM_ART_PATH); mDBColumnsMap.put(GridViewCardsAdapter.FIELD_1, DBAccessHelper.ALBUMS_COUNT); break; case Common.ALBUMS_FRAGMENT: mDBColumnsMap.put(GridViewCardsAdapter.TITLE_TEXT, DBAccessHelper.SONG_ALBUM); mDBColumnsMap.put(GridViewCardsAdapter.SOURCE, DBAccessHelper.SONG_SOURCE); mDBColumnsMap.put(GridViewCardsAdapter.FILE_PATH, DBAccessHelper.SONG_FILE_PATH); mDBColumnsMap.put(GridViewCardsAdapter.ARTWORK_PATH, DBAccessHelper.SONG_ALBUM_ART_PATH); mDBColumnsMap.put(GridViewCardsAdapter.FIELD_1, DBAccessHelper.SONG_ARTIST); break; case Common.PLAYLISTS_FRAGMENT: break; case Common.GENRES_FRAGMENT: mDBColumnsMap.put(GridViewCardsAdapter.TITLE_TEXT, DBAccessHelper.SONG_GENRE); mDBColumnsMap.put(GridViewCardsAdapter.SOURCE, DBAccessHelper.SONG_SOURCE); mDBColumnsMap.put(GridViewCardsAdapter.FILE_PATH, DBAccessHelper.SONG_FILE_PATH); mDBColumnsMap.put(GridViewCardsAdapter.ARTWORK_PATH, DBAccessHelper.SONG_ALBUM_ART_PATH); mDBColumnsMap.put(GridViewCardsAdapter.FIELD_1, DBAccessHelper.GENRE_SONG_COUNT); break; case Common.FOLDERS_FRAGMENT: break; } } @Override public void onPostExecute(Void result) { super.onPostExecute(result); mHandler.postDelayed(initGridView, 200); } } /** * Runnable that loads the GridView after a set interval. */ private Runnable initGridView = new Runnable() { @Override public void run() { TranslateAnimation animation = new TranslateAnimation(Animation.RELATIVE_TO_SELF, 0.0f, Animation.RELATIVE_TO_SELF, 0.0f, Animation.RELATIVE_TO_SELF, 2.0f, Animation.RELATIVE_TO_SELF, 0.0f); animation.setDuration(150); animation.setInterpolator(new AccelerateDecelerateInterpolator()); mGridViewAdapter = new GridViewCardsAdapter(mContext, mFragment, mDBColumnsMap); //mGridView.setAdapter(mGridViewAdapter); //GridView animation adapter. final SwingBottomInAnimationAdapter animationAdapter = new SwingBottomInAnimationAdapter( mGridViewAdapter, 100, 150); animationAdapter.setShouldAnimate(true); animationAdapter.setShouldAnimateFromPosition(0); animationAdapter.setAbsListView(mGridView); mGridView.setAdapter(animationAdapter); mGridView.setOnItemClickListener(onItemClickListener); //Init the quick scroll widget. mQuickScroll.init(QuickScrollGridView.TYPE_INDICATOR_WITH_HANDLE, mGridView, (GridViewCardsAdapter) mGridViewAdapter, QuickScrollGridView.STYLE_HOLO); int[] quickScrollColors = UIElementsHelper.getQuickScrollColors(mContext); PauseOnScrollHelper scrollHelper = new PauseOnScrollHelper(mApp.getPicasso(), null, false, true); mQuickScroll.setOnScrollListener(scrollHelper); mQuickScroll.setPicassoInstance(mApp.getPicasso()); mQuickScroll.setHandlebarColor(quickScrollColors[0], quickScrollColors[0], quickScrollColors[1]); mQuickScroll.setIndicatorColor(quickScrollColors[1], quickScrollColors[0], quickScrollColors[2]); mQuickScroll.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 48); animation.setAnimationListener(new AnimationListener() { @Override public void onAnimationEnd(Animation arg0) { mQuickScroll.setVisibility(View.VISIBLE); //animationAdapter.setShouldAnimate(false); } @Override public void onAnimationRepeat(Animation arg0) { // TODO Auto-generated method stub } @Override public void onAnimationStart(Animation arg0) { mGridView.setVisibility(View.VISIBLE); } }); mGridView.startAnimation(animation); } }; @Override public void onDestroyView() { super.onDestroyView(); mRootView = null; if (mCursor != null) { mCursor.close(); mCursor = null; } onItemClickListener = null; mGridView = null; mGridViewAdapter = null; mContext = null; mHandler = null; } @SuppressLint("NewApi") @Override public void onResume() { super.onResume(); //Apply the ActionBar title. Not Needed anymore since we are using tabs now. // if(getActivity() instanceof AppCompatActivity) // { // ((AppCompatActivity)getActivity()).getSupportActionBar().setTitle(mFragmentTitle); // }else{ // getActivity().getActionBar().setTitle(mFragmentTitle); // } } /* * Getter methods. */ public GridViewCardsAdapter getGridViewAdapter() { return (GridViewCardsAdapter) mGridViewAdapter; } public GridView getGridView() { return mGridView; } public Cursor getCursor() { return mCursor; } /* * Setter methods. */ public void setCursor(Cursor cursor) { this.mCursor = cursor; } }