package com.maxiee.heartbeat.ui; import android.Manifest; import android.content.Context; import android.content.Intent; import android.content.pm.PackageManager; import android.graphics.PorterDuff; import android.graphics.drawable.Drawable; import android.os.Bundle; import android.support.annotation.DrawableRes; import android.support.design.widget.CoordinatorLayout; import android.support.design.widget.FloatingActionButton; import android.support.design.widget.Snackbar; import android.support.design.widget.TabLayout; import android.support.v4.app.ActivityCompat; import android.support.v4.app.Fragment; import android.support.v4.app.FragmentManager; import android.support.v4.app.FragmentStatePagerAdapter; import android.support.v4.content.ContextCompat; import android.support.v4.content.res.ResourcesCompat; import android.support.v4.view.ViewPager; import android.support.v7.widget.Toolbar; import android.text.SpannableString; import android.text.Spanned; import android.text.style.ImageSpan; import android.util.TypedValue; import android.view.Menu; import android.view.MenuItem; import android.view.View; import com.maxiee.heartbeat.R; import com.maxiee.heartbeat.support.CrashHandler; import com.maxiee.heartbeat.ui.common.BaseActivity; import com.maxiee.heartbeat.ui.common.HintSearchBox; import com.maxiee.heartbeat.ui.fragments.EventListFragment; import com.maxiee.heartbeat.ui.fragments.EventTodayFragment; import com.maxiee.heartbeat.ui.fragments.LabelCloudFragment; import com.maxiee.heartbeat.ui.fragments.StatisticsFragment; import com.quinny898.library.persistentsearch.SearchBox; import com.quinny898.library.persistentsearch.SearchResult; import java.util.ArrayList; import java.util.List; import butterknife.Bind; import butterknife.ButterKnife; public class MainActivity extends BaseActivity { private static final String TAG = MainActivity.class.getSimpleName(); private static final int SEARCH_HISTORY_SIZE = 5; private static final int PERMISSION_REQUEST_STORAGE = 27; @Bind(R.id.toolbar) Toolbar mToolbar; @Bind(R.id.fab) FloatingActionButton mFab; @Bind(R.id.searchbox) HintSearchBox mSearchBox; @Bind(R.id.main_content) CoordinatorLayout mMainContent; private ViewPagerAdapter mViewPagerAdapter; private ArrayList<String> mSearchHistory; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); ButterKnife.bind(this); CrashHandler.register(this); setSupportActionBar(mToolbar); setTitle(""); final ViewPager viewPager = (ViewPager) findViewById(R.id.viewpager); setupViewPager(viewPager); TabLayout tabLayout = (TabLayout) findViewById(R.id.tabs); tabLayout.setupWithViewPager(viewPager); tabLayout.setOnTabSelectedListener(new TabLayout.OnTabSelectedListener() { @Override public void onTabSelected(TabLayout.Tab tab) { viewPager.setCurrentItem(tab.getPosition()); setTitle(mViewPagerAdapter.getFragmentTitle(tab.getPosition())); tab.setContentDescription( mViewPagerAdapter.getPageIcon( tab.getPosition(), getThemeAccentColor(MainActivity.this))); } @Override public void onTabUnselected(TabLayout.Tab tab) { tab.setContentDescription( mViewPagerAdapter.getPageIcon( tab.getPosition(), ContextCompat.getColor(getApplicationContext(), R.color.tab_white_trans) ) ); } @Override public void onTabReselected(TabLayout.Tab tab) { } }); // init TabLayout setTitle(mViewPagerAdapter.getFragmentTitle(0)); tabLayout.getTabAt(0).setContentDescription( mViewPagerAdapter.getPageIcon( 0, getThemeAccentColor(this) ) ); mFab.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Intent i = new Intent(); i.setAction(Intent.ACTION_MAIN); i.setClass(MainActivity.this, AddEventActivity.class); startActivity(i); } }); mSearchHistory = new ArrayList<>(); mSearchBox.setLogoText(getString(R.string.search_hint)); mSearchBox.setSearchListener(new SearchBox.SearchListener() { @Override public void onSearchOpened() { } @Override public void onSearchCleared() { } @Override public void onSearchClosed() { mSearchBox.hideCircularly(MainActivity.this); } @Override public void onSearchTermChanged(String s) { } @Override public void onSearch(String s) { if (mSearchHistory.size() == SEARCH_HISTORY_SIZE) { mSearchHistory.remove(SEARCH_HISTORY_SIZE - 1); } if (!mSearchHistory.contains(s)) { mSearchHistory.add(0, s); } Intent i = new Intent(Intent.ACTION_MAIN); i.setClass(MainActivity.this, SearchResultActivity.class); i.putExtra("search", s); startActivity(i); } @Override public void onResultClick(SearchResult searchResult) { } }); if (ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) { if (ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.WRITE_EXTERNAL_STORAGE)) { showPermissionInfo(); } else { ActivityCompat.requestPermissions(this, new String[] {Manifest.permission.WRITE_EXTERNAL_STORAGE}, PERMISSION_REQUEST_STORAGE); } } } @Override public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) { if (requestCode == PERMISSION_REQUEST_STORAGE) { if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { return; } else { showPermissionInfo(); } } } private void showPermissionInfo() { Snackbar.make(mMainContent, getString(R.string.permission_storage), Snackbar.LENGTH_LONG).show(); } private static int getThemeAccentColor (final Context context) { final TypedValue value = new TypedValue(); context.getTheme().resolveAttribute(R.attr.colorAccent, value, true); return value.data; } private void setupViewPager(ViewPager viewPager) { mViewPagerAdapter = new ViewPagerAdapter(getSupportFragmentManager()); mViewPagerAdapter.addFrag(getString(R.string.event_list), R.drawable.ic_action_reorder); mViewPagerAdapter.addFrag(getString(R.string.today), R.drawable.ic_action_today); mViewPagerAdapter.addFrag(getString(R.string.labelCloud), R.drawable.ic_action_label); mViewPagerAdapter.addFrag(getString(R.string.statistics), R.drawable.ic_action_trending_up); viewPager.setAdapter(mViewPagerAdapter); } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.menu_main, menu); return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { int id = item.getItemId(); //noinspection SimplifiableIfStatement if (id == R.id.action_settings) { Intent i = new Intent(); i.setAction(Intent.ACTION_MAIN); i.setClass(MainActivity.this, SettingsActivity.class); startActivity(i); return true; } if (id == R.id.action_search) { mSearchBox.clearSearchable(); for (String his: mSearchHistory) { mSearchBox.addSearchable( new SearchResult(his, null)); } mSearchBox.revealFromMenuItem(R.id.action_search, this); } if (id == R.id.action_helpcenter) { Intent i = new Intent(this, HelpCenterActivity.class); startActivity(i); } return super.onOptionsItemSelected(item); } private class ViewPagerAdapter extends FragmentStatePagerAdapter { private final List<String> mFragmentTitleList = new ArrayList<>(); private final List<Integer> mFragmentIconList = new ArrayList<>(); public ViewPagerAdapter(FragmentManager fm) { super(fm); } @Override public Fragment getItem(int position) { if (position == 0) return new EventListFragment(); if (position == 1) return new EventTodayFragment(); if (position == 2) return new LabelCloudFragment(); if (position == 3) return new StatisticsFragment(); return null; } @Override public int getCount() { return mFragmentTitleList.size(); } public void addFrag(String title, @DrawableRes int id) { mFragmentTitleList.add(title); mFragmentIconList.add(id); } @Override public CharSequence getPageTitle(int position) { return getPageIcon(position, ContextCompat.getColor(getApplicationContext(), R.color.tab_white_trans)); } public CharSequence getPageIcon(int position, int filterColor) { Drawable image = ResourcesCompat.getDrawable(getResources(), mFragmentIconList.get(position), null); image.setColorFilter(filterColor, PorterDuff.Mode.MULTIPLY); image.setBounds(0, 0, image.getIntrinsicWidth(), image.getIntrinsicHeight()); SpannableString sb = new SpannableString(" "); ImageSpan imageSpan = new ImageSpan(image, ImageSpan.ALIGN_BOTTOM); sb.setSpan(imageSpan, 0, 1, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); return sb; } public String getFragmentTitle(int position) { return mFragmentTitleList.get(position); } } }