import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLEncoder;
+import java.util.HashMap;
+import java.util.Map;
// 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 {
// 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().
+ // `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().
+ // `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().
+ // `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().
+ // `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().
+ // `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().
+ // `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().
+ // `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().
+ // `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().
+ // `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().
+ // `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().
+ // `swipeToRefreshEnabled` is public static so it can be accessed from `SettingsFragment`. It is also used in `onCreate()`.
public static boolean swipeToRefreshEnabled;
+ // `customHeader` is public static so it can be accessed from `BookmarksActivity`. It is also used in `onCreate()` and `loadUrlFromTextBox()`.
+ public static Map<String, String> customHeaders = new HashMap<String, String>();
- // drawerToggle is used in onCreate(), onPostCreate(), onConfigurationChanged(), onNewIntent(), and onNavigationItemSelected().
+
+ // `drawerToggle` is used in `onCreate()`, `onPostCreate()`, `onConfigurationChanged()`, `onNewIntent()`, and `onNavigationItemSelected()`.
private ActionBarDrawerToggle drawerToggle;
- // drawerLayout is used in onCreate(), onNewIntent(), and onBackPressed().
+ // `drawerLayout` is used in `onCreate()`, `onNewIntent()`, and `onBackPressed()`.
private DrawerLayout drawerLayout;
- // privacyIcon is used in onCreateOptionsMenu() and updatePrivacyIcon().
+ // `privacyIcon` is used in `onCreateOptionsMenu()` and `updatePrivacyIcon()`.
private MenuItem privacyIcon;
- // urlTextBox is used in onCreate(), onOptionsItemSelected(), and loadUrlFromTextBox().
+ // `urlTextBox` is used in `onCreate()`, `onOptionsItemSelected()`, and `loadUrlFromTextBox()`.
private EditText urlTextBox;
- // adView is used in onCreate() and onConfigurationChanged().
+ // `adView` is used in `onCreate()` and `onConfigurationChanged()`.
private View adView;
@Override
// drawerToggle creates the hamburger icon at the start of the AppBar.
drawerToggle = new ActionBarDrawerToggle(this, drawerLayout, supportAppBar, R.string.open_navigation, R.string.close_navigation);
+ // Replace the header that `WebView` creates for `X-Requested-With` with a null value. The default value is the application ID (com.stoutner.privacybrowser.standard).
+ customHeaders.put("X-Requested-With", "");
+
mainWebView.setWebViewClient(new WebViewClient() {
// shouldOverrideUrlLoading makes this `WebView` the default handler for URLs inside the app, so that links are not kicked out to other apps.
@Override
startActivity(emailIntent);
return true;
} else { // Load the URL in Privacy Browser.
- mainWebView.loadUrl(url);
+ mainWebView.loadUrl(url, customHeaders);
return true;
}
}
}
// Load the initial website.
- mainWebView.loadUrl(formattedUrlString);
+ mainWebView.loadUrl(formattedUrlString, customHeaders);
- // Load the default favorite icon if it is null.
+ // If the favorite icon is null, load the default.
if (favoriteIcon == null) {
// We have to use `ContextCompat` until API >= 21.
Drawable favoriteIconDrawable = ContextCompat.getDrawable(getApplicationContext(), R.drawable.world);
@Override
protected void onNewIntent(Intent intent) {
- // Sets the new intent as the activity intent, so that any future getIntent()s pick up this one instead of creating a new activity.
+ // Sets the new intent as the activity intent, so that any future `getIntent()`s pick up this one instead of creating a new activity.
setIntent(intent);
if (intent.getData() != null) {
}
// Load the website.
- mainWebView.loadUrl(formattedUrlString);
+ mainWebView.loadUrl(formattedUrlString, customHeaders);
// Clear the keyboard if displayed and remove the focus on the urlTextBar if it has it.
mainWebView.requestFocus();
switch (menuItemId) {
case R.id.home:
- mainWebView.loadUrl(homepage);
+ mainWebView.loadUrl(homepage, customHeaders);
break;
case R.id.back:
}
}
- mainWebView.loadUrl(formattedUrlString);
+ mainWebView.loadUrl(formattedUrlString, customHeaders);
// Hides the keyboard so we can see the webpage.
InputMethodManager inputMethodManager = (InputMethodManager) getSystemService(Activity.INPUT_METHOD_SERVICE);
<string name="home">Startseite</string>
<string name="back">Zurück</string>
<string name="forward">Vorwärts</string>
- <string name="bookmarks">lesezeichen</string>
+ <string name="bookmarks">Lesezeichen</string>
<string name="downloads">Downloads</string>
<string name="settings">Einstellungen</string>
<string name="guide">Handbuch</string>
<!-- About Activity. -->
<string name="about_privacy_browser">Über Privacy Browser</string>
<string name="version">Version</string>
- <string name="version_code">Versions-Code</string>
- <string name="hardware">Hardware</string>
- <!-- Blank spaces at the end of strings are stripped out, so you have to replace them with the Unicode literal \u00A0. -->
- <string name="brand">Marke:\u00A0</string>
- <string name="manufacturer">Hersteller:\u00A0</string>
- <string name="model">Modell:\u00A0</string>
- <string name="device">Gerät:\u00A0</string>
- <string name="bootloader">Bootloader:\u00A0</string>
- <string name="radio">Radio:\u00A0</string>
- <string name="software">Software</string>
- <string name="android">Android:\u00A0</string>
- <string name="api">API</string>
- <string name="build">Build:\u00A0</string>
- <string name="security_patch">Sicherheits-Patch:\u00A0</string>
- <string name="webkit">WebKit:\u00A0</string>
- <string name="chrome">Chrome:\u00A0</string>
+ <string name="version_code">Versions-Code</string>
+ <string name="hardware">Hardware</string>
+ <!-- Blank spaces at the end of strings are stripped out, so you have to replace them with the Unicode literal \u00A0. -->
+ <string name="brand">Marke:\u00A0</string>
+ <string name="manufacturer">Hersteller:\u00A0</string>
+ <string name="model">Modell:\u00A0</string>
+ <string name="device">Gerät:\u00A0</string>
+ <string name="bootloader">Bootloader:\u00A0</string>
+ <string name="radio">Radio:\u00A0</string>
+ <string name="software">Software</string>
+ <string name="android">Android:\u00A0</string>
+ <string name="api">API</string>
+ <string name="build">Build:\u00A0</string>
+ <string name="security_patch">Sicherheits-Patch:\u00A0</string>
+ <string name="webkit">WebKit:\u00A0</string>
+ <string name="chrome">Chrome:\u00A0</string>
<string name="permissions">Berechtigungen</string>
<string name="privacy_policy">Datenschutzrichtlinie</string>
<string name="changelog">Changelog</string>