X-Git-Url: https://gitweb.stoutner.com/?a=blobdiff_plain;f=app%2Fsrc%2Fmain%2Fjava%2Fcom%2Fstoutner%2Fprivacybrowser%2FMainWebViewActivity.java;h=87f30afe125afe43b6fc8e7f818223050fd730c6;hb=e8bcccda781e0aa65ee4cc11428f3e99dc400015;hp=2af787eb8788138f75bd0765807b681448096112;hpb=826776d415157b99701dd19d2713a60db6fefe2c;p=PrivacyBrowserAndroid.git diff --git a/app/src/main/java/com/stoutner/privacybrowser/MainWebViewActivity.java b/app/src/main/java/com/stoutner/privacybrowser/MainWebViewActivity.java index 2af787eb..87f30afe 100644 --- a/app/src/main/java/com/stoutner/privacybrowser/MainWebViewActivity.java +++ b/app/src/main/java/com/stoutner/privacybrowser/MainWebViewActivity.java @@ -23,6 +23,7 @@ import android.annotation.SuppressLint; import android.app.Activity; import android.app.DialogFragment; import android.app.DownloadManager; +import android.content.Context; import android.content.Intent; import android.content.SharedPreferences; import android.content.res.Configuration; @@ -72,7 +73,16 @@ 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, SslCertificateError.SslCertificateErrorListener { +public class MainWebViewActivity extends AppCompatActivity implements NavigationView.OnNavigationItemSelectedListener, CreateHomeScreenShortcut.CreateHomeScreenSchortcutListener, + SslCertificateError.SslCertificateErrorListener, DownloadFile.DownloadFileListener { + // `privacyBrowserContext` is public static so it can be accessed from `SettingsFragment`. + // It is also used in `onCreate()` and `onConfigurationChanged()`. + public static Context privacyBrowserContext; + + // `appBar` is public static so it can be accessed from `OrbotProxyHelper`. + // It is also used in `onCreate()`. + public static ActionBar appBar; + // `favoriteIcon` is public static so it can be accessed from `CreateHomeScreenShortcut`, `BookmarksActivity`, `CreateBookmark`, `CreateBookmarkFolder`, and `EditBookmark`. // It is also used in `onCreate()` and `onCreateHomeScreenShortcutCreate()`. public static Bitmap favoriteIcon; @@ -161,10 +171,13 @@ public class MainWebViewActivity extends AppCompatActivity implements Navigation // We need a handle for the activity, which is accessed from `SettingsFragment` and fed into `updatePrivacyIcons()`. privacyBrowserActivity = this; + // Get a handle for the application context. + privacyBrowserContext = getApplicationContext(); + // We need to use the SupportActionBar from android.support.v7.app.ActionBar until the minimum API is >= 21. Toolbar supportAppBar = (Toolbar) findViewById(R.id.appBar); setSupportActionBar(supportAppBar); - final ActionBar appBar = getSupportActionBar(); + appBar = getSupportActionBar(); // This is needed to get rid of the Android Studio warning that appBar might be null. assert appBar != null; @@ -199,7 +212,7 @@ public class MainWebViewActivity extends AppCompatActivity implements Navigation // Implement swipe to refresh swipeToRefresh = (SwipeRefreshLayout) findViewById(R.id.swipeRefreshLayout); assert swipeToRefresh != null; //This assert removes the incorrect warning on the following line that swipeToRefresh might be null. - swipeToRefresh.setColorSchemeResources(R.color.blue); + swipeToRefresh.setColorSchemeResources(R.color.blue_700); swipeToRefresh.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() { @Override public void onRefresh() { @@ -344,21 +357,11 @@ public class MainWebViewActivity extends AppCompatActivity implements Navigation // Allow the downloading of files. mainWebView.setDownloadListener(new DownloadListener() { - // Launch the Android download manager when a link leads to a download. @Override public void onDownloadStart(String url, String userAgent, String contentDisposition, String mimetype, long contentLength) { - DownloadManager downloadManager = (DownloadManager) getSystemService(DOWNLOAD_SERVICE); - DownloadManager.Request requestUri = new DownloadManager.Request(Uri.parse(url)); - - // Add the URL as the description for the download. - requestUri.setDescription(url); - - // Show the download notification after the download is completed. - requestUri.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED); - - // Initiate the download and display a Snackbar. - downloadManager.enqueue(requestUri); - Snackbar.make(findViewById(R.id.mainWebView), R.string.download_started, Snackbar.LENGTH_SHORT).show(); + // Show the `DownloadFile` `AlertDialog` and name this instance `@string/download`. + DialogFragment downloadFileDialogFragment = DownloadFile.fromUrl(url, contentDisposition, contentLength); + downloadFileDialogFragment.show(getFragmentManager(), getResources().getString(R.string.download)); } }); @@ -457,6 +460,10 @@ public class MainWebViewActivity extends AppCompatActivity implements Navigation customHeaders.put("DNT", "1"); } + // Set Orbot proxy status. The default is `false`. + if (sharedPreferences.getBoolean("proxy_through_orbot", false)) { + OrbotProxyHelper.setProxy(privacyBrowserContext, privacyBrowserActivity, "localhost", "8118"); + } // Get the intent information that started the app. final Intent intent = getIntent(); @@ -478,7 +485,7 @@ public class MainWebViewActivity extends AppCompatActivity implements Navigation // 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); + Drawable favoriteIconDrawable = ContextCompat.getDrawable(privacyBrowserContext, R.drawable.world); BitmapDrawable favoriteIconBitmapDrawable = (BitmapDrawable) favoriteIconDrawable; favoriteIcon = favoriteIconBitmapDrawable.getBitmap(); } @@ -538,12 +545,10 @@ public class MainWebViewActivity extends AppCompatActivity implements Navigation // Set the status of the additional app bar icons. The default is `false`. if (sharedPreferences.getBoolean("display_additional_app_bar_icons", false)) { toggleFirstPartyCookies.setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM); - toggleThirdPartyCookies.setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM); toggleDomStorage.setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM); toggleSaveFormData.setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM); } else { //Do not display the additional icons. toggleFirstPartyCookies.setShowAsAction(MenuItem.SHOW_AS_ACTION_NEVER); - toggleThirdPartyCookies.setShowAsAction(MenuItem.SHOW_AS_ACTION_NEVER); toggleDomStorage.setShowAsAction(MenuItem.SHOW_AS_ACTION_NEVER); toggleSaveFormData.setShowAsAction(MenuItem.SHOW_AS_ACTION_NEVER); } @@ -828,7 +833,7 @@ public class MainWebViewActivity extends AppCompatActivity implements Navigation DialogFragment createHomeScreenShortcutDialogFragment = new CreateHomeScreenShortcut(); createHomeScreenShortcutDialogFragment.show(getFragmentManager(), getResources().getString(R.string.create_shortcut)); - //Everything else will be handled by CreateHomeScreenShortcut and the associated listeners below. + //Everything else will be handled by `CreateHomeScreenShortcut` and the associated listener below. return true; case R.id.refresh: @@ -962,7 +967,7 @@ public class MainWebViewActivity extends AppCompatActivity implements Navigation super.onConfigurationChanged(newConfig); // Reload the ad if this is the free flavor. - BannerAd.reloadAfterRotate(adView, getApplicationContext(), getString(R.string.ad_id)); + BannerAd.reloadAfterRotate(adView, privacyBrowserContext, getString(R.string.ad_id)); // Reinitialize the adView variable, as the View will have been removed and re-added in the free flavor by BannerAd.reloadAfterRotate(). adView = findViewById(R.id.adView); @@ -971,11 +976,6 @@ public class MainWebViewActivity extends AppCompatActivity implements Navigation invalidateOptionsMenu(); } - @Override - public void onCancelCreateHomeScreenShortcut(DialogFragment dialogFragment) { - // Do nothing because the user selected "Cancel". - } - @Override public void onCreateHomeScreenShortcut(DialogFragment dialogFragment) { // Get shortcutNameEditText from the alert dialog. @@ -995,6 +995,32 @@ public class MainWebViewActivity extends AppCompatActivity implements Navigation sendBroadcast(placeBookmarkShortcut); } + @Override + public void onDownloadFile(DialogFragment dialogFragment, String downloadUrl) { + DownloadManager downloadManager = (DownloadManager) getSystemService(DOWNLOAD_SERVICE); + DownloadManager.Request downloadRequest = new DownloadManager.Request(Uri.parse(downloadUrl)); + + // Get the file name from `dialogFragment`. + EditText downloadFileNameEditText = (EditText) dialogFragment.getDialog().findViewById(R.id.download_file_name); + String fileName = downloadFileNameEditText.getText().toString(); + + // Set the download save in the the `DIRECTORY_DOWNLOADS`using `fileName`. + // Once we have `WRITE_EXTERNAL_STORAGE` permissions we can use `setDestinationInExternalPublicDir`. + downloadRequest.setDestinationInExternalFilesDir(this, "/", fileName); + + // Allow `MediaScanner` to index the download if it is a media file. + downloadRequest.allowScanningByMediaScanner(); + + // Add the URL as the description for the download. + downloadRequest.setDescription(downloadUrl); + + // Show the download notification after the download is completed. + downloadRequest.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED); + + // Initiate the download and display a Snackbar. + downloadManager.enqueue(downloadRequest); + } + public void viewSslCertificate(View view) { // Show the `ViewSslCertificate` `AlertDialog` and name this instance `@string/view_ssl_certificate`. DialogFragment viewSslCertificateDialogFragment = new ViewSslCertificate(); @@ -1100,62 +1126,38 @@ public class MainWebViewActivity extends AppCompatActivity implements Navigation // Get handles for the icons. MenuItem privacyIcon = mainMenu.findItem(R.id.toggleJavaScript); MenuItem firstPartyCookiesIcon = mainMenu.findItem(R.id.toggleFirstPartyCookies); - MenuItem thirdPartyCookiesIcon = mainMenu.findItem(R.id.toggleThirdPartyCookies); MenuItem domStorageIcon = mainMenu.findItem(R.id.toggleDomStorage); MenuItem formDataIcon = mainMenu.findItem(R.id.toggleSaveFormData); // Update `privacyIcon`. - if (javaScriptEnabled) { - // `JavaScript` is enabled. + if (javaScriptEnabled) { // JavaScript is enabled. privacyIcon.setIcon(R.drawable.javascript_enabled); - } else { - if (firstPartyCookiesEnabled) { - // `JavaScript` is disabled but cookies are enabled. - privacyIcon.setIcon(R.drawable.warning); - } else { - // All the dangerous features are disabled. - privacyIcon.setIcon(R.drawable.privacy_mode); - } + } else if (firstPartyCookiesEnabled) { // JavaScript is disabled but cookies are enabled. + privacyIcon.setIcon(R.drawable.warning); + } else { // All the dangerous features are disabled. + privacyIcon.setIcon(R.drawable.privacy_mode); } // Update `firstPartyCookiesIcon`. - if (firstPartyCookiesEnabled) { - // First-party cookies are enabled. - firstPartyCookiesIcon.setIcon(R.drawable.cookies_warning); - } else { - // First-party cookies are disabled. + if (firstPartyCookiesEnabled) { // First-party cookies are enabled. + firstPartyCookiesIcon.setIcon(R.drawable.cookies_enabled); + } else { // First-party cookies are disabled. firstPartyCookiesIcon.setIcon(R.drawable.cookies_disabled); } - // Update `thirdPartyCookiesIcon`. - if (firstPartyCookiesEnabled) { - if (thirdPartyCookiesEnabled) { - // Third-party cookies are enabled. Bad! - thirdPartyCookiesIcon.setIcon(R.drawable.cookies_critical); - } else { - // Third-party cookies are disabled. - thirdPartyCookiesIcon.setIcon(R.drawable.cookies_disabled); - } - } else { - // First-party cookies are disabled, so third-party cookies are ghosted. - thirdPartyCookiesIcon.setIcon(R.drawable.cookies_ghosted); - } - // Update `domStorageIcon`. - if (javaScriptEnabled) { - if (domStorageEnabled) { - domStorageIcon.setIcon(R.drawable.dom_storage_enabled); - } else { - domStorageIcon.setIcon(R.drawable.dom_storage_disabled); - } - } else { + if (javaScriptEnabled && domStorageEnabled) { // Both JavaScript and DOM storage is enabled. + domStorageIcon.setIcon(R.drawable.dom_storage_enabled); + } else if (javaScriptEnabled){ // JavaScript is enabled but DOM storage is disabled. + domStorageIcon.setIcon(R.drawable.dom_storage_disabled); + } else { // JavaScript is disabled, so DOM storage is ghosted. domStorageIcon.setIcon(R.drawable.dom_storage_ghosted); } // Update `formDataIcon`. - if (saveFormDataEnabled) { + if (saveFormDataEnabled) { // Form data is enabled. formDataIcon.setIcon(R.drawable.form_data_enabled); - } else { + } else { // Form data is disabled. formDataIcon.setIcon(R.drawable.form_data_disabled); }