diff -r 000000000000 -r 6474c204b198 mobile/android/base/webapp/ApkResources.java
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/mobile/android/base/webapp/ApkResources.java Wed Dec 31 06:09:35 2014 +0100
@@ -0,0 +1,134 @@
+/* -*- Mode: Java; c-basic-offset: 4; tab-width: 4; indent-tabs-mode: nil; -*-
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+package org.mozilla.gecko.webapp;
+
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.io.IOException;
+import java.io.InputStreamReader;
+import android.content.Context;
+import android.content.pm.ApplicationInfo;
+import android.content.pm.PackageManager;
+import android.content.pm.PackageManager.NameNotFoundException;
+import android.graphics.drawable.Drawable;
+import android.net.Uri;
+import android.os.Bundle;
+import android.os.Environment;
+import android.util.Log;
+
+public class ApkResources {
+ private static final String LOGTAG = "GeckoWebappApkResources";
+ private final String mPackageName;
+ private final ApplicationInfo mInfo;
+ private final Context mContext;
+
+ public ApkResources(Context context, String packageName) throws NameNotFoundException {
+ mPackageName = packageName;
+ mInfo = context.getPackageManager().getApplicationInfo(
+ mPackageName, PackageManager.GET_META_DATA);
+ mContext = context;
+ }
+
+ private ApplicationInfo info() {
+ return mInfo;
+ }
+
+ public String getPackageName() {
+ return mPackageName;
+ }
+
+ private Bundle metadata() {
+ return mInfo.metaData;
+ }
+
+ public String getManifest(Context context) {
+ return readResource(context, "manifest");
+ }
+
+ public String getMiniManifest(Context context) {
+ return readResource(context, "mini");
+ }
+
+ public String getManifestUrl() {
+ return metadata().getString("manifestUrl");
+ }
+
+ public boolean isPackaged() {
+ return "packaged".equals(getWebappType());
+ }
+
+ public boolean isDebuggable() {
+ return (mInfo.flags & ApplicationInfo.FLAG_DEBUGGABLE) != 0;
+ }
+
+ private String readResource(Context context, String resourceName) {
+ Uri resourceUri = Uri.parse("android.resource://" + mPackageName
+ + "/raw/" + resourceName);
+ StringBuilder fileContent = new StringBuilder();
+ try {
+ BufferedReader r = new BufferedReader(new InputStreamReader(context
+ .getContentResolver().openInputStream(resourceUri)));
+ String line;
+
+ while ((line = r.readLine()) != null) {
+ fileContent.append(line);
+ }
+ } catch (FileNotFoundException e) {
+ Log.e(LOGTAG, String.format("File not found: \"%s\"", resourceName));
+ } catch (IOException e) {
+ Log.e(LOGTAG, String.format("Couldn't read file: \"%s\"", resourceName));
+ }
+
+ return fileContent.toString();
+ }
+
+ public Uri getAppIconUri() {
+ return Uri.parse("android.resource://" + mPackageName + "/" + info().icon);
+ }
+
+ public Drawable getAppIcon() {
+ return info().loadIcon(mContext.getPackageManager());
+ }
+
+ public String getWebappType() {
+ return metadata().getString("webapp");
+ }
+
+ public String getAppName() {
+ return info().name;
+ }
+
+ /**
+ * Which APK installer installed this APK.
+ *
+ * For OEM backed marketplaces, this will be non-null
. Otherwise, null
.
+ *
+ * TODO check that the G+ package installer gives us non-null results.
+ *
+ * @return the package name of the APK that installed this.
+ */
+ public String getPackageInstallerName() {
+ return mContext.getPackageManager().getInstallerPackageName(mPackageName);
+ }
+
+ public Uri getZipFileUri() {
+ return Uri.parse("android.resource://" + mPackageName + "/raw/application");
+ }
+
+ public File getFileDirectory() {
+ File dir = mContext.getExternalFilesDir(Environment.DIRECTORY_DOWNLOADS);
+ String path = dir.getAbsolutePath().replace(mContext.getPackageName(), mPackageName);
+
+ dir = new File(path);
+
+ if (!dir.exists()) {
+ dir.mkdirs();
+ }
+
+ return dir;
+ }
+}