Start working on ability to remove groups

This commit is contained in:
Michael Schättgen 2018-12-16 22:57:04 +01:00
parent ae0b4b5a37
commit feeada3e2d
10 changed files with 289 additions and 0 deletions

View file

@ -172,6 +172,17 @@ public class DatabaseManager {
return groups;
}
public void removeGroup(String groupName) {
TreeSet<String> groups = new TreeSet<>(Collator.getInstance());
for (DatabaseEntry entry : getEntries()) {
String group = entry.getGroup();
if (group != null && group.equals(groupName)) {
entry.setGroup(null);
_db.replaceEntry(entry);
}
}
}
public DatabaseFileCredentials getCredentials() {
assertState(false, true);
return _creds;

View file

@ -0,0 +1,58 @@
package me.impy.aegis.ui;
import android.os.Bundle;
import java.util.TreeSet;
import androidx.appcompat.app.ActionBar;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import me.impy.aegis.AegisApplication;
import me.impy.aegis.R;
import me.impy.aegis.db.DatabaseFileCredentials;
import me.impy.aegis.db.DatabaseManager;
import me.impy.aegis.db.slots.Slot;
import me.impy.aegis.ui.views.GroupAdapter;
import me.impy.aegis.ui.views.SlotAdapter;
public class GroupManagerActivity extends AegisActivity implements GroupAdapter.Listener {
private AegisApplication _app;
private DatabaseManager _db;
private GroupAdapter _adapter;
TreeSet<String> groups;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_groups);
_app = (AegisApplication) getApplication();
_db = _app.getDatabaseManager();
groups = _db.getGroups();
ActionBar bar = getSupportActionBar();
bar.setHomeAsUpIndicator(R.drawable.ic_close);
bar.setDisplayHomeAsUpEnabled(true);
// set up the recycler view
_adapter = new GroupAdapter(this);
RecyclerView slotsView = findViewById(R.id.list_slots);
LinearLayoutManager layoutManager = new LinearLayoutManager(this);
slotsView.setLayoutManager(layoutManager);
slotsView.setAdapter(_adapter);
slotsView.setNestedScrollingEnabled(false);
// load the slots and masterKey
for (String group : groups) {
_adapter.addGroup(group);
}
}
@Override
public void onRemoveGroup(String group) {
_db.removeGroup(group);
groups.remove(group);
}
}

View file

@ -67,6 +67,7 @@ public class PreferencesFragment extends PreferenceFragmentCompat {
private SwitchPreference _fingerprintPreference;
private Preference _setPasswordPreference;
private Preference _slotsPreference;
private Preference _groupsPreference;
@Override
public void onCreatePreferencesFix(Bundle savedInstanceState, String rootKey) {
@ -208,6 +209,15 @@ public class PreferencesFragment extends PreferenceFragmentCompat {
}
});
_groupsPreference = findPreference("pref_groups");
_groupsPreference.setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() {
@Override
public boolean onPreferenceClick(Preference preference) {
Intent intent = new Intent(getActivity(), GroupManagerActivity.class);
startActivity(intent);
return true;
}
});
updateEncryptionPreferences();
}

View file

@ -0,0 +1,62 @@
package me.impy.aegis.ui.views;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import java.util.ArrayList;
import androidx.recyclerview.widget.RecyclerView;
import me.impy.aegis.R;
import me.impy.aegis.db.slots.Slot;
public class GroupAdapter extends RecyclerView.Adapter<GroupHolder> {
private GroupAdapter.Listener _listener;
private ArrayList<String> _groups;
public GroupAdapter(GroupAdapter.Listener listener) {
_listener = listener;
_groups = new ArrayList<>();
}
public void addGroup(String group) {
_groups.add(group);
int position = getItemCount() - 1;
if (position == 0) {
notifyDataSetChanged();
} else {
notifyItemInserted(position);
}
}
public void removeGroup(String group) {
int position = _groups.indexOf(group);
_groups.remove(position);
notifyItemRemoved(position);
}
@Override
public GroupHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.card_slot, parent, false);
return new GroupHolder(view);
}
@Override
public void onBindViewHolder(GroupHolder holder, int position) {
holder.setData(_groups.get(position));
holder.setOnDeleteClickListener(v -> {
int position12 = holder.getAdapterPosition();
_listener.onRemoveGroup(_groups.get(position12));
});
}
@Override
public int getItemCount() {
return _groups.size();
}
public interface Listener {
void onRemoveGroup(String group);
}
}

View file

@ -0,0 +1,35 @@
package me.impy.aegis.ui.views;
import androidx.recyclerview.widget.RecyclerView;
import android.view.View;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;
import me.impy.aegis.R;
import me.impy.aegis.crypto.KeyStoreHandle;
import me.impy.aegis.crypto.KeyStoreHandleException;
import me.impy.aegis.db.slots.FingerprintSlot;
import me.impy.aegis.db.slots.PasswordSlot;
import me.impy.aegis.db.slots.RawSlot;
import me.impy.aegis.db.slots.Slot;
import me.impy.aegis.helpers.FingerprintHelper;
public class GroupHolder extends RecyclerView.ViewHolder {
private TextView _slotName;
private ImageView _buttonDelete;
public GroupHolder(final View view) {
super(view);
_slotName = view.findViewById(R.id.text_slot_name);
_buttonDelete = view.findViewById(R.id.button_delete);
}
public void setData(String groupName) {
_slotName.setText(groupName);
}
public void setOnDeleteClickListener(View.OnClickListener listener) {
_buttonDelete.setOnClickListener(listener);
}
}