From: Markus Pfeiffer Date: Tue, 21 Nov 2023 14:37:21 +0000 (+0100) Subject: android: Disable copy/delete for read-only profiles X-Git-Tag: android-2.5.0^2~33 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=d3f5c3a760539de24b98ecdbc0f615b0f748fbaf;p=thirdparty%2Fstrongswan.git android: Disable copy/delete for read-only profiles If a profile is marked as read-only, do not allow users to copy or delete the profile. --- diff --git a/src/frontends/android/app/src/main/java/org/strongswan/android/ui/VpnProfileListFragment.java b/src/frontends/android/app/src/main/java/org/strongswan/android/ui/VpnProfileListFragment.java index 7c3572325d..c56962d72b 100644 --- a/src/frontends/android/app/src/main/java/org/strongswan/android/ui/VpnProfileListFragment.java +++ b/src/frontends/android/app/src/main/java/org/strongswan/android/ui/VpnProfileListFragment.java @@ -1,4 +1,5 @@ /* + * Copyright (C) 2023 Relution GmbH * Copyright (C) 2012-2019 Tobias Brunner * Copyright (C) 2012 Giuliano Grassi * Copyright (C) 2012 Ralf Sager @@ -50,6 +51,7 @@ import java.util.HashSet; import java.util.Iterator; import java.util.List; import java.util.Objects; +import java.util.Set; import java.util.UUID; import androidx.fragment.app.Fragment; @@ -64,7 +66,7 @@ public class VpnProfileListFragment extends Fragment private VpnProfileAdapter mListAdapter; private ListView mListView; private OnVpnProfileSelectedListener mListener; - private HashSet mSelected; + private Set mSelected; private boolean mReadOnly; private final BroadcastReceiver mProfilesChanged = new BroadcastReceiver() @@ -237,18 +239,27 @@ public class VpnProfileListFragment extends Fragment { private MenuItem mEditProfile; private MenuItem mCopyProfile; + private MenuItem mDeleteProfile; + + private boolean mCanEdit; + private boolean mCanCopy; + private boolean mCanDelete; + + private int mReadOnlyCount; @Override public boolean onPrepareActionMode(ActionMode mode, Menu menu) { - mEditProfile.setEnabled(mSelected.size() == 1); - mCopyProfile.setEnabled(mEditProfile.isEnabled()); + mEditProfile.setEnabled(mCanEdit); + mCopyProfile.setEnabled(mCanCopy); + mDeleteProfile.setEnabled(mCanDelete); return true; } @Override public void onDestroyActionMode(ActionMode mode) { + mReadOnlyCount = 0; mSelected.clear(); } @@ -259,6 +270,7 @@ public class VpnProfileListFragment extends Fragment inflater.inflate(R.menu.profile_list_context, menu); mEditProfile = menu.findItem(R.id.edit_profile); mCopyProfile = menu.findItem(R.id.copy_profile); + mDeleteProfile = menu.findItem(R.id.delete_profile); mode.setTitle(R.string.select_profiles); return true; } @@ -327,13 +339,17 @@ public class VpnProfileListFragment extends Fragment public void onItemCheckedStateChanged(ActionMode mode, int position, long id, boolean checked) { + VpnProfile profile = (VpnProfile)mListView.getItemAtPosition(position); + if (checked) { mSelected.add(position); + mReadOnlyCount += profile.isReadOnly() ? 1 : 0; } else { mSelected.remove(position); + mReadOnlyCount -= profile.isReadOnly() ? 1 : 0; } final int checkedCount = mSelected.size(); switch (checkedCount) @@ -348,6 +364,11 @@ public class VpnProfileListFragment extends Fragment mode.setSubtitle(String.format(getString(R.string.x_profiles_selected), checkedCount)); break; } + + mCanEdit = checkedCount == 1; + mCanCopy = checkedCount == 1 && mReadOnlyCount == 0; + mCanDelete = checkedCount > 0 && mReadOnlyCount == 0; + mode.invalidate(); } };