Merge branch 'fixes-and-cleanups' into 'master'
fixes and cleanups related to ongoing DownloaderService work This includes a fix for bug that @mvdan found in the processing of `Apk.maxSdkVersion`, as well as some cleanups related to the ongoing work in !248 . Indeed a couple of these commits were pulled out of that MR. See merge request !253
This commit is contained in:
		
						commit
						d846e18d7f
					
				
							
								
								
									
										1
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										1
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							@ -16,6 +16,7 @@ build.xml
 | 
			
		||||
# Gradle files
 | 
			
		||||
.gradle/
 | 
			
		||||
build/
 | 
			
		||||
gradle.properties
 | 
			
		||||
 | 
			
		||||
# Local configuration file (sdk path, etc)
 | 
			
		||||
local.properties
 | 
			
		||||
 | 
			
		||||
@ -132,6 +132,7 @@ android {
 | 
			
		||||
            minifyEnabled true
 | 
			
		||||
            shrinkResources true
 | 
			
		||||
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
 | 
			
		||||
            testProguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro', 'src/androidTest/proguard-rules.pro'
 | 
			
		||||
        }
 | 
			
		||||
        debug {
 | 
			
		||||
            testCoverageEnabled = true
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										16
									
								
								app/src/androidTest/proguard-rules.pro
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										16
									
								
								app/src/androidTest/proguard-rules.pro
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@ -0,0 +1,16 @@
 | 
			
		||||
-dontwarn android.test.**
 | 
			
		||||
-dontwarn android.support.test.**
 | 
			
		||||
-dontnote junit.framework.**
 | 
			
		||||
-dontnote junit.runner.**
 | 
			
		||||
 | 
			
		||||
# Uncomment this if you use Mockito
 | 
			
		||||
#-dontwarn org.mockito.**
 | 
			
		||||
 | 
			
		||||
-keep class org.hamcrest.** { *; }
 | 
			
		||||
-dontwarn org.hamcrest.**
 | 
			
		||||
 | 
			
		||||
-keep class org.junit.** { *; }
 | 
			
		||||
-dontwarn org.junit.**
 | 
			
		||||
 | 
			
		||||
-keep class junit.** { *; }
 | 
			
		||||
-dontwarn junit.**
 | 
			
		||||
@ -106,9 +106,9 @@ public class RepoUpdater {
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
        } catch (IOException e) {
 | 
			
		||||
            if (downloader != null && downloader.getFile() != null) {
 | 
			
		||||
                if (!downloader.getFile().delete()) {
 | 
			
		||||
                    Log.w(TAG, "Couldn't delete file: " + downloader.getFile().getAbsolutePath());
 | 
			
		||||
            if (downloader != null && downloader.outputFile != null) {
 | 
			
		||||
                if (!downloader.outputFile.delete()) {
 | 
			
		||||
                    Log.w(TAG, "Couldn't delete file: " + downloader.outputFile.getAbsolutePath());
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
@ -136,7 +136,7 @@ public class RepoUpdater {
 | 
			
		||||
            // Don't worry about checking the status code for 200. If it was a
 | 
			
		||||
            // successful download, then we will have a file ready to use:
 | 
			
		||||
            cacheTag = downloader.getCacheTag();
 | 
			
		||||
            processDownloadedFile(downloader.getFile());
 | 
			
		||||
            processDownloadedFile(downloader.outputFile);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -19,7 +19,7 @@ public class Apk extends ValueObject implements Comparable<Apk> {
 | 
			
		||||
    public String hash;
 | 
			
		||||
    public String hashType;
 | 
			
		||||
    public int minSdkVersion; // 0 if unknown
 | 
			
		||||
    public int maxSdkVersion; // 0 if none
 | 
			
		||||
    public int maxSdkVersion = Byte.MAX_VALUE; // "infinity" if not set
 | 
			
		||||
    public Date added;
 | 
			
		||||
    public Utils.CommaSeparatedList permissions; // null if empty or
 | 
			
		||||
    // unknown
 | 
			
		||||
 | 
			
		||||
@ -106,7 +106,7 @@ class DBHelper extends SQLiteOpenHelper {
 | 
			
		||||
            + " );";
 | 
			
		||||
    private static final String DROP_TABLE_INSTALLED_APP = "DROP TABLE " + TABLE_INSTALLED_APP + ";";
 | 
			
		||||
 | 
			
		||||
    private static final int DB_VERSION = 53;
 | 
			
		||||
    private static final int DB_VERSION = 54;
 | 
			
		||||
 | 
			
		||||
    private final Context context;
 | 
			
		||||
 | 
			
		||||
@ -291,6 +291,7 @@ class DBHelper extends SQLiteOpenHelper {
 | 
			
		||||
        recreateInstalledCache(db, oldVersion);
 | 
			
		||||
        addCredentialsToRepo(db, oldVersion);
 | 
			
		||||
        addAuthorToApp(db, oldVersion);
 | 
			
		||||
        useMaxValueInMaxSdkVersion(db, oldVersion);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
@ -475,6 +476,15 @@ class DBHelper extends SQLiteOpenHelper {
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private void useMaxValueInMaxSdkVersion(SQLiteDatabase db, int oldVersion) {
 | 
			
		||||
        if (oldVersion < 54) {
 | 
			
		||||
            Utils.debugLog(TAG, "Converting maxSdkVersion value 0 to " + Byte.MAX_VALUE);
 | 
			
		||||
            ContentValues values = new ContentValues();
 | 
			
		||||
            values.put(ApkProvider.DataColumns.MAX_SDK_VERSION, Byte.MAX_VALUE);
 | 
			
		||||
            db.update(TABLE_APK, values, ApkProvider.DataColumns.MAX_SDK_VERSION + " < 1", null);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * By clearing the etags stored in the repo table, it means that next time the user updates
 | 
			
		||||
     * their repos (either manually or on a scheduled task), they will update regardless of whether
 | 
			
		||||
 | 
			
		||||
@ -27,7 +27,6 @@ import android.content.pm.PackageManager;
 | 
			
		||||
import android.net.Uri;
 | 
			
		||||
 | 
			
		||||
import java.io.File;
 | 
			
		||||
import java.util.List;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * For Android < 4: Default Installer using the public PackageManager API of
 | 
			
		||||
@ -61,11 +60,6 @@ public class DefaultInstaller extends Installer {
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    protected void installPackageInternal(List<File> apkFiles) throws AndroidNotCompatibleException {
 | 
			
		||||
        // not used
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    protected void deletePackageInternal(String packageName) throws AndroidNotCompatibleException {
 | 
			
		||||
        try {
 | 
			
		||||
@ -103,10 +97,4 @@ public class DefaultInstaller extends Installer {
 | 
			
		||||
                return false;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public boolean supportsUnattendedOperations() {
 | 
			
		||||
        return false;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -29,7 +29,6 @@ import android.net.Uri;
 | 
			
		||||
import android.os.Build;
 | 
			
		||||
 | 
			
		||||
import java.io.File;
 | 
			
		||||
import java.util.List;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * For Android >= 4.0: Default Installer using the public PackageManager API of
 | 
			
		||||
@ -73,11 +72,6 @@ public class DefaultSdk14Installer extends Installer {
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    protected void installPackageInternal(List<File> apkFiles) throws AndroidNotCompatibleException {
 | 
			
		||||
        // not used
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    protected void deletePackageInternal(String packageName) throws AndroidNotCompatibleException {
 | 
			
		||||
        try {
 | 
			
		||||
@ -129,10 +123,4 @@ public class DefaultSdk14Installer extends Installer {
 | 
			
		||||
                return false;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public boolean supportsUnattendedOperations() {
 | 
			
		||||
        return false;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -30,7 +30,6 @@ import org.fdroid.fdroid.Utils;
 | 
			
		||||
import org.fdroid.fdroid.privileged.install.InstallExtensionDialogActivity;
 | 
			
		||||
 | 
			
		||||
import java.io.File;
 | 
			
		||||
import java.util.List;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Abstract Installer class. Also provides static methods to automatically
 | 
			
		||||
@ -53,20 +52,9 @@ public abstract class Installer {
 | 
			
		||||
 | 
			
		||||
        private static final long serialVersionUID = -8343133906463328027L;
 | 
			
		||||
 | 
			
		||||
        public AndroidNotCompatibleException() {
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public AndroidNotCompatibleException(String message) {
 | 
			
		||||
            super(message);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public AndroidNotCompatibleException(Throwable cause) {
 | 
			
		||||
            super(cause);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public AndroidNotCompatibleException(String message, Throwable cause) {
 | 
			
		||||
            super(message, cause);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
@ -175,18 +163,6 @@ public abstract class Installer {
 | 
			
		||||
        installPackageInternal(apkFile);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public void installPackage(List<File> apkFiles) throws AndroidNotCompatibleException {
 | 
			
		||||
        // check if files exist...
 | 
			
		||||
        for (File apkFile : apkFiles) {
 | 
			
		||||
            if (!apkFile.exists()) {
 | 
			
		||||
                Log.e(TAG, "Couldn't find file " + apkFile + " to install.");
 | 
			
		||||
                return;
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        installPackageInternal(apkFiles);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public void deletePackage(String packageName) throws AndroidNotCompatibleException {
 | 
			
		||||
        // check if package exists before proceeding...
 | 
			
		||||
        try {
 | 
			
		||||
@ -218,13 +194,8 @@ public abstract class Installer {
 | 
			
		||||
    protected abstract void installPackageInternal(File apkFile)
 | 
			
		||||
            throws AndroidNotCompatibleException;
 | 
			
		||||
 | 
			
		||||
    protected abstract void installPackageInternal(List<File> apkFiles)
 | 
			
		||||
            throws AndroidNotCompatibleException;
 | 
			
		||||
 | 
			
		||||
    protected abstract void deletePackageInternal(String packageName)
 | 
			
		||||
            throws AndroidNotCompatibleException;
 | 
			
		||||
 | 
			
		||||
    public abstract boolean handleOnActivityResult(int requestCode, int resultCode, Intent data);
 | 
			
		||||
 | 
			
		||||
    public abstract boolean supportsUnattendedOperations();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -44,7 +44,6 @@ import org.fdroid.fdroid.privileged.views.AppSecurityPermissions;
 | 
			
		||||
import org.fdroid.fdroid.privileged.views.InstallConfirmActivity;
 | 
			
		||||
 | 
			
		||||
import java.io.File;
 | 
			
		||||
import java.util.List;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Installer based on using internal hidden APIs of the Android OS, which are
 | 
			
		||||
@ -237,12 +236,6 @@ public class PrivilegedInstaller extends Installer {
 | 
			
		||||
                Context.BIND_AUTO_CREATE);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    protected void installPackageInternal(List<File> apkFiles)
 | 
			
		||||
            throws AndroidNotCompatibleException {
 | 
			
		||||
        // not used
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    protected void deletePackageInternal(final String packageName)
 | 
			
		||||
            throws AndroidNotCompatibleException {
 | 
			
		||||
@ -368,11 +361,6 @@ public class PrivilegedInstaller extends Installer {
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public boolean supportsUnattendedOperations() {
 | 
			
		||||
        return false;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public static final int INSTALL_REPLACE_EXISTING = 2;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
 | 
			
		||||
@ -1,7 +1,5 @@
 | 
			
		||||
package org.fdroid.fdroid.net;
 | 
			
		||||
 | 
			
		||||
import android.support.annotation.NonNull;
 | 
			
		||||
 | 
			
		||||
import org.fdroid.fdroid.Utils;
 | 
			
		||||
 | 
			
		||||
import java.io.File;
 | 
			
		||||
@ -27,11 +25,16 @@ public abstract class Downloader {
 | 
			
		||||
 | 
			
		||||
    private final OutputStream outputStream;
 | 
			
		||||
 | 
			
		||||
    private final File outputFile;
 | 
			
		||||
    public final File outputFile;
 | 
			
		||||
 | 
			
		||||
    protected final URL sourceUrl;
 | 
			
		||||
    protected String cacheTag;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * This is meant only to send progress to {@link DownloaderService}. This
 | 
			
		||||
     * also keeps this class pure Java so that it can be tested on the JVM,
 | 
			
		||||
     * without requiring an Android device or emulator.
 | 
			
		||||
     */
 | 
			
		||||
    interface DownloaderProgressListener {
 | 
			
		||||
        void sendProgress(URL sourceUrl, int bytesRead, int totalBytes);
 | 
			
		||||
    }
 | 
			
		||||
@ -78,15 +81,6 @@ public abstract class Downloader {
 | 
			
		||||
        return cacheTag != null;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Only available if you passed a context object into the constructor
 | 
			
		||||
     * (rather than an outputStream, which may or  may not be associated with
 | 
			
		||||
     * a file).
 | 
			
		||||
     */
 | 
			
		||||
    public File getFile() {
 | 
			
		||||
        return outputFile;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public abstract boolean hasChanged();
 | 
			
		||||
 | 
			
		||||
    protected abstract int totalDownloadSize();
 | 
			
		||||
@ -222,12 +216,12 @@ public abstract class Downloader {
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        @Override
 | 
			
		||||
        public int read(@NonNull byte[] buffer) throws IOException {
 | 
			
		||||
        public int read(byte[] buffer) throws IOException {
 | 
			
		||||
            return toWrap.read(buffer);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        @Override
 | 
			
		||||
        public int read(@NonNull byte[] buffer, int byteOffset, int byteCount) throws IOException {
 | 
			
		||||
        public int read(byte[] buffer, int byteOffset, int byteCount) throws IOException {
 | 
			
		||||
            return toWrap.read(buffer, byteOffset, byteCount);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -114,8 +114,7 @@ public class HttpDownloader extends Downloader {
 | 
			
		||||
        // workaround until NetCipher supports HTTPS SNI
 | 
			
		||||
        // https://gitlab.com/fdroid/fdroidclient/issues/431
 | 
			
		||||
        if (connection instanceof HttpsURLConnection
 | 
			
		||||
                && "f-droid.org".equals(sourceUrl.getHost())
 | 
			
		||||
                && "guardianproject.info".equals(sourceUrl.getHost())) {
 | 
			
		||||
                && "f-droid.org".equals(sourceUrl.getHost())) {
 | 
			
		||||
            ((HttpsURLConnection) connection).setSSLSocketFactory(HttpsURLConnection.getDefaultSSLSocketFactory());
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user