Add lock option, Lock on close, Remove old menu
This commit is contained in:
parent
76e12e8f6f
commit
81e8870507
@ -1,26 +1,20 @@
|
||||
package com.cringe_studios.cringe_authenticator;
|
||||
|
||||
import android.content.Intent;
|
||||
import android.content.res.Configuration;
|
||||
import android.os.Bundle;
|
||||
import android.util.Log;
|
||||
import android.view.Menu;
|
||||
import android.view.MenuItem;
|
||||
import android.view.View;
|
||||
import android.view.WindowManager;
|
||||
import android.widget.AdapterView;
|
||||
import android.widget.ArrayAdapter;
|
||||
import android.widget.Toast;
|
||||
|
||||
import androidx.activity.result.ActivityResult;
|
||||
import androidx.activity.result.ActivityResultLauncher;
|
||||
import androidx.activity.result.PickVisualMediaRequest;
|
||||
import androidx.activity.result.contract.ActivityResultContracts;
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.appcompat.app.ActionBar;
|
||||
import androidx.appcompat.app.AlertDialog;
|
||||
import androidx.appcompat.app.AppCompatActivity;
|
||||
import androidx.appcompat.app.AppCompatDelegate;
|
||||
import androidx.fragment.app.Fragment;
|
||||
|
||||
import com.cringe_studios.cringe_authenticator.databinding.ActivityMainBinding;
|
||||
@ -28,8 +22,6 @@ import com.cringe_studios.cringe_authenticator.databinding.DialogInputCodeChoice
|
||||
import com.cringe_studios.cringe_authenticator.fragment.AboutFragment;
|
||||
import com.cringe_studios.cringe_authenticator.fragment.GroupFragment;
|
||||
import com.cringe_studios.cringe_authenticator.fragment.HomeFragment;
|
||||
import com.cringe_studios.cringe_authenticator.fragment.MenuDrawerFragment;
|
||||
import com.cringe_studios.cringe_authenticator.fragment.MenuFragment;
|
||||
import com.cringe_studios.cringe_authenticator.fragment.NamedFragment;
|
||||
import com.cringe_studios.cringe_authenticator.fragment.SettingsFragment;
|
||||
import com.cringe_studios.cringe_authenticator.model.OTPData;
|
||||
@ -40,12 +32,10 @@ import com.cringe_studios.cringe_authenticator.util.NavigationUtil;
|
||||
import com.cringe_studios.cringe_authenticator.util.OTPDatabase;
|
||||
import com.cringe_studios.cringe_authenticator.util.SettingsUtil;
|
||||
import com.cringe_studios.cringe_authenticator.util.StyledDialogBuilder;
|
||||
import com.cringe_studios.cringe_authenticator.util.ThemeUtil;
|
||||
import com.cringe_studios.cringe_authenticator_library.OTPType;
|
||||
import com.google.mlkit.vision.common.InputImage;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.util.Arrays;
|
||||
import java.util.Locale;
|
||||
|
||||
public class MainActivity extends BaseActivity {
|
||||
@ -159,17 +149,10 @@ public class MainActivity extends BaseActivity {
|
||||
@Override
|
||||
public boolean onCreateOptionsMenu(Menu menu) {
|
||||
Fragment fragment = NavigationUtil.getCurrentFragment(this);
|
||||
if(fragment instanceof MenuFragment) {
|
||||
MenuFragment frag = (MenuFragment) fragment;
|
||||
getMenuInflater().inflate(frag.isEditing() ? R.menu.menu_groups_edit : R.menu.menu_groups, menu);
|
||||
if(frag.isEditing() && frag.hasSelectedMultipleItems()) menu.removeItem(R.id.action_edit_group);
|
||||
return true;
|
||||
}
|
||||
|
||||
if(fragment instanceof GroupFragment) {
|
||||
GroupFragment frag = (GroupFragment) fragment;
|
||||
getMenuInflater().inflate(frag.isEditing() ? R.menu.menu_otps_edit : R.menu.menu_otps, menu);
|
||||
if(frag.isEditing() && frag.hasSelectedMultipleItems()) menu.removeItem(R.id.action_edit_group);
|
||||
if(frag.isEditing() && frag.hasSelectedMultipleItems()) menu.removeItem(R.id.action_edit_otp);
|
||||
return true;
|
||||
}
|
||||
|
||||
@ -195,14 +178,6 @@ public class MainActivity extends BaseActivity {
|
||||
@Override
|
||||
public void onBackPressed() {
|
||||
Fragment fragment = NavigationUtil.getCurrentFragment(this);
|
||||
if(fragment instanceof MenuFragment) {
|
||||
MenuFragment menuFragment = (MenuFragment) fragment;
|
||||
if(menuFragment.isEditing()) {
|
||||
menuFragment.finishEditing();
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
if(fragment instanceof GroupFragment) {
|
||||
GroupFragment groupFragment = (GroupFragment) fragment;
|
||||
if(groupFragment.isEditing()) {
|
||||
@ -282,27 +257,6 @@ public class MainActivity extends BaseActivity {
|
||||
}, false);
|
||||
}
|
||||
|
||||
public void addGroup(MenuItem item) {
|
||||
Fragment frag = NavigationUtil.getCurrentFragment(this);
|
||||
if(frag instanceof MenuFragment) {
|
||||
((MenuFragment) frag).addGroup();
|
||||
}
|
||||
}
|
||||
|
||||
public void editGroup(MenuItem item) {
|
||||
Fragment frag = NavigationUtil.getCurrentFragment(this);
|
||||
if(frag instanceof MenuFragment) {
|
||||
((MenuFragment) frag).editGroup();
|
||||
}
|
||||
}
|
||||
|
||||
public void deleteGroup(MenuItem item) {
|
||||
Fragment frag = NavigationUtil.getCurrentFragment(this);
|
||||
if(frag instanceof MenuFragment) {
|
||||
((MenuFragment) frag).removeSelectedGroups();
|
||||
}
|
||||
}
|
||||
|
||||
public void addOTP(MenuItem item) {
|
||||
Fragment frag = NavigationUtil.getCurrentFragment(this);
|
||||
if(frag instanceof GroupFragment) {
|
||||
@ -338,11 +292,21 @@ public class MainActivity extends BaseActivity {
|
||||
}
|
||||
}
|
||||
|
||||
public void lockApp(MenuItem item) {
|
||||
OTPDatabase.unloadDatabase();
|
||||
OTPDatabase.promptLoadDatabase(this, () -> {}, () -> {});
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onStop() {
|
||||
super.onStop();
|
||||
// OTPDatabase.unloadDatabase();
|
||||
OTPDatabase.unloadDatabase();
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onStart() {
|
||||
super.onStart();
|
||||
OTPDatabase.promptLoadDatabase(this, () -> {}, () -> {});
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -1,132 +0,0 @@
|
||||
package com.cringe_studios.cringe_authenticator.fragment;
|
||||
|
||||
import android.os.Bundle;
|
||||
import android.view.LayoutInflater;
|
||||
import android.view.View;
|
||||
import android.view.ViewGroup;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.annotation.Nullable;
|
||||
import androidx.fragment.app.Fragment;
|
||||
import androidx.recyclerview.widget.ItemTouchHelper;
|
||||
import androidx.recyclerview.widget.RecyclerView;
|
||||
|
||||
import com.cringe_studios.cringe_authenticator.R;
|
||||
import com.cringe_studios.cringe_authenticator.databinding.FragmentMenuBinding;
|
||||
import com.cringe_studios.cringe_authenticator.grouplist.GroupListAdapter;
|
||||
import com.cringe_studios.cringe_authenticator.grouplist.GroupListItem;
|
||||
import com.cringe_studios.cringe_authenticator.util.DialogUtil;
|
||||
import com.cringe_studios.cringe_authenticator.util.FabUtil;
|
||||
import com.cringe_studios.cringe_authenticator.util.NavigationUtil;
|
||||
import com.cringe_studios.cringe_authenticator.util.SettingsUtil;
|
||||
import com.cringe_studios.cringe_authenticator.util.StyledDialogBuilder;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.UUID;
|
||||
|
||||
public class MenuFragment extends NamedFragment {
|
||||
|
||||
private FragmentMenuBinding binding;
|
||||
|
||||
private GroupListAdapter groupListAdapter;
|
||||
|
||||
@Override
|
||||
public String getName() {
|
||||
return "Menu";
|
||||
}
|
||||
|
||||
@Nullable
|
||||
@Override
|
||||
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
|
||||
binding = FragmentMenuBinding.inflate(inflater);
|
||||
|
||||
groupListAdapter = new GroupListAdapter(requireContext(), binding.menuItems, group -> {
|
||||
Bundle bundle = new Bundle();
|
||||
bundle.putString(GroupFragment.BUNDLE_GROUP, group);
|
||||
NavigationUtil.navigate(this, GroupFragment.class, bundle);
|
||||
}, () -> SettingsUtil.setGroups(requireContext(), groupListAdapter.getItems()), requireActivity()::invalidateMenu);
|
||||
binding.menuItems.setAdapter(groupListAdapter);
|
||||
|
||||
loadGroups();
|
||||
|
||||
FabUtil.hideFabs(requireActivity());
|
||||
|
||||
return binding.getRoot();
|
||||
}
|
||||
|
||||
private void loadGroups() {
|
||||
List<String> items = SettingsUtil.getGroups(requireContext());
|
||||
|
||||
for(String item : items) {
|
||||
groupListAdapter.add(item);
|
||||
}
|
||||
}
|
||||
|
||||
public void addGroup() {
|
||||
DialogUtil.showCreateGroupDialog(getLayoutInflater(), null, groupName -> {
|
||||
String id = UUID.randomUUID().toString();
|
||||
SettingsUtil.addGroup(requireContext(), id, groupName);
|
||||
groupListAdapter.add(id);
|
||||
}, null);
|
||||
}
|
||||
|
||||
public void editGroup() {
|
||||
if(!groupListAdapter.isEditing()) return;
|
||||
|
||||
List<GroupListItem> items = groupListAdapter.getSelectedGroups();
|
||||
if(items.size() != 1) return;
|
||||
|
||||
String group = items.get(0).getGroupId();
|
||||
|
||||
DialogUtil.showCreateGroupDialog(getLayoutInflater(), SettingsUtil.getGroupName(requireContext(), group), newName -> { // TODO: edit group dialog (with "Edit Group" title)
|
||||
renameGroup(group, newName);
|
||||
groupListAdapter.finishEditing();
|
||||
}, null);
|
||||
}
|
||||
|
||||
public void removeSelectedGroups() {
|
||||
if(!groupListAdapter.isEditing()) return;
|
||||
|
||||
new StyledDialogBuilder(requireContext())
|
||||
.setTitle(R.string.group_delete_title)
|
||||
.setMessage(R.string.group_delete_message)
|
||||
.setPositiveButton(R.string.yes, (d, w) -> {
|
||||
for(GroupListItem item : groupListAdapter.getSelectedGroups()) {
|
||||
removeGroup(item.getGroupId());
|
||||
}
|
||||
|
||||
groupListAdapter.finishEditing();
|
||||
})
|
||||
.setNegativeButton(R.string.no, (d, w) -> {})
|
||||
.show();
|
||||
}
|
||||
|
||||
public void removeGroup(String group) {
|
||||
SettingsUtil.removeGroup(requireContext(), group);
|
||||
groupListAdapter.remove(group);
|
||||
}
|
||||
|
||||
public void renameGroup(String group, String newName) {
|
||||
SettingsUtil.setGroupName(requireContext(), group, newName);
|
||||
groupListAdapter.update(group);
|
||||
}
|
||||
|
||||
public boolean isEditing() {
|
||||
return groupListAdapter.isEditing();
|
||||
}
|
||||
|
||||
public void finishEditing() {
|
||||
groupListAdapter.finishEditing();
|
||||
}
|
||||
|
||||
public boolean hasSelectedMultipleItems() {
|
||||
return groupListAdapter.getSelectedGroups().size() > 1;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onDestroyView() {
|
||||
super.onDestroyView();
|
||||
this.binding = null;
|
||||
}
|
||||
|
||||
}
|
@ -67,7 +67,7 @@ public class OTPDatabase {
|
||||
|
||||
public static void promptLoadDatabase(Activity ctx, Runnable success, Runnable failure) {
|
||||
if(isDatabaseLoaded()) {
|
||||
success.run();
|
||||
if(success != null) success.run();
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -1,24 +0,0 @@
|
||||
<menu xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||
xmlns:tools="http://schemas.android.com/tools"
|
||||
tools:context="com.cringe_studios.cringe_authenticator.MainActivity">
|
||||
<item
|
||||
android:id="@+id/action_new_group"
|
||||
android:orderInCategory="100"
|
||||
android:icon="@drawable/baseline_add_24"
|
||||
android:title="@string/action_new_group"
|
||||
android:onClick="addGroup"
|
||||
app:showAsAction="ifRoom" />
|
||||
<item
|
||||
android:id="@+id/action_settings"
|
||||
android:orderInCategory="100"
|
||||
android:title="@string/action_settings"
|
||||
app:showAsAction="never"
|
||||
android:onClick="openSettings" />
|
||||
<item
|
||||
android:id="@+id/action_about"
|
||||
android:orderInCategory="100"
|
||||
android:title="@string/action_about"
|
||||
app:showAsAction="never"
|
||||
android:onClick="openAbout" />
|
||||
</menu>
|
@ -1,38 +0,0 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<menu xmlns:tools="http://schemas.android.com/tools"
|
||||
xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:app="http://schemas.android.com/apk/res-auto">
|
||||
<item
|
||||
android:id="@+id/action_new_group"
|
||||
android:orderInCategory="100"
|
||||
android:icon="@drawable/baseline_add_24"
|
||||
android:title="@string/action_new_group"
|
||||
android:onClick="addGroup"
|
||||
app:showAsAction="always" />
|
||||
<item
|
||||
android:id="@+id/action_edit_group"
|
||||
android:orderInCategory="100"
|
||||
android:icon="@drawable/baseline_edit_24"
|
||||
android:title="Edit Group"
|
||||
android:onClick="editGroup"
|
||||
app:showAsAction="always" />
|
||||
<item
|
||||
android:id="@+id/action_delete_group"
|
||||
android:orderInCategory="100"
|
||||
android:icon="@drawable/baseline_delete_24"
|
||||
android:title="Delete Group"
|
||||
android:onClick="deleteGroup"
|
||||
app:showAsAction="always" />
|
||||
<item
|
||||
android:id="@+id/action_settings"
|
||||
android:orderInCategory="100"
|
||||
android:title="@string/action_settings"
|
||||
app:showAsAction="never"
|
||||
android:onClick="openSettings" />
|
||||
<item
|
||||
android:id="@+id/action_about"
|
||||
android:orderInCategory="100"
|
||||
android:title="@string/action_about"
|
||||
app:showAsAction="never"
|
||||
android:onClick="openAbout" />
|
||||
</menu>
|
@ -14,4 +14,10 @@
|
||||
android:title="@string/action_about"
|
||||
app:showAsAction="never"
|
||||
android:onClick="openAbout" />
|
||||
<item
|
||||
android:id="@+id/action_lock"
|
||||
android:orderInCategory="100"
|
||||
android:title="Lock"
|
||||
app:showAsAction="never"
|
||||
android:onClick="lockApp" />
|
||||
</menu>
|
@ -20,4 +20,10 @@
|
||||
android:title="@string/action_about"
|
||||
app:showAsAction="never"
|
||||
android:onClick="openAbout" />
|
||||
<item
|
||||
android:id="@+id/action_lock"
|
||||
android:orderInCategory="100"
|
||||
android:title="Lock"
|
||||
app:showAsAction="never"
|
||||
android:onClick="lockApp" />
|
||||
</menu>
|
@ -41,4 +41,10 @@
|
||||
android:title="@string/action_about"
|
||||
app:showAsAction="never"
|
||||
android:onClick="openAbout" />
|
||||
<item
|
||||
android:id="@+id/action_lock"
|
||||
android:orderInCategory="100"
|
||||
android:title="Lock"
|
||||
app:showAsAction="never"
|
||||
android:onClick="lockApp" />
|
||||
</menu>
|
Loading…
Reference in New Issue
Block a user