Implement a progress bar and switch the style to a light action bar.
[PrivacyBrowser.git] / app / src / main / java / com / stoutner / privacybrowser / Webview.java
1 package com.stoutner.privacybrowser;
2
3 import android.app.Activity;
4 import android.content.Intent;
5 import android.net.Uri;
6 import android.os.Bundle;
7 import android.support.v7.app.AppCompatActivity;
8 import android.view.KeyEvent;
9 import android.view.Menu;
10 import android.view.MenuItem;
11 import android.view.View;
12 import android.view.inputmethod.InputMethodManager;
13 import android.webkit.WebChromeClient;
14 import android.webkit.WebView;
15 import android.webkit.WebViewClient;
16 import android.widget.EditText;
17 import android.widget.ProgressBar;
18
19 import java.net.URL;
20
21
22 public class Webview extends AppCompatActivity {
23
24     static String formattedUrlString;
25     static WebView mainWebView;
26     static ProgressBar progressBar;
27     static final String homepage = "https://www.duckduckgo.com";
28
29     @Override
30     protected void onCreate(Bundle savedInstanceState) {
31         super.onCreate(savedInstanceState);
32         setContentView(R.layout.activity_webview);
33
34         final EditText urlTextBox = (EditText) findViewById(R.id.urlTextBox);
35         mainWebView = (WebView) findViewById(R.id.mainWebView);
36         progressBar = (ProgressBar) findViewById(R.id.progressBar);
37
38         // setWebViewClient makes this WebView the default handler for URLs inside the app, so that links are not kicked out to other apps.
39         mainWebView.setWebViewClient(new WebViewClient());
40
41         // Update the progress bar when a page is loading.
42         mainWebView.setWebChromeClient(new WebChromeClient() {
43             public void onProgressChanged(WebView view, int progress) {
44                 if (progress < 100) {
45                     progressBar.setVisibility(View.VISIBLE);
46                 } else {
47                     progressBar.setVisibility(View.GONE);
48                 }
49                 progressBar.setProgress(progress);
50             }
51         });
52
53         // Allow pinch to zoom.
54         mainWebView.getSettings().setBuiltInZoomControls(true);
55
56         // Hide zoom controls.
57         mainWebView.getSettings().setDisplayZoomControls(false);
58
59         // Enable JavaScript.
60         mainWebView.getSettings().setJavaScriptEnabled(true);
61
62         // Enable DOM Storage.
63         mainWebView.getSettings().setDomStorageEnabled(true);
64
65         // Get the intent information that started the app.
66         final Intent intent = getIntent();
67
68         if (intent.getData() != null) {
69             // Get the intent data.
70             final Uri intentUriData = intent.getData();
71
72             // Try to parse the intent data and store it in urlData.
73             URL urlData = null;
74             try {
75                 urlData = new URL(intentUriData.getScheme(), intentUriData.getHost(), intentUriData.getPath());
76             } catch (Exception e) {
77                 e.printStackTrace();
78             }
79
80             Webview.formattedUrlString = urlData.toString();
81         }
82
83         // If formattedUrlString is null assign the homepage to it.
84         if (formattedUrlString == null) {
85             formattedUrlString = homepage;
86         }
87
88         // Place the formattedUrlString in the address bar and load the website.
89         urlTextBox.setText(formattedUrlString);
90         mainWebView.loadUrl(formattedUrlString);
91
92         // Set the "go" button on the keyboard to load the URL.
93         urlTextBox.setOnKeyListener(new View.OnKeyListener() {
94             public boolean onKey(View v, int keyCode, KeyEvent event) {
95                 // If the event is a key-down event on the "enter" button
96                 if ((event.getAction() == KeyEvent.ACTION_DOWN) &&
97                         (keyCode == KeyEvent.KEYCODE_ENTER)) {
98                     // Load the URL into the mainWebView and consume the event.
99                     loadUrl(mainWebView);
100                     return true;
101                 }
102                 // Do not consume the event.
103                 return false;
104             }
105         });
106
107     }
108
109     @Override
110     public boolean onCreateOptionsMenu(Menu menu) {
111         // Inflate the menu; this adds items to the action bar if it is present.
112         getMenuInflater().inflate(R.menu.menu_webview, menu);
113         return true;
114     }
115
116     @Override
117     public boolean onOptionsItemSelected(MenuItem menuItem) {
118         int menuItemId = menuItem.getItemId();
119         final WebView mainWebView = (WebView) findViewById(R.id.mainWebView);
120
121         // Use the menu items to go forward or back.
122         switch (menuItemId) {
123             case R.id.back:
124                 mainWebView.goBack();
125                 break;
126             case R.id.forward:
127                 mainWebView.goForward();
128                 break;
129         }
130
131         return super.onOptionsItemSelected(menuItem);
132     }
133
134     // Override onBackPressed so that if mainWebView can go back it does when the system back button is pressed.
135     @Override
136     public void onBackPressed() {
137         if (mainWebView.canGoBack()) {
138             mainWebView.goBack();
139         } else {
140             super.onBackPressed();
141         }
142     }
143
144     public void loadUrl(View view) {
145         // Get the text from urlTextInput and convert it to a string.
146         final EditText urlTextBox = (EditText) findViewById(R.id.urlTextBox);
147         final String unformattedUrlString = urlTextBox.getText().toString();
148
149         // Don't do anything unless unformattedUrlString is at least 6 characters long.
150         if (unformattedUrlString.length() < 6) { return; }
151
152         // Add correct protocol formatting to the beginning of the URL if needed.
153         final String firstSixCharacters = unformattedUrlString.substring(0, 6);
154
155         switch (firstSixCharacters) {
156             case "http:/":
157                 formattedUrlString = unformattedUrlString;
158                 break;
159             case "https:":
160                 formattedUrlString = unformattedUrlString;
161                 break;
162             case "ftp://":
163                 formattedUrlString = unformattedUrlString;
164                 break;
165             default:
166                 formattedUrlString = "http://" + unformattedUrlString;
167         }
168
169         /*
170         // Parse the unformattedURLString into a Uri.
171
172         final Uri uriData = Uri.parse(unformattedUrlString);
173
174         // Convert the Uri to a URL, chicking for any problems with the formatting.
175         URL urlData = null;
176
177         try {
178             urlData = new URL(uriData.getScheme(), uriData.getHost(), uriData.getPath());
179         } catch (Exception e) {
180             e.printStackTrace();
181         }
182
183         //  Convert urlData to a string, which is reqauired by loadUrl method.
184         formattedUrlString = urlData.toString();
185         */
186
187         final WebView mainWebView = (WebView) findViewById(R.id.mainWebView);
188
189         // Place the URL text back in the address bar and load the website.
190         urlTextBox.setText(formattedUrlString);
191         mainWebView.loadUrl(formattedUrlString);
192
193         // Hides the keyboard so we can see the webpage.
194         InputMethodManager inputMethodManager = (InputMethodManager) getSystemService(Activity.INPUT_METHOD_SERVICE);
195         inputMethodManager.hideSoftInputFromWindow(mainWebView.getWindowToken(), 0);
196     }
197 }