Java tutorial
/* * Copyright (c) 2013, Psiphon Inc. * All rights reserved. * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. * */ package ca.psiphon.ploggy; import android.app.ActionBar; import android.app.FragmentTransaction; import android.content.Intent; import android.os.Bundle; import android.support.v4.app.Fragment; import android.support.v4.app.FragmentManager; import android.support.v4.app.FragmentPagerAdapter; import android.support.v4.view.ViewPager; import android.view.Menu; import android.view.MenuInflater; import android.view.MenuItem; import android.view.WindowManager; /** * The main UI screen. * * This activity displays a list of friends, along with a summary of their status. * Users can tab between the friend list and a list of event logs. The Action Bar * menu is populated with the main app actions. * This class subscribes to friend and status events to update displayed data * while in the foreground. */ public class ActivityMain extends ActivitySendIdentityByNfc implements ActionBar.TabListener { private static final String LOG_TAG = "Main Activity"; public static final String ACTION_DISPLAY_MESSAGES = "ca.psiphon.ploggy.action.DISPLAY_MESSAGES"; private int mMessageListTabIndex; private ViewPager mViewPager; private AppTabsPagerAdapter mAppTabsPagerAdapter; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // Create the adapter that will return a fragment for each of the three primary sections // of the app. mAppTabsPagerAdapter = new AppTabsPagerAdapter(getSupportFragmentManager()); final ActionBar actionBar = getActionBar(); actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS); // Specify that the Home/Up button should not be enabled, since there is // no hierarchical parent. actionBar.setHomeButtonEnabled(false); // Set up the ViewPager, attaching the adapter and setting up a listener for when the // user swipes between sections. mViewPager = (ViewPager) findViewById(R.id.pager); mViewPager.setAdapter(mAppTabsPagerAdapter); mViewPager.setOnPageChangeListener(new ViewPager.SimpleOnPageChangeListener() { @Override public void onPageSelected(int position) { // When swiping between different app sections, select the corresponding tab. // We can also use ActionBar.Tab#select() to do this if we have a reference to the // Tab. actionBar.setSelectedNavigationItem(position); } }); actionBar.addTab(actionBar.newTab().setText(R.string.title_self_status_fragment).setTabListener(this)); actionBar.addTab(actionBar.newTab().setText(R.string.title_friend_list_fragment).setTabListener(this)); actionBar.addTab(actionBar.newTab().setText(R.string.title_message_list_fragment).setTabListener(this)); mMessageListTabIndex = 2; if (savedInstanceState != null) { actionBar.setSelectedNavigationItem(savedInstanceState.getInt("currentTab", 0)); } } @Override protected void onSaveInstanceState(Bundle outState) { outState.putInt("currentTab", getActionBar().getSelectedNavigationIndex()); super.onSaveInstanceState(outState); } @Override protected void onResume() { super.onResume(); ActivityGenerateSelf.checkLaunchGenerateSelf(this); // Don't show the keyboard until edit selected getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_HIDDEN); if (getIntent().getAction() != null && getIntent().getAction().equals(ACTION_DISPLAY_MESSAGES)) { getActionBar().setSelectedNavigationItem(mMessageListTabIndex); } } @Override protected void onNewIntent(Intent intent) { setIntent(intent); } @Override public boolean onCreateOptionsMenu(Menu menu) { MenuInflater inflater = getMenuInflater(); inflater.inflate(R.menu.main_activity_actions, menu); return super.onCreateOptionsMenu(menu); } @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case R.id.action_generate_self: startActivity(new Intent(this, ActivityGenerateSelf.class)); return true; case R.id.action_email_self: ExportIdentity.composeEmail(this); return true; case R.id.action_activity_log: startActivity(new Intent(this, ActivityLogEntries.class)); return true; case R.id.action_save_identity_to_file: ExportIdentity.saveIdentityToFile(this); return true; case R.id.action_run_tests: Tests.scheduleComponentTests(); startActivity(new Intent(this, ActivityLogEntries.class)); return true; case R.id.action_settings: startActivity(new Intent(this, ActivitySettings.class)); return true; case R.id.action_quit: stopService(new Intent(this, PloggyService.class)); finish(); return true; default: return super.onOptionsItemSelected(item); } } @Override public void onTabUnselected(ActionBar.Tab tab, FragmentTransaction fragmentTransaction) { } @Override public void onTabSelected(ActionBar.Tab tab, FragmentTransaction fragmentTransaction) { // When the given tab is selected, switch to the corresponding page in the ViewPager. mViewPager.setCurrentItem(tab.getPosition()); } @Override public void onTabReselected(ActionBar.Tab tab, FragmentTransaction fragmentTransaction) { } /** * Returns a fragment corresponding to one of the primary sections of the app. */ public static class AppTabsPagerAdapter extends FragmentPagerAdapter { public AppTabsPagerAdapter(FragmentManager fm) { super(fm); } @Override public Fragment getItem(int i) { switch (i) { case 0: return new FragmentSelfStatusDetails(); case 1: return new FragmentFriendList(); case 2: return new FragmentMessageList(); } assert (false); return null; } @Override public int getCount() { return 3; } } }