| OLD | NEW |
| 1 // Copyright 2016 The Chromium Authors. All rights reserved. | 1 // Copyright 2016 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 package org.chromium.chrome.browser.webapps; | 5 package org.chromium.chrome.browser.webapps; |
| 6 | 6 |
| 7 import android.content.Context; | 7 import android.content.Context; |
| 8 import android.content.DialogInterface; | 8 import android.content.DialogInterface; |
| 9 import android.content.Intent; | 9 import android.content.Intent; |
| 10 import android.os.StrictMode; | 10 import android.os.StrictMode; |
| 11 import android.provider.Settings; | 11 import android.provider.Settings; |
| 12 import android.support.v7.app.AlertDialog; | 12 import android.support.v7.app.AlertDialog; |
| 13 import android.text.TextUtils; | 13 import android.text.TextUtils; |
| 14 | 14 |
| 15 import org.chromium.base.CommandLine; | |
| 16 import org.chromium.base.ContextUtils; | 15 import org.chromium.base.ContextUtils; |
| 17 import org.chromium.base.Log; | 16 import org.chromium.base.Log; |
| 18 import org.chromium.base.annotations.CalledByNative; | 17 import org.chromium.base.annotations.CalledByNative; |
| 19 import org.chromium.chrome.R; | 18 import org.chromium.chrome.R; |
| 20 import org.chromium.chrome.browser.ChromeFeatureList; | 19 import org.chromium.chrome.browser.ChromeFeatureList; |
| 21 import org.chromium.chrome.browser.ChromeSwitches; | |
| 22 import org.chromium.chrome.browser.ChromeVersionInfo; | 20 import org.chromium.chrome.browser.ChromeVersionInfo; |
| 23 import org.chromium.chrome.browser.preferences.ChromePreferenceManager; | 21 import org.chromium.chrome.browser.preferences.ChromePreferenceManager; |
| 24 import org.chromium.components.variations.VariationsAssociatedData; | 22 import org.chromium.components.variations.VariationsAssociatedData; |
| 25 import org.chromium.webapk.lib.client.WebApkValidator; | 23 import org.chromium.webapk.lib.client.WebApkValidator; |
| 26 | 24 |
| 27 /** | 25 /** |
| 28 * Contains functionality needed for Chrome to host WebAPKs. | 26 * Contains functionality needed for Chrome to host WebAPKs. |
| 29 */ | 27 */ |
| 30 public class ChromeWebApkHost { | 28 public class ChromeWebApkHost { |
| 31 /** Flag to enable installing WebAPKs using Google Play. */ | 29 /** Flag to enable installing WebAPKs using Google Play. */ |
| (...skipping 14 matching lines...) Expand all Loading... |
| 46 public static boolean isEnabled() { | 44 public static boolean isEnabled() { |
| 47 if (sEnabledForTesting != null) return sEnabledForTesting; | 45 if (sEnabledForTesting != null) return sEnabledForTesting; |
| 48 | 46 |
| 49 return isEnabledInPrefs(); | 47 return isEnabledInPrefs(); |
| 50 } | 48 } |
| 51 | 49 |
| 52 /** Return whether installing WebAPKs using Google Play is enabled. */ | 50 /** Return whether installing WebAPKs using Google Play is enabled. */ |
| 53 public static boolean canUseGooglePlayToInstallWebApk() { | 51 public static boolean canUseGooglePlayToInstallWebApk() { |
| 54 if (!isEnabled()) return false; | 52 if (!isEnabled()) return false; |
| 55 return TextUtils.equals(VariationsAssociatedData.getVariationParamValue( | 53 return TextUtils.equals(VariationsAssociatedData.getVariationParamValue( |
| 56 ChromeFeatureList.WEBAPKS, PLAY_INSTALL), "true"); | 54 ChromeFeatureList.IMPROVED_A2HS, PLAY_INSTALL), "true"); |
| 57 } | 55 } |
| 58 | 56 |
| 59 @CalledByNative | 57 @CalledByNative |
| 60 private static boolean areWebApkEnabled() { | 58 private static boolean areWebApkEnabled() { |
| 61 return ChromeWebApkHost.isEnabled(); | 59 return ChromeWebApkHost.isEnabled(); |
| 62 } | 60 } |
| 63 | 61 |
| 64 /** | 62 /** |
| 65 * Check the cached value to figure out if the feature is enabled. We have t
o use the cached | 63 * Check the cached value to figure out if the feature is enabled. We have t
o use the cached |
| 66 * value because native library may not yet been loaded. | 64 * value because native library may not yet been loaded. |
| 67 * @return Whether the feature is enabled. | 65 * @return Whether the feature is enabled. |
| 68 */ | 66 */ |
| 69 private static boolean isEnabledInPrefs() { | 67 private static boolean isEnabledInPrefs() { |
| 70 // Will go away once the feature is enabled for everyone by default. | 68 // Will go away once the feature is enabled for everyone by default. |
| 71 StrictMode.ThreadPolicy oldPolicy = StrictMode.allowThreadDiskReads(); | 69 StrictMode.ThreadPolicy oldPolicy = StrictMode.allowThreadDiskReads(); |
| 72 try { | 70 try { |
| 73 return ChromePreferenceManager.getInstance( | 71 return ChromePreferenceManager.getInstance( |
| 74 ContextUtils.getApplicationContext()).getCachedWebApkRuntime
Enabled(); | 72 ContextUtils.getApplicationContext()).getCachedWebApkRuntime
Enabled(); |
| 75 } finally { | 73 } finally { |
| 76 StrictMode.setThreadPolicy(oldPolicy); | 74 StrictMode.setThreadPolicy(oldPolicy); |
| 77 } | 75 } |
| 78 } | 76 } |
| 79 | 77 |
| 80 /** | 78 /** |
| 81 * Show dialog warning user that "installation from unknown sources" is requ
ired by the WebAPK | 79 * Show dialog warning user that "installation from unknown sources" is requ
ired by the WebAPK |
| 82 * experiment if: | 80 * experiment if the user enabled "Improved Add to Home screen" via chrome:/
/flags. |
| 83 * - The user toggled the --enable-improved-a2hs command line flag via chrom
e://flags | |
| 84 * AND | |
| 85 * - WebAPKs are not disabled via variations kill switch. | |
| 86 * Must be run prior to {@link cacheEnabledStateForNextLaunch}. | |
| 87 */ | 81 */ |
| 88 public static void launchWebApkRequirementsDialogIfNeeded(Context context) { | 82 public static void launchWebApkRequirementsDialogIfNeeded(Context context) { |
| 89 // Show dialog on Canary & Dev. Installation via "unknown sources" is di
sabled via | 83 // Show dialog on Canary & Dev. Installation via "unknown sources" is di
sabled via |
| 90 // variations on other channels. | 84 // variations on other channels. |
| 91 if (!ChromeVersionInfo.isCanaryBuild() && !ChromeVersionInfo.isDevBuild(
)) return; | 85 if (!ChromeVersionInfo.isCanaryBuild() && !ChromeVersionInfo.isDevBuild(
)) return; |
| 92 | 86 |
| 93 Context applicationContext = ContextUtils.getApplicationContext(); | 87 if (ChromeFeatureList.isEnabled(ChromeFeatureList.IMPROVED_A2HS) |
| 94 boolean wasCommandLineFlagEnabled = ChromePreferenceManager.getInstance(
applicationContext) | 88 && !installingFromUnknownSourcesAllowed()) { |
| 95 .getCachedWebApkCommandLineE
nabled(); | |
| 96 if (computeEnabled() && !wasCommandLineFlagEnabled | |
| 97 && !installingFromUnknownSourcesAllowed(applicationContext)) { | |
| 98 showUnknownSourcesNeededDialog(context); | 89 showUnknownSourcesNeededDialog(context); |
| 99 } | 90 } |
| 100 } | 91 } |
| 101 | 92 |
| 102 /** | 93 /** |
| 103 * Once native is loaded we can consult the command-line (set via about:flag
s) and also finch | 94 * Once native is loaded we can consult the command-line (set via about:flag
s) and also finch |
| 104 * state to see if we should enable WebAPKs. | 95 * state to see if we should enable WebAPKs. |
| 105 */ | 96 */ |
| 106 public static void cacheEnabledStateForNextLaunch() { | 97 public static void cacheEnabledStateForNextLaunch() { |
| 107 ChromePreferenceManager preferenceManager = | 98 ChromePreferenceManager preferenceManager = |
| 108 ChromePreferenceManager.getInstance(ContextUtils.getApplicationC
ontext()); | 99 ChromePreferenceManager.getInstance(ContextUtils.getApplicationC
ontext()); |
| 109 | 100 |
| 110 boolean wasCommandLineEnabled = preferenceManager.getCachedWebApkCommand
LineEnabled(); | |
| 111 boolean isCommandLineEnabled = isCommandLineFlagSet(); | |
| 112 if (isCommandLineEnabled != wasCommandLineEnabled) { | |
| 113 // {@link launchWebApkRequirementsDialogIfNeeded()} is skipped the f
irst time Chrome is | |
| 114 // launched so do caching here instead. | |
| 115 preferenceManager.setCachedWebApkCommandLineEnabled(isCommandLineEna
bled); | |
| 116 } | |
| 117 | |
| 118 boolean wasEnabled = isEnabledInPrefs(); | 101 boolean wasEnabled = isEnabledInPrefs(); |
| 119 boolean isEnabled = computeEnabled(); | 102 boolean isEnabled = ChromeFeatureList.isEnabled(ChromeFeatureList.IMPROV
ED_A2HS); |
| 120 if (isEnabled != wasEnabled) { | 103 if (isEnabled != wasEnabled) { |
| 121 Log.d(TAG, "WebApk setting changed (%s => %s)", wasEnabled, isEnable
d); | 104 Log.d(TAG, "WebApk setting changed (%s => %s)", wasEnabled, isEnable
d); |
| 122 preferenceManager.setCachedWebApkRuntimeEnabled(isEnabled); | 105 preferenceManager.setCachedWebApkRuntimeEnabled(isEnabled); |
| 123 } | 106 } |
| 124 } | 107 } |
| 125 | 108 |
| 126 /** Returns whether the --enable-improved-a2hs command line flag is set */ | |
| 127 private static boolean isCommandLineFlagSet() { | |
| 128 return CommandLine.getInstance().hasSwitch(ChromeSwitches.ENABLE_WEBAPK)
; | |
| 129 } | |
| 130 | |
| 131 /** Returns whether we should enable WebAPKs */ | |
| 132 private static boolean computeEnabled() { | |
| 133 return isCommandLineFlagSet() && ChromeFeatureList.isEnabled(ChromeFeatu
reList.WEBAPKS); | |
| 134 } | |
| 135 | |
| 136 /** | 109 /** |
| 137 * Returns whether the user has enabled installing apps from sources other t
han the Google Play | 110 * Returns whether the user has enabled installing apps from sources other t
han the Google Play |
| 138 * Store. | 111 * Store. |
| 139 */ | 112 */ |
| 140 private static boolean installingFromUnknownSourcesAllowed(Context context)
{ | 113 private static boolean installingFromUnknownSourcesAllowed() { |
| 114 Context applicationContext = ContextUtils.getApplicationContext(); |
| 141 try { | 115 try { |
| 142 return Settings.Secure.getInt( | 116 return Settings.Secure.getInt(applicationContext.getContentResolver(
), |
| 143 context.getContentResolver(), Settings.Secure.INSTALL
_NON_MARKET_APPS) | 117 Settings.Secure.INSTALL_NON_MARKET_APPS) |
| 144 == 1; | 118 == 1; |
| 145 } catch (Settings.SettingNotFoundException e) { | 119 } catch (Settings.SettingNotFoundException e) { |
| 146 return false; | 120 return false; |
| 147 } | 121 } |
| 148 } | 122 } |
| 149 | 123 |
| 150 /** | 124 /** |
| 151 * Show dialog warning user that "installation from unknown sources" is requ
ired by the WebAPK | 125 * Show dialog warning user that "installation from unknown sources" is requ
ired by the WebAPK |
| 152 * experiment. | 126 * experiment. |
| 153 */ | 127 */ |
| (...skipping 11 matching lines...) Expand all Loading... |
| 165 } | 139 } |
| 166 }); | 140 }); |
| 167 builder.setNegativeButton(android.R.string.cancel, new DialogInterface.O
nClickListener() { | 141 builder.setNegativeButton(android.R.string.cancel, new DialogInterface.O
nClickListener() { |
| 168 @Override | 142 @Override |
| 169 public void onClick(DialogInterface dialog, int id) {} | 143 public void onClick(DialogInterface dialog, int id) {} |
| 170 }); | 144 }); |
| 171 AlertDialog dialog = builder.create(); | 145 AlertDialog dialog = builder.create(); |
| 172 dialog.show(); | 146 dialog.show(); |
| 173 } | 147 } |
| 174 } | 148 } |
| OLD | NEW |