From: Tobias Brunner Date: Tue, 17 Jul 2012 17:49:42 +0000 (+0200) Subject: Use a contextual action bar to edit and delete selected VPN profiles X-Git-Tag: 5.0.1~210^2~73 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=c6b736b9f5409371a69298aaab2a7f99d06b7ddd;p=thirdparty%2Fstrongswan.git Use a contextual action bar to edit and delete selected VPN profiles --- diff --git a/src/frontends/android/res/menu/profile_list_context.xml b/src/frontends/android/res/menu/profile_list_context.xml new file mode 100644 index 0000000000..e674ae8563 --- /dev/null +++ b/src/frontends/android/res/menu/profile_list_context.xml @@ -0,0 +1,24 @@ + + + + + + + + + \ No newline at end of file diff --git a/src/frontends/android/res/values/strings.xml b/src/frontends/android/res/values/strings.xml index 9d52c1e3e7..53a94bb303 100644 --- a/src/frontends/android/res/values/strings.xml +++ b/src/frontends/android/res/values/strings.xml @@ -23,6 +23,12 @@ No VPN profiles. Add VPN profile + Edit + Delete + Selected profiles deleted + No profile selected + One profile selected + %1$d profiles selected" Save diff --git a/src/frontends/android/src/org/strongswan/android/data/VpnProfile.java b/src/frontends/android/src/org/strongswan/android/data/VpnProfile.java index 8dc5f2499c..3e248d2eb1 100644 --- a/src/frontends/android/src/org/strongswan/android/data/VpnProfile.java +++ b/src/frontends/android/src/org/strongswan/android/data/VpnProfile.java @@ -87,4 +87,14 @@ public class VpnProfile { return mName; } + + @Override + public boolean equals(Object o) + { + if (o != null && o instanceof VpnProfile) + { + return this.mId == ((VpnProfile)o).getId(); + } + return false; + } } diff --git a/src/frontends/android/src/org/strongswan/android/ui/VpnProfileListFragment.java b/src/frontends/android/src/org/strongswan/android/ui/VpnProfileListFragment.java index a7211c5de5..252330b288 100644 --- a/src/frontends/android/src/org/strongswan/android/ui/VpnProfileListFragment.java +++ b/src/frontends/android/src/org/strongswan/android/ui/VpnProfileListFragment.java @@ -17,6 +17,8 @@ package org.strongswan.android.ui; +import java.util.ArrayList; +import java.util.HashSet; import java.util.List; import org.strongswan.android.R; @@ -29,17 +31,23 @@ import android.app.Fragment; import android.content.Context; import android.content.Intent; import android.os.Bundle; +import android.view.ActionMode; import android.view.LayoutInflater; import android.view.Menu; import android.view.MenuInflater; import android.view.MenuItem; import android.view.View; import android.view.ViewGroup; +import android.widget.AbsListView.MultiChoiceModeListener; +import android.widget.AdapterView; +import android.widget.AdapterView.OnItemClickListener; import android.widget.ListView; +import android.widget.Toast; public class VpnProfileListFragment extends Fragment { private static final int ADD_REQUEST = 1; + private static final int EDIT_REQUEST = 2; private List mVpnProfiles; private VpnProfileDataSource mDataSource; @@ -54,6 +62,8 @@ public class VpnProfileListFragment extends Fragment mListView = (ListView)view.findViewById(R.id.profile_list); mListView.setEmptyView(view.findViewById(R.id.profile_list_empty)); + mListView.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE_MODAL); + mListView.setMultiChoiceModeListener(mVpnProfileSelected); mListView.setAdapter(mListAdapter); return view; @@ -110,6 +120,7 @@ public class VpnProfileListFragment extends Fragment switch (requestCode) { case ADD_REQUEST: + case EDIT_REQUEST: if (resultCode != Activity.RESULT_OK) { return; @@ -117,7 +128,8 @@ public class VpnProfileListFragment extends Fragment long id = data.getLongExtra(VpnProfileDataSource.KEY_ID, 0); VpnProfile profile = mDataSource.getVpnProfile(id); if (profile != null) - { + { /* in case this was an edit, we remove it first */ + mVpnProfiles.remove(profile); mVpnProfiles.add(profile); mListAdapter.notifyDataSetChanged(); } @@ -125,4 +137,97 @@ public class VpnProfileListFragment extends Fragment } super.onActivityResult(requestCode, resultCode, data); } + + private final MultiChoiceModeListener mVpnProfileSelected = new MultiChoiceModeListener() { + private HashSet mSelected; + private MenuItem mEditProfile; + + @Override + public boolean onPrepareActionMode(ActionMode mode, Menu menu) + { + return false; + } + + @Override + public void onDestroyActionMode(ActionMode mode) + { + } + + @Override + public boolean onCreateActionMode(ActionMode mode, Menu menu) + { + MenuInflater inflater = mode.getMenuInflater(); + inflater.inflate(R.menu.profile_list_context, menu); + mEditProfile = menu.findItem(R.id.edit_profile); + mSelected = new HashSet(); + mode.setTitle("Select Profiles"); + return true; + } + + @Override + public boolean onActionItemClicked(ActionMode mode, MenuItem item) + { + switch (item.getItemId()) + { + case R.id.edit_profile: + { + int position = mSelected.iterator().next(); + VpnProfile profile = (VpnProfile)mListView.getItemAtPosition(position); + Intent connectionIntent = new Intent(getActivity(), VpnProfileDetailActivity.class); + connectionIntent.putExtra(VpnProfileDataSource.KEY_ID, profile.getId()); + startActivityForResult(connectionIntent, EDIT_REQUEST); + break; + } + case R.id.delete_profile: + { + ArrayList profiles = new ArrayList(); + for (int position : mSelected) + { + profiles.add((VpnProfile)mListView.getItemAtPosition(position)); + } + for (VpnProfile profile : profiles) + { + mDataSource.deleteVpnProfile(profile); + mVpnProfiles.remove(profile); + } + mListAdapter.notifyDataSetChanged(); + Toast.makeText(VpnProfileListFragment.this.getActivity(), + R.string.profiles_deleted, Toast.LENGTH_SHORT).show(); + break; + } + default: + return false; + } + mode.finish(); + return true; + } + + @Override + public void onItemCheckedStateChanged(ActionMode mode, int position, + long id, boolean checked) + { + if (checked) + { + mSelected.add(position); + } + else + { + mSelected.remove(position); + } + final int checkedCount = mSelected.size(); + mEditProfile.setEnabled(checkedCount == 1); + switch (checkedCount) + { + case 0: + mode.setSubtitle(R.string.no_profile_selected); + break; + case 1: + mode.setSubtitle(R.string.one_profile_selected); + break; + default: + mode.setSubtitle(String.format(getString(R.string.x_profiles_selected), checkedCount)); + break; + } + } + }; }