use shared method for getting full installed path for media files

This commit is contained in:
Hans-Christoph Steiner 2020-10-19 15:58:20 +02:00
parent fe45b33851
commit 5a0092d42e
No known key found for this signature in database
GPG Key ID: 3E177817BA1B9BFA
5 changed files with 112 additions and 11 deletions

View File

@ -588,8 +588,12 @@ public class Apk extends ValueObject implements Comparable<Apk>, Parcelable {
return path;
}
public File getInstalledMediaFile(Context context) {
return new File(this.getMediaInstallPath(context), SanitizedFile.sanitizeFileName(this.apkName));
}
public boolean isMediaInstalled(Context context) {
return new File(this.getMediaInstallPath(context), SanitizedFile.sanitizeFileName(this.apkName)).isFile();
return getInstalledMediaFile(context).isFile();
}
/**

View File

@ -6,13 +6,13 @@ import android.content.Intent;
import android.content.pm.PackageManager;
import android.net.Uri;
import android.os.Bundle;
import androidx.annotation.NonNull;
import androidx.core.app.ActivityCompat;
import androidx.fragment.app.FragmentActivity;
import androidx.core.content.ContextCompat;
import androidx.appcompat.app.AlertDialog;
import android.view.ContextThemeWrapper;
import android.widget.Toast;
import androidx.annotation.NonNull;
import androidx.appcompat.app.AlertDialog;
import androidx.core.app.ActivityCompat;
import androidx.core.content.ContextCompat;
import androidx.fragment.app.FragmentActivity;
import org.apache.commons.io.FileUtils;
import org.fdroid.fdroid.FDroidApp;
import org.fdroid.fdroid.R;
@ -148,10 +148,10 @@ public class FileInstallerActivity extends FragmentActivity {
private void installPackage(Uri localApkUri, Uri canonicalUri, Apk apk) {
Utils.debugLog(TAG, "Installing: " + localApkUri.getPath());
File path = apk.getMediaInstallPath(activity.getApplicationContext());
path.mkdirs();
File path = apk.getInstalledMediaFile(activity.getApplicationContext());
path.getParentFile().mkdirs();
try {
FileUtils.copyFileToDirectory(new File(localApkUri.getPath()), path);
FileUtils.copyFile(new File(localApkUri.getPath()), path);
} catch (IOException e) {
Utils.debugLog(TAG, "Failed to copy: " + e.getMessage());
installer.sendBroadcastInstall(canonicalUri, Installer.ACTION_INSTALL_INTERRUPTED);
@ -169,7 +169,7 @@ public class FileInstallerActivity extends FragmentActivity {
private void uninstallPackage(Apk apk) {
if (apk.isMediaInstalled(activity.getApplicationContext())) {
File file = new File(apk.getMediaInstallPath(activity.getApplicationContext()), apk.apkName);
File file = apk.getInstalledMediaFile(activity.getApplicationContext());
if (!file.delete()) {
installer.sendBroadcastUninstall(Installer.ACTION_UNINSTALL_INTERRUPTED);
return;

View File

@ -604,7 +604,7 @@ public class AppDetailsRecyclerViewAdapter
}
});
} else if (!app.isApk && mediaApk != null) {
final File installedFile = new File(mediaApk.getMediaInstallPath(context), mediaApk.apkName);
final File installedFile = mediaApk.getInstalledMediaFile(context);
if (!installedFile.toString().startsWith(context.getApplicationInfo().dataDir)) {
final Intent viewIntent = new Intent(Intent.ACTION_VIEW);
Uri uri = FileProvider.getUriForFile(context, Installer.AUTHORITY, installedFile);

View File

@ -0,0 +1,47 @@
package org.fdroid.fdroid.installer;
import android.content.ContextWrapper;
import androidx.test.core.app.ApplicationProvider;
import org.fdroid.fdroid.Preferences;
import org.fdroid.fdroid.TestUtils;
import org.fdroid.fdroid.data.Apk;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.robolectric.RobolectricTestRunner;
import org.robolectric.shadows.ShadowLog;
import java.io.IOException;
import java.util.Enumeration;
import java.util.zip.ZipEntry;
import java.util.zip.ZipFile;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
@RunWith(RobolectricTestRunner.class)
public class FileInstallerTest {
public static final String TAG = "FileInstallerTest";
private ContextWrapper context;
@Before
public final void setUp() {
context = ApplicationProvider.getApplicationContext();
Preferences.setupForTests(context);
ShadowLog.stream = System.out;
}
@Test
public void testInstallOtaZip() {
Apk apk = new Apk();
apk.apkName = "org.fdroid.fdroid.privileged.ota_2010.zip";
apk.packageName = "org.fdroid.fdroid.privileged.ota";
apk.versionCode = 2010;
assertFalse(apk.isApk());
Installer installer = InstallerFactory.create(context, apk);
assertEquals("should be a FileInstaller",
FileInstaller.class,
installer.getClass());
}
}

View File

@ -0,0 +1,50 @@
package org.fdroid.fdroid.installer;
import android.content.ContextWrapper;
import androidx.test.core.app.ApplicationProvider;
import org.fdroid.fdroid.Preferences;
import org.fdroid.fdroid.data.Apk;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.robolectric.RobolectricTestRunner;
import static org.junit.Assert.assertEquals;
@RunWith(RobolectricTestRunner.class)
public class InstallerFactoryTest {
private ContextWrapper context;
@Before
public final void setUp() {
context = ApplicationProvider.getApplicationContext();
Preferences.setupForTests(context);
}
@Test
public void testApkInstallerInstance() {
for (String filename : new String[]{"test.apk", "A.APK", "b.ApK"}) {
Apk apk = new Apk();
apk.apkName = filename;
apk.packageName = "test";
Installer installer = InstallerFactory.create(context, apk);
assertEquals(filename + " should use a DefaultInstaller",
DefaultInstaller.class,
installer.getClass());
}
}
@Test
public void testFileInstallerInstance() {
for (String filename : new String[]{"org.fdroid.fdroid.privileged.ota_2110.zip", "test.ZIP"}) {
Apk apk = new Apk();
apk.apkName = filename;
apk.packageName = "cafe0088";
Installer installer = InstallerFactory.create(context, apk);
assertEquals("should be a FileInstaller",
FileInstaller.class,
installer.getClass());
}
}
}