Merge branch 'fix-fdroid-notifying-itself' into 'master'
Don't try to notify the user for apks which are already installed. See merge request !547
This commit is contained in:
commit
89001ac1f5
@ -7,10 +7,12 @@ import android.content.pm.PackageInfo;
|
||||
import android.content.pm.PackageManager;
|
||||
import android.net.Uri;
|
||||
import android.support.annotation.Nullable;
|
||||
import android.text.TextUtils;
|
||||
import android.util.Log;
|
||||
|
||||
import org.fdroid.fdroid.data.Apk;
|
||||
import org.fdroid.fdroid.data.ApkProvider;
|
||||
import org.fdroid.fdroid.data.InstalledAppProviderService;
|
||||
import org.fdroid.fdroid.installer.ApkCache;
|
||||
import org.fdroid.fdroid.installer.InstallManagerService;
|
||||
|
||||
@ -75,29 +77,46 @@ public class AppUpdateStatusService extends IntentService {
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Verifies that {@param apkPath} is a valid apk which the user intends to install.
|
||||
* If it is corrupted to the point where {@link PackageManager} can't read it, doesn't match the hash of any apk
|
||||
* we know about in our database, is not pending install, or is already installed, then it will return null.
|
||||
*/
|
||||
@Nullable
|
||||
private Apk processDownloadedApk(File apkPath) {
|
||||
Utils.debugLog(TAG, "Checking " + apkPath);
|
||||
PackageInfo downloadedInfo = getPackageManager().getPackageArchiveInfo(apkPath.getAbsolutePath(), PackageManager.GET_GIDS);
|
||||
if (downloadedInfo == null) {
|
||||
Utils.debugLog(TAG, "Skipping " + apkPath + " because PackageManager was unable to read it.");
|
||||
Log.i(TAG, "Skipping " + apkPath + " because PackageManager was unable to read it.");
|
||||
return null;
|
||||
}
|
||||
|
||||
Utils.debugLog(TAG, "Found package for " + downloadedInfo.packageName + ", checking its hash to see if it downloaded correctly.");
|
||||
Apk downloadedApk = findApkMatchingHash(apkPath);
|
||||
if (downloadedApk == null) {
|
||||
Utils.debugLog(TAG, "Either the apk wasn't downloaded fully, or the repo it came from has been disabled. Either way, not notifying the user about it.");
|
||||
Log.i(TAG, "Either the apk wasn't downloaded fully, or the repo it came from has been disabled. Either way, not notifying the user about it.");
|
||||
return null;
|
||||
}
|
||||
|
||||
if (AppUpdateStatusManager.getInstance(this).isPendingInstall(downloadedApk.hash)) {
|
||||
Utils.debugLog(TAG, downloadedApk.packageName + " is pending install, so we need to notify the user about installing it.");
|
||||
return downloadedApk;
|
||||
} else {
|
||||
Utils.debugLog(TAG, downloadedApk.packageName + " is NOT pending install, probably just left over from a previous install.");
|
||||
if (!AppUpdateStatusManager.getInstance(this).isPendingInstall(downloadedApk.hash)) {
|
||||
Log.i(TAG, downloadedApk.packageName + " is NOT pending install, probably just left over from a previous install.");
|
||||
return null;
|
||||
}
|
||||
|
||||
try {
|
||||
PackageInfo info = getPackageManager().getPackageInfo(downloadedApk.packageName, 0);
|
||||
File pathToInstalled = InstalledAppProviderService.getPathToInstalledApk(info);
|
||||
if (pathToInstalled != null && pathToInstalled.canRead() &&
|
||||
pathToInstalled.length() == downloadedApk.size && // Check size before hash for performance.
|
||||
TextUtils.equals(Utils.getBinaryHash(pathToInstalled, "sha256"), downloadedApk.hash)) {
|
||||
Log.i(TAG, downloadedApk.packageName + " is pending install, but we already have the correct version installed.");
|
||||
AppUpdateStatusManager.getInstance(this).markAsNoLongerPendingInstall(downloadedApk.getUrl());
|
||||
return null;
|
||||
}
|
||||
} catch (PackageManager.NameNotFoundException ignored) { }
|
||||
|
||||
Utils.debugLog(TAG, downloadedApk.packageName + " is pending install, so we need to notify the user about installing it.");
|
||||
return downloadedApk;
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -188,6 +188,29 @@ public class InstalledAppProviderService extends IntentService {
|
||||
}
|
||||
}
|
||||
|
||||
@Nullable
|
||||
public static File getPathToInstalledApk(PackageInfo packageInfo) {
|
||||
File apk = new File(packageInfo.applicationInfo.publicSourceDir);
|
||||
if (apk.isDirectory()) {
|
||||
FilenameFilter filter = new FilenameFilter() {
|
||||
@Override
|
||||
public boolean accept(File dir, String name) {
|
||||
return name.endsWith(".apk");
|
||||
}
|
||||
};
|
||||
File[] files = apk.listFiles(filter);
|
||||
if (files == null) {
|
||||
String msg = packageInfo.packageName + " sourceDir has no APKs: " + apk.getAbsolutePath();
|
||||
Utils.debugLog(TAG, msg);
|
||||
ACRA.getErrorReporter().handleException(new IllegalArgumentException(msg), false);
|
||||
return null;
|
||||
}
|
||||
apk = files[0];
|
||||
}
|
||||
|
||||
return apk;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onHandleIntent(Intent intent) {
|
||||
Process.setThreadPriority(Process.THREAD_PRIORITY_LOWEST);
|
||||
@ -201,23 +224,9 @@ public class InstalledAppProviderService extends IntentService {
|
||||
PackageInfo packageInfo = getPackageInfo(intent, packageName);
|
||||
if (packageInfo != null) {
|
||||
Log.i(TAG, "Marking " + packageName + " as installed");
|
||||
File apk = new File(packageInfo.applicationInfo.publicSourceDir);
|
||||
if (apk.isDirectory()) {
|
||||
FilenameFilter filter = new FilenameFilter() {
|
||||
@Override
|
||||
public boolean accept(File dir, String name) {
|
||||
return name.endsWith(".apk");
|
||||
}
|
||||
};
|
||||
File[] files = apk.listFiles(filter);
|
||||
if (files == null) {
|
||||
String msg = packageName + " sourceDir has no APKs: "
|
||||
+ apk.getAbsolutePath();
|
||||
Utils.debugLog(TAG, msg);
|
||||
ACRA.getErrorReporter().handleException(new IllegalArgumentException(msg), false);
|
||||
return;
|
||||
}
|
||||
apk = files[0];
|
||||
File apk = getPathToInstalledApk(packageInfo);
|
||||
if (apk == null) {
|
||||
return;
|
||||
}
|
||||
if (apk.exists() && apk.canRead()) {
|
||||
try {
|
||||
|
Loading…
x
Reference in New Issue
Block a user