From ba2f1e1919b4c68a7858c71c8e0da8fef799dcc6 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Thu, 19 Apr 2018 10:56:24 +0200 Subject: [PATCH 01/13] document AppListActivity --- .../java/org/fdroid/fdroid/views/apps/AppListActivity.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/app/src/main/java/org/fdroid/fdroid/views/apps/AppListActivity.java b/app/src/main/java/org/fdroid/fdroid/views/apps/AppListActivity.java index 68f25b2c8..3f3410f1f 100644 --- a/app/src/main/java/org/fdroid/fdroid/views/apps/AppListActivity.java +++ b/app/src/main/java/org/fdroid/fdroid/views/apps/AppListActivity.java @@ -24,6 +24,9 @@ import org.fdroid.fdroid.R; import org.fdroid.fdroid.data.AppProvider; import org.fdroid.fdroid.data.Schema; +/** + * Provides scrollable listing of apps for search and category views. + */ public class AppListActivity extends AppCompatActivity implements LoaderManager.LoaderCallbacks, CategoryTextWatcher.SearchTermsChangedListener { From 16d15a358dfd389748a81ae5374b50ffd1aba46d Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Wed, 18 Apr 2018 13:02:13 +0200 Subject: [PATCH 02/13] include signer fingerprint in Apk instance created from a file --- .../main/java/org/fdroid/fdroid/Utils.java | 21 +++++++++++++++ .../main/java/org/fdroid/fdroid/data/App.java | 2 +- .../data/InstalledAppProviderService.java | 26 +------------------ 3 files changed, 23 insertions(+), 26 deletions(-) diff --git a/app/src/main/java/org/fdroid/fdroid/Utils.java b/app/src/main/java/org/fdroid/fdroid/Utils.java index ec4f3738b..73944d1fa 100644 --- a/app/src/main/java/org/fdroid/fdroid/Utils.java +++ b/app/src/main/java/org/fdroid/fdroid/Utils.java @@ -21,6 +21,7 @@ package org.fdroid.fdroid; import android.content.Context; import android.content.pm.PackageInfo; import android.content.pm.PackageManager; +import android.content.pm.Signature; import android.content.res.Resources; import android.database.Cursor; import android.graphics.Bitmap; @@ -377,6 +378,26 @@ public final class Utils { return ret; } + /** + * Get the fingerprint used to represent an APK signing key in F-Droid. + * This is a custom fingerprint algorithm that was kind of accidentally + * created, but is still in use. + */ + public static String getPackageSig(PackageInfo info) { + if (info == null || info.signatures == null || info.signatures.length < 1) { + return ""; + } + Signature sig = info.signatures[0]; + String sigHash = ""; + try { + Hasher hash = new Hasher("MD5", sig.toCharsString().getBytes()); + sigHash = hash.getHash(); + } catch (NoSuchAlgorithmException e) { + // ignore + } + return sigHash; + } + /** * There is a method {@link java.util.Locale#forLanguageTag(String)} which would be useful * for this, however it doesn't deal with android-specific language tags, which are a little diff --git a/app/src/main/java/org/fdroid/fdroid/data/App.java b/app/src/main/java/org/fdroid/fdroid/data/App.java index 4e751bd2d..c89b92185 100644 --- a/app/src/main/java/org/fdroid/fdroid/data/App.java +++ b/app/src/main/java/org/fdroid/fdroid/data/App.java @@ -712,10 +712,10 @@ public class App extends ValueObject implements Comparable, Parcelable { */ private void initApkFromApkFile(Context context, Apk apk, PackageInfo packageInfo, SanitizedFile apkFile) throws IOException, CertificateEncodingException { - // TODO include signature hash calculation here if (apkFile.canRead()) { apk.hashType = "sha256"; apk.hash = Utils.getBinaryHash(apkFile, apk.hashType); + apk.sig = Utils.getPackageSig(packageInfo); } initInstalledApk(context, apk, packageInfo, apkFile); } 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 2df49e74d..9548ca057 100644 --- a/app/src/main/java/org/fdroid/fdroid/data/InstalledAppProviderService.java +++ b/app/src/main/java/org/fdroid/fdroid/data/InstalledAppProviderService.java @@ -6,14 +6,12 @@ import android.content.Context; import android.content.Intent; import android.content.pm.PackageInfo; import android.content.pm.PackageManager; -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; import org.fdroid.fdroid.Utils; import org.fdroid.fdroid.data.Schema.InstalledAppTable; import rx.functions.Action1; @@ -22,7 +20,6 @@ import rx.subjects.PublishSubject; import java.io.File; import java.io.FilenameFilter; -import java.security.NoSuchAlgorithmException; import java.util.Collections; import java.util.Comparator; import java.util.List; @@ -310,7 +307,7 @@ public class InstalledAppProviderService extends IntentService { contentValues.put(InstalledAppTable.Cols.VERSION_NAME, packageInfo.versionName); contentValues.put(InstalledAppTable.Cols.APPLICATION_LABEL, InstalledAppProvider.getApplicationLabel(context, packageInfo.packageName)); - contentValues.put(InstalledAppTable.Cols.SIGNATURE, getPackageSig(packageInfo)); + contentValues.put(InstalledAppTable.Cols.SIGNATURE, Utils.getPackageSig(packageInfo)); contentValues.put(InstalledAppTable.Cols.LAST_UPDATE_TIME, packageInfo.lastUpdateTime); contentValues.put(InstalledAppTable.Cols.HASH_TYPE, hashType); @@ -324,25 +321,4 @@ public class InstalledAppProviderService extends IntentService { Uri uri = InstalledAppProvider.getAppUri(packageName); context.getContentResolver().delete(uri, null, null); } - - /** - * Get the fingerprint used to represent an APK signing key in F-Droid. - * This is a custom fingerprint algorithm that was kind of accidentally - * created, but is still in use. - */ - private static String getPackageSig(PackageInfo info) { - if (info == null || info.signatures == null || info.signatures.length < 1) { - return ""; - } - Signature sig = info.signatures[0]; - String sigHash = ""; - try { - Hasher hash = new Hasher("MD5", sig.toCharsString().getBytes()); - sigHash = hash.getHash(); - } catch (NoSuchAlgorithmException e) { - // ignore - } - return sigHash; - } - } \ No newline at end of file From 40635c36e526fb0940a62224a65f3acb3d2ae2da Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Thu, 19 Apr 2018 16:56:30 +0200 Subject: [PATCH 03/13] rename Preferences constants to be readable, Java style --- .../java/org/fdroid/fdroid/Preferences.java | 18 +++++++++--------- .../views/fragments/PreferencesFragment.java | 16 ++++++++-------- 2 files changed, 17 insertions(+), 17 deletions(-) diff --git a/app/src/main/java/org/fdroid/fdroid/Preferences.java b/app/src/main/java/org/fdroid/fdroid/Preferences.java index 4dc49628e..28e8f2035 100644 --- a/app/src/main/java/org/fdroid/fdroid/Preferences.java +++ b/app/src/main/java/org/fdroid/fdroid/Preferences.java @@ -41,10 +41,10 @@ public final class Preferences implements SharedPreferences.OnSharedPreferenceCh } } - public static final String PREF_UPD_INTERVAL = "updateInterval"; - public static final String PREF_UPD_WIFI_ONLY = "updateOnWifiOnly"; + public static final String PREF_UPDATE_INTERVAL = "updateInterval"; + public static final String PREF_UPDATE_ON_WIFI_ONLY = "updateOnWifiOnly"; public static final String PREF_AUTO_DOWNLOAD_INSTALL_UPDATES = "updateAutoDownload"; - public static final String PREF_UPD_NOTIFY = "updateNotify"; + public static final String PREF_UPDATE_NOTIFICATION_ENABLED = "updateNotify"; public static final String PREF_THEME = "theme"; public static final String PREF_SHOW_INCOMPAT_VERSIONS = "incompatibleVersions"; public static final String PREF_SHOW_ROOT_APPS = "rooted"; @@ -75,7 +75,7 @@ public final class Preferences implements SharedPreferences.OnSharedPreferenceCh private static final boolean DEFAULT_SHOW_INCOMPAT_VERSIONS = false; private static final boolean DEFAULT_SHOW_ROOT_APPS = true; private static final boolean DEFAULT_SHOW_ANTI_FEATURE_APPS = true; - private static final int DEFAULT_UPD_INTERVAL = 24; + private static final int DEFAULT_UPDATE_INTERVAL = 24; private static final boolean DEFAULT_PRIVILEGED_INSTALLER = true; //private static final boolean DEFAULT_LOCAL_REPO_BONJOUR = true; private static final long DEFAULT_KEEP_CACHE_TIME = TimeUnit.DAYS.toMillis(1); @@ -164,11 +164,11 @@ public final class Preferences implements SharedPreferences.OnSharedPreferenceCh public int getUpdateInterval() { int hours; try { - String value = preferences.getString(PREF_UPD_INTERVAL, - String.valueOf(DEFAULT_UPD_INTERVAL)); + String value = preferences.getString(PREF_UPDATE_INTERVAL, + String.valueOf(DEFAULT_UPDATE_INTERVAL)); hours = Integer.parseInt(value); } catch (NumberFormatException e) { - hours = DEFAULT_UPD_INTERVAL; + hours = DEFAULT_UPDATE_INTERVAL; } return hours * 60 * 60 * 1000; } @@ -283,7 +283,7 @@ public final class Preferences implements SharedPreferences.OnSharedPreferenceCh } public boolean isUpdateNotificationEnabled() { - return preferences.getBoolean(PREF_UPD_NOTIFY, true); + return preferences.getBoolean(PREF_UPDATE_NOTIFICATION_ENABLED, true); } public boolean isAutoDownloadEnabled() { @@ -297,7 +297,7 @@ public final class Preferences implements SharedPreferences.OnSharedPreferenceCh public boolean isBackgroundDownloadAllowed() { return FDroidApp.networkState == ConnectivityMonitorService.FLAG_NET_NO_LIMIT || (FDroidApp.networkState == ConnectivityMonitorService.FLAG_NET_METERED - && !preferences.getBoolean(PREF_UPD_WIFI_ONLY, false)); + && !preferences.getBoolean(PREF_UPDATE_ON_WIFI_ONLY, false)); } /** diff --git a/app/src/main/java/org/fdroid/fdroid/views/fragments/PreferencesFragment.java b/app/src/main/java/org/fdroid/fdroid/views/fragments/PreferencesFragment.java index f597f4b7e..893e0c1bb 100644 --- a/app/src/main/java/org/fdroid/fdroid/views/fragments/PreferencesFragment.java +++ b/app/src/main/java/org/fdroid/fdroid/views/fragments/PreferencesFragment.java @@ -31,9 +31,9 @@ public class PreferencesFragment extends PreferenceFragment implements SharedPreferences.OnSharedPreferenceChangeListener { private static final String[] SUMMARIES_TO_UPDATE = { - Preferences.PREF_UPD_INTERVAL, - Preferences.PREF_UPD_WIFI_ONLY, - Preferences.PREF_UPD_NOTIFY, + Preferences.PREF_UPDATE_INTERVAL, + Preferences.PREF_UPDATE_ON_WIFI_ONLY, + Preferences.PREF_UPDATE_NOTIFICATION_ENABLED, Preferences.PREF_SHOW_ROOT_APPS, Preferences.PREF_SHOW_ANTI_FEATURE_APPS, Preferences.PREF_SHOW_INCOMPAT_VERSIONS, @@ -97,12 +97,12 @@ public class PreferencesFragment extends PreferenceFragment private void updateSummary(String key, boolean changing) { switch (key) { - case Preferences.PREF_UPD_INTERVAL: + case Preferences.PREF_UPDATE_INTERVAL: ListPreference listPref = (ListPreference) findPreference( - Preferences.PREF_UPD_INTERVAL); + Preferences.PREF_UPDATE_INTERVAL); int interval = Integer.parseInt(listPref.getValue()); Preference onlyOnWifi = findPreference( - Preferences.PREF_UPD_WIFI_ONLY); + Preferences.PREF_UPDATE_ON_WIFI_ONLY); onlyOnWifi.setEnabled(interval > 0); if (interval == 0) { listPref.setSummary(R.string.update_interval_zero); @@ -111,11 +111,11 @@ public class PreferencesFragment extends PreferenceFragment } break; - case Preferences.PREF_UPD_WIFI_ONLY: + case Preferences.PREF_UPDATE_ON_WIFI_ONLY: checkSummary(key, R.string.automatic_scan_wifi_on); break; - case Preferences.PREF_UPD_NOTIFY: + case Preferences.PREF_UPDATE_NOTIFICATION_ENABLED: checkSummary(key, R.string.notify_on); break; From c04a867b9b0388e428491eba33a1cd036665c15d Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Thu, 19 Apr 2018 17:30:57 +0200 Subject: [PATCH 04/13] format preferences.xml with Android Studio Ctrl-Alt-L --- app/src/main/res/xml/preferences.xml | 188 +++++++++++++-------------- 1 file changed, 94 insertions(+), 94 deletions(-) diff --git a/app/src/main/res/xml/preferences.xml b/app/src/main/res/xml/preferences.xml index 273ddc228..e0968cb37 100644 --- a/app/src/main/res/xml/preferences.xml +++ b/app/src/main/res/xml/preferences.xml @@ -1,158 +1,158 @@ - - + - + android:targetClass="org.fdroid.fdroid.AboutActivity"/> + + android:action="android.intent.action.MAIN" + android:targetPackage="@string/applicationId" + android:targetClass="org.fdroid.fdroid.views.installed.InstalledAppsActivity"/> + android:title="@string/menu_manage" + android:summary="@string/repositories_summary"> + android:action="android.intent.action.MAIN" + android:targetPackage="@string/applicationId" + android:targetClass="org.fdroid.fdroid.views.ManageReposActivity"/> + android:key="updateInterval" + android:defaultValue="24" + android:entries="@array/updateIntervalNames" + android:entryValues="@array/updateIntervalValues"/> + android:defaultValue="false" + android:key="updateOnWifiOnly"/> + android:summary="@string/update_auto_download_summary" + android:defaultValue="false" + android:key="updateAutoDownload"/> + android:defaultValue="true" + android:key="updateNotify"/> + android:key="language"/> + android:key="theme" + android:defaultValue="light" + android:entries="@array/themeNames" + android:entryValues="@array/themeValues"/> + android:defaultValue="false" + android:key="incompatibleVersions"/> + android:defaultValue="true" + android:key="rooted"/> + android:defaultValue="false" + android:key="showAntiFeatureApps"/> + android:defaultValue="false" + android:key="ignoreTouchscreen"/> + android:key="localRepoName" + android:title="@string/local_repo_name"/> - + + android:key="useTor" + android:summary="@string/useTorSummary" + android:title="@string/useTor"/> + android:defaultValue="false" + android:key="enableProxy" + android:title="@string/enable_proxy_title" + android:summary="@string/enable_proxy_summary"/> + android:key="proxyHost" + android:title="@string/proxy_host" + android:summary="@string/proxy_host_summary" + android:dependency="enableProxy"/> + android:key="proxyPort" + android:title="@string/proxy_port" + android:summary="@string/proxy_port_summary" + android:dependency="enableProxy"/> + android:key="pref_category_privacy" + android:title="@string/privacy"> + android:defaultValue="false" + android:key="preventScreenshots" + android:summary="@string/preventScreenshots_summary" + android:title="@string/preventScreenshots_title"/> + android:defaultValue="false" + android:key="hideOnLongPressSearch" + android:summary="@string/hide_on_long_search_press_summary" + android:title="@string/hide_on_long_search_press_title"/> + android:summary="@string/panic_settings_summary" + android:title="@string/panic_settings"> + android:action="android.intent.action.MAIN" + android:targetClass="org.fdroid.fdroid.views.panic.PanicPreferencesActivity" + android:targetPackage="@string/applicationId"/> + android:key="pref_category_other"> + android:key="keepCacheFor" + android:defaultValue="86400000" + android:entries="@array/keepCacheNames" + android:entryValues="@array/keepCacheValues"/> + android:defaultValue="false" + android:key="expert"/> + android:key="unstableUpdates" + android:title="@string/unstable_updates" + android:summary="@string/unstable_updates_summary" + android:defaultValue="false" + android:dependency="expert"/> + android:key="keepInstallHistory" + android:title="@string/keep_install_history" + android:summary="@string/keep_install_history_summary" + android:defaultValue="false" + android:dependency="expert"/> + android:dependency="expert"/> + android:defaultValue="false" + android:key="privilegedInstaller" + android:persistent="false" + android:dependency="expert"/> + android:summary="@string/uninstall_system_summary" + android:key="uninstallPrivilegedApp" + android:dependency="expert"/> From 50bce42940c72bd6c42d20d22a3e1e5491e6562e Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Thu, 19 Apr 2018 17:55:59 +0200 Subject: [PATCH 05/13] switch to com.android.support:preference-v14 for Material themes --- app/build.gradle | 2 +- .../fdroid/fdroid/CompatibilityChecker.java | 2 +- .../java/org/fdroid/fdroid/Preferences.java | 2 +- .../java/org/fdroid/fdroid/UpdateService.java | 2 +- app/src/main/res/values/styles.xml | 4 +- app/src/main/res/xml/preferences.xml | 161 ++++++++++-------- app/src/main/res/xml/preferences_panic.xml | 48 +++--- 7 files changed, 120 insertions(+), 101 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index c8f51844c..1f8322f42 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -23,7 +23,7 @@ dependencies { implementation 'com.android.support:support-vector-drawable:27.1.1' implementation 'com.android.support.constraint:constraint-layout:1.1.0' implementation 'com.android.support:palette-v7:27.1.1' - implementation 'com.android.support:preference-v7:27.1.1' + implementation 'com.android.support:preference-v14:27.1.1' implementation 'com.nostra13.universalimageloader:universal-image-loader:1.9.5' implementation 'com.google.zxing:core:3.3.2' diff --git a/app/src/main/java/org/fdroid/fdroid/CompatibilityChecker.java b/app/src/main/java/org/fdroid/fdroid/CompatibilityChecker.java index 1cd3db664..576431f6e 100644 --- a/app/src/main/java/org/fdroid/fdroid/CompatibilityChecker.java +++ b/app/src/main/java/org/fdroid/fdroid/CompatibilityChecker.java @@ -5,8 +5,8 @@ import android.content.SharedPreferences; import android.content.pm.FeatureInfo; import android.content.pm.PackageManager; import android.os.Build; -import android.preference.PreferenceManager; import android.support.annotation.Nullable; +import android.support.v7.preference.PreferenceManager; import org.fdroid.fdroid.compat.SupportedArchitectures; import org.fdroid.fdroid.data.Apk; diff --git a/app/src/main/java/org/fdroid/fdroid/Preferences.java b/app/src/main/java/org/fdroid/fdroid/Preferences.java index 28e8f2035..f465100fc 100644 --- a/app/src/main/java/org/fdroid/fdroid/Preferences.java +++ b/app/src/main/java/org/fdroid/fdroid/Preferences.java @@ -3,7 +3,7 @@ package org.fdroid.fdroid; import android.content.Context; import android.content.SharedPreferences; import android.os.Build; -import android.preference.PreferenceManager; +import android.support.v7.preference.PreferenceManager; import android.util.Log; import info.guardianproject.netcipher.NetCipher; import org.fdroid.fdroid.net.ConnectivityMonitorService; diff --git a/app/src/main/java/org/fdroid/fdroid/UpdateService.java b/app/src/main/java/org/fdroid/fdroid/UpdateService.java index 73f7591cd..f96dbea91 100644 --- a/app/src/main/java/org/fdroid/fdroid/UpdateService.java +++ b/app/src/main/java/org/fdroid/fdroid/UpdateService.java @@ -36,9 +36,9 @@ import android.os.Handler; import android.os.Looper; import android.os.Process; import android.os.SystemClock; -import android.preference.PreferenceManager; import android.support.v4.app.NotificationCompat; import android.support.v4.content.LocalBroadcastManager; +import android.support.v7.preference.PreferenceManager; import android.text.TextUtils; import android.util.Log; import android.widget.Toast; diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml index 04ed6ef7b..c883929da 100644 --- a/app/src/main/res/values/styles.xml +++ b/app/src/main/res/values/styles.xml @@ -23,7 +23,7 @@ #ffffff #a6a6a6 @drawable/ic_warning_white_24dp - @style/PreferenceThemeOverlay + @style/PreferenceThemeOverlay.v14.Material