17
17
import android .support .v7 .widget .LinearLayoutManager ;
18
18
import android .support .v7 .widget .PopupMenu ;
19
19
import android .support .v7 .widget .RecyclerView ;
20
- import android .util .Log ;
21
20
import android .view .LayoutInflater ;
22
21
import android .view .MenuItem ;
23
22
import android .view .View ;
@@ -46,10 +45,20 @@ public class RemotesFragment extends Fragment implements RemotesRecyclerViewAdap
46
45
private Rclone rclone ;
47
46
private RemotesRecyclerViewAdapter recyclerViewAdapter ;
48
47
private List <RemoteItem > remotes ;
49
- private OnRemoteClickListener clickListener ;
48
+ private OnRemoteClickListener remoteClickListener ;
49
+ private AddRemoteToNavDrawer pinToDrawerListener ;
50
50
private Context context ;
51
51
private boolean isDarkTheme ;
52
52
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
+
53
62
/**
54
63
* Mandatory empty constructor for the fragment manager to instantiate the
55
64
* fragment (e.g. upon screen orientation changes).
@@ -109,7 +118,7 @@ public void onClick(View v) {
109
118
RecyclerView recyclerView = view .findViewById (R .id .remotes_list );
110
119
recyclerView .setItemAnimator (new LandingAnimator ());
111
120
recyclerView .setLayoutManager (new LinearLayoutManager (context ));
112
- recyclerViewAdapter = new RemotesRecyclerViewAdapter (remotes , clickListener , this );
121
+ recyclerViewAdapter = new RemotesRecyclerViewAdapter (remotes , remoteClickListener , this );
113
122
recyclerView .setAdapter (recyclerViewAdapter );
114
123
115
124
SpeedDialView speedDialView = view .findViewById (R .id .fab );
@@ -139,7 +148,7 @@ public void onActivityResult(int requestCode, int resultCode, Intent data) {
139
148
case CONFIG_RECREATE_REQ_CODE :
140
149
remotes = rclone .getRemotes ();
141
150
Collections .sort (remotes );
142
- recyclerViewAdapter = new RemotesRecyclerViewAdapter (remotes , clickListener , this );
151
+ recyclerViewAdapter = new RemotesRecyclerViewAdapter (remotes , remoteClickListener , this );
143
152
refreshFragment ();
144
153
if (remotes .size () == 1 ) {
145
154
AppShortcutsHelper .populateAppShortcuts (context , remotes );
@@ -164,17 +173,23 @@ public void onAttach(Context context) {
164
173
super .onAttach (context );
165
174
this .context = context ;
166
175
if (context instanceof OnRemoteClickListener ) {
167
- clickListener = (OnRemoteClickListener ) context ;
176
+ remoteClickListener = (OnRemoteClickListener ) context ;
168
177
} else {
169
178
throw new RuntimeException (context .toString () + " must implement OnRemoteClickListener" );
170
179
}
180
+ if (context instanceof AddRemoteToNavDrawer ) {
181
+ pinToDrawerListener = (AddRemoteToNavDrawer ) context ;
182
+ } else {
183
+ throw new RuntimeException (context .toString () + " must implement AddRemoteToNavDrawer" );
184
+ }
171
185
}
172
186
173
187
@ Override
174
188
public void onDetach () {
175
189
super .onDetach ();
176
190
context = null ;
177
- clickListener = null ;
191
+ remoteClickListener = null ;
192
+ pinToDrawerListener = null ;
178
193
}
179
194
180
195
@ Override
@@ -199,6 +214,13 @@ public boolean onMenuItemClick(MenuItem item) {
199
214
pinRemote (remoteItem );
200
215
}
201
216
break ;
217
+ case R .id .action_favorite :
218
+ if (remoteItem .isDrawerPinned ()) {
219
+ unpinFromDrawer (remoteItem );
220
+ } else {
221
+ pinToDrawer (remoteItem );
222
+ }
223
+ break ;
202
224
case R .id .action_add_to_home_screen :
203
225
AppShortcutsHelper .addRemoteToHomeScreen (context , remoteItem );
204
226
break ;
@@ -220,6 +242,13 @@ public boolean onMenuItemClick(MenuItem item) {
220
242
MenuItem addToHomeScreenAction = popupMenu .getMenu ().findItem (R .id .action_add_to_home_screen );
221
243
addToHomeScreenAction .setVisible (false );
222
244
}
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
+ }
223
252
}
224
253
225
254
private void pinRemote (RemoteItem remoteItem ) {
@@ -260,6 +289,38 @@ private void unPinRemote(RemoteItem remoteItem) {
260
289
recyclerViewAdapter .moveDataItem (remotes , from , to );
261
290
}
262
291
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
+
263
324
private void deleteRemote (final RemoteItem remoteItem ) {
264
325
AlertDialog .Builder builder ;
265
326
if (isDarkTheme ) {
@@ -279,10 +340,6 @@ public void onClick(DialogInterface dialog, int which) {
279
340
builder .show ();
280
341
}
281
342
282
- public interface OnRemoteClickListener {
283
- void onRemoteClick (RemoteItem remote );
284
- }
285
-
286
343
@ SuppressLint ("StaticFieldLeak" )
287
344
private class DeleteRemote extends AsyncTask <Void , Void , Void > {
288
345
@@ -313,6 +370,13 @@ protected void onPostExecute(Void aVoid) {
313
370
314
371
AppShortcutsHelper .removeAppShortcut (context , remoteItem .getName ());
315
372
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
+
316
380
recyclerViewAdapter .removeItem (remoteItem );
317
381
318
382
if (rclone .getRemotes ().isEmpty ()) {
0 commit comments