1717import android .support .v7 .widget .LinearLayoutManager ;
1818import android .support .v7 .widget .PopupMenu ;
1919import android .support .v7 .widget .RecyclerView ;
20- import android .util .Log ;
2120import android .view .LayoutInflater ;
2221import android .view .MenuItem ;
2322import android .view .View ;
@@ -46,10 +45,20 @@ public class RemotesFragment extends Fragment implements RemotesRecyclerViewAdap
4645 private Rclone rclone ;
4746 private RemotesRecyclerViewAdapter recyclerViewAdapter ;
4847 private List <RemoteItem > remotes ;
49- private OnRemoteClickListener clickListener ;
48+ private OnRemoteClickListener remoteClickListener ;
49+ private AddRemoteToNavDrawer pinToDrawerListener ;
5050 private Context context ;
5151 private boolean isDarkTheme ;
5252
53+ public interface OnRemoteClickListener {
54+ void onRemoteClick (RemoteItem remote );
55+ }
56+
57+ public interface AddRemoteToNavDrawer {
58+ void addRemoteToNavDrawer (RemoteItem remoteItem );
59+ void removeRemoteFromNavDrawer (RemoteItem remoteItem );
60+ }
61+
5362 /**
5463 * Mandatory empty constructor for the fragment manager to instantiate the
5564 * fragment (e.g. upon screen orientation changes).
@@ -109,7 +118,7 @@ public void onClick(View v) {
109118 RecyclerView recyclerView = view .findViewById (R .id .remotes_list );
110119 recyclerView .setItemAnimator (new LandingAnimator ());
111120 recyclerView .setLayoutManager (new LinearLayoutManager (context ));
112- recyclerViewAdapter = new RemotesRecyclerViewAdapter (remotes , clickListener , this );
121+ recyclerViewAdapter = new RemotesRecyclerViewAdapter (remotes , remoteClickListener , this );
113122 recyclerView .setAdapter (recyclerViewAdapter );
114123
115124 SpeedDialView speedDialView = view .findViewById (R .id .fab );
@@ -139,7 +148,7 @@ public void onActivityResult(int requestCode, int resultCode, Intent data) {
139148 case CONFIG_RECREATE_REQ_CODE :
140149 remotes = rclone .getRemotes ();
141150 Collections .sort (remotes );
142- recyclerViewAdapter = new RemotesRecyclerViewAdapter (remotes , clickListener , this );
151+ recyclerViewAdapter = new RemotesRecyclerViewAdapter (remotes , remoteClickListener , this );
143152 refreshFragment ();
144153 if (remotes .size () == 1 ) {
145154 AppShortcutsHelper .populateAppShortcuts (context , remotes );
@@ -164,17 +173,23 @@ public void onAttach(Context context) {
164173 super .onAttach (context );
165174 this .context = context ;
166175 if (context instanceof OnRemoteClickListener ) {
167- clickListener = (OnRemoteClickListener ) context ;
176+ remoteClickListener = (OnRemoteClickListener ) context ;
168177 } else {
169178 throw new RuntimeException (context .toString () + " must implement OnRemoteClickListener" );
170179 }
180+ if (context instanceof AddRemoteToNavDrawer ) {
181+ pinToDrawerListener = (AddRemoteToNavDrawer ) context ;
182+ } else {
183+ throw new RuntimeException (context .toString () + " must implement AddRemoteToNavDrawer" );
184+ }
171185 }
172186
173187 @ Override
174188 public void onDetach () {
175189 super .onDetach ();
176190 context = null ;
177- clickListener = null ;
191+ remoteClickListener = null ;
192+ pinToDrawerListener = null ;
178193 }
179194
180195 @ Override
@@ -199,6 +214,13 @@ public boolean onMenuItemClick(MenuItem item) {
199214 pinRemote (remoteItem );
200215 }
201216 break ;
217+ case R .id .action_favorite :
218+ if (remoteItem .isDrawerPinned ()) {
219+ unpinFromDrawer (remoteItem );
220+ } else {
221+ pinToDrawer (remoteItem );
222+ }
223+ break ;
202224 case R .id .action_add_to_home_screen :
203225 AppShortcutsHelper .addRemoteToHomeScreen (context , remoteItem );
204226 break ;
@@ -220,6 +242,13 @@ public boolean onMenuItemClick(MenuItem item) {
220242 MenuItem addToHomeScreenAction = popupMenu .getMenu ().findItem (R .id .action_add_to_home_screen );
221243 addToHomeScreenAction .setVisible (false );
222244 }
245+
246+ MenuItem favoriteAction = popupMenu .getMenu ().findItem (R .id .action_favorite );
247+ if (remoteItem .isDrawerPinned ()) {
248+ favoriteAction .setTitle (R .string .unpin_from_drawer );
249+ } else {
250+ favoriteAction .setTitle (R .string .pin_to_drawer );
251+ }
223252 }
224253
225254 private void pinRemote (RemoteItem remoteItem ) {
@@ -260,6 +289,38 @@ private void unPinRemote(RemoteItem remoteItem) {
260289 recyclerViewAdapter .moveDataItem (remotes , from , to );
261290 }
262291
292+ private void pinToDrawer (RemoteItem remoteItem ) {
293+ SharedPreferences sharedPreferences = PreferenceManager .getDefaultSharedPreferences (context );
294+ SharedPreferences .Editor editor = sharedPreferences .edit ();
295+
296+ Set <String > stringSet = sharedPreferences .getStringSet (getString (R .string .shared_preferences_drawer_pinned_remotes ), new HashSet <String >());
297+ Set <String > pinnedRemotes = new HashSet <>(stringSet ); // bug in android means that we have to create a copy
298+ pinnedRemotes .add (remoteItem .getName ());
299+ remoteItem .setDrawerPinned (true );
300+
301+ editor .putStringSet (getString (R .string .shared_preferences_drawer_pinned_remotes ), pinnedRemotes );
302+ editor .apply ();
303+
304+ pinToDrawerListener .addRemoteToNavDrawer (remoteItem );
305+ }
306+
307+ private void unpinFromDrawer (RemoteItem remoteItem ) {
308+ SharedPreferences sharedPreferences = PreferenceManager .getDefaultSharedPreferences (context );
309+ SharedPreferences .Editor editor = sharedPreferences .edit ();
310+
311+ Set <String > stringSet = sharedPreferences .getStringSet (getString (R .string .shared_preferences_drawer_pinned_remotes ), new HashSet <String >());
312+ Set <String > pinnedRemotes = new HashSet <>(stringSet );
313+ if (pinnedRemotes .contains (remoteItem .getName ())) {
314+ pinnedRemotes .remove (remoteItem .getName ());
315+ }
316+ remoteItem .setDrawerPinned (false );
317+
318+ editor .putStringSet (getString (R .string .shared_preferences_drawer_pinned_remotes ), pinnedRemotes );
319+ editor .apply ();
320+
321+ pinToDrawerListener .removeRemoteFromNavDrawer (remoteItem );
322+ }
323+
263324 private void deleteRemote (final RemoteItem remoteItem ) {
264325 AlertDialog .Builder builder ;
265326 if (isDarkTheme ) {
@@ -279,10 +340,6 @@ public void onClick(DialogInterface dialog, int which) {
279340 builder .show ();
280341 }
281342
282- public interface OnRemoteClickListener {
283- void onRemoteClick (RemoteItem remote );
284- }
285-
286343 @ SuppressLint ("StaticFieldLeak" )
287344 private class DeleteRemote extends AsyncTask <Void , Void , Void > {
288345
@@ -313,6 +370,13 @@ protected void onPostExecute(Void aVoid) {
313370
314371 AppShortcutsHelper .removeAppShortcut (context , remoteItem .getName ());
315372
373+ Set <String > drawerPinnedRemote = sharedPreferences .getStringSet (getString (R .string .shared_preferences_drawer_pinned_remotes ), new HashSet <String >());
374+ if (drawerPinnedRemote .contains (remoteItem .getName ())) {
375+ drawerPinnedRemote .remove (remoteItem .getName ());
376+ editor .putStringSet (getString (R .string .shared_preferences_drawer_pinned_remotes ), new HashSet <String >(pinnedRemotes ));
377+ editor .apply ();
378+ }
379+
316380 recyclerViewAdapter .removeItem (remoteItem );
317381
318382 if (rclone .getRemotes ().isEmpty ()) {
0 commit comments