Tidied up some file-related stuff

This commit is contained in:
Ciaran Gultnieks 2012-09-14 09:24:08 +01:00
parent cd44c8b80b
commit 3c0ccf2f4f
7 changed files with 114 additions and 131 deletions

View File

@ -314,10 +314,9 @@ public class AppDetails extends ListActivity {
private void resetViews() {
// Set the icon...
ImageView iv = (ImageView) findViewById(R.id.icon);
String icon_path = DB.getIconsPath() + app.icon;
File test_icon = new File(icon_path);
if (test_icon.exists()) {
iv.setImageDrawable(new BitmapDrawable(icon_path));
File icon = new File(DB.getIconsPath(), app.icon);
if (icon.exists()) {
iv.setImageDrawable(new BitmapDrawable(icon.getPath()));
} else {
iv.setImageResource(android.R.drawable.sym_def_app_icon);
}
@ -473,10 +472,10 @@ public class AppDetails extends ListActivity {
}
private void installApk(String file) {
private void installApk(File file) {
Intent intent = new Intent();
intent.setAction(android.content.Intent.ACTION_VIEW);
intent.setDataAndType(Uri.parse("file://" + file),
intent.setDataAndType(Uri.parse("file://" + file.getPath()),
"application/vnd.android.package-archive");
startActivityForResult(intent, REQUEST_INSTALL);
((FDroidApp) getApplication()).invalidateApps();
@ -509,7 +508,7 @@ public class AppDetails extends ListActivity {
private Downloader download;
private ProgressDialog pd;
private boolean updating;
private String localFile;
private File localFile;
public DownloadHandler(DB.Apk apk) {
download = new Downloader(apk);
@ -589,9 +588,8 @@ public class AppDetails extends ListActivity {
// installed (or maybe the user cancelled the install - doesn't
// matter) from the SD card...
if (!pref_cacheDownloaded) {
File file = new File(localFile);
Log.d("FDroid", "Cleaning up: " + file);
file.delete();
Log.d("FDroid", "Cleaning up: " + localFile.getPath());
localFile.delete();
localFile = null;
}
}

View File

@ -82,11 +82,10 @@ public class AppListAdapter extends BaseAdapter {
summary.setText(app.summary);
ImageView icon = (ImageView) v.findViewById(R.id.icon);
String iconpath = new String(DB.getIconsPath() + app.icon);
File icn = new File(iconpath);
File icn = new File(DB.getIconsPath(), app.icon);
if (icn.exists() && icn.length() > 0) {
new Uri.Builder().build();
icon.setImageURI(Uri.parse(iconpath));
icon.setImageURI(Uri.parse(icn.getPath()));
} else {
icon.setImageResource(android.R.drawable.sym_def_app_icon);
}

View File

@ -19,10 +19,10 @@
package org.fdroid.fdroid;
import java.io.File;
import java.text.SimpleDateFormat;
import java.util.Collections;
import java.util.Date;
import java.util.Dictionary;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
@ -42,6 +42,7 @@ import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.os.Build;
import android.os.Environment;
import android.preference.PreferenceManager;
import android.text.TextUtils.SimpleStringSplitter;
import android.util.Log;
@ -419,8 +420,12 @@ public class DB {
}
public static String getIconsPath() {
return "/sdcard/.fdroid/icons/";
public static File getDataPath() {
return new File(Environment.getExternalStorageDirectory(), ".fdroid");
}
public static File getIconsPath() {
return new File(getDataPath(), "icons");
}
private PackageManager mPm;

View File

@ -1,5 +1,5 @@
/*
* Copyright (C) 2010-2011 Ciaran Gultnieks <ciaran@ciarang.com>
* Copyright (C) 2010-2012 Ciaran Gultnieks <ciaran@ciarang.com>
* Copyright (C) 2011 Henrik Tunedal <tunedal@gmail.com>
*
* This program is free software; you can redistribute it and/or
@ -29,14 +29,17 @@ import java.net.URL;
public class Downloader extends Thread {
private static final String LOCAL_PATH = "/sdcard/.fdroid";
private DB.Apk curapk;
private String filename;
private String localfile;
private File localfile;
public static enum Status { STARTING, RUNNING, ERROR, DONE, CANCELLED };
public static enum Error { CORRUPT, UNKNOWN };
public static enum Status {
STARTING, RUNNING, ERROR, DONE, CANCELLED
};
public static enum Error {
CORRUPT, UNKNOWN
};
private Status status = Status.STARTING;
private Error error;
@ -58,6 +61,7 @@ public class Downloader extends Thread {
public synchronized int getProgress() {
return progress;
}
public synchronized int getMax() {
return max;
}
@ -66,6 +70,7 @@ public class Downloader extends Thread {
public synchronized Error getErrorType() {
return error;
}
public synchronized String getErrorMessage() {
return errorMessage;
}
@ -75,8 +80,8 @@ public class Downloader extends Thread {
return filename;
}
// Path to the downloaded APK
public synchronized String localFile() {
// The downloaded APK. Valid only when getStatus() has returned STATUS.DONE.
public File localFile() {
return localfile;
}
@ -87,125 +92,103 @@ public class Downloader extends Thread {
public void run() {
// Download the apk file from the repository...
File f;
String apk_file = null;
String apkname = curapk.apkName;
synchronized (this) {
localfile = new String(LOCAL_PATH + "/" + apkname);
}
localfile = new File(DB.getDataPath(), apkname);
try {
// See if we already have this apk cached...
f = new File(localfile);
if (f.exists()) {
if (localfile.exists()) {
// We do - if its hash matches, we'll use it...
Hasher hash = new Hasher(curapk.hashType, f);
Hasher hash = new Hasher(curapk.hashType, localfile);
if (hash.match(curapk.hash)) {
Log.d("FDroid", "Using cached apk at " + localfile);
synchronized (this) {
filename = apk_file = localfile;
progress = 1;
max = 1;
status = Status.RUNNING;
status = Status.DONE;
return;
}
} else {
Log.d("FDroid", "Not using cached apk at "
+ localfile);
f.delete();
Log.d("FDroid", "Not using cached apk at " + localfile);
localfile.delete();
}
}
// If we haven't got the apk locally, we'll have to download
// it...
if (apk_file == null) {
// If we haven't got the apk locally, we'll have to download it...
String remotefile;
if (curapk.apkSource == null) {
remotefile = curapk.server + "/" + apkname.replace(" ", "%20");
} else {
remotefile = curapk.apkSource;
}
Log.d("FDroid", "Downloading apk from " + remotefile);
synchronized (this) {
filename = remotefile;
progress = 0;
max = curapk.size;
status = Status.RUNNING;
}
String remotefile;
if (curapk.apkSource == null) {
remotefile = curapk.server + "/"
+ apkname.replace(" ", "%20");
} else {
remotefile = curapk.apkSource;
}
Log.d("FDroid", "Downloading apk from " + remotefile);
synchronized (this) {
filename = remotefile;
progress = 0;
max = curapk.size;
status = Status.RUNNING;
}
BufferedInputStream getit = new BufferedInputStream(new URL(
remotefile).openStream(), 8192);
BufferedInputStream getit =
new BufferedInputStream(new URL(remotefile).openStream(),
8192);
FileOutputStream saveit = new FileOutputStream(localfile);
BufferedOutputStream bout = new BufferedOutputStream(saveit, 1024);
byte data[] = new byte[1024];
FileOutputStream saveit =
new FileOutputStream(localfile);
BufferedOutputStream bout =
new BufferedOutputStream(saveit, 1024);
byte data[] = new byte[1024];
int totalRead = 0;
int bytesRead = getit.read(data, 0, 1024);
while (bytesRead != -1) {
if (isInterrupted()) {
Log.d("FDroid", "Download cancelled!");
break;
}
bout.write(data, 0, bytesRead);
totalRead += bytesRead;
synchronized (this) {
progress = totalRead;
}
bytesRead = getit.read(data, 0, 1024);
}
bout.close();
getit.close();
saveit.close();
f = new File(localfile);
int totalRead = 0;
int bytesRead = getit.read(data, 0, 1024);
while (bytesRead != -1) {
if (isInterrupted()) {
f.delete();
synchronized (this) {
status = Status.CANCELLED;
}
return;
Log.d("FDroid", "Download cancelled!");
break;
}
Hasher hash = new Hasher(curapk.hashType, f);
if (hash.match(curapk.hash)) {
apk_file = localfile;
} else {
synchronized (this) {
error = Error.CORRUPT;
errorMessage = null;
status = Status.ERROR;
}
Log.d("FDroid", "Downloaded file hash of "
+ hash.getHash() + " did not match repo's "
+ curapk.hash);
bout.write(data, 0, bytesRead);
totalRead += bytesRead;
synchronized (this) {
progress = totalRead;
}
bytesRead = getit.read(data, 0, 1024);
}
bout.close();
getit.close();
saveit.close();
if (isInterrupted()) {
localfile.delete();
synchronized (this) {
status = Status.CANCELLED;
}
return;
}
Hasher hash = new Hasher(curapk.hashType, localfile);
if (!hash.match(curapk.hash)) {
synchronized (this) {
Log.d("FDroid", "Downloaded file hash of " + hash.getHash()
+ " did not match repo's " + curapk.hash);
// No point keeping a bad file, whether we're
// caching or not.
f = new File(localfile);
f.delete();
localfile.delete();
error = Error.CORRUPT;
errorMessage = null;
status = Status.ERROR;
return;
}
}
} catch (Exception e) {
Log.e("FDroid", "Download failed:\n"
+ Log.getStackTraceString(e));
Log.e("FDroid", "Download failed:\n" + Log.getStackTraceString(e));
synchronized (this) {
localfile.delete();
error = Error.UNKNOWN;
errorMessage = e.toString();
status = Status.ERROR;
return;
}
// Get rid of any partial download...
f = new File(localfile);
f.delete();
}
if (apk_file != null) {
synchronized (this) {
status = Status.DONE;
}
Log.d("FDroid", "Download finished: " + apk_file);
Log.d("FDroid", "Download finished: " + localfile);
synchronized (this) {
status = Status.DONE;
}
}
}

View File

@ -19,7 +19,6 @@
package org.fdroid.fdroid;
import java.io.File;
import java.util.Calendar;
import java.util.Date;
import java.util.Vector;
@ -33,14 +32,12 @@ import android.app.TabActivity;
import android.app.AlertDialog.Builder;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.SharedPreferences;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.net.Uri;
import android.os.Bundle;
import android.os.Handler;
import android.os.ResultReceiver;
import android.preference.PreferenceManager;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.Menu;
@ -60,8 +57,6 @@ import android.widget.TabHost.TabSpec;
public class FDroid extends TabActivity implements OnItemClickListener,
OnItemSelectedListener {
private String LOCAL_PATH = "/sdcard/.fdroid";
private static final int REQUEST_APPDETAILS = 0;
private static final int REQUEST_MANAGEREPOS = 1;
private static final int REQUEST_PREFS = 2;
@ -109,14 +104,6 @@ public class FDroid extends TabActivity implements OnItemClickListener,
setContentView(R.layout.fdroid);
File local_path = new File(LOCAL_PATH);
if (!local_path.exists())
local_path.mkdir();
File icon_path = new File(DB.getIconsPath());
if (!icon_path.exists())
icon_path.mkdir();
Spinner spinner = (Spinner) findViewById(R.id.category);
categories = new ArrayAdapter<String>(this,
android.R.layout.simple_spinner_item, new Vector<String>());

View File

@ -18,10 +18,12 @@
package org.fdroid.fdroid;
import java.io.File;
import java.util.Vector;
import java.util.concurrent.Semaphore;
import android.app.Application;
import android.util.Log;
public class FDroidApp extends Application {
@ -29,8 +31,19 @@ public class FDroidApp extends Application {
public void onCreate() {
super.onCreate();
File local_path = DB.getDataPath();
Log.d("FDroid", "Data path is " + local_path.getPath());
if (!local_path.exists())
local_path.mkdir();
File icon_path = DB.getIconsPath();
Log.d("FDroid", "Icon path is " + icon_path.getPath());
if (!icon_path.exists())
icon_path.mkdir();
apps = null;
DB.initDB(getApplicationContext());
}
// Global list of all known applications.

View File

@ -242,8 +242,7 @@ public class RepoXMLHandler extends DefaultHandler {
private void getIcon(DB.App app) {
try {
String destpath = DB.getIconsPath() + app.icon;
File f = new File(destpath);
File f = new File(DB.getIconsPath(), app.icon);
if (f.exists())
return;
@ -252,7 +251,7 @@ public class RepoXMLHandler extends DefaultHandler {
if (uc.getResponseCode() == 200) {
BufferedInputStream getit = new BufferedInputStream(
uc.getInputStream());
FileOutputStream saveit = new FileOutputStream(destpath);
FileOutputStream saveit = new FileOutputStream(f);
BufferedOutputStream bout = new BufferedOutputStream(saveit,
1024);
byte data[] = new byte[1024];
@ -296,8 +295,7 @@ public class RepoXMLHandler extends DefaultHandler {
// APKs are merged into the existing one).
// Returns null if successful, otherwise an error message to be displayed
// to the user (if there is an interactive user!)
public static String doUpdate(Context ctx, DB.Repo repo,
Vector<DB.App> apps) {
public static String doUpdate(Context ctx, DB.Repo repo, Vector<DB.App> apps) {
try {
if (repo.pubkey != null) {
@ -394,8 +392,8 @@ public class RepoXMLHandler extends DefaultHandler {
}
} catch (SSLHandshakeException sslex) {
Log.e("FDroid", "SSLHandShakeException updating from " + repo.address + ":\n"
+ Log.getStackTraceString(sslex));
Log.e("FDroid", "SSLHandShakeException updating from "
+ repo.address + ":\n" + Log.getStackTraceString(sslex));
return "A problem occurred while establishing an SSL connection. If this problem persists, AND you have a very old device, you could try using http instead of https for the repo URL.";
} catch (Exception e) {
Log.e("FDroid", "Exception updating from " + repo.address + ":\n"