import android.annotation.SuppressLint;
import android.app.Activity;
+import android.app.DialogFragment;
import android.app.DownloadManager;
import android.content.Intent;
import android.content.SharedPreferences;
import android.preference.PreferenceManager;
import android.support.design.widget.NavigationView;
import android.support.design.widget.Snackbar;
-import android.support.v4.app.DialogFragment;
import android.support.v4.view.GravityCompat;
import android.support.v4.widget.DrawerLayout;
import android.support.v4.widget.SwipeRefreshLayout;
import android.support.v7.app.ActionBar;
import android.support.v7.app.ActionBarDrawerToggle;
import android.support.v7.app.AppCompatActivity;
-import android.support.v7.app.AppCompatDialogFragment;
import android.support.v7.widget.Toolbar;
import android.util.Patterns;
import android.view.KeyEvent;
import android.webkit.WebStorage;
import android.webkit.WebView;
import android.webkit.WebViewClient;
+import android.webkit.WebViewDatabase;
import android.widget.EditText;
import android.widget.FrameLayout;
import android.widget.ImageView;
// We need to use AppCompatActivity from android.support.v7.app.AppCompatActivity to have access to the SupportActionBar until the minimum API is >= 21.
public class MainWebViewActivity extends AppCompatActivity implements NavigationView.OnNavigationItemSelectedListener, CreateHomeScreenShortcut.CreateHomeScreenSchortcutListener {
- // favoriteIcon is public static so it can be accessed from CreateHomeScreenShortcut.
+ // favoriteIcon is public static so it can be accessed from CreateHomeScreenShortcut and BookmarksActivity.
+ // It is also used in onCreate() and onCreateHomeScreenShortcutCreate().
public static Bitmap favoriteIcon;
- // mainWebView is public static so it can be accessed from SettingsFragment. It is also used in onCreate(), onOptionsItemSelected(), onNavigationItemSelected(), and loadUrlFromTextBox().
+
+ // mainWebView is public static so it can be accessed from SettingsFragment.
+ // It is also used in onCreate(), onOptionsItemSelected(), onNavigationItemSelected(), and loadUrlFromTextBox().
public static WebView mainWebView;
+ // formattedUrlString is public static so it can be accessed from BookmarksActivity.
+ // It is also used in onCreate(), onOptionsItemSelected(), onCreateHomeScreenShortcutCreate(), and loadUrlFromTextBox().
+ public static String formattedUrlString;
+
// mainMenu is public static so it can be accessed from SettingsFragment. It is also used in onCreateOptionsMenu() and onOptionsItemSelected().
public static Menu mainMenu;
+
// cookieManager is public static so it can be accessed from SettingsFragment. It is also used in onCreate(), onOptionsItemSelected(), and onNavigationItemSelected().
public static CookieManager cookieManager;
- // javaScriptEnabled is public static so it can be accessed from SettingsFragment. It is also used in onCreate(), onCreateOptionsMenu(), onOptionsItemSelected(), and loadUrlFromTextBox().
+
+ // javaScriptEnabled is public static so it can be accessed from SettingsFragment.
+ // It is also used in onCreate(), onCreateOptionsMenu(), onOptionsItemSelected(), and loadUrlFromTextBox().
public static boolean javaScriptEnabled;
- // firstPartyCookiesEnabled is public static so it can be accessed from SettingsFragment. It is also used in onCreate(), onCreateOptionsMenu(), onPrepareOptionsMenu(), and onOptionsItemSelected().
+
+ // firstPartyCookiesEnabled is public static so it can be accessed from SettingsFragment.
+ // It is also used in onCreate(), onCreateOptionsMenu(), onPrepareOptionsMenu(), and onOptionsItemSelected().
public static boolean firstPartyCookiesEnabled;
+
// thirdPartyCookiesEnabled is used in onCreate(), onCreateOptionsMenu(), onPrepareOptionsMenu(), and onOptionsItemSelected().
public static boolean thirdPartyCookiesEnabled;
+
// domStorageEnabled is public static so it can be accessed from SettingsFragment. It is also used in onCreate(), onCreateOptionsMenu(), and onOptionsItemSelected().
public static boolean domStorageEnabled;
+
+ // saveFormDataEnabled is public static so it can be accessed from SettingsFragment. It is also used in onCreate(), onCreateOptionsMenu(), and onOptionsItemSelected().
+ public static boolean saveFormDataEnabled;
+
// javaScriptDisabledSearchURL is public static so it can be accessed from SettingsFragment. It is also used in onCreate() and loadURLFromTextBox().
public static String javaScriptDisabledSearchURL;
+
// javaScriptEnabledSearchURL is public static so it can be accessed from SettingsFragment. It is also used in onCreate() and loadURLFromTextBox().
public static String javaScriptEnabledSearchURL;
+
// homepage is public static so it can be accessed from SettingsFragment. It is also used in onCreate() and onOptionsItemSelected().
public static String homepage;
+
// swipeToRefresh is public static so it can be accessed from SettingsFragment. It is also used in onCreate().
public static SwipeRefreshLayout swipeToRefresh;
+
// swipeToRefreshEnabled is public static so it can be accessed from SettingsFragment. It is also used in onCreate().
public static boolean swipeToRefreshEnabled;
+
+
// drawerToggle is used in onCreate(), onPostCreate(), onConfigurationChanged(), onNewIntent(), and onNavigationItemSelected().
private ActionBarDrawerToggle drawerToggle;
+
// drawerLayout is used in onCreate(), onNewIntent(), and onBackPressed().
private DrawerLayout drawerLayout;
- // formattedUrlString is used in onCreate(), onOptionsItemSelected(), onCreateHomeScreenShortcutCreate(), and loadUrlFromTextBox().
- private String formattedUrlString;
+
// privacyIcon is used in onCreateOptionsMenu() and updatePrivacyIcon().
private MenuItem privacyIcon;
+
// urlTextBox is used in onCreate(), onOptionsItemSelected(), and loadUrlFromTextBox().
private EditText urlTextBox;
+
// adView is used in onCreate() and onConfigurationChanged().
private View adView;
domStorageEnabled = savedPreferences.getBoolean("dom_storage_enabled", false);
mainWebView.getSettings().setDomStorageEnabled(domStorageEnabled);
+ // Set the saved form data initial status. The default is false.
+ saveFormDataEnabled = savedPreferences.getBoolean("save_form_data_enabled", false);
+ mainWebView.getSettings().setSaveFormData(saveFormDataEnabled);
+
// Set the user agent initial status.
String userAgentString = savedPreferences.getString("user_agent", "Default user agent");
switch (userAgentString) {
MenuItem toggleFirstPartyCookies = menu.findItem(R.id.toggleFirstPartyCookies);
MenuItem toggleThirdPartyCookies = menu.findItem(R.id.toggleThirdPartyCookies);
MenuItem toggleDomStorage = menu.findItem(R.id.toggleDomStorage);
+ MenuItem toggleSaveFormData = menu.findItem(R.id.toggleSaveFormData);
// Set the initial status of the privacy icon.
updatePrivacyIcon();
toggleFirstPartyCookies.setChecked(firstPartyCookiesEnabled);
toggleThirdPartyCookies.setChecked(thirdPartyCookiesEnabled);
toggleDomStorage.setChecked(domStorageEnabled);
+ toggleSaveFormData.setChecked(saveFormDataEnabled);
return true;
}
toggleThirdPartyCookies.setEnabled(false);
}
+ // Enable DOM Storage if JavaScript is enabled.
+ MenuItem toggleDomStorage = menu.findItem(R.id.toggleDomStorage);
+ toggleDomStorage.setEnabled(javaScriptEnabled);
+
// Enable Clear Cookies if there are any.
MenuItem clearCookies = menu.findItem(R.id.clearCookies);
clearCookies.setEnabled(cookieManager.hasCookies());
- // Enable DOM Storage if JavaScript is enabled.
- MenuItem toggleDomStorage = menu.findItem(R.id.toggleDomStorage);
- toggleDomStorage.setEnabled(javaScriptEnabled);
+ // Enable Clear Form Data is there is any.
+ MenuItem clearFormData = menu.findItem(R.id.clearFormData);
+ WebViewDatabase mainWebViewDatabase = WebViewDatabase.getInstance(this);
+ clearFormData.setEnabled(mainWebViewDatabase.hasFormData());
// Run all the other default commands.
super.onPrepareOptionsMenu(menu);
mainWebView.reload();
return true;
+ case R.id.toggleSaveFormData:
+ // Switch the status of saveFormDataEnabled.
+ saveFormDataEnabled = !saveFormDataEnabled;
+
+ // Update the menu checkbox.
+ menuItem.setChecked(saveFormDataEnabled);
+
+ // Apply the new form data status.
+ mainWebView.getSettings().setSaveFormData(saveFormDataEnabled);
+
+ // Reload the WebView.
+ mainWebView.reload();
+ return true;
+
case R.id.clearCookies:
if (Build.VERSION.SDK_INT < 21) {
cookieManager.removeAllCookie();
Snackbar.make(findViewById(R.id.mainWebView), R.string.dom_storage_deleted, Snackbar.LENGTH_SHORT).show();
return true;
+ case R.id.clearFormData:
+ WebViewDatabase mainWebViewDatabase = WebViewDatabase.getInstance(this);
+ mainWebViewDatabase.clearFormData();
+ mainWebView.reload();
+ return true;
+
case R.id.share:
Intent shareIntent = new Intent();
shareIntent.setAction(Intent.ACTION_SEND);
return true;
case R.id.addToHomescreen:
- // Show the CreateHomeScreenShortcut AlertDialog and name this instance createShortcut.
- AppCompatDialogFragment shortcutDialog = new CreateHomeScreenShortcut();
- shortcutDialog.show(getSupportFragmentManager(), "createShortcut");
+ // Show the CreateHomeScreenShortcut AlertDialog and name this instance "@string/create_shortcut".
+ DialogFragment createHomeScreenShortcutDialogFragment = new CreateHomeScreenShortcut();
+ createHomeScreenShortcutDialogFragment.show(getFragmentManager(), "@string/create_shortcut");
//Everything else will be handled by CreateHomeScreenShortcut and the associated listeners below.
return true;
}
break;
+ case R.id.bookmarks:
+ // Launch BookmarksActivity.
+ Intent bookmarksIntent = new Intent(this, BookmarksActivity.class);
+ startActivity(bookmarksIntent);
+ break;
+
case R.id.downloads:
// Launch the system Download Manager.
Intent downloadManagerIntent = new Intent(DownloadManager.ACTION_VIEW_DOWNLOADS);
startActivity(downloadManagerIntent);
break;
- case R.id.guide:
- // Launch GuideActivity.
- Intent guideIntent = new Intent(this, GuideActivity.class);
- startActivity(guideIntent);
- break;
-
case R.id.settings:
// Launch SettingsActivity.
Intent settingsIntent = new Intent(this, SettingsActivity.class);
startActivity(settingsIntent);
break;
+ case R.id.guide:
+ // Launch GuideActivity.
+ Intent guideIntent = new Intent(this, GuideActivity.class);
+ startActivity(guideIntent);
+ break;
+
case R.id.about:
// Launch AboutActivity.
Intent aboutIntent = new Intent(this, AboutActivity.class);
WebStorage domStorage = WebStorage.getInstance();
domStorage.deleteAllData();
+ // Clear form data.
+ WebViewDatabase formData = WebViewDatabase.getInstance(this);
+ formData.clearFormData();
+
// Clear cache. The argument of "true" includes disk files.
mainWebView.clearCache(true);
}
@Override
- public void onCreateHomeScreenShortcutCancel(DialogFragment dialog) {
+ public void onCreateHomeScreenShortcutCancel(DialogFragment dialogFragment) {
// Do nothing because the user selected "Cancel".
}
@Override
- public void onCreateHomeScreenShortcutCreate(DialogFragment dialog) {
+ public void onCreateHomeScreenShortcutCreate(DialogFragment dialogFragment) {
// Get shortcutNameEditText from the alert dialog.
- EditText shortcutNameEditText = (EditText) dialog.getDialog().findViewById(R.id.shortcutNameEditText);
+ EditText shortcutNameEditText = (EditText) dialogFragment.getDialog().findViewById(R.id.shortcut_name_edittext);
// Create the bookmark shortcut based on formattedUrlString.
Intent bookmarkShortcut = new Intent();
}
private void loadUrlFromTextBox() throws UnsupportedEncodingException {
- // Get the text from urlTextBox and convert it to a string.
- String unformattedUrlString = urlTextBox.getText().toString();
+ // Get the text from urlTextBox and convert it to a string. trim() removes white spaces from the beginning and end of the string.
+ String unformattedUrlString = urlTextBox.getText().toString().trim();
+
URL unformattedUrl = null;
Uri.Builder formattedUri = new Uri.Builder();