From 66b92bb0b188321d5dfddc015f1f87fed035e3b7 Mon Sep 17 00:00:00 2001 From: pokkst Date: Thu, 8 Sep 2022 23:18:09 -0500 Subject: [PATCH] Add button in settings to display recovery seed --- .../com/m2049r/xmrwallet/MainActivity.java | 3 +- .../dialog/InformationBottomSheetDialog.java | 46 +++++++++++++++++++ .../dialog/PasswordBottomSheetDialog.java | 6 +-- .../fragment/settings/SettingsFragment.java | 38 ++++++++++++++- .../com/m2049r/xmrwallet/util/Helper.java | 10 ++-- .../res/drawable/ic_content_copy_24dp.xml | 2 +- app/src/main/res/layout/fragment_settings.xml | 28 +++++++++-- .../information_bottom_sheet_dialog.xml | 44 ++++++++++++++++++ app/src/main/res/values/strings.xml | 2 + 9 files changed, 162 insertions(+), 17 deletions(-) create mode 100644 app/src/main/java/com/m2049r/xmrwallet/fragment/dialog/InformationBottomSheetDialog.java create mode 100644 app/src/main/res/layout/information_bottom_sheet_dialog.xml diff --git a/app/src/main/java/com/m2049r/xmrwallet/MainActivity.java b/app/src/main/java/com/m2049r/xmrwallet/MainActivity.java index c7e7482..d59d95f 100644 --- a/app/src/main/java/com/m2049r/xmrwallet/MainActivity.java +++ b/app/src/main/java/com/m2049r/xmrwallet/MainActivity.java @@ -48,9 +48,8 @@ public class MainActivity extends AppCompatActivity implements MoneroHandlerThre init(walletFile, ""); } else { PasswordBottomSheetDialog passwordDialog = new PasswordBottomSheetDialog(); - passwordDialog.setCancelable(false); passwordDialog.listener = this; - passwordDialog.show(getSupportFragmentManager(), null); + passwordDialog.show(getSupportFragmentManager(), "password_dialog"); } } else { navigate(R.id.onboarding_fragment); diff --git a/app/src/main/java/com/m2049r/xmrwallet/fragment/dialog/InformationBottomSheetDialog.java b/app/src/main/java/com/m2049r/xmrwallet/fragment/dialog/InformationBottomSheetDialog.java new file mode 100644 index 0000000..66db6ec --- /dev/null +++ b/app/src/main/java/com/m2049r/xmrwallet/fragment/dialog/InformationBottomSheetDialog.java @@ -0,0 +1,46 @@ +package com.m2049r.xmrwallet.fragment.dialog; + +import android.os.Bundle; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.Button; +import android.widget.EditText; +import android.widget.ImageButton; +import android.widget.TextView; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; + +import com.google.android.material.bottomsheet.BottomSheetDialogFragment; +import com.m2049r.xmrwallet.R; +import com.m2049r.xmrwallet.model.Wallet; +import com.m2049r.xmrwallet.model.WalletManager; +import com.m2049r.xmrwallet.util.Constants; +import com.m2049r.xmrwallet.util.Helper; + +import java.io.File; + +public class InformationBottomSheetDialog extends BottomSheetDialogFragment { + public boolean showCopyButton = false; + public String information = ""; + + @Override + public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { + return inflater.inflate(R.layout.information_bottom_sheet_dialog, null); + } + + @Override + public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { + super.onViewCreated(view, savedInstanceState); + ImageButton copyInformationImageButton = view.findViewById(R.id.copy_information_imagebutton); + if(showCopyButton) { + copyInformationImageButton.setVisibility(View.VISIBLE); + } else { + copyInformationImageButton.setVisibility(View.INVISIBLE); + } + TextView informationTextView = view.findViewById(R.id.information_textview); + informationTextView.setText(information); + copyInformationImageButton.setOnClickListener(view1 -> Helper.clipBoardCopy(getContext(), "information", information)); + } +} \ No newline at end of file diff --git a/app/src/main/java/com/m2049r/xmrwallet/fragment/dialog/PasswordBottomSheetDialog.java b/app/src/main/java/com/m2049r/xmrwallet/fragment/dialog/PasswordBottomSheetDialog.java index cad71e0..bff9d22 100644 --- a/app/src/main/java/com/m2049r/xmrwallet/fragment/dialog/PasswordBottomSheetDialog.java +++ b/app/src/main/java/com/m2049r/xmrwallet/fragment/dialog/PasswordBottomSheetDialog.java @@ -37,6 +37,7 @@ public class PasswordBottomSheetDialog extends BottomSheetDialogFragment { @Override public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); + setCancelable(false); File walletFile = new File(getActivity().getApplicationInfo().dataDir, Constants.WALLET_NAME); ImageButton pastePasswordImageButton = view.findViewById(R.id.paste_password_imagebutton); @@ -60,10 +61,7 @@ public class PasswordBottomSheetDialog extends BottomSheetDialogFragment { } private boolean checkPassword(File walletFile, String password) { - Wallet wallet = WalletManager.getInstance().openWallet(walletFile.getAbsolutePath(), password); - boolean ok = wallet.getStatus().isOk(); - wallet.close(); - return ok; + return WalletManager.getInstance().verifyWalletPasswordOnly(walletFile.getAbsolutePath() + ".keys", password); } public interface PasswordListener { diff --git a/app/src/main/java/com/m2049r/xmrwallet/fragment/settings/SettingsFragment.java b/app/src/main/java/com/m2049r/xmrwallet/fragment/settings/SettingsFragment.java index c109e61..439752a 100644 --- a/app/src/main/java/com/m2049r/xmrwallet/fragment/settings/SettingsFragment.java +++ b/app/src/main/java/com/m2049r/xmrwallet/fragment/settings/SettingsFragment.java @@ -4,8 +4,10 @@ import android.os.Bundle; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; +import android.widget.Button; import android.widget.CompoundButton; import android.widget.TextView; +import android.widget.Toast; import androidx.annotation.NonNull; import androidx.annotation.Nullable; @@ -14,13 +16,17 @@ import androidx.fragment.app.Fragment; import androidx.lifecycle.ViewModelProvider; import com.m2049r.xmrwallet.R; +import com.m2049r.xmrwallet.fragment.dialog.InformationBottomSheetDialog; +import com.m2049r.xmrwallet.fragment.dialog.PasswordBottomSheetDialog; import com.m2049r.xmrwallet.model.Wallet; import com.m2049r.xmrwallet.model.WalletManager; import com.m2049r.xmrwallet.service.BlockchainService; +import com.m2049r.xmrwallet.service.PrefService; +import com.m2049r.xmrwallet.util.Constants; import com.m2049r.xmrwallet.util.DayNightMode; import com.m2049r.xmrwallet.util.NightmodeHelper; -public class SettingsFragment extends Fragment { +public class SettingsFragment extends Fragment implements PasswordBottomSheetDialog.PasswordListener { private SettingsViewModel mViewModel; @@ -36,11 +42,11 @@ public class SettingsFragment extends Fragment { mViewModel = new ViewModelProvider(this).get(SettingsViewModel.class); Wallet wallet = WalletManager.getInstance().getWallet(); + Button displaySeedButton = view.findViewById(R.id.display_seed_button); TextView walletInfoTextView = view.findViewById(R.id.wallet_info_textview); SwitchCompat nightModeSwitch = view.findViewById(R.id.day_night_switch); StringBuilder stringBuilder = new StringBuilder(); - stringBuilder.append("Seed: " + wallet.getSeed("")+"\n\n"); stringBuilder.append("Private view-key: " + wallet.getSecretViewKey()+"\n\n"); stringBuilder.append("Restore height: " + wallet.getRestoreHeight() + "\n\n"); stringBuilder.append("Wallet height: " + wallet.getBlockChainHeight() + "\n\n"); @@ -55,5 +61,33 @@ public class SettingsFragment extends Fragment { NightmodeHelper.setAndSavePreferredNightmode(getContext(), DayNightMode.DAY); } }); + + displaySeedButton.setOnClickListener(view1 -> { + boolean usesPassword = PrefService.getInstance().getBoolean(Constants.PREF_USES_PASSWORD, false); + if(usesPassword) { + PasswordBottomSheetDialog passwordDialog = new PasswordBottomSheetDialog(); + passwordDialog.listener = this; + passwordDialog.show(getActivity().getSupportFragmentManager(), "password_dialog"); + } else { + displaySeedDialog(); + } + }); + } + + private void displaySeedDialog() { + InformationBottomSheetDialog informationDialog = new InformationBottomSheetDialog(); + informationDialog.showCopyButton = true; + informationDialog.information = WalletManager.getInstance().getWallet().getSeed(""); + informationDialog.show(getActivity().getSupportFragmentManager(), "information_seed_dialog"); + } + + @Override + public void onPasswordSuccess(String password) { + displaySeedDialog(); + } + + @Override + public void onPasswordFail() { + Toast.makeText(getContext(), R.string.bad_password, Toast.LENGTH_SHORT).show(); } } \ No newline at end of file diff --git a/app/src/main/java/com/m2049r/xmrwallet/util/Helper.java b/app/src/main/java/com/m2049r/xmrwallet/util/Helper.java index a1b2078..d6532eb 100644 --- a/app/src/main/java/com/m2049r/xmrwallet/util/Helper.java +++ b/app/src/main/java/com/m2049r/xmrwallet/util/Helper.java @@ -39,6 +39,7 @@ import android.view.WindowManager; import android.view.animation.Animation; import android.view.animation.AnimationUtils; import android.view.inputmethod.InputMethodManager; +import android.widget.Toast; import androidx.appcompat.app.AlertDialog; import androidx.core.content.ContextCompat; @@ -244,9 +245,12 @@ public class Helper { } static public void clipBoardCopy(Context context, String label, String text) { - ClipboardManager clipboardManager = (ClipboardManager) context.getSystemService(Context.CLIPBOARD_SERVICE); - ClipData clip = ClipData.newPlainText(label, text); - clipboardManager.setPrimaryClip(clip); + if(context != null) { + ClipboardManager clipboardManager = (ClipboardManager) context.getSystemService(Context.CLIPBOARD_SERVICE); + ClipData clip = ClipData.newPlainText(label, text); + clipboardManager.setPrimaryClip(clip); + Toast.makeText(context, context.getText(R.string.copied_to_clipboard), Toast.LENGTH_SHORT).show(); + } } static public String getClipBoardText(Context context) { diff --git a/app/src/main/res/drawable/ic_content_copy_24dp.xml b/app/src/main/res/drawable/ic_content_copy_24dp.xml index 1ba50d3..7c67aeb 100644 --- a/app/src/main/res/drawable/ic_content_copy_24dp.xml +++ b/app/src/main/res/drawable/ic_content_copy_24dp.xml @@ -4,6 +4,6 @@ android:viewportWidth="24.0" android:viewportHeight="24.0"> diff --git a/app/src/main/res/layout/fragment_settings.xml b/app/src/main/res/layout/fragment_settings.xml index 7763bcf..c4e8a19 100644 --- a/app/src/main/res/layout/fragment_settings.xml +++ b/app/src/main/res/layout/fragment_settings.xml @@ -16,11 +16,31 @@ app:layout_constraintTop_toTopOf="parent" app:layout_constraintStart_toStartOf="parent"/> +