package fr.tvbarthel.apps.sayitfromthesky.activities;
import android.app.ActionBar;
import android.app.Activity;
import android.app.LoaderManager;
import android.content.CursorLoader;
import android.content.Intent;
import android.content.Loader;
import android.database.Cursor;
import android.os.Bundle;
import android.text.SpannableString;
import android.text.Spanned;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewTreeObserver;
import android.widget.AbsListView;
import android.widget.AdapterView;
import android.widget.ListView;
import butterknife.ButterKnife;
import butterknife.InjectView;
import butterknife.OnClick;
import fr.tvbarthel.apps.sayitfromthesky.R;
import fr.tvbarthel.apps.sayitfromthesky.adapters.DrawingAdapter;
import fr.tvbarthel.apps.sayitfromthesky.fragments.dialogs.AboutDialog;
import fr.tvbarthel.apps.sayitfromthesky.helpers.ActionBarHelper;
import fr.tvbarthel.apps.sayitfromthesky.helpers.CursorHelper;
import fr.tvbarthel.apps.sayitfromthesky.helpers.ViewHelper;
import fr.tvbarthel.apps.sayitfromthesky.models.Drawing;
import fr.tvbarthel.apps.sayitfromthesky.providers.contracts.DrawingContract;
import fr.tvbarthel.apps.sayitfromthesky.ui.AlphaForegroundColorSpan;
public class MainActivity extends Activity implements LoaderManager.LoaderCallbacks<Cursor> {
private static final int LOADER_ID_DRAWINGS = 10;
/**
* Injected Views
*/
@InjectView(R.id.activity_main_root)
View mRootView;
@InjectView(R.id.activity_main_header_logo)
View mHeaderLogo;
@InjectView(R.id.activity_main_header_container)
View mHeaderContainer;
@InjectView(R.id.activity_main_list_view)
ListView mListView;
@InjectView(R.id.activity_main_empty_view)
View mEmptyView;
@InjectView(R.id.activity_main_btn_new_drawing)
View mBtnNewDrawing;
/**
* Private attributes
*/
private int mActionBarSize;
private DrawingAdapter mDrawingAdapter;
private AlphaForegroundColorSpan mActionBarTitleColorSpan;
private SpannableString mActionBarTitleSpannable;
private int mHeaderLogoMaxTranslationX;
private float mHeaderLogoFinalScale;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ButterKnife.inject(this);
mActionBarTitleColorSpan = new AlphaForegroundColorSpan(getResources().getColor(R.color.material_grey_300));
mActionBarTitleSpannable = new SpannableString(getString(R.string.app_name));
setActionBarTitleAlpha(1);
// Compute the action bar size
mActionBarSize = ActionBarHelper.getActionBarSize(this);
// Set the height of the header container to 1/3.5 of the root height.
ViewTreeObserver vto = mRootView.getViewTreeObserver();
if (vto.isAlive()) {
vto.addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
ViewHelper.removeOnGlobalLayoutListener(mRootView, this);
final int headerHeight = (int) (mRootView.getHeight() / 3.5);
mHeaderContainer.getLayoutParams().height = headerHeight;
mListView.setPadding(0, headerHeight - mActionBarSize, 0, 0);
final int actionBarLogoSize = getResources().getDimensionPixelSize(R.dimen.action_bar_logo_size);
final int actionBarMarginLeft = getResources().getDimensionPixelOffset(R.dimen.action_bar_margin_left);
mHeaderLogoMaxTranslationX = (mHeaderContainer.getWidth() - actionBarLogoSize) / 2 - actionBarMarginLeft;
mHeaderLogoFinalScale = ((float) actionBarLogoSize) / mHeaderLogo.getWidth();
}
});
}
mDrawingAdapter = new DrawingAdapter(this);
initListView();
getLoaderManager().initLoader(LOADER_ID_DRAWINGS, null, this);
ViewHelper.slideFromBottom(mBtnNewDrawing);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.global, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
int id = item.getItemId();
if (id == R.id.action_settings) {
return true;
} else if (id == R.id.action_about) {
new AboutDialog().show(getFragmentManager(), null);
return true;
} else if (id == R.id.action_licenses) {
startActivity(new Intent(this, LicensesActivity.class));
return true;
}
return super.onOptionsItemSelected(item);
}
@OnClick({R.id.activity_main_btn_new_drawing})
public void startNewDrawing() {
startActivity(new Intent(this, DrawingActivity.class));
}
/**
* Initialize the ListView.
* <p/>
* Set the onScrollListener.
* Set the Adapter.
* Set the empty view.
*/
private void initListView() {
mListView.setOnScrollListener(new AbsListView.OnScrollListener() {
@Override
public void onScrollStateChanged(AbsListView view, int scrollState) {
}
@Override
public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
if (visibleItemCount > 0 && firstVisibleItem == 0) {
final int realTop = Math.max(mListView.getChildAt(0).getTop(), 0);
final int translationY = (realTop - mListView.getPaddingTop()) / 2;
mHeaderContainer.setTranslationY(translationY);
final float scrollingPercent = ((float) realTop) / mListView.getPaddingTop();
setActionBarTitleAlpha(1 - scrollingPercent);
final float headerLogoTranslationX = (float) Math.pow(scrollingPercent, 3)
* mHeaderLogoMaxTranslationX - mHeaderLogoMaxTranslationX;
mHeaderLogo.setTranslationX(headerLogoTranslationX);
final float currentScale = 1 - (1 - mHeaderLogoFinalScale) * (1 - scrollingPercent);
mHeaderLogo.setScaleX(currentScale);
mHeaderLogo.setScaleY(currentScale);
} else {
mHeaderContainer.setTranslationY(-mListView.getPaddingTop() / 2);
setActionBarTitleAlpha(1);
mHeaderLogo.setTranslationX(-mHeaderLogoMaxTranslationX);
mHeaderLogo.setScaleX(mHeaderLogoFinalScale);
mHeaderLogo.setScaleY(mHeaderLogoFinalScale);
}
}
});
mListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
final Cursor cursor = (Cursor) mDrawingAdapter.getItem(position);
if (cursor != null) {
final Drawing drawingClicked = CursorHelper.cursorToDrawing(cursor);
final Intent intent = new Intent(MainActivity.this, DrawingViewerActivity.class);
intent.putExtra(DrawingViewerActivity.EXTRA_KEY_DRAWING, drawingClicked);
startActivity(intent);
}
}
});
mListView.setAdapter(mDrawingAdapter);
mListView.setEmptyView(mEmptyView);
}
@Override
public Loader<Cursor> onCreateLoader(int loaderId, Bundle bundle) {
if (loaderId == LOADER_ID_DRAWINGS) return createDrawingLoader();
return null;
}
@Override
public void onLoadFinished(Loader<Cursor> cursorLoader, Cursor cursor) {
final int loaderId = cursorLoader.getId();
if (loaderId == LOADER_ID_DRAWINGS) finishDrawingLoading(cursor);
}
@Override
public void onLoaderReset(Loader<Cursor> cursorLoader) {
final int loaderId = cursorLoader.getId();
if (loaderId == LOADER_ID_DRAWINGS) resetDrawingLoader();
}
/**
* Create a {@link android.support.v4.content.Loader} for the drawings.
*
* @return a Loader<Cursor>
*/
private Loader<Cursor> createDrawingLoader() {
return new CursorLoader(this, DrawingContract.CONTENT_URI, null, null, null, DrawingContract.Columns.COLUMN_CREATION_TIME + " DESC");
}
/**
* Finish to load the drawings.
*
* @param cursor a {@link android.database.Cursor} that represents the drawings to be loaded.
*/
private void finishDrawingLoading(Cursor cursor) {
mDrawingAdapter.swapCursor(cursor);
}
/**
* Reset the loader of the drawings.
*/
private void resetDrawingLoader() {
mDrawingAdapter.swapCursor(null);
}
/**
* Set the alpha of the action bar title.
*
* @param alpha a value between 0 and 1 that represents the alpha of the action bar title.
*/
private void setActionBarTitleAlpha(float alpha) {
final ActionBar actionBar = getActionBar();
if (actionBar != null) {
mActionBarTitleColorSpan.setAlpha(alpha);
mActionBarTitleSpannable.setSpan(mActionBarTitleColorSpan, 0,
mActionBarTitleSpannable.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
actionBar.setTitle(mActionBarTitleSpannable);
}
}
}