diff --git a/res/layout/downloadlist_item.xml b/res/layout/downloadlist_item.xml index 42bcfb68b..f270c7725 100644 --- a/res/layout/downloadlist_item.xml +++ b/res/layout/downloadlist_item.xml @@ -1,27 +1,44 @@ + android:layout_height="match_parent" + android:orientation="vertical" > + - + android:textStyle="bold" /> + + + + + + + + android:layout_height="wrap_content" + android:layout_alignParentLeft="true" /> + + android:layout_height="wrap_content" + android:layout_alignParentRight="true" /> - - + \ No newline at end of file diff --git a/res/values/strings.xml b/res/values/strings.xml index 325cc0946..0e3a4d0cb 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -75,5 +75,7 @@ Language Move up Move down + Cancel all downloads + Download cancelled \ No newline at end of file diff --git a/src/de/podfetcher/activity/DownloadActivity.java b/src/de/podfetcher/activity/DownloadActivity.java index 967b5a3d3..33678e78c 100644 --- a/src/de/podfetcher/activity/DownloadActivity.java +++ b/src/de/podfetcher/activity/DownloadActivity.java @@ -1,6 +1,5 @@ package de.podfetcher.activity; - import de.podfetcher.R; import de.podfetcher.storage.DownloadRequester; import de.podfetcher.adapter.DownloadlistAdapter; @@ -9,62 +8,135 @@ import de.podfetcher.asynctask.DownloadStatus; import de.podfetcher.feed.FeedMedia; import de.podfetcher.feed.FeedFile; import com.actionbarsherlock.app.SherlockListActivity; +import com.actionbarsherlock.view.ActionMode; import com.actionbarsherlock.view.Menu; import com.actionbarsherlock.view.MenuItem; import android.content.Intent; import android.os.Bundle; import android.util.Log; +import android.view.View; +import android.view.View.OnLongClickListener; +import android.widget.AdapterView; +import android.widget.AdapterView.OnItemLongClickListener; -public class DownloadActivity extends SherlockListActivity { - private static final String TAG = "DownloadActivity"; - private static final int MENU_SHOW_LOG = 0; - private DownloadlistAdapter dla; - private DownloadRequester requester; +/** Shows all running downloads in a list */ +public class DownloadActivity extends SherlockListActivity implements + ActionMode.Callback { - @Override - protected void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); + private static final String TAG = "DownloadActivity"; + private static final int MENU_SHOW_LOG = 0; + private static final int MENU_CANCEL_ALL_DOWNLOADS = 1; + private DownloadlistAdapter dla; + private DownloadRequester requester; - requester = DownloadRequester.getInstance(); - observer.execute(requester.getDownloads().toArray( - new FeedFile[requester.getDownloads().size()])); + private ActionMode mActionMode; + private DownloadStatus selectedDownload; - } - - @Override - protected void onStop() { - super.onStop(); - Log.d(TAG, "Stopping Activity"); - observer.cancel(true); - } + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); - private final DownloadObserver observer = new DownloadObserver(this) { - @Override - protected void onProgressUpdate(DownloadStatus... values) { - if (dla != null) { - dla.notifyDataSetChanged(); - } else { - dla = new DownloadlistAdapter(getContext(), 0, getStatusList()); - setListAdapter(dla); - dla.notifyDataSetChanged(); - } - } - }; - - @Override - public boolean onCreateOptionsMenu(Menu menu) { - menu.add(Menu.NONE, MENU_SHOW_LOG, Menu.NONE, R.string.show_download_log) - .setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM); + requester = DownloadRequester.getInstance(); + observer.execute(requester.getDownloads().toArray( + new FeedFile[requester.getDownloads().size()])); + + } + + @Override + protected void onStop() { + super.onStop(); + Log.d(TAG, "Stopping Activity"); + observer.cancel(true); + } + + private final DownloadObserver observer = new DownloadObserver(this) { + @Override + protected void onProgressUpdate(DownloadStatus... values) { + + dla = new DownloadlistAdapter(getContext(), 0, getStatusList()); + setListAdapter(dla); + dla.notifyDataSetChanged(); + + } + }; + + @Override + protected void onPostCreate(Bundle savedInstanceState) { + super.onPostCreate(savedInstanceState); + getListView().setOnItemLongClickListener(new OnItemLongClickListener() { + + @Override + public boolean onItemLongClick(AdapterView arg0, View view, + int position, long id) { + DownloadStatus selection = dla.getItem(position); + if (selection != null && mActionMode != null) { + mActionMode.finish(); + } + selectedDownload = selection; + mActionMode = startActionMode(DownloadActivity.this); + return true; + } + + }); + } + + @Override + public boolean onCreateOptionsMenu(Menu menu) { + menu.add(Menu.NONE, MENU_SHOW_LOG, Menu.NONE, + R.string.show_download_log).setShowAsAction( + MenuItem.SHOW_AS_ACTION_IF_ROOM); + menu.add(Menu.NONE, MENU_CANCEL_ALL_DOWNLOADS, Menu.NONE, + R.string.cancel_all_downloads_label).setShowAsAction( + MenuItem.SHOW_AS_ACTION_IF_ROOM); return true; } - + @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case MENU_SHOW_LOG: startActivity(new Intent(this, DownloadLogActivity.class)); + break; + case MENU_CANCEL_ALL_DOWNLOADS: + requester.cancelAllDownloads(this); + break; } return true; } + + @Override + public boolean onCreateActionMode(ActionMode mode, Menu menu) { + if (!selectedDownload.isDone()) { + menu.add(Menu.NONE, R.id.cancel_download_item, Menu.NONE, + R.string.cancel_download_label).setIcon( + R.drawable.navigation_cancel); + } + return true; + } + + @Override + public boolean onPrepareActionMode(ActionMode mode, Menu menu) { + return false; + } + + @Override + public boolean onActionItemClicked(ActionMode mode, MenuItem item) { + boolean handled = false; + switch (item.getItemId()) { + case R.id.cancel_download_item: + requester.cancelDownload(this, selectedDownload.getFeedFile() + .getDownloadId()); + handled = true; + break; + } + mActionMode.finish(); + return handled; + } + + @Override + public void onDestroyActionMode(ActionMode mode) { + mActionMode = null; + selectedDownload = null; + } } diff --git a/src/de/podfetcher/adapter/DownloadlistAdapter.java b/src/de/podfetcher/adapter/DownloadlistAdapter.java index 0beacc650..f1b63cb37 100644 --- a/src/de/podfetcher/adapter/DownloadlistAdapter.java +++ b/src/de/podfetcher/adapter/DownloadlistAdapter.java @@ -1,67 +1,75 @@ package de.podfetcher.adapter; -import android.widget.ArrayAdapter; -import android.widget.TextView; +import android.content.Context; +import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; -import android.view.LayoutInflater; -import android.content.Context; - +import android.widget.ArrayAdapter; +import android.widget.ProgressBar; +import android.widget.TextView; import de.podfetcher.R; -import de.podfetcher.util.Converter; -import de.podfetcher.asynctask.DownloadObserver; import de.podfetcher.asynctask.DownloadStatus; import de.podfetcher.feed.Feed; import de.podfetcher.feed.FeedFile; import de.podfetcher.feed.FeedImage; import de.podfetcher.feed.FeedMedia; +import de.podfetcher.util.Converter; public class DownloadlistAdapter extends ArrayAdapter { - public DownloadlistAdapter(Context context, - int textViewResourceId, DownloadStatus[] objects) { - super(context, textViewResourceId, objects); - } + public DownloadlistAdapter(Context context, int textViewResourceId, + DownloadStatus[] objects) { + super(context, textViewResourceId, objects); + } + @Override + public View getView(int position, View convertView, ViewGroup parent) { + Holder holder; + DownloadStatus status = getItem(position); + FeedFile feedFile = status.getFeedFile(); + // Inflate layout + if (convertView == null) { + holder = new Holder(); + LayoutInflater inflater = (LayoutInflater) getContext() + .getSystemService(Context.LAYOUT_INFLATER_SERVICE); + convertView = inflater.inflate(R.layout.downloadlist_item, null); + holder.title = (TextView) convertView.findViewById(R.id.txtvTitle); + holder.message = (TextView) convertView + .findViewById(R.id.txtvMessage); + holder.downloaded = (TextView) convertView + .findViewById(R.id.txtvDownloaded); + holder.percent = (TextView) convertView + .findViewById(R.id.txtvPercent); + holder.progbar = (ProgressBar) convertView + .findViewById(R.id.progProgress); - @Override - public View getView(int position, View convertView, ViewGroup parent) { - Holder holder; - DownloadStatus status = getItem(position); - FeedFile feedFile = status.getFeedFile(); - // Inflate layout - if (convertView == null) { - holder = new Holder(); - LayoutInflater inflater = (LayoutInflater) getContext().getSystemService( - Context.LAYOUT_INFLATER_SERVICE); - convertView = inflater.inflate(R.layout.downloadlist_item, null); - holder.title = (TextView) convertView.findViewById(R.id.txtvTitle); - holder.downloaded = (TextView) convertView.findViewById(R.id.txtvDownloaded); - holder.percent = (TextView) convertView.findViewById(R.id.txtvPercent); + convertView.setTag(holder); + } else { + holder = (Holder) convertView.getTag(); + } - convertView.setTag(holder); - } else { - holder = (Holder) convertView.getTag(); - } - - String titleText = null; - if (feedFile.getClass() == FeedMedia.class) { - titleText = ((FeedMedia) feedFile).getItem().getTitle(); - } else if (feedFile.getClass() == Feed.class) { - titleText = ((Feed) feedFile).getTitle(); - } else if (feedFile.getClass() == FeedImage.class) { - titleText = "[Image] " + ((FeedImage) feedFile).getTitle(); - } - holder.title.setText(titleText); - holder.downloaded.setText(Converter.byteToString(status.getSoFar()) + " / " - + Converter.byteToString(status.getSize())); - holder.percent.setText(status.getProgressPercent() + "%"); + String titleText = null; + if (feedFile.getClass() == FeedMedia.class) { + titleText = ((FeedMedia) feedFile).getItem().getTitle(); + } else if (feedFile.getClass() == Feed.class) { + titleText = ((Feed) feedFile).getTitle(); + } else if (feedFile.getClass() == FeedImage.class) { + titleText = "[Image] " + ((FeedImage) feedFile).getTitle(); + } + holder.title.setText(titleText); + holder.message.setText(status.getStatusMsg()); + holder.downloaded.setText(Converter.byteToString(status.getSoFar()) + + " / " + Converter.byteToString(status.getSize())); + holder.percent.setText(status.getProgressPercent() + "%"); + holder.progbar.setProgress(status.getProgressPercent()); - return convertView; - } + return convertView; + } - static class Holder { - TextView title; - TextView downloaded; - TextView percent; - } + static class Holder { + TextView title; + TextView message; + TextView downloaded; + TextView percent; + ProgressBar progbar; + } } diff --git a/src/de/podfetcher/asynctask/DownloadObserver.java b/src/de/podfetcher/asynctask/DownloadObserver.java index fe208c923..6d2fed066 100644 --- a/src/de/podfetcher/asynctask/DownloadObserver.java +++ b/src/de/podfetcher/asynctask/DownloadObserver.java @@ -11,7 +11,8 @@ import java.util.concurrent.Callable; import android.os.AsyncTask; /** Observes the status of a specific Download */ -public class DownloadObserver extends AsyncTask { +public class DownloadObserver extends + AsyncTask { private static final String TAG = "DownloadObserver"; /** Types of downloads to observe. */ @@ -25,10 +26,9 @@ public class DownloadObserver extends AsyncTask