package com.laowch.githubtrends.ui; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; import android.os.Bundle; import android.support.design.widget.NavigationView; import android.support.design.widget.TabLayout; import android.support.v4.app.Fragment; import android.support.v4.app.FragmentManager; import android.support.v4.app.FragmentPagerAdapter; import android.support.v4.app.FragmentTransaction; import android.support.v4.content.LocalBroadcastManager; import android.support.v4.view.ViewPager; import android.support.v4.widget.DrawerLayout; import android.support.v7.app.ActionBar; import android.support.v7.widget.Toolbar; import android.view.Gravity; import android.view.LayoutInflater; import android.view.Menu; import android.view.MenuItem; import android.view.View; import android.view.ViewGroup; import android.widget.AdapterView; import android.widget.BaseAdapter; import android.widget.Spinner; import android.widget.TextView; import com.laowch.githubtrends.Constants; import com.laowch.githubtrends.R; import com.laowch.githubtrends.model.Language; import com.laowch.githubtrends.utils.AnalyticsHelper; import com.laowch.githubtrends.utils.IntentUtils; import com.laowch.githubtrends.utils.LanguageHelper; public class MainActivity extends BaseActivity implements ActionBar.TabListener { final BroadcastReceiver languagesChangedReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { updateView(); } }; ViewPager viewPager; DrawerLayout drawerLayout; NavigationView navigationView; LanguagesPagerAdapter mPagerAdapter; TabLayout tabLayout; String mTimeSpan = "daily"; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); setSupportActionBar(toolbar); ActionBar actionBar = getSupportActionBar(); actionBar.setHomeAsUpIndicator(R.drawable.ic_menu_white_24dp); actionBar.setDisplayHomeAsUpEnabled(true); View spinnerContainer = LayoutInflater.from(this).inflate(R.layout.toolbar_spinner, toolbar, false); ActionBar.LayoutParams lp = new ActionBar.LayoutParams( ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT); toolbar.addView(spinnerContainer, lp); SinceSpinnerAdapter spinnerAdapter = new SinceSpinnerAdapter(); Spinner spinner = (Spinner) spinnerContainer.findViewById(R.id.toolbar_spinner); spinner.setAdapter(spinnerAdapter); spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { @Override public void onItemSelected(AdapterView<?> parent, View view, int position, long id) { switch (position) { case 0: // daily mTimeSpan = "daily"; break; case 1: // weekly mTimeSpan = "weekly"; break; case 2: // monthly mTimeSpan = "monthly"; break; } for (int i = 0; i < mPagerAdapter.getCount(); i++) { Fragment fragment = getSupportFragmentManager().findFragmentByTag(mPagerAdapter.getFragmentTag(R.id.pager, i)); if (fragment instanceof RepoListFragment) { if (fragment.isAdded()) { ((RepoListFragment) fragment).updateTimeSpan(mTimeSpan); } } } } @Override public void onNothingSelected(AdapterView<?> parent) { } }); // Get the ViewPager and set it's PagerAdapter so that it can display items viewPager = (ViewPager) findViewById(R.id.pager); mPagerAdapter = new LanguagesPagerAdapter(getSupportFragmentManager()); viewPager.setAdapter(mPagerAdapter); // Give the TabLayout the ViewPager tabLayout = (TabLayout) findViewById(R.id.sliding_tabs); tabLayout.setupWithViewPager(viewPager); drawerLayout = (DrawerLayout) findViewById(R.id.draw_layout); navigationView = (NavigationView) findViewById(R.id.navigation_view); navigationView.setNavigationItemSelectedListener(new NavigationView.OnNavigationItemSelectedListener() { @Override public boolean onNavigationItemSelected(MenuItem menuItem) { switch (menuItem.getItemId()) { case R.id.action_favos: AnalyticsHelper.sendEvent("Main", "Navigation", "Favos", 0l); IntentUtils.openFavos(getContext()); break; case R.id.action_custom: AnalyticsHelper.sendEvent("Main", "Navigation", "LangsCustom", 0l); IntentUtils.openCustomLanguage(getContext()); break; case R.id.action_add: AnalyticsHelper.sendEvent("Main", "Navigation", "LangsAdd", 0l); IntentUtils.openAddLanguage(getContext()); break; case R.id.action_remove: AnalyticsHelper.sendEvent("Main", "Navigation", "LangsRemove", 0l); IntentUtils.openRemoveLanguage(getContext()); break; case R.id.action_theme: AnalyticsHelper.sendEvent("Main", "Navigation", "Theme", 0l); ThemeDialog dialog = new ThemeDialog(); dialog.show(getSupportFragmentManager(), "theme"); break; case R.id.action_about: AnalyticsHelper.sendEvent("Main", "Navigation", "About", 0l); IntentUtils.openAbout(getContext()); break; } drawerLayout.closeDrawer(Gravity.LEFT); return true; } }); IntentFilter languageFilter = new IntentFilter(Constants.ACTION_SELECTED_LANGUAGES_CHANGE); LocalBroadcastManager.getInstance(this).registerReceiver(languagesChangedReceiver, languageFilter); } @Override protected void onDestroy() { super.onDestroy(); LocalBroadcastManager.getInstance(this).unregisterReceiver(languagesChangedReceiver); } @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; } public void updateView() { mPagerAdapter.onLanguagesChange(); tabLayout.setupWithViewPager(viewPager); } @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case R.id.action_custom: IntentUtils.openCustomLanguage(getContext()); AnalyticsHelper.sendEvent("Main", "Menu", "LangsCustom", 0l); return true; case R.id.action_favos: AnalyticsHelper.sendEvent("Main", "Menu", "Favos", 0l); IntentUtils.openFavos(getContext()); return true; case R.id.action_settings: return true; case android.R.id.home: AnalyticsHelper.sendEvent("Main", "Menu", "Drawer", 0l); drawerLayout.openDrawer(Gravity.LEFT); return true; } return super.onOptionsItemSelected(item); } @Override public void onTabSelected(ActionBar.Tab tab, FragmentTransaction fragmentTransaction) { // When the given tab is selected, switch to the corresponding page in // the ViewPager. viewPager.setCurrentItem(tab.getPosition()); } @Override public void onTabUnselected(ActionBar.Tab tab, FragmentTransaction fragmentTransaction) { } @Override public void onTabReselected(ActionBar.Tab tab, FragmentTransaction fragmentTransaction) { } public class SinceSpinnerAdapter extends BaseAdapter { final String[] timeSpanTextArray = new String[]{"Today", "This Week", "This Month"}; @Override public int getCount() { return timeSpanTextArray.length; } @Override public String getItem(int position) { return timeSpanTextArray[position]; } @Override public long getItemId(int position) { return position; } @Override public View getView(int position, View convertView, ViewGroup parent) { View view = convertView != null ? convertView : getLayoutInflater().inflate(R.layout.toolbar_spinner_item_actionbar, parent, false); TextView textView = (TextView) view.findViewById(android.R.id.text1); textView.setText("Trends " + getItem(position)); return view; } @Override public View getDropDownView(int position, View convertView, ViewGroup parent) { View view = convertView != null ? convertView : getLayoutInflater().inflate(R.layout.toolbar_spinner_item_dropdown, parent, false); TextView textView = (TextView) view.findViewById(android.R.id.text1); textView.setText(getItem(position)); return view; } } public class LanguagesPagerAdapter extends FragmentPagerAdapter { Language[] languagesArray; public LanguagesPagerAdapter(FragmentManager fm) { super(fm); languagesArray = LanguageHelper.getInstance().getSelectedLanguages(); } public void onLanguagesChange() { languagesArray = LanguageHelper.getInstance().getSelectedLanguages(); notifyDataSetChanged(); } @Override public Fragment getItem(int position) { return RepoListFragment.newInstance(getContext(), languagesArray[position], mTimeSpan); } @Override public int getCount() { return languagesArray.length; } @Override public CharSequence getPageTitle(int position) { return languagesArray[position].name; } public String getFragmentTag(int viewPagerId, int fragmentPosition) { return "android:switcher:" + viewPagerId + ":" + fragmentPosition; } } @Override public void onBackPressed() { if (drawerLayout.isDrawerOpen(Gravity.LEFT)) { drawerLayout.closeDrawer(Gravity.LEFT); } else { super.onBackPressed(); } } }