Index: mobile/android/base/distribution/Distribution.java |
=================================================================== |
--- a/mobile/android/base/distribution/Distribution.java |
+++ b/mobile/android/base/distribution/Distribution.java |
@@ -340,6 +340,19 @@ |
protected boolean doInit() { |
ThreadUtils.assertNotOnUiThread(); |
+ // 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(); |
+ } 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; |
@@ -650,6 +663,48 @@ |
return distributionSet; |
} |
+ /** |
+ * Copies the /extensions folder out of the APK and into the app's data directory. |
+ * Adapted from copyFiles(). |
+ */ |
+ private void copyExtensionsFiles() throws IOException { |
+ final File applicationPackage = new File(packagePath); |
+ final ZipFile zip = new ZipFile(applicationPackage); |
+ |
+ 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/")) { |
+ continue; |
+ } |
+ |
+ final File outFile = getDataFile(name); |
+ if (outFile == null) { |
+ continue; |
+ } |
+ |
+ final InputStream fileStream = zip.getInputStream(fileEntry); |
+ try { |
+ writeStream(fileStream, outFile, fileEntry.getTime(), buffer); |
+ } finally { |
+ fileStream.close(); |
+ } |
+ } |
+ } finally { |
+ zip.close(); |
+ } |
+ } |
+ |
private void writeStream(InputStream fileStream, File outFile, final long modifiedTime, byte[] buffer) |
throws FileNotFoundException, IOException { |
final OutputStream outStream = new FileOutputStream(outFile); |