From 331950f89f9e2d3228587ac5d52d907e8e6245fc Mon Sep 17 00:00:00 2001 From: Eric Kok Date: Mon, 17 Jun 2013 13:02:39 +0200 Subject: [PATCH] Making the contextual action bars work and allow setting of file priorities. --- core/res/drawable-hdpi/ic_priority_high.png | Bin 1194 -> 0 bytes core/res/drawable-hdpi/ic_priority_low.png | Bin 848 -> 0 bytes core/res/drawable-hdpi/ic_priority_normal.png | Bin 1206 -> 0 bytes core/res/drawable-hdpi/ic_priority_off.png | Bin 1118 -> 0 bytes .../selectable_background_transdroid2.xml | 29 ++----- core/res/layout/list_item_torrent.xml | 6 +- core/res/layout/list_item_torrentfile.xml | 31 ++----- core/res/menu/fragment_details_file.xml | 6 +- core/res/values/strings.xml | 9 ++ .../app/settings/SettingsPersistence.java | 5 ++ .../transdroid/core/gui/DetailsActivity.java | 20 ++++- .../transdroid/core/gui/DetailsFragment.java | 74 +++++++++++++++++ .../core/gui/TorrentTasksExecutor.java | 3 + .../transdroid/core/gui/TorrentsActivity.java | 24 ++++-- .../transdroid/core/gui/TorrentsFragment.java | 20 ++++- .../gui/lists/TorrentFilePriorityLayout.java | 77 ++++++++++++++++++ .../core/gui/lists/TorrentFileView.java | 26 +----- .../core/gui/navigation/NavigationHelper.java | 10 +-- .../gui/settings/SystemSettingsActivity.java | 14 ++-- 19 files changed, 250 insertions(+), 104 deletions(-) delete mode 100644 core/res/drawable-hdpi/ic_priority_high.png delete mode 100644 core/res/drawable-hdpi/ic_priority_low.png delete mode 100644 core/res/drawable-hdpi/ic_priority_normal.png delete mode 100644 core/res/drawable-hdpi/ic_priority_off.png create mode 100644 core/src/org/transdroid/core/gui/lists/TorrentFilePriorityLayout.java diff --git a/core/res/drawable-hdpi/ic_priority_high.png b/core/res/drawable-hdpi/ic_priority_high.png deleted file mode 100644 index 43dd253bdeda94a1b5cbad49239b4591a03816e3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1194 zcmV;b1XcTqP)c5e|e! zygOM$9-$!2{F*bsGl)3iEk^>8=IhmqtP>LxfsKugA512bkWwnm&CM@{hldwuW@a8O zE-ro#ERPWP;dE+hYJMCU83{1~EeZ)tLqkKm=jZ3%Y&Khdd3h;LPEMWykM#HV|GBrf z=K)@3gkM}-h||;4=fGbgQXFZmTGQz0sIv$s8jZTlW^-F{aj{6HQm$k&8Et84x!&L3 zw}9!VM!4N>7l}l|eRg*CM|*qw`F|5g{*dhI>I&y@N=r)x{Rj!ar4oC3dX^r-T`rd> zDJc<0M@LUdZiJm*P1GYwkfbKHwzghcES6tUg>bvwA{LAJcXxN4b#--bQQ*1}j^Bu~ zvN8d=x+0NCl`erC1ze)J3lHH`0TRiTm6bu@MI35> zCEJX2OQ3nbL+4|XfaE}9zmCV_Imoe(8@(~Y6-7~#+}_^y-`w0-IDu75kmUsAWzsaP zu|?VL+1Xh?UF`LG7aqbL4u?RZ52mK3dRZnLRUz50g(~{``sTqdMr=vn!^6WMeIE=4 ze*+#j!l??I%_iWcL2fWrVUawU8O=>TpD$*$TIXR9^#`zE^V-_lM`&aQ>|Yt-m^ZaL zRP!hl3N`UoFl!0&x(O8Z_4TvRQqW{Ooldc}we^@-!T$^I!^vqoJ3E8iWGThJN73HE zh96?GMLL~UZv>tHA`-xT{|B$Csyb!Tg@q+qH+9)*}kH&u`$Gsqy!mF8g++YpA=tR zT?Of48Yr;c^ZWg8ps#}Hc?ieapvt1KZIoxKkU(Q^A0HnlSCkM->H+pVv9wH1PJRK_ z4kMfrkp5_Hn4Os5DzauyKtmyqkB`42jd|zX^!E0?CKhP=6C<3oC-z8mJuoovO3$8# zSZeIY#>PH_%|0QPbTe3R3HwEvo}O;NP}LgYl$0hL>-?q1<4Nk-YtIAKL9m)?O#KXBAJSYKZ+2a7MUCPYO=1vT<@Q&ZC=Bq&Ge0jzOD zoSp@cEz;T9NkbRY$x|4#?7_i-udS`^1zil55=~qJev1jM>*(m1$M_Q)c!p)U<4EW$_(y;N0Oit~VznlB0RR9107*qo IM6N<$f*+ME#{d8T diff --git a/core/res/drawable-hdpi/ic_priority_low.png b/core/res/drawable-hdpi/ic_priority_low.png deleted file mode 100644 index fa8e7bfb7096ff45090d417ee242cdd5999e3189..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 848 zcmV-W1F!svP)k7RCwB) zR!eIdQ53#2j_*gT!J>jBfyU5HCEaA9-AD_?EOa4Fmi-r9`U~7g7ug$z(hxTmq#Kh} z=*plF;zq1ekVslz<70ZxaHdR4X4G8x7`PYjcfRjDuAD5(?7w9KSOHFeo4#hi0x$yn zCX4}7+SgseBYPa}Tk`q*o2#pR%^_xsPiUM~xW!^~>6ZWRiJ12}V#je@}) zx&$bBM$t{;@wm8v1!T|z*+v!ckBY;?!_sIp8lnoQCf07Z zGZeXv8j*iYg%N?Qt)@^YG_+VOC2Tl{!@)q!t75VEk}iLe0$F1fg6;0^eg^Lub~g4# zy7W`RJUWz@yXMg>O!n8*fJtJN|XJ>~&=Z<0tP z&dEk~Cdun4;MJjri4;X~YcLobKpvDs=!Z%q61k^_)SasQlIYD;hSqYqe8ls-l3?g& zwzs!eqzapminSDQWQ{U&VE#CIyp}wb zACfDQ?_*M-JFDK zT)-PKSta^q3X}@EzP`=~f}jjJj1=DoihjJxi>CJ`E4aM8+=Qs#!kAFr0!VH(7K{CW zv!TYGwHl4nPSe}l+tB|0{ujI)8jA&k!4mBMB7&v%C>I+1ZL!ne7CR+et(pO0yo!Q9 a0t^6}Z64v69v9sJ0000Z!BR+B{h!i3#@|KaW+KSe#n{+bfB|Sxw1Bn@BO@bw=jZ3HOeRwqjYh@E$;or%!-Io^ zf9>z@S0i6>ad9C|PfveD{xu@WketSg~N^z`%uvsk62rNU;jiAW^!Jw4Rd z*SAc0fDk1mCF1Dl=o!h1u<_Nva^ESCV|oc{UPnhq6v%%w8jXSw$6_(>-rkAv6Z{~h@_v4ESz+1c4JBe(Jal{FUm1#)^f!Im+z*}Mefs2eGY(zd?7{skJG z2CKI;1&AHkJPZT^t-SeX8RT?QQHZ9drg>;A=wv&cPO-hc{e;lAx3|C1^5nGL-Q8i` z=29^RLN_|p1$%mMvPCMDQVT%;zX=5LZhgMCw)Qmt6c-v55*IaS!)|A1XPC|doJwC4 zKA-PbVz;%m^;G=<`Tz+Ny}iA!SYB-=O;x!7dK25tg6a8;G$uPzLrHgfZed~JJ1WTb6)i0-0d`)3 zSrlX-u{7#z!JM&QUS9fX6FO*MvG4VI-$Qo^(MNfV4Pq97Z6kbk^abuP(4)6aOiYkl zN(epm0P~;Fo2I9yzXBTv6(If5+#u_&FpFCw+n9%5JM!}J@$nC&Jgtw||Az|{lt)FL_qWBye_L$aaQ$qOb&+OSZa9=;4E_~h04tH% U;?bhnUH||907*qoM6N<$f-v$pApigX diff --git a/core/res/drawable-hdpi/ic_priority_off.png b/core/res/drawable-hdpi/ic_priority_off.png deleted file mode 100644 index e44ea25ab7e1d2755da9b4e84b41ee893bd678c9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1118 zcmV-k1flzhP)f-3#5{t#$+uPfs`Xd+&#)gN7|IkJR zu+PrUzRqT|Pw>Ai%S;r-4}m}+K{}keR|}wm7zPIiZz7S%+d`pW!wAFSuoVDSDFR_@ zYs++5Sjd|p-c zH#aw5f>FMsqk|!U!{PYU(9nRMmo=g+USn4#-q6cZPft%2LvLG=5A zc6oUjM8j4qrim3MCMLcRH6^l95ui*zQ87O?HFXHjU*Mf$=9m+kCLL#IXRlP_xI7+DnDp}mAXfuWX_9Ee z&G`8E1|+(KbbvwI!otEk@ZN=h7?sgzjE{_r9D#0*_DE!dRRbuKl0s8&Z*Q9C`S19n zrKN>6H8s7!#G-M?3+w9Y3RA@SO8i#?kTo<(ot>T0d_K=iCX-@V%?SV>`Fy@OabKW4 zvc4ku3RNm=b1^+V{R3!9p~qNNKoJuJ0jn!a`UQ>mtQLU(N*1`6LDnz|=nF*v@UPeF zT_-vv(v|h}RBbfq;DeKdvmA~07u`9G>V0TgM%Pc z46|4)N^((P4zXgf=viJ~_Rv^2Ya)3RKp?LydwYBJK*yNPW@9L=t*sjfgk6k4`}_ML zRhOLN^-=H@0Pg@+R#tqtvA(_@>B-H^%-~2)s!?Pz88IG@J9SZ11>iK?qeqxrKk|(N zUdP(n+Hx>9K4YRWBIpTYG#U+R0Pf|Y5`f}8BzFLk>qhUf_WSz!)=0F)9GXv7Z)K-1#%Ca$;z3qv$NASG&J-Lrl-8>p%x{f&LDUjDUBqh>QuQnFi kt6p0&bT-^wTmA_!0Qk+80bDP1`~Uy|07*qoM6N<$f-8Rf$^ZZW diff --git a/core/res/drawable/selectable_background_transdroid2.xml b/core/res/drawable/selectable_background_transdroid2.xml index 5aab0bfc..268cdcd4 100644 --- a/core/res/drawable/selectable_background_transdroid2.xml +++ b/core/res/drawable/selectable_background_transdroid2.xml @@ -1,26 +1,11 @@ - - - - - - - \ No newline at end of file diff --git a/core/res/layout/list_item_torrent.xml b/core/res/layout/list_item_torrent.xml index 0b9c8a30..3f3e0a0a 100644 --- a/core/res/layout/list_item_torrent.xml +++ b/core/res/layout/list_item_torrent.xml @@ -4,7 +4,8 @@ android:layout_width="fill_parent" android:layout_height="wrap_content" android:orientation="vertical" - android:paddingRight="@dimen/margin_default" > + android:paddingRight="@dimen/margin_default" + android:background="?attr/selectable_background_transdroid" > + android:contentDescription="@string/status_priority_normal" /> - + android:paddingLeft="@dimen/margin_default" + android:paddingRight="@dimen/margin_default" + android:background="?attr/selectable_background_transdroid"> - - - - - - + + diff --git a/core/res/menu/fragment_details_file.xml b/core/res/menu/fragment_details_file.xml index aaad63d9..64116eb7 100644 --- a/core/res/menu/fragment_details_file.xml +++ b/core/res/menu/fragment_details_file.xml @@ -1,7 +1,7 @@ - Uploading Active Inactive + + %1$d torrent selected + %1$d torrents selected + + + %1$d files selected + %1$d files selected + STATUS: %1$s Waiting to check… @@ -100,6 +108,7 @@ Trackers updated Label set to \'%1$s\' Torrent moved to \'%1$s\' + File priorities updated Torrent search Search for torrents diff --git a/core/src/org/transdroid/core/app/settings/SettingsPersistence.java b/core/src/org/transdroid/core/app/settings/SettingsPersistence.java index e1bc3533..f860cf09 100644 --- a/core/src/org/transdroid/core/app/settings/SettingsPersistence.java +++ b/core/src/org/transdroid/core/app/settings/SettingsPersistence.java @@ -18,6 +18,11 @@ import android.content.SharedPreferences; import android.content.SharedPreferences.Editor; import android.os.Environment; +/** + * Singleton class that can persist user settings (servers, RSS feeds, etc.) to and from a plain text JSON file. + * + * @author Eric Kok + */ @EBean(scope = Scope.Singleton) public class SettingsPersistence { diff --git a/core/src/org/transdroid/core/gui/DetailsActivity.java b/core/src/org/transdroid/core/gui/DetailsActivity.java index 9f9eaade..1803ce63 100644 --- a/core/src/org/transdroid/core/gui/DetailsActivity.java +++ b/core/src/org/transdroid/core/gui/DetailsActivity.java @@ -14,14 +14,13 @@ import org.androidannotations.annotations.OptionsItem; import org.androidannotations.annotations.OptionsMenu; import org.androidannotations.annotations.UiThread; import org.transdroid.core.R; -import org.transdroid.core.app.settings.ApplicationSettings; -import org.transdroid.core.app.settings.ServerSetting; import org.transdroid.core.app.settings.*; import org.transdroid.core.gui.lists.LocalTorrent; import org.transdroid.core.gui.log.Log; import org.transdroid.core.gui.navigation.NavigationHelper; import org.transdroid.daemon.Daemon; import org.transdroid.daemon.IDaemonAdapter; +import org.transdroid.daemon.Priority; import org.transdroid.daemon.Torrent; import org.transdroid.daemon.TorrentDetails; import org.transdroid.daemon.TorrentFile; @@ -38,6 +37,7 @@ import org.transdroid.daemon.task.ResumeTask; import org.transdroid.daemon.task.RetrieveTask; import org.transdroid.daemon.task.RetrieveTaskSuccessResult; import org.transdroid.daemon.task.SetDownloadLocationTask; +import org.transdroid.daemon.task.SetFilePriorityTask; import org.transdroid.daemon.task.SetLabelTask; import org.transdroid.daemon.task.SetTrackersTask; import org.transdroid.daemon.task.StartTask; @@ -247,12 +247,24 @@ public class DetailsActivity extends SherlockFragmentActivity implements Torrent } } + @Background + @Override + public void updatePriority(Torrent torrent, List files, Priority priority) { + DaemonTaskResult result = SetFilePriorityTask.create(currentConnection, torrent, priority, + new ArrayList(files)).execute(); + if (result instanceof DaemonTaskResult) { + onTaskSucceeded((DaemonTaskSuccessResult) result, getString(R.string.result_priotitiesset)); + } else { + onCommunicationError((DaemonTaskFailureResult) result); + } + } + @UiThread protected void onTaskSucceeded(DaemonTaskSuccessResult result, String successMessage) { // Refresh the screen as well refreshTorrent(); refreshTorrentDetails(torrent); - Crouton.showText(this, successMessage, navigationHelper.CROUTON_INFO_STYLE); + Crouton.showText(this, successMessage, NavigationHelper.CROUTON_INFO_STYLE); } @UiThread @@ -272,7 +284,7 @@ public class DetailsActivity extends SherlockFragmentActivity implements Torrent Log.i(this, result.getException().toString()); fragmentDetails.updateIsLoading(false); Crouton.showText(this, getString(LocalTorrent.getResourceForDaemonException(result.getException())), - navigationHelper.CROUTON_ERROR_STYLE); + NavigationHelper.CROUTON_ERROR_STYLE); } @UiThread diff --git a/core/src/org/transdroid/core/gui/DetailsFragment.java b/core/src/org/transdroid/core/gui/DetailsFragment.java index e1078190..859ecddd 100644 --- a/core/src/org/transdroid/core/gui/DetailsFragment.java +++ b/core/src/org/transdroid/core/gui/DetailsFragment.java @@ -13,7 +13,9 @@ import org.androidannotations.annotations.ViewById; import org.transdroid.core.R; import org.transdroid.core.gui.lists.DetailsAdapter; import org.transdroid.core.gui.lists.SimpleListItemAdapter; +import org.transdroid.core.gui.navigation.NavigationHelper; import org.transdroid.daemon.Daemon; +import org.transdroid.daemon.Priority; import org.transdroid.daemon.Torrent; import org.transdroid.daemon.TorrentDetails; import org.transdroid.daemon.TorrentFile; @@ -23,8 +25,13 @@ import android.widget.ProgressBar; import android.widget.TextView; import com.actionbarsherlock.app.SherlockFragment; +import com.actionbarsherlock.view.ActionMode; import com.actionbarsherlock.view.Menu; +import com.actionbarsherlock.view.MenuItem; import com.actionbarsherlock.view.SherlockListView; +import com.actionbarsherlock.view.SherlockListView.MultiChoiceModeListenerCompat; + +import de.keyboardsurfer.android.widget.crouton.Crouton; /** * Fragment that shows detailed statistics about some torrent. These come from some already fetched {@link Torrent} @@ -57,7 +64,10 @@ public class DetailsFragment extends SherlockFragment { @AfterViews protected void init() { + // Set up details adapter (itself containing the actual lists to show), which allows multi-select and fast + // scrolling detailsList.setAdapter(new DetailsAdapter(getActivity())); + detailsList.setMultiChoiceModeListener(onDetailsSelected); detailsList.setFastScrollEnabled(true); if (torrent != null) updateTorrent(torrent); @@ -233,6 +243,70 @@ public class DetailsFragment extends SherlockFragment { // TODO: Show trackers edit dialog } + private MultiChoiceModeListenerCompat onDetailsSelected = new MultiChoiceModeListenerCompat() { + + @Override + public boolean onCreateActionMode(ActionMode mode, Menu menu) { + // Show contextual action bar to start/stop/remove/etc. torrents in batch mode + mode.getMenuInflater().inflate(R.menu.fragment_details_file, menu); + return true; + } + + @Override + public boolean onActionItemClicked(ActionMode mode, MenuItem item) { + + // Get checked torrents + List checked = new ArrayList(); + for (int i = 0; i < detailsList.getCheckedItemPositions().size(); i++) { + if (detailsList.getCheckedItemPositions().valueAt(i) + && detailsList.getAdapter().getItem(detailsList.getCheckedItemPositions().keyAt(i)) instanceof TorrentFile) + checked.add((TorrentFile) detailsList.getAdapter().getItem( + detailsList.getCheckedItemPositions().keyAt(i))); + } + + int itemId = item.getItemId(); + if (itemId == R.id.action_download) { + // TODO: Start FTP download command for the selected torrents + Crouton.showText(getActivity(), "TODO: Start FTP download command for the selected torrents", + NavigationHelper.CROUTON_INFO_STYLE); + //for (TorrentFile file : checked) { + //} + mode.finish(); + return true; + } else { + Priority priority = Priority.Normal; + if (itemId == R.id.action_priority_low) + priority = Priority.Low; + getTasksExecutor().updatePriority(torrent, checked, priority); + mode.finish(); + return true; + } + } + + @Override + public void onItemCheckedStateChanged(ActionMode mode, int position, long id, boolean checked) { + // Show the number of selected files in the CAB + // torrentsList.getCheckedItemPositions().size() ? + int checkedCount = 0; + for (int i = 0; i < detailsList.getCheckedItemPositions().size(); i++) { + if (detailsList.getCheckedItemPositions().valueAt(i) + && detailsList.getAdapter().getItem(detailsList.getCheckedItemPositions().keyAt(i)) instanceof TorrentFile) + checkedCount++; + } + mode.setTitle(getResources().getQuantityString(R.plurals.navigation_filesselected, checkedCount, checkedCount)); + } + + @Override + public boolean onPrepareActionMode(ActionMode mode, Menu menu) { + return false; + } + + @Override + public void onDestroyActionMode(ActionMode mode) { + } + + }; + /** * Returns the object responsible for executing torrent tasks against a connected server * @return The executor for tasks on some torrent diff --git a/core/src/org/transdroid/core/gui/TorrentTasksExecutor.java b/core/src/org/transdroid/core/gui/TorrentTasksExecutor.java index d416d902..420d7e10 100644 --- a/core/src/org/transdroid/core/gui/TorrentTasksExecutor.java +++ b/core/src/org/transdroid/core/gui/TorrentTasksExecutor.java @@ -2,7 +2,9 @@ package org.transdroid.core.gui; import java.util.List; +import org.transdroid.daemon.Priority; import org.transdroid.daemon.Torrent; +import org.transdroid.daemon.TorrentFile; public interface TorrentTasksExecutor { void resumeTorrent(Torrent torrent); @@ -15,4 +17,5 @@ public interface TorrentTasksExecutor { void updateLocation(Torrent torrent, String newLocation); void refreshTorrentDetails(Torrent torrent); void refreshTorrentFiles(Torrent torrent); + void updatePriority(Torrent torrent, List files, Priority priority); } \ No newline at end of file diff --git a/core/src/org/transdroid/core/gui/TorrentsActivity.java b/core/src/org/transdroid/core/gui/TorrentsActivity.java index 44ebe7b1..7eb21292 100644 --- a/core/src/org/transdroid/core/gui/TorrentsActivity.java +++ b/core/src/org/transdroid/core/gui/TorrentsActivity.java @@ -31,6 +31,7 @@ import org.transdroid.core.gui.search.UrlEntryDialog; import org.transdroid.core.gui.settings.*; import org.transdroid.daemon.Daemon; import org.transdroid.daemon.IDaemonAdapter; +import org.transdroid.daemon.Priority; import org.transdroid.daemon.Torrent; import org.transdroid.daemon.TorrentDetails; import org.transdroid.daemon.TorrentFile; @@ -54,6 +55,7 @@ import org.transdroid.daemon.task.RetrieveTask; import org.transdroid.daemon.task.RetrieveTaskSuccessResult; import org.transdroid.daemon.task.SetAlternativeModeTask; import org.transdroid.daemon.task.SetDownloadLocationTask; +import org.transdroid.daemon.task.SetFilePriorityTask; import org.transdroid.daemon.task.SetLabelTask; import org.transdroid.daemon.task.SetTrackersTask; import org.transdroid.daemon.task.StartTask; @@ -631,16 +633,16 @@ public class TorrentsActivity extends SherlockFragmentActivity implements OnNavi } } catch (SecurityException e) { // No longer access to this file - Crouton.showText(this, R.string.error_torrentfile, navigationHelper.CROUTON_ERROR_STYLE); + Crouton.showText(this, R.string.error_torrentfile, NavigationHelper.CROUTON_ERROR_STYLE); } catch (IOException e1) { // Can't write temporary file - Crouton.showText(this, R.string.error_torrentfile, navigationHelper.CROUTON_ERROR_STYLE); + Crouton.showText(this, R.string.error_torrentfile, NavigationHelper.CROUTON_ERROR_STYLE); } finally { try { if (input != null) input.close(); } catch (IOException e) { - Crouton.showText(this, R.string.error_torrentfile, navigationHelper.CROUTON_ERROR_STYLE); + Crouton.showText(this, R.string.error_torrentfile, NavigationHelper.CROUTON_ERROR_STYLE); } } } @@ -739,18 +741,30 @@ public class TorrentsActivity extends SherlockFragmentActivity implements OnNavi } } + @Background + @Override + public void updatePriority(Torrent torrent, List files, Priority priority) { + DaemonTaskResult result = SetFilePriorityTask.create(currentConnection, torrent, priority, + new ArrayList(files)).execute(); + if (result instanceof DaemonTaskResult) { + onTaskSucceeded((DaemonTaskSuccessResult) result, getString(R.string.result_priotitiesset)); + } else { + onCommunicationError((DaemonTaskFailureResult) result, false); + } + } + @UiThread protected void onTaskSucceeded(DaemonTaskSuccessResult result, String successMessage) { // Refresh the screen as well refreshScreen(); - Crouton.showText(this, successMessage, navigationHelper.CROUTON_INFO_STYLE); + Crouton.showText(this, successMessage, NavigationHelper.CROUTON_INFO_STYLE); } @UiThread protected void onCommunicationError(DaemonTaskFailureResult result, boolean isCritical) { Log.i(this, result.getException().toString()); String error = getString(LocalTorrent.getResourceForDaemonException(result.getException())); - Crouton.showText(this, error, navigationHelper.CROUTON_ERROR_STYLE); + Crouton.showText(this, error, NavigationHelper.CROUTON_ERROR_STYLE); fragmentTorrents.updateIsLoading(false); if (isCritical) fragmentTorrents.updateError(error); diff --git a/core/src/org/transdroid/core/gui/TorrentsFragment.java b/core/src/org/transdroid/core/gui/TorrentsFragment.java index 6131bacb..9857d2d6 100644 --- a/core/src/org/transdroid/core/gui/TorrentsFragment.java +++ b/core/src/org/transdroid/core/gui/TorrentsFragment.java @@ -70,13 +70,18 @@ public class TorrentsFragment extends SherlockFragment { @AfterViews protected void init() { + + // Load the requested sort order from the user settings this.currentSortOrder = applicationSettings.getLastUsedSortOrder(); this.currentSortDescending = applicationSettings.getLastUsedSortDescending(); + + // Set up the list adapter, which allows multi-select and fast scrolling torrentsList.setAdapter(TorrentsAdapter_.getInstance_(getActivity())); torrentsList.setMultiChoiceModeListener(onTorrentsSelected); torrentsList.setFastScrollEnabled(true); if (torrents != null) updateTorrents(torrents); + } /** @@ -183,8 +188,9 @@ public class TorrentsFragment extends SherlockFragment { // Get checked torrents List checked = new ArrayList(); for (int i = 0; i < torrentsList.getCheckedItemPositions().size(); i++) { - if (torrentsList.getCheckedItemPositions().get(i)) - checked.add((Torrent) torrentsList.getAdapter().getItem(i)); + if (torrentsList.getCheckedItemPositions().valueAt(i)) + checked.add((Torrent) torrentsList.getAdapter().getItem( + torrentsList.getCheckedItemPositions().keyAt(i))); } int itemId = item.getItemId(); @@ -223,7 +229,15 @@ public class TorrentsFragment extends SherlockFragment { @Override public void onItemCheckedStateChanged(ActionMode mode, int position, long id, boolean checked) { - // TODO: Update title or otherwise show number of selected torrents? + // Show the number of selected torrents in the CAB + // torrentsList.getCheckedItemPositions().size() ? + int checkedCount = 0; + for (int i = 0; i < torrentsList.getCheckedItemPositions().size(); i++) { + if (torrentsList.getCheckedItemPositions().valueAt(i)) + checkedCount++; + } + mode.setTitle(getResources().getQuantityString(R.plurals.navigation_torrentsselected, checkedCount, + checkedCount)); } @Override diff --git a/core/src/org/transdroid/core/gui/lists/TorrentFilePriorityLayout.java b/core/src/org/transdroid/core/gui/lists/TorrentFilePriorityLayout.java new file mode 100644 index 00000000..a7880a2b --- /dev/null +++ b/core/src/org/transdroid/core/gui/lists/TorrentFilePriorityLayout.java @@ -0,0 +1,77 @@ +package org.transdroid.core.gui.lists; + +import org.transdroid.daemon.Priority; + +import android.content.Context; +import android.graphics.Canvas; +import android.graphics.Paint; +import android.graphics.RectF; +import android.util.AttributeSet; +import fr.marvinlabs.widget.CheckableRelativeLayout; + +public class TorrentFilePriorityLayout extends CheckableRelativeLayout { + + private final float scale = getContext().getResources().getDisplayMetrics().density; + private final int WIDTH = (int) (5 * scale + 0.5f); + + private Priority priority = null; + private final Paint offPaint = new Paint(); + private final Paint lowPaint = new Paint(); + private final Paint highPaint = new Paint(); + private final Paint normalPaint = new Paint(); + private final RectF fullRect = new RectF(); + + public TorrentFilePriorityLayout(Context context) { + super(context); + initPaints(); + setWillNotDraw(false); + } + + public TorrentFilePriorityLayout(Context context, AttributeSet attrs) { + super(context, attrs); + initPaints(); + setWillNotDraw(false); + } + + private void initPaints() { + offPaint.setColor(0xFF9E9E9E); // Grey + lowPaint.setColor(0x778ACC12); // Very Light green + normalPaint.setColor(0xBB8ACC12); // Light green + highPaint.setColor(0xFF8ACC12); // Green + } + + public void setPriority(Priority priority) { + this.priority = priority; + this.invalidate(); + } + + @Override + protected void onDraw(Canvas canvas) { + super.onDraw(canvas); + + int height = getHeight(); + int width = WIDTH; + fullRect.set(0, 0, width, height); + + if (priority == null) { + return; + } + + switch (priority) { + case Low: + canvas.drawRect(fullRect, lowPaint); + break; + case Normal: + canvas.drawRect(fullRect, normalPaint); + break; + case High: + canvas.drawRect(fullRect, highPaint); + break; + default: // Off + canvas.drawRect(fullRect, offPaint); + break; + } + + } + +} diff --git a/core/src/org/transdroid/core/gui/lists/TorrentFileView.java b/core/src/org/transdroid/core/gui/lists/TorrentFileView.java index d4eab7ff..f7926c62 100644 --- a/core/src/org/transdroid/core/gui/lists/TorrentFileView.java +++ b/core/src/org/transdroid/core/gui/lists/TorrentFileView.java @@ -2,25 +2,20 @@ package org.transdroid.core.gui.lists; import org.androidannotations.annotations.EViewGroup; import org.androidannotations.annotations.ViewById; -import org.transdroid.core.R; import org.transdroid.daemon.TorrentFile; import android.content.Context; -import android.widget.ImageView; import android.widget.TextView; -import fr.marvinlabs.widget.CheckableRelativeLayout; /** * View that represents some {@link TorrentFile} object and show the file's name, status and priority * @author Eric Kok */ @EViewGroup(resName="list_item_torrentfile") -public class TorrentFileView extends CheckableRelativeLayout { +public class TorrentFileView extends TorrentFilePriorityLayout { @ViewById protected TextView nameText, progressText, sizesText; - @ViewById - protected ImageView priorityImage; public TorrentFileView(Context context) { super(context, null); @@ -30,24 +25,7 @@ public class TorrentFileView extends CheckableRelativeLayout { nameText.setText(torrentFile.getName()); sizesText.setText(torrentFile.getDownloadedAndTotalSizeText()); progressText.setText(torrentFile.getProgressText()); - switch (torrentFile.getPriority()) { - case Off: - priorityImage.setImageResource(R.drawable.ic_priority_off); - priorityImage.setContentDescription(getResources().getString(R.string.status_priority_off)); - break; - case Low: - priorityImage.setImageResource(R.drawable.ic_priority_low); - priorityImage.setContentDescription(getResources().getString(R.string.status_priority_low)); - break; - case Normal: - priorityImage.setImageResource(R.drawable.ic_priority_normal); - priorityImage.setContentDescription(getResources().getString(R.string.status_priority_normal)); - break; - case High: - priorityImage.setImageResource(R.drawable.ic_priority_high); - priorityImage.setContentDescription(getResources().getString(R.string.status_priority_high)); - break; - } + setPriority(torrentFile.getPriority()); } } diff --git a/core/src/org/transdroid/core/gui/navigation/NavigationHelper.java b/core/src/org/transdroid/core/gui/navigation/NavigationHelper.java index 431672d8..813e5f9c 100644 --- a/core/src/org/transdroid/core/gui/navigation/NavigationHelper.java +++ b/core/src/org/transdroid/core/gui/navigation/NavigationHelper.java @@ -26,14 +26,14 @@ public class NavigationHelper { /** * Use with {@link Crouton#showText(android.app.Activity, int, Style)} (and variants) to display error messages. */ - public Style CROUTON_ERROR_STYLE = new Style.Builder().setBackgroundColor(R.color.crouton_error).setTextSize(13) - .setDuration(2500).build(); - + public static Style CROUTON_ERROR_STYLE = new Style.Builder().setBackgroundColor(R.color.crouton_error) + .setTextSize(13).setDuration(2500).build(); + /** * Use with {@link Crouton#showText(android.app.Activity, int, Style)} (and variants) to display info messages. */ - public Style CROUTON_INFO_STYLE = new Style.Builder().setBackgroundColor(R.color.crouton_info).setTextSize(13) - .setDuration(1500).build(); + public static Style CROUTON_INFO_STYLE = new Style.Builder().setBackgroundColor(R.color.crouton_info) + .setTextSize(13).setDuration(1500).build(); /** * Whether any search-related UI components should be shown in the interface. At the moment returns false only if we diff --git a/core/src/org/transdroid/core/gui/settings/SystemSettingsActivity.java b/core/src/org/transdroid/core/gui/settings/SystemSettingsActivity.java index 60adc3fa..8e6da89f 100644 --- a/core/src/org/transdroid/core/gui/settings/SystemSettingsActivity.java +++ b/core/src/org/transdroid/core/gui/settings/SystemSettingsActivity.java @@ -41,8 +41,6 @@ public class SystemSettingsActivity extends SherlockPreferenceActivity { protected static final int DIALOG_EXPORTSETTINGS = 3; protected static final String INSTALLHELP_URI = "http://www.transdroid.org/download/"; - @Bean - protected NavigationHelper navigationHelper; @Bean protected ApplicationSettings applicationSettings; @Bean @@ -160,13 +158,13 @@ public class SystemSettingsActivity extends SherlockPreferenceActivity { try { settingsPersistence.importSettings(prefs, SettingsPersistence.DEFAULT_SETTINGS_FILE); Crouton.showText(SystemSettingsActivity.this, R.string.pref_import_success, - navigationHelper.CROUTON_INFO_STYLE); + NavigationHelper.CROUTON_INFO_STYLE); } catch (FileNotFoundException e) { Crouton.showText(SystemSettingsActivity.this, R.string.error_file_not_found, - navigationHelper.CROUTON_ERROR_STYLE); + NavigationHelper.CROUTON_ERROR_STYLE); } catch (JSONException e) { Crouton.showText(SystemSettingsActivity.this, R.string.error_no_valid_settings_file, - navigationHelper.CROUTON_ERROR_STYLE); + NavigationHelper.CROUTON_ERROR_STYLE); } } }; @@ -178,13 +176,13 @@ public class SystemSettingsActivity extends SherlockPreferenceActivity { try { settingsPersistence.exportSettings(prefs, SettingsPersistence.DEFAULT_SETTINGS_FILE); Crouton.showText(SystemSettingsActivity.this, R.string.pref_export_success, - navigationHelper.CROUTON_INFO_STYLE); + NavigationHelper.CROUTON_INFO_STYLE); } catch (JSONException e) { Crouton.showText(SystemSettingsActivity.this, R.string.error_cant_write_settings_file, - navigationHelper.CROUTON_ERROR_STYLE); + NavigationHelper.CROUTON_ERROR_STYLE); } catch (IOException e) { Crouton.showText(SystemSettingsActivity.this, R.string.error_cant_write_settings_file, - navigationHelper.CROUTON_ERROR_STYLE); + NavigationHelper.CROUTON_ERROR_STYLE); } } };