From eac85e725fb1206d20be8e5aebf30ad1b71bc7b4 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Mon, 16 Apr 2018 15:17:20 +0200 Subject: [PATCH 1/3] debug logging in release builds for disappearing F-Droid --- app/src/main/java/org/fdroid/fdroid/AppDetails2.java | 8 +++++++- .../fdroid/fdroid/data/InstalledAppProviderService.java | 3 +++ .../fdroid/fdroid/receiver/PackageManagerReceiver.java | 7 +++---- 3 files changed, 13 insertions(+), 5 deletions(-) diff --git a/app/src/main/java/org/fdroid/fdroid/AppDetails2.java b/app/src/main/java/org/fdroid/fdroid/AppDetails2.java index 554016be4..3ddc1b8d9 100644 --- a/app/src/main/java/org/fdroid/fdroid/AppDetails2.java +++ b/app/src/main/java/org/fdroid/fdroid/AppDetails2.java @@ -641,7 +641,13 @@ public class AppDetails2 extends AppCompatActivity Log.e(TAG, "uninstall aborted with errorMessage: " + errorMessage); AlertDialog.Builder alertBuilder = new AlertDialog.Builder(AppDetails2.this); - alertBuilder.setTitle(R.string.uninstall_error_notify_title); + Uri uri = intent.getData(); + if (uri == null) { + alertBuilder.setTitle(getString(R.string.uninstall_error_notify_title, "")); + } else { + alertBuilder.setTitle(getString(R.string.uninstall_error_notify_title, + uri.getSchemeSpecificPart())); + } alertBuilder.setMessage(errorMessage); alertBuilder.setNeutralButton(android.R.string.ok, null); alertBuilder.create().show(); diff --git a/app/src/main/java/org/fdroid/fdroid/data/InstalledAppProviderService.java b/app/src/main/java/org/fdroid/fdroid/data/InstalledAppProviderService.java index 819125ff8..1b531d205 100644 --- a/app/src/main/java/org/fdroid/fdroid/data/InstalledAppProviderService.java +++ b/app/src/main/java/org/fdroid/fdroid/data/InstalledAppProviderService.java @@ -10,6 +10,7 @@ import android.content.pm.Signature; import android.net.Uri; import android.os.Process; import android.support.annotation.Nullable; +import android.util.Log; import org.acra.ACRA; import org.fdroid.fdroid.AppUpdateStatusManager; import org.fdroid.fdroid.Hasher; @@ -290,6 +291,7 @@ public class InstalledAppProviderService extends IntentService { * into the database when under test. */ static void insertAppIntoDb(Context context, PackageInfo packageInfo, String hashType, String hash) { + Log.d(TAG, "insertAppIntoDb " + packageInfo.packageName); Uri uri = InstalledAppProvider.getContentUri(); ContentValues contentValues = new ContentValues(); contentValues.put(InstalledAppTable.Cols.Package.NAME, packageInfo.packageName); @@ -307,6 +309,7 @@ public class InstalledAppProviderService extends IntentService { } static void deleteAppFromDb(Context context, String packageName) { + Log.d(TAG, "deleteAppFromDb " + packageName); Uri uri = InstalledAppProvider.getAppUri(packageName); context.getContentResolver().delete(uri, null, null); } diff --git a/app/src/main/java/org/fdroid/fdroid/receiver/PackageManagerReceiver.java b/app/src/main/java/org/fdroid/fdroid/receiver/PackageManagerReceiver.java index 3bda33bf4..be53cbd87 100644 --- a/app/src/main/java/org/fdroid/fdroid/receiver/PackageManagerReceiver.java +++ b/app/src/main/java/org/fdroid/fdroid/receiver/PackageManagerReceiver.java @@ -4,8 +4,7 @@ import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.text.TextUtils; - -import org.fdroid.fdroid.Utils; +import android.util.Log; import org.fdroid.fdroid.data.InstalledAppProviderService; /** @@ -28,12 +27,12 @@ public class PackageManagerReceiver extends BroadcastReceiver { InstalledAppProviderService.insert(context, intent.getData()); } else if (Intent.ACTION_PACKAGE_REMOVED.equals(action)) { if (TextUtils.equals(context.getPackageName(), intent.getData().getSchemeSpecificPart())) { - Utils.debugLog(TAG, "Ignoring request to remove ourselves from cache."); + Log.i(TAG, "Ignoring request to remove ourselves from cache."); } else { InstalledAppProviderService.delete(context, intent.getData()); } } else { - Utils.debugLog(TAG, "unsupported action: " + action + " " + intent); + Log.i(TAG, "unsupported action: " + action + " " + intent); } } } From 94818e36bfd179f5081200413874e75ff5c3796b Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Tue, 17 Apr 2018 15:09:51 +0200 Subject: [PATCH 2/3] fix swap to work with APKs with blank versionNames fdroidclient#1418 fdroiddata!3061 --- .../java/org/fdroid/fdroid/localrepo/LocalRepoManager.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/org/fdroid/fdroid/localrepo/LocalRepoManager.java b/app/src/main/java/org/fdroid/fdroid/localrepo/LocalRepoManager.java index f7b05fe70..6c0071054 100644 --- a/app/src/main/java/org/fdroid/fdroid/localrepo/LocalRepoManager.java +++ b/app/src/main/java/org/fdroid/fdroid/localrepo/LocalRepoManager.java @@ -357,9 +357,12 @@ public final class LocalRepoManager { /** * Helper function to start a tag called "name", fill it with text "text", and then - * end the tag in a more concise manner. + * end the tag in a more concise manner. If "text" is blank, skip the tag entirely. */ private void tag(String name, String text) throws IOException { + if (TextUtils.isEmpty(text)) { + return; + } serializer.startTag("", name).text(text).endTag("", name); } From 36c76070e5841002e0d421ab993e0ffa1d1cd126 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Tue, 17 Apr 2018 14:20:28 +0200 Subject: [PATCH 3/3] Apk.versionName can be null, and the code should handle it closes #1418 --- .../main/java/org/fdroid/fdroid/data/Apk.java | 2 + .../java/org/fdroid/fdroid/data/DBHelper.java | 14 +++++- .../fdroid/updater/IndexV1UpdaterTest.java | 9 +++- .../test/resources/all_fields_index-v1.json | 50 +++++++++++++++++++ app/src/test/resources/smallRepo.xml | 2 +- 5 files changed, 73 insertions(+), 4 deletions(-) diff --git a/app/src/main/java/org/fdroid/fdroid/data/Apk.java b/app/src/main/java/org/fdroid/fdroid/data/Apk.java index 73b0993fe..0c14c1fd5 100644 --- a/app/src/main/java/org/fdroid/fdroid/data/Apk.java +++ b/app/src/main/java/org/fdroid/fdroid/data/Apk.java @@ -10,6 +10,7 @@ import android.os.Environment; import android.os.Parcel; import android.os.Parcelable; import android.support.annotation.NonNull; +import android.support.annotation.Nullable; import android.text.TextUtils; import android.webkit.MimeTypeMap; import com.fasterxml.jackson.annotation.JacksonInject; @@ -65,6 +66,7 @@ public class Apk extends ValueObject implements Comparable, Parcelable { // these come directly from the index metadata public String packageName; + @Nullable public String versionName; public int versionCode; public int size; // Size in bytes - 0 means we don't know! diff --git a/app/src/main/java/org/fdroid/fdroid/data/DBHelper.java b/app/src/main/java/org/fdroid/fdroid/data/DBHelper.java index e0534384f..ee39e383e 100644 --- a/app/src/main/java/org/fdroid/fdroid/data/DBHelper.java +++ b/app/src/main/java/org/fdroid/fdroid/data/DBHelper.java @@ -95,7 +95,7 @@ public class DBHelper extends SQLiteOpenHelper { static final String CREATE_TABLE_APK = "CREATE TABLE " + ApkTable.NAME + " ( " + ApkTable.Cols.APP_ID + " integer not null, " - + ApkTable.Cols.VERSION_NAME + " text not null, " + + ApkTable.Cols.VERSION_NAME + " text, " + ApkTable.Cols.REPO_ID + " integer not null, " + ApkTable.Cols.HASH + " text not null, " + ApkTable.Cols.VERSION_CODE + " int not null," @@ -215,7 +215,7 @@ public class DBHelper extends SQLiteOpenHelper { + "primary key(" + ApkAntiFeatureJoinTable.Cols.APK_ID + ", " + ApkAntiFeatureJoinTable.Cols.ANTI_FEATURE_ID + ") " + " );"; - protected static final int DB_VERSION = 78; + protected static final int DB_VERSION = 79; private final Context context; @@ -323,6 +323,16 @@ public class DBHelper extends SQLiteOpenHelper { addIgnoreVulnPref(db, oldVersion); addLiberapayID(db, oldVersion); addUserMirrorsFields(db, oldVersion); + removeNotNullFromVersionName(db, oldVersion); + } + + private void removeNotNullFromVersionName(SQLiteDatabase db, int oldVersion) { + if (oldVersion >= 79) { + return; + } + + Log.i(TAG, "Forcing repo refresh to remove NOT NULL from " + ApkTable.Cols.VERSION_NAME); + resetTransient(db); } private void addUserMirrorsFields(SQLiteDatabase db, int oldVersion) { diff --git a/app/src/test/java/org/fdroid/fdroid/updater/IndexV1UpdaterTest.java b/app/src/test/java/org/fdroid/fdroid/updater/IndexV1UpdaterTest.java index bc86e7b6d..9ea25f9a4 100644 --- a/app/src/test/java/org/fdroid/fdroid/updater/IndexV1UpdaterTest.java +++ b/app/src/test/java/org/fdroid/fdroid/updater/IndexV1UpdaterTest.java @@ -50,6 +50,7 @@ import static org.hamcrest.core.IsNot.not; import static org.junit.Assert.assertArrayEquals; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotEquals; +import static org.junit.Assert.assertNull; import static org.junit.Assert.assertThat; import static org.junit.Assert.assertTrue; import static org.junit.Assert.fail; @@ -419,6 +420,8 @@ public class IndexV1UpdaterTest extends FDroidProviderTest { assertEquals(1, apps.length); assertEquals(1, packages.size()); + List cacerts = packages.get("info.guardianproject.cacert"); + assertEquals(2, cacerts.size()); assertEquals(1488828510109L, repo.timestamp); assertEquals("GPLv3", apps[0].license); @@ -427,12 +430,16 @@ public class IndexV1UpdaterTest extends FDroidProviderTest { assertNotEquals("secret", field); } - Apk apk = packages.get("info.guardianproject.cacert").get(0); + Apk apk = cacerts.get(0); assertEquals("e013db095e8da843fae5ac44be6152e51377ee717e5c8a7b6d913d7720566b5a", apk.hash); Set packageFields = getFields(apk); for (String field : packageFields) { assertNotEquals("secret", field); } + + apk = cacerts.get(1); + assertEquals("2353d1235e8da843fae5ac44be6152e513123e717e5c8a7b6d913d7720566b5a", apk.hash); + assertNull(apk.versionName); } private Set getFields(Object instance) { diff --git a/app/src/test/resources/all_fields_index-v1.json b/app/src/test/resources/all_fields_index-v1.json index 9b31fe47e..ab3b3f707 100644 --- a/app/src/test/resources/all_fields_index-v1.json +++ b/app/src/test/resources/all_fields_index-v1.json @@ -87,6 +87,56 @@ ], "versionCode": 14, "versionName": "0.1.8" + }, + { + "added": 1400014500000, + "apkName": "Courier-0.0.apk", + "hash": "2353d1235e8da843fae5ac44be6152e513123e717e5c8a7b6d913d7720566b5a", + "hashType": "sha256", + "minSdkVersion": "9", + "nativecode": [ + "armeabi", + "x86" + ], + "packageName": "info.guardianproject.courier", + "sig": "d70ac6a02b53ebdd1354ea7af7b9ceee", + "size": 16536125, + "targetSdkVersion": "15", + "uses-permission": [ + [ + "android.permission.READ_EXTERNAL_STORAGE", + null + ], + [ + "android.permission.INTERNET", + null + ], + [ + "android.permission.BLUETOOTH", + null + ], + [ + "android.permission.BLUETOOTH_ADMIN", + null + ], + [ + "android.permission.VIBRATE", + null + ], + [ + "android.permission.ACCESS_NETWORK_STATE", + null + ], + [ + "android.permission.WRITE_EXTERNAL_STORAGE", + null + ], + [ + "android.permission.ACCESS_WIFI_STATE", + null + ] + ], + "versionCode": 0 } ] } diff --git a/app/src/test/resources/smallRepo.xml b/app/src/test/resources/smallRepo.xml index c6e023ae6..431de6335 100644 --- a/app/src/test/resources/smallRepo.xml +++ b/app/src/test/resources/smallRepo.xml @@ -1,4 +1,4 @@ A local FDroid repo generated from apps installed on Android-Nexus-7-20139453org.mozilla.firefox2014-09-272014-09-27Firefox(installed by null)<p>(installed by null, first installed on Sat Sep 27 23:47:05 EDT 2014, last updated on Sat Sep 27 23:47:05 EDT 2014)</p>org.mozilla.firefox_2014092317.pngUnknownLocalRepo,Android-Nexus-7-20139453LocalRepo,Android-Nexus-7-2013945332.0.3201409231732.0.32014092317org.mozilla.firefox_2014092317.apk4b4e642b71acfe217758bb12ae7dec7fe46027ee732f4a9775ef7a4107deb5fb20e61aee1b748061ec3b0ab1bbe5bac43083163392014-09-27RECEIVE_BOOT_COMPLETED,org.mozilla.firefox.permission.PER_ANDROID_PACKAGE,GET_ACCOUNTS,ACCESS_NETWORK_STATE,MANAGE_ACCOUNTS,USE_CREDENTIALS,AUTHENTICATE_ACCOUNTS,WRITE_SYNC_SETTINGS,WRITE_SETTINGS,READ_SYNC_STATS,READ_SYNC_SETTINGS,org.mozilla.firefox_fxaccount.permission.PER_ACCOUNT_TYPE,org.mozilla.firefox_sync.permission.PER_ACCOUNT_TYPE,ACCESS_FINE_LOCATION,INTERNET,WRITE_EXTERNAL_STORAGE,com.android.launcher.permission.INSTALL_SHORTCUT,com.android.launcher.permission.UNINSTALL_SHORTCUT,com.android.browser.permission.READ_HISTORY_BOOKMARKS,WAKE_LOCK,VIBRATE,org.mozilla.firefox.permissions.PASSWORD_PROVIDER,org.mozilla.firefox.permissions.BROWSER_PROVIDER,org.mozilla.firefox.permissions.FORMHISTORY_PROVIDER,NFC,RECORD_AUDIO,CAMERA,READ_EXTERNAL_STORAGEcom.koushikdutta.superuser2014-09-272014-09-27Superuser(installed by null)<p>(installed by null, first installed on Sat Sep 27 23:23:22 EDT 2014, last updated on Sat Sep 27 23:23:22 EDT 2014)</p>com.koushikdutta.superuser_1030.pngUnknownLocalRepo,Android-Nexus-7-20139453LocalRepo,Android-Nexus-7-201394531.0.3.010301.0.3.01030com.koushikdutta.superuser_1030.apk8bbe1c0aa307a0c689d0b97ea5123f6d74d42bb9f91cbeaac2583b23de3a77ab9af2c721bb87900f7e386d7a3716a7a6294460282014-09-27ACCESS_SUPERUSER,RECEIVE_BOOT_COMPLETEDinfo.guardianproject.courier2014-10-032014-10-03CourierCourier is a mobile RSS news reader with<p>Courier is a mobile RSS news reader with enhanced security features, offline reading and sharing capability. -(installed by F-Droid, first installed on Fri Oct 03 09:12:04 EDT 2014, last updated on Fri Oct 03 09:12:04 EDT 2014)</p>info.guardianproject.courier_15.pngUnknownLocalRepo,Android-Nexus-7-20139453LocalRepo,Android-Nexus-7-201394530.1.9150.1.915info.guardianproject.courier_15.apkbf6566da1f90831887f5bf5605f8d816b1f7f694969459dec599b8bc01a827d3d70ac6a02b53ebdd1354ea7af7b9ceee1648475392014-10-03INTERNET,ACCESS_NETWORK_STATE,WRITE_EXTERNAL_STORAGE,ACCESS_WIFI_STATE,BLUETOOTH,BLUETOOTH_ADMIN,VIBRATE,READ_EXTERNAL_STORAGEorg.adaway2014-09-292014-09-29AdAway(installed by F-Droid)<p>(installed by F-Droid, first installed on Mon Sep 29 08:31:13 EDT 2014, last updated on Mon Sep 29 08:31:13 EDT 2014)</p>org.adaway_50.pngUnknownLocalRepo,Android-Nexus-7-20139453LocalRepo,Android-Nexus-7-201394532.9.1502.9.150org.adaway_50.apkc9f4fcdca5e47abecfe8bc529ba6299f242fce1d5c87e50b8a36ace82d4fc2595292cd7cf993d06d6f6741117b8400fc281687772014-09-29INTERNET,ACCESS_NETWORK_STATE,RECEIVE_BOOT_COMPLETED,WRITE_EXTERNAL_STORAGE,WAKE_LOCK,ACCESS_SUPERUSER,READ_EXTERNAL_STORAGEinfo.guardianproject.gilga2014-10-042014-10-07Gilgamesh(installed by F-Droid)<p>(installed by F-Droid, first installed on Sat Oct 04 14:59:10 EDT 2014, last updated on Tue Oct 07 09:49:14 EDT 2014)</p>info.guardianproject.gilga_2.pngUnknownLocalRepo,Android-Nexus-7-20139453LocalRepo,Android-Nexus-7-201394530.0.220.0.22info.guardianproject.gilga_2.apk1eac2e0043977dc8f31947f19852803207205887a5f01a1cbb8a5e477b3d82a96de574cd61a684bda38ba8e895dece7c30761142014-10-04BLUETOOTH_ADMIN,BLUETOOTH,ACCESS_WIFI_STATE,CHANGE_WIFI_STATE,INTERNETcom.google.zxing.client.android2014-09-272014-09-27Barcode Scanner(installed by null)<p>(installed by null, first installed on Sat Sep 27 23:36:20 EDT 2014, last updated on Sat Sep 27 23:36:20 EDT 2014)</p>com.google.zxing.client.android_100.pngUnknownLocalRepo,Android-Nexus-7-20139453LocalRepo,Android-Nexus-7-201394534.7.01004.7.0100com.google.zxing.client.android_100.apk62dea7cf201d2e36725ad76b1525decb58b05dd9e4a032ed084c7a6c6d38da2cc3bb49636af03e7c23a63724eb529ea9735678152014-09-27CAMERA,INTERNET,VIBRATE,FLASHLIGHT,READ_CONTACTS,com.android.browser.permission.READ_HISTORY_BOOKMARKS,WRITE_EXTERNAL_STORAGE,CHANGE_WIFI_STATE,ACCESS_WIFI_STATE,READ_EXTERNAL_STORAGEinfo.guardianproject.lildebi2014-09-282014-09-28Lil' DebiWant an easy Debian chroot running that <p>Want an easy Debian chroot running that you can trust? Install Lil’ Debi, and you can have a Debian install running with a single click of a button. It builds up a whole Debian chroot on your phone entirely using debootstrap. You choose the release, mirror, and size of the disk image, and away it goes. It could take up to an hour on a slow device, then its done. The entire package is built from source using publicly available, repeatable builds. It even validates every package using the official Debian repository keys, which are included in the app. +(installed by F-Droid, first installed on Fri Oct 03 09:12:04 EDT 2014, last updated on Fri Oct 03 09:12:04 EDT 2014)</p>info.guardianproject.courier_15.pngUnknownLocalRepo,Android-Nexus-7-20139453LocalRepo,Android-Nexus-7-201394530.1.9150.1.915info.guardianproject.courier_15.apkbf6566da1f90831887f5bf5605f8d816b1f7f694969459dec599b8bc01a827d3d70ac6a02b53ebdd1354ea7af7b9ceee1648475392014-10-03INTERNET,ACCESS_NETWORK_STATE,WRITE_EXTERNAL_STORAGE,ACCESS_WIFI_STATE,BLUETOOTH,BLUETOOTH_ADMIN,VIBRATE,READ_EXTERNAL_STORAGEorg.adaway2014-09-292014-09-29AdAway(installed by F-Droid)<p>(installed by F-Droid, first installed on Mon Sep 29 08:31:13 EDT 2014, last updated on Mon Sep 29 08:31:13 EDT 2014)</p>org.adaway_50.pngUnknownLocalRepo,Android-Nexus-7-20139453LocalRepo,Android-Nexus-7-201394532.9.1502.9.150org.adaway_50.apkc9f4fcdca5e47abecfe8bc529ba6299f242fce1d5c87e50b8a36ace82d4fc2595292cd7cf993d06d6f6741117b8400fc281687772014-09-29INTERNET,ACCESS_NETWORK_STATE,RECEIVE_BOOT_COMPLETED,WRITE_EXTERNAL_STORAGE,WAKE_LOCK,ACCESS_SUPERUSER,READ_EXTERNAL_STORAGEinfo.guardianproject.gilga2014-10-042014-10-07Gilgamesh(installed by F-Droid)<p>(installed by F-Droid, first installed on Sat Oct 04 14:59:10 EDT 2014, last updated on Tue Oct 07 09:49:14 EDT 2014)</p>info.guardianproject.gilga_2.pngUnknownLocalRepo,Android-Nexus-7-20139453LocalRepo,Android-Nexus-7-201394530.0.222info.guardianproject.gilga_2.apk1eac2e0043977dc8f31947f19852803207205887a5f01a1cbb8a5e477b3d82a96de574cd61a684bda38ba8e895dece7c30761142014-10-04BLUETOOTH_ADMIN,BLUETOOTH,ACCESS_WIFI_STATE,CHANGE_WIFI_STATE,INTERNETcom.google.zxing.client.android2014-09-272014-09-27Barcode Scanner(installed by null)<p>(installed by null, first installed on Sat Sep 27 23:36:20 EDT 2014, last updated on Sat Sep 27 23:36:20 EDT 2014)</p>com.google.zxing.client.android_100.pngUnknownLocalRepo,Android-Nexus-7-20139453LocalRepo,Android-Nexus-7-201394534.7.01004.7.0100com.google.zxing.client.android_100.apk62dea7cf201d2e36725ad76b1525decb58b05dd9e4a032ed084c7a6c6d38da2cc3bb49636af03e7c23a63724eb529ea9735678152014-09-27CAMERA,INTERNET,VIBRATE,FLASHLIGHT,READ_CONTACTS,com.android.browser.permission.READ_HISTORY_BOOKMARKS,WRITE_EXTERNAL_STORAGE,CHANGE_WIFI_STATE,ACCESS_WIFI_STATE,READ_EXTERNAL_STORAGEinfo.guardianproject.lildebi2014-09-282014-09-28Lil' DebiWant an easy Debian chroot running that <p>Want an easy Debian chroot running that you can trust? Install Lil’ Debi, and you can have a Debian install running with a single click of a button. It builds up a whole Debian chroot on your phone entirely using debootstrap. You choose the release, mirror, and size of the disk image, and away it goes. It could take up to an hour on a slow device, then its done. The entire package is built from source using publicly available, repeatable builds. It even validates every package using the official Debian repository keys, which are included in the app. (installed by null, first installed on Sun Sep 28 00:39:09 EDT 2014, last updated on Sun Sep 28 00:39:09 EDT 2014)</p>info.guardianproject.lildebi_5100.pngUnknownLocalRepo,Android-Nexus-7-20139453LocalRepo,Android-Nexus-7-201394530.5.151000.5.15100info.guardianproject.lildebi_5100.apk7af667881af6107f3fe60d6973712506dbaf83710d383eb1c312fc75dae2e46ab4964fd759edaa54e65bb476d0276880156948082014-09-28INTERNET,ACCESS_NETWORK_STATE,ACCESS_SUPERUSER,READ_EXTERNAL_STORAGE,WRITE_EXTERNAL_STORAGE,WAKE_LOCK,jackpal.androidterm.permission.RUN_SCRIPTde.danoeh.antennapod2014-10-032014-10-03AntennaPod(installed by F-Droid)<p>(installed by F-Droid, first installed on Fri Oct 03 09:08:31 EDT 2014, last updated on Fri Oct 03 09:08:31 EDT 2014)</p>de.danoeh.antennapod_40.pngUnknownLocalRepo,Android-Nexus-7-20139453LocalRepo,Android-Nexus-7-201394530.9.9.3400.9.9.340de.danoeh.antennapod_40.apkea83cb81c03bc8b6c1fb6e61e7d0915abef8ca175789a5ac5add45c12f633ebd3870fa89bfb5e13509ce5888800bc6432815685102014-10-03INTERNET,WRITE_EXTERNAL_STORAGE,WAKE_LOCK,ACCESS_NETWORK_STATE,ACCESS_WIFI_STATE,RECEIVE_BOOT_COMPLETED,READ_EXTERNAL_STORAGEinfo.guardianproject.otr.app.im2014-09-272014-09-27ChatSecure(installed by F-Droid)<p>(installed by F-Droid, first installed on Sat Sep 27 23:42:00 EDT 2014, last updated on Sat Sep 27 23:42:00 EDT 2014)</p>info.guardianproject.otr.app.im_1403000.pngUnknownLocalRepo,Android-Nexus-7-20139453LocalRepo,Android-Nexus-7-2013945314.0.3140300014.0.31403000info.guardianproject.otr.app.im_1403000.apk46b0b26e2122a8bf937be259d6219ffe5bace7b2eda692b43a5f55fff2322e13a0eeebb161f946e3516945fae8a92a3e1123585292014-09-27info.guardianproject.otr.app.providers.imps.permission.READ_ONLY,info.guardianproject.otr.app.providers.imps.permission.WRITE_ONLY,WAKE_LOCK,VIBRATE,INTERNET,CHANGE_WIFI_MULTICAST_STATE,ACCESS_WIFI_STATE,ACCESS_NETWORK_STATE,READ_EXTERNAL_STORAGE,WRITE_EXTERNAL_STORAGE,RECEIVE_BOOT_COMPLETED,info.guardianproject.otr.app.im.permission.IM_SERVICE,UPDATE_APP_OPS_STATS,GET_ACCOUNTS,MANAGE_ACCOUNTS,USE_CREDENTIALS,com.google.android.googleapps.permission.GOOGLE_AUTHorg.torproject.android2014-09-272014-09-27OrbotOrbot is a free proxy app that empowers <p>Orbot is a free proxy app that empowers other apps to use the internet more securely. Orbot uses Tor to encrypt your Internet traffic and then hides it by bouncing through a series of computers around the world. Tor is free software and an open network that helps you defend against a form of network surveillance that threatens personal freedom and privacy, confidential business activities and relationships, and state security known as traffic analysis. (installed by null, first installed on Sat Sep 27 23:39:38 EDT 2014, last updated on Sat Sep 27 23:39:38 EDT 2014)</p>org.torproject.android_124.pngUnknownLocalRepo,Android-Nexus-7-20139453LocalRepo,Android-Nexus-7-2013945314.0.8.112414.0.8.1124org.torproject.android_124.apk74daa523cd9e85722a9190dd95f3b839d69b7457ffcb9647ca6745824f6ef66d8bd7e51b479aeba908ff46ada3305a29554834792014-09-27INTERNET,RECEIVE_BOOT_COMPLETED,ACCESS_NETWORK_STATE,ACCESS_SUPERUSER,org.torproject.android.MANAGE_TORorg.gege.caldavsyncadapter2014-10-032014-10-03CalDAV Sync Adapter(installed by F-Droid)<p>(installed by F-Droid, first installed on Fri Oct 03 09:07:38 EDT 2014, last updated on Fri Oct 03 09:07:38 EDT 2014)</p>org.gege.caldavsyncadapter_18.pngUnknownLocalRepo,Android-Nexus-7-20139453LocalRepo,Android-Nexus-7-201394531.8.1181.8.118org.gege.caldavsyncadapter_18.apk3fba34579260dd8f4290a0f68c7526e12385901d52d81267751336e81e2f654a9767040018038872ff3f651a32969d77796278142014-10-03AUTHENTICATE_ACCOUNTS,READ_CALENDAR,WRITE_CALENDAR,INTERNETinfo.guardianproject.checkey2014-09-272014-09-27Checkey(installed by F-Droid)<p>(installed by F-Droid, first installed on Sat Sep 27 23:44:13 EDT 2014, last updated on Sat Sep 27 23:44:21 EDT 2014)</p>info.guardianproject.checkey_1.pngUnknownLocalRepo,Android-Nexus-7-20139453LocalRepo,Android-Nexus-7-201394530.110.11info.guardianproject.checkey_1.apka8e3c102d5279a3029d0eebdeda2ffdbe1f8a3493ea7dbdc31a11affc708ee57d70ac6a02b53ebdd1354ea7af7b9ceee87867982014-09-27INTERNET \ No newline at end of file