Skip to content

Commit b3c326e

Browse files
authored
Merge pull request #17 from endlessm/T34576-add-view-switcher
Add a separate webview to display a loading screen
2 parents 638b235 + 51f2107 commit b3c326e

File tree

1 file changed

+94
-24
lines changed

1 file changed

+94
-24
lines changed

pythonforandroid/bootstraps/webview/build/src/main/java/org/kivy/android/PythonActivity.java

Lines changed: 94 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,8 @@
1111
import java.util.List;
1212
import java.util.ArrayList;
1313

14+
import android.view.animation.AlphaAnimation;
15+
import android.view.animation.Animation;
1416
import android.view.ViewGroup;
1517
import android.view.KeyEvent;
1618
import android.app.Activity;
@@ -25,6 +27,7 @@
2527
import android.content.Context;
2628
import android.content.pm.PackageManager;
2729
import android.widget.ImageView;
30+
import android.widget.ViewSwitcher;
2831
import android.graphics.Bitmap;
2932
import android.graphics.BitmapFactory;
3033
import android.graphics.Color;
@@ -54,7 +57,9 @@ public class PythonActivity extends Activity {
5457
public static boolean mBrokenLibraries;
5558

5659
protected static ViewGroup mLayout;
60+
protected static ViewSwitcher mWebViewSwitcher;
5761
public static WebView mWebView;
62+
public static WebView mLoadingWebView;
5863

5964
protected static Thread mPythonThread;
6065

@@ -67,6 +72,14 @@ public String getAppRoot() {
6772
return app_root;
6873
}
6974

75+
public WebView getMainWebView() {
76+
return mWebView;
77+
}
78+
79+
public WebView getLoadingWebView() {
80+
return mLoadingWebView;
81+
}
82+
7083
public String getEntryPoint(String search_dir) {
7184
/* Get the main file (.pyc|.pyo|.py) depending on if we
7285
* have a compiled version or not.
@@ -88,6 +101,7 @@ public static void initialize() {
88101
// Otherwise, when exiting the app and returning to it, these variables *keep* their pre exit values
89102
mWebView = null;
90103
mLayout = null;
104+
mWebViewSwitcher = null;
91105
mBrokenLibraries = false;
92106
}
93107

@@ -102,6 +116,21 @@ protected void onCreate(Bundle savedInstanceState) {
102116
new UnpackFilesTask().execute(getAppRoot());
103117
}
104118

119+
public boolean shouldLoadUri(Uri uri) {
120+
return uri.getScheme().equals("file") || uri.getHost().equals("127.0.0.1");
121+
}
122+
123+
public boolean tryOpenExternalLink(String uriString) {
124+
Uri uri = Uri.parse(uriString);
125+
if (mOpenExternalLinksInBrowser && !shouldLoadUri(uri)) {
126+
Intent i = new Intent(Intent.ACTION_VIEW, uri);
127+
startActivity(i);
128+
return true;
129+
} else {
130+
return false;
131+
}
132+
}
133+
105134
private class UnpackFilesTask extends AsyncTask<String, Void, String> {
106135
@Override
107136
protected String doInBackground(String... params) {
@@ -158,38 +187,59 @@ public void onClick(DialogInterface dialog,int id) {
158187
// Set up the webview
159188
String app_root_dir = getAppRoot();
160189

190+
mLayout = new AbsoluteLayout(PythonActivity.mActivity) {
191+
@Override
192+
protected ViewGroup.LayoutParams generateDefaultLayoutParams() {
193+
return new ViewGroup.LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT);
194+
}
195+
};
196+
setContentView(mLayout);
197+
198+
/* TODO: It would be nice to do a crossfade animation here */
199+
mWebViewSwitcher = new ViewSwitcher(PythonActivity.mActivity);
200+
mLayout.addView(mWebViewSwitcher);
201+
202+
mLoadingWebView = new WebView(PythonActivity.mActivity);
203+
mLoadingWebView.getSettings().setJavaScriptEnabled(true);
204+
mLoadingWebView.getSettings().setDomStorageEnabled(true);
205+
mLoadingWebView.getSettings().setAllowFileAccessFromFileURLs(true);
206+
mLoadingWebView.getSettings().setAllowUniversalAccessFromFileURLs(true);
207+
mLoadingWebView.getSettings().setMediaPlaybackRequiresUserGesture(false);
208+
mLoadingWebView.loadUrl("file:///android_asset/_load.html");
209+
mLoadingWebView.setWebViewClient(new WebViewClient() {
210+
@Override
211+
public boolean shouldOverrideUrlLoading(WebView view, String url) {
212+
return tryOpenExternalLink(url);
213+
}
214+
});
215+
mWebViewSwitcher.addView(mLoadingWebView, 0);
216+
161217
mWebView = new WebView(PythonActivity.mActivity);
162218
mWebView.getSettings().setJavaScriptEnabled(true);
163219
mWebView.getSettings().setDomStorageEnabled(true);
164220
mWebView.getSettings().setAllowFileAccessFromFileURLs(true);
165221
mWebView.getSettings().setAllowUniversalAccessFromFileURLs(true);
166222
mWebView.getSettings().setMediaPlaybackRequiresUserGesture(false);
167-
mWebView.loadUrl("file:///android_asset/_load.html");
168-
169-
mWebView.setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT));
170223
mWebView.setWebViewClient(new WebViewClient() {
171-
@Override
172-
public boolean shouldOverrideUrlLoading(WebView view, String url) {
173-
Uri u = Uri.parse(url);
174-
if (mOpenExternalLinksInBrowser) {
175-
if (!(u.getScheme().equals("file") || u.getHost().equals("127.0.0.1"))) {
176-
Intent i = new Intent(Intent.ACTION_VIEW, u);
177-
startActivity(i);
178-
return true;
179-
}
180-
}
181-
return false;
182-
}
183-
184-
@Override
185-
public void onPageFinished(WebView view, String url) {
186-
CookieManager.getInstance().flush();
187-
}
188-
});
189-
mLayout = new AbsoluteLayout(PythonActivity.mActivity);
190-
mLayout.addView(mWebView);
224+
@Override
225+
public boolean shouldOverrideUrlLoading(WebView view, String url) {
226+
return tryOpenExternalLink(url);
227+
}
191228

