diff --git a/android_webview/java/src/org/chromium/android_webview/AwFeatureList.java b/android_webview/java/src/org/chromium/android_webview/AwFeatureList.java index 1678892f7c4c2..1ab663aa1986f 100644 --- a/android_webview/java/src/org/chromium/android_webview/AwFeatureList.java +++ b/android_webview/java/src/org/chromium/android_webview/AwFeatureList.java @@ -4,10 +4,8 @@ package org.chromium.android_webview; -import android.content.pm.PackageInfo; -import android.content.pm.PackageManager; - import org.chromium.base.ContextUtils; +import org.chromium.base.PackageUtils; import org.chromium.base.annotations.JNINamespace; import org.chromium.base.annotations.NativeMethods; import org.chromium.build.annotations.MainDex; @@ -27,14 +25,8 @@ private AwFeatureList() {} private static boolean computePageStartedOnCommitForBrowserNavigations() { if (GMS_PACKAGE.equals(ContextUtils.getApplicationContext().getPackageName())) { - try { - PackageInfo gmsPackage = - ContextUtils.getApplicationContext().getPackageManager().getPackageInfo( - GMS_PACKAGE, 0); - return gmsPackage.versionCode >= 15000000; - } catch (PackageManager.NameNotFoundException e) { - } - return false; + int gmsPackageVersion = PackageUtils.getPackageVersion(GMS_PACKAGE); + return gmsPackageVersion >= 15000000; } return true; } diff --git a/android_webview/nonembedded/java/src/org/chromium/android_webview/services/SafeModeService.java b/android_webview/nonembedded/java/src/org/chromium/android_webview/services/SafeModeService.java index ad1553ed9e74c..3f0a646b11e65 100644 --- a/android_webview/nonembedded/java/src/org/chromium/android_webview/services/SafeModeService.java +++ b/android_webview/nonembedded/java/src/org/chromium/android_webview/services/SafeModeService.java @@ -24,10 +24,12 @@ import org.chromium.android_webview.common.SafeModeController; import org.chromium.android_webview.common.services.ISafeModeService; +import org.chromium.android_webview.services.SafeModeService.TrustedPackage; import org.chromium.android_webview.services.ServicesStatsHelper.NonembeddedService; import org.chromium.base.BuildInfo; import org.chromium.base.ContextUtils; import org.chromium.base.Log; +import org.chromium.base.PackageUtils; import org.chromium.base.compat.ApiHelperForP; import java.security.MessageDigest; @@ -109,22 +111,20 @@ private static boolean hasSigningCertificate( return ApiHelperForP.hasSigningCertificate(context.getPackageManager(), packageName, expectedCertHash, PackageManager.CERT_INPUT_SHA256); } - try { - PackageInfo info = context.getPackageManager().getPackageInfo( - packageName, PackageManager.GET_SIGNATURES); + PackageInfo info = + PackageUtils.getPackageInfo(packageName, PackageManager.GET_SIGNATURES); + if (info != null) { Signature[] signatures = info.signatures; - if (info.signatures == null) { + if (signatures == null) { return false; } - for (Signature signature : info.signatures) { + for (Signature signature : signatures) { if (Arrays.equals(expectedCertHash, sha256Hash(signature))) { return true; } } - return false; // no matches - } catch (PackageManager.NameNotFoundException e) { - return false; } + return false; // no matches } @Nullable diff --git a/base/android/java/src/org/chromium/base/BuildInfo.java b/base/android/java/src/org/chromium/base/BuildInfo.java index fee8007c03166..57208d1598c5c 100644 --- a/base/android/java/src/org/chromium/base/BuildInfo.java +++ b/base/android/java/src/org/chromium/base/BuildInfo.java @@ -11,7 +11,6 @@ import android.content.pm.ApplicationInfo; import android.content.pm.PackageInfo; import android.content.pm.PackageManager; -import android.content.pm.PackageManager.NameNotFoundException; import android.content.res.Configuration; import android.os.Build; import android.text.TextUtils; @@ -148,98 +147,81 @@ public static BuildInfo getInstance() { @VisibleForTesting BuildInfo() { sInitialized = true; - try { - Context appContext = ContextUtils.getApplicationContext(); - String hostPackageName = appContext.getPackageName(); - PackageManager pm = appContext.getPackageManager(); - PackageInfo pi = pm.getPackageInfo(hostPackageName, 0); - hostVersionCode = packageVersionCode(pi); - if (sBrowserPackageInfo != null) { - packageName = sBrowserPackageInfo.packageName; - versionCode = packageVersionCode(sBrowserPackageInfo); - versionName = nullToEmpty(sBrowserPackageInfo.versionName); - sBrowserApplicationInfo = sBrowserPackageInfo.applicationInfo; - sBrowserPackageInfo = null; - } else { - packageName = hostPackageName; - versionCode = hostVersionCode; - versionName = nullToEmpty(pi.versionName); - sBrowserApplicationInfo = appContext.getApplicationInfo(); - } - hostPackageLabel = nullToEmpty(pm.getApplicationLabel(pi.applicationInfo)); - installerPackageName = nullToEmpty(pm.getInstallerPackageName(packageName)); + Context appContext = ContextUtils.getApplicationContext(); + String hostPackageName = appContext.getPackageName(); + PackageManager pm = appContext.getPackageManager(); + PackageInfo pi = PackageUtils.getPackageInfo(hostPackageName, 0); + hostVersionCode = packageVersionCode(pi); + if (sBrowserPackageInfo != null) { + packageName = sBrowserPackageInfo.packageName; + versionCode = packageVersionCode(sBrowserPackageInfo); + versionName = nullToEmpty(sBrowserPackageInfo.versionName); + sBrowserApplicationInfo = sBrowserPackageInfo.applicationInfo; + sBrowserPackageInfo = null; + } else { + packageName = hostPackageName; + versionCode = hostVersionCode; + versionName = nullToEmpty(pi.versionName); + sBrowserApplicationInfo = appContext.getApplicationInfo(); + } + + hostPackageLabel = nullToEmpty(pm.getApplicationLabel(pi.applicationInfo)); + installerPackageName = nullToEmpty(pm.getInstallerPackageName(packageName)); - PackageInfo gmsPackageInfo = null; - try { - gmsPackageInfo = pm.getPackageInfo("com.google.android.gms", 0); - } catch (NameNotFoundException e) { - // TODO(b/197112084): Re-enable the logging - // Log.d(TAG, "GMS package is not found."); - } - gmsVersionCode = gmsPackageInfo != null - ? String.valueOf(packageVersionCode(gmsPackageInfo)) - : "gms versionCode not available."; + PackageInfo gmsPackageInfo = PackageUtils.getPackageInfo("com.google.android.gms", 0); + gmsVersionCode = gmsPackageInfo != null ? String.valueOf(packageVersionCode(gmsPackageInfo)) + : "gms versionCode not available."; + + // Substratum is a theme engine that enables users to use custom themes provided + // by theme apps. Sometimes these can cause crashs if not installed correctly. + // These crashes can be difficult to debug, so knowing if the theme manager is + // present on the device is useful (http://crbug.com/820591). + customThemes = String.valueOf(PackageUtils.isPackageInstalled("projekt.substratum")); - String hasCustomThemes = "true"; + String currentResourcesVersion = "Not Enabled"; + // Controlled by target specific build flags. + if (BuildConfig.R_STRING_PRODUCT_VERSION != 0) { try { - // Substratum is a theme engine that enables users to use custom themes provided - // by theme apps. Sometimes these can cause crashs if not installed correctly. - // These crashes can be difficult to debug, so knowing if the theme manager is - // present on the device is useful (http://crbug.com/820591). - pm.getPackageInfo("projekt.substratum", 0); - } catch (NameNotFoundException e) { - hasCustomThemes = "false"; + // This value can be compared with the actual product version to determine if + // corrupted resources were the cause of a crash. This can happen if the app + // loads resources from the outdated package during an update + // (http://crbug.com/820591). + currentResourcesVersion = ContextUtils.getApplicationContext().getString( + BuildConfig.R_STRING_PRODUCT_VERSION); + } catch (Exception e) { + currentResourcesVersion = "Not found"; } - customThemes = hasCustomThemes; - - String currentResourcesVersion = "Not Enabled"; - // Controlled by target specific build flags. - if (BuildConfig.R_STRING_PRODUCT_VERSION != 0) { - try { - // This value can be compared with the actual product version to determine if - // corrupted resources were the cause of a crash. This can happen if the app - // loads resources from the outdated package during an update - // (http://crbug.com/820591). - currentResourcesVersion = ContextUtils.getApplicationContext().getString( - BuildConfig.R_STRING_PRODUCT_VERSION); - } catch (Exception e) { - currentResourcesVersion = "Not found"; - } - } - resourcesVersion = currentResourcesVersion; + } + resourcesVersion = currentResourcesVersion; - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { - abiString = TextUtils.join(", ", Build.SUPPORTED_ABIS); - } else { - abiString = String.format("ABI1: %s, ABI2: %s", Build.CPU_ABI, Build.CPU_ABI2); - } + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { + abiString = TextUtils.join(", ", Build.SUPPORTED_ABIS); + } else { + abiString = String.format("ABI1: %s, ABI2: %s", Build.CPU_ABI, Build.CPU_ABI2); + } - // The value is truncated, as this is used for crash and UMA reporting. - androidBuildFingerprint = Build.FINGERPRINT.substring( - 0, Math.min(Build.FINGERPRINT.length(), MAX_FINGERPRINT_LENGTH)); + // The value is truncated, as this is used for crash and UMA reporting. + androidBuildFingerprint = Build.FINGERPRINT.substring( + 0, Math.min(Build.FINGERPRINT.length(), MAX_FINGERPRINT_LENGTH)); - // See https://developer.android.com/training/tv/start/hardware.html#runtime-check. - UiModeManager uiModeManager = - (UiModeManager) appContext.getSystemService(UI_MODE_SERVICE); - isTV = uiModeManager != null - && uiModeManager.getCurrentModeType() == Configuration.UI_MODE_TYPE_TELEVISION; + // See https://developer.android.com/training/tv/start/hardware.html#runtime-check. + UiModeManager uiModeManager = (UiModeManager) appContext.getSystemService(UI_MODE_SERVICE); + isTV = uiModeManager != null + && uiModeManager.getCurrentModeType() == Configuration.UI_MODE_TYPE_TELEVISION; - boolean isAutomotive; - try { - isAutomotive = pm.hasSystemFeature(PackageManager.FEATURE_AUTOMOTIVE); - } catch (SecurityException e) { - Log.e(TAG, "Unable to query for Automotive system feature", e); - - // `hasSystemFeature` can possibly throw an exception on modified instances of - // Android. In this case, assume the device is not a car since automotive vehicles - // should not have such a modification. - isAutomotive = false; - } - this.isAutomotive = isAutomotive; - } catch (NameNotFoundException e) { - throw new RuntimeException(e); + boolean isAutomotive; + try { + isAutomotive = pm.hasSystemFeature(PackageManager.FEATURE_AUTOMOTIVE); + } catch (SecurityException e) { + Log.e(TAG, "Unable to query for Automotive system feature", e); + + // `hasSystemFeature` can possibly throw an exception on modified instances of + // Android. In this case, assume the device is not a car since automotive vehicles + // should not have such a modification. + isAutomotive = false; } + this.isAutomotive = isAutomotive; } /** diff --git a/base/android/java/src/org/chromium/base/PackageUtils.java b/base/android/java/src/org/chromium/base/PackageUtils.java index b7b7b699a64aa..00f1378af185c 100644 --- a/base/android/java/src/org/chromium/base/PackageUtils.java +++ b/base/android/java/src/org/chromium/base/PackageUtils.java @@ -49,6 +49,7 @@ public class PackageUtils { * @return The package's version code if found, -1 otherwise. */ public static int getPackageVersion(String packageName) { + // TODO(agrieve): Return a long and move BuildInfo.packageVersionCode() to this class. PackageInfo packageInfo = getPackageInfo(packageName, 0); if (packageInfo != null) return packageInfo.versionCode; return -1; diff --git a/base/android/java/src/org/chromium/base/process_launcher/ChildProcessConnection.java b/base/android/java/src/org/chromium/base/process_launcher/ChildProcessConnection.java index cf4a32558b56a..e33365e96dea1 100644 --- a/base/android/java/src/org/chromium/base/process_launcher/ChildProcessConnection.java +++ b/base/android/java/src/org/chromium/base/process_launcher/ChildProcessConnection.java @@ -9,7 +9,6 @@ import android.content.Intent; import android.content.pm.ApplicationInfo; import android.content.pm.PackageInfo; -import android.content.pm.PackageManager; import android.os.Build; import android.os.Bundle; import android.os.Handler; @@ -25,10 +24,10 @@ import org.chromium.base.BaseFeatures; import org.chromium.base.BuildInfo; import org.chromium.base.ChildBindingState; -import org.chromium.base.ContextUtils; import org.chromium.base.Log; import org.chromium.base.MemoryPressureLevel; import org.chromium.base.MemoryPressureListener; +import org.chromium.base.PackageUtils; import org.chromium.base.ThreadUtils; import org.chromium.base.TraceEvent; import org.chromium.base.memory.MemoryPressureCallback; @@ -614,18 +613,10 @@ protected void onServiceConnectedOnLauncherThread(IBinder service) { if (childMismatchError != null) { // Check if it looks like the browser's package version has been changed since the // browser process launched (i.e. if the install somehow did not kill our process) - boolean versionHasChanged; - try { - PackageInfo latestPackage = - ContextUtils.getApplicationContext().getPackageManager().getPackageInfo( - BuildInfo.getInstance().packageName, 0); - long latestVersionCode = BuildInfo.packageVersionCode(latestPackage); - long loadedVersionCode = BuildInfo.getInstance().versionCode; - versionHasChanged = latestVersionCode != loadedVersionCode; - } catch (PackageManager.NameNotFoundException e) { - // Package uninstalled since we launched? Then the version has "changed"... - versionHasChanged = true; - } + PackageInfo latestPackage = PackageUtils.getApplicationPackageInfo(0); + long latestVersionCode = BuildInfo.packageVersionCode(latestPackage); + long loadedVersionCode = BuildInfo.getInstance().versionCode; + boolean versionHasChanged = latestVersionCode != loadedVersionCode; RecordHistogram.recordBooleanHistogram( "Android.ChildMismatch.BrowserVersionChanged2", versionHasChanged); childMismatchError += "; browser version has changed: " + versionHasChanged; diff --git a/chrome/android/java/src/org/chromium/chrome/browser/AppHooks.java b/chrome/android/java/src/org/chromium/chrome/browser/AppHooks.java index e614b4ad3dbae..2db970ee1031f 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/AppHooks.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/AppHooks.java @@ -4,9 +4,6 @@ package org.chromium.chrome.browser; -import android.content.pm.PackageInfo; -import android.content.pm.PackageManager; - import androidx.annotation.Nullable; import androidx.annotation.VisibleForTesting; @@ -14,6 +11,7 @@ import com.google.android.gms.common.GoogleApiAvailability; import org.chromium.base.ContextUtils; +import org.chromium.base.PackageUtils; import org.chromium.base.annotations.CalledByNative; import org.chromium.chrome.browser.customtabs.CustomTabsConnection; import org.chromium.chrome.browser.directactions.DirectActionCoordinator; @@ -247,16 +245,11 @@ public DigitalWellbeingClient createDigitalWellbeingClient() { * same as {@link GoogleApiAvailability#isGooglePlayServicesAvailable()}. */ public int isGoogleApiAvailableWithMinApkVersion(int minApkVersion) { - try { - PackageInfo gmsPackageInfo = - ContextUtils.getApplicationContext().getPackageManager().getPackageInfo( - GoogleApiAvailability.GOOGLE_PLAY_SERVICES_PACKAGE, /* flags= */ 0); - int apkVersion = gmsPackageInfo.versionCode; - if (apkVersion >= minApkVersion) return ConnectionResult.SUCCESS; - } catch (PackageManager.NameNotFoundException e) { - return ConnectionResult.SERVICE_MISSING; - } - return ConnectionResult.SERVICE_VERSION_UPDATE_REQUIRED; + int apkVersion = + PackageUtils.getPackageVersion(GoogleApiAvailability.GOOGLE_PLAY_SERVICES_PACKAGE); + return apkVersion < 0 ? ConnectionResult.SERVICE_MISSING + : apkVersion < minApkVersion ? ConnectionResult.SERVICE_VERSION_UPDATE_REQUIRED + : ConnectionResult.SUCCESS; } /** diff --git a/chrome/android/java/src/org/chromium/chrome/browser/PlayServicesVersionInfo.java b/chrome/android/java/src/org/chromium/chrome/browser/PlayServicesVersionInfo.java index d622ca1ec488f..ba1765486cf43 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/PlayServicesVersionInfo.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/PlayServicesVersionInfo.java @@ -4,12 +4,9 @@ package org.chromium.chrome.browser; -import android.content.Context; -import android.content.pm.PackageManager; - import com.google.android.gms.common.GoogleApiAvailability; -import org.chromium.base.ContextUtils; +import org.chromium.base.PackageUtils; import org.chromium.base.annotations.CalledByNative; import org.chromium.components.externalauth.ExternalAuthUtils; @@ -27,10 +24,8 @@ public class PlayServicesVersionInfo { */ @CalledByNative public static String getGmsInfo() { - Context context = ContextUtils.getApplicationContext(); - final long sdkVersion = GoogleApiAvailability.GOOGLE_PLAY_SERVICES_VERSION_CODE; - final long installedGmsVersion = getApkVersionNumber(context); + final long installedGmsVersion = getApkVersionNumber(); final String accessType; ExternalAuthUtils externalAuthUtils = ExternalAuthUtils.getInstance(); @@ -49,16 +44,15 @@ public static String getGmsInfo() { /** * * @param context A Context with which to retrieve the PackageManager. - * @return The version code for the Google Play Services installed on the device or 0 if the + * @return The version code for the Google Play Services installed on the device or -1 if the * package is not found. */ - public static int getApkVersionNumber(Context context) { - try { - return context.getPackageManager() - .getPackageInfo(GoogleApiAvailability.GOOGLE_PLAY_SERVICES_PACKAGE, 0) - .versionCode; - } catch (PackageManager.NameNotFoundException e) { - return 0; + public static int getApkVersionNumber() { + int ret = + PackageUtils.getPackageVersion(GoogleApiAvailability.GOOGLE_PLAY_SERVICES_PACKAGE); + if (ret < 0) { + ret = 0; } + return ret; } } diff --git a/chrome/android/java/src/org/chromium/chrome/browser/app/ChromeActivity.java b/chrome/android/java/src/org/chromium/chrome/browser/app/ChromeActivity.java index 8657f7482b080..e3857d9561b45 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/app/ChromeActivity.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/app/ChromeActivity.java @@ -1353,7 +1353,7 @@ protected void initDeferredStartupForActivity() { } recordDisplayDimensions(); - int playServicesVersion = PlayServicesVersionInfo.getApkVersionNumber(this); + int playServicesVersion = PlayServicesVersionInfo.getApkVersionNumber(); RecordHistogram.recordBooleanHistogram( "Android.PlayServices.Installed", playServicesVersion > 0); RecordHistogram.recordSparseHistogram( diff --git a/chrome/android/java/src/org/chromium/chrome/browser/omaha/OmahaBase.java b/chrome/android/java/src/org/chromium/chrome/browser/omaha/OmahaBase.java index 4f80654a7db5a..a0fdbd054ca58 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/omaha/OmahaBase.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/omaha/OmahaBase.java @@ -319,7 +319,7 @@ private void handleRegisterActiveRequest() { * @return version currently installed on the device. */ protected String getInstalledVersion() { - return VersionNumberGetter.getInstance().getCurrentlyUsedVersion(getContext()); + return VersionNumberGetter.getInstance().getCurrentlyUsedVersion(); } protected boolean generateAndPostRequest(long currentTimestamp, String sessionID) { diff --git a/chrome/android/java/src/org/chromium/chrome/browser/omaha/UpdateStatusProvider.java b/chrome/android/java/src/org/chromium/chrome/browser/omaha/UpdateStatusProvider.java index 2f770dc4f83b5..cf871ab0a942e 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/omaha/UpdateStatusProvider.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/omaha/UpdateStatusProvider.java @@ -7,7 +7,6 @@ import android.content.ActivityNotFoundException; import android.content.Context; import android.content.Intent; -import android.content.pm.PackageManager; import android.net.Uri; import android.os.Environment; import android.os.StatFs; @@ -23,6 +22,7 @@ import org.chromium.base.Callback; import org.chromium.base.ContextUtils; import org.chromium.base.ObserverList; +import org.chromium.base.PackageUtils; import org.chromium.base.ThreadUtils; import org.chromium.base.metrics.RecordHistogram; import org.chromium.base.task.AsyncTask; @@ -251,7 +251,7 @@ public UpdateStatus getResult() { protected UpdateStatus doInBackground() { UpdateStatus testStatus = getTestStatus(); if (testStatus != null) return testStatus; - return getRealStatus(mContext); + return getRealStatus(); } @Override @@ -286,16 +286,16 @@ private UpdateStatus getTestStatus() { return status; } - private UpdateStatus getRealStatus(Context context) { + private UpdateStatus getRealStatus() { UpdateStatus status = new UpdateStatus(); - if (VersionNumberGetter.isNewerVersionAvailable(context)) { + if (VersionNumberGetter.isNewerVersionAvailable()) { status.updateUrl = MarketURLGetter.getMarketUrl(); - status.latestVersion = - VersionNumberGetter.getInstance().getLatestKnownVersion(context); + status.latestVersion = VersionNumberGetter.getInstance().getLatestKnownVersion(); - boolean allowedToUpdate = - checkForSufficientStorage() && isGooglePlayStoreAvailable(context); + boolean allowedToUpdate = checkForSufficientStorage() + && PackageUtils.isPackageInstalled( + GooglePlayServicesUtil.GOOGLE_PLAY_STORE_PACKAGE); status.updateState = allowedToUpdate ? UpdateState.UPDATE_AVAILABLE : UpdateState.NONE; @@ -327,16 +327,6 @@ private boolean checkForSufficientStorage() { return size >= minRequiredStorage; } - private boolean isGooglePlayStoreAvailable(Context context) { - try { - context.getPackageManager().getPackageInfo( - GooglePlayServicesUtil.GOOGLE_PLAY_STORE_PACKAGE, 0); - } catch (PackageManager.NameNotFoundException e) { - return false; - } - return true; - } - private long getSize(StatFs statFs) { return ConversionUtils.bytesToMegabytes(statFs.getAvailableBytes()); } diff --git a/chrome/android/java/src/org/chromium/chrome/browser/omaha/VersionNumberGetter.java b/chrome/android/java/src/org/chromium/chrome/browser/omaha/VersionNumberGetter.java index 01eb29216e367..56e5121a40de1 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/omaha/VersionNumberGetter.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/omaha/VersionNumberGetter.java @@ -4,7 +4,6 @@ package org.chromium.chrome.browser.omaha; -import android.content.Context; import android.content.SharedPreferences; import android.os.Build; @@ -57,7 +56,7 @@ protected VersionNumberGetter() { } * This function incurs I/O, so make sure you don't use it from the main thread. * @return The latest version if we retrieved one from the Omaha server, or "" if we haven't. */ - public String getLatestKnownVersion(Context context) { + public String getLatestKnownVersion() { assert !ThreadUtils.runningOnUiThread(); SharedPreferences prefs = OmahaBase.getSharedPreferences(); return prefs.getString(OmahaBase.PREF_LATEST_VERSION, ""); @@ -67,7 +66,7 @@ public String getLatestKnownVersion(Context context) { * Retrieve the version of Chrome we're using. * @return The latest version if we retrieved one from the Omaha server, or "" if we haven't. */ - public String getCurrentlyUsedVersion(Context context) { + public String getCurrentlyUsedVersion() { return BuildInfo.getInstance().versionName; } @@ -112,7 +111,7 @@ public static boolean isCurrentOsVersionSupported() { * * NOTE: This function incurs I/O, so don't use it on the main thread. */ - static boolean isNewerVersionAvailable(Context context) { + static boolean isNewerVersionAvailable() { assert !ThreadUtils.runningOnUiThread(); // This may be explicitly enabled for some channels and for unit tests. @@ -128,8 +127,8 @@ static boolean isNewerVersionAvailable(Context context) { // Compare version numbers. VersionNumberGetter getter = getInstance(); - String currentStr = getter.getCurrentlyUsedVersion(context); - String latestStr = getter.getLatestKnownVersion(context); + String currentStr = getter.getCurrentlyUsedVersion(); + String latestStr = getter.getLatestKnownVersion(); VersionNumber currentVersionNumber = VersionNumber.fromString(currentStr); VersionNumber latestVersionNumber = VersionNumber.fromString(latestStr); diff --git a/chrome/android/java/src/org/chromium/chrome/browser/webapps/WebappDataStorage.java b/chrome/android/java/src/org/chromium/chrome/browser/webapps/WebappDataStorage.java index d4cd7ac99d59e..e327f527bf3ec 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/webapps/WebappDataStorage.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/webapps/WebappDataStorage.java @@ -7,7 +7,6 @@ import android.content.Intent; import android.content.SharedPreferences; import android.content.pm.PackageInfo; -import android.content.pm.PackageManager; import android.graphics.Bitmap; import android.text.format.DateUtils; @@ -16,6 +15,7 @@ import org.chromium.base.ContextUtils; import org.chromium.base.Log; +import org.chromium.base.PackageUtils; import org.chromium.base.task.AsyncTask; import org.chromium.base.task.PostTask; import org.chromium.base.task.TaskTraits; @@ -632,14 +632,8 @@ protected WebappDataStorage(String webappId) { * Fetches the timestamp that the WebAPK was installed from the PackageManager. */ private long fetchWebApkInstallTimestamp(String webApkPackageName) { - try { - PackageManager packageManager = - ContextUtils.getApplicationContext().getPackageManager(); - PackageInfo packageInfo = packageManager.getPackageInfo(webApkPackageName, 0); - return packageInfo.firstInstallTime; - } catch (PackageManager.NameNotFoundException e) { - } - return 0; + PackageInfo packageInfo = PackageUtils.getPackageInfo(webApkPackageName, 0); + return packageInfo == null ? 0 : packageInfo.firstInstallTime; } /** diff --git a/chrome/android/java/src/org/chromium/chrome/browser/webapps/launchpad/LaunchpadUtils.java b/chrome/android/java/src/org/chromium/chrome/browser/webapps/launchpad/LaunchpadUtils.java index c744c2fd44eb5..758c6e27f4056 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/webapps/launchpad/LaunchpadUtils.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/webapps/launchpad/LaunchpadUtils.java @@ -7,13 +7,13 @@ import android.app.Activity; import android.content.Context; import android.content.Intent; -import android.content.pm.PackageInfo; import android.content.pm.PackageManager; import android.content.pm.ResolveInfo; import androidx.annotation.VisibleForTesting; import org.chromium.base.Log; +import org.chromium.base.PackageUtils; import org.chromium.chrome.browser.browserservices.intents.WebappInfo; import org.chromium.chrome.browser.webapps.WebApkIntentDataProviderFactory; import org.chromium.components.webapk.lib.client.WebApkValidator; @@ -58,15 +58,14 @@ public static List retrieveWebApks(Context context) { intent.addCategory(CATEGORY_WEBAPK_API); for (ResolveInfo info : packageManager.queryIntentServices(intent, PackageManager.MATCH_ALL)) { - if (info.serviceInfo.packageName != null - && WebApkValidator.isValidV1WebApk(context, info.serviceInfo.packageName)) { - try { - PackageInfo packageInfo = - packageManager.getPackageInfo(info.serviceInfo.packageName, 0); - WebappInfo webApkInfo = - WebappInfo.create(WebApkIntentDataProviderFactory.create(new Intent(), - packageInfo.packageName, "", ShortcutSource.UNKNOWN, - false /* forceNavigation */, + String packageName = info.serviceInfo.packageName; + if (packageName != null && WebApkValidator.isValidV1WebApk(context, packageName)) { + if (!PackageUtils.isPackageInstalled(packageName)) { + Log.e(TAG, info.serviceInfo.packageName + " doesn't exist"); + } else { + WebappInfo webApkInfo = WebappInfo.create( + WebApkIntentDataProviderFactory.create(new Intent(), packageName, "", + ShortcutSource.UNKNOWN, false /* forceNavigation */, false /* isSplashProvidedByWebApk */, null /* shareData */, null /* shareDataActivityClassName */)); if (webApkInfo != null) { @@ -75,8 +74,6 @@ public static List retrieveWebApks(Context context) { webApkInfo.icon().bitmap(), webApkInfo.shortcutItems()); apps.add(item); } - } catch (PackageManager.NameNotFoundException e) { - Log.e(TAG, info.serviceInfo.packageName + " doesn't exist"); } } } diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/hardware_acceleration/ManifestHWATest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/hardware_acceleration/ManifestHWATest.java index f07e6638f7181..43e6ccf29faf8 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/hardware_acceleration/ManifestHWATest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/hardware_acceleration/ManifestHWATest.java @@ -4,11 +4,9 @@ package org.chromium.chrome.browser.hardware_acceleration; -import android.content.Context; import android.content.pm.ActivityInfo; import android.content.pm.PackageInfo; import android.content.pm.PackageManager; -import android.support.test.InstrumentationRegistry; import androidx.test.filters.SmallTest; @@ -16,6 +14,7 @@ import org.junit.Test; import org.junit.runner.RunWith; +import org.chromium.base.PackageUtils; import org.chromium.base.test.BaseJUnit4ClassRunner; import org.chromium.base.test.util.Batch; import org.chromium.chrome.browser.app.ChromeActivity; @@ -29,10 +28,7 @@ public class ManifestHWATest { @Test @SmallTest public void testAccelerationDisabled() throws Exception { - Context context = InstrumentationRegistry.getTargetContext(); - PackageInfo info = context.getPackageManager().getPackageInfo( - context.getApplicationInfo().packageName, - PackageManager.GET_ACTIVITIES); + PackageInfo info = PackageUtils.getApplicationPackageInfo(PackageManager.GET_ACTIVITIES); for (ActivityInfo activityInfo : info.activities) { String activityName = activityInfo.targetActivity != null ? activityInfo.targetActivity : activityInfo.name; diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/omaha/UpdateMenuItemHelperTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/omaha/UpdateMenuItemHelperTest.java index 71a99f6f73583..eeba6cc394805 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/omaha/UpdateMenuItemHelperTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/omaha/UpdateMenuItemHelperTest.java @@ -6,7 +6,6 @@ import android.app.Activity; import android.app.Instrumentation.ActivityResult; -import android.content.Context; import android.os.Build; import androidx.test.espresso.intent.Intents; @@ -72,14 +71,14 @@ public MockVersionNumberGetter(String currentVersion, String latestVersion) { } @Override - public String getCurrentlyUsedVersion(Context applicationContext) { + public String getCurrentlyUsedVersion() { Assert.assertNotNull("Never set the current version", mCurrentVersion); mAskedForCurrentVersion = true; return mCurrentVersion; } @Override - public String getLatestKnownVersion(Context applicationContext) { + public String getLatestKnownVersion() { Assert.assertNotNull("Never set the latest version", mLatestVersion); mAskedForLatestVersion = true; return mLatestVersion; diff --git a/chrome/browser/feedback/android/java/src/org/chromium/chrome/browser/feedback/PermissionFeedbackSource.java b/chrome/browser/feedback/android/java/src/org/chromium/chrome/browser/feedback/PermissionFeedbackSource.java index 60128577bb68e..fa0855b406546 100644 --- a/chrome/browser/feedback/android/java/src/org/chromium/chrome/browser/feedback/PermissionFeedbackSource.java +++ b/chrome/browser/feedback/android/java/src/org/chromium/chrome/browser/feedback/PermissionFeedbackSource.java @@ -4,15 +4,11 @@ package org.chromium.chrome.browser.feedback; -import android.content.Context; import android.content.pm.PackageInfo; import android.content.pm.PackageManager; -import android.content.pm.PackageManager.NameNotFoundException; import android.text.TextUtils; -import android.util.Pair; -import org.chromium.base.CollectionUtil; -import org.chromium.base.ContextUtils; +import org.chromium.base.PackageUtils; import java.util.Map; @@ -25,28 +21,22 @@ public Map getFeedback() { String grantedPermissions = ""; String notGrantedPermission = ""; - try { - Context ctx = ContextUtils.getApplicationContext(); - PackageInfo pi = ctx.getPackageManager().getPackageInfo( - ctx.getPackageName(), PackageManager.GET_PERMISSIONS); - if (pi == null || pi.requestedPermissions == null) return null; - - for (int i = 0; i < pi.requestedPermissions.length; i++) { - int flags = pi.requestedPermissionsFlags[i]; - String permission = pi.requestedPermissions[i]; - if ((flags & PackageInfo.REQUESTED_PERMISSION_GRANTED) != 0) { - if (!TextUtils.isEmpty(grantedPermissions)) grantedPermissions += ", "; - grantedPermissions += permission; - } else { - if (!TextUtils.isEmpty(notGrantedPermission)) notGrantedPermission += ", "; - notGrantedPermission += permission; - } + PackageInfo pi = PackageUtils.getApplicationPackageInfo(PackageManager.GET_PERMISSIONS); + if (pi == null || pi.requestedPermissions == null) return null; + + for (int i = 0; i < pi.requestedPermissions.length; i++) { + int flags = pi.requestedPermissionsFlags[i]; + String permission = pi.requestedPermissions[i]; + if ((flags & PackageInfo.REQUESTED_PERMISSION_GRANTED) != 0) { + if (!TextUtils.isEmpty(grantedPermissions)) grantedPermissions += ", "; + grantedPermissions += permission; + } else { + if (!TextUtils.isEmpty(notGrantedPermission)) notGrantedPermission += ", "; + notGrantedPermission += permission; } - } catch (NameNotFoundException e) { - return null; } - return CollectionUtil.newHashMap(Pair.create("Granted Permissions", grantedPermissions), - Pair.create("Not Granted or Requested Permissions", notGrantedPermission)); + return Map.of("Granted Permissions", grantedPermissions, + "Not Granted or Requested Permissions", notGrantedPermission); } } \ No newline at end of file diff --git a/components/crash/android/java/src/org/chromium/components/crash/browser/PackagePaths.java b/components/crash/android/java/src/org/chromium/components/crash/browser/PackagePaths.java index 73a174cddcd71..f3eb0e417a090 100644 --- a/components/crash/android/java/src/org/chromium/components/crash/browser/PackagePaths.java +++ b/components/crash/android/java/src/org/chromium/components/crash/browser/PackagePaths.java @@ -6,11 +6,9 @@ import android.content.pm.PackageInfo; import android.content.pm.PackageManager; -import android.content.pm.PackageManager.NameNotFoundException; import android.text.TextUtils; -import org.chromium.base.BuildInfo; -import org.chromium.base.ContextUtils; +import org.chromium.base.PackageUtils; import org.chromium.base.annotations.CalledByNative; import java.io.File; @@ -33,17 +31,15 @@ private PackagePaths() {} */ @CalledByNative public static String[] makePackagePaths(String arch) { - try { - PackageManager pm = ContextUtils.getApplicationContext().getPackageManager(); - PackageInfo pi = pm.getPackageInfo(BuildInfo.getInstance().packageName, - PackageManager.GET_SHARED_LIBRARY_FILES - | PackageManager.MATCH_UNINSTALLED_PACKAGES); + PackageInfo pi = + PackageUtils.getApplicationPackageInfo(PackageManager.GET_SHARED_LIBRARY_FILES + | PackageManager.MATCH_UNINSTALLED_PACKAGES); - List zipPaths = new ArrayList<>(10); - zipPaths.add(pi.applicationInfo.sourceDir); - if (pi.applicationInfo.splitSourceDirs != null) { - Collections.addAll(zipPaths, pi.applicationInfo.splitSourceDirs); - } + List zipPaths = new ArrayList<>(10); + zipPaths.add(pi.applicationInfo.sourceDir); + if (pi.applicationInfo.splitSourceDirs != null) { + Collections.addAll(zipPaths, pi.applicationInfo.splitSourceDirs); + } if (pi.applicationInfo.sharedLibraryFiles != null) { Collections.addAll(zipPaths, pi.applicationInfo.sharedLibraryFiles); @@ -75,9 +71,5 @@ public static String[] makePackagePaths(String arch) { return new String[] {TextUtils.join(File.pathSeparator, zipPaths), TextUtils.join(File.pathSeparator, libPaths)}; - - } catch (NameNotFoundException e) { - throw new RuntimeException(e); - } } } diff --git a/components/module_installer/android/java/src/org/chromium/components/module_installer/util/CrashKeyRecorder.java b/components/module_installer/android/java/src/org/chromium/components/module_installer/util/CrashKeyRecorder.java index f99ad3a8b29d3..036ed89b406e0 100644 --- a/components/module_installer/android/java/src/org/chromium/components/module_installer/util/CrashKeyRecorder.java +++ b/components/module_installer/android/java/src/org/chromium/components/module_installer/util/CrashKeyRecorder.java @@ -6,15 +6,13 @@ import android.content.Context; import android.content.pm.PackageInfo; -import android.content.pm.PackageManager; -import android.content.pm.PackageManager.NameNotFoundException; import android.text.TextUtils; import com.google.android.play.core.splitinstall.SplitInstallManager; import com.google.android.play.core.splitinstall.SplitInstallManagerFactory; -import org.chromium.base.BuildInfo; import org.chromium.base.ContextUtils; +import org.chromium.base.PackageUtils; import org.chromium.components.crash.CrashKeyIndex; import org.chromium.components.crash.CrashKeys; @@ -33,14 +31,9 @@ public static void updateCrashKeys() { // Get modules that are fully installed as split APKs (excluding base which is always // installed). Tree set to have ordered and, thus, deterministic results. Set fullyInstalledModules = new TreeSet<>(); - try { - PackageManager pm = context.getPackageManager(); - PackageInfo packageInfo = pm.getPackageInfo(BuildInfo.getInstance().packageName, 0); - if (packageInfo.splitNames != null) { - fullyInstalledModules.addAll(Arrays.asList(packageInfo.splitNames)); - } - } catch (NameNotFoundException e) { - throw new RuntimeException(e); + PackageInfo packageInfo = PackageUtils.getApplicationPackageInfo(0); + if (packageInfo.splitNames != null) { + fullyInstalledModules.addAll(Arrays.asList(packageInfo.splitNames)); } // Create temporary split install manager to retrieve both fully installed and emulated diff --git a/components/payments/content/android/java/src/org/chromium/components/payments/PackageManagerDelegate.java b/components/payments/content/android/java/src/org/chromium/components/payments/PackageManagerDelegate.java index 03c8a7790310c..211eca5839256 100644 --- a/components/payments/content/android/java/src/org/chromium/components/payments/PackageManagerDelegate.java +++ b/components/payments/content/android/java/src/org/chromium/components/payments/PackageManagerDelegate.java @@ -21,6 +21,7 @@ import org.chromium.base.ContextUtils; import org.chromium.base.PackageManagerUtils; +import org.chromium.base.PackageUtils; import java.util.List; @@ -43,12 +44,7 @@ public boolean hasSystemFeature(String feature) { */ @SuppressLint("PackageManagerGetSignatures") public PackageInfo getPackageInfoWithSignatures(String packageName) { - try { - return ContextUtils.getApplicationContext().getPackageManager().getPackageInfo( - packageName, PackageManager.GET_SIGNATURES); - } catch (NameNotFoundException e) { - return null; - } + return PackageUtils.getPackageInfo(packageName, PackageManager.GET_SIGNATURES); } /** diff --git a/services/shape_detection/android/java/src/org/chromium/shape_detection/BarcodeDetectionProviderImpl.java b/services/shape_detection/android/java/src/org/chromium/shape_detection/BarcodeDetectionProviderImpl.java index 9468ce7cef6c7..e75f8f4159e69 100644 --- a/services/shape_detection/android/java/src/org/chromium/shape_detection/BarcodeDetectionProviderImpl.java +++ b/services/shape_detection/android/java/src/org/chromium/shape_detection/BarcodeDetectionProviderImpl.java @@ -5,13 +5,12 @@ package org.chromium.shape_detection; import android.content.Context; -import android.content.pm.PackageInfo; -import android.content.pm.PackageManager.NameNotFoundException; import com.google.android.gms.common.GoogleApiAvailability; import org.chromium.base.ContextUtils; import org.chromium.base.Log; +import org.chromium.base.PackageUtils; import org.chromium.gms.ChromiumPlayServicesAvailability; import org.chromium.mojo.bindings.InterfaceRequest; import org.chromium.mojo.system.MojoException; @@ -59,16 +58,15 @@ public static BarcodeDetectionProvider create() { Log.w(TAG, "Google Play Services not available"); return null; } - try { - PackageInfo playServicesPackage = ctx.getPackageManager().getPackageInfo( - GoogleApiAvailability.GOOGLE_PLAY_SERVICES_PACKAGE, 0); - if (playServicesPackage.versionCode < 19742000) { + int version = + PackageUtils.getPackageVersion(GoogleApiAvailability.GOOGLE_PLAY_SERVICES_PACKAGE); + if (version < 19742000) { + if (version < 0) { + Log.w(TAG, "Google Play Services not available"); + } else { // https://crbug.com/1020746 - Log.w(TAG, "Detection disabled (%s < 19.7.42)", playServicesPackage.versionName); - return null; + Log.w(TAG, "Detection disabled (%d < 19.7.42)", version); } - } catch (NameNotFoundException e) { - Log.w(TAG, "Google Play Services not available"); return null; } return new BarcodeDetectionProviderImpl();