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

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: Use spy to partically mock. Created 3 years, 7 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 6e1c64a74e4fb8ff916963b1206005d840a2bb7d..79c549727cfd8776e8aa3a7de7917f3502f7989b 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
@@ -4,7 +4,6 @@
package org.chromium.webapk.shell_apk;
-import android.app.Activity;
import android.content.ActivityNotFoundException;
import android.content.Intent;
import android.content.pm.ApplicationInfo;
@@ -12,17 +11,23 @@ import android.content.pm.PackageManager;
import android.content.pm.PackageManager.NameNotFoundException;
import android.net.Uri;
import android.os.Bundle;
+import android.support.v4.app.DialogFragment;
+import android.support.v4.app.FragmentActivity;
+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.net.MalformedURLException;
+import java.net.URL;
+import java.util.Set;
/**
* WebAPK's main Activity.
*/
-public class MainActivity extends Activity {
+public class MainActivity
+ extends FragmentActivity implements ChooseHostBrowserDialogFragment.DialogListener {
private static final String TAG = "cr_MainActivity";
/**
@@ -46,6 +51,9 @@ public class MainActivity extends Activity {
*/
private static final String KEY_APP_ICON_ID = "app_icon_id";
+ private String mOverrideUrl;
+ private String mStartUrl;
+
/**
* Creates install Intent.
* @param packageName Package to install.
@@ -59,42 +67,82 @@ 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 : getStartUrl();
- if (startUrl == null) {
+ mOverrideUrl = getOverrideUrl();
+ mStartUrl = (mOverrideUrl != null) ? mOverrideUrl : getStartUrl();
+ 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 runtimeHost = WebApkUtils.getHostBrowserPackageName(this);
+ 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;
}
pkotwicz 2017/05/26 22:38:39 Don't you need to call WebApkUtils#deleteSharedPre
Xi Han 2017/05/29 21:18:56 You are right. Call it inside launchiInHostBrowser
- installBrowser();
+ DialogFragment dialogFragment = ChooseHostBrowserDialogFragment.newInstance(hostUrl);
+ dialogFragment.show(getSupportFragmentManager(), "ChooseHostBrowserDialogFragment");
}
- /**
- * 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);
+ /** Retrieves URL from the intent's data. Returns null if a URL could not be retrieved. */
+ private String getOverrideUrl() {
+ String overrideUrl = getIntent().getDataString();
+ if (overrideUrl != null && overrideUrl.startsWith("https:")) {
+ return overrideUrl;
+ }
+ return null;
+ }
- String runtimeHost = WebApkUtils.getHostBrowserPackageName(this);
+ /** Returns the start URL from the Android Manifest. */
+ private String getStartUrl() {
+ ApplicationInfo appInfo;
+ try {
+ appInfo = getPackageManager().getApplicationInfo(
+ getPackageName(), PackageManager.GET_META_DATA);
+ } catch (NameNotFoundException e) {
+ return null;
+ }
+ return appInfo.metaData.getString(WebApkMetaDataKeys.START_URL);
+ }
+
+ @Override
+ public void onHostBrowserSelected(String runtimeHost) {
+ Set<String> installedBrowsers = WebApkUtils.getInstalledBrowsers(getPackageManager());
+ if (installedBrowsers.contains(runtimeHost)) {
+ launchInHostBrowser(runtimeHost);
+ } else {
+ installBrowser(runtimeHost);
+ }
pkotwicz 2017/05/26 22:38:39 Don't you need to call WebApkUtils#deleteSharedPre
Xi Han 2017/05/29 21:18:55 Add a call in |launchInHostBrowser|.
+ // It is safe to cache the runtimeHost to the share pref if user didn't install the browser
+ // in {@link installBrowser}. On 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
+ // runtimeHost to the shared pref can avoid showing the dialog.
+ WebApkUtils.writeHostBrowserToSharedPref(this, runtimeHost);
+ finish();
+ }
+
+ @Override
+ public void onQuit() {
+ finish();
+ }
+
+ private boolean 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,9 +155,9 @@ 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 {
@@ -123,70 +171,12 @@ public class MainActivity extends Activity {
}
/**
- * 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) {
}
}
-
- /** Retrieves URL from the intent's data. Returns null if a URL could not be retrieved. */
- private String getOverrideUrl() {
- String overrideUrl = getIntent().getDataString();
- if (overrideUrl != null && overrideUrl.startsWith("https:")) {
- return overrideUrl;
- }
- return null;
- }
-
- /** Returns the start URL from the Android Manifest. */
- private String getStartUrl() {
- ApplicationInfo appInfo;
- try {
- appInfo = getPackageManager().getApplicationInfo(
- getPackageName(), PackageManager.GET_META_DATA);
- } catch (NameNotFoundException e) {
- return null;
- }
- return appInfo.metaData.getString(WebApkMetaDataKeys.START_URL);
- }
}

Powered by Google App Engine
This is Rietveld 408576698