Java tutorial
/* * Copyright (C) 2011-2012 Dominik Schrmann <dominik@dominikschuermann.de> * * This file is part of AdAway. * * AdAway 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. * * AdAway 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 AdAway. If not, see <http://www.gnu.org/licenses/>. * */ package org.adaway.ui; import android.content.Intent; import android.content.pm.PackageInfo; import android.content.pm.PackageManager; import android.content.res.Configuration; import android.net.Uri; import android.os.Bundle; import android.support.v4.app.Fragment; import android.support.v4.app.FragmentManager; import android.support.v4.app.FragmentTransaction; import android.support.v4.widget.DrawerLayout; import android.support.v7.app.ActionBar; import android.support.v7.app.ActionBarDrawerToggle; import android.support.v7.app.AlertDialog; import android.support.v7.app.AppCompatActivity; import android.view.MenuItem; import android.view.View; import android.widget.ArrayAdapter; import android.widget.ListView; import android.widget.TextView; import org.adaway.R; import org.adaway.helper.NotificationHelper; import org.adaway.helper.ThemeHelper; import org.adaway.ui.adware.AdwareFragment; import org.adaway.ui.help.HelpActivity; import org.adaway.ui.home.HomeFragment; import org.adaway.ui.hosts.HostsSourcesFragment; import org.adaway.ui.hostscontent.HostsContentFragment; import org.adaway.ui.lists.ListsFragment; import org.adaway.ui.prefs.PrefsFragment; import org.adaway.ui.tcpdump.TcpdumpFragment; import org.adaway.util.Constants; import org.adaway.util.Log; /** * This class is the application main activity. * * @author Bruce BUJON (bruce.bujon(at)gmail(dot)com) */ public class MainActivity extends AppCompatActivity { /** * The back stack state name of the secondary fragment. * ({@link HomeFragment} is always the primary fragment.) */ public static final String STACK_STATE_NAME = "secondary-fragment"; /** * The selected menu item key for saved instance {@link Bundle}. */ public static final String SELECTED_MENU_ITEM_KEY = "SELECTED_MENU_ITEM"; /** * The project link. */ private static final String PROJECT_LINK = "https://github.com/AdAway/AdAway"; /** * The support link. */ private static final String SUPPORT_LINK = "https://paypal.me/BruceBUJON"; /* * Application navigation related. */ /** * The navigation drawer layout. */ private DrawerLayout mDrawerLayout; /** * The navigation drawer toggle. */ private ActionBarDrawerToggle mDrawerToggle; /** * The navigation drawer. */ private View mDrawer; /** * The navigation drawer list. */ private ListView mDrawerList; /** * The activity title. */ private CharSequence mTitle; /** * The navigation drawer title. */ private CharSequence mDrawerTitle; /** * The position of selected menu item of drawer list. */ private int mSelectedMenuItem; /** * Instantiate View and initialize fragments for this Activity */ @Override protected void onCreate(final Bundle savedInstanceState) { super.onCreate(savedInstanceState); ThemeHelper.applyTheme(this); NotificationHelper.clearUpdateHostsNotification(this); setContentView(R.layout.base_activity_drawer); /* * Configure navigation drawer. */ this.mDrawer = this.findViewById(R.id.left_drawer); // Configure drawer items String[] drawerItems = getResources().getStringArray(R.array.drawer_items); this.mDrawerList = this.findViewById(R.id.left_drawer_list); this.mDrawerList.setAdapter(new ArrayAdapter<>(this, R.layout.drawer_list_item, drawerItems)); // Set drawer item listener this.mDrawerList.setOnItemClickListener((parent, view, position, id) -> selectDrawerMenuItem(position)); // Configure drawer toggle this.mTitle = this.mDrawerTitle = this.getTitle(); this.mSelectedMenuItem = 0; this.mDrawerLayout = this.findViewById(R.id.drawer_layout); this.mDrawerToggle = new ActionBarDrawerToggle(this, /* host Activity */ this.mDrawerLayout, /* DrawerLayout object */ R.string.drawer_open, /* "open drawer" description */ R.string.drawer_close /* "close drawer" description */ ) { /** Called when a drawer has settled in a completely closed state. */ @Override public void onDrawerClosed(View view) { super.onDrawerClosed(view); ActionBar actionBar = getSupportActionBar(); if (actionBar != null) { actionBar.setTitle(MainActivity.this.mTitle); } } /** Called when a drawer has settled in a completely open state. */ @Override public void onDrawerOpened(View drawerView) { super.onDrawerOpened(drawerView); ActionBar actionBar = getSupportActionBar(); if (actionBar != null) { actionBar.setTitle(MainActivity.this.mDrawerTitle); } } }; this.mDrawerLayout.addDrawerListener(this.mDrawerToggle); this.updateSelectedMenuItem(); // Set version number and click listener TextView versionNumberTextView = this.findViewById(R.id.version_number); versionNumberTextView.setText(this.getApplicationVersion()); versionNumberTextView.setOnClickListener(this::showProjectPage); // Set support text view click listener TextView supportTextView = this.findViewById(R.id.support_text); supportTextView.setOnClickListener(this::showSupportPage); /* * Configure actionbar. */ ActionBar actionBar = getSupportActionBar(); if (actionBar != null) { actionBar.setDisplayHomeAsUpEnabled(true); actionBar.setHomeButtonEnabled(true); } /* * Insert main fragment. */ // Check activity initialization if (savedInstanceState == null) { // Get fragment manager FragmentManager fragmentManager = getSupportFragmentManager(); // Add selected menu item as back stack change listener fragmentManager.addOnBackStackChangedListener(this::updateSelectedMenuItem); // Insert fragment as main content FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction(); fragmentTransaction.replace(R.id.content_frame, new HomeFragment()); fragmentTransaction.commit(); // Get shortcut extra if defined Intent intent = this.getIntent(); Bundle extras = intent.getExtras(); if (extras != null) { String shortcut = extras.getString("shortcut", ""); // Check shortcut to start switch (shortcut) { case "your_lists": selectDrawerMenuItem(2); break; case "dns_requests": selectDrawerMenuItem(4); break; case "preferences": selectDrawerMenuItem(6); break; default: // Shortcut not defined break; } } } else { // Restore selected menu item this.mSelectedMenuItem = savedInstanceState.getInt(SELECTED_MENU_ITEM_KEY, 0); // Restore activity title this.updateSelectedMenuItem(); } } @Override protected void onPostCreate(Bundle savedInstanceState) { super.onPostCreate(savedInstanceState); // Sync the toggle state after onRestoreInstanceState has occurred. this.mDrawerToggle.syncState(); } @Override protected void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); outState.putInt(SELECTED_MENU_ITEM_KEY, this.mSelectedMenuItem); } @Override public void onConfigurationChanged(Configuration newConfig) { super.onConfigurationChanged(newConfig); this.mDrawerToggle.onConfigurationChanged(newConfig); } @Override public boolean onOptionsItemSelected(MenuItem item) { // Pass the event to ActionBarDrawerToggle // If it returns true then it has handled the app icon touch event if (this.mDrawerToggle.onOptionsItemSelected(item)) { return true; } // Handle your other action bar items... return super.onOptionsItemSelected(item); } @Override public void onBackPressed() { // Define HomeFragment as selected menu item this.mSelectedMenuItem = 0; // Delegate back pressed super.onBackPressed(); } @Override public void setTitle(CharSequence title) { this.mTitle = title; ActionBar actionBar = this.getSupportActionBar(); if (actionBar != null) { actionBar.setTitle(this.mTitle); } } /** * Swaps fragments in the main content view. * * @param position The position of the selected item in drawer menu. */ private void selectDrawerMenuItem(int position) { Fragment fragment = null; switch (position) { case 0: // HomeFragment, no fragment to instantiate break; case 1: fragment = new HostsSourcesFragment(); break; case 2: fragment = new ListsFragment(); break; case 3: fragment = new HostsContentFragment(); break; case 4: fragment = new TcpdumpFragment(); break; case 5: fragment = new AdwareFragment(); break; case 6: fragment = new PrefsFragment(); break; case 7: // Restore drawer selected item this.mDrawerList.setItemChecked(this.mSelectedMenuItem, true); // Start help activity this.startActivity(new Intent(this, HelpActivity.class)); // Do nothing more return; default: // Position is not supported. Exit. return; } // Update selected menu item this.mSelectedMenuItem = position; // Pop back stack up to HomeFragment FragmentManager fragmentManager = getSupportFragmentManager(); fragmentManager.popBackStack(STACK_STATE_NAME, FragmentManager.POP_BACK_STACK_INCLUSIVE); // Check there is new fragment to insert if (fragment != null) { // Insert the fragment by replacing any existing fragment fragmentManager.beginTransaction().replace(R.id.content_frame, fragment) .addToBackStack(STACK_STATE_NAME).commit(); } // Close the drawer this.mDrawerLayout.closeDrawer(this.mDrawer); } /** * Update the activity title and selected menu item in drawer list. */ private void updateSelectedMenuItem() { // Get position of selected menu item int position = this.mSelectedMenuItem; // Set selected item in drawer list this.mDrawerList.setItemChecked(position, true); // Get item name String itemName; if (position == 0) { itemName = getString(R.string.app_name); } else { itemName = getResources().getStringArray(R.array.drawer_items)[position]; } // Update title with item name this.setTitle(itemName); } /** * Get application version. * * @return The application version number. */ private String getApplicationVersion() { try { PackageManager manager = this.getPackageManager(); PackageInfo info = manager.getPackageInfo(this.getPackageName(), 0); return info.versionName; } catch (PackageManager.NameNotFoundException exception) { Log.w(Constants.TAG, "Unable to get application version: " + exception.getMessage()); return ""; } } /** * Show development page. * * @param view The source event view. */ private void showProjectPage(@SuppressWarnings("unused") View view) { // Close the drawer this.mDrawerLayout.closeDrawer(this.mDrawer); // Show development page Intent browserIntent = new Intent(Intent.ACTION_VIEW, Uri.parse(PROJECT_LINK)); this.startActivity(browserIntent); } /** * Show support page. * * @param view The source event view. */ private void showSupportPage(@SuppressWarnings("unused") View view) { // Close the drawer this.mDrawerLayout.closeDrawer(this.mDrawer); // Show support dialog new AlertDialog.Builder(this).setIcon(R.drawable.baseline_favorite_24) .setTitle(R.string.drawer_support_dialog_title).setMessage(R.string.drawer_support_dialog_text) .setPositiveButton(R.string.drawer_support_dialog_button, (d, which) -> { // Show support page Intent browserIntent = new Intent(Intent.ACTION_VIEW, Uri.parse(SUPPORT_LINK)); this.startActivity(browserIntent); }).create().show(); } }