diff --git a/app/src/main/java/org/fdroid/fdroid/IndexV1Updater.java b/app/src/main/java/org/fdroid/fdroid/IndexV1Updater.java index 2c25c4874..8e11fbf4c 100644 --- a/app/src/main/java/org/fdroid/fdroid/IndexV1Updater.java +++ b/app/src/main/java/org/fdroid/fdroid/IndexV1Updater.java @@ -429,14 +429,14 @@ public class IndexV1Updater extends RepoUpdater { String certFromJar = Hasher.hex(rawCertFromJar); if (TextUtils.isEmpty(certFromJar)) { - throw new SigningException(SIGNED_FILE_NAME + " must have an included signing certificate!"); + throw new SigningException(repo, SIGNED_FILE_NAME + " must have an included signing certificate!"); } if (repo.signingCertificate == null) { if (repo.fingerprint != null) { String fingerprintFromJar = Utils.calcFingerprint(rawCertFromJar); if (!repo.fingerprint.equalsIgnoreCase(fingerprintFromJar)) { - throw new SigningException("Supplied certificate fingerprint does not match!"); + throw new SigningException(repo, "Supplied certificate fingerprint does not match!"); } } Utils.debugLog(TAG, "Saving new signing certificate to database for " + repo.address); @@ -448,14 +448,14 @@ public class IndexV1Updater extends RepoUpdater { } if (TextUtils.isEmpty(repo.signingCertificate)) { - throw new SigningException("A empty repo signing certificate is invalid!"); + throw new SigningException(repo, "A empty repo signing certificate is invalid!"); } if (repo.signingCertificate.equals(certFromJar)) { return; // we have a match! } - throw new SigningException("Signing certificate does not match!"); + throw new SigningException(repo, "Signing certificate does not match!"); } /** diff --git a/app/src/main/java/org/fdroid/fdroid/RepoUpdater.java b/app/src/main/java/org/fdroid/fdroid/RepoUpdater.java index 566a77124..92d78bbc1 100644 --- a/app/src/main/java/org/fdroid/fdroid/RepoUpdater.java +++ b/app/src/main/java/org/fdroid/fdroid/RepoUpdater.java @@ -351,6 +351,10 @@ public class RepoUpdater { public SigningException(String message) { super("Repository was not signed correctly: " + message); } + + public SigningException(Repo repo, String message) { + super((repo == null ? "Repository" : repo.name) + " was not signed correctly: " + message); + } } /** @@ -395,7 +399,7 @@ public class RepoUpdater { String fingerprintFromJar = Utils.calcFingerprint(rawCertFromJar); if (!repo.fingerprint.equalsIgnoreCase(fingerprintFromIndexXml) || !repo.fingerprint.equalsIgnoreCase(fingerprintFromJar)) { - throw new SigningException("Supplied certificate fingerprint does not match!"); + throw new SigningException(repo, "Supplied certificate fingerprint does not match!"); } } // else - no info to check things are valid, so just Trust On First Use @@ -426,7 +430,7 @@ public class RepoUpdater { if (TextUtils.isEmpty(repo.signingCertificate) || TextUtils.isEmpty(certFromJar) || TextUtils.isEmpty(certFromIndexXml)) { - throw new SigningException("A empty repo or signing certificate is invalid!"); + throw new SigningException(repo, "A empty repo or signing certificate is invalid!"); } // though its called repo.signingCertificate, its actually a X509 certificate @@ -435,7 +439,7 @@ public class RepoUpdater { && certFromIndexXml.equals(certFromJar)) { return; // we have a match! } - throw new SigningException("Signing certificate does not match!"); + throw new SigningException(repo, "Signing certificate does not match!"); } /** diff --git a/app/src/main/java/org/fdroid/fdroid/views/InstallHistoryActivity.java b/app/src/main/java/org/fdroid/fdroid/views/InstallHistoryActivity.java index 6d550baa1..b513b8c8b 100644 --- a/app/src/main/java/org/fdroid/fdroid/views/InstallHistoryActivity.java +++ b/app/src/main/java/org/fdroid/fdroid/views/InstallHistoryActivity.java @@ -21,9 +21,11 @@ package org.fdroid.fdroid.views; import android.content.ContentResolver; +import android.content.Intent; import android.database.Cursor; import android.os.Bundle; import android.os.ParcelFileDescriptor; +import android.support.v4.app.ShareCompat; import android.support.v7.app.AppCompatActivity; import android.support.v7.widget.Toolbar; import android.view.Menu; @@ -31,6 +33,8 @@ import android.view.MenuItem; import android.widget.TextView; import org.apache.commons.io.IOUtils; import org.fdroid.fdroid.R; +import org.fdroid.fdroid.data.Repo; +import org.fdroid.fdroid.data.RepoProvider; import org.fdroid.fdroid.installer.InstallHistoryService; import java.io.FileDescriptor; @@ -81,6 +85,26 @@ public class InstallHistoryActivity extends AppCompatActivity { public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { + case R.id.menu_share: + StringBuilder stringBuilder = new StringBuilder(); + stringBuilder.append("Repos:\n"); + for (Repo repo : RepoProvider.Helper.all(this)) { + if (repo.inuse) { + stringBuilder.append("* "); + stringBuilder.append(repo.address); + stringBuilder.append('\n'); + } + } + ShareCompat.IntentBuilder intentBuilder = ShareCompat.IntentBuilder.from(this) + .setStream(InstallHistoryService.LOG_URI) + .setSubject(getString(R.string.send_history_csv, getString(R.string.app_name))) + .setChooserTitle(R.string.send_install_history) + .setText(stringBuilder.toString()) + .setType("text/plain"); + Intent intent = intentBuilder.getIntent(); + intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); + startActivity(intent); + break; case R.id.menu_delete: getContentResolver().delete(InstallHistoryService.LOG_URI, null, null); TextView textView = findViewById(R.id.text); diff --git a/app/src/main/java/org/fdroid/fdroid/views/ManageReposActivity.java b/app/src/main/java/org/fdroid/fdroid/views/ManageReposActivity.java index 551704c86..dbb5e7b47 100644 --- a/app/src/main/java/org/fdroid/fdroid/views/ManageReposActivity.java +++ b/app/src/main/java/org/fdroid/fdroid/views/ManageReposActivity.java @@ -715,9 +715,14 @@ public class ManageReposActivity extends AppCompatActivity path = path.substring(0, path.length() - 1); } } - return new URI(uri.getScheme().toLowerCase(Locale.ENGLISH), + String scheme = uri.getScheme(); + String host = uri.getHost(); + if (TextUtils.isEmpty(scheme) || TextUtils.isEmpty(host)) { + return urlString; + } + return new URI(scheme.toLowerCase(Locale.ENGLISH), uri.getUserInfo(), - uri.getHost().toLowerCase(Locale.ENGLISH), + host.toLowerCase(Locale.ENGLISH), uri.getPort(), path, uri.getQuery(), 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 a9a9153fe..0e33c3b95 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 @@ -101,6 +101,8 @@ public class PreferencesFragment extends PreferenceFragment private SwitchPreference useTorCheckPref; private Preference updateAutoDownloadPref; private Preference updatePrivilegedExtensionPref; + private CheckBoxPreference keepInstallHistoryPref; + private Preference installHistoryPref; private long currentKeepCacheTime; private int overWifiPrevious; private int overDataPrevious; @@ -114,6 +116,10 @@ public class PreferencesFragment extends PreferenceFragment addPreferencesFromResource(R.xml.preferences); otherPrefGroup = (PreferenceGroup) findPreference("pref_category_other"); + keepInstallHistoryPref = (CheckBoxPreference) findPreference(Preferences.PREF_KEEP_INSTALL_HISTORY); + installHistoryPref = findPreference("installHistory"); + installHistoryPref.setVisible(keepInstallHistoryPref.isChecked()); + useTorCheckPref = (SwitchPreference) findPreference(Preferences.PREF_USE_TOR); enableProxyCheckPref = (SwitchPreference) findPreference(Preferences.PREF_ENABLE_PROXY); updateAutoDownloadPref = findPreference(Preferences.PREF_AUTO_DOWNLOAD_INSTALL_UPDATES); @@ -338,14 +344,12 @@ public class PreferencesFragment extends PreferenceFragment break; case Preferences.PREF_KEEP_INSTALL_HISTORY: - CheckBoxPreference p = (CheckBoxPreference) findPreference(key); - Preference installHistory = findPreference("installHistory"); - if (p.isChecked()) { + if (keepInstallHistoryPref.isChecked()) { InstallHistoryService.register(getActivity()); - installHistory.setVisible(true); + installHistoryPref.setVisible(true); } else { InstallHistoryService.unregister(getActivity()); - installHistory.setVisible(false); + installHistoryPref.setVisible(false); } break; } diff --git a/app/src/main/res/menu/install_history.xml b/app/src/main/res/menu/install_history.xml index 7dd18dbb9..565a0e15a 100644 --- a/app/src/main/res/menu/install_history.xml +++ b/app/src/main/res/menu/install_history.xml @@ -1,7 +1,12 @@ -