Java tutorial
/* DroidBeard - a free, open-source Android app for managing SickBeard Copyright (C) 2014-2015 Robert Carr 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 com.rastating.droidbeard; import android.app.Activity; import android.app.ActionBar; import android.app.AlertDialog; import android.app.Fragment; import android.app.FragmentManager; import android.app.ProgressDialog; import android.content.DialogInterface; import android.content.Intent; import android.content.SharedPreferences; import android.os.Bundle; import android.view.Menu; import android.view.MenuItem; import android.support.v4.widget.DrawerLayout; import android.view.View; import com.github.clans.fab.FloatingActionMenu; import com.rastating.droidbeard.fragments.ComingEpisodesFragment; import com.rastating.droidbeard.fragments.DroidbeardFragment; import com.rastating.droidbeard.fragments.HistoryFragment; import com.rastating.droidbeard.fragments.InvalidAddressFragment; import com.rastating.droidbeard.fragments.LogFragment; import com.rastating.droidbeard.fragments.NavigationDrawerFragment; import com.rastating.droidbeard.fragments.PreferencesFragment; import com.rastating.droidbeard.fragments.ProfilesFragment; import com.rastating.droidbeard.fragments.SetupFragment; import com.rastating.droidbeard.fragments.ShowFragment; import com.rastating.droidbeard.fragments.ShowsFragment; import com.rastating.droidbeard.net.ApiResponseListener; import com.rastating.droidbeard.net.RestartTask; import com.rastating.droidbeard.net.ShutdownTask; import com.rastating.droidbeard.net.SickbeardAsyncTask; import java.net.URI; public class MainActivity extends Activity implements NavigationDrawerFragment.NavigationDrawerCallbacks, SharedPreferences.OnSharedPreferenceChangeListener { private Fragment mCurrentFragment; private NavigationDrawerFragment mNavigationDrawerFragment; private ShowsFragment mShowsFragment; private ComingEpisodesFragment mComingEpisodesFragment; private CharSequence mTitle; private FloatingActionMenu floatingActionsMenu; private Fragment getCurrentFragment() { return mCurrentFragment; } public void setCurrentFragment(Fragment value) { mCurrentFragment = value; } @Override public void onBackPressed() { if (getCurrentFragment() == null || !(getCurrentFragment() instanceof DroidbeardFragment)) { if (getCurrentFragment() instanceof PreferencesFragment) { mNavigationDrawerFragment.selectItem(0, true); } else { super.onBackPressed(); } } else { DroidbeardFragment fragment = (DroidbeardFragment) getCurrentFragment(); if (fragment.onBackPressed()) { if (fragment instanceof ShowFragment) { if (((ShowFragment) fragment).shouldReturnToUpcomingEpisodes()) { mNavigationDrawerFragment.selectItem(1, true); } else { mNavigationDrawerFragment.selectItem(0, true); } } else { super.onBackPressed(); } } } } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); setFloatingActionButton(); mNavigationDrawerFragment = (NavigationDrawerFragment) getFragmentManager() .findFragmentById(R.id.navigation_drawer); if (mTitle == null) { mTitle = getTitle(); } // Set up the drawer. mNavigationDrawerFragment.setUp(R.id.navigation_drawer, (DrawerLayout) findViewById(R.id.drawer_layout)); if (floatingActionsMenu != null) { if (mCurrentFragment instanceof ShowsFragment) { floatingActionsMenu.setVisibility(View.VISIBLE); ((ShowsFragment) mCurrentFragment).setFloatingActionMenu(floatingActionsMenu); } else { floatingActionsMenu.setVisibility(View.INVISIBLE); } } } private boolean isUrlValid(String url) { try { URI uri = URI.create(url); return true; } catch (Exception e) { return false; } } @Override public void onNavigationDrawerItemSelected(int position) { Fragment fragment = null; Preferences preferences = new Preferences(this); String sickbeardUrl = preferences.getSickbeardUrl(); boolean hasUrl = sickbeardUrl != null && sickbeardUrl.length() > 0; boolean hasApiKey = preferences.getApiKey() != null && preferences.getApiKey().length() > 0; if ((!hasUrl || !hasApiKey) && position != 4 && position != 99) { fragment = new SetupFragment(); } else if (!isUrlValid(sickbeardUrl) && position != 99 && position != 4) { fragment = new InvalidAddressFragment(); } else if (position == 0) { if (mShowsFragment == null) { mShowsFragment = new ShowsFragment(); } fragment = mShowsFragment; } else if (position == 1) { if (mComingEpisodesFragment == null) { mComingEpisodesFragment = new ComingEpisodesFragment(); } fragment = mComingEpisodesFragment; } else if (position == 2) { fragment = new HistoryFragment(); } else if (position == 3) { fragment = new LogFragment(); } else if (position == 4) { fragment = new ProfilesFragment(); } else if (position == 5) { onNavigationDrawerItemSelected(99); setTitle(getString(R.string.action_settings)); } else if (position == 99) { fragment = new PreferencesFragment(); } if (fragment != null) { FragmentManager manager = this.getFragmentManager(); manager.beginTransaction().replace(R.id.container, fragment).commit(); setCurrentFragment(fragment); if (floatingActionsMenu != null) { if (fragment instanceof ShowsFragment) { floatingActionsMenu.setVisibility(View.VISIBLE); ((ShowsFragment) fragment).setFloatingActionMenu(floatingActionsMenu); } else { floatingActionsMenu.setVisibility(View.INVISIBLE); } } } } public void restoreActionBar() { ActionBar actionBar = getActionBar(); actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_STANDARD); actionBar.setDisplayShowTitleEnabled(true); if (mTitle != null) { actionBar.setTitle(mTitle); } } public void setTitle(String value) { mTitle = value; restoreActionBar(); } @Override public boolean onCreateOptionsMenu(Menu menu) { if (!mNavigationDrawerFragment.isDrawerOpen()) { // Only show items in the action bar relevant to this screen // if the drawer is not showing. Otherwise, let the drawer // decide what to show in the action bar. getMenuInflater().inflate(R.menu.main, menu); restoreActionBar(); return true; } return super.onCreateOptionsMenu(menu); } @Override public boolean onOptionsItemSelected(MenuItem item) { // Handle action bar item clicks here. The action bar will // automatically handle clicks on the Home/Up button, so long // as you specify a parent activity in AndroidManifest.xml. int id = item.getItemId(); if (id == R.id.action_power) { shutdownSickbeard(); } else if (id == R.id.action_restart) { restartSickbeard(true); } else if (id == R.id.action_about) { startActivity(new Intent(this, AboutActivity.class)); } return super.onOptionsItemSelected(item); } private void shutdownSickbeard() { shutdownSickbeard(true); } private void shutdownSickbeard(boolean prompt) { if (prompt) { AlertDialog.Builder builder = new AlertDialog.Builder(this); builder.setTitle("Confirmation").setMessage("Are you sure you want to shutdown SickBeard?") .setCancelable(true).setPositiveButton("Yes", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialogInterface, int i) { shutdownSickbeard(false); } }).setNegativeButton("No", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialogInterface, int i) { dialogInterface.dismiss(); } }).create().show(); } else { ShutdownTask task = new ShutdownTask(this); task.addResponseListener(new ApiResponseListener<Boolean>() { @Override public void onApiRequestFinished(SickbeardAsyncTask sender, Boolean result) { finish(); } }); task.start(); } } private void restartSickbeard(boolean prompt) { if (prompt) { AlertDialog.Builder builder = new AlertDialog.Builder(this); builder.setTitle("Confirmation").setMessage("Are you sure you want to restart SickBeard?") .setCancelable(true).setPositiveButton("Yes", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialogInterface, int i) { restartSickbeard(false); } }).setNegativeButton("No", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialogInterface, int i) { dialogInterface.dismiss(); } }).create().show(); } else { final ProgressDialog dialog = new ProgressDialog(this); dialog.setTitle("Restarting"); dialog.setMessage("Please wait..."); dialog.setCancelable(false); dialog.setIndeterminate(true); dialog.show(); RestartTask task = new RestartTask(this); task.addResponseListener(new ApiResponseListener<Boolean>() { @Override public void onApiRequestFinished(SickbeardAsyncTask sender, Boolean result) { dialog.dismiss(); } }); task.start(); } } @Override public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String s) { invalidateFragmentCache(); } public void invalidateFragmentCache() { mShowsFragment = null; mComingEpisodesFragment = null; } public void setFloatingActionButton() { floatingActionsMenu = (FloatingActionMenu) findViewById(R.id.floating_action_menu); floatingActionsMenu.setOnMenuToggleListener(new FloatingActionMenu.OnMenuToggleListener() { @Override public void onMenuToggle(boolean b) { floatingActionsMenu.close(true); if (b) { startActivity(new Intent(getApplicationContext(), ShowSearch.class)); } } }); } public void displayAndRefreshShowsFragment() { Bundle bundle = new Bundle(); bundle.putBoolean("resetAdapter", true); mShowsFragment = new ShowsFragment(); mShowsFragment.setArguments(bundle); FragmentManager manager = this.getFragmentManager(); manager.beginTransaction().replace(R.id.container, mShowsFragment).commit(); setCurrentFragment(mShowsFragment); } }