Skip to content

Commit 7310d43

Browse files
author
Teja Vojjala
committed
multiple selection implementation in saved projects
1 parent b05e2f3 commit 7310d43

13 files changed

Lines changed: 133 additions & 33 deletions

File tree

source-code/app/src/main/java/org/buildmlearn/toolkit/adapter/SavedProjectAdapter.java

Lines changed: 31 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,10 @@
1212
import org.buildmlearn.toolkit.views.TextViewPlus;
1313

1414
import java.util.ArrayList;
15+
import java.util.Collections;
16+
import java.util.HashMap;
1517
import java.util.Locale;
18+
import java.util.Map;
1619

1720
/**
1821
* @brief Adapter used for showing saved projects in a list
@@ -23,12 +26,12 @@ public class SavedProjectAdapter extends BaseAdapter {
2326

2427
private final Context mContext;
2528
private final ArrayList<SavedProject> data;
26-
private int selectedPosition;
29+
private Map selectedPositions;
2730

2831
public SavedProjectAdapter(Context mContext, ArrayList<SavedProject> data) {
2932
this.mContext = mContext;
3033
this.data = data;
31-
selectedPosition = -1;
34+
selectedPositions = new HashMap();
3235
}
3336

3437
/**
@@ -55,14 +58,35 @@ public long getItemId(int i) {
5558
return i;
5659
}
5760

58-
public int getSelectedPosition() {
59-
return selectedPosition;
61+
public boolean isPositionSelected(int position)
62+
{
63+
return selectedPositions.containsKey(position);
6064
}
6165

62-
public void setSelectedPosition(int selectedPosition) {
63-
this.selectedPosition = selectedPosition;
66+
public void putSelectedPosition(int position) {
67+
selectedPositions.put(position,true);
6468
}
6569

70+
public ArrayList<Integer> getSelectedPositions()
71+
{
72+
ArrayList<Integer> positions = new ArrayList<>();
73+
for(Object key : selectedPositions.keySet())
74+
{
75+
positions.add((Integer)key);
76+
}
77+
Collections.sort(positions);
78+
return positions;
79+
}
80+
81+
public void removeSelectedPosition(int position)
82+
{
83+
selectedPositions.remove(position);
84+
}
85+
86+
public int selectedPositionsSize()
87+
{
88+
return selectedPositions.size();
89+
}
6690
/**
6791
* {@inheritDoc}
6892
*/
@@ -81,7 +105,7 @@ public View getView(int position, View convertView, ViewGroup parent) {
81105
holder = (ProjectHolder) convertView.getTag();
82106
}
83107

