Java tutorial
/** Copyright 2012 Fahad Al-Khameesi, Madeleine Appert, Niklas Logren, Arild Matsson and Jonathan Orr. This file is part of Bibbla. Bibbla 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. Bibbla 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 Bibbla. If not, see <http://www.gnu.org/licenses/>. **/ package dat255.grupp06.bibbla; import android.content.Context; import android.content.Intent; import android.content.SharedPreferences; import android.os.Bundle; import android.support.v4.app.FragmentTransaction; import android.view.View; import android.view.inputmethod.InputMethodManager; import com.actionbarsherlock.app.ActionBar; import com.actionbarsherlock.app.ActionBar.Tab; import com.actionbarsherlock.app.SherlockFragmentActivity; import com.actionbarsherlock.view.Window; import dat255.grupp06.bibbla.backend.BackendFactory; import dat255.grupp06.bibbla.backend.IBackend; import dat255.grupp06.bibbla.fragments.LibraryFragment; import dat255.grupp06.bibbla.fragments.ProfileFragment; import dat255.grupp06.bibbla.fragments.SearchFragment; import dat255.grupp06.bibbla.frontend.LoginCallbackHandler; import dat255.grupp06.bibbla.frontend.LoginOverlayActivity; import dat255.grupp06.bibbla.model.Credentials; import dat255.grupp06.bibbla.utils.Callback; import dat255.grupp06.bibbla.utils.Message; public class MainActivity extends SherlockFragmentActivity implements ActionBar.TabListener, LoginCallbackHandler { private IBackend backend; public static final int RESULT_LOGIN_FORM = 0; public static final String EXTRA_CREDENTIALS = "credentials"; SearchFragment searchFragment; ProfileFragment profileFragment; LibraryFragment libraryFragment; private Callback loginDoneCallback; ActionBar.Tab searchTab; @Override public void onCreate(Bundle savedInstanceState) { setTheme(com.actionbarsherlock.R.style.Theme_Sherlock); //Used for theme switching in samples super.onCreate(savedInstanceState); // We want a fancy spinner for marking progress. requestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS); setContentView(R.layout.activity_main); backend = BackendFactory.getBackend(); // Hide progress bar by default. setSupportProgressBarIndeterminateVisibility(false); getSupportActionBar().setNavigationMode(ActionBar.NAVIGATION_MODE_TABS); getSupportActionBar().setDisplayShowTitleEnabled(false); getSupportActionBar().setDisplayShowHomeEnabled(false); //Create the tabs searchTab = getSupportActionBar().newTab(); ActionBar.Tab profileTab = getSupportActionBar().newTab(); ActionBar.Tab libraryTab = getSupportActionBar().newTab(); //Set tab properties searchTab.setContentDescription("Sk"); searchTab.setIcon(R.drawable.search_icon); searchTab.setTabListener(this); profileTab.setContentDescription("Ln"); profileTab.setIcon(R.drawable.profile_icon); profileTab.setTabListener(this); libraryTab.setContentDescription("Bibliotek"); libraryTab.setIcon(R.drawable.lib_icon); libraryTab.setTabListener(this); //Add the tabs to the action bar getSupportActionBar().addTab(searchTab); getSupportActionBar().addTab(profileTab); getSupportActionBar().addTab(libraryTab); SharedPreferences sharedPreferences = getPreferences(MODE_PRIVATE); String card = sharedPreferences.getString("card", ""); String pin = sharedPreferences.getString("pin", ""); String name = sharedPreferences.getString("name", ""); backend.saveCredentials(new Credentials(name, card, pin)); } @Override public void onResume() { super.onResume(); // Nothing atm } /** * {@inheritdoc} * * This is called when a user is done with LoginOverlayActivity. Saves the * specified credentials and tells Backend to log in. * @param data should contain a Credentials object as an Extra, identified * by LoginManager.EXTRA_CREDENTIALS */ @Override public void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if (resultCode == RESULT_CANCELED) { profileFragment.setDontLogin(true); } switch (requestCode) { case RESULT_LOGIN_FORM: // Get credentials if (resultCode != RESULT_CANCELED) { Credentials cred = (Credentials) data.getSerializableExtra(EXTRA_CREDENTIALS); if (cred == null) { // Retry login form (recursive) showCredentialsDialog(loginDoneCallback); } else { this.saveCredentials(cred); backend.saveCredentials(cred); profileFragment.setDontGetCachedBooks(true); } } loginDoneCallback.handleMessage(new Message()); // The callback should not be handled more than once. loginDoneCallback = null; break; default: throw new IllegalArgumentException("onActivityResult was called " + "with an unknown request code"); } } /** * Saves the credentials to shared preferences * @param cred - The credentials ot be saved */ private void saveCredentials(Credentials cred) { SharedPreferences sharedPreferences = getPreferences(MODE_PRIVATE); SharedPreferences.Editor editor = sharedPreferences.edit(); editor.putString("name", cred.name); editor.putString("card", cred.card); editor.putString("pin", cred.pin); editor.commit(); } @Override public void onTabSelected(final Tab tab, final FragmentTransaction ft) { // TODO Refactor to eliminate duplicate code? switch (tab.getPosition()) { case 0: if (searchFragment == null) { searchFragment = new SearchFragment(); ft.add(R.id.fragment_container, searchFragment); } else { ft.attach(searchFragment); profileFragment.setDontLogin(false); } break; case 1: if (profileFragment == null) { profileFragment = new ProfileFragment(); ft.add(R.id.fragment_container, profileFragment); } else { ft.attach(profileFragment); } break; case 2: if (libraryFragment == null) { libraryFragment = new LibraryFragment(); libraryFragment.setBackend(backend); ft.add(R.id.fragment_container, libraryFragment); } else { ft.attach(libraryFragment); profileFragment.setDontLogin(false); } break; } } @Override public void onTabUnselected(Tab tab, FragmentTransaction ft) { // Hide keyboard and spinner hideKeyboard(); setSupportProgressBarIndeterminateVisibility(false); // Detach the correct fragment. switch (tab.getPosition()) { case 0: ft.detach(searchFragment); break; case 1: ft.detach(profileFragment); profileFragment.cancelUpdate(); break; case 2: ft.detach(libraryFragment); break; } } @Override public void onTabReselected(Tab tab, FragmentTransaction ft) { } /** * Logs out and switches to the Search fragment. * @param view */ public void logout(View view) { this.emptyPrefernces(); backend.logOut(); profileFragment.setDontGetCachedBooks(true); getSupportActionBar().selectTab(searchTab); } /** * The method name says is it all. */ private void emptyPrefernces() { SharedPreferences sharedPreferences = getPreferences(MODE_PRIVATE); SharedPreferences.Editor editor = sharedPreferences.edit(); editor.putString("name", ""); editor.putString("card", ""); editor.putString("pin", ""); editor.commit(); } /** * Is called when the Search button is clicked. * @param view - The view the click came from. */ public void searchClicked(View view) { hideKeyboard(); searchFragment.searchClicked(); } /** * Tunnel method from searchListFragment to searchFragment * @param page - what page to fetch * @param searchString - what to search for */ public void moreSearchResultsClicked(int page, String searchString) { searchFragment.getMoreSearchResults(page, searchString); } /** * Hides the virtual keyboard. */ private void hideKeyboard() { InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE); imm.hideSoftInputFromWindow(findViewById(android.R.id.content).getWindowToken(), 0); } @Override public void showCredentialsDialog(Callback callback) { this.loginDoneCallback = callback; Intent intent = new Intent(this, LoginOverlayActivity.class); startActivityForResult(intent, RESULT_LOGIN_FORM); } /** * Selects the search tab */ public void selectSearchTab() { getSupportActionBar().selectTab(searchTab); } }