/* * Zirco Browser for Android * * Copyright (C) 2010 J. Devauchelle and contributors. * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * version 3 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. */ package org.shadowsocks.zirco.model.items; import java.util.Random; import org.shadowsocks.R; import org.shadowsocks.zirco.events.EventConstants; import org.shadowsocks.zirco.events.EventController; import org.shadowsocks.zirco.ui.activities.DownloadsListActivity; import org.shadowsocks.zirco.ui.runnables.DownloadRunnable; import android.app.Notification; import android.app.NotificationManager; import android.app.PendingIntent; import android.content.Context; import android.content.Intent; /** * Represent a download item. */ public class DownloadItem { private Context mContext; private String mUrl; private String mFileName; private int mProgress; private String mErrorMessage; private DownloadRunnable mRunnable; private boolean mIsFinished; private boolean mIsAborted; private NotificationManager mNotificationManager; private Notification mNotification; private int mNotificationId; /** * Constructor. * * @param context * The current context. * @param url * The download url. */ public DownloadItem(Context context, String url) { mContext = context; mUrl = url; mFileName = mUrl.substring(mUrl.lastIndexOf("/") + 1); mProgress = 0; mRunnable = null; mErrorMessage = null; mIsFinished = false; mIsAborted = false; Random r = new Random(); mNotificationId = r.nextInt(); mNotification = null; mNotificationManager = (NotificationManager) mContext .getSystemService(Context.NOTIFICATION_SERVICE); } /** * Abort the current download. */ public void abortDownload() { if (mRunnable != null) { mRunnable.abort(); } mIsAborted = true; } /** * Create the download notification. */ private void createNotification() { mNotification = new Notification( R.drawable.download_anim, mContext.getString(R.string.DownloadNotification_DownloadStart), System.currentTimeMillis()); Intent notificationIntent = new Intent( mContext.getApplicationContext(), DownloadsListActivity.class); PendingIntent contentIntent = PendingIntent.getActivity( mContext.getApplicationContext(), 0, notificationIntent, 0); mNotification .setLatestEventInfo( mContext.getApplicationContext(), mContext.getString(R.string.DownloadNotification_DownloadInProgress), mFileName, contentIntent); mNotificationManager.notify(mNotificationId, mNotification); } /** * Gets the error message for this download. * * @return The error message. */ public String getErrorMessage() { return mErrorMessage; } /** * Gets the filename on disk. * * @return The filename on disk. */ public String getFileName() { return mFileName; } /** * Gets the download progress. * * @return The download progress. */ public int getProgress() { return mProgress; } /** * Gets the download url. * * @return The download url. */ public String getUrl() { return mUrl; } /** * Check if the download is aborted. * * @return True if the download is aborted. */ public boolean isAborted() { return mIsAborted; } /** * Check if the download is finished. * * @return True if the download is finished. */ public boolean isFinished() { return mIsFinished; } /** * Set this item is download finished state. Trigger a finished download * event. */ public void onFinished() { mProgress = 100; mRunnable = null; mIsFinished = true; updateNotificationOnEnd(); EventController.getInstance().fireDownloadEvent( EventConstants.EVT_DOWNLOAD_ON_FINISHED, this); } /** * Set the current progress. Trigger a progress download event. * * @param progress * The current progress. */ public void onProgress(int progress) { mProgress = progress; EventController.getInstance().fireDownloadEvent( EventConstants.EVT_DOWNLOAD_ON_PROGRESS, this); } /** * Trigger a start download event. */ public void onStart() { createNotification(); EventController.getInstance().fireDownloadEvent( EventConstants.EVT_DOWNLOAD_ON_START, this); } /** * Set the current error message for this download. * * @param errorMessage * The error message. */ public void setErrorMessage(String errorMessage) { mErrorMessage = errorMessage; } /** * Start the current download. */ public void startDownload() { if (mRunnable != null) { mRunnable.abort(); } mRunnable = new DownloadRunnable(this); new Thread(mRunnable).start(); } /** * Update the download notification at the end of download. */ private void updateNotificationOnEnd() { if (mNotification != null) { mNotificationManager.cancel(mNotificationId); } String message; if (mIsAborted) { message = mContext .getString(R.string.DownloadNotification_DownloadCanceled); } else { message = mContext .getString(R.string.DownloadNotification_DownloadComplete); } mNotification = new Notification( R.drawable.stat_sys_download, mContext.getString(R.string.DownloadNotification_DownloadComplete), System.currentTimeMillis()); mNotification.flags |= Notification.FLAG_AUTO_CANCEL; Intent notificationIntent = new Intent( mContext.getApplicationContext(), DownloadsListActivity.class); PendingIntent contentIntent = PendingIntent.getActivity( mContext.getApplicationContext(), 0, notificationIntent, 0); mNotification.setLatestEventInfo(mContext.getApplicationContext(), mFileName, message, contentIntent); mNotificationManager.notify(mNotificationId, mNotification); } }