Index: chrome/android/webapk/shell_apk/src/org/chromium/webapk/shell_apk/WebApkServiceFactory.java |
diff --git a/chrome/android/webapk/shell_apk/src/org/chromium/webapk/shell_apk/WebApkServiceFactory.java b/chrome/android/webapk/shell_apk/src/org/chromium/webapk/shell_apk/WebApkServiceFactory.java |
index dced85dffd9d46dd19470510aab66dac358c98dc..575a076437f70c30b0b37ce42c2566426615d1b3 100644 |
--- a/chrome/android/webapk/shell_apk/src/org/chromium/webapk/shell_apk/WebApkServiceFactory.java |
+++ b/chrome/android/webapk/shell_apk/src/org/chromium/webapk/shell_apk/WebApkServiceFactory.java |
@@ -7,18 +7,13 @@ package org.chromium.webapk.shell_apk; |
import android.app.Service; |
import android.content.Context; |
import android.content.Intent; |
-import android.content.SharedPreferences; |
-import android.content.pm.PackageInfo; |
-import android.content.pm.PackageManager; |
import android.os.Bundle; |
import android.os.IBinder; |
import android.util.Log; |
import org.chromium.webapk.lib.common.WebApkUtils; |
-import java.io.File; |
import java.lang.reflect.Constructor; |
-import java.util.Scanner; |
/** |
* Shell class for services provided by WebAPK to Chrome. Extracts code with implementation of |
@@ -34,23 +29,6 @@ public class WebApkServiceFactory extends Service { |
"org.chromium.webapk.lib.runtime_library.WebApkServiceImpl"; |
/** |
- * Name of the shared preferences file. |
- */ |
- private static final String PREF_PACKAGE = "org.chromium.webapk.shell_apk"; |
- |
- /** |
- * Name of the shared preference for Chrome's version code. |
- */ |
- private static final String REMOTE_VERSION_CODE_PREF = |
- "org.chromium.webapk.shell_apk.version_code"; |
- |
- /** |
- * Name of the shared preference for the version number of the dynamically loaded dex. |
- */ |
- private static final String RUNTIME_DEX_VERSION_PREF = |
- "org.chromium.webapk.shell_apk.dex_version"; |
- |
- /** |
* Key for passing id of icon to represent WebAPK notifications in status bar. |
*/ |
private static final String KEY_SMALL_ICON_ID = "small_icon_id"; |
@@ -60,16 +38,10 @@ public class WebApkServiceFactory extends Service { |
*/ |
private static final String KEY_HOST_BROWSER_PACKAGE = "host_browser_package"; |
- /* |
- * ClassLoader for loading {@link WEBAPK_SERVICE_IMPL_CLASS_NAME}. Static so that all |
- * {@link WebApkServiceFactory} service instatiations use the same ClassLoader during the app's |
- * lifetime. |
- */ |
- private static ClassLoader sClassLoader; |
- |
@Override |
public IBinder onBind(Intent intent) { |
- ClassLoader webApkClassLoader = getClassLoaderInstance(this); |
+ ClassLoader webApkClassLoader = |
+ HostBrowserClassLoader.getClassLoaderInstance(this, WEBAPK_SERVICE_IMPL_CLASS_NAME); |
if (webApkClassLoader == null) { |
Log.w(TAG, "Unable to create ClassLoader."); |
return null; |
@@ -91,107 +63,4 @@ public class WebApkServiceFactory extends Service { |
return null; |
} |
} |
- |
- /** |
- * Gets / creates ClassLoader for loading {@link WEBAPK_SERVICE_IMPL_CLASS_NAME}. |
- * @param context WebAPK's context. |
- * @return The ClassLoader. |
- */ |
- private static ClassLoader getClassLoaderInstance(Context context) { |
- if (sClassLoader == null) { |
- sClassLoader = createClassLoader(context); |
- } |
- return sClassLoader; |
- } |
- |
- /** |
- * Creates ClassLoader for loading {@link WEBAPK_SERVICE_IMPL_CLASS_NAME}. |
- * @param context WebAPK's context. |
- * @return The ClassLoader. |
- */ |
- private static ClassLoader createClassLoader(Context context) { |
- Context remoteContext = WebApkUtils.getHostBrowserContext(context); |
- if (remoteContext == null) { |
- Log.w(TAG, "Failed to get remote context."); |
- return null; |
- } |
- |
- SharedPreferences preferences = context.getSharedPreferences(PREF_PACKAGE, MODE_PRIVATE); |
- |
- int runtimeDexVersion = preferences.getInt(RUNTIME_DEX_VERSION_PREF, -1); |
- int newRuntimeDexVersion = checkForNewRuntimeDexVersion(preferences, remoteContext); |
- if (newRuntimeDexVersion == -1) { |
- newRuntimeDexVersion = runtimeDexVersion; |
- } |
- File localDexDir = context.getDir("dex", Context.MODE_PRIVATE); |
- if (newRuntimeDexVersion != runtimeDexVersion) { |
- Log.w(TAG, "Delete cached dex files."); |
- DexLoader.deleteCachedDexes(localDexDir); |
- } |
- |
- String dexAssetName = WebApkUtils.getRuntimeDexName(newRuntimeDexVersion); |
- File remoteDexFile = |
- new File(remoteContext.getDir("dex", Context.MODE_PRIVATE), dexAssetName); |
- return DexLoader.load(remoteContext, dexAssetName, WEBAPK_SERVICE_IMPL_CLASS_NAME, |
- remoteDexFile, localDexDir); |
- } |
- |
- /** |
- * Checks if there is a new "runtime dex" version number. If there is a new version number, |
- * updates SharedPreferences. |
- * @param preferences WebAPK's SharedPreferences. |
- * @param remoteContext |
- * @return The new "runtime dex" version number. -1 if there is no new version number. |
- */ |
- private static int checkForNewRuntimeDexVersion( |
- SharedPreferences preferences, Context remoteContext) { |
- // The "runtime dex" version only changes when {@link remoteContext}'s APK version code |
- // changes. Checking the APK's version code is less expensive than reading from the APK's |
- // assets. |
- PackageInfo remotePackageInfo = null; |
- try { |
- remotePackageInfo = remoteContext.getPackageManager().getPackageInfo( |
- remoteContext.getPackageName(), 0); |
- } catch (PackageManager.NameNotFoundException e) { |
- Log.e(TAG, "Failed to get remote package info."); |
- return -1; |
- } |
- |
- int cachedRemoteVersionCode = preferences.getInt(REMOTE_VERSION_CODE_PREF, -1); |
- if (cachedRemoteVersionCode == remotePackageInfo.versionCode) { |
- return -1; |
- } |
- |
- int runtimeDexVersion = readAssetContentsToInt(remoteContext, "webapk_dex_version.txt"); |
- SharedPreferences.Editor editor = preferences.edit(); |
- editor.putInt(REMOTE_VERSION_CODE_PREF, remotePackageInfo.versionCode); |
- editor.putInt(RUNTIME_DEX_VERSION_PREF, runtimeDexVersion); |
- editor.apply(); |
- return runtimeDexVersion; |
- } |
- |
- /** |
- * Returns the first integer in an asset file's contents. |
- * @param context |
- * @param assetName The name of the asset. |
- * @return The first integer. |
- */ |
- private static int readAssetContentsToInt(Context context, String assetName) { |
- Scanner scanner = null; |
- int value = -1; |
- try { |
- scanner = new Scanner(context.getAssets().open(assetName)); |
- value = scanner.nextInt(); |
- scanner.close(); |
- } catch (Exception e) { |
- } finally { |
- if (scanner != null) { |
- try { |
- scanner.close(); |
- } catch (Exception e) { |
- } |
- } |
- } |
- return value; |
- } |
} |