package se.alexanderblom.delicious.ui; import se.alexanderblom.delicious.R; import se.alexanderblom.delicious.fragments.PostListFragment; import se.alexanderblom.delicious.fragments.TagListFragment; import se.alexanderblom.delicious.view.InterceptLinearLayout; import se.alexanderblom.delicious.view.InterceptLinearLayout.OnInterceptListener; import android.animation.Animator; import android.animation.AnimatorListenerAdapter; import android.app.Fragment; import android.app.FragmentManager; import android.app.FragmentTransaction; import android.graphics.ColorMatrixColorFilter; import android.graphics.Paint; import android.os.Bundle; import android.os.Handler; import android.view.ActionMode; import android.view.Menu; import android.view.MenuInflater; import android.view.MenuItem; import android.view.View; import android.widget.TextView; public class MainActivity extends ContainerActivity { private static final String TAG_LIST = "tag_list"; private FlyoutActionModeCallback flyoutMenuCallback; private ActionMode actionMode = null; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setupFlyout(); } @Override protected int getContentResource() { return R.layout.activity_main; } @Override protected Fragment createFragment(Bundle savedInstanceState) { return PostListFragment.newInstance(null); } @Override public boolean onCreateOptionsMenu(Menu menu) { MenuInflater inflater = getMenuInflater(); inflater.inflate(R.menu.menu_main, menu); return super.onCreateOptionsMenu(menu); } @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case android.R.id.home: showFlyoutMenu(); break; default: return super.onOptionsItemSelected(item); } return true; } public void showFlyoutMenu() { if (actionMode == null) { actionMode = startActionMode(flyoutMenuCallback); } } public void hideFlyoutMenu() { if (actionMode != null) { actionMode.finish(); actionMode = null; } } public void setSelectedPage(int id) { View flyoutView = findViewById(R.id.flyout_menu); TextView recentView = (TextView) flyoutView.findViewById(R.id.page_recent); TextView tagsView = (TextView) flyoutView.findViewById(R.id.page_tags); recentView.setCompoundDrawables(null, null, null, null); tagsView.setCompoundDrawables(null, null, null, null); if (id == R.id.page_recent) { recentView.setCompoundDrawablesWithIntrinsicBounds(0, 0, R.drawable.flyout_item_indicator, 0); } else if (id == R.id.page_tags) { tagsView.setCompoundDrawablesWithIntrinsicBounds(0, 0, R.drawable.flyout_item_indicator, 0); } } private void setupFlyout() { flyoutMenuCallback = new FlyoutActionModeCallback(); View flyoutView = findViewById(R.id.flyout_menu); TextView recentView = (TextView) flyoutView.findViewById(R.id.page_recent); TextView tagsView = (TextView) flyoutView.findViewById(R.id.page_tags); recentView.setOnClickListener(flyoutMenuCallback); tagsView.setOnClickListener(flyoutMenuCallback); final InterceptLinearLayout interceptView = (InterceptLinearLayout) findViewById(R.id.container); interceptView.setOnInterceptListener(new OnInterceptListener() { @Override public boolean isFlyoutOpen() { return actionMode != null; } @Override public void shouldOpen() { showFlyoutMenu(); } @Override public void shouldClose() { hideFlyoutMenu(); } }); } private class FlyoutActionModeCallback implements ActionMode.Callback, View.OnClickListener { private static final float ALPHA = 0.6f; private Handler handler; private Paint contentPaint; public FlyoutActionModeCallback() { handler = new Handler(); contentPaint = new Paint(); // This will desaturate colors float[] transform = { 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0 }; ColorMatrixColorFilter filter = new ColorMatrixColorFilter(transform); contentPaint.setColorFilter(filter); } @Override public boolean onPrepareActionMode(ActionMode mode, Menu menu) { return false; } @Override public boolean onCreateActionMode(ActionMode mode, Menu menu) { mode.setTitle(R.string.menu_title); final View flyoutView = findViewById(R.id.flyout_menu); final View containerView = findViewById(R.id.container); int width = flyoutView.getWidth(); flyoutView.animate().translationX(0f).setListener(new AnimatorListenerAdapter() { @Override public void onAnimationStart(Animator animation) { flyoutView.setLayerType(View.LAYER_TYPE_HARDWARE, null); flyoutView.setVisibility(View.VISIBLE); } @Override public void onAnimationEnd(Animator animation) { flyoutView.setLayerType(View.LAYER_TYPE_NONE, null); } }); containerView.animate().translationX(width).alpha(ALPHA).setListener(new AnimatorListenerAdapter() { @Override public void onAnimationStart(Animator animation) { containerView.setLayerType(View.LAYER_TYPE_HARDWARE, contentPaint); } }); return true; } @Override public void onDestroyActionMode(ActionMode mode) { final View flyoutView = findViewById(R.id.flyout_menu); final View containerView = findViewById(R.id.container); int width = flyoutView.getWidth(); flyoutView.animate().translationX(-width).setListener(new AnimatorListenerAdapter() { @Override public void onAnimationStart(Animator animation) { flyoutView.setLayerType(View.LAYER_TYPE_HARDWARE, null); } @Override public void onAnimationEnd(Animator animation) { flyoutView.setLayerType(View.LAYER_TYPE_NONE, null); flyoutView.setVisibility(View.INVISIBLE); } }); containerView.animate().translationX(0f).alpha(1f).setListener(new AnimatorListenerAdapter() { @Override public void onAnimationEnd(Animator animation) { containerView.setLayerType(View.LAYER_TYPE_NONE, null); } }); actionMode = null; } @Override public boolean onActionItemClicked(ActionMode mode, MenuItem item) { return false; } /** * Called when the user clicks a flyout menu option */ @Override public void onClick(View v) { int id = v.getId(); handler.postDelayed(new PageSwitcher(id), 300); if (actionMode != null) { actionMode.finish(); } } private class PageSwitcher implements Runnable { private int id; public PageSwitcher(int id) { this.id = id; } @Override public void run() { switch (id) { case R.id.page_recent: getFragmentManager().popBackStack(TAG_LIST, FragmentManager.POP_BACK_STACK_INCLUSIVE); break; case R.id.page_tags: FragmentManager fm = getFragmentManager(); if (!fm.popBackStackImmediate(TAG_LIST, 0) && fm.findFragmentByTag(TAG_LIST) == null) { // Only add tag list if we can't find it fm.beginTransaction() .replace(R.id.content, new TagListFragment(), TAG_LIST) .setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE) .addToBackStack(TAG_LIST) .commit(); } break; } } } } }