192-
setContentView(mLayout);
229+
@Override
230+
public void onPageFinished(WebView view, String url) {
231+
Log.i(TAG, "MainPythonWebViewClient onPageFinished");
232+
displayMainWebView();
233+
// FIXME: We should use postVisualStateCallback here...
234+
// mWebView.postVisualStateCallback(123, new WebView.VisualStateCallback() {
235+
// @Override
236+
// public void onComplete(long requestId) {
237+
// displayMainWebView();
238+
// }
239+
// });
240+
}
241+
});
242+
mWebViewSwitcher.addView(mWebView, 1);
193243

194244
String mFilesDirectory = mActivity.getFilesDir().getAbsolutePath();
195245
String entry_point = getEntryPoint(app_root_dir);
@@ -256,6 +306,26 @@ public void run() {
256306
mActivity.runOnUiThread(new LoadUrl(url));
257307
}
258308

309+
public static void displayLoadingWebView() {
310+
mActivity.runOnUiThread(new Runnable() {
311+
@Override
312+
public void run() {
313+
Log.i(TAG, "displayLoadingWebView");
314+
mWebViewSwitcher.setDisplayedChild(0);
315+
}
316+
});
317+
}
318+
319+
public static void displayMainWebView() {
320+
mActivity.runOnUiThread(new Runnable() {
321+
@Override
322+
public void run() {
323+
Log.i(TAG, "displayMainWebView");
324+
mWebViewSwitcher.setDisplayedChild(1);
325+
}
326+
});
327+
}
328+
259329
public static void enableZoom() {
260330
mActivity.runOnUiThread(new Runnable() {
261331
@Override

0 commit comments

Comments
 (0)