diff --git a/app/src/main/java/com/m2049r/xmrwallet/LoginFragment.java b/app/src/main/java/com/m2049r/xmrwallet/LoginFragment.java index abc0e6854..ec523dcc8 100644 --- a/app/src/main/java/com/m2049r/xmrwallet/LoginFragment.java +++ b/app/src/main/java/com/m2049r/xmrwallet/LoginFragment.java @@ -325,33 +325,46 @@ private void setFabOpen(boolean value) { } public void animateFAB() { + // NOTE: Without `fabX.setVisibility(View.VISIBLE)`, the code `fabX.setClickable(true)` does not work. + // Please update the future buttons with the above code for better accessibility. if (isFabOpen()) { // close the fab fabScreen.setClickable(false); + fabScreen.setVisibility(View.INVISIBLE); fabScreen.startAnimation(fab_close_screen); fab.startAnimation(rotate_backward); + fab.setContentDescription(getString(R.string.fab_create_or_restore)); if (fabLedgerL.getVisibility() == View.VISIBLE) { fabLedgerL.startAnimation(fab_close); fabLedger.setClickable(false); + fabLedger.setVisibility(View.INVISIBLE); } else if (fabSidekickL.getVisibility() == View.VISIBLE) { fabSidekickL.startAnimation(fab_close); fabSidekick.setClickable(false); + fabSidekick.setVisibility(View.INVISIBLE); } else { fabNewL.startAnimation(fab_close); fabNew.setClickable(false); + fabNew.setVisibility(View.INVISIBLE); fabViewL.startAnimation(fab_close); fabView.setClickable(false); + fabView.setVisibility(View.INVISIBLE); fabKeyL.startAnimation(fab_close); fabKey.setClickable(false); + fabKey.setVisibility(View.INVISIBLE); fabSeedL.startAnimation(fab_close); fabSeed.setClickable(false); + fabSeed.setVisibility(View.INVISIBLE); fabImportL.startAnimation(fab_close); fabImport.setClickable(false); + fabImport.setVisibility(View.INVISIBLE); } setFabOpen(false); } else { // open the fab fabScreen.setClickable(true); + fabScreen.setVisibility(View.VISIBLE);; fabScreen.startAnimation(fab_open_screen); fab.startAnimation(rotate_forward); + fab.setContentDescription(getString(R.string.fab_close)); if ((activityCallback.hasDevice(Wallet.Device.Ledger) || activityCallback.hasDevice(Wallet.Device.Sidekick))) { fabNewL.setVisibility(View.GONE); @@ -364,10 +377,12 @@ public void animateFAB() { fabLedgerL.setVisibility(View.VISIBLE); fabLedgerL.startAnimation(fab_open); fabLedger.setClickable(true); + fabLedger.setVisibility(View.VISIBLE); } else { // Sidekick fabSidekickL.setVisibility(View.VISIBLE); fabSidekickL.startAnimation(fab_open); fabSidekick.setClickable(true); + fabSidekick.setVisibility(View.VISIBLE); } } else { fabSidekickL.setVisibility(View.GONE); @@ -380,14 +395,19 @@ public void animateFAB() { fabNewL.startAnimation(fab_open); fabNew.setClickable(true); + fabNew.setVisibility(View.VISIBLE); fabViewL.startAnimation(fab_open); fabView.setClickable(true); + fabView.setVisibility(View.VISIBLE); fabKeyL.startAnimation(fab_open); fabKey.setClickable(true); + fabKey.setVisibility(View.VISIBLE); fabSeedL.startAnimation(fab_open); fabSeed.setClickable(true); + fabSeed.setVisibility(View.VISIBLE); fabImportL.startAnimation(fab_open); fabImport.setClickable(true); + fabImport.setVisibility(View.VISIBLE); } setFabOpen(true); } diff --git a/app/src/main/java/com/m2049r/xmrwallet/NodeFragment.java b/app/src/main/java/com/m2049r/xmrwallet/NodeFragment.java index e6e6272c8..3701da6d8 100644 --- a/app/src/main/java/com/m2049r/xmrwallet/NodeFragment.java +++ b/app/src/main/java/com/m2049r/xmrwallet/NodeFragment.java @@ -181,7 +181,7 @@ public View onCreateView(LayoutInflater inflater, ViewGroup container, Helper.hideKeyboard(getActivity()); nodeList = new HashSet<>(activityCallback.getFavouriteNodes()); - nodesAdapter.setNodes(nodeList); + nodesAdapter.setNodes(nodeList, getContext()); ViewGroup llNotice = view.findViewById(R.id.llNotice); Notice.showAll(llNotice, ".*_nodes"); @@ -266,7 +266,7 @@ private class AsyncFindNodes extends AsyncTask protected void onPreExecute() { super.onPreExecute(); filterFavourites(); - nodesAdapter.setNodes(null); + nodesAdapter.setNodes(null, getContext()); nodesAdapter.allowClick(false); tvPull.setText(getString(R.string.node_scanning)); } @@ -334,7 +334,7 @@ protected void onProgressUpdate(NodeInfo... values) { if (values != null) nodesAdapter.addNode(values[0]); else - nodesAdapter.setNodes(null); + nodesAdapter.setNodes(null, getContext()); } @Override @@ -356,7 +356,7 @@ private void complete() { //if (isCancelled()) return; tvPull.setText(getString(R.string.node_pull_hint)); pullToRefresh.setRefreshing(false); - nodesAdapter.setNodes(nodeList); + nodesAdapter.setNodes(nodeList, getContext()); nodesAdapter.allowClick(true); updateRefreshElements(); } diff --git a/app/src/main/java/com/m2049r/xmrwallet/WalletActivity.java b/app/src/main/java/com/m2049r/xmrwallet/WalletActivity.java index 365090bff..1bc8074e6 100644 --- a/app/src/main/java/com/m2049r/xmrwallet/WalletActivity.java +++ b/app/src/main/java/com/m2049r/xmrwallet/WalletActivity.java @@ -384,7 +384,7 @@ protected void onCreate(Bundle savedInstanceState) { }); drawer = findViewById(R.id.drawer_layout); - drawerToggle = new ActionBarDrawerToggle(this, drawer, toolbar, 0, 0); + drawerToggle = new ActionBarDrawerToggle(this, drawer, toolbar, R.string.open_drawer, R.string.close_drawer); drawer.addDrawerListener(drawerToggle); drawerToggle.syncState(); setDrawerEnabled(false); // disable until synced diff --git a/app/src/main/java/com/m2049r/xmrwallet/data/Node.java b/app/src/main/java/com/m2049r/xmrwallet/data/Node.java index 76e0cc115..d0b490093 100644 --- a/app/src/main/java/com/m2049r/xmrwallet/data/Node.java +++ b/app/src/main/java/com/m2049r/xmrwallet/data/Node.java @@ -255,6 +255,10 @@ public String toString() { return sb.toString(); } + public String toNameString() { + return name; + } + public Node() { this.networkType = WalletManager.getInstance().getNetworkType(); } diff --git a/app/src/main/java/com/m2049r/xmrwallet/data/NodeInfo.java b/app/src/main/java/com/m2049r/xmrwallet/data/NodeInfo.java index f9026cb51..f9bff4170 100644 --- a/app/src/main/java/com/m2049r/xmrwallet/data/NodeInfo.java +++ b/app/src/main/java/com/m2049r/xmrwallet/data/NodeInfo.java @@ -178,6 +178,10 @@ public String toString() { return sb.toString(); } + public String toNameString() { + return super.toNameString(); + } + private static final int HTTP_TIMEOUT = 1000; //ms public static final double PING_GOOD = HTTP_TIMEOUT / 3.0; //ms public static final double PING_MEDIUM = 2 * PING_GOOD; //ms diff --git a/app/src/main/java/com/m2049r/xmrwallet/layout/NodeInfoAdapter.java b/app/src/main/java/com/m2049r/xmrwallet/layout/NodeInfoAdapter.java index baae49e18..3153abe95 100644 --- a/app/src/main/java/com/m2049r/xmrwallet/layout/NodeInfoAdapter.java +++ b/app/src/main/java/com/m2049r/xmrwallet/layout/NodeInfoAdapter.java @@ -52,6 +52,8 @@ public interface OnInteractionListener { private final FragmentActivity activity; + private Context context; + public NodeInfoAdapter(FragmentActivity activity, OnInteractionListener listener) { this.activity = activity; this.listener = listener; @@ -107,10 +109,11 @@ public void addNode(NodeInfo node) { List newItems = new ArrayList<>(nodeItems); if (!nodeItems.contains(node)) newItems.add(node); - setNodes(newItems); // in case the nodeinfo has changed + setNodes(newItems, context); // in case the nodeinfo has changed } - public void setNodes(Collection newItemsCollection) { + public void setNodes(Collection newItemsCollection, Context iContext) { + context = iContext; List newItems; if (newItemsCollection != null) { newItems = new ArrayList<>(newItemsCollection); @@ -126,7 +129,7 @@ public void setNodes(Collection newItemsCollection) { } public void setNodes() { - setNodes(nodeItems); + setNodes(nodeItems, context); } private boolean itemsClickable = true; @@ -156,7 +159,7 @@ class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener showStar(); if (!nodeItem.isFavourite()) { nodeItem.setSelected(false); - setNodes(nodeItems); + setNodes(nodeItems, context); } }); itemView.setOnClickListener(this); @@ -166,8 +169,10 @@ class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener private void showStar() { if (nodeItem.isFavourite()) { ibBookmark.setImageResource(R.drawable.ic_favorite_24dp); + ibBookmark.setContentDescription(context.getString(R.string.node_remove_favourite).replace("%1$", nodeItem.toNameString())); } else { ibBookmark.setImageResource(R.drawable.ic_favorite_border_24dp); + ibBookmark.setContentDescription(context.getString(R.string.node_add_favourite).replace("%1$", nodeItem.toNameString())); } } diff --git a/app/src/main/res/layout/layout_fabmenu.xml b/app/src/main/res/layout/layout_fabmenu.xml index 88f846123..ac8b9d382 100644 --- a/app/src/main/res/layout/layout_fabmenu.xml +++ b/app/src/main/res/layout/layout_fabmenu.xml @@ -13,14 +13,18 @@ android:alpha="0.93" android:background="?android:attr/colorBackground" android:focusable="true" - android:visibility="invisible"> + android:visibility="invisible" + android:contentDescription="@string/fab_addition_options_menu" + > + android:layout_alignEnd="@id/fabImportL" + android:contentDescription="@string/fab_create_new" + > + app:pressedTranslationZ="12dp" + /> @@ -54,7 +60,9 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_above="@id/fabKeyL" - android:layout_alignEnd="@id/fabImportL"> + android:layout_alignEnd="@id/fabImportL" + android:contentDescription="@string/fab_restore_viewonly" + > + app:pressedTranslationZ="12dp" + /> @@ -85,7 +95,9 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_above="@id/fabSeedL" - android:layout_alignEnd="@id/fabImportL"> + android:layout_alignEnd="@id/fabImportL" + android:contentDescription="@string/fab_restore_key" + > @@ -116,7 +129,9 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_above="@id/fabImportL" - android:layout_alignEnd="@id/fabImportL"> + android:layout_alignEnd="@id/fabImportL" + android:contentDescription="@string/fab_restore_seed" + > @@ -147,7 +163,9 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentEnd="true" - android:layout_alignParentBottom="true"> + android:layout_alignParentBottom="true" + android:contentDescription="@string/menu_restore" + > @@ -201,6 +220,7 @@ android:layout_toEndOf="@+id/fabLedgerT" android:elevation="6dp" android:src="@drawable/ic_ledger_restore" + android:contentDescription="@string/fab_restore_ledger" app:borderWidth="0dp" app:fabSize="mini" app:pressedTranslationZ="12dp" /> @@ -258,7 +278,7 @@ android:layout_gravity="bottom|end" android:backgroundTint="@android:color/transparent" android:backgroundTintMode="src_in" - android:contentDescription="@string/fab_create_new" + android:contentDescription="@string/fab_create_or_restore" android:src="@drawable/ic_add" app:borderWidth="0dp" app:elevation="0dp" diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index d71e1615c..5b53af834 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -286,14 +286,19 @@ Yes, do that! No thanks! + Create or restore wallet + Close wallet addition options menu Create new wallet Restore view-only wallet Restore wallet from private keys Restore wallet 25 word seed + Wallet addition options menu %1$s XMR (%1$d, %2$d)  <span style=\"background-color: #%3$s; color: #%4$s;\"> %5$s </span> + Open accounts drawer + Close accounts drawer Create Account Added new account #%1$d Account # @@ -353,6 +358,8 @@ Scanning network… Automatically bookmarked best %1$d nodes Test + Save %1$ node + Remove saved %1$ node Receiver