Use icons from old .fdroid rather than downloading if possible
This commit is contained in:
		
							parent
							
								
									9d51cd72ac
								
							
						
					
					
						commit
						d01afa4cb6
					
				@ -19,6 +19,7 @@
 | 
			
		||||
package org.fdroid.fdroid;
 | 
			
		||||
 | 
			
		||||
import java.io.File;
 | 
			
		||||
import java.io.FileInputStream;
 | 
			
		||||
import java.io.FileOutputStream;
 | 
			
		||||
import java.io.InputStream;
 | 
			
		||||
import java.io.OutputStream;
 | 
			
		||||
@ -37,6 +38,7 @@ import android.content.SharedPreferences;
 | 
			
		||||
import android.content.SharedPreferences.Editor;
 | 
			
		||||
import android.graphics.BitmapFactory;
 | 
			
		||||
import android.os.Bundle;
 | 
			
		||||
import android.os.Environment;
 | 
			
		||||
import android.os.ResultReceiver;
 | 
			
		||||
import android.os.SystemClock;
 | 
			
		||||
import android.preference.PreferenceManager;
 | 
			
		||||
@ -46,10 +48,10 @@ import android.support.v4.app.TaskStackBuilder;
 | 
			
		||||
 | 
			
		||||
public class UpdateService extends IntentService implements ProgressListener {
 | 
			
		||||
 | 
			
		||||
    public static final String RESULT_MESSAGE  = "msg";
 | 
			
		||||
    public static final int STATUS_COMPLETE    = 0;
 | 
			
		||||
    public static final int STATUS_ERROR       = 1;
 | 
			
		||||
    public static final int STATUS_INFO        = 2;
 | 
			
		||||
    public static final String RESULT_MESSAGE = "msg";
 | 
			
		||||
    public static final int STATUS_COMPLETE = 0;
 | 
			
		||||
    public static final int STATUS_ERROR = 1;
 | 
			
		||||
    public static final int STATUS_INFO = 2;
 | 
			
		||||
 | 
			
		||||
    private ResultReceiver receiver = null;
 | 
			
		||||
 | 
			
