Skip to content

Commit 71a8764

Browse files
authored
Merge pull request #164 from iit2014086/master
Multiple selection implementation in savedapkfragment
2 parents dee5b45 + 5fda107 commit 71a8764

4 files changed

Lines changed: 140 additions & 43 deletions

File tree

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

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package org.buildmlearn.toolkit.adapter;
22

33
import android.content.Context;
4+
import android.support.v4.content.ContextCompat;
45
import android.view.LayoutInflater;
56
import android.view.View;
67
import android.view.ViewGroup;
@@ -11,7 +12,10 @@
1112
import org.buildmlearn.toolkit.views.TextViewPlus;
1213

1314
import java.util.ArrayList;
15+
import java.util.Collections;
16+
import java.util.HashMap;
1417
import java.util.Locale;
18+
import java.util.Map;
1519

1620
/**
1721
* @brief Adapter used for showing saved APIs in a list
@@ -23,10 +27,12 @@ public class SavedApiAdapter extends BaseAdapter {
2327

2428
private final Context mContext;
2529
private final ArrayList<SavedApi> data;
30+
private Map selectedPositions;
2631

2732
public SavedApiAdapter(Context mContext, ArrayList<SavedApi> data) {
2833
this.mContext = mContext;
2934
this.data = data;
35+
selectedPositions = new HashMap();
3036
}
3137

3238
/**
@@ -56,6 +62,37 @@ public long getItemId(int i) {
5662
/**
5763
* {@inheritDoc}
5864
*/
65+
66+
public boolean isPositionSelected(int position)
67+
{
68+
return selectedPositions.containsKey(position);
69+
}
70+
71+
public void putSelectedPosition(int position) {
72+
selectedPositions.put(position,true);
73+
}
74+
75+
public ArrayList<Integer> getSelectedPositions()
76+
{
77+
ArrayList<Integer> positions = new ArrayList<>();
78+
for(Object key : selectedPositions.keySet())
79+
{
80+
positions.add((Integer)key);
81+
}
82+
Collections.sort(positions);
83+
return positions;
84+
}
85+
86+
public void removeSelectedPosition(int position)
87+
{
88+
selectedPositions.remove(position);
89+
}
90+
91+
public int selectedPositionsSize()
92+
{
93+
return selectedPositions.size();
94+
}
95+
5996
@Override
6097
public View getView(int position, View convertView, ViewGroup parent) {
6198
LayoutInflater mInflater;
@@ -71,6 +108,12 @@ public View getView(int position, View convertView, ViewGroup parent) {
71108
holder = (ApiHolder) convertView.getTag();
72109
}
73110

111+
if (selectedPositions.containsKey(position)) {
112+
convertView.setBackgroundColor(ContextCompat.getColor(mContext, R.color.color_divider));
113+
} else {
114+
convertView.setBackgroundColor(0);
115+
}
116+
74117
SavedApi apiData = getItem(position);
75118
holder.details.setText(String.format(Locale.ENGLISH, "Modified: %s, Author: ", apiData.getDate(), apiData.getAuthor()));
76119
holder.apkName.setText(apiData.getName());

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

Lines changed: 77 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -137,18 +137,14 @@ public void onViewCreated(View view, Bundle savedInstanceState) {
137137
mListView.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {
138138
@Override
139139
public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) {
140-
if (selectedPosition == position) {
141-
selectedPosition = -1;
140+
if (mAdapter.isPositionSelected(position)) {
141+
mAdapter.removeSelectedPosition(position);
142142
view.setBackgroundResource(0);
143-
restoreColorScheme();
143+
if(mAdapter.selectedPositionsSize()==0)
144+
restoreColorScheme();
144145
} else {
145-
if (selectedView != null) {
146-
selectedView.setBackgroundResource(0);
147-
}
148-
selectedView = view;
149-
selectedPosition = position;
150-
Log.d(TAG, "Position: " + selectedPosition);
151146
view.setBackgroundColor(ContextCompat.getColor(getActivity(), R.color.color_divider));
147+
mAdapter.putSelectedPosition(position);
152148
changeColorScheme();
153149
}
154150
return true;
@@ -161,6 +157,21 @@ public boolean onItemLongClick(AdapterView<?> parent, View view, int position, l
161157
*/
162158
@Override
163159
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
160+
if(mAdapter.selectedPositionsSize() > 0) {
161+
if(mAdapter.isPositionSelected(position)) {
162+
mAdapter.removeSelectedPosition(position);
163+
view.setBackgroundResource(0);
164+
if(mAdapter.selectedPositionsSize() == 0)
165+
restoreColorScheme();
166+
}
167+
else{
168+
view.setBackgroundColor(ContextCompat.getColor(mToolkit, R.color.color_divider));
169+
mAdapter.putSelectedPosition(position);
170+
Log.d(TAG, "Position: " + position);
171+
changeColorScheme();
172+
}
173+
return ;
174+
}
164175
SavedApi apk = savedApis.get(position);
165176
File file = new File(apk.getFile().getPath());
166177
Intent intent = new Intent();
@@ -307,29 +318,39 @@ public boolean onOptionsItemSelected(final MenuItem item) {
307318

308319
final MaterialDialog dialog = new MaterialDialog.Builder(activity)
309320
.title(R.string.dialog_delete_title)
310-
.content(R.string.dialog_delete_msg)
311321
.positiveText(R.string.dialog_yes)
312322
.negativeText(R.string.dialog_no)
313323
.build();
324+
if(mAdapter.selectedPositionsSize()==1)
325+
dialog.setContent(R.string.dialog_delete_msg);
326+
else
327+
dialog.setContent(R.string.dialog_delete_multiple);
314328

315329
dialog.getActionButton(DialogAction.POSITIVE).setOnClickListener(new View.OnClickListener() {
316330
@Override
317331
public void onClick(View v) {
318332
dialog.dismiss();
319-
deleteItem(selectedPosition);
333+
deleteItems();
320334
restoreSelectedView();
321335
}
322336
});
323337
dialog.show();
324338
break;
325339
case R.id.action_share:
326340

327-
SavedApi apk = savedApis.get(selectedPosition);
328-
File file = new File(apk.getFile().getPath());
329-
Uri fileUri = Uri.fromFile(file);
330-
Intent sendIntent = new Intent(Intent.ACTION_SEND);
331-
sendIntent.setType("application/vnd.android.package-archive");
332-
sendIntent.putExtra(Intent.EXTRA_STREAM, fileUri);
341+
ArrayList<Integer> selectedPositions = mAdapter.getSelectedPositions();
342+
ArrayList<Uri> uris = new ArrayList<>();
343+
Intent sendIntent = new Intent(Intent.ACTION_SEND_MULTIPLE);
344+
sendIntent.setType("application/zip");
345+
for(int selectedPosition : selectedPositions) {
346+
if(selectedPosition != selectedPositions.get(0))
347+
selectedPosition--;
348+
SavedApi apk = savedApis.get(selectedPosition);
349+
File file = new File(apk.getFile().getPath());
350+
Uri fileUri = Uri.fromFile(file);
351+
uris.add(fileUri);
352+
}
353+
sendIntent.putParcelableArrayListExtra(Intent.EXTRA_STREAM, uris);
333354
startActivity(Intent.createChooser(sendIntent, null));
334355
break;
335356
case R.id.action_search:
@@ -385,6 +406,27 @@ public boolean onKey(View v, int keyCode, KeyEvent event) {
385406
InputMethodManager imm = (InputMethodManager) getActivity().getSystemService(Context.INPUT_METHOD_SERVICE);
386407
imm.showSoftInput(editSearch, InputMethodManager.SHOW_IMPLICIT);
387408
break;
409+
410+
case R.id.action_select_all:
411+
for(int i=0;i<mAdapter.getCount();i++) {
412+
if (!mAdapter.isPositionSelected(i))
413+
{
414+
mListView.getChildAt(i).setBackgroundColor(ContextCompat.getColor(mToolkit, R.color.color_divider));
415+
mAdapter.putSelectedPosition(i);
416+
changeColorScheme();
417+
}
418+
}
419+
break;
420+
421+
case R.id.action_unselect_all:
422+
for(int i=0;i<mAdapter.getCount();i++)
423+
if(mAdapter.isPositionSelected(i)) {
424+
mListView.getChildAt(i).setBackgroundColor(0);
425+
mAdapter.removeSelectedPosition(i);
426+
}
427+
restoreColorScheme();
428+
break;
429+
388430
default: //do nothing
389431
break;
390432
}
@@ -394,27 +436,31 @@ public boolean onKey(View v, int keyCode, KeyEvent event) {
394436
/**
395437
* @brief Removes selected apk item
396438
*/
397-
private void deleteItem(int selectedPosition) {
398-
SavedApi apk = savedApis.get(selectedPosition);
399-
File file = new File(apk.getFile().getPath());
400-
boolean deleted = file.delete();
401-
if (deleted) {
402-
savedApis.remove(selectedPosition);
403-
mAdapter.notifyDataSetChanged();
404-
setEmptyText();
405-
Toast.makeText(activity, "APK Successfully Deleted!", Toast.LENGTH_SHORT).show();
406-
} else {
407-
Toast.makeText(activity, "APK Deletion Failed!", Toast.LENGTH_SHORT).show();
439+
private void deleteItems() {
440+
ArrayList<Integer> selectedPositions = mAdapter.getSelectedPositions();
441+
boolean deleted = false;
442+
for(int selectedPosition : selectedPositions) {
443+
if (selectedPosition != selectedPositions.get(0))
444+
selectedPosition--;
445+
SavedApi apk = savedApis.get(selectedPosition);
446+
File file = new File(apk.getFile().getPath());
447+
deleted = file.delete();
448+
if (deleted) {
449+
savedApis.remove(selectedPosition);
450+
mAdapter.notifyDataSetChanged();
451+
setEmptyText();
452+
}
408453
}
454+
if(deleted)
455+
Toast.makeText(activity, "Project Successfully Deleted!", Toast.LENGTH_SHORT).show();
456+
else
457+
Toast.makeText(activity, "Project Deletion Failed!", Toast.LENGTH_SHORT).show();
409458
}
410459

411460
/**
412461
* @brief Removes selected color from the selected ListView item when switching from edit mode to normal mode
413462
*/
414463
private void restoreSelectedView() {
415-
if (selectedView != null) {
416-
selectedView.setBackgroundResource(0);
417-
}
418464
restoreColorScheme();
419465
}
420466

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

Lines changed: 2 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -152,14 +152,9 @@ public boolean onItemLongClick(AdapterView<?> parent, View view, int position, l
152152
if (mAdapter.isPositionSelected(position)) {
153153
mAdapter.removeSelectedPosition(position);
154154
view.setBackgroundResource(0);
155-
restoreColorScheme();
156155
if(mAdapter.selectedPositionsSize()==0)
157156
restoreColorScheme();
158157
} else {
159-
if (selectedView != null) {
160-
selectedView.setBackgroundResource(0);
161-
}
162-
selectedView = view;
163158
view.setBackgroundColor(ContextCompat.getColor(mToolkit, R.color.color_divider));
164159
mAdapter.putSelectedPosition(position);
165160
Log.d(TAG, "Position: " + position);
@@ -185,7 +180,6 @@ public void onItemClick(AdapterView<?> parent, View view, int position, long id)
185180
restoreColorScheme();
186181
}
187182
else{
188-
selectedView = view;
189183
view.setBackgroundColor(ContextCompat.getColor(mToolkit, R.color.color_divider));
190184
mAdapter.putSelectedPosition(position);
191185
Log.d(TAG, "Position: " + position);
@@ -477,7 +471,8 @@ private void deleteItems() {
477471
ArrayList<Integer> selectedPositions = mAdapter.getSelectedPositions();
478472
boolean deleted = false;
479473
for(int selectedPosition : selectedPositions) {
480-
if(selectedPosition!=selectedPositions.get(0))selectedPosition--;
474+
if(selectedPosition!=selectedPositions.get(0))
475+
selectedPosition--;
481476
SavedProject project = savedProjects.get(selectedPosition);
482477
File file = new File(project.getFile().getPath());
483478
deleted = file.delete();
@@ -498,9 +493,6 @@ private void deleteItems() {
498493
* @brief Removes selected color from the selected ListView item when switching from edit mode to normal mode
499494
*/
500495
private void restoreSelectedView() {
501-
if (selectedView != null) {
502-
selectedView.setBackgroundResource(0);
503-
}
504496
restoreColorScheme();
505497
}
506498

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

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,13 +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" />
19+
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+
/>
1935

2036
</menu>

0 commit comments

Comments
 (0)