84-
if (selectedPosition == position) {
108+
if (selectedPositions.containsKey(position)) {
85109
convertView.setBackgroundColor(ContextCompat.getColor(mContext, R.color.color_divider));
86110
} else {
87111
convertView.setBackgroundColor(0);

source-code/app/src/main/java/org/buildmlearn/toolkit/fragment/LoadProjectFragment.java

Lines changed: 79 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -149,17 +149,19 @@ public void onViewCreated(View view, Bundle savedInstanceState) {
149149
mListView.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {
150150
@Override
151151
public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) {
152-
if (mAdapter.getSelectedPosition() == position) {
153-
mAdapter.setSelectedPosition(-1);
152+
if (mAdapter.isPositionSelected(position)) {
153+
mAdapter.removeSelectedPosition(position);
154154
view.setBackgroundResource(0);
155155
restoreColorScheme();
156+
if(mAdapter.selectedPositionsSize()==0)
157+
restoreColorScheme();
156158
} else {
157159
if (selectedView != null) {
158160
selectedView.setBackgroundResource(0);
159161
}
160162
selectedView = view;
161163
view.setBackgroundColor(ContextCompat.getColor(mToolkit, R.color.color_divider));
162-
mAdapter.setSelectedPosition(position);
164+
mAdapter.putSelectedPosition(position);
163165
Log.d(TAG, "Position: " + position);
164166
changeColorScheme();
165167
}
@@ -173,6 +175,26 @@ public boolean onItemLongClick(AdapterView<?> parent, View view, int position, l
173175
*/
174176
@Override
175177
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
178+
179+
if(mAdapter.selectedPositionsSize() > 0)
180+
{
181+
if(mAdapter.isPositionSelected(position)) {
182+
mAdapter.removeSelectedPosition(position);
183+
view.setBackgroundResource(0);
184+
if(mAdapter.selectedPositionsSize() == 0)
185+
restoreColorScheme();
186+
}
187+
else{
188+
selectedView = view;
189+
view.setBackgroundColor(ContextCompat.getColor(mToolkit, R.color.color_divider));
190+
mAdapter.putSelectedPosition(position);
191+
Log.d(TAG, "Position: " + position);
192+
changeColorScheme();
193+
194+
}
195+
return ;
196+
}
197+
176198
SavedProject project = savedProjects.get(position);
177199
Template[] templates = Template.values();
178200
for (int i = 0; i < templates.length; i++) {
@@ -331,31 +353,39 @@ public boolean onOptionsItemSelected(final MenuItem item) {
331353

332354
final MaterialDialog dialog = new MaterialDialog.Builder(activity)
333355
.title(R.string.dialog_delete_title)
334-
.content(R.string.dialog_delete_msg)
335356
.positiveText(R.string.dialog_yes)
336357
.negativeText(R.string.dialog_no)
337358
.build();
338359

360+
if(mAdapter.selectedPositionsSize()==1)
361+
dialog.setContent(R.string.dialog_delete_msg);
362+
else
363+
dialog.setContent(R.string.dialog_delete_multiple);
339364
dialog.getActionButton(DialogAction.POSITIVE).setOnClickListener(new View.OnClickListener() {
340365
@Override
341366
public void onClick(View v) {
342367
dialog.dismiss();
343-
deleteItem(mAdapter.getSelectedPosition());
368+
deleteItems();
344369
restoreSelectedView();
345370
}
346371
});
347372
dialog.show();
348373
break;
349374
case R.id.action_share:
350375

351-
SavedProject project = savedProjects.get(mAdapter.getSelectedPosition());
352-
File file = new File(project.getFile().getPath());
353-
354-
Uri fileUri = Uri.fromFile(file);
376+
ArrayList<Integer> selectedPositions = mAdapter.getSelectedPositions();
355377
ArrayList<Uri> uris = new ArrayList<>();
356378
Intent sendIntent = new Intent(Intent.ACTION_SEND_MULTIPLE);
357379
sendIntent.setType("application/zip");
358-
uris.add(fileUri);
380+
for(int selectedPosition : selectedPositions) {
381+
if(selectedPosition != selectedPositions.get(0))
382+
selectedPosition--;
383+
SavedProject project = savedProjects.get(selectedPosition);
384+
File file = new File(project.getFile().getPath());
385+
386+
Uri fileUri = Uri.fromFile(file);
387+
uris.add(fileUri);
388+
}
359389
sendIntent.putParcelableArrayListExtra(Intent.EXTRA_STREAM, uris);
360390
startActivity(Intent.createChooser(sendIntent, null));
361391
break;
@@ -411,6 +441,27 @@ public boolean onKey(View v, int keyCode, KeyEvent event) {
411441
editSearch.requestFocus();
412442
InputMethodManager imm = (InputMethodManager) getActivity().getSystemService(Context.INPUT_METHOD_SERVICE);
413443
imm.showSoftInput(editSearch, InputMethodManager.SHOW_IMPLICIT);
444+
break;
445+
446+
case R.id.action_select_all:
447+
for(int i=0;i<mAdapter.getCount();i++) {
448+
if (!mAdapter.isPositionSelected(i))
449+
{
450+
mListView.getChildAt(i).setBackgroundColor(ContextCompat.getColor(mToolkit, R.color.color_divider));
451+
mAdapter.putSelectedPosition(i);
452+
changeColorScheme();
453+
}
454+
}
455+
break;
456+
457+
case R.id.action_unselect_all:
458+
for(int i=0;i<mAdapter.getCount();i++)
459+
if(mAdapter.isPositionSelected(i)) {
460+
mListView.getChildAt(i).setBackgroundColor(0);
461+
mAdapter.removeSelectedPosition(i);
462+
}
463+
restoreColorScheme();
464+
break;
414465

415466
default: //do nothing
416467
break;
@@ -421,19 +472,26 @@ public boolean onKey(View v, int keyCode, KeyEvent event) {
421472
/**
422473
* @brief Removes selected project item
423474
*/
424-
private void deleteItem(int selectedPosition) {
425-
SavedProject project = savedProjects.get(selectedPosition);
426-
File file = new File(project.getFile().getPath());
427-
boolean deleted = file.delete();
428-
if (deleted) {
429-
savedProjects.remove(selectedPosition);
430-
mAdapter.setSelectedPosition(-1);
431-
mAdapter.notifyDataSetChanged();
432-
setEmptyText();
475+
476+
private void deleteItems() {
477+
ArrayList<Integer> selectedPositions = mAdapter.getSelectedPositions();
478+
boolean deleted = false;
479+
for(int selectedPosition : selectedPositions) {
480+
if(selectedPosition!=selectedPositions.get(0))selectedPosition--;
481+
SavedProject project = savedProjects.get(selectedPosition);
482+
File file = new File(project.getFile().getPath());
483+
deleted = file.delete();
484+
if (deleted) {
485+
savedProjects.remove(selectedPosition);
486+
mAdapter.removeSelectedPosition(selectedPosition);
487+
mAdapter.notifyDataSetChanged();
488+
setEmptyText();
489+
}
490+
}
491+
if(deleted)
433492
Toast.makeText(activity, "Project Successfully Deleted!", Toast.LENGTH_SHORT).show();
434-
} else {
493+
else
435494
Toast.makeText(activity, "Project Deletion Failed!", Toast.LENGTH_SHORT).show();
436-
}
437495
}
438496

439497
/**
222 Bytes
Loading
141 Bytes
Loading
196 Bytes
Loading
262 Bytes
Loading
2.36 KB
Loading
315 Bytes
Loading
141 Bytes
Loading

source-code/app/src/main/res/menu/menu_project_selected.xml

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,14 +8,29 @@
88
android:icon="@drawable/ic_share_white_24dp"
99
android:orderInCategory="1"
1010
android:title="@string/bottom_sheet_share_apk"
11-
app:showAsAction="ifRoom" />
11+
app:showAsAction="always" />
1212

1313
<item
1414
android:id="@+id/action_delete"
1515
android:icon="@drawable/menu_delete_template_item"
1616
android:orderInCategory="2"
1717
android:title="@string/menu_delete_template_item"
18-
app:showAsAction="ifRoom" />
18+
app:showAsAction="always" />
1919

20+
<item
21+
android:id="@+id/action_select_all"
22+
android:icon="@drawable/ic_select_all_white_24dp"
23+
android:orderInCategory="3"
24+
android:title="@string/menu_select_all"
25+
app:showAsAction="always"
26+
/>
27+
28+
<item
29+
android:id="@+id/action_unselect_all"
30+
android:icon="@drawable/ic_close"
31+
android:orderInCategory="4"
32+
android:title="@string/menu_unselect_all"
33+
app:showAsAction="always"
34+
/>
2035

2136
</menu>

0 commit comments

Comments
 (0)