		||||
@ -84,23 +86,23 @@ public class UpdateService extends IntentService implements ProgressListener {
 | 
			
		||||
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    protected void sendStatus(int statusCode ) {
 | 
			
		||||
    protected void sendStatus(int statusCode) {
 | 
			
		||||
        sendStatus(statusCode, null);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    protected void sendStatus(int statusCode, String message ) {
 | 
			
		||||
    protected void sendStatus(int statusCode, String message) {
 | 
			
		||||
        if (receiver != null) {
 | 
			
		||||
            Bundle resultData = new Bundle();
 | 
			
		||||
            if (message != null && message.length() > 0)
 | 
			
		||||
                resultData.putString(RESULT_MESSAGE, message);
 | 
			
		||||
            receiver.send( statusCode, resultData );
 | 
			
		||||
            receiver.send(statusCode, resultData);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * We might be doing a scheduled run, or we might have been launched by
 | 
			
		||||
     * the app in response to a user's request. If we have a receiver, it's
 | 
			
		||||
     * the latter...
 | 
			
		||||
     * We might be doing a scheduled run, or we might have been launched by the
 | 
			
		||||
     * app in response to a user's request. If we have a receiver, it's the
 | 
			
		||||
     * latter...
 | 
			
		||||
     */
 | 
			
		||||
    private boolean isScheduledRun() {
 | 
			
		||||
        return receiver == null;
 | 
			
		||||
@ -158,14 +160,17 @@ public class UpdateService extends IntentService implements ProgressListener {
 | 
			
		||||
            for (DB.Repo repo : repos) {
 | 
			
		||||
                if (repo.inuse) {
 | 
			
		||||
 | 
			
		||||
                    sendStatus(STATUS_INFO, getString(R.string.status_connecting_to_repo, repo.address));
 | 
			
		||||
                    sendStatus(
 | 
			
		||||
                            STATUS_INFO,
 | 
			
		||||
                            getString(R.string.status_connecting_to_repo,
 | 
			
		||||
                                    repo.address));
 | 
			
		||||
 | 
			
		||||
                    StringBuilder newetag = new StringBuilder();
 | 
			
		||||
                    String err = RepoXMLHandler.doUpdate(getBaseContext(),
 | 
			
		||||
                            repo, apps, newetag, keeprepos, this);
 | 
			
		||||
                    if (err == null) {
 | 
			
		||||
                        String nt = newetag.toString();
 | 
			
		||||
                        if(!nt.equals(repo.lastetag)) {
 | 
			
		||||
                        if (!nt.equals(repo.lastetag)) {
 | 
			
		||||
                            repo.lastetag = newetag.toString();
 | 
			
		||||
                            changes = true;
 | 
			
		||||
                        }
 | 
			
		||||
@ -182,12 +187,15 @@ public class UpdateService extends IntentService implements ProgressListener {
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            if (!changes && success) {
 | 
			
		||||
                    Log.d("FDroid", "Not checking app details or compatibility, because all repos were up to date.");
 | 
			
		||||
                Log.d("FDroid",
 | 
			
		||||
                        "Not checking app details or compatibility, because all repos were up to date.");
 | 
			
		||||
            } else if (changes && success) {
 | 
			
		||||
 | 
			
		||||
                sendStatus(STATUS_INFO, getString(R.string.status_checking_compatibility));
 | 
			
		||||
                sendStatus(STATUS_INFO,
 | 
			
		||||
                        getString(R.string.status_checking_compatibility));
 | 
			
		||||
                List<DB.App> acceptedapps = new ArrayList<DB.App>();
 | 
			
		||||
                List<DB.App> prevapps = ((FDroidApp) getApplication()).getApps();
 | 
			
		||||
                List<DB.App> prevapps = ((FDroidApp) getApplication())
 | 
			
		||||
                        .getApps();
 | 
			
		||||
 | 
			
		||||
                DB db = DB.getDB();
 | 
			
		||||
                try {
 | 
			
		||||
@ -245,7 +253,8 @@ public class UpdateService extends IntentService implements ProgressListener {
 | 
			
		||||
                    DB.releaseDB();
 | 
			
		||||
                }
 | 
			
		||||
                if (success) {
 | 
			
		||||
                    sendStatus(STATUS_INFO, getString(R.string.status_downloading_icons));
 | 
			
		||||
                    sendStatus(STATUS_INFO,
 | 
			
		||||
                            getString(R.string.status_downloading_icons));
 | 
			
		||||
                    for (DB.App app : acceptedapps)
 | 
			
		||||
                        getIcon(app, repos);
 | 
			
		||||
                    ((FDroidApp) getApplication()).invalidateAllApps();
 | 
			
		||||
@ -257,33 +266,32 @@ public class UpdateService extends IntentService implements ProgressListener {
 | 
			
		||||
                Log.d("FDroid", "Notifying updates. Apps before:" + prevUpdates
 | 
			
		||||
                        + ", apps after: " + newUpdates);
 | 
			
		||||
                if (newUpdates > prevUpdates) {
 | 
			
		||||
                    NotificationCompat.Builder mBuilder =
 | 
			
		||||
                            new NotificationCompat.Builder(this)
 | 
			
		||||
                    NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(
 | 
			
		||||
                            this)
 | 
			
		||||
                            .setSmallIcon(R.drawable.icon)
 | 
			
		||||
                            .setLargeIcon(
 | 
			
		||||
                    BitmapFactory.decodeResource(getResources(), R.drawable.icon))
 | 
			
		||||
                                    BitmapFactory.decodeResource(
 | 
			
		||||
                                            getResources(), R.drawable.icon))
 | 
			
		||||
                            .setAutoCancel(true)
 | 
			
		||||
                            .setContentTitle(getString(R.string.fdroid_updates_available));
 | 
			
		||||
                            .setContentTitle(
 | 
			
		||||
                                    getString(R.string.fdroid_updates_available));
 | 
			
		||||
                    Intent notifyIntent = new Intent(this, FDroid.class)
 | 
			
		||||
                            .putExtra(FDroid.EXTRA_TAB_UPDATE, true);
 | 
			
		||||
                    if (newUpdates > 1) {
 | 
			
		||||
                        mBuilder.setContentText(getString(
 | 
			
		||||
                                    R.string.many_updates_available, newUpdates));
 | 
			
		||||
                      
 | 
			
		||||
                                R.string.many_updates_available, newUpdates));
 | 
			
		||||
 | 
			
		||||
                    } else {
 | 
			
		||||
                        mBuilder.setContentText(getString(
 | 
			
		||||
                                    R.string.one_update_available));
 | 
			
		||||
                        mBuilder.setContentText(getString(R.string.one_update_available));
 | 
			
		||||
                    }
 | 
			
		||||
                    TaskStackBuilder stackBuilder = TaskStackBuilder.create(this)
 | 
			
		||||
                            .addParentStack(FDroid.class)
 | 
			
		||||
                    TaskStackBuilder stackBuilder = TaskStackBuilder
 | 
			
		||||
                            .create(this).addParentStack(FDroid.class)
 | 
			
		||||
                            .addNextIntent(notifyIntent);
 | 
			
		||||
                    PendingIntent pendingIntent =
 | 
			
		||||
                            stackBuilder.getPendingIntent(0,
 | 
			
		||||
                                PendingIntent.FLAG_UPDATE_CURRENT
 | 
			
		||||
                            );
 | 
			
		||||
                    PendingIntent pendingIntent = stackBuilder
 | 
			
		||||
                            .getPendingIntent(0,
 | 
			
		||||
                                    PendingIntent.FLAG_UPDATE_CURRENT);
 | 
			
		||||
                    mBuilder.setContentIntent(pendingIntent);
 | 
			
		||||
                    NotificationManager mNotificationManager =
 | 
			
		||||
                        (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
 | 
			
		||||
                    NotificationManager mNotificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
 | 
			
		||||
                    mNotificationManager.notify(1, mBuilder.build());
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
@ -296,7 +304,7 @@ public class UpdateService extends IntentService implements ProgressListener {
 | 
			
		||||
                sendStatus(STATUS_COMPLETE);
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            if(success) {
 | 
			
		||||
            if (success) {
 | 
			
		||||
                Editor e = prefs.edit();
 | 
			
		||||
                e.putLong("lastUpdateCheck", System.currentTimeMillis());
 | 
			
		||||
                e.commit();
 | 
			
		||||
@ -318,6 +326,8 @@ public class UpdateService extends IntentService implements ProgressListener {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private void getIcon(DB.App app, List<DB.Repo> repos) {
 | 
			
		||||
        InputStream input = null;
 | 
			
		||||
        OutputStream output = null;
 | 
			
		||||
        try {
 | 
			
		||||
 | 
			
		||||
            File f = new File(DB.getIconsPath(this), app.icon);
 | 
			
		||||
@ -332,42 +342,63 @@ public class UpdateService extends IntentService implements ProgressListener {
 | 
			
		||||
                    server = repo.address;
 | 
			
		||||
            if (server == null)
 | 
			
		||||
                return;
 | 
			
		||||
            URL u = new URL(server + "/icons/" + app.icon);
 | 
			
		||||
            HttpURLConnection uc = (HttpURLConnection) u.openConnection();
 | 
			
		||||
            if (uc.getResponseCode() == 200) {
 | 
			
		||||
                InputStream input = null;
 | 
			
		||||
                OutputStream output = null;
 | 
			
		||||
                try {
 | 
			
		||||
 | 
			
		||||
            // TODO: Remove this later
 | 
			
		||||
            // If we can find the icon in the old .fdroid directory, use that
 | 
			
		||||
            // instead of re-downloading it.
 | 
			
		||||
            File oldfile = new File(Environment.getExternalStorageDirectory(),
 | 
			
		||||
                    ".fdroid/icons/" + app.icon);
 | 
			
		||||
            if (oldfile.exists()) {
 | 
			
		||||
                // Try and move it - should succeed if it's on the same
 | 
			
		||||
                // filesystem.
 | 
			
		||||
                if(oldfile.renameTo(f))
 | 
			
		||||
                    return;
 | 
			
		||||
                // Otherwise we'll have to copy...
 | 
			
		||||
                input = new FileInputStream(oldfile);
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            // Get it from the server...
 | 
			
		||||
            if (input == null) {
 | 
			
		||||
                URL u = new URL(server + "/icons/" + app.icon);
 | 
			
		||||
                HttpURLConnection uc = (HttpURLConnection) u.openConnection();
 | 
			
		||||
                if (uc.getResponseCode() == 200) {
 | 
			
		||||
                    input = uc.getInputStream();
 | 
			
		||||
                    output = new FileOutputStream(f);
 | 
			
		||||
                    Utils.copy(input, output);
 | 
			
		||||
                } finally {
 | 
			
		||||
                    Utils.closeQuietly(output);
 | 
			
		||||
                    Utils.closeQuietly(input);
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
        } catch (Exception e) {
 | 
			
		||||
 | 
			
		||||
            // Whereever we got the input stream from, copy it...
 | 
			
		||||
            if (input != null) {
 | 
			
		||||
                output = new FileOutputStream(f);
 | 
			
		||||
                Utils.copy(input, output);
 | 
			
		||||
            }
 | 
			
		||||
        } catch (Exception e) {
 | 
			
		||||
        } finally {
 | 
			
		||||
            Utils.closeQuietly(output);
 | 
			
		||||
            Utils.closeQuietly(input);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Received progress event from the RepoXMLHandler.
 | 
			
		||||
     * It could be progress downloading from the repo, or perhaps processing the info from the repo.
 | 
			
		||||
     * Received progress event from the RepoXMLHandler. It could be progress
 | 
			
		||||
     * downloading from the repo, or perhaps processing the info from the repo.
 | 
			
		||||
     */
 | 
			
		||||
    @Override
 | 
			
		||||
    public void onProgress(ProgressListener.Event event) {
 | 
			
		||||
 | 
			
		||||
        String message = "";
 | 
			
		||||
        if (event.type == RepoXMLHandler.PROGRESS_TYPE_DOWNLOAD) {
 | 
			
		||||
            String repoAddress    = event.data.getString(RepoXMLHandler.PROGRESS_DATA_REPO);
 | 
			
		||||
            String downloadedSize = Utils.getFriendlySize( event.progress );
 | 
			
		||||
            String totalSize      = Utils.getFriendlySize( event.total );
 | 
			
		||||
            int percent           = (int)((double)event.progress/event.total * 100);
 | 
			
		||||
            message = getString(R.string.status_download, repoAddress, downloadedSize, totalSize, percent);
 | 
			
		||||
            String repoAddress = event.data
 | 
			
		||||
                    .getString(RepoXMLHandler.PROGRESS_DATA_REPO);
 | 
			
		||||
            String downloadedSize = Utils.getFriendlySize(event.progress);
 | 
			
		||||
            String totalSize = Utils.getFriendlySize(event.total);
 | 
			
		||||
            int percent = (int) ((double) event.progress / event.total * 100);
 | 
			
		||||
            message = getString(R.string.status_download, repoAddress,
 | 
			
		||||
                    downloadedSize, totalSize, percent);
 | 
			
		||||
        } else if (event.type == RepoXMLHandler.PROGRESS_TYPE_PROCESS_XML) {
 | 
			
		||||
            String repoAddress    = event.data.getString(RepoXMLHandler.PROGRESS_DATA_REPO);
 | 
			
		||||
            message = getString(R.string.status_processing_xml, repoAddress, event.progress, event.total);
 | 
			
		||||
            String repoAddress = event.data
 | 
			
		||||
                    .getString(RepoXMLHandler.PROGRESS_DATA_REPO);
 | 
			
		||||
            message = getString(R.string.status_processing_xml, repoAddress,
 | 
			
		||||
                    event.progress, event.total);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        sendStatus(STATUS_INFO, message);
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user