package com.arpitonline.freeflow.artbook; import java.util.ArrayList; import android.animation.Animator; import android.animation.Animator.AnimatorListener; import android.content.Intent; import android.graphics.Point; import android.graphics.drawable.Drawable; import android.os.Bundle; import android.support.v4.app.ActionBarDrawerToggle; import android.support.v4.widget.DrawerLayout; import android.util.DebugUtils; import android.util.Log; import android.view.Display; import android.view.Gravity; import android.view.LayoutInflater; import android.view.Menu; import android.view.MenuItem; import android.view.View; import android.view.View.OnClickListener; import android.view.ViewGroup; import android.widget.AdapterView; import android.widget.ArrayAdapter; import android.widget.FrameLayout; import android.widget.ListView; import android.widget.Toast; import com.arpitonline.freeflow.artbook.data.DribbbleDataAdapter; import com.arpitonline.freeflow.artbook.layouts.DribbbleQuiltLayout; import com.arpitonline.freeflow.artbook.models.DribbbleFeed; import com.arpitonline.freeflow.artbook.models.DribbbleFetch; import com.arpitonline.freeflow.artbook.models.Shot; import com.comcast.freeflow.animations.interpolators.EaseInOutQuintInterpolator; import com.comcast.freeflow.core.AbsLayoutContainer; import com.comcast.freeflow.core.AbsLayoutContainer.OnItemClickListener; import com.comcast.freeflow.core.FreeFlowContainer; import com.comcast.freeflow.core.FreeFlowContainer.OnScrollListener; import com.comcast.freeflow.core.FreeFlowItem; import com.comcast.freeflow.layouts.FreeFlowLayout; import com.comcast.freeflow.layouts.VGridLayout; import com.comcast.freeflow.utils.ViewUtils; import com.crashlytics.android.Crashlytics; public class ArtbookActivity extends DetailsCapableActivity implements OnClickListener, android.widget.AdapterView.OnItemClickListener, OnItemClickListener { public static final String TAG = "ArtbookActivity"; private FrameLayout containerFrame; private View loadingIndicator; private FreeFlowContainer container; private VGridLayout grid; private DribbbleQuiltLayout custom; private Shot selectedShot; private DrawerLayout mDrawerLayout; private ListView mDrawerList; private ActionBarDrawerToggle mDrawerToggle; private DribbbleFetch fetch; private int itemsPerPage = 25; private int pageIndex = 1; DribbbleDataAdapter adapter; FreeFlowLayout[] layouts; int currLayoutIndex = 0; protected ViewGroup detailsView; boolean newact; Point size; int columnCount; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); if(!BuildConfig.DEBUG){ Crashlytics.start(this); } setContentView(R.layout.activity_artbook); loadingIndicator = findViewById(R.id.loading); mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout); mDrawerList = (ListView) findViewById(R.id.left_drawer); containerFrame = (FrameLayout) findViewById(R.id.frame); container = (FreeFlowContainer) findViewById(R.id.container); getActionBar().setDisplayHomeAsUpEnabled(true); getActionBar().setHomeButtonEnabled(true); mDrawerToggle = new ActionBarDrawerToggle(this, mDrawerLayout, R.drawable.ic_drawer, R.string.open_drawer, R.string.close_drawer) { public void onDrawerClosed(View view) { invalidateOptionsMenu(); } public void onDrawerOpened(View drawerView) { invalidateOptionsMenu(); } }; mDrawerLayout.setDrawerListener(mDrawerToggle); mDrawerList.setAdapter(new ArrayAdapter<String>(this, R.layout.drawer_list_item, new String[] { "Popular", "Everyone", "Debuts" })); mDrawerList.setOnItemClickListener(this); findViewById(R.id.about_tf).setOnClickListener( new View.OnClickListener() { @Override public void onClick(View v) { Intent about = new Intent(ArtbookActivity.this, AboutActivity.class); startActivity(about); } }); CardIncomingAnimation anim = new CardIncomingAnimation(); anim.animateIndividualCellsSequentially = false; anim.animateAllSetsSequentially = false; anim.oldCellsRemovalAnimationDuration = 300; anim.newCellsAdditionAnimationDurationPerCell = 300; anim.cellPositionTransitionAnimationDuration = 250; container.setLayoutAnimator(anim); Display display = getWindowManager().getDefaultDisplay(); size = new Point(); display.getSize(size); // findViewById(R.id.load_more).setOnClickListener(this); custom = new DribbbleQuiltLayout(){ @Override public int getContentHeight() { int ht = super.getContentHeight(); return ht+200; } }; grid = new VGridLayout(){ @Override public int getContentHeight() { int ht = super.getContentHeight(); return ht+200; } }; columnCount = getResources().getInteger(R.integer.column_count); int itemWidth = size.x / columnCount; VGridLayout.LayoutParams params = new VGridLayout.LayoutParams(itemWidth, (int) (itemWidth * 0.75)); grid.setLayoutParams(params); layouts = new FreeFlowLayout[] { grid, custom }; layoutIcons = new Drawable[]{ getResources().getDrawable(R.drawable.ic_quilt), getResources().getDrawable(R.drawable.grid) }; adapter = new DribbbleDataAdapter(this); container.setLayout(layouts[currLayoutIndex]); container.setOnItemClickListener(this); container.setAdapter(adapter); fetch = new DribbbleFetch(); selectSource(0); newact = getResources().getBoolean(R.bool.start_new_activity); if (newact) { } else { detailsView = (ViewGroup) LayoutInflater.from(this).inflate( R.layout.embedded_details, container, false); detailsView.findViewById(R.id.panel_close).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { closeDetails(true); } }); detailsView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { // trap the event } }); FrameLayout.LayoutParams fl = new FrameLayout.LayoutParams( 2*itemWidth, FrameLayout.LayoutParams.WRAP_CONTENT); fl.gravity = Gravity.RIGHT; detailsView.setLayoutParams(fl); containerFrame.addView(detailsView); detailsView.setVisibility(View.INVISIBLE); } container.addScrollListener(new OnScrollListener() { @Override public void onScroll(FreeFlowContainer container) { if (container.getScrollPercentY() > .95 && !fetch.isLoading()) { pageIndex++; showLoading(); fetch.load(ArtbookActivity.this, DribbbleFetch .getPopularURL(itemsPerPage, pageIndex)); } } }); } private void showLoading() { loadingIndicator.setVisibility(View.VISIBLE); loadingIndicator.setTranslationY(loadingIndicator.getHeight()); loadingIndicator.animate().translationY(0).setDuration(250); } private void hideLoading() { loadingIndicator.animate().translationY(loadingIndicator.getHeight()) .setDuration(250).setListener(new AnimatorListener() { @Override public void onAnimationStart(Animator animation) { // TODO Auto-generated method stub } @Override public void onAnimationRepeat(Animator animation) { // TODO Auto-generated method stub } @Override public void onAnimationEnd(Animator animation) { loadingIndicator.setVisibility(View.GONE); loadingIndicator.animate().setListener(null); } @Override public void onAnimationCancel(Animator animation) { loadingIndicator.setVisibility(View.GONE); loadingIndicator.animate().setListener(null); } }); } private boolean sourceChanged = false; private void selectSource(int idx) { String url = ""; pageIndex = 1; sourceChanged = true; adapter.clear(); switch (idx) { case 0: getActionBar().setTitle("Popular"); url = DribbbleFetch.getPopularURL(itemsPerPage, pageIndex); break; case 1: getActionBar().setTitle("Everyone"); url = DribbbleFetch.getEveryoneURL(itemsPerPage, pageIndex); break; case 2: getActionBar().setTitle("Debuts"); url = DribbbleFetch.getDebutsURL(itemsPerPage, pageIndex); break; } fetch.load(this, url); } public void onDataLoaded(DribbbleFeed feed) { hideLoading(); adapter.update(feed); container.dataInvalidated(sourceChanged); sourceChanged = false; } @Override public boolean onCreateOptionsMenu(Menu menu) { if(areDetailsShowing){ getMenuInflater().inflate(R.menu.main_showing_details, menu); } else{ getMenuInflater().inflate(R.menu.artbook, menu); } return true; } private Drawable[] layoutIcons; @Override public boolean onOptionsItemSelected(MenuItem item) { if (mDrawerToggle.onOptionsItemSelected(item)) { return true; } boolean b = super.onOptionsItemSelected(item); if(b){ return true; } switch (item.getItemId()) { case (R.id.action_change_layout): currLayoutIndex++; if (currLayoutIndex == layouts.length) { currLayoutIndex = 0; } container.setLayout(layouts[currLayoutIndex]); if(layouts[currLayoutIndex] == grid){ Log.d(TAG, "Grid ItemWidth: "+grid.getItemWidth()); } item.setIcon(layoutIcons[currLayoutIndex]); break; default: return super.onOptionsItemSelected(item); } return true; } @Override protected void onPostCreate(Bundle savedInstanceState) { super.onPostCreate(savedInstanceState); mDrawerToggle.syncState(); } @Override public void onClick(View v) { // close clicked closeDetails(true); } private void openDetails(){ if(areDetailsShowing){ return; } areDetailsShowing = true; final int w = size.x - detailsView.getWidth(); ViewGroup.LayoutParams p = container.getLayoutParams(); p.width = w; container.setLayoutParams(p); container.layoutChanged(); detailsView.setVisibility(View.VISIBLE); detailsView.setTranslationY(2 * containerFrame.getHeight()); detailsView.animate().translationY(0) .setDuration(500) .setInterpolator(new EaseInOutQuintInterpolator()); invalidateOptionsMenu(); } private void closeDetails(boolean withAnimation) { if(!areDetailsShowing){ return; } areDetailsShowing = false; ViewGroup.LayoutParams p = container.getLayoutParams(); p.width = size.x; container.setLayoutParams(p); container.layoutChanged(); if(withAnimation){ detailsView.animate().translationY(2 * containerFrame.getHeight()) .setDuration(500) .setInterpolator(new EaseInOutQuintInterpolator()) .setListener(new AnimatorListener() { @Override public void onAnimationStart(Animator animation) { } @Override public void onAnimationRepeat(Animator animation) { } @Override public void onAnimationEnd(Animator animation) { detailsView.setVisibility(View.GONE); detailsView.setTranslationY(0); detailsView.animate().setListener(null); } @Override public void onAnimationCancel(Animator animation) { } }); } else{ detailsView.setVisibility(View.GONE); detailsView.setTranslationY(0); detailsView.animate().setListener(null); } invalidateOptionsMenu(); } @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { selectSource(position); mDrawerLayout.closeDrawers(); } public void onDataFailed() { Toast.makeText(this, "Error loading Dribbble data", Toast.LENGTH_SHORT) .show(); } boolean areDetailsShowing = false; @Override public void onItemClick(AbsLayoutContainer parent, FreeFlowItem proxy) { selectedShot = (Shot) adapter.getSection(0).getDataAtIndex(proxy.itemIndex); if (newact) { Intent intent = new Intent(this, DetailsActivity.class); ArrayList<Shot> shots = new ArrayList<Shot>(); for (int i = 0; i < adapter.getSection(0).getDataCount(); i++) { shots.add((Shot) adapter.getSection(0).getDataAtIndex(i)); } /* set the data on the application. Otherwise you might get a failed * Binder transaction cause the data is too much to send across the * process boundary. */ ((ArtbookApplication)getApplication()).setShots(shots); intent.putExtra("selectedIndex", proxy.itemIndex); startActivity(intent); } else { openDetails(); renderShot(detailsView, selectedShot); } } @Override public void onBackPressed() { if (areDetailsShowing) { closeDetails(true); return; } super.onBackPressed(); } @Override public Shot getSelectedShot() { return this.selectedShot; } }