| Index: webapk/shell_apk/src/org/chromium/webapk/shell_apk/WebApkServiceFactory.java
|
| diff --git a/webapk/shell_apk/src/org/chromium/webapk/shell_apk/WebApkServiceFactory.java b/webapk/shell_apk/src/org/chromium/webapk/shell_apk/WebApkServiceFactory.java
|
| deleted file mode 100644
|
| index 4fdc9a2cd00965b93a10948e1d8fb9db991433fd..0000000000000000000000000000000000000000
|
| --- a/webapk/shell_apk/src/org/chromium/webapk/shell_apk/WebApkServiceFactory.java
|
| +++ /dev/null
|
| @@ -1,168 +0,0 @@
|
| -// Copyright 2015 The Chromium Authors. All rights reserved.
|
| -// Use of this source code is governed by a BSD-style license that can be
|
| -// found in the LICENSE file.
|
| -
|
| -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
|
| - * services from .dex file in Chrome APK.
|
| - */
|
| -public class WebApkServiceFactory extends Service {
|
| - private static final String TAG = "cr.WebApkServiceFactory";
|
| -
|
| - /**
|
| - * Name of the class with IBinder API implementation.
|
| - */
|
| - private static final String MINTED_SERVICE_IMPL_CLASS_NAME =
|
| - "org.chromium.webapk.lib.runtime_library.WebApkServiceImpl";
|
| -
|
| - private static final String KEY_APP_ICON_ID = "app_icon_id";
|
| - private static final String KEY_EXPECTED_HOST_BROWSER = "expected_host_browser";
|
| -
|
| - /**
|
| - * Name of the shared preferences file.
|
| - */
|
| - private static final String PREF_FILE_NAME = "MINT_PREFS";
|
| -
|
| - /**
|
| - * Name of the shared preference for Chrome's version code.
|
| - */
|
| - private static final String REMOTE_VERSION_CODE_PREF =
|
| - "webapk_service_factory_remote_version_code";
|
| -
|
| - /**
|
| - * Name of the shared preference for the version number of the dynamically loaded dex.
|
| - */
|
| - private static final String RUNTIME_DEX_VERSION_PREF =
|
| - "webapk_service_factory_runtime_dex_version";
|
| -
|
| - /*
|
| - * ClassLoader for loading {@link MINTED_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) {
|
| - if (sClassLoader == null) {
|
| - sClassLoader = createClassLoader(this);
|
| - if (sClassLoader == null) {
|
| - Log.w(TAG, "Unable to create ClassLoader.");
|
| - return null;
|
| - }
|
| - }
|
| -
|
| - try {
|
| - Class<?> mintedServiceImplClass =
|
| - sClassLoader.loadClass(MINTED_SERVICE_IMPL_CLASS_NAME);
|
| - Constructor<?> mintedServiceImplConstructor =
|
| - mintedServiceImplClass.getConstructor(Context.class, Bundle.class);
|
| - String expectedHostPackageName = WebApkUtils.getHostBrowserPackageName(this);
|
| - Bundle bundle = new Bundle();
|
| - bundle.putInt(KEY_APP_ICON_ID, R.drawable.app_icon);
|
| - bundle.putString(KEY_EXPECTED_HOST_BROWSER, expectedHostPackageName);
|
| - return (IBinder) mintedServiceImplConstructor.newInstance(new Object[] {this, bundle});
|
| - } catch (Exception e) {
|
| - Log.w(TAG, "Unable to create WebApkServiceImpl.");
|
| - e.printStackTrace();
|
| - return null;
|
| - }
|
| - }
|
| -
|
| - /**
|
| - * Creates ClassLoader for loading {@link MINTED_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_FILE_NAME, 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, MINTED_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, "web_apk_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.
|
| - */
|
| - private static int readAssetContentsToInt(Context context, String assetName) {
|
| - try (Scanner scanner = new Scanner(context.getAssets().open(assetName))) {
|
| - return scanner.nextInt();
|
| - } catch (Exception e) {
|
| - return -1;
|
| - }
|
| - }
|
| -}
|
|
|