Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(32)

Unified Diff: chrome/android/webapk/shell_apk/src/org/chromium/webapk/shell_apk/MainActivity.java

Issue 2858563004: Add support for webapk without runtimeHost (Closed)
Patch Set: Nits. Created 3 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: chrome/android/webapk/shell_apk/src/org/chromium/webapk/shell_apk/MainActivity.java
diff --git a/chrome/android/webapk/shell_apk/src/org/chromium/webapk/shell_apk/MainActivity.java b/chrome/android/webapk/shell_apk/src/org/chromium/webapk/shell_apk/MainActivity.java
index 1d6b4c72eb0e389f3c9d88258a67ed9f10f7479a..a665663a8f3c455f3c69967b9cf7e624c4b32e26 100644
--- a/chrome/android/webapk/shell_apk/src/org/chromium/webapk/shell_apk/MainActivity.java
+++ b/chrome/android/webapk/shell_apk/src/org/chromium/webapk/shell_apk/MainActivity.java
@@ -8,18 +8,23 @@ import android.app.Activity;
import android.content.ActivityNotFoundException;
import android.content.Intent;
import android.net.Uri;
+import android.os.AsyncTask;
import android.os.Bundle;
+import android.text.TextUtils;
import android.util.Log;
import org.chromium.webapk.lib.common.WebApkConstants;
import org.chromium.webapk.lib.common.WebApkMetaDataKeys;
-import java.net.URISyntaxException;
+import java.io.File;
+import java.net.MalformedURLException;
+import java.net.URL;
+import java.util.Set;
/**
* WebAPK's main Activity.
*/
-public class MainActivity extends Activity {
+public class MainActivity extends Activity implements ChooseHostBrowserDialog.DialogListener {
private static final String TAG = "cr_MainActivity";
/**
@@ -43,6 +48,15 @@ public class MainActivity extends Activity {
*/
private static final String KEY_APP_ICON_ID = "app_icon_id";
+ /**
+ * The URL to launch the WebAPK. Used in the case of deep-links (intents from other apps) that
+ * fall into the WebAPK scope.
+ */
+ private String mOverrideUrl;
+
+ /** The "start_url" baked in the AndroidManifest.xml. */
+ private String mStartUrl;
+
/**
* Creates install Intent.
* @param packageName Package to install.
@@ -56,45 +70,100 @@ public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
- launch();
- finish();
- }
-
- /**
- * Launches WebAPK.
- */
- private void launch() {
- String overrideUrl = getOverrideUrl();
- String startUrl = (overrideUrl != null)
- ? overrideUrl
+ mOverrideUrl = getOverrideUrl();
+ mStartUrl = (mOverrideUrl != null)
+ ? mOverrideUrl
: WebApkUtils.readMetaDataFromManifest(this, WebApkMetaDataKeys.START_URL);
-
- if (startUrl == null) {
+ if (mStartUrl == null) {
+ finish();
return;
}
- if (launchHostBrowserInWebApkMode(startUrl, overrideUrl)) {
+ Log.v(TAG, "Url of the WebAPK: " + mStartUrl);
+ String packageName = getPackageName();
+ Log.v(TAG, "Package name of the WebAPK:" + packageName);
+
+ String runtimeHostInPreferences = WebApkUtils.getHostBrowserFromSharedPreference(this);
+ String runtimeHost = WebApkUtils.getHostBrowserPackageName(this);
+ if (!TextUtils.isEmpty(runtimeHostInPreferences)
+ && !runtimeHostInPreferences.equals(runtimeHost)) {
+ WebApkUtils.deleteSharedPref(this);
+ deleteInternalStorageAsync();
+ }
+
+ if (!TextUtils.isEmpty(runtimeHost)) {
+ launchInHostBrowser(runtimeHost);
+ finish();
return;
}
- if (launchBrowser(startUrl)) {
+
+ String hostUrl = "";
+ try {
+ hostUrl = new URL(mStartUrl).getHost();
+ } catch (MalformedURLException e) {
+ Log.e(TAG, "Invalid URL of the WebApk.");
+ finish();
return;
}
- installBrowser();
+
+ ChooseHostBrowserDialog dialog = new ChooseHostBrowserDialog();
+ dialog.show(this, hostUrl);
}
- /**
- * Launches host browser in WebAPK mode.
- * @return True if successful.
- */
- private boolean launchHostBrowserInWebApkMode(String startUrl, String overrideUrl) {
- Log.v(TAG, "Url of the WebAPK: " + startUrl);
- String packageName = getPackageName();
- Log.v(TAG, "Package name of the WebAPK:" + packageName);
+ @Override
+ public void onHostBrowserSelected(String selectedHostBrowser) {
+ Set<String> installedBrowsers = WebApkUtils.getInstalledBrowsers(getPackageManager());
+ if (installedBrowsers.contains(selectedHostBrowser)) {
+ launchInHostBrowser(selectedHostBrowser);
+ } else {
+ installBrowser(selectedHostBrowser);
+ }
+ // It is safe to cache the selected host browser to the share pref if user didn't install
+ // the browser in {@link installBrowser}. On the next launch,
+ // {@link WebApkUtils#getHostBrowserPackageName()} will catch it, and the dialog to choose
+ // host browser will show again. If user did install the browser chosen, saving the
+ // selected host browser to the shared pref can avoid showing the dialog.
+ WebApkUtils.writeHostBrowserToSharedPref(this, selectedHostBrowser);
+ finish();
+ }
- String runtimeHost = WebApkUtils.getHostBrowserPackageName(this);
+ @Override
+ public void onQuit() {
+ finish();
+ }
+
+ private void deleteInternalStorageAsync() {
+ new AsyncTask<Void, Void, Void>() {
+ @Override
+ protected Void doInBackground(Void... params) {
+ deletePath(getCacheDir());
+ deletePath(getFilesDir());
+ return null;
+ }
+ }.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
+ }
+
+ private void deletePath(File file) {
+ if (file == null) return;
+
+ if (file.isDirectory()) {
+ File[] children = file.listFiles();
+ if (children != null) {
+ for (File child : children) {
+ deletePath(child);
+ }
+ }
+ }
+
+ if (!file.delete()) {
+ Log.e(TAG, "Failed to delete : " + file.getAbsolutePath());
+ }
+ }
+
+ private void launchInHostBrowser(String runtimeHost) {
boolean forceNavigation = false;
int source = getIntent().getIntExtra(WebApkConstants.EXTRA_SOURCE, 0);
- if (overrideUrl != null) {
+ if (mOverrideUrl != null) {
if (source == WebApkConstants.SHORTCUT_SOURCE_UNKNOWN) {
source = WebApkConstants.SHORTCUT_SOURCE_EXTERNAL_INTENT;
}
@@ -107,62 +176,23 @@ public class MainActivity extends Activity {
Intent intent = new Intent();
intent.setAction(ACTION_START_WEBAPK);
intent.setPackage(runtimeHost);
- intent.putExtra(WebApkConstants.EXTRA_URL, startUrl)
+ intent.putExtra(WebApkConstants.EXTRA_URL, mStartUrl)
.putExtra(WebApkConstants.EXTRA_SOURCE, source)
- .putExtra(WebApkConstants.EXTRA_WEBAPK_PACKAGE_NAME, packageName)
+ .putExtra(WebApkConstants.EXTRA_WEBAPK_PACKAGE_NAME, getPackageName())
.putExtra(WebApkConstants.EXTRA_WEBAPK_FORCE_NAVIGATION, forceNavigation);
try {
startActivity(intent);
- return true;
} catch (ActivityNotFoundException e) {
Log.w(TAG, "Unable to launch browser in WebAPK mode.");
e.printStackTrace();
- return false;
}
}
- /**
- * Launches browser (not necessarily the host browser).
- * @param startUrl URL to navigate browser to.
- * @return True if successful.
- */
- private boolean launchBrowser(String startUrl) {
- Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(startUrl));
- intent.addCategory(Intent.CATEGORY_BROWSABLE);
-
- // The WebAPK can handle {@link startUrl}. Set a selector to prevent the WebAPK from
- // launching itself.
- try {
- Intent selectorIntent = Intent.parseUri("https://", Intent.URI_INTENT_SCHEME);
- intent.setSelector(selectorIntent);
- } catch (URISyntaxException e) {
- return false;
- }
-
- // Add extras in case that the URL is launched in Chrome.
- int source =
- getIntent().getIntExtra(WebApkConstants.EXTRA_SOURCE, Intent.URI_INTENT_SCHEME);
- intent.putExtra(REUSE_URL_MATCHING_TAB_ELSE_NEW_TAB, true)
- .putExtra(WebApkConstants.EXTRA_SOURCE, source);
-
- try {
- startActivity(intent);
- } catch (ActivityNotFoundException e) {
- return false;
- }
- return true;
- }
-
/**
* Launches the Play Store with the host browser's page.
*/
- private void installBrowser() {
- String hostBrowserPackageName = WebApkUtils.getHostBrowserPackageName(this);
- if (hostBrowserPackageName == null) {
- return;
- }
-
+ private void installBrowser(String hostBrowserPackageName) {
try {
startActivity(createInstallIntent(hostBrowserPackageName));
} catch (ActivityNotFoundException e) {

Powered by Google App Engine
This is Rietveld 408576698