| Index: mobile/android/base/java/org/mozilla/gecko/distribution/Distribution.java |
| =================================================================== |
| --- a/mobile/android/base/java/org/mozilla/gecko/distribution/Distribution.java |
| +++ b/mobile/android/base/java/org/mozilla/gecko/distribution/Distribution.java |
| @@ -444,17 +444,17 @@ public class Distribution { |
| // Firefox for Android normally ignores application scope extensions, |
| // and thus doesn't put the extensions directory in place. In Adblock |
| // Browser however, we need this mechanism. |
| // |
| // This logic doesn't really belong here. However, here the change is |
| // minimally invasive, and we're more likely to notice when the logic |
| // changes for the distributions directory. |
| try { |
| - copyExtensionsFiles(); |
| + copyExtensionsFromPackagedAssets(); |
| } catch (IOException e) { |
| Log.e(LOGTAG, "Error copying extensions files from APK.", e); |
| } |
| // Bail if we've already tried to initialize the distribution, and |
| // there wasn't one. |
| final SharedPreferences settings = getSharedPreferences(); |
| @@ -766,41 +766,47 @@ public class Distribution { |
| } finally { |
| zip.close(); |
| } |
| return distributionSet; |
| } |
| /** |
| - * Copies the /extensions folder out of the APK and into the app's data directory. |
| - * Adapted from copyFiles(). |
| + * Copies the /assets/extensions folder out of the APK and into the app's data directory. |
| + * Adapted from copyFilesFromPackagedAssets(). |
| */ |
| - private void copyExtensionsFiles() throws IOException { |
| + private void copyExtensionsFromPackagedAssets() throws IOException { |
| final File applicationPackage = new File(packagePath); |
| final ZipFile zip = new ZipFile(applicationPackage); |
| + final String assetsPrefix = "assets/"; |
| + final String fullPrefix = assetsPrefix + "extensions/"; |
| + |
| try { |
| final byte[] buffer = new byte[1024]; |
| final Enumeration<? extends ZipEntry> zipEntries = zip.entries(); |
| while (zipEntries.hasMoreElements()) { |
| final ZipEntry fileEntry = zipEntries.nextElement(); |
| final String name = fileEntry.getName(); |
| if (fileEntry.isDirectory()) { |
| // We'll let getDataFile deal with creating the directory hierarchy. |
| continue; |
| } |
| - if (!name.startsWith("extensions/")) { |
| + // Read from "assets/extensions/**". |
| + if (!name.startsWith(fullPrefix)) { |
| continue; |
| } |
| - final File outFile = getDataFile(name); |
| + // Write to "extensions/**". |
| + final String nameWithoutPrefix = name.substring(assetsPrefix.length()); |
| + final File outFile = getDataFile(nameWithoutPrefix); |
| if (outFile == null) { |
| continue; |
| } |
| final InputStream fileStream = zip.getInputStream(fileEntry); |
| try { |
| writeStream(fileStream, outFile, fileEntry.getTime(), buffer); |
| } finally { |