diff --git a/app/src/basic/java/org/fdroid/fdroid/views/main/MainViewController.java b/app/src/basic/java/org/fdroid/fdroid/views/main/MainViewController.java index d2f2ae9c8..d8225193b 100644 --- a/app/src/basic/java/org/fdroid/fdroid/views/main/MainViewController.java +++ b/app/src/basic/java/org/fdroid/fdroid/views/main/MainViewController.java @@ -25,7 +25,7 @@ import android.support.v7.app.AppCompatActivity; import android.support.v7.widget.RecyclerView; import android.widget.FrameLayout; import org.fdroid.fdroid.R; -import org.fdroid.fdroid.views.fragments.PreferencesFragment; +import org.fdroid.fdroid.views.PreferencesFragment; import org.fdroid.fdroid.views.updates.UpdatesViewBinder; /** diff --git a/app/src/full/java/org/fdroid/fdroid/views/main/MainViewController.java b/app/src/full/java/org/fdroid/fdroid/views/main/MainViewController.java index eaced1466..849a15a4b 100644 --- a/app/src/full/java/org/fdroid/fdroid/views/main/MainViewController.java +++ b/app/src/full/java/org/fdroid/fdroid/views/main/MainViewController.java @@ -10,7 +10,7 @@ import android.widget.Button; import android.widget.FrameLayout; import android.widget.TextView; import org.fdroid.fdroid.R; -import org.fdroid.fdroid.views.fragments.PreferencesFragment; +import org.fdroid.fdroid.views.PreferencesFragment; import org.fdroid.fdroid.views.swap.SwapWorkflowActivity; import org.fdroid.fdroid.views.updates.UpdatesViewBinder; diff --git a/app/src/main/java/org/fdroid/fdroid/IndexV1Updater.java b/app/src/main/java/org/fdroid/fdroid/IndexV1Updater.java index 8e11fbf4c..310541f86 100644 --- a/app/src/main/java/org/fdroid/fdroid/IndexV1Updater.java +++ b/app/src/main/java/org/fdroid/fdroid/IndexV1Updater.java @@ -47,11 +47,19 @@ import org.fdroid.fdroid.data.Schema; import org.fdroid.fdroid.net.Downloader; import org.fdroid.fdroid.net.DownloaderFactory; +import javax.net.ssl.SSLHandshakeException; +import javax.net.ssl.SSLKeyException; +import javax.net.ssl.SSLPeerUnverifiedException; +import javax.net.ssl.SSLProtocolException; import java.io.File; import java.io.IOException; import java.io.InputStream; import java.net.ConnectException; +import java.net.HttpRetryException; +import java.net.NoRouteToHostException; +import java.net.ProtocolException; import java.net.SocketTimeoutException; +import java.net.UnknownHostException; import java.security.cert.X509Certificate; import java.util.ArrayList; import java.util.Date; @@ -94,6 +102,7 @@ public class IndexV1Updater extends RepoUpdater { /** * @return whether this successfully found an index of this version * @throws RepoUpdater.UpdateException + * @see org.fdroid.fdroid.net.DownloaderService#handleIntent(android.content.Intent) */ @Override public boolean update() throws RepoUpdater.UpdateException { @@ -119,7 +128,10 @@ public class IndexV1Updater extends RepoUpdater { } processDownloadedIndex(downloader.outputFile, downloader.getCacheTag()); - } catch (ConnectException | SocketTimeoutException e) { + } catch (ConnectException | HttpRetryException | NoRouteToHostException | SocketTimeoutException + | SSLHandshakeException | SSLKeyException | SSLPeerUnverifiedException | SSLProtocolException + | ProtocolException | UnknownHostException e) { + // if the above list changes, also change below and in DownloaderService.handleIntent() Utils.debugLog(TAG, "Trying to download the index from a mirror"); // Mirror logic here, so that the default download code is untouched. String mirrorUrl; @@ -146,7 +158,9 @@ public class IndexV1Updater extends RepoUpdater { processDownloadedIndex(downloader.outputFile, downloader.getCacheTag()); break; - } catch (ConnectException | SocketTimeoutException e2) { + } catch (ConnectException | HttpRetryException | NoRouteToHostException | SocketTimeoutException + | SSLHandshakeException | SSLKeyException | SSLPeerUnverifiedException | SSLProtocolException + | ProtocolException | UnknownHostException e2) { // We'll just let this try the next mirror Utils.debugLog(TAG, "Trying next mirror"); } catch (IOException e2) { diff --git a/app/src/main/java/org/fdroid/fdroid/Preferences.java b/app/src/main/java/org/fdroid/fdroid/Preferences.java index 21dff8f23..28c780b29 100644 --- a/app/src/main/java/org/fdroid/fdroid/Preferences.java +++ b/app/src/main/java/org/fdroid/fdroid/Preferences.java @@ -193,7 +193,7 @@ public final class Preferences implements SharedPreferences.OnSharedPreferenceCh * of the Privileged Extension. The preference provides a way to disable using the * Privileged Extension even though its installed. * - * @see org.fdroid.fdroid.views.fragments.PreferencesFragment#initPrivilegedInstallerPreference() + * @see org.fdroid.fdroid.views.PreferencesFragment#initPrivilegedInstallerPreference() */ public boolean isPrivilegedInstallerEnabled() { return preferences.getBoolean(PREF_PRIVILEGED_INSTALLER, true); diff --git a/app/src/main/java/org/fdroid/fdroid/RepoXMLHandler.java b/app/src/main/java/org/fdroid/fdroid/RepoXMLHandler.java index a087e6909..5aef95ac7 100644 --- a/app/src/main/java/org/fdroid/fdroid/RepoXMLHandler.java +++ b/app/src/main/java/org/fdroid/fdroid/RepoXMLHandler.java @@ -22,7 +22,6 @@ package org.fdroid.fdroid; import android.os.Build; import android.support.annotation.NonNull; import android.support.annotation.Nullable; - import org.fdroid.fdroid.data.Apk; import org.fdroid.fdroid.data.App; import org.fdroid.fdroid.data.Repo; @@ -129,11 +128,11 @@ public class RepoXMLHandler extends DefaultHandler { if (currentApkHashType == null || "md5".equals(currentApkHashType)) { if (curapk.hash == null) { curapk.hash = str; - curapk.hashType = "SHA-256"; + curapk.hashType = "sha256"; } } else if ("sha256".equals(currentApkHashType)) { curapk.hash = str; - curapk.hashType = "SHA-256"; + curapk.hashType = "sha256"; } break; case ApkTable.Cols.SIGNATURE: diff --git a/app/src/main/java/org/fdroid/fdroid/Utils.java b/app/src/main/java/org/fdroid/fdroid/Utils.java index 7c95d1995..b2b8c499d 100644 --- a/app/src/main/java/org/fdroid/fdroid/Utils.java +++ b/app/src/main/java/org/fdroid/fdroid/Utils.java @@ -362,7 +362,7 @@ public final class Utils { String ret = null; try { // keytool -list -v gives you the SHA-256 fingerprint - MessageDigest digest = MessageDigest.getInstance("SHA-256"); + MessageDigest digest = MessageDigest.getInstance("sha256"); digest.update(key); byte[] fingerprint = digest.digest(); Formatter formatter = new Formatter(new StringBuilder()); 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 d61684dbe..2dbfba8a4 100644 --- a/app/src/main/java/org/fdroid/fdroid/data/DBHelper.java +++ b/app/src/main/java/org/fdroid/fdroid/data/DBHelper.java @@ -280,7 +280,6 @@ public class DBHelper extends SQLiteOpenHelper { @Override public void onDowngrade(SQLiteDatabase db, int oldVersion, int newVersion) { - super.onDowngrade(db, oldVersion, newVersion); resetTransient(context); } diff --git a/app/src/main/java/org/fdroid/fdroid/installer/InstallManagerService.java b/app/src/main/java/org/fdroid/fdroid/installer/InstallManagerService.java index 8e0f5e926..f42ce380f 100644 --- a/app/src/main/java/org/fdroid/fdroid/installer/InstallManagerService.java +++ b/app/src/main/java/org/fdroid/fdroid/installer/InstallManagerService.java @@ -240,7 +240,7 @@ public class InstallManagerService extends Service { * @see APK Expansion Files */ private void getObb(final String urlString, String obbUrlString, - final File obbDestFile, final String sha256) { + final File obbDestFile, final String hash) { if (obbDestFile == null || obbDestFile.exists() || TextUtils.isEmpty(obbUrlString)) { return; } @@ -267,7 +267,7 @@ public class InstallManagerService extends Service { + " to " + localApkUri); try { - if (Hasher.isFileMatchingHash(localFile, sha256, "SHA-256")) { + if (Hasher.isFileMatchingHash(localFile, hash, "sha256")) { Utils.debugLog(TAG, "Installing OBB " + localFile + " to " + obbDestFile); FileUtils.forceMkdirParent(obbDestFile); FileUtils.copyFile(localFile, obbDestFile); @@ -280,7 +280,7 @@ public class InstallManagerService extends Service { } } } else { - Utils.debugLog(TAG, localFile + " deleted, did not match hash: " + sha256); + Utils.debugLog(TAG, localFile + " deleted, did not match hash: " + hash); } } catch (IOException e) { e.printStackTrace(); diff --git a/app/src/main/java/org/fdroid/fdroid/net/DownloaderService.java b/app/src/main/java/org/fdroid/fdroid/net/DownloaderService.java index e9d598619..0aaea76b7 100644 --- a/app/src/main/java/org/fdroid/fdroid/net/DownloaderService.java +++ b/app/src/main/java/org/fdroid/fdroid/net/DownloaderService.java @@ -47,6 +47,7 @@ import java.io.IOException; import java.net.ConnectException; import java.net.HttpRetryException; import java.net.NoRouteToHostException; +import java.net.ProtocolException; import java.net.SocketTimeoutException; import java.net.UnknownHostException; @@ -193,6 +194,7 @@ public class DownloaderService extends Service { * * @param intent The {@link Intent} passed via {@link * android.content.Context#startService(Intent)}. + * @see org.fdroid.fdroid.IndexV1Updater#update() */ private void handleIntent(Intent intent) { final Uri uri = intent.getData(); @@ -225,7 +227,8 @@ public class DownloaderService extends Service { sendBroadcast(uri, Downloader.ACTION_INTERRUPTED, localFile, repoId, originalUrlString); } catch (ConnectException | HttpRetryException | NoRouteToHostException | SocketTimeoutException | SSLHandshakeException | SSLKeyException | SSLPeerUnverifiedException | SSLProtocolException - | UnknownHostException e) { + | ProtocolException | UnknownHostException e) { + // if the above list of exceptions changes, also change it in IndexV1Updater.update() Log.e(TAG, e.getLocalizedMessage()); sendBroadcast(uri, Downloader.ACTION_CONNECTION_FAILED, localFile, repoId, originalUrlString); } catch (IOException e) { @@ -271,29 +274,31 @@ public class DownloaderService extends Service { /** * Add a URL to the download queue. - *
+ ** All notifications are sent as an {@link Intent} via local broadcasts to be received by * - * @param context this app's {@link Context} - * @param urlString The URL to add to the download queue + * @param context this app's {@link Context} + * @param mirrorUrlString The URL to add to the download queue + * @param repoId the database ID number representing one repo + * @param urlString the URL used as the unique ID throughout F-Droid * @see #cancel(Context, String) */ - public static void queue(Context context, String urlString, long repoId, String originalUrlString) { - if (TextUtils.isEmpty(urlString)) { + public static void queue(Context context, String mirrorUrlString, long repoId, String urlString) { + if (TextUtils.isEmpty(mirrorUrlString)) { return; } - Utils.debugLog(TAG, "Preparing " + urlString + " to go into the download queue"); + Utils.debugLog(TAG, "Preparing " + mirrorUrlString + " to go into the download queue"); Intent intent = new Intent(context, DownloaderService.class); intent.setAction(ACTION_QUEUE); - intent.setData(Uri.parse(urlString)); + intent.setData(Uri.parse(mirrorUrlString)); intent.putExtra(Downloader.EXTRA_REPO_ID, repoId); - intent.putExtra(Downloader.EXTRA_CANONICAL_URL, originalUrlString); + intent.putExtra(Downloader.EXTRA_CANONICAL_URL, urlString); context.startService(intent); } /** * Remove a URL to the download queue, even if it is currently downloading. - *
+ ** All notifications are sent as an {@link Intent} via local broadcasts to be received by * * @param context this app's {@link Context} diff --git a/app/src/main/java/org/fdroid/fdroid/net/HttpDownloader.java b/app/src/main/java/org/fdroid/fdroid/net/HttpDownloader.java index 63bfe99b2..87ba6a81d 100644 --- a/app/src/main/java/org/fdroid/fdroid/net/HttpDownloader.java +++ b/app/src/main/java/org/fdroid/fdroid/net/HttpDownloader.java @@ -37,7 +37,6 @@ import java.io.File; import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStream; -import java.net.ConnectException; import java.net.HttpURLConnection; import java.net.MalformedURLException; import java.net.SocketTimeoutException; @@ -106,7 +105,7 @@ public class HttpDownloader extends Downloader { * @see Cookieless cookies */ @Override - public void download() throws ConnectException, IOException, InterruptedException { + public void download() throws IOException, InterruptedException { // get the file size from the server HttpURLConnection tmpConn = getConnection(); tmpConn.setRequestMethod("HEAD"); diff --git a/app/src/main/java/org/fdroid/fdroid/views/fragments/PreferencesFragment.java b/app/src/main/java/org/fdroid/fdroid/views/PreferencesFragment.java similarity index 99% rename from app/src/main/java/org/fdroid/fdroid/views/fragments/PreferencesFragment.java rename to app/src/main/java/org/fdroid/fdroid/views/PreferencesFragment.java index 884a8ce32..48e10df37 100644 --- a/app/src/main/java/org/fdroid/fdroid/views/fragments/PreferencesFragment.java +++ b/app/src/main/java/org/fdroid/fdroid/views/PreferencesFragment.java @@ -23,7 +23,7 @@ * MA 02110-1301, USA. */ -package org.fdroid.fdroid.views.fragments; +package org.fdroid.fdroid.views; import android.app.Activity; import android.content.Intent; @@ -55,7 +55,6 @@ import org.fdroid.fdroid.Utils; import org.fdroid.fdroid.data.RepoProvider; import org.fdroid.fdroid.installer.InstallHistoryService; import org.fdroid.fdroid.installer.PrivilegedInstaller; -import org.fdroid.fdroid.views.LiveSeekBarPreference; public class PreferencesFragment extends PreferenceFragment implements SharedPreferences.OnSharedPreferenceChangeListener { diff --git a/app/src/main/java/org/fdroid/fdroid/views/main/SettingsView.java b/app/src/main/java/org/fdroid/fdroid/views/main/SettingsView.java index 22458c79a..7bff54835 100644 --- a/app/src/main/java/org/fdroid/fdroid/views/main/SettingsView.java +++ b/app/src/main/java/org/fdroid/fdroid/views/main/SettingsView.java @@ -8,7 +8,7 @@ import android.support.v7.app.AppCompatActivity; import android.util.AttributeSet; import android.widget.FrameLayout; import org.fdroid.fdroid.R; -import org.fdroid.fdroid.views.fragments.PreferencesFragment; +import org.fdroid.fdroid.views.PreferencesFragment; @SuppressWarnings("LineLength") /**