From d22fdfe2dc657d987c8e962860ab68c341027d1d Mon Sep 17 00:00:00 2001
From: m2049r <m2049r@monerujo.io>
Date: Tue, 13 Aug 2024 17:28:04 +0200
Subject: [PATCH 1/2] Sidekick Support for Monerokon

---
 .gitignore                                    |   8 +-
 app/build.gradle                              |  14 +-
 app/src/main/AndroidManifest.xml              |   5 +
 app/src/main/cpp/monerujo.cpp                 |  92 ++-
 app/src/main/cpp/monerujo.h                   |  48 +-
 app/src/main/ic_launcher-playstore.png        | Bin 0 -> 13511 bytes
 .../com/m2049r/xmrwallet/BaseActivity.java    |  96 ++-
 .../m2049r/xmrwallet/BluetoothFragment.java   | 326 +++++++++
 .../m2049r/xmrwallet/GenerateFragment.java    |  38 +-
 .../xmrwallet/GenerateReviewFragment.java     |   7 +-
 .../com/m2049r/xmrwallet/LoginActivity.java   | 126 ++--
 .../com/m2049r/xmrwallet/LoginFragment.java   |  43 +-
 .../xmrwallet/SidekickConnectFragment.java    | 172 +++++
 .../m2049r/xmrwallet/SubaddressFragment.java  |   2 +-
 .../com/m2049r/xmrwallet/WalletActivity.java  |  93 +--
 .../xmrwallet/XmrWalletApplication.java       |   9 +-
 .../m2049r/xmrwallet/data/BluetoothInfo.java  |  42 ++
 .../layout/BluetoothInfoAdapter.java          | 147 ++++
 .../layout/TransactionInfoAdapter.java        |   2 +-
 .../com/m2049r/xmrwallet/ledger/Hardware.java |   4 +
 .../com/m2049r/xmrwallet/ledger/Ledger.java   |   3 +-
 .../com/m2049r/xmrwallet/model/Wallet.java    |   6 +-
 .../m2049r/xmrwallet/model/WalletManager.java |   9 +-
 .../onboarding/OnBoardingManager.java         |   2 +
 .../xmrwallet/service/BluetoothService.java   | 662 ++++++++++++++++++
 .../service/MoneroHandlerThread.java          |   2 +-
 .../com/m2049r/xmrwallet/util/Flasher.java    |  65 ++
 .../drawable-v24/ic_launcher_foreground.xml   |  32 +
 app/src/main/res/drawable/ic_bluetooth_24.xml |  10 +
 .../drawable/ic_bluetooth_connected_24.xml    |  10 +
 .../res/drawable/ic_bluetooth_disabled_24.xml |  10 +
 .../drawable/ic_bluetooth_searching_24.xml    |  11 +
 .../res/drawable/ic_launcher_background.xml   |  97 ++-
 .../res/drawable/ic_launcher_foreground.xml   |  12 -
 .../main/res/drawable/ic_sidekick_restore.xml |  10 +
 app/src/main/res/layout/activity_sidekick.xml |  33 +
 app/src/main/res/layout/activity_wallet.xml   |   5 +
 .../main/res/layout/bluetooth_device_name.xml |  18 +
 .../main/res/layout/fragment_bluetooth.xml    |  50 ++
 app/src/main/res/layout/fragment_login.xml    | 169 ++---
 app/src/main/res/layout/fragment_sidekick.xml |  82 +++
 .../res/layout/fragment_sidekick_connect.xml  |  40 ++
 app/src/main/res/layout/item_bluetooth.xml    |  39 ++
 app/src/main/res/layout/layout_fabmenu.xml    |  55 +-
 .../main/res/menu/create_wallet_ledger.xml    |   2 +-
 .../main/res/menu/create_wallet_sidekick.xml  |  12 +
 app/src/main/res/menu/list_menu.xml           |   6 +
 .../main/res/menu/sidekick_connect_menu.xml   |  10 +
 app/src/main/res/mipmap-hdpi/ic_launcher.png  | Bin 2667 -> 0 bytes
 app/src/main/res/mipmap-hdpi/ic_launcher.webp | Bin 0 -> 1724 bytes
 .../res/mipmap-hdpi/ic_launcher_round.png     | Bin 4325 -> 0 bytes
 .../res/mipmap-hdpi/ic_launcher_round.webp    | Bin 0 -> 3578 bytes
 app/src/main/res/mipmap-mdpi/ic_launcher.png  | Bin 1917 -> 0 bytes
 app/src/main/res/mipmap-mdpi/ic_launcher.webp | Bin 0 -> 1388 bytes
 .../res/mipmap-mdpi/ic_launcher_round.png     | Bin 2800 -> 0 bytes
 .../res/mipmap-mdpi/ic_launcher_round.webp    | Bin 0 -> 2390 bytes
 app/src/main/res/mipmap-xhdpi/ic_launcher.png | Bin 3701 -> 0 bytes
 .../main/res/mipmap-xhdpi/ic_launcher.webp    | Bin 0 -> 2486 bytes
 .../res/mipmap-xhdpi/ic_launcher_round.png    | Bin 6277 -> 0 bytes
 .../res/mipmap-xhdpi/ic_launcher_round.webp   | Bin 0 -> 5178 bytes
 .../main/res/mipmap-xxhdpi/ic_launcher.png    | Bin 5431 -> 0 bytes
 .../main/res/mipmap-xxhdpi/ic_launcher.webp   | Bin 0 -> 3050 bytes
 .../res/mipmap-xxhdpi/ic_launcher_round.png   | Bin 9265 -> 0 bytes
 .../res/mipmap-xxhdpi/ic_launcher_round.webp  | Bin 0 -> 7206 bytes
 .../main/res/mipmap-xxxhdpi/ic_launcher.png   | Bin 7132 -> 0 bytes
 .../main/res/mipmap-xxxhdpi/ic_launcher.webp  | Bin 0 -> 5614 bytes
 .../res/mipmap-xxxhdpi/ic_launcher_round.png  | Bin 13045 -> 0 bytes
 .../res/mipmap-xxxhdpi/ic_launcher_round.webp | Bin 0 -> 9770 bytes
 app/src/main/res/values-cat/help.xml          |  33 +
 app/src/main/res/values-cat/strings.xml       |  13 +
 app/src/main/res/values-de/help.xml           |  33 +
 app/src/main/res/values-de/strings.xml        |  13 +
 app/src/main/res/values-el/help.xml           |  33 +
 app/src/main/res/values-el/strings.xml        |  13 +
 app/src/main/res/values-eo/help.xml           |  33 +
 app/src/main/res/values-eo/strings.xml        |  13 +
 app/src/main/res/values-es/help.xml           |  42 +-
 app/src/main/res/values-es/strings.xml        |  13 +
 app/src/main/res/values-et/help.xml           |  33 +
 app/src/main/res/values-et/strings.xml        |  13 +
 app/src/main/res/values-fa/help.xml           |  33 +
 app/src/main/res/values-fa/strings.xml        |  13 +
 app/src/main/res/values-fr/help.xml           |  33 +
 app/src/main/res/values-fr/strings.xml        |  13 +
 app/src/main/res/values-he/help.xml           |  33 +
 app/src/main/res/values-he/strings.xml        |  13 +
 app/src/main/res/values-hu/help.xml           |  33 +
 app/src/main/res/values-hu/strings.xml        |  13 +
 app/src/main/res/values-it/help.xml           |  33 +
 app/src/main/res/values-it/strings.xml        |  13 +
 app/src/main/res/values-ja/help.xml           |  33 +
 app/src/main/res/values-ja/strings.xml        |  13 +
 app/src/main/res/values-nb/help.xml           |  33 +
 app/src/main/res/values-nb/strings.xml        |  13 +
 app/src/main/res/values-nl/help.xml           |  33 +
 app/src/main/res/values-nl/strings.xml        |  13 +
 app/src/main/res/values-pt-rBR/help.xml       |  33 +
 app/src/main/res/values-pt-rBR/strings.xml    |  13 +
 app/src/main/res/values-pt/help.xml           |  33 +
 app/src/main/res/values-pt/strings.xml        |  13 +
 app/src/main/res/values-ro/help.xml           |  33 +
 app/src/main/res/values-ro/strings.xml        |  13 +
 app/src/main/res/values-ru/help.xml           |  33 +
 app/src/main/res/values-ru/strings.xml        |  13 +
 app/src/main/res/values-sk/help.xml           |  33 +
 app/src/main/res/values-sk/strings.xml        |  13 +
 app/src/main/res/values-sr/help.xml           |  33 +
 app/src/main/res/values-sr/strings.xml        |  13 +
 app/src/main/res/values-sv/help.xml           |  33 +
 app/src/main/res/values-sv/strings.xml        |  13 +
 app/src/main/res/values-ta/help.xml           |  33 +
 app/src/main/res/values-ta/strings.xml        |  13 +
 app/src/main/res/values-uk/help.xml           |  33 +
 app/src/main/res/values-uk/strings.xml        |  13 +
 app/src/main/res/values-zh-rCN/help.xml       |  33 +
 app/src/main/res/values-zh-rCN/strings.xml    |  13 +
 app/src/main/res/values-zh-rTW/help.xml       |  33 +
 app/src/main/res/values-zh-rTW/strings.xml    |  13 +
 app/src/main/res/values/help.xml              |  47 +-
 app/src/main/res/values/strings.xml           |  31 +-
 app/src/main/res/values/styles.xml            |   3 +
 build.gradle                                  |   2 +-
 external-libs/Makefile                        |  12 +-
 external-libs/android32.Dockerfile            |  34 +-
 external-libs/android64.Dockerfile            |  34 +-
 external-libs/android64_x86.Dockerfile        |  34 +-
 gradle/wrapper/gradle-wrapper.properties      |   5 +-
 127 files changed, 3720 insertions(+), 377 deletions(-)
 create mode 100644 app/src/main/ic_launcher-playstore.png
 create mode 100644 app/src/main/java/com/m2049r/xmrwallet/BluetoothFragment.java
 create mode 100644 app/src/main/java/com/m2049r/xmrwallet/SidekickConnectFragment.java
 create mode 100644 app/src/main/java/com/m2049r/xmrwallet/data/BluetoothInfo.java
 create mode 100644 app/src/main/java/com/m2049r/xmrwallet/layout/BluetoothInfoAdapter.java
 create mode 100644 app/src/main/java/com/m2049r/xmrwallet/ledger/Hardware.java
 create mode 100644 app/src/main/java/com/m2049r/xmrwallet/service/BluetoothService.java
 create mode 100644 app/src/main/java/com/m2049r/xmrwallet/util/Flasher.java
 create mode 100644 app/src/main/res/drawable-v24/ic_launcher_foreground.xml
 create mode 100644 app/src/main/res/drawable/ic_bluetooth_24.xml
 create mode 100644 app/src/main/res/drawable/ic_bluetooth_connected_24.xml
 create mode 100644 app/src/main/res/drawable/ic_bluetooth_disabled_24.xml
 create mode 100644 app/src/main/res/drawable/ic_bluetooth_searching_24.xml
 delete mode 100644 app/src/main/res/drawable/ic_launcher_foreground.xml
 create mode 100644 app/src/main/res/drawable/ic_sidekick_restore.xml
 create mode 100644 app/src/main/res/layout/activity_sidekick.xml
 create mode 100644 app/src/main/res/layout/bluetooth_device_name.xml
 create mode 100644 app/src/main/res/layout/fragment_bluetooth.xml
 create mode 100644 app/src/main/res/layout/fragment_sidekick.xml
 create mode 100644 app/src/main/res/layout/fragment_sidekick_connect.xml
 create mode 100644 app/src/main/res/layout/item_bluetooth.xml
 create mode 100644 app/src/main/res/menu/create_wallet_sidekick.xml
 create mode 100644 app/src/main/res/menu/sidekick_connect_menu.xml
 delete mode 100644 app/src/main/res/mipmap-hdpi/ic_launcher.png
 create mode 100644 app/src/main/res/mipmap-hdpi/ic_launcher.webp
 delete mode 100644 app/src/main/res/mipmap-hdpi/ic_launcher_round.png
 create mode 100644 app/src/main/res/mipmap-hdpi/ic_launcher_round.webp
 delete mode 100644 app/src/main/res/mipmap-mdpi/ic_launcher.png
 create mode 100644 app/src/main/res/mipmap-mdpi/ic_launcher.webp
 delete mode 100644 app/src/main/res/mipmap-mdpi/ic_launcher_round.png
 create mode 100644 app/src/main/res/mipmap-mdpi/ic_launcher_round.webp
 delete mode 100644 app/src/main/res/mipmap-xhdpi/ic_launcher.png
 create mode 100644 app/src/main/res/mipmap-xhdpi/ic_launcher.webp
 delete mode 100644 app/src/main/res/mipmap-xhdpi/ic_launcher_round.png
 create mode 100644 app/src/main/res/mipmap-xhdpi/ic_launcher_round.webp
 delete mode 100644 app/src/main/res/mipmap-xxhdpi/ic_launcher.png
 create mode 100644 app/src/main/res/mipmap-xxhdpi/ic_launcher.webp
 delete mode 100644 app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png
 create mode 100644 app/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp
 delete mode 100644 app/src/main/res/mipmap-xxxhdpi/ic_launcher.png
 create mode 100644 app/src/main/res/mipmap-xxxhdpi/ic_launcher.webp
 delete mode 100644 app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png
 create mode 100644 app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp

diff --git a/.gitignore b/.gitignore
index dc61c4ff77..ed76356c25 100644
--- a/.gitignore
+++ b/.gitignore
@@ -8,12 +8,8 @@
 .DS_Store
 /app/build
 /app/release
-/app/alpha
-/app/prod
-/app/alphaMainnet
-/app/prodMainnet
-/app/alphaStagenet
-/app/prodStagenet
+/app/alpha*
+/app/prod*
 /app/.cxx
 /monerujo.id
 /external-libs/VERSION
diff --git a/app/build.gradle b/app/build.gradle
index ae17246d89..e6a60be301 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -8,8 +8,8 @@ android {
         compileSdk 34
         minSdkVersion 21
         targetSdkVersion 33
-        versionCode 3311
-        versionName "3.3.11 'Argentina'"
+        versionCode 4005
+        versionName "4.0.5 'Sidekick'"
         testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
         externalNativeBuild {
             cmake {
@@ -24,7 +24,7 @@ android {
         }
     }
 
-    flavorDimensions 'type', 'net'
+    flavorDimensions = ['type', 'net']
     productFlavors {
         mainnet {
             dimension 'net'
@@ -132,10 +132,10 @@ static def getId(name) {
 }
 
 dependencies {
-    implementation(platform("org.jetbrains.kotlin:kotlin-bom:1.8.0"))
+    implementation(platform("org.jetbrains.kotlin:kotlin-bom:1.8.22"))
 
-    implementation 'androidx.core:core:1.12.0'
-    implementation 'androidx.appcompat:appcompat:1.6.1'
+    implementation 'androidx.core:core:1.13.1'
+    implementation 'androidx.appcompat:appcompat:1.7.0'
     implementation 'androidx.legacy:legacy-support-v4:1.0.0'
     implementation 'androidx.recyclerview:recyclerview:1.3.2'
     implementation 'androidx.cardview:cardview:1.0.0'
@@ -143,7 +143,7 @@ dependencies {
     implementation 'androidx.constraintlayout:constraintlayout:2.1.4'
     implementation 'androidx.preference:preference:1.2.1'
 
-    implementation 'com.google.android.material:material:1.11.0'
+    implementation 'com.google.android.material:material:1.12.0'
 
     implementation 'me.dm7.barcodescanner:zxing:1.9.8'
     implementation "com.squareup.okhttp3:okhttp:4.12.0"
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index 4e0e0e1ef8..a592db59cb 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -5,6 +5,11 @@
         android:name="android.hardware.camera"
         android:required="false" />
 
+    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
+    <uses-permission android:name="android.permission.BLUETOOTH" />
+    <uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
+    <uses-permission android:name="android.permission.BLUETOOTH_CONNECT" />
+    <uses-permission android:name="android.permission.BLUETOOTH_SCAN" />
     <uses-permission android:name="android.permission.INTERNET" />
     <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
     <uses-permission android:name="android.permission.USE_FINGERPRINT" />
diff --git a/app/src/main/cpp/monerujo.cpp b/app/src/main/cpp/monerujo.cpp
index 773c8d5afd..4f3dd0ca51 100644
--- a/app/src/main/cpp/monerujo.cpp
+++ b/app/src/main/cpp/monerujo.cpp
@@ -1,5 +1,5 @@
 /**
- * Copyright (c) 2017 m2049r
+ * Copyright (c) 2017-2024 m2049r
  * <p>
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -18,8 +18,6 @@
 #include "monerujo.h"
 #include "wallet2_api.h"
 
-//TODO explicit casting jlong, jint, jboolean to avoid warnings
-
 #ifdef __cplusplus
 extern "C"
 {
@@ -34,7 +32,6 @@ extern "C"
 #define LOGE(...) __android_log_print(ANDROID_LOG_ERROR  , LOG_TAG,__VA_ARGS__)
 
 static JavaVM *cachedJVM;
-static jclass class_String;
 static jclass class_ArrayList;
 static jclass class_WalletListener;
 static jclass class_CoinsInfo;
@@ -42,17 +39,11 @@ static jclass class_TransactionInfo;
 static jclass class_Transfer;
 static jclass class_Ledger;
 static jclass class_WalletStatus;
+static jclass class_BluetoothService;
+static jclass class_SidekickService;
 
 std::mutex _listenerMutex;
 
-//void jstringToString(JNIEnv *env, std::string &str, jstring jstr) {
-//    if (!jstr) return;
-//    const int len = env->GetStringUTFLength(jstr);
-//    const char *chars = env->GetStringUTFChars(jstr, nullptr);
-//    str.assign(chars, len);
-//    env->ReleaseStringUTFChars(jstr, chars);
-//}
-
 JNIEXPORT jint JNICALL JNI_OnLoad(JavaVM *jvm, void *reserved) {
     cachedJVM = jvm;
     LOGI("JNI_OnLoad");
@@ -62,8 +53,6 @@ JNIEXPORT jint JNICALL JNI_OnLoad(JavaVM *jvm, void *reserved) {
     }
     //LOGI("JNI_OnLoad ok");
 
-    class_String = static_cast<jclass>(jenv->NewGlobalRef(
-            jenv->FindClass("java/lang/String")));
     class_ArrayList = static_cast<jclass>(jenv->NewGlobalRef(
             jenv->FindClass("java/util/ArrayList")));
     class_CoinsInfo = static_cast<jclass>(jenv->NewGlobalRef(
@@ -78,6 +67,8 @@ JNIEXPORT jint JNICALL JNI_OnLoad(JavaVM *jvm, void *reserved) {
             jenv->FindClass("com/m2049r/xmrwallet/ledger/Ledger")));
     class_WalletStatus = static_cast<jclass>(jenv->NewGlobalRef(
             jenv->FindClass("com/m2049r/xmrwallet/model/Wallet$Status")));
+    class_BluetoothService = static_cast<jclass>(jenv->NewGlobalRef(
+            jenv->FindClass("com/m2049r/xmrwallet/service/BluetoothService")));
     return JNI_VERSION_1_6;
 }
 #ifdef __cplusplus
@@ -1686,6 +1677,79 @@ int LedgerFind(char *buffer, size_t len) {
     return ret;
 }
 
+//
+// SidekickWallet Stuff
+//
+
+/**
+ * @brief BtExchange     - exchange data with Monerujo Device
+ * @param request        - buffer for data to send
+ * @param request_len    - length of data to send
+ * @param response       - buffer for received data
+ * @param max_resp_len   - size of receive buffer
+ *
+ * @return length of received data in response or -1 if error, -2 if response buffer too small
+ */
+int BtExchange(
+        unsigned char *request,
+        unsigned int request_len,
+        unsigned char *response,
+        unsigned int max_resp_len) {
+    JNIEnv *jenv;
+    int envStat = attachJVM(&jenv);
+    if (envStat == JNI_ERR) return -16;
+
+    jmethodID exchangeMethod = jenv->GetStaticMethodID(class_BluetoothService, "Exchange",
+                                                       "([B)[B");
+
+    auto reqLen = static_cast<jsize>(request_len);
+    jbyteArray reqData = jenv->NewByteArray(reqLen);
+    jenv->SetByteArrayRegion(reqData, 0, reqLen, (jbyte *) request);
+    LOGD("BtExchange cmd: 0x%02x with %u bytes", request[0], reqLen);
+    auto dataRecv = (jbyteArray)
+            jenv->CallStaticObjectMethod(class_BluetoothService, exchangeMethod, reqData);
+    jenv->DeleteLocalRef(reqData);
+    if (dataRecv == nullptr) {
+        detachJVM(jenv, envStat);
+        LOGD("BtExchange: error reading");
+        return -1;
+    }
+    jsize respLen = jenv->GetArrayLength(dataRecv);
+    LOGD("BtExchange response is %u bytes", respLen);
+    if (respLen <= max_resp_len) {
+        jenv->GetByteArrayRegion(dataRecv, 0, respLen, (jbyte *) response);
+        jenv->DeleteLocalRef(dataRecv);
+        detachJVM(jenv, envStat);
+        return static_cast<int>(respLen);;
+    } else {
+        jenv->DeleteLocalRef(dataRecv);
+        detachJVM(jenv, envStat);
+        LOGE("BtExchange response buffer too small: %u < %u", respLen, max_resp_len);
+        return -2;
+    }
+}
+
+/**
+ * @brief ConfirmTransfers
+ * @param transfers - string of "fee (':' address ':' amount)+"
+ *
+ * @return true on accept, false on reject
+ */
+bool ConfirmTransfers(const char *transfers) {
+    JNIEnv *jenv;
+    int envStat = attachJVM(&jenv);
+    if (envStat == JNI_ERR) return -16;
+
+    jmethodID confirmMethod = jenv->GetStaticMethodID(class_SidekickService, "ConfirmTransfers",
+                                                      "(Ljava/lang/String;)Z");
+
+    jstring _transfers = jenv->NewStringUTF(transfers);
+    auto confirmed =
+            jenv->CallStaticBooleanMethod(class_SidekickService, confirmMethod, _transfers);
+    jenv->DeleteLocalRef(_transfers);
+    return confirmed;
+}
+
 #ifdef __cplusplus
 }
 #endif
diff --git a/app/src/main/cpp/monerujo.h b/app/src/main/cpp/monerujo.h
index 0fb3444428..f11df08d8f 100644
--- a/app/src/main/cpp/monerujo.h
+++ b/app/src/main/cpp/monerujo.h
@@ -1,5 +1,5 @@
 /**
- * Copyright (c) 2017 m2049r
+ * Copyright (c) 2017-2024 m2049r
  * <p>
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -19,6 +19,8 @@
 
 #include <jni.h>
 
+#include <string>
+
 /*
 #include <android/log.h>
 
@@ -28,6 +30,10 @@
 #define  LOGE(...)  __android_log_print(ANDROID_LOG_ERROR,LOG_TAG,__VA_ARGS__)
 */
 
+void ThrowException(JNIEnv *jenv, const char* type, const char* msg) {
+    jenv->ThrowNew(jenv->FindClass(type), msg);
+}
+
 jfieldID getHandleField(JNIEnv *env, jobject obj, const char *fieldName = "handle") {
     jclass c = env->GetObjectClass(obj);
     return env->GetFieldID(c, fieldName, "J"); // of type long
@@ -35,8 +41,16 @@ jfieldID getHandleField(JNIEnv *env, jobject obj, const char *fieldName = "handl
 
 template<typename T>
 T *getHandle(JNIEnv *env, jobject obj, const char *fieldName = "handle") {
+    return reinterpret_cast<T *>(env->GetLongField(obj, getHandleField(env, obj, fieldName)));
+}
+
+template<typename T>
+void destroyNativeObject(JNIEnv *env, T nativeObjectHandle, jobject obj, const char *fieldName = "handle") {
     jlong handle = env->GetLongField(obj, getHandleField(env, obj, fieldName));
-    return reinterpret_cast<T *>(handle);
+    if (handle != 0) {
+        ThrowException(env, "java/lang/IllegalStateException", "invalid handle (destroy)");
+    }
+    delete reinterpret_cast<T *>(nativeObjectHandle);
 }
 
 void setHandleFromLong(JNIEnv *env, jobject obj, jlong handle) {
@@ -54,7 +68,7 @@ extern "C"
 {
 #endif
 
-extern const char* const MONERO_VERSION; // the actual monero core version
+extern const char *const MONERO_VERSION; // the actual monero core version
 
 // from monero-core crypto/hash-ops.h - avoid #including monero code here
 enum {
@@ -62,18 +76,40 @@ enum {
     HASH_DATA_AREA = 136
 };
 
-void cn_slow_hash(const void *data, size_t length, char *hash, int variant, int prehashed, uint64_t height);
+void cn_slow_hash(const void *data, size_t length, char *hash, int variant, int prehashed,
+                  uint64_t height);
 
 inline void slow_hash(const void *data, const size_t length, char *hash) {
     cn_slow_hash(data, length, hash, 0 /*variant*/, 0 /*prehashed*/, 0 /*height*/);
 }
 
 inline void slow_hash_broken(const void *data, char *hash, int variant) {
-    cn_slow_hash(data, 200 /*sizeof(union hash_state)*/, hash, variant, 1 /*prehashed*/, 0 /*height*/);
+    cn_slow_hash(data, 200 /*sizeof(union hash_state)*/, hash, variant, 1 /*prehashed*/,
+                 0 /*height*/);
 }
-
 #ifdef __cplusplus
 }
 #endif
 
+namespace Monerujo {
+    class SidekickWallet {
+    public:
+        enum Status {
+            Status_Ok,
+            Status_Error,
+            Status_Critical
+        };
+
+        SidekickWallet(uint8_t networkType, std::string a, std::string b);
+
+        ~SidekickWallet();
+
+        std::string call(int commandId, const std::string &request);
+
+        void reset();
+
+        Status status() const;
+
+    };
+}
 #endif //XMRWALLET_WALLET_LIB_H
diff --git a/app/src/main/ic_launcher-playstore.png b/app/src/main/ic_launcher-playstore.png
new file mode 100644
index 0000000000000000000000000000000000000000..b44759f5d76edb24c91bf51c75399483a32a6d11
GIT binary patch
literal 13511
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
H?VbMvA6mgz

literal 0
HcmV?d00001

diff --git a/app/src/main/java/com/m2049r/xmrwallet/BaseActivity.java b/app/src/main/java/com/m2049r/xmrwallet/BaseActivity.java
index b714ea27f2..1ab1d5bd68 100644
--- a/app/src/main/java/com/m2049r/xmrwallet/BaseActivity.java
+++ b/app/src/main/java/com/m2049r/xmrwallet/BaseActivity.java
@@ -16,7 +16,17 @@
 
 package com.m2049r.xmrwallet;
 
+import android.Manifest;
+import android.app.AlertDialog;
 import android.content.Context;
+import android.content.Intent;
+import android.content.pm.PackageManager;
+import android.net.ConnectivityManager;
+import android.net.Network;
+import android.net.NetworkCapabilities;
+import android.net.NetworkInfo;
+import android.net.Uri;
+import android.os.Build;
 import android.os.Bundle;
 import android.os.Handler;
 import android.os.Looper;
@@ -24,7 +34,8 @@
 
 import androidx.activity.OnBackPressedCallback;
 import androidx.annotation.CallSuper;
-import androidx.fragment.app.FragmentActivity;
+import androidx.annotation.NonNull;
+import androidx.core.app.ActivityCompat;
 
 import com.m2049r.xmrwallet.data.BarcodeData;
 import com.m2049r.xmrwallet.dialog.ProgressDialog;
@@ -159,4 +170,87 @@ private BarcodeData popBarcodeData() {
         barcodeData = null;
         return popped;
     }
+
+    public boolean isNetworkAvailable() {
+        ConnectivityManager connectivityManager = (ConnectivityManager) getApplication().getSystemService(Context.CONNECTIVITY_SERVICE);
+        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
+            Network network = connectivityManager.getActiveNetwork();
+            if (network == null) return false;
+            NetworkCapabilities networkCapabilities = connectivityManager.getNetworkCapabilities(network);
+            return networkCapabilities != null && (networkCapabilities.hasTransport(NetworkCapabilities.TRANSPORT_WIFI) || networkCapabilities.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR) || networkCapabilities.hasTransport(NetworkCapabilities.TRANSPORT_ETHERNET) || networkCapabilities.hasTransport(NetworkCapabilities.TRANSPORT_BLUETOOTH));
+        } else {
+            NetworkInfo networkInfo = connectivityManager.getActiveNetworkInfo();
+            return networkInfo != null && networkInfo.isConnected();
+        }
+    }
+
+    static private final int REQUEST_CODE_BLUETOOTH_PERMISSIONS = 32423;
+
+    void btPermissionGranted() {
+    }
+
+    @Override
+    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
+        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
+        if (requestCode == REQUEST_CODE_BLUETOOTH_PERMISSIONS) {
+            if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED && grantResults[1] == PackageManager.PERMISSION_GRANTED) {
+                btPermissionGranted();
+            } // else onResume() takes care of trying again
+        }
+    }
+
+    private void showBtPermissionsDialog() {
+        AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(this);
+        alertDialogBuilder.setMessage(R.string.bluetooth_permissions);
+        alertDialogBuilder.setPositiveButton(R.string.bluetooth_permissions_ok,
+                (dialog, which) -> requestBtPermissions());
+        alertDialogBuilder.setCancelable(false);
+        AlertDialog alertDialog = alertDialogBuilder.create();
+        alertDialog.show();
+    }
+
+    private void showAppInfoDialog() {
+        AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(this);
+        alertDialogBuilder.setMessage(R.string.bluetooth_permissions);
+        alertDialogBuilder.setPositiveButton(R.string.bluetooth_permissions_settings, (dialog, which) -> {
+            Intent i = new Intent(android.provider.Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
+            i.addCategory(Intent.CATEGORY_DEFAULT);
+            i.setData(Uri.parse("package:" + getPackageName()));
+            startActivity(i);
+        });
+        alertDialogBuilder.setNegativeButton(R.string.bluetooth_permissions_cancel, (dialog, which) -> {
+            finish();
+        });
+        alertDialogBuilder.setCancelable(false);
+        AlertDialog alertDialog = alertDialogBuilder.create();
+        alertDialog.show();
+    }
+
+    private void requestBtPermissions() {
+        ActivityCompat.requestPermissions(this, new String[]{android.Manifest.permission.BLUETOOTH_CONNECT, android.Manifest.permission.BLUETOOTH_SCAN}, REQUEST_CODE_BLUETOOTH_PERMISSIONS);
+    }
+
+    private boolean firstCheck = true;
+
+    void checkBtPermissions() {
+        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {
+            if ((ActivityCompat.checkSelfPermission(this, android.Manifest.permission.BLUETOOTH_CONNECT) != PackageManager.PERMISSION_GRANTED) ||
+                    (ActivityCompat.checkSelfPermission(this, android.Manifest.permission.BLUETOOTH_SCAN) != PackageManager.PERMISSION_GRANTED)) {
+                if (shouldShowRequestPermissionRationale(android.Manifest.permission.BLUETOOTH_SCAN) || shouldShowRequestPermissionRationale(Manifest.permission.BLUETOOTH_CONNECT)) {
+                    showBtPermissionsDialog();
+                } else {
+                    if (firstCheck) {
+                        requestBtPermissions();
+                    } else {
+                        showAppInfoDialog();
+                    }
+                }
+            } else {
+                btPermissionGranted();
+            }
+            firstCheck = false;
+        } else {
+            btPermissionGranted();
+        }
+    }
 }
diff --git a/app/src/main/java/com/m2049r/xmrwallet/BluetoothFragment.java b/app/src/main/java/com/m2049r/xmrwallet/BluetoothFragment.java
new file mode 100644
index 0000000000..d7ad841023
--- /dev/null
+++ b/app/src/main/java/com/m2049r/xmrwallet/BluetoothFragment.java
@@ -0,0 +1,326 @@
+/*
+ * Copyright (C) 2014 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+// mostly from BluetoothChatFragment https://github.com/android/connectivity-samples
+
+package com.m2049r.xmrwallet;
+
+import android.app.Activity;
+import android.bluetooth.BluetoothAdapter;
+import android.content.Context;
+import android.content.Intent;
+import android.os.Bundle;
+import android.os.Handler;
+import android.os.Looper;
+import android.os.Message;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.ImageView;
+import android.widget.ProgressBar;
+import android.widget.TextView;
+import android.widget.Toast;
+
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+import androidx.fragment.app.Fragment;
+
+import com.m2049r.xmrwallet.service.BluetoothService;
+import com.m2049r.xmrwallet.util.Flasher;
+
+import java.security.SecureRandom;
+
+import lombok.Getter;
+import lombok.RequiredArgsConstructor;
+import timber.log.Timber;
+
+public class BluetoothFragment extends Fragment {
+
+    public BluetoothFragment() {
+        super();
+    }
+
+    interface Listener {
+        void onDeviceConnected(String connectedDeviceName);
+
+        void abort(String message);
+
+        void onReceive(int commandId);
+    }
+
+    //TODO enable discover only after wallet is loaded
+    Listener activityCallback;
+
+    // Intent request codes
+    private static final int REQUEST_ENABLE_BT = 3;
+
+    private ImageView btIcon;
+    private ProgressBar pbConnecting;
+    private TextView btCode;
+    private TextView btName;
+
+    private String connectedDeviceName = null;
+
+    private BluetoothAdapter bluetoothAdapter = null;
+
+    private BluetoothService bluetoothService = null;
+
+    public enum Mode {
+        CLIENT, SERVER
+    }
+
+    private Mode mode = Mode.CLIENT;
+
+    public BluetoothFragment(Mode mode) {
+        super();
+        this.mode = mode;
+    }
+
+    @Override
+    public void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        // Get local Bluetooth adapter
+        bluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
+        // If the adapter is null, then Bluetooth is not supported
+        if (bluetoothAdapter == null) {
+            if (activityCallback != null)
+                activityCallback.abort("Bluetooth is not available"); //TODO strings.xml
+        }
+    }
+
+    public void start() {
+        if (bluetoothAdapter == null) return;
+
+        // If BT is not on, request that it be enabled.
+        // setupComm() will then be called during onActivityResult
+        if (!bluetoothAdapter.isEnabled()) {
+            Intent enableIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
+            startActivityForResult(enableIntent, REQUEST_ENABLE_BT);
+        } else if (bluetoothService == null) {
+            setupCommunication();
+        }
+    }
+
+    @Override
+    public void onDestroy() {
+        super.onDestroy();
+        if (bluetoothService != null) {
+            bluetoothService.setUiHandler(null);
+            bluetoothService = null;
+        }
+        // The BluetoothService is stopped in LoginActivity::onDestroy
+    }
+
+    @Override
+    public void onPause() {
+        Timber.d("onPause %s", mode);
+        super.onPause();
+    }
+
+    @Override
+    public void onResume() {
+        Timber.d("onResume %s", mode);
+        super.onResume();
+
+        // Performing this check in onResume() covers the case in which BT was
+        // not enabled during onStart(), so we were paused to enable it...
+        // onResume() will be called when ACTION_REQUEST_ENABLE activity returns.
+        if (bluetoothService != null) {
+            // Only if the state is STATE_NONE, do we know that we haven't started already
+            if (!bluetoothService.isStarted()) {
+                // Start the Bluetooth services
+                bluetoothService.start();
+            }
+        }
+    }
+
+    @Override
+    public void onAttach(@NonNull Context context) {
+        super.onAttach(context);
+        if (context instanceof BluetoothFragment.Listener) {
+            activityCallback = (BluetoothFragment.Listener) context;
+        } else {
+            throw new ClassCastException(context.toString()
+                    + " must implement Listener");
+        }
+    }
+
+    @Override
+    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container,
+                             @Nullable Bundle savedInstanceState) {
+        Timber.d("onCreateView");
+        return inflater.inflate(R.layout.fragment_bluetooth, container, false);
+    }
+
+    @Override
+    public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
+        Timber.d("onViewCreated");
+        super.onCreate(savedInstanceState);
+        if (savedInstanceState != null) return;
+        btName = view.findViewById(R.id.btName);
+        btCode = view.findViewById(R.id.btCode);
+        btIcon = view.findViewById(R.id.btIcon);
+        pbConnecting = view.findViewById(R.id.pbConnecting);
+        setConnecting(false);
+        setInfo(null, null);
+    }
+
+    /**
+     * Set up the UI and background operations for comms.
+     */
+    private void setupCommunication() {
+        Timber.d("startCommunication()");
+        if (!isAdded()) {
+            return;
+        }
+
+        if (bluetoothService != null) throw new IllegalStateException("bluetoothService != null");
+
+        // Initialize the BluetoothService to perform bluetooth connections
+        bluetoothService = BluetoothService.GetInstance();
+        bluetoothService.setUiHandler(handler);
+        if (mode == Mode.SERVER)
+            bluetoothService.start();
+        setInfo(bluetoothService.getConnectedName(), bluetoothService.getConnectedCode());
+        showState(bluetoothService.getState());
+    }
+
+    private void showState(int state) {
+        if (!isAdded()) return;
+        Light light;
+        switch (state) {
+            case BluetoothService.State.LISTEN:
+                light = Light.LISTEN;
+                break;
+            case BluetoothService.State.CONNECTING:
+                light = Light.CONNECTING;
+                break;
+            case BluetoothService.State.CONNECTED:
+                light = Light.CONNECTED;
+                break;
+            case BluetoothService.State.NONE:
+            default:
+                light = Light.NONE;
+        }
+        final Flasher flash = new Flasher(requireContext(), light);
+        btIcon.setImageDrawable(flash.getDrawable());
+        btFlash = flash;
+    }
+
+    @Getter
+    @RequiredArgsConstructor
+    public enum Light implements Flasher.Light {
+        LISTEN(R.drawable.ic_bluetooth_24),
+
+        CONNECTING(R.drawable.ic_bluetooth_searching_24),
+
+        CONNECTED(R.drawable.ic_bluetooth_connected_24),
+
+        NONE(R.drawable.ic_bluetooth_disabled_24);
+
+        final private int drawableId;
+    }
+
+    Flasher btFlash;
+
+    private void flashState() {
+        if (btFlash != null)
+            btFlash.flash(getView());
+    }
+
+    /**
+     * The Handler that gets information back from the BluetoothService
+     */
+    private final Handler handler = new Handler(Looper.getMainLooper()) {
+        @Override
+        public void handleMessage(Message msg) {
+            switch (msg.what) {
+                case BluetoothService.MessageType.STATE_CHANGE:
+                    showState(msg.arg1);
+                    if (msg.arg1 <= BluetoothService.State.LISTEN) {
+                        setInfo(null, null);
+                        connectedDeviceName = null;
+                        activityCallback.onDeviceConnected(null); // i.e. disconnected - ugly :(
+                        setConnecting(false);
+                    }
+                    break;
+                case BluetoothService.MessageType.WRITE:
+                    Timber.d("WRITE_MESSAGE: %d bytes", msg.arg1);
+                    break;
+                case BluetoothService.MessageType.READ_CMD:
+                    Timber.d("READ_COMMAND 0x%x (%d bytes)", msg.arg2, msg.arg1);
+                    if (activityCallback != null) {
+                        activityCallback.onReceive(msg.arg2);
+                    }
+                    break;
+                case BluetoothService.MessageType.CODE:
+                    Timber.d("CODE: %s", msg.obj);
+                    btCode.setText((String) msg.obj);
+                    break;
+                case BluetoothService.MessageType.DEVICE_NAME:
+                    connectedDeviceName = (String) msg.obj;
+                    setInfo(connectedDeviceName, null);
+                    activityCallback.onDeviceConnected(connectedDeviceName);
+                    setConnecting(false);
+                    if (mode == Mode.CLIENT) {
+                        final int code = new SecureRandom().nextInt(10000);
+                        bluetoothService.write(code);
+                    }
+                    break;
+                case BluetoothService.MessageType.TOAST:
+                    if (isAdded())
+                        Toast.makeText(getActivity(), (String) msg.obj, Toast.LENGTH_SHORT).show();
+                    break;
+            }
+            flashState();
+        }
+    };
+
+    public void onActivityResult(int requestCode, int resultCode, Intent data) {
+        if (requestCode == REQUEST_ENABLE_BT) {// When the request to enable Bluetooth returns
+            if (resultCode == Activity.RESULT_OK) {
+                // Bluetooth is now enabled, so set up a chat session
+                setupCommunication();
+            } else {
+                // User did not enable Bluetooth or an error occurred
+                Timber.d("BT not enabled");
+                if (activityCallback != null)
+                    activityCallback.abort("Bluetooth is not enabled"); //TODO strings.xml
+            }
+        } else {
+            Timber.w("Unhandled request code %d", requestCode);
+        }
+        flashState();
+    }
+
+    private void setConnecting(boolean enable) {
+        pbConnecting.setVisibility(enable ? View.VISIBLE : View.INVISIBLE);
+    }
+
+    public void connectDevice(String address) {
+        setConnecting(true);
+        bluetoothService.connect(bluetoothAdapter.getRemoteDevice(address));
+    }
+
+    private void setInfo(String name, String code) {
+        try {
+            btName.setText(name == null ? getResources().getString(R.string.sidekick_not_connected) : name);
+            btCode.setText(getResources().getString(R.string.sidekick_pin, code != null ? code : "----"));
+        } catch (IllegalStateException ex) { // no context, so no strings
+            // never mind
+        }
+    }
+}
diff --git a/app/src/main/java/com/m2049r/xmrwallet/GenerateFragment.java b/app/src/main/java/com/m2049r/xmrwallet/GenerateFragment.java
index 57df4b1a10..b37020f8eb 100644
--- a/app/src/main/java/com/m2049r/xmrwallet/GenerateFragment.java
+++ b/app/src/main/java/com/m2049r/xmrwallet/GenerateFragment.java
@@ -18,7 +18,6 @@
 
 import android.app.Activity;
 import android.content.Context;
-import android.content.DialogInterface;
 import android.os.Bundle;
 import android.text.Editable;
 import android.text.Html;
@@ -67,8 +66,20 @@ public class GenerateFragment extends Fragment {
     static final String TYPE_KEY = "key";
     static final String TYPE_SEED = "seed";
     static final String TYPE_LEDGER = "ledger";
+    static final String TYPE_SIDEKICK = "sidekick";
     static final String TYPE_VIEWONLY = "view";
 
+    static Wallet.Device getDeviceType(String type) {
+        switch (type) {
+            case TYPE_SIDEKICK:
+                return Wallet.Device.Sidekick;
+            case TYPE_LEDGER:
+                return Wallet.Device.Ledger;
+            default:
+                return Wallet.Device.Software;
+        }
+    }
+
     private TextInputLayout etWalletName;
     private PasswordEntryView etWalletPassword;
     private LinearLayout llFingerprintAuth;
@@ -195,6 +206,7 @@ public View onCreateView(LayoutInflater inflater, ViewGroup container,
                 etWalletPassword.getEditText().setImeOptions(EditorInfo.IME_ACTION_UNSPECIFIED);
                 break;
             case TYPE_LEDGER:
+            case TYPE_SIDEKICK:
                 etWalletPassword.getEditText().setImeOptions(EditorInfo.IME_ACTION_DONE);
                 etWalletPassword.getEditText().setOnEditorActionListener((v, actionId, event) -> {
                     if ((event != null && (event.getKeyCode() == KeyEvent.KEYCODE_ENTER) && (event.getAction() == KeyEvent.ACTION_DOWN))
@@ -308,7 +320,7 @@ void toggleSeedOffset() {
     private boolean checkName() {
         String name = etWalletName.getEditText().getText().toString();
         boolean ok = true;
-        if (name.length() == 0) {
+        if (name.isEmpty()) {
             etWalletName.setError(getString(R.string.generate_wallet_name));
             ok = false;
         } else if (name.charAt(0) == '.') {
@@ -450,11 +462,12 @@ private void generateWallet() {
                 activityCallback.onGenerate(name, crazyPass, seed, offset, height);
                 break;
             case TYPE_LEDGER:
+            case TYPE_SIDEKICK:
                 bGenerate.setEnabled(false);
                 if (fingerprintAuthAllowed) {
                     KeyStoreHelper.saveWalletUserPass(requireActivity(), name, password);
                 }
-                activityCallback.onGenerateLedger(name, crazyPass, height);
+                activityCallback.onGenerateDevice(getDeviceType(type), name, crazyPass, height);
                 break;
             case TYPE_KEY:
             case TYPE_VIEWONLY:
@@ -498,6 +511,8 @@ String getType() {
                 return getString(R.string.generate_wallet_type_seed);
             case TYPE_LEDGER:
                 return getString(R.string.generate_wallet_type_ledger);
+            case TYPE_SIDEKICK:
+                return getString(R.string.generate_wallet_type_sidekick);
             case TYPE_VIEWONLY:
                 return getString(R.string.generate_wallet_type_view);
             default:
@@ -515,7 +530,7 @@ public interface Listener {
 
         void onGenerate(String name, String password, String address, String viewKey, String spendKey, long height);
 
-        void onGenerateLedger(String name, String password, long height);
+        void onGenerateDevice(Wallet.Device device, String name, String password, long height);
 
         void setTitle(String title);
 
@@ -555,6 +570,9 @@ public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
             case TYPE_LEDGER:
                 inflater.inflate(R.menu.create_wallet_ledger, menu);
                 break;
+            case TYPE_SIDEKICK:
+                inflater.inflate(R.menu.create_wallet_sidekick, menu);
+                break;
             case TYPE_VIEWONLY:
                 inflater.inflate(R.menu.create_wallet_view, menu);
                 break;
@@ -581,13 +599,11 @@ public void convertLedgerSeed() {
                 .setCancelable(false)
                 .setPositiveButton(getString(R.string.label_ok), null)
                 .setNegativeButton(getString(R.string.label_cancel),
-                        new DialogInterface.OnClickListener() {
-                            public void onClick(DialogInterface dialog, int id) {
-                                Helper.hideKeyboardAlways(activity);
-                                etWalletMnemonic.getEditText().getText().clear();
-                                dialog.cancel();
-                                ledgerDialog = null;
-                            }
+                        (dialog, id) -> {
+                            Helper.hideKeyboardAlways(activity);
+                            etWalletMnemonic.getEditText().getText().clear();
+                            dialog.cancel();
+                            ledgerDialog = null;
                         });
 
         ledgerDialog = alertDialogBuilder.create();
diff --git a/app/src/main/java/com/m2049r/xmrwallet/GenerateReviewFragment.java b/app/src/main/java/com/m2049r/xmrwallet/GenerateReviewFragment.java
index 1fd57d9d82..36adc779f2 100644
--- a/app/src/main/java/com/m2049r/xmrwallet/GenerateReviewFragment.java
+++ b/app/src/main/java/com/m2049r/xmrwallet/GenerateReviewFragment.java
@@ -254,7 +254,7 @@ protected void onPreExecute() {
             showProgress();
             if ((walletPath != null)
                     && (WalletManager.getInstance().queryWalletDevice(walletPath + ".keys", getPassword())
-                    == Wallet.Device.Device_Ledger)
+                    == Wallet.Device.Ledger)
                     && (progressCallback != null)) {
                 progressCallback.showLedgerProgressDialog(LedgerProgressDialog.TYPE_RESTORE);
                 dialogOpened = true;
@@ -286,10 +286,11 @@ protected Boolean doInBackground(String... params) {
             height = wallet.getRestoreHeight();
             seed = wallet.getSeed(getSeedOffset());
             switch (wallet.getDeviceType()) {
-                case Device_Ledger:
+                case Ledger:
                     viewKey = Ledger.Key();
                     break;
-                case Device_Software:
+                case Software:
+                case Sidekick:
                     viewKey = wallet.getSecretViewKey();
                     break;
                 default:
diff --git a/app/src/main/java/com/m2049r/xmrwallet/LoginActivity.java b/app/src/main/java/com/m2049r/xmrwallet/LoginActivity.java
index b6a9f5fa91..a167f3e6cb 100644
--- a/app/src/main/java/com/m2049r/xmrwallet/LoginActivity.java
+++ b/app/src/main/java/com/m2049r/xmrwallet/LoginActivity.java
@@ -55,6 +55,7 @@
 import com.m2049r.xmrwallet.model.NetworkType;
 import com.m2049r.xmrwallet.model.Wallet;
 import com.m2049r.xmrwallet.model.WalletManager;
+import com.m2049r.xmrwallet.service.BluetoothService;
 import com.m2049r.xmrwallet.service.WalletService;
 import com.m2049r.xmrwallet.util.Helper;
 import com.m2049r.xmrwallet.util.KeyStoreHelper;
@@ -76,13 +77,12 @@
 import java.util.Map;
 import java.util.Set;
 
-import lombok.Getter;
 import timber.log.Timber;
 
 public class LoginActivity extends BaseActivity
         implements LoginFragment.Listener, GenerateFragment.Listener,
         GenerateReviewFragment.Listener, GenerateReviewFragment.AcceptListener,
-        NodeFragment.Listener, SettingsFragment.Listener {
+        NodeFragment.Listener, SettingsFragment.Listener, SidekickConnectFragment.Listener, BluetoothFragment.Listener {
     private static final String GENERATE_STACK = "gen";
 
     private static final String NODES_PREFS_NAME = "nodes";
@@ -278,8 +278,15 @@ public void setTitle(String title, String subtitle) {
     }
 
     @Override
-    public boolean hasLedger() {
-        return Ledger.isConnected();
+    public boolean hasDevice(Wallet.Device type) {
+        switch (type) {
+            case Ledger:
+                return Ledger.isConnected();
+            case Sidekick:
+                return BluetoothService.IsConnected();
+            default:
+                return true;
+        }
     }
 
     @Override
@@ -311,8 +318,8 @@ protected void onCreate(Bundle savedInstanceState) {
             }
         });
 
-        loadFavouritesWithNetwork();
-
+        if (isNetworkAvailable())
+            loadFavouritesWithNetwork();
         LegacyStorageHelper.migrateWallets(this);
 
         if (savedInstanceState == null) startLoginFragment();
@@ -334,7 +341,7 @@ boolean checkServiceRunning() {
 
     @Override
     public boolean onWalletSelected(String walletName, boolean streetmode) {
-        if (node == null) {
+        if (isNetworkAvailable() && (node == null)) {
             Toast.makeText(this, getString(R.string.prompt_daemon_missing), Toast.LENGTH_SHORT).show();
             return false;
         }
@@ -682,6 +689,7 @@ protected void onDestroy() {
         dismissProgressDialog();
         unregisterDetachReceiver();
         Ledger.disconnect();
+        BluetoothService.Stop();
         super.onDestroy();
     }
 
@@ -695,6 +703,7 @@ protected void onResume() {
             new AsyncWaitForService().execute();
         }
         if (!Ledger.isConnected()) attachLedger();
+        if (BluetoothService.IsConnected()) onLedgerAction(); //TODO sidekick & show sidekick fab
         registerTor();
     }
 
@@ -727,14 +736,14 @@ protected void onPostExecute(Void result) {
         }
     }
 
-    void startWallet(String walletName, String walletPassword,
-                     boolean fingerprintUsed, boolean streetmode) {
+    void startWallet(String walletName, String walletPassword, boolean fingerprintUsed, StartMode mode) {
         Timber.d("startWallet()");
+
         Intent intent = new Intent(getApplicationContext(), WalletActivity.class);
         intent.putExtra(WalletActivity.REQUEST_ID, walletName);
         intent.putExtra(WalletActivity.REQUEST_PW, walletPassword);
         intent.putExtra(WalletActivity.REQUEST_FINGERPRINT_USED, fingerprintUsed);
-        intent.putExtra(WalletActivity.REQUEST_STREETMODE, streetmode);
+        intent.putExtra(WalletActivity.REQUEST_STREETMODE, mode == StartMode.Street);
         if (uri != null) {
             intent.putExtra(WalletActivity.REQUEST_URI, uri);
             uri = null; // use only once
@@ -783,6 +792,11 @@ void startSettingsFragment() {
         Timber.d("SettingsFragment placed");
     }
 
+    void startSidekickConnectFragment() {
+        replaceFragment(new SidekickConnectFragment(), null, null);
+        Timber.d("SidekickConnectFragment placed");
+    }
+
     void replaceFragment(Fragment newFragment, String stackName, Bundle extras) {
         if (extras != null) {
             newFragment.setArguments(extras);
@@ -821,7 +835,7 @@ private class AsyncCreateWallet extends AsyncTask<Void, Void, Boolean> {
         protected void onPreExecute() {
             super.onPreExecute();
             acquireWakeLock();
-            if (walletCreator.isLedger()) {
+            if (walletCreator.device() == Wallet.Device.Ledger) {
                 showLedgerProgressDialog(LedgerProgressDialog.TYPE_RESTORE);
             } else {
                 showProgressDialog(R.string.generate_wallet_creating);
@@ -890,8 +904,7 @@ void walletGenerateError() {
     interface WalletCreator {
         boolean createWallet(File aFile, String password);
 
-        boolean isLedger();
-
+        Wallet.Device device();
     }
 
     boolean checkAndCloseWallet(Wallet aWallet) {
@@ -909,8 +922,8 @@ public void onGenerate(final String name, final String password) {
         createWallet(name, password,
                 new WalletCreator() {
                     @Override
-                    public boolean isLedger() {
-                        return false;
+                    public Wallet.Device device() {
+                        return Wallet.Device.Software;
                     }
 
                     @Override
@@ -933,8 +946,8 @@ public void onGenerate(final String name, final String password,
         createWallet(name, password,
                 new WalletCreator() {
                     @Override
-                    public boolean isLedger() {
-                        return false;
+                    public Wallet.Device device() {
+                        return Wallet.Device.Software;
                     }
 
                     @Override
@@ -947,20 +960,19 @@ public boolean createWallet(File aFile, String password) {
     }
 
     @Override
-    public void onGenerateLedger(final String name, final String password,
-                                 final long restoreHeight) {
+    public void onGenerateDevice(final Wallet.Device device, final String name, final String password, long restoreHeight) {
         createWallet(name, password,
                 new WalletCreator() {
                     @Override
-                    public boolean isLedger() {
-                        return true;
+                    public Wallet.Device device() {
+                        return device;
                     }
 
                     @Override
                     public boolean createWallet(File aFile, String password) {
                         Wallet newWallet = WalletManager.getInstance()
                                 .createWalletFromDevice(aFile, password,
-                                        restoreHeight, "Ledger");
+                                        restoreHeight, device);
                         return checkAndCloseWallet(newWallet);
                     }
                 });
@@ -973,8 +985,8 @@ public void onGenerate(final String name, final String password,
         createWallet(name, password,
                 new WalletCreator() {
                     @Override
-                    public boolean isLedger() {
-                        return false;
+                    public Wallet.Device device() {
+                        return Wallet.Device.Software;
                     }
 
                     @Override
@@ -1105,6 +1117,9 @@ public boolean onOptionsItemSelected(MenuItem item) {
         } else if (id == R.id.action_create_help_ledger) {
             HelpFragment.display(getSupportFragmentManager(), R.string.help_create_ledger);
             return true;
+        } else if (id == R.id.action_create_help_sidekick) {
+            HelpFragment.display(getSupportFragmentManager(), R.string.help_create_sidekick);
+            return true;
         } else if (id == R.id.action_details_help) {
             HelpFragment.display(getSupportFragmentManager(), R.string.help_details);
             return true;
@@ -1117,6 +1132,9 @@ public boolean onOptionsItemSelected(MenuItem item) {
         } else if (id == R.id.action_help_node) {
             HelpFragment.display(getSupportFragmentManager(), R.string.help_node);
             return true;
+        } else if (id == R.id.action_help_sidekick) {
+            HelpFragment.display(getSupportFragmentManager(), R.string.help_sidekick);
+            return true;
         } else if (id == R.id.action_default_nodes) {
             Fragment f = getSupportFragmentManager().findFragmentById(R.id.fragment_container);
             if ((WalletManager.getInstance().getNetworkType() == NetworkType.NetworkType_Mainnet) &&
@@ -1124,6 +1142,9 @@ public boolean onOptionsItemSelected(MenuItem item) {
                 ((NodeFragment) f).restoreDefaultNodes();
             }
             return true;
+        } else if (id == R.id.action_sidekick) {
+            checkBtPermissions();
+            return true;
         } else if (id == R.id.action_ledger_seed) {
             Fragment f = getSupportFragmentManager().findFragmentById(R.id.fragment_container);
             if (f instanceof GenerateFragment) {
@@ -1135,6 +1156,11 @@ public boolean onOptionsItemSelected(MenuItem item) {
         }
     }
 
+    @Override
+    void btPermissionGranted() {
+        startSidekickConnectFragment();
+    }
+
     // an AsyncTask which tests the node before trying to open the wallet
     private class AsyncOpenWallet extends AsyncTask<Void, Void, Boolean> {
         final static int OK = 0;
@@ -1172,7 +1198,7 @@ protected void onPostExecute(Boolean result) {
             if (result) {
                 Timber.d("selected wallet is .%s.", node.getName());
                 // now it's getting real, onValidateFields if wallet exists
-                promptAndStart(walletName, streetmode);
+                promptAndStart(walletName, streetmode ? StartMode.Street : StartMode.Normal);
             } else {
                 if (node.getResponseCode() == 0) { // IOException
                     Toast.makeText(LoginActivity.this, getString(R.string.status_wallet_node_invalid), Toast.LENGTH_LONG).show();
@@ -1184,25 +1210,25 @@ protected void onPostExecute(Boolean result) {
 
     }
 
-    boolean checkDevice(String walletName, String password) {
-        String keyPath = new File(Helper.getWalletRoot(LoginActivity.this),
-                walletName + ".keys").getAbsolutePath();
+    private boolean checkDevice(String walletName, String password) {
+        String keyPath = new File(Helper.getWalletRoot(this), walletName + ".keys").getAbsolutePath();
         // check if we need connected hardware
-        Wallet.Device device = WalletManager.getInstance().queryWalletDevice(keyPath, password);
-        if (device == Wallet.Device.Device_Ledger) {
-            if (!hasLedger()) {
+        final Wallet.Device device = WalletManager.getInstance().queryWalletDevice(keyPath, password);
+        if (!hasDevice(device)) {
+            if (device == Wallet.Device.Ledger) {
                 toast(R.string.open_wallet_ledger_missing);
-            } else {
-                return true;
+            } else if (device == Wallet.Device.Sidekick) {
+                toast(R.string.open_wallet_sidekick_missing);
             }
-        } else {// device could be undefined meaning the password is wrong
-            // this gets dealt with later
-            return true;
+            return false;
         }
-        return false;
+        // else // device could be undefined meaning the password is wrong
+        return true;
     }
 
-    void promptAndStart(String walletName, final boolean streetmode) {
+    enum StartMode {Normal, Street}
+
+    void promptAndStart(String walletName, final StartMode mode) {
         File walletFile = Helper.getWalletFile(this, walletName);
         if (WalletManager.getInstance().walletExists(walletFile)) {
             Helper.promptPassword(LoginActivity.this, walletName, false,
@@ -1210,7 +1236,7 @@ void promptAndStart(String walletName, final boolean streetmode) {
                         @Override
                         public void act(String walletName, String password, boolean fingerprintUsed) {
                             if (checkDevice(walletName, password))
-                                startWallet(walletName, password, fingerprintUsed, streetmode);
+                                startWallet(walletName, password, fingerprintUsed, mode);
                         }
 
                         @Override
@@ -1378,6 +1404,28 @@ private UsbManager getUsbManager() {
         return usbManager;
     }
 
+    @Override
+    public void onDeviceConnected(String connectedDeviceName) {
+        Timber.d("onDeviceConnected: %s", connectedDeviceName);
+        try {
+            SidekickConnectFragment f = (SidekickConnectFragment) getSupportFragmentManager().findFragmentById(R.id.fragment_container);
+            f.allowClick();
+        } catch (ClassCastException ex) {
+            // ignore it
+        }
+    }
+
+    @Override
+    public void abort(String message) {
+        Toast.makeText(this, message, Toast.LENGTH_SHORT).show();
+        onBackPressed();
+    }
+
+    @Override
+    public void onReceive(int command) {
+        Timber.e("this should not be");
+    }
+
     //
     // Tor (Orbot) stuff
     //
diff --git a/app/src/main/java/com/m2049r/xmrwallet/LoginFragment.java b/app/src/main/java/com/m2049r/xmrwallet/LoginFragment.java
index 8e920adb69..abc0e68549 100644
--- a/app/src/main/java/com/m2049r/xmrwallet/LoginFragment.java
+++ b/app/src/main/java/com/m2049r/xmrwallet/LoginFragment.java
@@ -46,6 +46,7 @@
 import com.m2049r.xmrwallet.data.NodeInfo;
 import com.m2049r.xmrwallet.dialog.HelpFragment;
 import com.m2049r.xmrwallet.layout.WalletInfoAdapter;
+import com.m2049r.xmrwallet.model.Wallet;
 import com.m2049r.xmrwallet.model.WalletManager;
 import com.m2049r.xmrwallet.util.Helper;
 import com.m2049r.xmrwallet.util.KeyStoreHelper;
@@ -61,6 +62,7 @@
 import java.util.List;
 import java.util.Set;
 
+import lombok.Getter;
 import timber.log.Timber;
 
 public class LoginFragment extends Fragment implements WalletInfoAdapter.OnInteractionListener,
@@ -115,7 +117,9 @@ public interface Listener {
 
         Set<NodeInfo> getOrPopulateFavourites();
 
-        boolean hasLedger();
+        boolean hasDevice(Wallet.Device type);
+
+        boolean isNetworkAvailable();
 
         void runOnNetCipher(Runnable runnable);
     }
@@ -146,7 +150,6 @@ public void onResume() {
         activityCallback.setToolbarButton(Toolbar.BUTTON_SETTINGS);
         activityCallback.showNet();
         showNetwork();
-        //activityCallback.runOnNetCipher(this::pingSelectedNode);
     }
 
     private OnBackPressedCallback onBackPressedCallback = new OnBackPressedCallback(false) {
@@ -172,6 +175,7 @@ public View onCreateView(LayoutInflater inflater, ViewGroup container,
         fabSeed = view.findViewById(R.id.fabSeed);
         fabImport = view.findViewById(R.id.fabImport);
         fabLedger = view.findViewById(R.id.fabLedger);
+        fabSidekick = view.findViewById(R.id.fabSidekick);
 
         fabNewL = view.findViewById(R.id.fabNewL);
         fabViewL = view.findViewById(R.id.fabViewL);
@@ -179,6 +183,7 @@ public View onCreateView(LayoutInflater inflater, ViewGroup container,
         fabSeedL = view.findViewById(R.id.fabSeedL);
         fabImportL = view.findViewById(R.id.fabImportL);
         fabLedgerL = view.findViewById(R.id.fabLedgerL);
+        fabSidekickL = view.findViewById(R.id.fabSidekickL);
 
         fab_pulse = AnimationUtils.loadAnimation(getContext(), R.anim.fab_pulse);
         fab_open_screen = AnimationUtils.loadAnimation(getContext(), R.anim.fab_open_screen);
@@ -194,6 +199,7 @@ public View onCreateView(LayoutInflater inflater, ViewGroup container,
         fabSeed.setOnClickListener(this);
         fabImport.setOnClickListener(this);
         fabLedger.setOnClickListener(this);
+        fabSidekick.setOnClickListener(this);
         fabScreen.setOnClickListener(this);
 
         RecyclerView recyclerView = view.findViewById(R.id.list);
@@ -202,6 +208,7 @@ public View onCreateView(LayoutInflater inflater, ViewGroup container,
         recyclerView.setAdapter(adapter);
 
         ViewGroup llNotice = view.findViewById(R.id.llNotice);
+
         Notice.showAll(llNotice, ".*_login");
 
         view.findViewById(R.id.llNode).setOnClickListener(v -> startNodePrefs());
@@ -304,17 +311,14 @@ public void onCreateOptionsMenu(@NonNull Menu menu, MenuInflater inflater) {
         super.onCreateOptionsMenu(menu, inflater);
     }
 
+    @Getter
     private boolean fabOpen = false;
-    private FloatingActionButton fab, fabNew, fabView, fabKey, fabSeed, fabImport, fabLedger;
+    private FloatingActionButton fab, fabNew, fabView, fabKey, fabSeed, fabImport, fabLedger, fabSidekick;
     private RelativeLayout fabScreen;
-    private RelativeLayout fabNewL, fabViewL, fabKeyL, fabSeedL, fabImportL, fabLedgerL;
+    private RelativeLayout fabNewL, fabViewL, fabKeyL, fabSeedL, fabImportL, fabLedgerL, fabSidekickL;
     private Animation fab_open, fab_close, rotate_forward, rotate_backward, fab_open_screen, fab_close_screen;
     private Animation fab_pulse;
 
-    public boolean isFabOpen() {
-        return fabOpen;
-    }
-
     private void setFabOpen(boolean value) {
         fabOpen = value;
         onBackPressedCallback.setEnabled(value);
@@ -328,6 +332,9 @@ public void animateFAB() {
             if (fabLedgerL.getVisibility() == View.VISIBLE) {
                 fabLedgerL.startAnimation(fab_close);
                 fabLedger.setClickable(false);
+            } else if (fabSidekickL.getVisibility() == View.VISIBLE) {
+                fabSidekickL.startAnimation(fab_close);
+                fabSidekick.setClickable(false);
             } else {
                 fabNewL.startAnimation(fab_close);
                 fabNew.setClickable(false);
@@ -345,17 +352,25 @@ public void animateFAB() {
             fabScreen.setClickable(true);
             fabScreen.startAnimation(fab_open_screen);
             fab.startAnimation(rotate_forward);
-            if (activityCallback.hasLedger()) {
-                fabLedgerL.setVisibility(View.VISIBLE);
+            if ((activityCallback.hasDevice(Wallet.Device.Ledger)
+                    || activityCallback.hasDevice(Wallet.Device.Sidekick))) {
                 fabNewL.setVisibility(View.GONE);
                 fabViewL.setVisibility(View.GONE);
                 fabKeyL.setVisibility(View.GONE);
                 fabSeedL.setVisibility(View.GONE);
                 fabImportL.setVisibility(View.GONE);
 
-                fabLedgerL.startAnimation(fab_open);
-                fabLedger.setClickable(true);
+                if (activityCallback.hasDevice(Wallet.Device.Ledger)) {
+                    fabLedgerL.setVisibility(View.VISIBLE);
+                    fabLedgerL.startAnimation(fab_open);
+                    fabLedger.setClickable(true);
+                } else { // Sidekick
+                    fabSidekickL.setVisibility(View.VISIBLE);
+                    fabSidekickL.startAnimation(fab_open);
+                    fabSidekick.setClickable(true);
+                }
             } else {
+                fabSidekickL.setVisibility(View.GONE);
                 fabLedgerL.setVisibility(View.GONE);
                 fabNewL.setVisibility(View.VISIBLE);
                 fabViewL.setVisibility(View.VISIBLE);
@@ -404,6 +419,10 @@ public void onClick(View v) {
             Timber.d("FAB_LEDGER");
             animateFAB();
             activityCallback.onAddWallet(GenerateFragment.TYPE_LEDGER);
+        } else if (id == R.id.fabSidekick) {
+            Timber.d("FAB_SIDEKICK");
+            animateFAB();
+            activityCallback.onAddWallet(GenerateFragment.TYPE_SIDEKICK);
         } else if (id == R.id.fabScreen) {
             animateFAB();
         }
diff --git a/app/src/main/java/com/m2049r/xmrwallet/SidekickConnectFragment.java b/app/src/main/java/com/m2049r/xmrwallet/SidekickConnectFragment.java
new file mode 100644
index 0000000000..1cbbd0fc7e
--- /dev/null
+++ b/app/src/main/java/com/m2049r/xmrwallet/SidekickConnectFragment.java
@@ -0,0 +1,172 @@
+/*
+ * Copyright (c) 2018 m2049r
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.m2049r.xmrwallet;
+
+import android.bluetooth.BluetoothAdapter;
+import android.bluetooth.BluetoothClass;
+import android.bluetooth.BluetoothDevice;
+import android.content.Context;
+import android.os.Bundle;
+import android.view.LayoutInflater;
+import android.view.Menu;
+import android.view.MenuInflater;
+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.RecyclerView;
+import androidx.swiperefreshlayout.widget.SwipeRefreshLayout;
+
+import com.m2049r.xmrwallet.data.BluetoothInfo;
+import com.m2049r.xmrwallet.layout.BluetoothInfoAdapter;
+import com.m2049r.xmrwallet.util.Helper;
+import com.m2049r.xmrwallet.widget.Toolbar;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import timber.log.Timber;
+
+public class SidekickConnectFragment extends Fragment
+        implements BluetoothInfoAdapter.OnInteractionListener {
+
+    private BluetoothAdapter bluetoothAdapter;
+
+    private SwipeRefreshLayout pullToRefresh;
+
+    private BluetoothInfoAdapter infoAdapter;
+
+    private Listener activityCallback;
+
+    public interface Listener {
+        void setToolbarButton(int type);
+
+        void setSubtitle(String title);
+    }
+
+    @Override
+    public void onAttach(@NonNull Context context) {
+        super.onAttach(context);
+        if (context instanceof Listener) {
+            this.activityCallback = (Listener) context;
+        } else {
+            throw new ClassCastException(context + " must implement Listener");
+        }
+    }
+
+    @Override
+    public void onPause() {
+        Timber.d("onPause()");
+        if (bluetoothAdapter.isDiscovering()) {
+            bluetoothAdapter.cancelDiscovery();
+        }
+        // the the activity we are connected? why? it can ask the bluetoothservice...
+        super.onPause();
+    }
+
+    @Override
+    public void onResume() {
+        super.onResume();
+        Timber.d("onResume()");
+        activityCallback.setSubtitle(getString(R.string.label_bluetooth));
+        activityCallback.setToolbarButton(Toolbar.BUTTON_BACK);
+        final BluetoothFragment btFragment = (BluetoothFragment) getChildFragmentManager().findFragmentById(R.id.bt_fragment);
+        assert btFragment != null;
+        btFragment.start();
+    }
+
+    @Override
+    public View onCreateView(LayoutInflater inflater, ViewGroup container,
+                             Bundle savedInstanceState) {
+        Timber.d("onCreateView");
+        View view = inflater.inflate(R.layout.fragment_sidekick_connect, container, false);
+
+        RecyclerView recyclerView = view.findViewById(R.id.list);
+        infoAdapter = new BluetoothInfoAdapter(this);
+        recyclerView.setAdapter(infoAdapter);
+
+        pullToRefresh = view.findViewById(R.id.pullToRefresh);
+        pullToRefresh.setOnRefreshListener(() -> {
+            populateList();
+            pullToRefresh.setRefreshing(false);
+        });
+
+        return view;
+    }
+
+    private void populateList() {
+        List<BluetoothInfo> items = new ArrayList<>();
+        for (BluetoothDevice device : bluetoothAdapter.getBondedDevices()) {
+            final int deviceCLass = device.getBluetoothClass().getDeviceClass();
+            switch (deviceCLass) {
+                case BluetoothClass.Device.PHONE_SMART:
+                    //TODO verify these are correct
+                case BluetoothClass.Device.COMPUTER_HANDHELD_PC_PDA:
+                case BluetoothClass.Device.COMPUTER_PALM_SIZE_PC_PDA:
+                    items.add(new BluetoothInfo(device));
+            }
+        }
+        infoAdapter.setItems(items);
+    }
+
+    @Override
+    public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
+        Helper.hideKeyboard(getActivity());
+
+        // Get the local Bluetooth adapter
+        bluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
+        populateList();
+    }
+
+    @Override
+    public void onCreate(@Nullable Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        setHasOptionsMenu(true);
+    }
+
+    @Override
+    public void onCreateOptionsMenu(@NonNull Menu menu, MenuInflater inflater) {
+        inflater.inflate(R.menu.sidekick_connect_menu, menu);
+        super.onCreateOptionsMenu(menu, inflater);
+    }
+
+    @Override
+    public void onDestroy() {
+        super.onDestroy();
+
+        // Make sure we're not doing discovery anymore
+        if (bluetoothAdapter != null) {
+            bluetoothAdapter.cancelDiscovery();
+        }
+    }
+
+    @Override
+    public void onInteraction(final View view, final BluetoothInfo item) {
+        Timber.d("onInteraction %s", item);
+        bluetoothAdapter.cancelDiscovery();
+
+        final BluetoothFragment btFragment = (BluetoothFragment) getChildFragmentManager().findFragmentById(R.id.bt_fragment);
+        assert btFragment != null;
+        btFragment.connectDevice(item.getAddress());
+    }
+
+    public void allowClick() {
+        infoAdapter.allowClick(true);
+    }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/m2049r/xmrwallet/SubaddressFragment.java b/app/src/main/java/com/m2049r/xmrwallet/SubaddressFragment.java
index 3a6ce48422..b921280af1 100644
--- a/app/src/main/java/com/m2049r/xmrwallet/SubaddressFragment.java
+++ b/app/src/main/java/com/m2049r/xmrwallet/SubaddressFragment.java
@@ -195,7 +195,7 @@ private class AsyncSubaddress extends AsyncTask<Void, Void, Boolean> {
         @Override
         protected void onPreExecute() {
             super.onPreExecute();
-            if ((wallet.getDeviceType() == Wallet.Device.Device_Ledger) && (progressCallback != null)) {
+            if ((wallet.getDeviceType() == Wallet.Device.Ledger) && (progressCallback != null)) {
                 progressCallback.showLedgerProgressDialog(LedgerProgressDialog.TYPE_SUBADDRESS);
                 dialogOpened = true;
             }
diff --git a/app/src/main/java/com/m2049r/xmrwallet/WalletActivity.java b/app/src/main/java/com/m2049r/xmrwallet/WalletActivity.java
index afa05f6ea1..365090bffb 100644
--- a/app/src/main/java/com/m2049r/xmrwallet/WalletActivity.java
+++ b/app/src/main/java/com/m2049r/xmrwallet/WalletActivity.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2017 m2049r
+ * Copyright (c) 2017-2024 m2049r
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -45,6 +45,7 @@
 import androidx.drawerlayout.widget.DrawerLayout;
 import androidx.fragment.app.Fragment;
 import androidx.fragment.app.FragmentManager;
+import androidx.fragment.app.FragmentTransaction;
 import androidx.preference.PreferenceManager;
 
 import com.google.android.material.dialog.MaterialAlertDialogBuilder;
@@ -92,6 +93,7 @@ public class WalletActivity extends BaseActivity implements WalletFragment.Liste
     public static final String REQUEST_FINGERPRINT_USED = "fingerprint";
     public static final String REQUEST_STREETMODE = "streetmode";
     public static final String REQUEST_URI = "uri";
+    public static final String REQUEST_SIDEKICK = "sidekick";
 
     private NavigationView accountsView;
     private DrawerLayout drawer;
@@ -202,19 +204,9 @@ public String getTxAddress(int major, int minor) {
         return getWallet().getSubaddress(major, minor);
     }
 
-    private void startWalletService() {
-        Bundle extras = getIntent().getExtras();
-        if (extras != null) {
-            acquireWakeLock();
-            String walletId = extras.getString(REQUEST_ID);
-            // we can set the streetmode height AFTER opening the wallet
-            requestStreetMode = extras.getBoolean(REQUEST_STREETMODE);
-            password = extras.getString(REQUEST_PW);
-            uri = extras.getString(REQUEST_URI);
-            connectWalletService(walletId, password);
-        } else {
-            finish();
-        }
+    private void startWalletService(String walletId) {
+        acquireWakeLock();
+        connectWalletService(walletId, password);
     }
 
     private void stopWalletService() {
@@ -330,7 +322,6 @@ public void fail(String walletName) {
         });
     }
 
-
     public void onWalletChangePassword() {
         try {
             GenerateReviewFragment detailsFragment = (GenerateReviewFragment) getCurrentFragment();
@@ -356,33 +347,39 @@ protected void onCreate(Bundle savedInstanceState) {
             return;
         }
 
+        Bundle extras = getIntent().getExtras();
+        if (extras == null) finish(); // we need extras!
+
+        String walletId = extras.getString(REQUEST_ID);
+        requestStreetMode = extras.getBoolean(REQUEST_STREETMODE);
+        password = extras.getString(REQUEST_PW);
+        uri = extras.getString(REQUEST_URI);
+        boolean sidekick = extras.getBoolean(REQUEST_SIDEKICK);
+
         setContentView(R.layout.activity_wallet);
         toolbar = findViewById(R.id.toolbar);
         setSupportActionBar(toolbar);
         getSupportActionBar().setDisplayShowTitleEnabled(false);
 
-        toolbar.setOnButtonListener(new Toolbar.OnButtonListener() {
-            @Override
-            public void onButton(int type) {
-                switch (type) {
-                    case Toolbar.BUTTON_BACK:
-                        onDisposeRequest();
-                        getOnBackPressedDispatcher().onBackPressed();
-                        break;
-                    case Toolbar.BUTTON_CANCEL:
-                        onDisposeRequest();
-                        Helper.hideKeyboard(WalletActivity.this);
-                        getOnBackPressedDispatcher().onBackPressed();
-                        break;
-                    case Toolbar.BUTTON_CLOSE:
-                        finish();
-                        break;
-                    case Toolbar.BUTTON_SETTINGS:
-                        Toast.makeText(WalletActivity.this, getString(R.string.label_credits), Toast.LENGTH_SHORT).show();
-                    case Toolbar.BUTTON_NONE:
-                    default:
-                        Timber.e("Button " + type + "pressed - how can this be?");
-                }
+        toolbar.setOnButtonListener(type -> {
+            switch (type) {
+                case Toolbar.BUTTON_BACK:
+                    onDisposeRequest();
+                    getOnBackPressedDispatcher().onBackPressed();
+                    break;
+                case Toolbar.BUTTON_CANCEL:
+                    onDisposeRequest();
+                    Helper.hideKeyboard(WalletActivity.this);
+                    getOnBackPressedDispatcher().onBackPressed();
+                    break;
+                case Toolbar.BUTTON_CLOSE:
+                    finish();
+                    break;
+                case Toolbar.BUTTON_SETTINGS:
+                    Toast.makeText(WalletActivity.this, getString(R.string.label_credits), Toast.LENGTH_SHORT).show();
+                case Toolbar.BUTTON_NONE:
+                default:
+                    Timber.e("Button " + type + "pressed - how can this be?");
             }
         });
 
@@ -398,11 +395,16 @@ public void onButton(int type) {
         showNet();
 
         Fragment walletFragment = new WalletFragment();
-        getSupportFragmentManager().beginTransaction()
-                .add(R.id.fragment_container, walletFragment, WalletFragment.class.getName()).commit();
-        Timber.d("fragment added");
+        final FragmentTransaction tx =
+                getSupportFragmentManager().beginTransaction()
+                        .add(R.id.fragment_container, walletFragment, WalletFragment.class.getName());
+        if (sidekick) {
+            tx.add(R.id.fragment_bluetooth, new BluetoothFragment(BluetoothFragment.Mode.CLIENT), BluetoothFragment.class.getName());
+        }
+        tx.commit();
+        Timber.d("fragments added");
 
-        startWalletService();
+        if (!sidekick) startWalletService(walletId);
         Timber.d("onCreate() done.");
     }
 
@@ -616,7 +618,7 @@ public void onWalletStored(final boolean success) {
 
     @Override
     public void onWalletOpen(final Wallet.Device device) {
-        if (device == Wallet.Device.Device_Ledger) {
+        if (device == Wallet.Device.Ledger) {
             runOnUiThread(() -> showLedgerProgressDialog(LedgerProgressDialog.TYPE_RESTORE));
         }
     }
@@ -766,7 +768,7 @@ public void onPrepareSend(final String tag, final TxData txData) {
             intent.putExtra(WalletService.REQUEST_CMD_TX_TAG, tag);
             startService(intent);
             Timber.d("CREATE TX request sent");
-            if (getWallet().getDeviceType() == Wallet.Device.Device_Ledger)
+            if (getWallet().getDeviceType() == Wallet.Device.Ledger)
                 showLedgerProgressDialog(LedgerProgressDialog.TYPE_SEND);
         } else {
             Timber.e("Service not bound");
@@ -1132,11 +1134,12 @@ private class AsyncAddAccount extends AsyncTask<Void, Void, Boolean> {
         protected void onPreExecute() {
             super.onPreExecute();
             switch (getWallet().getDeviceType()) {
-                case Device_Ledger:
+                case Ledger:
                     showLedgerProgressDialog(LedgerProgressDialog.TYPE_ACCOUNT);
                     dialogOpened = true;
                     break;
-                case Device_Software:
+                case Software:
+                case Sidekick:
                     showProgressDialog(R.string.accounts_progress_new);
                     dialogOpened = true;
                     break;
diff --git a/app/src/main/java/com/m2049r/xmrwallet/XmrWalletApplication.java b/app/src/main/java/com/m2049r/xmrwallet/XmrWalletApplication.java
index 3943d23b64..287004df88 100644
--- a/app/src/main/java/com/m2049r/xmrwallet/XmrWalletApplication.java
+++ b/app/src/main/java/com/m2049r/xmrwallet/XmrWalletApplication.java
@@ -22,27 +22,20 @@
 import android.os.Build;
 
 import androidx.annotation.NonNull;
-import androidx.annotation.OptIn;
-import androidx.fragment.app.FragmentManager;
-import androidx.fragment.app.FragmentStateManagerControl;
 
+import com.m2049r.xmrwallet.BuildConfig;
 import com.m2049r.xmrwallet.model.NetworkType;
 import com.m2049r.xmrwallet.util.LocaleHelper;
 import com.m2049r.xmrwallet.util.NetCipherHelper;
 import com.m2049r.xmrwallet.util.NightmodeHelper;
-import com.m2049r.xmrwallet.util.ServiceHelper;
-
-import java.util.Arrays;
 
 import timber.log.Timber;
 
 public class XmrWalletApplication extends Application {
 
     @Override
-    @OptIn(markerClass = FragmentStateManagerControl.class)
     public void onCreate() {
         super.onCreate();
-        FragmentManager.enableNewStateManager(false);
         if (BuildConfig.DEBUG) {
             Timber.plant(new Timber.DebugTree());
         }
diff --git a/app/src/main/java/com/m2049r/xmrwallet/data/BluetoothInfo.java b/app/src/main/java/com/m2049r/xmrwallet/data/BluetoothInfo.java
new file mode 100644
index 0000000000..17f5152109
--- /dev/null
+++ b/app/src/main/java/com/m2049r/xmrwallet/data/BluetoothInfo.java
@@ -0,0 +1,42 @@
+/*
+ * Copyright (c) 2018 m2049r
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.m2049r.xmrwallet.data;
+
+import android.bluetooth.BluetoothDevice;
+
+import java.util.Comparator;
+
+import lombok.Data;
+import lombok.Getter;
+
+@Data
+public class BluetoothInfo {
+    @Getter
+    final private String name;
+    @Getter
+    final private String address;
+    @Getter
+    private boolean bonded;
+
+    public BluetoothInfo(BluetoothDevice device) {
+        name = device.getName().trim();
+        address = device.getAddress();
+        bonded = device.getBondState() == BluetoothDevice.BOND_BONDED;
+    }
+
+    static public Comparator<BluetoothInfo> NameComparator = (o1, o2) -> o1.name.compareTo(o2.name);
+}
diff --git a/app/src/main/java/com/m2049r/xmrwallet/layout/BluetoothInfoAdapter.java b/app/src/main/java/com/m2049r/xmrwallet/layout/BluetoothInfoAdapter.java
new file mode 100644
index 0000000000..687f5eb743
--- /dev/null
+++ b/app/src/main/java/com/m2049r/xmrwallet/layout/BluetoothInfoAdapter.java
@@ -0,0 +1,147 @@
+/*
+ * Copyright (c) 2018 m2049r
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.m2049r.xmrwallet.layout;
+
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.TextView;
+
+import androidx.annotation.NonNull;
+import androidx.recyclerview.widget.DiffUtil;
+import androidx.recyclerview.widget.RecyclerView;
+
+import com.m2049r.xmrwallet.R;
+import com.m2049r.xmrwallet.data.BluetoothInfo;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.List;
+
+public class BluetoothInfoAdapter extends RecyclerView.Adapter<BluetoothInfoAdapter.ViewHolder> {
+
+    public interface OnInteractionListener {
+        void onInteraction(View view, BluetoothInfo item);
+    }
+
+    private final List<BluetoothInfo> items = new ArrayList<>();
+    private final OnInteractionListener listener;
+
+    public BluetoothInfoAdapter(OnInteractionListener listener) {
+        this.listener = listener;
+    }
+
+    private static class BluetoothInfoDiff extends DiffCallback<BluetoothInfo> {
+
+        public BluetoothInfoDiff(List<BluetoothInfo> oldList, List<BluetoothInfo> newList) {
+            super(oldList, newList);
+        }
+
+        @Override
+        public boolean areItemsTheSame(int oldItemPosition, int newItemPosition) {
+            return mOldList.get(oldItemPosition).getAddress().equals(mNewList.get(newItemPosition).getAddress());
+        }
+
+        @Override
+        public boolean areContentsTheSame(int oldItemPosition, int newItemPosition) {
+            final BluetoothInfo oldItem = mOldList.get(oldItemPosition);
+            final BluetoothInfo newItem = mNewList.get(newItemPosition);
+            return oldItem.equals(newItem);
+        }
+    }
+
+    @Override
+    public @NonNull
+    ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
+        View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_bluetooth, parent, false);
+        return new ViewHolder(view);
+    }
+
+    @Override
+    public void onBindViewHolder(final @NonNull ViewHolder holder, int position) {
+        holder.bind(position);
+    }
+
+    @Override
+    public int getItemCount() {
+        return items.size();
+    }
+
+    public void add(BluetoothInfo item) {
+        if (item == null) return;
+        List<BluetoothInfo> newItems = new ArrayList<>(items);
+        if (!items.contains(item))
+            newItems.add(item);
+        setItems(newItems); // in case the nodeinfo has changed
+    }
+
+    public void setItems(Collection<BluetoothInfo> newItemsCollection) {
+        List<BluetoothInfo> newItems;
+        if (newItemsCollection != null) {
+            newItems = new ArrayList<>(newItemsCollection);
+            Collections.sort(newItems, BluetoothInfo.NameComparator);
+        } else {
+            newItems = new ArrayList<>();
+        }
+        final BluetoothInfoAdapter.BluetoothInfoDiff diffCallback = new BluetoothInfoAdapter.BluetoothInfoDiff(items, newItems);
+        final DiffUtil.DiffResult diffResult = DiffUtil.calculateDiff(diffCallback);
+        items.clear();
+        items.addAll(newItems);
+        diffResult.dispatchUpdatesTo(this);
+    }
+
+    private boolean itemsClickable = true;
+
+    public void allowClick(boolean clickable) {
+        itemsClickable = clickable;
+        notifyDataSetChanged();
+    }
+
+    public class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
+        final TextView tvName;
+        final TextView tvAddress;
+        BluetoothInfo item;
+
+        ViewHolder(View itemView) {
+            super(itemView);
+            tvName = itemView.findViewById(R.id.tvName);
+            tvAddress = itemView.findViewById(R.id.tvAddress);
+            itemView.setOnClickListener(this);
+        }
+
+        void bind(int position) {
+            item = items.get(position);
+            tvName.setText(item.getName());
+            tvAddress.setText(item.getAddress());
+            itemView.setClickable(itemsClickable);
+            itemView.setEnabled(itemsClickable);
+        }
+
+        @Override
+        public void onClick(View view) {
+            if (listener != null) {
+                int position = getBindingAdapterPosition(); // gets item position
+                if (position != RecyclerView.NO_POSITION) { // Check if an item was deleted, but the user clicked it before the UI removed it
+                    final BluetoothInfo node = items.get(position);
+                    allowClick(false);
+                    listener.onInteraction(view, node);
+                }
+            }
+        }
+    }
+}
diff --git a/app/src/main/java/com/m2049r/xmrwallet/layout/TransactionInfoAdapter.java b/app/src/main/java/com/m2049r/xmrwallet/layout/TransactionInfoAdapter.java
index 599ad91a47..91b5894a2e 100644
--- a/app/src/main/java/com/m2049r/xmrwallet/layout/TransactionInfoAdapter.java
+++ b/app/src/main/java/com/m2049r/xmrwallet/layout/TransactionInfoAdapter.java
@@ -86,7 +86,7 @@ public TransactionInfoAdapter(Context context, Listener listener) {
     }
 
     public boolean needsTransactionUpdateOnNewBlock() {
-        return (infoItems.size() > 0) && !infoItems.get(0).isConfirmed();
+        return (!infoItems.isEmpty()) && !infoItems.get(0).isConfirmed();
     }
 
     private static class TransactionInfoDiff extends DiffCallback<TransactionInfo> {
diff --git a/app/src/main/java/com/m2049r/xmrwallet/ledger/Hardware.java b/app/src/main/java/com/m2049r/xmrwallet/ledger/Hardware.java
new file mode 100644
index 0000000000..82a19930dc
--- /dev/null
+++ b/app/src/main/java/com/m2049r/xmrwallet/ledger/Hardware.java
@@ -0,0 +1,4 @@
+package com.m2049r.xmrwallet.ledger;
+
+public interface Hardware {
+}
diff --git a/app/src/main/java/com/m2049r/xmrwallet/ledger/Ledger.java b/app/src/main/java/com/m2049r/xmrwallet/ledger/Ledger.java
index 03582827dd..7cde2f4bbd 100644
--- a/app/src/main/java/com/m2049r/xmrwallet/ledger/Ledger.java
+++ b/app/src/main/java/com/m2049r/xmrwallet/ledger/Ledger.java
@@ -35,12 +35,11 @@
 
 import timber.log.Timber;
 
-public class Ledger {
+public class Ledger implements Hardware {
     static final public boolean ENABLED = true;
     // 5:20 is same as wallet2.cpp::restore()
     static public final int LOOKAHEAD_ACCOUNTS = 5;
     static public final int LOOKAHEAD_SUBADDRESSES = 20;
-    static public final String SUBADDRESS_LOOKAHEAD = LOOKAHEAD_ACCOUNTS + ":" + LOOKAHEAD_SUBADDRESSES;
 
     private static final byte PROTOCOL_VERSION = 0x03;
     public static final int SW_OK = 0x9000;
diff --git a/app/src/main/java/com/m2049r/xmrwallet/model/Wallet.java b/app/src/main/java/com/m2049r/xmrwallet/model/Wallet.java
index d97456b92a..77d72cfa4a 100644
--- a/app/src/main/java/com/m2049r/xmrwallet/model/Wallet.java
+++ b/app/src/main/java/com/m2049r/xmrwallet/model/Wallet.java
@@ -111,7 +111,11 @@ public String getName() {
     @RequiredArgsConstructor
     @Getter
     public enum Device {
-        Device_Undefined(0, 0), Device_Software(50, 200), Device_Ledger(5, 20);
+        Undefined(0, 0),
+        Software(50, 200),
+        Ledger(5, 20),
+        Trezor(5, 20),
+        Sidekick(5, 20);
         private final int accountLookahead;
         private final int subaddressLookahead;
     }
diff --git a/app/src/main/java/com/m2049r/xmrwallet/model/WalletManager.java b/app/src/main/java/com/m2049r/xmrwallet/model/WalletManager.java
index 71f3e124b5..c6b2a126c0 100644
--- a/app/src/main/java/com/m2049r/xmrwallet/model/WalletManager.java
+++ b/app/src/main/java/com/m2049r/xmrwallet/model/WalletManager.java
@@ -18,7 +18,6 @@
 
 import com.m2049r.xmrwallet.XmrWalletApplication;
 import com.m2049r.xmrwallet.data.Node;
-import com.m2049r.xmrwallet.ledger.Ledger;
 import com.m2049r.xmrwallet.util.RestoreHeight;
 
 import java.io.File;
@@ -161,10 +160,12 @@ private native long createWalletFromKeysJ(String path, String password,
                                               String spendKeyString);
 
     public Wallet createWalletFromDevice(File aFile, String password, long restoreHeight,
-                                         String deviceName) {
+                                         Wallet.Device device) {
+        final String lookahead = device.getAccountLookahead() + ":" + device.getSubaddressLookahead();
+        Timber.d("Creating from %s with %s lookahead", device, lookahead);
         long walletHandle = createWalletFromDeviceJ(aFile.getAbsolutePath(), password,
-                getNetworkType().getValue(), deviceName, restoreHeight,
-                Ledger.SUBADDRESS_LOOKAHEAD);
+                getNetworkType().getValue(), device.name(), restoreHeight,
+                lookahead);
         Wallet wallet = new Wallet(walletHandle);
         manageWallet(wallet);
         return wallet;
diff --git a/app/src/main/java/com/m2049r/xmrwallet/onboarding/OnBoardingManager.java b/app/src/main/java/com/m2049r/xmrwallet/onboarding/OnBoardingManager.java
index b0c52d0df7..93e9fd64ba 100644
--- a/app/src/main/java/com/m2049r/xmrwallet/onboarding/OnBoardingManager.java
+++ b/app/src/main/java/com/m2049r/xmrwallet/onboarding/OnBoardingManager.java
@@ -19,6 +19,8 @@
 import android.content.Context;
 import android.content.SharedPreferences;
 
+import com.m2049r.xmrwallet.util.Helper;
+
 import java.util.Date;
 
 import timber.log.Timber;
diff --git a/app/src/main/java/com/m2049r/xmrwallet/service/BluetoothService.java b/app/src/main/java/com/m2049r/xmrwallet/service/BluetoothService.java
new file mode 100644
index 0000000000..aaa1ec06da
--- /dev/null
+++ b/app/src/main/java/com/m2049r/xmrwallet/service/BluetoothService.java
@@ -0,0 +1,662 @@
+/*
+ * Copyright (C) 2021 m2049r@monerujo.io
+ * Copyright (C) 2014 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+// mostly from BluetoothChatService https://github.com/android/connectivity-samples
+
+package com.m2049r.xmrwallet.service;
+
+import android.bluetooth.BluetoothAdapter;
+import android.bluetooth.BluetoothDevice;
+import android.bluetooth.BluetoothServerSocket;
+import android.bluetooth.BluetoothSocket;
+import android.os.Handler;
+
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.nio.charset.StandardCharsets;
+import java.util.Locale;
+import java.util.UUID;
+import java.util.concurrent.CountDownLatch;
+
+import lombok.Getter;
+import lombok.Setter;
+import timber.log.Timber;
+
+/**
+ * This class does all the work for setting up and managing Bluetooth
+ * connections with other devices. It has a thread that listens for
+ * incoming connections, a thread for connecting with a device, and a
+ * thread for performing data transmissions when connected.
+ */
+public class BluetoothService {
+    final static private byte[] MAGIC = "SIDEKICK".getBytes(StandardCharsets.US_ASCII);
+
+    public interface MessageType {
+        int STATE_CHANGE = 1;
+        int READ = 2;
+        int WRITE = 3;
+        int DEVICE_NAME = 4;
+        int TOAST = 5;
+        int READ_CMD = 6;
+        int CODE = 42;
+    }
+
+    //TODO refactor this using an enum with resource ids for messages and stuff
+    public interface Toasts {
+        String CONNECT_FAILED = "Unable to connect device";
+        String CONNECTION_LOST = "Device connection was lost";
+        int READ = 2;
+        int WRITE = 3;
+        int DEVICE_NAME = 4;
+        int TOAST = 5;
+    }
+
+    // Constants that indicate the current connection state
+    public interface State {
+        int NONE = 0;       // we're doing nothing
+        int LISTEN = 1;     // now listening for incoming connections
+        int CONNECTING = 2; // now initiating an outgoing connection
+        int CONNECTED = 3;  // now connected to a remote device
+    }
+
+    // Name for the SDP record when creating server socket
+    private static final String SDP_NAME = "Monerujo";
+
+    // Unique UUID for this application
+    private static final UUID SDP_UUID = UUID.fromString("2150154b-58ce-4c58-99e3-ccfdd14bed3b");
+
+    static final BluetoothService Instance = new BluetoothService();
+
+    public static BluetoothService GetInstance() {
+        return Instance;
+    }
+
+    public static boolean IsConnected() {
+        return Instance.isConnected();
+    }
+
+    public static void Stop() {
+        Instance.stop();
+    }
+
+    // Member fields
+    private final BluetoothAdapter bluetoothAdapter;
+    @Setter
+    private Handler uiHandler;
+    @Setter
+    private Handler commHandler;
+    private AcceptThread acceptThread;
+    private ConnectThread connectThread;
+    private ConnectedThread connectedThread;
+    @Getter
+    private int state = State.NONE;
+
+    @Getter
+    private String connectedName;
+    @Getter
+    private String connectedCode;
+
+    public boolean isStarted() {
+        return state != State.NONE;
+    }
+
+    public boolean isConnected() {
+        return state == State.CONNECTED;
+    }
+
+    public BluetoothService() {
+        bluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
+    }
+
+    /**
+     * Notify UI of state changes
+     */
+    private synchronized void onStateChanged() {
+        Timber.d("onStateChanged()  -> %s", state);
+        if (uiHandler != null)
+            uiHandler.obtainMessage(MessageType.STATE_CHANGE, state, -1).sendToTarget();
+    }
+
+    /**
+     * Notify UI that we've connected
+     */
+    private synchronized void onConnected(String remoteName) {
+        Timber.d("onConnected()  -> %s", remoteName);
+        connectedName = remoteName;
+        if (uiHandler != null)
+            uiHandler.obtainMessage(MessageType.DEVICE_NAME, remoteName).sendToTarget();
+    }
+
+    /**
+     * Start the service: Start AcceptThread to begin a session in listening (server) mode.
+     */
+    public synchronized void start() {
+        Timber.d("start");
+        halt = false;
+
+        // Cancel any thread attempting to make a connection
+        if (connectThread != null) {
+            connectThread.cancel();
+            connectThread = null;
+        }
+
+        // Cancel any thread currently running a connection
+        if (connectedThread != null) {
+            connectedThread.cancel();
+            connectedThread = null;
+        }
+
+        // Start the thread to listen on a BluetoothServerSocket (or let it run if already running)
+        if (acceptThread == null) {
+            acceptThread = new AcceptThread();
+            acceptThread.start();
+        }
+
+        onStateChanged();
+    }
+
+    /**
+     * Start the ConnectThread to initiate a connection to a remote device.
+     *
+     * @param device The BluetoothDevice to connect
+     */
+    public synchronized void connect(BluetoothDevice device) {
+        Timber.d("connect to: %s", device);
+
+        // Cancel any thread attempting to make a connection
+        if (state == State.CONNECTING) {
+            if (connectThread != null) {
+                connectThread.cancel();
+                connectThread = null;
+            }
+        }
+
+        // Cancel any thread currently running a connection
+        if (connectedThread != null) {
+            reconnect = true;
+            connectedThread.cancel();
+            connectedThread = null;
+        }
+
+        // Start the thread to connect with the given device
+        connectThread = new ConnectThread(device);
+        connectThread.start();
+
+        onStateChanged();
+    }
+
+    boolean reconnect = false;
+    boolean halt = false;
+
+    /**
+     * Start the ConnectedThread to begin managing a Bluetooth connection
+     *
+     * @param socket The BluetoothSocket on which the connection was made
+     * @param device The BluetoothDevice that has been connected
+     */
+    public synchronized void startConnected(BluetoothSocket socket, BluetoothDevice device) {
+        Timber.d("startConnected");
+
+        // Cancel the thread that completed the connection
+        if (connectThread != null) {
+            connectThread.cancel();
+            connectThread = null;
+        }
+
+        // Cancel any thread currently running a connection
+        if (connectedThread != null) {
+            connectedThread.cancel();
+            connectedThread = null;
+        }
+
+        // Cancel the accept thread because we only want to connect to one device
+        if (acceptThread != null) {
+            acceptThread.cancel();
+            acceptThread = null;
+        }
+
+        // Start the thread to manage the connection and perform transmissions
+        connectedThread = new ConnectedThread(socket);
+        connectedThread.start();
+
+        onConnected(device.getName());
+        onStateChanged();
+    }
+
+    /**
+     * Stop all threads
+     */
+    public synchronized void stop() {
+        Timber.d("stop");
+        halt = true;
+
+        if (connectThread != null) {
+            connectThread.cancel();
+            connectThread = null;
+        }
+
+        if (connectedThread != null) {
+            connectedThread.cancel();
+            connectedThread = null;
+        }
+
+        if (acceptThread != null) {
+            acceptThread.cancel();
+            acceptThread = null;
+        }
+
+        state = State.NONE;
+
+        onStateChanged();
+
+        setUiHandler(null);
+    }
+
+    /**
+     * Write to the ConnectedThread in an unsynchronized manner
+     *
+     * @param out The bytes to write
+     * @see ConnectedThread#write(byte[])
+     */
+    public boolean write(byte[] out) {
+        // Synchronize a copy of the ConnectedThread
+        ConnectedThread connectedThread;
+        synchronized (this) {
+            if (state != State.CONNECTED) return false;
+            connectedThread = this.connectedThread;
+        }
+        // Perform the write itself unsynchronized
+        return connectedThread.write(out);
+    }
+
+    public boolean write(int code) {
+        // Synchronize a copy of the ConnectedThread
+        ConnectedThread connectedThread;
+        synchronized (this) {
+            if (state != State.CONNECTED) return false;
+            connectedThread = this.connectedThread;
+        }
+
+        final byte[] buffer = new byte[2];
+        buffer[0] = (byte) (code >> 8);
+        buffer[1] = (byte) (code & 0xff);
+
+        connectedCode = String.format(Locale.US, "%04d", code);
+        if (uiHandler != null)
+            uiHandler.obtainMessage(MessageType.CODE, connectedCode).sendToTarget();
+
+        return connectedThread.write(buffer);
+    }
+
+    public byte[] exchange(byte[] buffer) {
+        // Synchronize a copy of the ConnectedThread
+        ConnectedThread connectedThread;
+        synchronized (this) {
+            if (state != State.CONNECTED) return null; //TODO maybe exception?
+            connectedThread = this.connectedThread;
+        }
+        CountDownLatch signal = new CountDownLatch(1);
+        connectedThread.setReadSignal(signal);
+        connectedThread.write(buffer);
+        try {
+            signal.await(); //TODO what happens when the reader is canceled?
+            return connectedThread.getReadBuffer();
+        } catch (InterruptedException ex) {
+            Timber.d(ex);
+            return null;
+        }
+    }
+
+    /**
+     * Indicate that the connection attempt failed and notify
+     */
+    private void onConnectFailed() {
+        Timber.d("onConnectFailed()");
+        if (uiHandler != null)
+            uiHandler.obtainMessage(MessageType.TOAST, Toasts.CONNECT_FAILED).sendToTarget();
+
+        state = State.NONE;
+
+        // don't notify as start() notifies immediately afterwards
+        // onStateChanged();
+
+        // Start the service over to restart listening mode
+        if (!halt) start();
+    }
+
+    /**
+     * Indicate that the connection was lost
+     */
+    private void onConnectionLost() {
+        Timber.d("onConnectionLost()");
+        connectedName = null;
+        connectedCode = null;
+        if (reconnect) return;
+
+        state = State.NONE;
+
+        if (halt) return;
+
+        // don't notify as start() notifies immediately afterwards
+        // onStateChanged();
+
+        // Start the service over to restart listening mode
+        start();
+    }
+
+    /**
+     * This thread runs while listening for incoming connections. It behaves
+     * like a server-side client. It runs until a connection is accepted
+     * (or until cancelled).
+     */
+    private class AcceptThread extends Thread {
+        private final BluetoothServerSocket serverSocket;
+
+        public AcceptThread() {
+            // Create a new listening server socket
+            try {
+                serverSocket = bluetoothAdapter.listenUsingRfcommWithServiceRecord(SDP_NAME, SDP_UUID);
+                state = BluetoothService.State.LISTEN;
+            } catch (IOException ex) {
+                Timber.d(ex, "listen() failed");
+                throw new IllegalStateException();
+            }
+        }
+
+        public void run() {
+            Timber.d("BEGIN AcceptThread %s", this);
+
+            BluetoothSocket socket;
+
+            // Listen to the server socket if we're not connected
+            while (state != BluetoothService.State.CONNECTED) {
+                try {
+                    // This is a blocking call and will only return on a
+                    // successful connection or an exception
+                    socket = serverSocket.accept();
+                } catch (IOException ex) {
+                    Timber.d(ex, "accept() failed"); // this also happens on socket.close()
+                    break;
+                }
+
+                // If a connection was accepted
+                if (socket != null) {
+                    synchronized (BluetoothService.this) {
+                        switch (state) {
+                            case BluetoothService.State.LISTEN:
+                            case BluetoothService.State.CONNECTING:
+                                // Situation normal. Start the ConnectedThread.
+                                startConnected(socket, socket.getRemoteDevice());
+                                break;
+                            case BluetoothService.State.NONE:
+                            case BluetoothService.State.CONNECTED:
+                                // Either not ready or already connected. Terminate new socket.
+                                try {
+                                    socket.close();
+                                } catch (IOException ex) {
+                                    Timber.d(ex, "Could not close unwanted socket");
+                                }
+                                break;
+                        }
+                    }
+                }
+            }
+            Timber.d("END AcceptThread %s", this);
+        }
+
+        public void cancel() {
+            Timber.d("cancel() %s", this);
+            try {
+                serverSocket.close();
+            } catch (IOException ex) {
+                Timber.d(ex, "close() of server failed");
+            }
+        }
+    }
+
+    /**
+     * This thread runs while attempting to make an outgoing connection
+     * with a device. It runs straight through; the connection either
+     * succeeds or fails.
+     */
+    private class ConnectThread extends Thread {
+        private final BluetoothSocket socket;
+        private final BluetoothDevice device;
+
+        public ConnectThread(BluetoothDevice device) {
+            this.device = device;
+
+            // Create a BluetoothSocket
+            try {
+                socket = device.createRfcommSocketToServiceRecord(SDP_UUID);
+                state = BluetoothService.State.CONNECTING;
+            } catch (IOException ex) {
+                Timber.d(ex, "create() failed");
+                throw new IllegalStateException(); //TODO really die here?
+            }
+        }
+
+        public void run() {
+            Timber.d("BEGIN ConnectThread");
+
+            // Always cancel discovery because it will slow down a connection
+            bluetoothAdapter.cancelDiscovery(); //TODO show & remember discovery state?
+
+            // Make a connection to the BluetoothSocket
+            try {
+                // This is a blocking call and will only return on a
+                // successful connection or an exception
+                socket.connect(); // sometimes this fails - why?
+            } catch (IOException ex) {
+                try {
+                    socket.close();
+                } catch (IOException exClose) {
+                    Timber.d(exClose, "unable to close() socket during connection failure");
+                }
+                onConnectFailed();
+                return;
+            } finally {
+                // Reset the ConnectThread because we're done
+                synchronized (BluetoothService.this) {
+                    connectThread = null;
+                }
+            }
+
+            // Start the ConnectedThread
+            startConnected(socket, device);
+        }
+
+        public void cancel() {
+            try {
+                socket.close();
+            } catch (IOException ex) {
+                Timber.d(ex, "close() of connect socket failed");
+            }
+        }
+    }
+
+    /**
+     * This thread runs during a connection with a remote device.
+     * It handles all incoming and outgoing transmissions.
+     */
+    private class ConnectedThread extends Thread {
+        private final BluetoothSocket socket;
+        private final InputStream in;
+        private final OutputStream out;
+
+        private final ByteArrayOutputStream bytesIn = new ByteArrayOutputStream();
+        private final ByteArrayOutputStream bytesOut = new ByteArrayOutputStream();
+
+        private CountDownLatch readSignal = null; // TODO this needs to be a Map with correlationIds
+
+        public void setReadSignal(CountDownLatch signal) { //TODO see above
+            readSignal = signal;
+            readBuffer = null;
+        }
+
+        @Getter
+        private byte[] readBuffer = null;
+
+        public ConnectedThread(BluetoothSocket bluetoothSocket) {
+            Timber.d("ConnectedThread()");
+            socket = bluetoothSocket;
+            InputStream tmpIn = null;
+            OutputStream tmpOut;
+
+            // Get the BluetoothSocket input and output streams
+            try {
+                tmpIn = socket.getInputStream();
+                tmpOut = socket.getOutputStream();
+            } catch (IOException ex) {
+                Timber.d(ex, "temp sockets not created");
+                if (tmpIn != null)
+                    try {
+                        tmpIn.close();
+                    } catch (IOException exIn) {
+                        Timber.d(exIn);
+                    }
+                throw new IllegalStateException();
+            }
+
+            in = tmpIn;
+            out = tmpOut;
+            state = BluetoothService.State.CONNECTED;
+        }
+
+        public void run() {
+            Timber.d("BEGIN ConnectedThread %s", this);
+            final byte[] buffer = new byte[4096];
+            int bytesRead;
+
+            // Keep listening to the InputStream while connected
+            while (state == BluetoothService.State.CONNECTED) {
+                // Protocol: "SIDEKICK"|1-byte:reserved|2-bytes:length|buffer
+                try {
+                    // protocol header
+                    bytesRead = in.read(buffer, 0, MAGIC.length + 3);
+                    int a = in.available() + bytesRead;
+                    if (bytesRead != MAGIC.length + 3)
+                        throw new IllegalStateException("message too short");
+                    for (int i = 0; i < MAGIC.length; i++) {
+                        if (buffer[i] != MAGIC[i]) throw new IllegalStateException("no MAGIC");
+                    }
+                    final int options = buffer[MAGIC.length]; // 0 regular message, else CODE instead of payload length
+                    final int payloadLength = ((0xff & buffer[MAGIC.length + 1]) << 8) + (0xff & buffer[MAGIC.length + 2]);
+                    Timber.d("READ options %d, payloadLength=%d, available=%d", options, payloadLength, a);
+                    if ((options & 0x01) != 0) { // CODE
+                        connectedCode = String.format(Locale.US, "%04d", payloadLength);
+                        if (uiHandler != null)
+                            uiHandler.obtainMessage(MessageType.CODE, connectedCode).sendToTarget();
+                        continue;
+                    }
+
+                    int remainingBytes = payloadLength;
+                    bytesIn.reset();
+                    while (remainingBytes > 0) {
+                        bytesRead = in.read(buffer, 0, Math.min(remainingBytes, buffer.length));
+                        remainingBytes -= bytesRead;
+                        bytesIn.write(buffer, 0, bytesRead);
+                    }
+
+                    readBuffer = bytesIn.toByteArray();
+                    if (readSignal != null) { // someone is awaiting this
+                        readSignal.countDown();
+                    } else if (commHandler != null) { // we are the counterparty
+                        final int command = readBuffer[0];
+                        commHandler.obtainMessage(command, readBuffer).sendToTarget();
+                        if (uiHandler != null) {
+                            uiHandler.obtainMessage(MessageType.READ_CMD, readBuffer.length, command).sendToTarget();
+                        }
+                    } else {
+                        throw new IllegalStateException("would drop a message");
+                    }
+
+                } catch (IOException ex) {
+                    Timber.d(ex, "disconnected");
+                    if (readSignal != null) readSignal.countDown(); // readBudder is still null
+                    onConnectionLost();
+                    reconnect = false;
+                    break;
+                }
+            }
+            Timber.d("END ConnectedThread %s", this);
+        }
+
+        /**
+         * Write to the connected OutStream.
+         * <p>
+         * Protocol: "SIDEKICK"|1-byte:reserved|2-bytes:length|buffer
+         *
+         * @param buffer The bytes to write
+         */
+        public boolean write(byte[] buffer) {
+            boolean sendCode = buffer.length == 2; // TODO undo this hack
+            try {
+                final int len = buffer.length;
+                if (len > 65535) {
+                    Timber.w("buffer too long %d", len);
+                    return false;
+                }
+                bytesOut.reset();
+                bytesOut.write(MAGIC);
+                if (sendCode) {
+                    bytesOut.write(0x01); // options bit 0 is CODE
+                } else {
+                    bytesOut.write(0);
+                    bytesOut.write(len >> 8);
+                    bytesOut.write(len & 0xff);
+                }
+                bytesOut.write(buffer);
+                out.write(bytesOut.toByteArray());
+
+                if (uiHandler != null) {
+                    uiHandler.obtainMessage(MessageType.WRITE, buffer.length, -1).sendToTarget();
+                }
+            } catch (IOException ex) {
+                Timber.d(ex, "Exception during write");
+                return false;
+                //TODO probably kill the connection if this happens?
+                // but the read operation probably throws it as well, and that takes care of that!
+            }
+            return true;
+        }
+
+        public void cancel() {
+            try {
+                socket.close();
+            } catch (IOException ex) {
+                Timber.d(ex, "close() of connect socket failed");
+            }
+        }
+
+    }
+
+    // for direct communication from JNI
+    // this should block
+    static public byte[] Exchange(byte[] request) {
+        Timber.d("EXCHANGE req  = %d bytes", request.length);
+        final byte[] response = Instance.exchange(request);
+        Timber.d("EXCHANGE resp = %d bytes", response.length);
+        return response;
+    }
+
+    static public boolean Write(byte[] request) {
+        return Instance.write(request);
+    }
+}
diff --git a/app/src/main/java/com/m2049r/xmrwallet/service/MoneroHandlerThread.java b/app/src/main/java/com/m2049r/xmrwallet/service/MoneroHandlerThread.java
index 79ac24672d..6e5a46090a 100644
--- a/app/src/main/java/com/m2049r/xmrwallet/service/MoneroHandlerThread.java
+++ b/app/src/main/java/com/m2049r/xmrwallet/service/MoneroHandlerThread.java
@@ -26,7 +26,7 @@
 /**
  * Handy class for starting a new thread that has a looper. The looper can then be
  * used to create handler classes. Note that start() must still be called.
- * The started Thread has a stck size of STACK_SIZE (=5MB)
+ * The started Thread has a stack size of STACK_SIZE (=5MB)
  */
 public class MoneroHandlerThread extends Thread {
     // from src/cryptonote_config.h
diff --git a/app/src/main/java/com/m2049r/xmrwallet/util/Flasher.java b/app/src/main/java/com/m2049r/xmrwallet/util/Flasher.java
new file mode 100644
index 0000000000..a6da1680cb
--- /dev/null
+++ b/app/src/main/java/com/m2049r/xmrwallet/util/Flasher.java
@@ -0,0 +1,65 @@
+package com.m2049r.xmrwallet.util;
+
+import android.animation.ValueAnimator;
+import android.content.Context;
+import android.graphics.drawable.Drawable;
+import android.view.View;
+
+import androidx.core.content.res.ResourcesCompat;
+
+import lombok.Getter;
+
+public class Flasher {
+    public interface Light {
+        int getDrawableId();
+    }
+
+    final private static int ON_TIME = 80; //ms
+    final private static int DURATION = 100 + ON_TIME; //ms
+    final private static int OFF_TIME = 600; //ms
+    @Getter
+    final private Drawable drawable;
+    private long t;
+    private ValueAnimator animator;
+
+    private final int colorOff, colorOn;
+    private int colorCurrent;
+
+    public Flasher(Context ctx, Light light) {
+        colorOff = ThemeHelper.getThemedColor(ctx, android.R.attr.colorControlNormal);
+        colorOn = ThemeHelper.getThemedColor(ctx, android.R.attr.colorControlActivated);
+        drawable = getDrawable(ctx, light.getDrawableId());
+        drawable.setTint(colorOff);
+    }
+
+    public void flash(View view) {
+        if (view == null) return;
+        if (animator != null) animator.cancel();
+
+        final long now = System.currentTimeMillis();
+        t = now;
+
+        animator = ValueAnimator.ofArgb(colorOff, colorOn); // always blink nomatter what
+        animator.addUpdateListener(valueAnimator -> {
+            colorCurrent = (Integer) valueAnimator.getAnimatedValue();
+            drawable.setTint(colorCurrent);
+        });
+        animator.setDuration(ON_TIME);
+        animator.start();
+        view.postDelayed(() -> {
+            if (t == now) { // only turn it off if we turned it on last
+                animator = ValueAnimator.ofArgb(colorCurrent, colorOff);
+                animator.addUpdateListener(valueAnimator -> {
+                    colorCurrent = (Integer) valueAnimator.getAnimatedValue();
+                    drawable.setTint(colorCurrent);
+                });
+                animator.setDuration(Math.abs((long) (1. * OFF_TIME * ((colorCurrent - colorOff) / (colorOn - colorOff)))));
+                animator.start();
+            }
+        }, DURATION);
+    }
+
+    private Drawable getDrawable(Context ctx, int drawableId) {
+        return ResourcesCompat.getDrawable(ctx.getResources(), drawableId, null);
+    }
+}
diff --git a/app/src/main/res/drawable-v24/ic_launcher_foreground.xml b/app/src/main/res/drawable-v24/ic_launcher_foreground.xml
new file mode 100644
index 0000000000..3143685ea6
--- /dev/null
+++ b/app/src/main/res/drawable-v24/ic_launcher_foreground.xml
@@ -0,0 +1,32 @@
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:aapt="http://schemas.android.com/aapt"
+    android:width="108dp"
+    android:height="108dp"
+    android:viewportWidth="108"
+    android:viewportHeight="108">
+  <group android:scaleX="0.9961111"
+      android:scaleY="0.9961111"
+      android:translateX="0.21"
+      android:translateY="0.21">
+    <path
+        android:pathData="M0,0h108v108h-108z">
+      <aapt:attr name="android:fillColor">
+        <gradient 
+            android:startX="54"
+            android:startY="41.11"
+            android:endX="54"
+            android:endY="85.99"
+            android:type="linear">
+          <item android:offset="0" android:color="#FFF26222"/>
+          <item android:offset="1" android:color="#FFED1A5B"/>
+        </gradient>
+      </aapt:attr>
+    </path>
+    <path
+        android:pathData="M62.76,39.37a11.13,11.13 0,0 0,-8.86 4.39,11.13 11.13,0 0,0 -15.42,-2.25V40H33.89V67.87h4.59V50.53a6.57,6.57 0,1 1,13.13 0V67.87H56.2V50.53a6.57,6.57 0,1 1,13.13 0V67.87a6.57,6.57 0,0 1,-6.57 6.56V79A11.17,11.17 0,0 0,73.92 67.87V49.28h0A11.24,11.24 0,0 0,62.76 39.37Z"
+        android:fillColor="#fff"/>
+    <path
+        android:pathData="M71.62,33.07m-2.38,0a2.38,2.38 0,1 1,4.76 0a2.38,2.38 0,1 1,-4.76 0"
+        android:fillColor="#fff"/>
+  </group>
+</vector>
diff --git a/app/src/main/res/drawable/ic_bluetooth_24.xml b/app/src/main/res/drawable/ic_bluetooth_24.xml
new file mode 100644
index 0000000000..1e9621bf92
--- /dev/null
+++ b/app/src/main/res/drawable/ic_bluetooth_24.xml
@@ -0,0 +1,10 @@
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+    android:width="24dp"
+    android:height="24dp"
+    android:viewportWidth="24"
+    android:viewportHeight="24"
+    android:tint="?attr/colorControlNormal">
+  <path
+      android:fillColor="@android:color/white"
+      android:pathData="M17.71,7.71L12,2h-1v7.59L6.41,5 5,6.41 10.59,12 5,17.59 6.41,19 11,14.41L11,22h1l5.71,-5.71 -4.3,-4.29 4.3,-4.29zM13,5.83l1.88,1.88L13,9.59L13,5.83zM14.88,16.29L13,18.17v-3.76l1.88,1.88z"/>
+</vector>
diff --git a/app/src/main/res/drawable/ic_bluetooth_connected_24.xml b/app/src/main/res/drawable/ic_bluetooth_connected_24.xml
new file mode 100644
index 0000000000..95db32a8ca
--- /dev/null
+++ b/app/src/main/res/drawable/ic_bluetooth_connected_24.xml
@@ -0,0 +1,10 @@
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+    android:width="24dp"
+    android:height="24dp"
+    android:viewportWidth="24"
+    android:viewportHeight="24"
+    android:tint="?attr/colorControlNormal">
+  <path
+      android:fillColor="@android:color/white"
+      android:pathData="M7,12l-2,-2 -2,2 2,2 2,-2zM17.71,7.71L12,2h-1v7.59L6.41,5 5,6.41 10.59,12 5,17.59 6.41,19 11,14.41L11,22h1l5.71,-5.71 -4.3,-4.29 4.3,-4.29zM13,5.83l1.88,1.88L13,9.59L13,5.83zM14.88,16.29L13,18.17v-3.76l1.88,1.88zM19,10l-2,2 2,2 2,-2 -2,-2z"/>
+</vector>
diff --git a/app/src/main/res/drawable/ic_bluetooth_disabled_24.xml b/app/src/main/res/drawable/ic_bluetooth_disabled_24.xml
new file mode 100644
index 0000000000..111179bc13
--- /dev/null
+++ b/app/src/main/res/drawable/ic_bluetooth_disabled_24.xml
@@ -0,0 +1,10 @@
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+    android:width="24dp"
+    android:height="24dp"
+    android:viewportWidth="24"
+    android:viewportHeight="24"
+    android:tint="?attr/colorControlNormal">
+  <path
+      android:fillColor="@android:color/white"
+      android:pathData="M13,5.83l1.88,1.88 -1.6,1.6 1.41,1.41 3.02,-3.02L12,2h-1v5.03l2,2v-3.2zM5.41,4L4,5.41 10.59,12 5,17.59 6.41,19 11,14.41V22h1l4.29,-4.29 2.3,2.29L20,18.59 5.41,4zM13,18.17v-3.76l1.88,1.88L13,18.17z"/>
+</vector>
diff --git a/app/src/main/res/drawable/ic_bluetooth_searching_24.xml b/app/src/main/res/drawable/ic_bluetooth_searching_24.xml
new file mode 100644
index 0000000000..5f9dd59f41
--- /dev/null
+++ b/app/src/main/res/drawable/ic_bluetooth_searching_24.xml
@@ -0,0 +1,11 @@
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+    android:width="24dp"
+    android:height="24dp"
+    android:viewportWidth="24"
+    android:viewportHeight="24"
+    android:tint="?attr/colorControlNormal"
+    android:autoMirrored="true">
+  <path
+      android:fillColor="@android:color/white"
+      android:pathData="M14.24,12.01l2.32,2.32c0.28,-0.72 0.44,-1.51 0.44,-2.33 0,-0.82 -0.16,-1.59 -0.43,-2.31l-2.33,2.32zM19.53,6.71l-1.26,1.26c0.63,1.21 0.98,2.57 0.98,4.02s-0.36,2.82 -0.98,4.02l1.2,1.2c0.97,-1.54 1.54,-3.36 1.54,-5.31 -0.01,-1.89 -0.55,-3.67 -1.48,-5.19zM15.71,7.71L10,2L9,2v7.59L4.41,5 3,6.41 8.59,12 3,17.59 4.41,19 9,14.41L9,22h1l5.71,-5.71 -4.3,-4.29 4.3,-4.29zM11,5.83l1.88,1.88L11,9.59L11,5.83zM12.88,16.29L11,18.17v-3.76l1.88,1.88z"/>
+</vector>
diff --git a/app/src/main/res/drawable/ic_launcher_background.xml b/app/src/main/res/drawable/ic_launcher_background.xml
index 85c122df95..ca3826a46c 100644
--- a/app/src/main/res/drawable/ic_launcher_background.xml
+++ b/app/src/main/res/drawable/ic_launcher_background.xml
@@ -1,29 +1,74 @@
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:aapt="http://schemas.android.com/aapt"
-    android:width="108dp"
+<?xml version="1.0" encoding="utf-8"?>
+<vector
     android:height="108dp"
+    android:width="108dp"
+    android:viewportHeight="108"
     android:viewportWidth="108"
-    android:viewportHeight="108">
-    <path
-        android:fillColor="#fff"
-        android:pathData="M0,0h108v108h-108z"
-        android:strokeWidth="0.3"
-        android:strokeColor="#000" />
-    <path android:pathData="M0,0h108v108h-108z">
-        <aapt:attr name="android:fillColor">
-            <gradient
-                android:endX="54"
-                android:endY="85.99"
-                android:startX="54"
-                android:startY="41.11"
-                android:type="linear">
-                <item
-                    android:color="#FFF26222"
-                    android:offset="0" />
-                <item
-                    android:color="#FFED1A5B"
-                    android:offset="1" />
-            </gradient>
-        </aapt:attr>
-    </path>
+    xmlns:android="http://schemas.android.com/apk/res/android">
+    <path android:fillColor="#3DDC84"
+          android:pathData="M0,0h108v108h-108z"/>
+    <path android:fillColor="#00000000" android:pathData="M9,0L9,108"
+          android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
+    <path android:fillColor="#00000000" android:pathData="M19,0L19,108"
+          android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
+    <path android:fillColor="#00000000" android:pathData="M29,0L29,108"
+          android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
+    <path android:fillColor="#00000000" android:pathData="M39,0L39,108"
+          android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
+    <path android:fillColor="#00000000" android:pathData="M49,0L49,108"
+          android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
+    <path android:fillColor="#00000000" android:pathData="M59,0L59,108"
+          android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
+    <path android:fillColor="#00000000" android:pathData="M69,0L69,108"
+          android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
+    <path android:fillColor="#00000000" android:pathData="M79,0L79,108"
+          android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
+    <path android:fillColor="#00000000" android:pathData="M89,0L89,108"
+          android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
+    <path android:fillColor="#00000000" android:pathData="M99,0L99,108"
+          android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
+    <path android:fillColor="#00000000" android:pathData="M0,9L108,9"
+          android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
+    <path android:fillColor="#00000000" android:pathData="M0,19L108,19"
+          android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
+    <path android:fillColor="#00000000" android:pathData="M0,29L108,29"
+          android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
+    <path android:fillColor="#00000000" android:pathData="M0,39L108,39"
+          android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
+    <path android:fillColor="#00000000" android:pathData="M0,49L108,49"
+          android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
+    <path android:fillColor="#00000000" android:pathData="M0,59L108,59"
+          android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
+    <path android:fillColor="#00000000" android:pathData="M0,69L108,69"
+          android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
+    <path android:fillColor="#00000000" android:pathData="M0,79L108,79"
+          android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
+    <path android:fillColor="#00000000" android:pathData="M0,89L108,89"
+          android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
+    <path android:fillColor="#00000000" android:pathData="M0,99L108,99"
+          android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
+    <path android:fillColor="#00000000" android:pathData="M19,29L89,29"
+          android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
+    <path android:fillColor="#00000000" android:pathData="M19,39L89,39"
+          android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
+    <path android:fillColor="#00000000" android:pathData="M19,49L89,49"
+          android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
+    <path android:fillColor="#00000000" android:pathData="M19,59L89,59"
+          android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
+    <path android:fillColor="#00000000" android:pathData="M19,69L89,69"
+          android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
+    <path android:fillColor="#00000000" android:pathData="M19,79L89,79"
+          android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
+    <path android:fillColor="#00000000" android:pathData="M29,19L29,89"
+          android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
+    <path android:fillColor="#00000000" android:pathData="M39,19L39,89"
+          android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
+    <path android:fillColor="#00000000" android:pathData="M49,19L49,89"
+          android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
+    <path android:fillColor="#00000000" android:pathData="M59,19L59,89"
+          android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
+    <path android:fillColor="#00000000" android:pathData="M69,19L69,89"
+          android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
+    <path android:fillColor="#00000000" android:pathData="M79,19L79,89"
+          android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
 </vector>
diff --git a/app/src/main/res/drawable/ic_launcher_foreground.xml b/app/src/main/res/drawable/ic_launcher_foreground.xml
deleted file mode 100644
index 2c2fd4b450..0000000000
--- a/app/src/main/res/drawable/ic_launcher_foreground.xml
+++ /dev/null
@@ -1,12 +0,0 @@
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
-    android:width="108dp"
-    android:height="108dp"
-    android:viewportWidth="108"
-    android:viewportHeight="108">
-    <path
-        android:fillColor="#fff"
-        android:pathData="M62.76,39.37a11.13,11.13 0,0 0,-8.86 4.39,11.13 11.13,0 0,0 -15.42,-2.25V40H33.89V67.87h4.59V50.53a6.57,6.57 0,1 1,13.13 0V67.87H56.2V50.53a6.57,6.57 0,1 1,13.13 0V67.87a6.57,6.57 0,0 1,-6.57 6.56V79A11.17,11.17 0,0 0,73.92 67.87V49.28h-0.07A11.17,11.17 0,0 0,62.76 39.37Z" />
-    <path
-        android:fillColor="#fff"
-        android:pathData="M71.62,33.07m-2.38,0a2.38,2.38 0,1 1,4.76 0a2.38,2.38 0,1 1,-4.76 0" />
-</vector>
diff --git a/app/src/main/res/drawable/ic_sidekick_restore.xml b/app/src/main/res/drawable/ic_sidekick_restore.xml
new file mode 100644
index 0000000000..c6ba54432f
--- /dev/null
+++ b/app/src/main/res/drawable/ic_sidekick_restore.xml
@@ -0,0 +1,10 @@
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+    android:width="24dp"
+    android:height="24dp"
+    android:viewportWidth="320"
+    android:viewportHeight="320">
+    <path
+        android:fillColor="#fff"
+        android:pathData="M159.56,35.7c-68.48,0 -124,55.52 -124,124s55.52,124 124,124 124,-55.52 124,-124 -55.52,-124 -124,-124ZM97.94,224c-4.25,0 -7.69,-3.44 -7.69,-7.69s3.44,-7.69 7.69,-7.69 7.69,3.44 7.69,7.69 -3.44,7.69 -7.69,7.69ZM190.11,223.74h-70.41v-14.86h70.41c11.7,0 21.23,-9.52 21.23,-21.23s-9.52,-21.23 -21.23,-21.23h-56.09c-19.9,0 -36.08,-16.19 -36.08,-36.08s16.19,-36.08 36.08,-36.08h70.41v14.86h-70.41c-11.7,0 -21.23,9.52 -21.23,21.23s9.52,21.23 21.23,21.23h56.09c19.9,0 36.08,16.19 36.08,36.08s-16.19,36.08 -36.08,36.08ZM226.19,109.38c-4.25,0 -7.69,-3.44 -7.69,-7.69s3.44,-7.69 7.69,-7.69 7.69,3.44 7.69,7.69 -3.44,7.69 -7.69,7.69Z"
+        android:strokeWidth="0" />
+</vector>
diff --git a/app/src/main/res/layout/activity_sidekick.xml b/app/src/main/res/layout/activity_sidekick.xml
new file mode 100644
index 0000000000..3f0b8c6a15
--- /dev/null
+++ b/app/src/main/res/layout/activity_sidekick.xml
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="utf-8"?>
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    android:orientation="vertical">
+
+    <com.m2049r.xmrwallet.widget.Toolbar
+        android:id="@+id/toolbar"
+        style="@style/MonerujoToolbar"
+        android:layout_width="match_parent"
+        android:layout_height="?android:attr/actionBarSize"
+        android:background="@drawable/backgound_toolbar_mainnet"
+        android:minHeight="?android:attr/actionBarSize" />
+
+    <LinearLayout
+        android:layout_width="match_parent"
+        android:layout_height="match_parent"
+        android:layout_margin="8dp"
+        android:orientation="vertical">
+
+        <FrameLayout
+            android:id="@+id/fragment_bluetooth"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content" />
+
+        <FrameLayout
+            android:id="@+id/fragment_sidekick"
+            android:layout_marginTop="8dp"
+            android:layout_width="match_parent"
+            android:layout_height="match_parent" />
+
+    </LinearLayout>
+</LinearLayout>
\ No newline at end of file
diff --git a/app/src/main/res/layout/activity_wallet.xml b/app/src/main/res/layout/activity_wallet.xml
index 583b039a79..75672049dc 100644
--- a/app/src/main/res/layout/activity_wallet.xml
+++ b/app/src/main/res/layout/activity_wallet.xml
@@ -20,6 +20,11 @@
             android:background="@drawable/backgound_toolbar_mainnet"
             android:minHeight="?android:attr/actionBarSize" />
 
+        <FrameLayout
+            android:id="@+id/fragment_bluetooth"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content" />
+
         <FrameLayout
             android:id="@+id/fragment_container"
             android:layout_width="match_parent"
diff --git a/app/src/main/res/layout/bluetooth_device_name.xml b/app/src/main/res/layout/bluetooth_device_name.xml
new file mode 100644
index 0000000000..d93f8a56af
--- /dev/null
+++ b/app/src/main/res/layout/bluetooth_device_name.xml
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="utf-8"?><!-- Copyright (C) 2014 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+<TextView xmlns:android="http://schemas.android.com/apk/res/android"
+    style="@style/MoneroText"
+    android:layout_width="match_parent"
+    android:layout_height="wrap_content" />
diff --git a/app/src/main/res/layout/fragment_bluetooth.xml b/app/src/main/res/layout/fragment_bluetooth.xml
new file mode 100644
index 0000000000..a1e06b1692
--- /dev/null
+++ b/app/src/main/res/layout/fragment_bluetooth.xml
@@ -0,0 +1,50 @@
+<?xml version="1.0" encoding="utf-8"?>
+<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:tools="http://schemas.android.com/tools"
+    android:layout_width="match_parent"
+    android:layout_height="wrap_content">
+
+    <FrameLayout
+        android:id="@+id/btGroup"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_alignParentStart="true"
+        android:layout_centerVertical="true">
+
+        <ImageView
+            android:id="@+id/btIcon"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_gravity="center"
+            android:padding="8dp"
+            android:src="@drawable/ic_bluetooth_disabled_24" />
+
+        <ProgressBar
+            android:id="@+id/pbConnecting"
+            android:layout_width="match_parent"
+            android:layout_height="match_parent"
+            android:layout_gravity="center"
+            android:indeterminate="true"
+            android:visibility="invisible" />
+    </FrameLayout>
+
+    <TextView
+        android:id="@+id/btName"
+        style="@style/MoneroText.Large"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_centerVertical="true"
+        android:layout_toEndOf="@id/btGroup"
+        tools:text="My Librem 5" />
+
+    <TextView
+        android:id="@+id/btCode"
+        style="@style/MoneroText"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_alignParentEnd="true"
+        android:layout_centerVertical="true"
+        android:layout_marginEnd="8dp"
+        tools:text="PIN: 0000" />
+
+</RelativeLayout>
\ No newline at end of file
diff --git a/app/src/main/res/layout/fragment_login.xml b/app/src/main/res/layout/fragment_login.xml
index 7f582df3c6..aee4949007 100644
--- a/app/src/main/res/layout/fragment_login.xml
+++ b/app/src/main/res/layout/fragment_login.xml
@@ -19,94 +19,101 @@
             android:layout_height="wrap_content"
             android:orientation="vertical" />
 
-        <TextView
-            style="@style/MoneroLabel.Heading"
+        <LinearLayout
+            android:id="@+id/llNetInfo"
             android:layout_width="match_parent"
             android:layout_height="wrap_content"
-            android:layout_marginStart="8dp"
-            android:gravity="start|center"
-            android:padding="8dp"
-            android:text="@string/label_daemon" />
+            android:orientation="vertical">
 
-        <RelativeLayout
-            android:layout_width="match_parent"
-            android:layout_height="wrap_content"
-            android:layout_marginStart="16dp"
-            android:layout_marginEnd="16dp"
-            android:layout_marginBottom="8dp">
-
-            <com.google.android.material.progressindicator.CircularProgressIndicator
-                android:id="@+id/pbNetwork"
-                android:layout_width="0dp"
-                android:layout_height="0dp"
-                android:layout_alignStart="@id/ibNetwork"
-                android:layout_alignTop="@+id/ibNetwork"
-                android:layout_alignEnd="@id/ibNetwork"
-                android:layout_alignBottom="@id/ibNetwork"
-                android:layout_gravity="center"
-                android:indeterminate="true"
-                android:progress="100"
-                android:visibility="visible"
-                app:indicatorInset="9dp"
-                app:indicatorSize="30dp"
-                app:trackThickness="2dp" />
-
-            <ImageButton
-                android:id="@+id/ibNetwork"
-                android:layout_width="wrap_content"
+            <TextView
+                style="@style/MoneroLabel.Heading"
+                android:layout_width="match_parent"
                 android:layout_height="wrap_content"
-                android:layout_alignParentStart="true"
-                android:layout_centerInParent="true"
-                android:background="?android:attr/selectableItemBackgroundBorderless"
-                android:gravity="center"
-                android:padding="12dp"
-                android:src="@drawable/ic_network_clearnet"
-                android:contentDescription="@string/tor_enable" />
+                android:layout_marginStart="8dp"
+                android:gravity="start|center"
+                android:padding="8dp"
+                android:text="@string/label_daemon" />
 
-            <FrameLayout
+            <RelativeLayout
                 android:layout_width="match_parent"
-                android:layout_height="0dp"
-                android:layout_alignTop="@+id/ibNetwork"
-                android:layout_alignBottom="@id/ibNetwork"
-                android:layout_toStartOf="@+id/ibRenew"
-                android:layout_toEndOf="@+id/ibNetwork">
-
-                <LinearLayout
-                    android:id="@+id/llNode"
-                    android:layout_width="match_parent"
-                    android:layout_height="match_parent"
-                    android:background="?android:attr/selectableItemBackground"
-                    android:gravity="center_vertical"
-                    android:orientation="vertical">
-
-                    <TextView
-                        android:id="@+id/tvNodeName"
-                        style="@style/MoneroText.PosAmount"
-                        android:layout_width="wrap_content"
-                        android:layout_height="wrap_content"
-                        tools:text="monero-v9.monerujo.io" />
-
-                    <TextView
-                        android:id="@+id/tvInfo"
-                        style="@style/MoneroText.Small"
-                        android:layout_width="wrap_content"
-                        android:layout_height="wrap_content"
-                        tools:text="Last Block: 2 minutes ago" />
-                </LinearLayout>
-            </FrameLayout>
-
-            <ImageButton
-                android:id="@+id/ibRenew"
-                android:layout_width="wrap_content"
                 android:layout_height="wrap_content"
-                android:layout_alignParentEnd="true"
-                android:layout_centerInParent="true"
-                android:background="?android:attr/selectableItemBackgroundBorderless"
-                android:gravity="center"
-                android:padding="12dp"
-                android:src="@drawable/ic_renew"
-                android:contentDescription="@string/node_refresh_hint" />
-        </RelativeLayout>
+                android:layout_marginStart="16dp"
+                android:layout_marginEnd="16dp"
+                android:layout_marginBottom="8dp">
+
+                <com.google.android.material.progressindicator.CircularProgressIndicator
+                    android:id="@+id/pbNetwork"
+                    android:layout_width="0dp"
+                    android:layout_height="0dp"
+                    android:layout_alignStart="@id/ibNetwork"
+                    android:layout_alignTop="@+id/ibNetwork"
+                    android:layout_alignEnd="@id/ibNetwork"
+                    android:layout_alignBottom="@id/ibNetwork"
+                    android:layout_gravity="center"
+                    android:indeterminate="true"
+                    android:progress="100"
+                    android:visibility="visible"
+                    app:indicatorInset="9dp"
+                    app:indicatorSize="30dp"
+                    app:trackThickness="2dp" />
+
+                <ImageButton
+                    android:id="@+id/ibNetwork"
+                    android:layout_width="wrap_content"
+                    android:layout_height="wrap_content"
+                    android:layout_alignParentStart="true"
+                    android:layout_centerInParent="true"
+                    android:background="?android:attr/selectableItemBackgroundBorderless"
+                    android:contentDescription="@string/tor_enable"
+                    android:gravity="center"
+                    android:padding="12dp"
+                    android:src="@drawable/ic_network_clearnet" />
+
+                <FrameLayout
+                    android:layout_width="match_parent"
+                    android:layout_height="0dp"
+                    android:layout_alignTop="@+id/ibNetwork"
+                    android:layout_alignBottom="@id/ibNetwork"
+                    android:layout_toStartOf="@+id/ibRenew"
+                    android:layout_toEndOf="@+id/ibNetwork">
+
+                    <LinearLayout
+                        android:id="@+id/llNode"
+                        android:layout_width="match_parent"
+                        android:layout_height="match_parent"
+                        android:background="?android:attr/selectableItemBackground"
+                        android:gravity="center_vertical"
+                        android:orientation="vertical">
+
+                        <TextView
+                            android:id="@+id/tvNodeName"
+                            style="@style/MoneroText.PosAmount"
+                            android:layout_width="wrap_content"
+                            android:layout_height="wrap_content"
+                            tools:text="monero-v9.monerujo.io" />
+
+                        <TextView
+                            android:id="@+id/tvInfo"
+                            style="@style/MoneroText.Small"
+                            android:layout_width="wrap_content"
+                            android:layout_height="wrap_content"
+                            tools:text="Last Block: 2 minutes ago" />
+                    </LinearLayout>
+                </FrameLayout>
+
+                <ImageButton
+                    android:id="@+id/ibRenew"
+                    android:layout_width="wrap_content"
+                    android:layout_height="wrap_content"
+                    android:layout_alignParentEnd="true"
+                    android:layout_centerInParent="true"
+                    android:background="?android:attr/selectableItemBackgroundBorderless"
+                    android:contentDescription="@string/node_refresh_hint"
+                    android:gravity="center"
+                    android:padding="12dp"
+                    android:src="@drawable/ic_renew" />
+            </RelativeLayout>
+        </LinearLayout>
 
         <EditText
             android:id="@+id/etDummy"
diff --git a/app/src/main/res/layout/fragment_sidekick.xml b/app/src/main/res/layout/fragment_sidekick.xml
new file mode 100644
index 0000000000..f82a9ae6eb
--- /dev/null
+++ b/app/src/main/res/layout/fragment_sidekick.xml
@@ -0,0 +1,82 @@
+<?xml version="1.0" encoding="utf-8"?>
+<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:tools="http://schemas.android.com/tools"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent">
+
+    <GridLayout
+        android:id="@+id/lights"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:columnCount="5" />
+
+    <RelativeLayout
+        android:id="@+id/confirmation"
+        android:layout_width="match_parent"
+        android:layout_height="match_parent"
+        android:visibility="visible">
+
+        <ScrollView
+            android:layout_width="match_parent"
+            android:layout_height="match_parent"
+            android:layout_above="@+id/buttons">
+
+            <LinearLayout
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:gravity="center"
+                android:orientation="vertical"
+                android:padding="8dp"
+                android:visibility="visible">
+
+                <TextView
+                    style="@style/MoneroText.Large.Accent"
+                    android:layout_width="wrap_content"
+                    android:layout_height="wrap_content"
+                    android:text="@string/sidekick_confirm_tx" />
+
+                <TextView
+                    android:id="@+id/tvFee"
+                    style="@style/MoneroText.Unconfirmed"
+                    android:layout_width="wrap_content"
+                    android:layout_height="wrap_content"
+                    tools:text="Fee 3.827222 XMR" />
+
+                <TextView
+                    android:id="@+id/tvTransfers"
+                    style="@style/MoneroText.Info"
+                    android:layout_width="match_parent"
+                    android:layout_height="wrap_content"
+                    android:layout_marginTop="32dp"
+                    tools:text="1.324243 XMR\n888tNkZrPN6JsEgekjMnABU4TBzc2Dt29EPAvkRxbANsAnjyPbb3iQ1YBRk1UXcdRsiKc9dhwMVgN5S9cQUiyoogDavup3H" />
+            </LinearLayout>
+        </ScrollView>
+
+        <LinearLayout
+            android:id="@+id/buttons"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:layout_alignParentBottom="true"
+            android:orientation="horizontal"
+            android:padding="16dp">
+
+            <com.google.android.material.button.MaterialButton
+                android:id="@+id/buttonDeny"
+                style="@style/MoneroButton"
+                android:layout_width="0dp"
+                android:layout_height="wrap_content"
+                android:layout_marginEnd="4dp"
+                android:layout_weight="1"
+                android:text="Deny" />
+
+            <com.google.android.material.button.MaterialButton
+                android:id="@+id/buttonAccept"
+                style="@style/MoneroButton"
+                android:layout_width="0dp"
+                android:layout_height="wrap_content"
+                android:layout_marginStart="4dp"
+                android:layout_weight="1"
+                android:text="Accept" />
+        </LinearLayout>
+    </RelativeLayout>
+</FrameLayout>
diff --git a/app/src/main/res/layout/fragment_sidekick_connect.xml b/app/src/main/res/layout/fragment_sidekick_connect.xml
new file mode 100644
index 0000000000..451f37dbb2
--- /dev/null
+++ b/app/src/main/res/layout/fragment_sidekick_connect.xml
@@ -0,0 +1,40 @@
+<?xml version="1.0" encoding="utf-8"?>
+<LinearLayout 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"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    android:layout_margin="8dp"
+    android:orientation="vertical">
+
+    <androidx.fragment.app.FragmentContainerView
+        android:id="@+id/bt_fragment"
+        android:name="com.m2049r.xmrwallet.BluetoothFragment"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        tools:layout="@layout/fragment_bluetooth" />
+
+    <TextView
+        style="@style/MoneroLabel.Heading"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:layout_marginTop="8dp"
+        android:layout_marginBottom="8dp"
+        android:gravity="center"
+        android:text="@string/bluetooth_select_label" />
+
+    <androidx.swiperefreshlayout.widget.SwipeRefreshLayout
+        android:id="@+id/pullToRefresh"
+        android:layout_width="match_parent"
+        android:layout_height="match_parent">
+
+        <androidx.recyclerview.widget.RecyclerView
+            android:id="@+id/list"
+            android:layout_width="match_parent"
+            android:layout_height="match_parent"
+            android:clipToPadding="false"
+            app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager"
+            tools:listitem="@layout/item_bluetooth" />
+    </androidx.swiperefreshlayout.widget.SwipeRefreshLayout>
+
+</LinearLayout>
\ No newline at end of file
diff --git a/app/src/main/res/layout/item_bluetooth.xml b/app/src/main/res/layout/item_bluetooth.xml
new file mode 100644
index 0000000000..c3333547c8
--- /dev/null
+++ b/app/src/main/res/layout/item_bluetooth.xml
@@ -0,0 +1,39 @@
+<?xml version="1.0" encoding="utf-8"?>
+<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:tools="http://schemas.android.com/tools"
+    android:layout_width="match_parent"
+    android:layout_height="wrap_content"
+    android:padding="8dp"
+    android:background="@drawable/selector_login">
+
+    <ImageView
+        android:id="@+id/icon"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_marginEnd="8dp"
+        android:layout_centerVertical="true"
+        android:src="@drawable/ic_bluetooth_24" />
+
+    <LinearLayout
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_toEndOf="@id/icon"
+        android:layout_centerVertical="true"
+        android:orientation="vertical">
+
+        <TextView
+            android:id="@+id/tvName"
+            style="@style/MoneroText.PosAmount"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            tools:text="My Librem 5" />
+
+        <TextView
+            android:id="@+id/tvAddress"
+            style="@style/MoneroText.Small"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            tools:text="AB:CD:EF:01:23:45" />
+
+    </LinearLayout>
+</RelativeLayout>
\ No newline at end of file
diff --git a/app/src/main/res/layout/layout_fabmenu.xml b/app/src/main/res/layout/layout_fabmenu.xml
index 02778f85ed..88f846123d 100644
--- a/app/src/main/res/layout/layout_fabmenu.xml
+++ b/app/src/main/res/layout/layout_fabmenu.xml
@@ -29,8 +29,8 @@
                 android:layout_height="wrap_content"
                 android:layout_centerVertical="true"
                 android:layout_marginEnd="8dp"
-                android:text="@string/fab_create_new"
-                android:contentDescription="@string/fab_create_new" />
+                android:contentDescription="@string/fab_create_new"
+                android:text="@string/fab_create_new" />
 
             <com.google.android.material.floatingactionbutton.FloatingActionButton
                 android:id="@+id/fabNew"
@@ -63,8 +63,8 @@
                 android:layout_height="wrap_content"
                 android:layout_centerVertical="true"
                 android:layout_marginEnd="8dp"
-                android:text="@string/fab_restore_viewonly"
-                android:contentDescription="@string/fab_restore_viewonly" />
+                android:contentDescription="@string/fab_restore_viewonly"
+                android:text="@string/fab_restore_viewonly" />
 
             <com.google.android.material.floatingactionbutton.FloatingActionButton
                 android:id="@+id/fabView"
@@ -94,8 +94,8 @@
                 android:layout_height="wrap_content"
                 android:layout_centerVertical="true"
                 android:layout_marginEnd="8dp"
-                android:text="@string/fab_restore_key"
-                android:contentDescription="@string/fab_restore_key" />
+                android:contentDescription="@string/fab_restore_key"
+                android:text="@string/fab_restore_key" />
 
             <com.google.android.material.floatingactionbutton.FloatingActionButton
                 android:id="@+id/fabKey"
@@ -125,8 +125,8 @@
                 android:layout_height="wrap_content"
                 android:layout_centerVertical="true"
                 android:layout_marginEnd="8dp"
-                android:text="@string/fab_restore_seed"
-                android:contentDescription="@string/fab_restore_seed" />
+                android:contentDescription="@string/fab_restore_seed"
+                android:text="@string/fab_restore_seed" />
 
             <com.google.android.material.floatingactionbutton.FloatingActionButton
                 android:id="@+id/fabSeed"
@@ -156,8 +156,8 @@
                 android:layout_height="wrap_content"
                 android:layout_centerVertical="true"
                 android:layout_marginEnd="8dp"
-                android:text="@string/menu_restore"
-                android:contentDescription="@string/menu_restore" />
+                android:contentDescription="@string/menu_restore"
+                android:text="@string/menu_restore" />
 
             <com.google.android.material.floatingactionbutton.FloatingActionButton
                 android:id="@+id/fabImport"
@@ -207,6 +207,37 @@
 
         </RelativeLayout>
 
+        <RelativeLayout
+            android:id="@+id/fabSidekickL"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_alignParentEnd="true"
+            android:layout_alignParentBottom="true"
+            android:visibility="gone">
+
+            <TextView
+                android:id="@+id/fabSidekickT"
+                style="@style/MoneroFab"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:layout_centerVertical="true"
+                android:layout_marginEnd="8dp"
+                android:text="@string/fab_restore_sidekick" />
+
+            <com.google.android.material.floatingactionbutton.FloatingActionButton
+                android:id="@+id/fabSidekick"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:layout_margin="8dp"
+                android:layout_toEndOf="@+id/fabSidekickT"
+                android:elevation="6dp"
+                android:src="@drawable/ic_sidekick_restore"
+                app:borderWidth="0dp"
+                app:fabSize="mini"
+                app:pressedTranslationZ="12dp" />
+
+        </RelativeLayout>
+
     </RelativeLayout>
 
     <LinearLayout
@@ -227,13 +258,13 @@
             android:layout_gravity="bottom|end"
             android:backgroundTint="@android:color/transparent"
             android:backgroundTintMode="src_in"
+            android:contentDescription="@string/fab_create_new"
             android:src="@drawable/ic_add"
             app:borderWidth="0dp"
             app:elevation="0dp"
             app:fabSize="normal"
             app:pressedTranslationZ="0dp"
-            app:tint="?attr/toolbarTextColor"
-            android:contentDescription="@string/fab_create_new" />
+            app:tint="?attr/toolbarTextColor" />
     </LinearLayout>
 
 </RelativeLayout>
diff --git a/app/src/main/res/menu/create_wallet_ledger.xml b/app/src/main/res/menu/create_wallet_ledger.xml
index 8bd54cb6e0..9fe4aded79 100644
--- a/app/src/main/res/menu/create_wallet_ledger.xml
+++ b/app/src/main/res/menu/create_wallet_ledger.xml
@@ -3,7 +3,7 @@
     xmlns:app="http://schemas.android.com/apk/res-auto">
 
     <item
-        android:id="@+id/action_create_help_ledger"
+        android:id="@+id/action_create_help_sidekick"
         android:icon="@drawable/ic_help_white_24dp"
         android:orderInCategory="100"
         android:title="@string/menu_help"
diff --git a/app/src/main/res/menu/create_wallet_sidekick.xml b/app/src/main/res/menu/create_wallet_sidekick.xml
new file mode 100644
index 0000000000..8bd54cb6e0
--- /dev/null
+++ b/app/src/main/res/menu/create_wallet_sidekick.xml
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="utf-8"?>
+<menu xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:app="http://schemas.android.com/apk/res-auto">
+
+    <item
+        android:id="@+id/action_create_help_ledger"
+        android:icon="@drawable/ic_help_white_24dp"
+        android:orderInCategory="100"
+        android:title="@string/menu_help"
+        app:showAsAction="always" />
+
+</menu>
\ No newline at end of file
diff --git a/app/src/main/res/menu/list_menu.xml b/app/src/main/res/menu/list_menu.xml
index f660304a90..da7d5a0d7c 100644
--- a/app/src/main/res/menu/list_menu.xml
+++ b/app/src/main/res/menu/list_menu.xml
@@ -8,4 +8,10 @@
         android:orderInCategory="100"
         android:title="@string/menu_help"
         app:showAsAction="ifRoom" />
+    <item
+        android:id="@+id/action_sidekick"
+        android:icon="@drawable/ic_sidekick_restore"
+        android:orderInCategory="200"
+        android:title="@string/menu_bluetooth"
+        app:showAsAction="ifRoom" />
 </menu>
\ No newline at end of file
diff --git a/app/src/main/res/menu/sidekick_connect_menu.xml b/app/src/main/res/menu/sidekick_connect_menu.xml
new file mode 100644
index 0000000000..3957b5db1a
--- /dev/null
+++ b/app/src/main/res/menu/sidekick_connect_menu.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="utf-8"?>
+<menu xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:app="http://schemas.android.com/apk/res-auto">
+
+    <item
+        android:id="@+id/action_help_sidekick"
+        android:orderInCategory="300"
+        android:title="@string/menu_help"
+        app:showAsAction="ifRoom" />
+</menu>
\ No newline at end of file
diff --git a/app/src/main/res/mipmap-hdpi/ic_launcher.png b/app/src/main/res/mipmap-hdpi/ic_launcher.png
deleted file mode 100644
index 37b6c08a1c775c5e4d5aea675633bff7c7ac647d..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 2667
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
Z{{nNIV68@aE3g0n002ovPDHLkV1m$q?T`Qf

diff --git a/app/src/main/res/mipmap-hdpi/ic_launcher.webp b/app/src/main/res/mipmap-hdpi/ic_launcher.webp
new file mode 100644
index 0000000000000000000000000000000000000000..506c08980ad2abc5072d9305b9d95f3b7ea61339
GIT binary patch
literal 1724
zcmV;t21EH$Nk&Gr1^@t8MM6+kP&iDd1^@srN5Byf3B_&OMv#-Avj4*Au|h=uC!jcY
zJeXu@GSV<h@dNM%6Rx#j)HaeNLudq}dC#8wk(>bbwQ3IAAQ(lGq$rn;Vf+i*_evNE
z2H8f=HOm1!!uNjyPzL~CghNe$1U5AH_LU4s1RNY4G665Zv3wu_5CCYiM*su>eS(jJ
z@B=&q2c>J<4oTAUMX7si+vd((+1}Z<<3G&l)mS^*wr$%}W@fzaAme=lt>qID*?pvD
z+qV46dB5Kehvvz%FF<4s9Rd=GEm(l;jp!SAch~Q|CEK=b+Rm73?|biyos_J)ZKL{9
zw{4^DRBhXKN@@84+t$;?UT|yMR;|o)ad(;^bC>uJA}fG4D24{y-7+$VCJ5c0IB?s>
zku<pMWvixMc>)kz=q@M`8&p*aF>;{viAw^Cl4=bkpDw@s+O87#SQIrW72r`Qpfd0z
z<x|-WaG2r!&wDy`x3(14!qhB4q4@V95L{3Ht+mvRk?bqFY%PWLKr@(RrQ{K2duGjM
z98wo0EdIUQ*YDfS{rl2EbtwQ@&%)H9k6X<H>~Rr?(En+QWGSEs8-z`ossJWHV5L=|
zED&hb0)#Vc<R8J3KtTK_yqhY5r4>QYLF-W-T7vU>8Boji879QM(JR`?n=3eaS!>r(
z4)E+e<o2#NSFlz(0dVut7v~Dz?;ZOuv#8{`9x-?DXt#^kvG|Ag<_=oP`^8I~2g@p2
z3If24YJ+i0#H<$CBGK{!aKFWU(xN3Ioh)8Sve}STgBJV&pOC=>lTa*||2u6d4e_%)
z@=|N;Idaxd)ZuX460AoehU_CdMJ`){4Fi(o7sWI1mTQs}<U~P<Km@kOCb|hEZLsc;
zt%s4AAUbV{=Iou~_$5kNXz+CRxywdVDwue(d=>~sInpLDBsCZ%J!FYU004VQf1(SA
zT(@_;9fJs{!59;`rQ$#U<a6_g+q<4UjVchpvtawS8LvVl$KjE>#|w!AEE%)!kSPKn
zcOP!E0gf_HHtTU&Ensit@KoD<Dd+=$B)PL2Jk;%My%s~-=!8UEhRL<7e8y;mWDk5J
zBM>qGhib0*c)~X_{uhh5ZAZcB%YU;|58w~)#cR1?KbT;`Ll|%#8h6VK9&gYoAj#Mu
z7zhC59kaGGKAxvRXY(B~DjYm!0!WhU=PJ+k6cZ&bH2Kf<=kZFs)-p;`tP-=&$OCXf
zaOTI09%y|jrS(#9`LfG0X#(&<FPJlzFcE=A0)coQqw|m9z9Nt^81H8j{bH%K!Y|fC
zhUXh;i~5iG%!bP#TzB*$#1{5%WC8-<j6C6(qAhQ#Kas=pl^GQbjfU)zAz%x8hyW6|
zK2@4pC1g`qCXF3L<WYgRmsx-S*i@C-MzpD2UnQ<aV^l;rl2v0jx8)e1p+`bccq&cO
zB#jg#o20I?lcX?77!M)N9y_U+A*pk<pX&i)?e=I~z_<aNdzo-fM_Z6=Yzbl9@gE?2
zP^M#43o+Xd#109`bt4eFu638})=t0Gd4g2jprD1FfK*yz)(ymvVB??CG;Sgi=SH<X
zADh~2F@apCG-TIs6w>^k*qV;>qFlR2``<|a;Y2G{X%cR%zl`)dz(oJ4tW&&s?FVJ-
z<n-@LMFcS2JcHr>aNdtwdPIQ9{?nG&%H#dRMg$qw;eyIW$yhC&k>7hr;_@UlNKx#S
zoE3CJP4c!~B*>L$r66`+qN7F*`KKpd={8lKdEJHx3LwDjn0|8T$T)FCivg07d*=i{
zdCU>^P=NwCklZX!ZrEF4gGeAG-|arPbu2Rn2LeHcb(pz{lC@z3K=RX`cj?C#2J;4O
z5^yhL0Z1Z}6XcFYx6Dxn^O6K!hx+5T0H&Ge8;z3p8ayTX6(mKj4VV&c6ks5ju4JlY
z?I%T+Jjt`bWKtpufe1>W>Vagc^u9022!RQ*6i`7RBLr!qD_^=%BZ`uKujz#R(yvGI
zw(>SQT<8x2I%QEA+b~3bqxH6MN4y{`;BF3-zhAg^w!*Es-F=4`l1(YYL<wL>^e@!6
z-tstj_0(RCbN4cf8n?#*zDKTYTbX_F-*WFk?+-f>1`0<D{VDBtJWbuntpXpoF+QBX
zGH{-HJfaimUH;~RN_3*whwWaE=>-M>ATfafHmupyhCoIcOhHs4B>d(_Uh*<{ea|8A
ziigyARRRL%)PNVX0xdu-5QPVz1pa_GoXmb8gfD}0pK7qDb`!qEYW%ZQIM_mgJ)YrP
S#V7EeNe2kB_zf4H3IPCd9Wa#u

literal 0
HcmV?d00001

diff --git a/app/src/main/res/mipmap-hdpi/ic_launcher_round.png b/app/src/main/res/mipmap-hdpi/ic_launcher_round.png
deleted file mode 100644
index 415f6a06956b3c2b8ad0f812eb9af582e668e3e2..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 4325
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
TB;Hc<00000NkvXXu0mjfP{m(w

diff --git a/app/src/main/res/mipmap-hdpi/ic_launcher_round.webp b/app/src/main/res/mipmap-hdpi/ic_launcher_round.webp
new file mode 100644
index 0000000000000000000000000000000000000000..10137dee622e5f0ec9a173eb9239f26a51ab3b1f
GIT binary patch
literal 3578
zcmV<W4F&R2Nk&HU4FCXFMM6+kP&iEG4FCWyN5Byf-ayc{ZIbY3z3rzE5fc#Kf)i+w
zGP8bMDtkq8wttGGbWWQ9?hfNK-Bo|wa@b5rfoRBQthT#4fgdNQ8h2YcB4fBqJ)GR7
z&|9(3AB(_oB-^U;lK)YVhVI;9>Fy5qo_lb;jvGmmls002*K}pg#m)=iz`BJOc!gVV
zwrxA!#Mx|n<78W__GC<IjQu5UC);*^1t+(g`@Y|;z-=34*^U|iAjh`0V|&IFr%Pp&
zwr#7je%rSFSGH~cac4X4^S<{#jI0bJrBP!9nSyQS#QDNNl9V|A|Ene-yC_!`Bnbcr
zM31p;+qP}nR<`ZBt!>-(-m~3I{~frEq)1t2A3lPX_Wy_E>U$Hb-CfnT?H=2n*-oA;
zA-CCJw!o{_f4XV~zv$SuZ9BH@q~`dX*p?jHwoUEXKhl0xY}>YNTa|62vh8%XE8F>P
z`+xVGeeTaHl3d%iX<M`MY}<av#`Ur7TmC8i5SZFeKovQ*ZJV}b+qUf&*)}3OVrIYh
zSq$5@QH7`I+t%J|4@PbyDJl;yp6ClCRN%q(!ycR#yhn=ooCkN<AD)4N#vptu(!J6}
zlg(a*YuFX?ZexUMKfmMnh4#Vd7IOta$SJ3bQ<5HDNoI&#5_Ln=8(sL6#_#Ue((>)_
zlea_<{oM}WiqR=oJh192HBl`|)`&cl0Ve^JICp^P)jgj8e??n~E<mgyBI86poMQ=5
zp-HTSh*Z&0377_>Paj#EF}q(suK``7Cly$AsYx>SiNNtAJIW(6Y9BGXhwlIliQO(%
zp;(E`cO2V{W0F~Bcj+v;-Gs8nKYU=N(L?0hWv!w3fsBd#JZ}s!p{)_bWNbJl<)0IC
zlbtj+2Z{6uR$lBPa_?@AvIa(PG8y+ma3|0!kmoF%a&4(P5()f>O%`z_c348y4qMiS
zWvL)sX9GuK8l9DIF^%ek2(@u3$I>fUDR!M|nqCzr{gm73i;>wy<y=LRPM592!j{_?
z+una{z5lS$-e}cur-%84OIjar`w3-3UuzC%KHTb)V<FnnhMQGpxgCUHcSlT<r|i~e
z?*n}bsE+gZEfDw@C!yFr2XRIHBtUG_BFPtzY7=uS-P1x2wc49QhVL&CRJZxHJa;%@
z)FMT*8vXb0Em0A~8GAHNRcGVZ_he~MmcANgT69pnlW|HAVWPdTxONs)NnHrlp0jC*
z<<h7eDXJKRTlqVjr6pM>+zE?vXS_Z83ZkP%)xJ4O?a}n#4h@S>*m$vCdE&e{kpEWO
z@@;4Rx8!s3<vE~f(Frs3>|)9jH0RTf`l-#!<i~eJ%d!(SUaZ<(oXoe68C+>g%MGhi
zLT~C;w$=w68$+-Ik}i8!{i7f5xU+YPIBCsN&qzmXsds~8dwnNf@(guv?=Oc4DvR<y
zCAJ${FToX5)-<IVLZJc%ixwxwgfwKnx%nFWWXXxD&l{wnA#YcngeUSKVHzI5;_}&U
z^~~4W(JPTvgbE2!!Lp@3(GMrbe5ADpT5)Xj04K&=lb0K;czgW<aCCIPuLIDMuPaW{
zEpfPXYeg%!f)E_j{H-xNeaNcPAFJr7q0tEzeaFYNt$tiNXoi~gR%U^QV29nm3l|Qy
zQoS?3T{&QmI@3FEPVQ^jT{VssN0Irz#*W;?&qL9sg$E3ljhw33KpBH6V?c?no3TzE
zEzUZ`T#YJ<J;R%laG6siK<Ahs-l=cyHW22h5#k^^D;!K=*DxbqDwvW99x%lpUJ!z{
zeAb4_m?%jnC7n>xR-XXz&KUi>8x(Ujwkcn9XJx<j@#14}j2G|pw*<82`z(zRon`H$
zcpR8p%#pA46qq~9SFf48-pI=&lS)*FTRTAl1%{cm934GyxHU^orr?;P@c?U1rRe;c
zmmBk%b+(b=eGr1X;&7kmbRj2;d{@#|Uw}UmgMMd$G5B}cU1Fd)-z3(s-y`?!011~X
zI{)Ueu&~{)gAfAmPm*OI90rBl8uApwM#yF+tqZQ45gl#$4TL#Kba)XA6vwgX_-?qA
zqC4e%N7VwZbaK{zSW)iWlivWTcLSbg&{OgbQ)_*}D+i2=j_SMzoG>XmJO~C#<4km1
z7%Zjf%J_I6T6q;hUw=)R2lo+u#(eAd3<I8)7noG`m=GP6c>~yETy(e-0+hs===f)#
zl%YF^{2n@R8DC85{$pI9ald;#N3UniJ*L+B*0RH-iKQ}c0Xs~XSlkFvnOL6gE9L0Q
zVSWb=U8fb3xcv~{Yr^jyFVN$8vxKRozO`&IB|0kd7LXmTgaXBJE;^p;Efwg@VSoGg
zU!@n5ym}kerNZ|v6X-TxZZN5=F(o=G;uf&6Dbe9V7*G`FqGMBci9l;6`@_HWJc+(O
zN#1RDf$bu_Yd47w6J;Zl$_mq>qayAAYnv7w&V&O+aUnXM?<kRIPUqfRW}Zh-;Y6qk
z*VaJXYBQO3it-CnbNy&pVn%e7#~om4Gor(Z2$ksgpuI$<K9Su;2wsJp1mN75FFkHC
zl~$_yT_%+UW<^JN+yfRiD>@vB01D$mbnI;PD%HQ(7XaK&o}`igwKV|8+BE4%lW8<l
z(|4G(j*ZbA0MStv_kg(pM27>BD$(&#6IIf0>C*rlpD8>ae$4&g=9|1u6LsBaI!r1v
z07Qq%%mAXpo+zLoE=5O^>AIm<CHmlV&ySSPGXQKN_sF^iKc?Qsur<|>mKlJeqcrXT
zGXshaJEDPtxRMz49MMoRrY29ree}5#fKC1DxlQ5u3BZb*d=Xv~j9=H;lv<m}ah9g~
z)!GEmJr>nw1Kne>BSs}LYB`a*k|~))<*jPSaomcNMD!2<_iU<msg^Tpb*AsKH07_>
zMgxnEl6U}Qhb=Hbeq2k8Cu(#`^tEskfJdP(YyjXCdLfKgaYk0B@)=8G{%UP7i0Dws
z4r^e6yttMaIh#qQV1nxkF%7^e{zI@W`JDn_tDJO^m@S&U&v8MPhJ3}KT5r%BEG6*>
z$PO#uR5!|H)sUPwNF?YVWdlz#4xgkV|82q!fLA0+Ka`<CMos-NLq)#rZ<T3x%U2ob
zJWKYwG?`4Y!xDHPH?9RmhNezC1K(5O)cgM1gdLUSnXgTI-|LgkB4sv7S|&w{auc+5
zruN>Sp*{Wo{4XqHr1Ad!`?A9Vc&)T|YD6T}GAVBp%bcTI|Iq$*$rd7VtbDcy5D<=?
z+)2_RskS~Onr=HT#20}OUotALAM(9Y9svmaipug309Vt&&yHBJP25~!bWEHMV(Izi
z9c(SI=u8?AF?CGbyM!|gxUJ9K+v67mTPkN+c<%rp$oF}2A)+2p^;DD|BI&r}9l-|n
zv~q|v8Wd6bD&jm`Pn4@KzfX+dc5S^~KJ79;km-C6Ga#gagw;nB9afSZ*hj|zMEFLh
zm2#~_NCF94fG>9OT{h;tWIOiEZHUFP=icGC=^DT6FZ2j9)IkjpuKUjF^HmJ}+hgzE
z;no5BTHX7rIHwx|60pmc?ZTg-_8vE^y>=vK09dN}9J>ODa=e?~@CP9QjZ{D*1lwqo
zT_rj(7Jx&oGXq`E@JmF1k^0B>M85+d`ag--z69VouFh7vGsfESX^c-I^|w%-oCmI6
zo%iPtb1Huk)QrDNJm_PB?bCdBT&>OQjaVeu(rEZamrelu<umW<9Le5yk7c+d)gDa|
z$de0Ni~jy+?(g5sEdNS`H9JatxYQnH|By|(X}WuYMyHtb>;@o2y^S1jq=n+P9H(U3
ztr^02aFOF<E{TuX72l}0FO=QHYd7o(zNprHjsgh1Te>#NKC+4T9snY=`?)b&Y9vl8
zaB8NUlH=4IA$oqz1OLt*Uu~yd?9zf)N^EpWruJA90#WUvrgqO5bL%NlB>-5>=)33n
zxM~YAWR4HN*|o&ZQrV?ssVKfYVP}OoD)=s6_c{9b^j^DOE2uInrVY9B1`sKmcGGD5
z;_h0DN^GpfDwWu@LIm4hw-%Qe-#fdq3D+%OoG#Q#%k&Y~UI4-oTFKQuGj19)bIfco
zN~O%MHfE_2=*xFs{#^TTejA~cyo(R4pvp-Ydf*Nq7(j~hw7S7ZCtnRk4Muk8rBO!L
z8l$ub@X}+8_wZ54SLHEzAAr>B7<%9?kq{EPTson_W*~sLDg7?0RQDH``IG`f&|zSY
zL3*usofxE}LeGA4)!;g|sO~PVOzC@3{ou{>5(#t*-FLhJgaJsFE&c3QJ$D}HQYzsJ
zdw4G4xfEWOnsbBjZZNzIjN<AY&JFr)i7V>4^3sfDAA@7h-nd021TLb{mjB}b(x%UU
z>r&iYoYeeC-*VXvd@#UsiNxztzxq1wmcj*t+$s3z{nuYTFG=^goQ4Zar_X!szWw;+
z!m20$Sfj_G+s((vCbl>(ksXj0l#lHjnji5?U3v|d*TNO|e8_W28D5tx;qqH_88w=p
z$xG!E`}+Q^V~^il^(u+xRrEP_McXZZ0HFZlUz^xyr(ni%Vn}gjbWnNUIHP{;Khu1P
zHnmaNYh8TtNtaxHdv}{QI(x188gD+b`rfnWZ~p@z?D3tilBiaoDeTdA&+{^X5CG8t
z5>}3@vXVKj%1Z9}DLqarCl9!;*|O{WxGF0-kFH#Q`rzd~zpo(itw0;t?L@C#FSOtG
zL$$2{0D%Xey?F82gTMUs@B2G<RKB8PvsYjsY|sU^81-zAf%gtO-+cVy3W<aP0A@w^
A@Bjb+

literal 0
HcmV?d00001

diff --git a/app/src/main/res/mipmap-mdpi/ic_launcher.png b/app/src/main/res/mipmap-mdpi/ic_launcher.png
deleted file mode 100644
index df048726faed96ce6422cdbc102459ae89af3e9a..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 1917
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
DOrwD7

diff --git a/app/src/main/res/mipmap-mdpi/ic_launcher.webp b/app/src/main/res/mipmap-mdpi/ic_launcher.webp
new file mode 100644
index 0000000000000000000000000000000000000000..f4a94931c7de9197d05067e497e290484d394436
GIT binary patch
literal 1388
zcmV-y1(W(xNk&Fw1pok7MM6+kP&iCi1pojqFTe{B2}Et%NZ#$Y@F#pEBKjW>b`Dcq
z)qSpo7OW!4YSaWJ2%zw<<|!at`Z^(OBS~`7FDwc9M~10|NdOoM(l%gGcKRQP4<N(S
z02pV#0+V0++P)T;Y=WTvynwcxB4z-fkWj+*&yXbjBBC_bX=bgHZQHhPd-mS!J<Z;1
z+qP{TZ5xIBM;ziG)s^+^+<!T>RoP>?wQZ}~GWWf|VHwdk$O(xk<!^#Q=)<iDO^Ip1
z-5nlx%el7gkfi&0zp5IW;Y_^VA7V$&yqg=L&Ct6UL#DQETh;Y_FWlO;RV(wHFSxs8
zwCRv*M;0-t#4~$#CIAS|BM&a4HO-6Mitf%Vxh4we0J#I*|D$ezfuDSPx6#;G=p0cw
zReuxnIo{1TuO7@-TV7?87t|-rduer*R|^y4KmtGhKMCvvT4(M{LfL73^U3AAH@`pv
zL-Y}X&EMH^SiCco#zbQjIUxw8F+ujzKYo0YPJtRlYZ@PHKV=PN0x%eZl6lXk2^0HX
zYh2Tqh{%7xD?Ez*+1v=GEk&P%P0_`F>U8daA)nPfTjL{rwfAuQPDtdqkLxs{ucihE
z4EHg-)WApjsvjq%)713HQu@UklA5SOrh^N9Cr!wyo;K&6T8b~O16CTNt(*~@LP*l`
z$ICtBDSQ0|GnqYSW}OjK!9W&#3iq$d7cjPGf!l#FG!P)Nf|(gaNyW*LWbv^}?yNgz
zVD`uu0FXRxug=v?-mg&xWm%E%S%}CMR2b?gTtNQlrTe<xHy&_un`g2u$7J<1X+b^m
zH+i=5wjji<4114gM&#IGPW`yuFOi6(NB~Lvsna<qS)w6uz+b#Iw=;a|Isl!*u4Aqv
z=PC@5OIMwjoACjFYa}^k{x><Yb8t%w0|lJha)gpbFBc>QNW_JFwEJDRmI(pL$?0&>
z*#oA;eIht}wQ4dXExf7Dw&TBbCT!}p34jC#Vu)2?vISKp0M+4$7q6wBaRf<L)j4tO
zvC$|!)JE5?R*e4?aD_xhK~jftA)*w8DKu~kId{$Tq7xz~cih};tMS_dZFNmMDJ?lt
zQb$rxF`Sj8ps<ul2lOP6sIb6NKq*N9DrH56P}17qY7&Ku&_k$1hA~MP3aL{TkkVwJ
zppXHkGh&D~v_MY+L>$p`!YN)tdMFe+Nf%xwNVKv-I0z&vm$B4JGLvYASW&8_PDKTv
z4=vCW#Q->#0*VK6D4-Nxj!@Dl6+;9Z6O}HYFF>LYjOaOED4`&wZb(wdsH_A`dqLnJ
zfGDB^dJ-Tq70a;{PVpRB6eJ;l#1N~JYN=z@SOBQyFY75z8GULRMS=X)kA7IU{n2+c
z2uOj5q{t9zG<qfw?ce@!#J9OP_K9i6-~EsUl0b7JriEeer@(p{f-m)we^ew!0q3|>
z8(af$J)1?&+Xbs-0PkOCb%3gYEJ+FqUKF55g9~@qcGWZ(KH7_3af2jCSOKA=Q5X&a
z^u)r|yJ(~J&)+dO_lzrgoWuZP0|Cm4gvk~-#sGV3$npQaYBG=RwfdrONFt_1l7c#!
zs(|Rxn5#1@2LDCR0_W_J;h!oH17&W5a$r;m49~?xXSzKCx|#Q;ADRpHEK{q31~f*I
z69Oa+pmEsLXK(dKJn9z_h7@vcwtAjx&o_L4Vqs1NqH*{Q{~|s7bLH0@x+;N2S&XcV
z+QsZhJ~M-__8s;#LMepEWjHdM`s^vs|J<xzff0~Q0@L>6`19B0aBt5w%;Qf4$QOr!
uyrhxmwLM^NF;FSuSUvCtjF|Tb#~oALU7YN89G9LAIP)`d!?(`lyb=HvXo*(<

literal 0
HcmV?d00001

diff --git a/app/src/main/res/mipmap-mdpi/ic_launcher_round.png b/app/src/main/res/mipmap-mdpi/ic_launcher_round.png
deleted file mode 100644
index 40999689155648bbd3356a2c04663c4f2d8e4633..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 2800
zcmV<M3J>*(P)<h;3K|Lk000e1NJLTq001xm001xu1^@s6R|5Hm000WNNkl<Zc-qBU
z2~<;88jc;QOC6_rrlJT!0<t5-u!txiwji>INEB2ki^Y9uXPj|tRjgHyovoc?YsYG}
z6|J^)j%RA8dPYU8Rq8OEI%-|OrIkgJy!Y|~NJ5r>?*EealE6#E0c_6s&V9-K?*D)P
zz5jpTeMuyeUcNvg830Pj&!Al4f$byt4qO~7`Kew|A$bZak_U?Qsg{KeYcKa5qg~`H
zMc_4lCT=HrAlmv#h3j6D1?oy<B?RwjOZ?AjOJ#N1Vp$7YB4ZGE&3#7tki&7wm?s_x
zF1_O{vt`mkwp4bKpp^i$B|V32%t^HIpwROfF&}*=+?MD3b!(|?37OHGT|`@$5~;Z-
zK(13j#1`7*Yl2&izN!z$!emSQ;z&x=*o6~8r81+|DheJCqGM~&hnVl)i!YU}VN0YY
z!FjQt>G4I2!)nVK2>Kv_t?6|TjsuC|cllYj&RUlg=o?sUwz>BdDfa(62*=%kq|8C9
zcp-nGKVkJ@^+UZVJ0#)jqNhPP77tx4+lAsCjrI!`1%hr}3b4!Nq@ewsCabAX`d1-{
zo)k8}$1}yU)%?tB`+4Tu4{iptu@j8<Z-8!XqEO_-znLzU!jB7mUvbp-$bDW@B#q?@
z_DQ5o$CtaoY&L^Qs{-9?X-?^clc*_{ny%;jPIh~raLjwUL|Wreu+ZPo{cbvRe7+Of
zcfSnml5ppmuxYrz(C-qF_EcA`-BO1x@mp+9oqpME9(#AfRH8^K-JI{eLNt~5h?>g1
zhLYUBY2TZBR)AQ1?8}pYU8w-=OF^!W4~s*AT@`Hw&U9%&kM9#WsSOLHw<^;|4)3-K
zd_<(;3ms;^`%?dUDs-IK!=df1GLo;Upg&Uyomb9*@rP^BdA$boRUbp^jsoXE%7dY8
z=Tb0SI0l_JFG1(6S}^?UOX&FGJuZEEcy=<AT7b(+-!i9FaNL?yMbeYZi!z{#WJYYe
zLboNCD>j6YY64RmE4+7t{vqhkeFoaqWL4HCfuZ&!m<{^wJd+7bOba|bvK_RGBS6e2
z4_;G!zV9ia7En8XgSb6kHlAKMzLhB)4@^;jnQOa1w>hty2vbKp7*!3>`F#x-TkeDD
zVVkv&Y>WDf$H8#z0(Z@ENx;UIAFW(<BMGWQu+e^KJMkL`Vt#o|Y|(gVDhOyjku@$%
zxViD$(tTw>nRY=CF!O^f1Rw_8#<|YoHO<iW?pm_MQCz>acmheSRbXto+bvMzy&KTF
zt(b@jwQ@@*Li-1s!PKs^aykv5tC$C_d~;)nHg!QD)MoiE6Sh=-1sd}L-)HiJfi4I#
zV=D&ThIw}JWH#IWyc(E-&@Q|XQUgoKo=(}tw={rmeID26#4QMe_C1@q6+oW8`WP?^
zCx9#esEsD=)olO$5{Dx`z6LbU4*iNzh5<b{#Eh*Nbgvc&qB<{MAhRMD<uUn@VEA{n
z!0q_w5pZQwTNp#`!1Y#}cdrAxY`RM>udOaC_yW;v-%6{J!-loY3aevs!-1X?YQ|O!
zx^?sIqK;RBD<0zE(f0*z`|d4nx%x|0Lfz<oTi}w1+O%`R;cjN|?d=icMhF31NC_OP
zo;BeCof8Sv><BZqVqkx>P!RR-vpwL7hroWG+xGTrZn^pkrvxtgaK%Gy%<M?`Av3&X
z*CanbA%N2<0sfk-D4Nca1C<?V##RjM+CqB(pY8=$JOuU&0lc-rEm!}wLjc5wD;{cN
zvgOb)a{{w3-Y-}P;PbeU@tT=(nx3fuDno9@Rt)Sb#r6P>d;qR^2<#UE_|qo0T>beo
z_5g?vS3K0lWGJ8^EsEJ084xA}@QFe;PL(#Xg`N=uRJy{9tr*xfCH4Rg?*msn1ojI7
z{Gq}vSO1km0K|tY9%^IKW8mKNa@CvRKK?=g>&A^6@!<K`I{Jk;pi*PZ*ouK&Rb~(1
z<Ne@@hroUzfZuO+%hjKA2!Qx-#Y1gOY8=#0Q`|1}^c>}Qo*Q&8Ip#c-5)Yc`ab|4A
zz^+(i-&qcQ2(EYt?B}_yJGQvx>Z=_BAU<62cy0epP}C63L#=0_WbRNj@Mc2HJ}Nl@
zG}GeE*ouK&R&EcV@*{A?LtwuU!1gU}x%%oVdjQ0TD;{doBu|Emu~C&ovj?Xg6x>l_
z!1?It6;x6pP>EA59Pqje*d<Hs0US60VjLdWF9fh{t6Q%AtV00AhbWI|qLUIW52j9m
zqmhxn;_k!>?kJ(;ZpXU<LglK-Q(0<C5>N?=X0Gi5wtT5QfR8FcjKc%_g#g~z=9a6k
zI%^Mr_z>f0h$e=#_a-IiHu(iivfhAk1?<P^VRg|{&QS5mpovd5V%rt$qGjaJ)ybiK
z-vJQg@W6ha+xq%8w_N=h`>}&vv|N<KYq}(lt0r21;q)lL*TFwR6)QEdDL}=hSUALy
zYX{IX@<>6x%|Tnb0=o7)0{eL`qbzpI)t@<MJ63mqwrFX$exk|3#7(z6h?xeJfn53w
zv}xwQ3##BA5MqXm^tlt2a!V8a0;r=?P1yE3;?tq?MxFK4+S~%noU(2l)Ivq4!qtex
zx~Rd=`Z;R02Vsq9@bSRd^{S{epyX*5O%#DV4f+ie(|}#QksQ6P&jf~VuK+!Lo->DN
zpye|x&5@~aP!_cbH9F0H*Hs{|G2e%!)M_HrK^>WH#I|3c$RvCIMsk#HvKRZ-ce?R-
z4VQwGz9rhcxs!uLDgHI1EwVw|ydrWMLT4JN@JvvLXPPwO8PI2l%pwmre+0uf-+_r@
zglA*JH<wAi=Q(jz;Ta~HXt)zH!|>|pASG(6RXpMc5L*z>e(E!MYjbcW&>`6tb#Rth
z6Osjeg2>s>@wZb>kDG?C{{u|cawi`8MBj};8L;0wb_Z$_O&zf>cS)$YL|!L-lMXfq
zW&;(JV^#&uGOL4TL2sdn$b*ifr@^GAq4R1zIVXKcc9{iE9Q1`gn~3jYK2r~)7Sz<^
zUu|slfJ-Gk?UVBNCjT6u0&<~6Hru2Qm<_!`U@p+<<XJjrExE&%llOC+`q2maLZ2tb
zCLbpnWT?eu-n$Nh8!(8#|G3w*Lygj0pkzu=$>tbU(mab=mIr+aw28LSM+5P7%qtmZ
zJ^(dTNqUevVlUf348m{!s3|+{_~hu-zDl5c=UP-gc}A75(t_`M1GIs*&?dgG_nD>N
zJ1YK7^w}%%j_E`meV)cVTr)hlpvH4%ZR1!aXuR`*^3J!YyyhBJW9OOG-t#O3&_h^o
z430$`XbWv#B(_%$4_bh}(C1^Pjl07BL=uKU;5Pvwdq+-v{X5U>TMc98g4(M9D6jb(
z)L!$6DEB~)onHWG18waYIb{p69g05CSHJuXp;p4}!I)B`pObjV|1x6I`s(L0s_RDQ
zX&cAnLyI*C(0DB%0-b@MVIOju2)BN;QhSb!MH^@fZF2j(q#u6h?z$Q_CqoE434(Hm
z$}-*=nXuuDU#1?uI4ZN|if3-!4bQyh`q6nB1YTbypVg2)<RBNvkg>rw8$-}$h2%;8
zXM)rQSPKk;8EzATg%>i$W2hp2@aUxUK|ZMnyvEP4&&KhzjqyMm-413?^j|AvMR2FM
z7N&gKRww-G;Qt?fZo@OS&pf#NR+M{GN&4pR1pfp4Y>{%y-~XNf0000<MNUMnLSTaW
CpkKTI

diff --git a/app/src/main/res/mipmap-mdpi/ic_launcher_round.webp b/app/src/main/res/mipmap-mdpi/ic_launcher_round.webp
new file mode 100644
index 0000000000000000000000000000000000000000..e2b071f6891d89650e1442d7d98fc3911aca5788
GIT binary patch
literal 2390
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
ICW7gW0NJjPs{jB1

literal 0
HcmV?d00001

diff --git a/app/src/main/res/mipmap-xhdpi/ic_launcher.png b/app/src/main/res/mipmap-xhdpi/ic_launcher.png
deleted file mode 100644
index 4fd96202d1740c7fac5c3e8fe3c84b3c142aa246..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 3701
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

diff --git a/app/src/main/res/mipmap-xhdpi/ic_launcher.webp b/app/src/main/res/mipmap-xhdpi/ic_launcher.webp
new file mode 100644
index 0000000000000000000000000000000000000000..605274b1afbe128701e15e5969493fd0b4f91d9b
GIT binary patch
literal 2486
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
AEC2ui

literal 0
HcmV?d00001

diff --git a/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png b/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png
deleted file mode 100644
index a5214605ff8eb15f16395da35c78cbc32c8d6ca7..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 6277
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

diff --git a/app/src/main/res/mipmap-xhdpi/ic_launcher_round.webp b/app/src/main/res/mipmap-xhdpi/ic_launcher_round.webp
new file mode 100644
index 0000000000000000000000000000000000000000..dda81aee5c69a4ef8df571712993c96fea4f521f
GIT binary patch
literal 5178
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

literal 0
HcmV?d00001

diff --git a/app/src/main/res/mipmap-xxhdpi/ic_launcher.png b/app/src/main/res/mipmap-xxhdpi/ic_launcher.png
deleted file mode 100644
index 460dbd4f617aae647067edfd4176f26b781b3fde..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 5431
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
QFGMM{k@^}XYSxec59c6R=>Px#

diff --git a/app/src/main/res/mipmap-xxhdpi/ic_launcher.webp b/app/src/main/res/mipmap-xxhdpi/ic_launcher.webp
new file mode 100644
index 0000000000000000000000000000000000000000..650e3b79b55246bbb27ac455038a560366bc8af3
GIT binary patch
literal 3050
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%0DjK(xc~qF

literal 0
HcmV?d00001

diff --git a/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png b/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png
deleted file mode 100644
index d7ddf89ccbcaa96123ab76dd954038513673c678..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 9265
zcmV-1B+lE3P)<h;3K|Lk000e1NJLTq0058x0058(1^@s6=SJeV001NSNkl<Zc-rlq
z2V7Lw^2awuQ3OPhUbi8=2}qTyGz%gi#R{6<UtUZ8?<J<1_|o&tdzu&%OWI3snx-+$
z6g7!PV~t5v6t>f0cbWgp-Lr@U*$eDlQFlL|-{+$2-ZN+ByEAjnz3hra_J{ppf7l=P
zhy7uHT&NEai7tcXq7j_RMVI$0^YidEcF$dkkZ=%WjpRf>4*>-3oW0LyhwEa?DyG0%
zdaj~2#HD$e#7nbO64bav9NJtfiP6@`CzI%B`ak*|J%^ra36e8l*@3#Spkbw^uirP-
z$USsRB~x@Yk_Eb2>GH-}={h`qjK?2PzoOKrHk2M^L;;hL{a+h<4n6k=_F6i}a_*dX
zZW`m9Kn*eD*&jB9hTi#<HFUMIMHt}!G}g#=V6f|ZK+!GT5Y)%{a16;;x~0;mXl$~9
zY_Y>M+`wVwsptPuY0=e)^Bb2+A8D$U?qnIGFHnqH%qW~{BnBp<Nz$(VWquxe-I?<k
z&jD5&XA9aywvmlz&%;#a>=8Xr*@gnpR3pp5p#2+zbmR}fn1kF62?qiQq^@qb*qDFF
zQfMRD+Egpc?)e6=XC<NG>E&Fm*{zk_jzQUb7Bm<{T{kd-!ZHx3IG~tqJ%QRwbD+8O
zev{ZEE)Y14OJ!+|wX*f-{N`SzNzXD23~x!e^4Y7@HFI;qx!FOoCOADD*jy`})>I??
zuvdvPXBxOL#WGWmInf-o%Oum!<p=wN*Z$3!-k`Boo`QYDdw&FHSd=I0mAPIZadWPb
zrJmJn+xsI+E2}f$XqJe@tW=qu%6glN2AaObdZjb-maQjW^yMS_qmQgZKWl4be?{l%
z&NRjsa+w-@dFzppbmS9r2C`?PUcF9txx$pq_HQoMQZ=N~hQ8T#R$05$dn33qew6uV
zU9IHq9_8u+Sy9<;<)$-TN?~s-$=!YV@RHjQq@T6Rf+Xma?Y**&9h!6XM`zw-+sSu*
zZFOAqmmthPYilL*&=J}*S?7{2SG>zwk8Gq>)rc$l^6kan@6<{kuxB0XWFvKr^g)ri
z!M<4gqV82zd4vNx;PoC$b9=8dl$9F0Jfc`EedBPUeDp=R)HgSJ$CvuMvD+%_B};&k
zrdlHXdS{id`$g4Uo8JwmxQ#*S&kUYUd*H3EPV%jCiR8fEiU8R~k%`O`P%V~6;N<G;
z@Yn_-)nZBAfhtM#1r3oog{o=-!*Nmy)-2oMu@OWKizUjRDkL!%WH~caU&r0EBRgq_
z=lnoazerN|<%L$x%*)8%ssktBB=*_iIe!q*>g?n~@z3uUdV5?DOMLT2);?US>uMxB
z>^;x<mHCZ(e7^YGM^gM9hxKM-kFE5}w6)S#?eGjC@K;Ab^OILW`__%n@$F`4d-E}9
zyrU4bwemqhq+TL{BlE>?VQfb9iq)_yT?mitz8?ELb|3~C@ayBC?Sr*o)OUi>XzZ4u
z;dc%y^zUFG(km8A;BZCIL!#k$tE{=p*VM{N%$FzZn}mZ?>x=h-v7`Mgc)B6d)I;N6
zGY7TVNHICJPz<~0iK~Xy%FImjG1Eq&>e9Ud%o^9X<e)!(uupi*BEW`ngWB)&#p?G;
z{3Z>Hrn*<(v)z7Sbcp5a<|Ho5^aoJ;r!Nhqsn)BoA39JK^cBYJ^7GygvAu=MG&Rz@
z?0t_Fv@{s>r+(=_1HJL+kj9`Gon9n?@5=*MihBJ4!+B|%PcIZF+4~;rseRiEU^E!|
z?t$7`py{4DL%#S*vHESk7`Dyy&!QM^%My(|U!`k=u15N`y>wYmjkl&j=TD#i5g>%8
z^|gO-S;`9gL#9$z5wr_qILhXw%v`!uOQbj3OP94J1Klkt(6;4i=sdg|o9YA5x%V?@
zS$#9;t_rsvs2H<4T$Oz{H{f=gmNK@JdD+o&X`s&ZSvg?80bU>>Fw|HJc%wcXsSeV-
zI^925#6FPAR=v*%%@XM|_R@91U+U1;FP6aWxdEFfrh+f)&5iT%MUpAzPw=ug&KLIG
zj1<FPs)LO0*rK6kDUPzw8}{sT@nj)|DGP0;y&=KMm^u5Ls1C|D-w<yPz(un1!&n}z
z4uTJgyk-iPg}Sp(jr1L^bS)9vFIQYF!dOxk+Ep6xksw*foPB<&=6WCdrr|}}3mvWs
zg4go>vaOzl%quU|63Lojmwjqwpt~s%npRdr%ci@aefulW`ST9Y|F$0tr+<acBi}>E
zt`DJY%QM_wO4HrN`1~oLT`ITE_{%0i<6kmx{Q1!OzXzaw>n7;<VJqm5{s{WIquiy5
z&V%1_HqiY&EzkTJ8t<F|x~n6HS1(i}G1M=Tz*lqpt-B&K@B92v?(Zk$zK`y@SZI6u
zN$B|I-E*pC%`H6w7Xpp{EaYB80W!2U^?MD8lfeK6tpYj^eFtqHJ`0VvPv-y_G&ujr
zhxU)xBdq(t(B5Kse3D)d2IWZ(veu1vg6@X+LEYmc)V|REia_nEEDt%w{1t0J#C9l0
zoLVTkRmfX4C@XXx+S#x3+cvK;HGOv!ahZmK!7FIzQhO`3fBqUYKeTWFmk4Cgcv~*M
z?p5yc!jQ&C=@loS_2m^@7CWB+X-v(u;rIeEd^FQ{ImLYEQ12OH*GEVr)r+M&bu`ct
zi2;}KU~TaMh=SJo+C%8{<CsnKLk^xvn3Z%&E+gq~N$uB0?bT7x{PeA$KYh%K<D)t|
zK!5TuG_Sgj%dA59myfg<TNO3aB>{Ud=3}_s>7iUBGxt76s{+$?+yFSxVrdr&tS#-0
zmI2~briP%7y`N!ro6)z8OGBXTlZ}GfU}(}p%ZvAdW?2{r;bR`^qBtL}2!hx1eF`Y{
zLu#g33cI|1q3j{u60FmUr3TGn83-Zm4N2I`>=YCbUO{YW#4Pg{(A0)@+oroY6`SCX
z&Uu@KRfU<Y{hRkedrce&<?H^0aW>S=m%z4J0sp1g54wz*%NI6O&g#YTeY(YR8o;Po
zghv6Sy&-v60K`GmsKRn`Bc^q1u&<kf0o`oflEtIZZrl0-Xs=BGq5OSLVT{#y++7lM
zaB0Liw?UUNbNM<lPnNA)gbgN2vrsr`uTL2^0CCN&vJRS7EW|**ggr{9?QK9{+cvMo
zOc)`k-}@59`%t+QUdi^IJ?JvVUNo|<N`AkNJF(25S%61@q`huv02y#a)p>Lew0*P@
znjX6rm)OPJIdy+8f~JSAfY!JF1DywU4ycDQG&c@trKeZm@_gqf(6as>XuNMe=>C+A
zy<G-0-cyNX@iyrAW(zjpzwyszIH#5u9|R%&-e)Wp$_*zgW$<A^z`u!s0Rz-y_2r<b
zp7e!o!6eYk4>oA#(@_{{uT4dOb`5R?bK(dz|NCapVX!m{L;D@0Y2`9(*1yN#v{|p@
z>D17^{dH)(eKu&9#-4kgOQJw`+e~PEV-=Q3HLsq^pjG1PFb9P6{U7|aAlRU+4u-F1
zNxnk{90y#+%-6lP&y)sh7li0gc;b*Q6bPk30fZ2=zP$#Q*U1ALYw2WY*|>sR^$ZoB
z&R_OH)BTI_of|qJ8yf#v3Y|ag;5A134s5EI#e<Ok@1-ss#(ZyytZ8MUUo5dOpiRY{
z@ut<+krG*@t{NR)9b(i};fV#5_Ube&F}nuzu5bR&-?8b79^9A<BB1GkWuUJ=KFCJ5
z6FR>C6m-{Tf~GojaC5$PDztCqu_20Cw)u%$K<F5lrAA@gjYmu6@LHz-mBhj;5fKgp
z?SDqql}&m?R}~8C%1H)IB|1q!X|GP_4UnM?dxK3Ytuk)&lecm(4mk51+>IqOcj)u3
zO@NLczpz-&I(BbEP{Tp!ICR@p6=J9>p9CLI4|<wd;N1sNtt&VE(b;IlypT_92GCXf
z0c!u~CG2%#tTT31IJCa-@W6T=>`NN|R${fe>;6;-`s0T!k9kLx%>dF=O)@AeLg32+
z@t4#G5fi-nAann-Jl@w`T@m)Xwla)PXw+2TQ9x<0oXQIzgQ^~MHy2oc?4v*NE?uo}
ztify$Wjz}zBcSD(yZT?9VTNjbV>Jdg0)&o*$)->v#eVk;S>1fOn?HAjp3i+kELB~;
zBVRsQR}tQ+t-!Q7FT4u{LP~o@26X<s%i;zb7rd%y>yBT60bFw@ua%izc?xvbO|$;|
zm!)$JdB0_I|4wXh<3Q+Gkks?Sx-kCm^Q=kwrxN`$iHX(mqEUPs=#f9ol$YsfV&w==
zIi6HtnE={tVTV`)jeji@X8hVT&?`<^1gLH6Yr^<oUIdoX$NJ4ehSp}#E=dMk#6yk3
z_;(#G4uSP){!57oUX3&Z$l+LV=-+ka5qP37qoxegrohrJ%d`lP{`e70t#N|c(6Mv7
z#ogiNC;leb_)Yg*0fv_TH#!?{uLfJhLtVxt599GUq40Kwcm*-R3n2ES(I<+-R_V$j
zL0uYY(3D1k(9$lo3{d;0?+9u`>x)nHp8+-0JXZ+n1B1Gu{|{GK{}9+B9-KX8k%rSH
z;jkrJvYwdW1<-O+59D~dB;qYySrh^kg#cm0D6sed)b`#cL2YPx`o8`%VEqYPG0hdu
zhN?s`SSX{dudW7L#Dh~=ltD2!61L^a=w|z|%lRzjvqapJ#@5e?_(n4~3RH6=jOr2u
zNnmMe5TO121JwHFbAsB?yz0*W0jm2QbT`fs&W6$$&^Ofe?}PuX23y2~M6p+uM8cQ3
z!9O4qE{u(HFXfk;K7?_k+)Xr2SrYZLW^Oc|BoYCN2BD>?$-)fuy@k)lStqCs%}@T*
z0zkik?uI$S*)W$6Kx@Dj@gPy`iGgpXO*-Q3ETWGJ9?2LvNB?8G-ZAno5gy*kInl>8
zB{6g&qk0Y=1(s$>HfA6m010SA^AmUQ0H{Pb8%km=1N6!outhvf_Cy=C$iU9&p>^d!
zt`ZKQ{>m5wXw;)ofl^g*tWq;4mQG|;7voW2X%^@30O&bEZQupa^(DgDFei>5KsJbn
z$(|Ua78&?4FI;`K%qx=E-~*7u>UeRex;UmuLnoOX)1{tGM`5K|!~>w$pA*!E=Ev`}
z4A6BY!r4&F6CfMJgQUXPYmtGydEw2shWf<w254QpG)g-wu1zyL4%D+^yVSGjD6BM#
za`^!ypbZuQI*Cp6b#sNYVfJLp0KNP)*diVz6~<nR4D6pC(SBQ~Ukb6&FF>nJn~0;=
zC5mG;vnF?-Ks__AOFfg0!b-Dn8g%Zn0MKjC3u*%|fUYeS&W2g>ps%+C&@*6*c#u>W
zdo41sZ(5Z8wh-SmVq<xKdqHM^o=FIbvpGNuh5<m2Ew>ENHRl<im(B}7oxA{I>1p&+
zlO@rb8S$+sP!~<^QWw!tSZU@@M}U5?u!*)_P#c;b<pI#uWy0AoBLM+AWf>qF#Dk>5
z*lUr2pK_wwZkBT;Z1k1=T~IXx^h88pxVk8zQB#yaCo-xF@hGq~)jR<b&<5TB31vf3
zB0qp^5D$_HW3NR9_GCvl-6Zu+<PFe2!u*3(h4BiT0#ucE{sDUAF3SL2RepW}dU37I
z08%r6zR!$QEs%J|SOmy?Ct{_qTYw@z;df18BAv*nF2JL}(p2SJ2Izkq1ht|0;kzvZ
zbmctZY$%*!8K4)|f-T}<vM0f)MFzf|8d;a^?h-<5u*(_!1B9B`ke9GuQ!oWo1qe|7
z6cAdPN(AU99smhw18;zYvY{Y}2SCq)E#g6<*b@U^rbQk>CVYqu#>hDzBgCdpWpFz+
zEq;fFPLhuR<>3hhmZqYBA3y@yU=g4b2+$Q3!r73|6CfMJ!(>l_QJI$rpQeO=k4$(l
zHu}A-^|CB6_oNBOvg6;><|TnDFUg>uo&-WmGp`T<`q9EJ>;^$?XnyD(%K$B_5YC3Y
zWPSkIARZ=rk_`3J65-v1FuI+?jj_=`Kv(+uj>Y5nLz(eUX>mfTykrC@8H5&pfP}Mw
zA3&AD*^rlF8K6zif-T~qqBk|h{$y?<yc!ouAA2{RvC;2eW?XiQKlkOVuHU7_-mbwD
zDW^{{s;1!y1(v3~2s$hRv{6tSn*L=OAnnph;cS?08K9O;>%bQAP)_5rknxwS1b8+&
z_+P}tKmZ!IIU%A-lbZsnoa8Q54jqM+x(or@YXP8_HwtP))5?1-0CXI*wN=8|kedqn
z(-r{QxDIR)4`mL%sdH1h4y4D!$`J82!~`#ZZjj4q73T7Is4P{LliH@nN#O|*B035u
zb?FQq0BsV~hNhMGSq7-4S~weW(|7>%90(l?k`iOC!Px(hHo5(#0H1tfVu@Hh#v(v$
zo$r)7etgjBtdwKwoHRO_QI(wrLP|Y%re%O$+9aqAyZ~A<UpO0b(k%nD;W-dG79@%}
z#s2dtu_vNkxIG}Jc++=_S^VqN%f0Z)c=Y;pYSKq)I$3s_L6wCk7Erta63~XG2YCV{
zlnvQD0TMVCCR@@Br!!OF-MC2l(`FxEk!Y+)#P1V2MwEMaIOEa%$E1WuHCgGP%t|+?
zGSfjwsY_-dKzl4~<G&!N4NVW+ZyBJ)^M$h^YbpYCx_^MyKL<j`LYawgXpH%<>B+Dm
zGW1zufic1BD-cG^GBrzX??gv0(qv8rRYrQ3ijD$GJ!dv_?BN5Da5h*3=r{tjXn}w>
zWbgp!c@R1l%8YctxOeSOPJ#zzvKxs7#sn{bE-N%$&TzfK*Edd)F;%6;iK#NC8fk(;
zNnOkrAmMCiTEPdPg#y};$rGRqVTG~Q;BiMng0|AfXDYFf#XdKh7eLf3x#6-6fA;$=
zHFdi>BLkG_=|)usom?2Hi;FD-^umiEqzz3gR#*mT;X>hT-~-U}>jm`zCye#!^mKSH
zI+{M>E|6H@+dy|W(rNDQE_n3*CNc2=_0&vIreOxcqfk=M<_VC1HZ<MO1E2+qgtH-o
zCqM%FK$(tj=JX8X(d1NkCNyjfEvAy(+{W>3pu78^JTEU=iMg+mht5)^XByP$I6zuP
zmx_)8NIh$gWq>xl2ttidYP$ac%K*(^B%BRXc>wg>dO>}l#29PvxGN#aaI1gNd}1JL
z01b3^8Izm(pz$d2uSw}Ys?)MSnUY~tr4dNhmwILibo{v2GC%^2Pinf)5<n*qpvA)3
zke&tlQ#=3?&<84vaYJe*Y>tXOfU&1<a~{uF7|@4}b6>EM?&>;$`k)=L$&aX0vq71h
zZB(UZfe=#9;0cgG<CB{1d(bjK)r*C*AuXE+KpO-bUzvh&NXa%Hoste~g2UHR>{G^Z
zpH@FoG>A{DH}^rF_XSNVR3>G2;K@OioYkemfvhcc(Ok;_ZF~uY7~8C-dwBp<wL~}@
zQh5NhZi8UsD>1ejjPcIc<j!lo0xBr>gXw>|`yjdl4GEe^W$aLV`VMt+4k)MO7*)vx
zl69pnD&+@|0ArigbkEBE0s0*Qs;m*thLjv00Bsa(e05Te@${4|cq=@PK8-`hVn2GI
z{ZG#_Hj1S%zqdkTZ&OUk0riwzqbex}tSxn6nPq@BybMB&Z5D5Ugt8$y*D^rQZWLr}
zObnn&$~EqfONWQWArDZ@r?|KfK%+!M_|CA)BSc&W?wLA%eC%)WnWxlAxu6mPqN#<T
zyYX+(c*p(cly>1&f&!!|S<vtJjeq_psB>luXG2;ZuEOg32k5`+gc+N~bZcZnL;SdL
zNfh%C5!b>D>1!{!G8X6TOrH%Cv^_FuZ9`%%(mKtcoI*#ttSNQjJTNGf{Q}f<|07l(
zSCL3bVVdFa<V<*49{DoGI@;OUb13EOtksxY#5GdBxA=$)j!(|*P$y0YWx}*BW#Tlj
z%X-o-ycP^vUB3Y7ZvH>3kE_5~QcS;yNa<YS=`)vNEfr009qj7s4`qx#Gg0E?<b_A+
z*AZ!NHN+D@c?M+y9qqD~n(lubj2#{Q0;H+F#;Ri~FqSHe<*~RN*eHvoo9Cr0){a9h
zUuQMb5vFF^|2E%AbAFG@)vMz3KskAOmy%$zYv@WTg0{D|Son^RHc;i1S$ABFp&DcP
zWkj0c3U_Yj*+0|@&2w*nh{Ul$W5?1Tm&vz>ro4VSjt0*+C?^w0b`4ePS&Kp6(0~8a
z{^fU|OrBx2F%@xnpu!j)jn08}l9(+NTNY#U&0|&p$lOdj_=~tK6nKS4P~p+2+!j?_
z0VrehyOeSHVAl|oI0ITYyk_xh9-1Fti-9k&-nbY$HOBDMkkr<BZa$?HTR#z(eH@0`
zJfABIIZbkO^dnN=mnT147mXyx78;bX1d?5Ym3G-*L0_-vzkI2+-1Dq8rXr>QR2aL1
zkvXs`FosrMa=D`;eW{9*wVLNXm-LL#z}T_l68D5>pCm&R(S=4k2!l}}XezI_2oLvt
zVc+cmRZ_9_#>SX6VC>!xPB|Un=t3VJ73eE+aks|Oz27B05z0uFJsl8x`?1LBppGdr
zDq{-4t^p{1Cg`sD2Xr2#FX6TD6<4io(D<i&tu{8k;klUY3d@4KeM0Y}SPGqe&gzBe
z5<jl-0`M5RJvigDx=12=hF%$61a?`LDtRt6Ke-+Z3Vz>|*uHHCsM5-<GPWWL$H!P5
zi^zi)C5hi+48vF~#|zQ>oO4Acc5?EjJ%dFP0%z_E&1qFcqJfb!j7l`nu0KkZFbA|1
zH$n5mYeE0(3Ep2PZfI@+ZPm@zvxUXzli>8WQdh2VmI}4<>Msk?9>F;Am@#5JhCDA$
zTyZ!ImxK{Bjc6d)Ws+)2DYUG93EH-7hmIZJgZ@;*fWC*`(9(*TYJ=76QAEt(V)Wgl
zY*^_Z{TRiL#c&*p=?IYx9_B2>eU6Z;XbgP>e)twi`p3t^u*OErGAJWvf?YE~m0pe6
z=H#HiQoMEJ+n|b{YZY4*;b;%W=5S~}JRg|wImL{{&W**=CfVl?4Yj+7OMkLZN0*eZ
z<=H1rg(2;s2oV~5sY{hMe{cX94AB1J7oeWH&?<It@Py4WP;A~7r`83Jan7KaVeEWu
z(KuUbs9nva>^AT4n!WNoqath;LNwc`q~j&5K>^g!i6!rIP-iZ&o-G&)b=Yk9Oqy-H
zcB1@RidE1UF8jFJqH(rV%IKooME}vF<&+lJ1jPUA=ioddzDsG+r3+B%f&l@<^*oPm
z099PM)of6N&gw#Vy1td=zzXlECn-iORug+%FuhE4o*vz$jBY?0C*ll?e915Qm4m?r
zpqNx_P=wBgOI4~AegM%vPsevZf%fWqaj9KuwecHJ%8+8i53=d7%6IbH6dM*J&+}Qj
z&Q;1>a2@E&{uCtY&4Bc6hvm3zoHWOv2q}h3QOe|n76H<qQb5z4|KXl%&9NJ3eDwW(
zSplr|OZoz1LZ9;-j46jMMY){M($!ZM8o{=}$B!3{38ET{irpNLvFjK4Oqz(kVbUDT
zNSBtBNsB;#?BpLBWc_I+w0-auG~W4NP$n+0`ncq4^7$dz4A|(GvIk>9U)2=CVl%$S
z<%-Kh!{pJkA9C{&jgitWwH#Mw9|mL|IwnJif)S!%oZuxSW&8pTl=khrpzW<sq2;-E
zpz$w{gSy}bP{vdWGA8+$e0>ys{)&IvQK_R#I>my;#BDhAJ(l_*+R=1pjapcevv>9f
z{#n2LBE_aoUZPjXOTaE+)PN!%A4Olk;+OtgoRilyiUG!g+6s3Tn~}p2p0n;=WDS~!
zd1Xcrz3-QO@UR#ml9n12vbkWFb=80(-yRgtgqMBOk1%-5D=rTflTpJNp5B)_xIYJC
z^oPqFUDDq0$=G!u2+NtI%%G5#cA>zop{qes+C@J7DR2fn@16FeWQ@yH22U_saXH)a
zQiU}kqHf>IZ}jL%c#Ie|YSiSHz0<bt2`r*_OP5kwW^AwnFnDn2C@C|lq-9;Z0}J74
z@1)Pr#|h+X=5sF=gHgk+Y392!b6^wjb{BCI3dae?KI@tCzn%VtP%kb6rMTSCASok9
z*fju=&&YR5NjdEB&xa>H6W&1I#*vSiuf2OM*Dn}&&IOSd+r$dPiN-wap78J&zWIjZ
zL0G$k<{1>?a<Ge^8c^i3lR>5MiO+PyJrm=eAfJ+NnUB3Lba?uLi0ZJ%7?DWgCUS_t
zpQEpF4O{k}clPfG{fj{rG|z}mF*XFDlkDnKCg036lCKW<&xTjMGEdaF%C8}K$fxLA
zDQlRWhto!(HG3i_www&~HbE3c`xNWl(?0pmw+K!J;5#c|o?a0+59~Ty4Jh&r9l!P|
zgf;FdpNhvgXOa&C9GoM`r_8rb7h=!DHxrFwdl7UYF90D5r|UD+7d_~fu<{e{{N_V`
zC7=qZ>{0|&8XE#CKyiu7<bz5h`Q$MAX0!M7=DWtnK0-bt-?2Ah0Q2eCixHl_HXCU-
zls^5;*99BC2_lCmO2b7i0mU2Lr+)FR_Y64chuO%#(tt8H_@fgqF`4FEX(S(<^24m-
zT?A_<rhPTd*?%tiihSl`YL<POFCCe0M~E)+N6$MN$FYV_>?LxbG)y4H-7!A)&UZbg
zAK&9$4E27Mp!BOUDEunB8t`YuMJ_hSE}An6_M#8o^vFH=_wiA8vsG3U^OczSZru5}
zqj0!DWNxl0{rclOD#VFpqku6kQ&&w$-te(!VdKx<b3x%-1xlYPy~4NJ*nmGPE;5<s
zRBfa=s(h>AAkO&%&w|EBCQRAnkG&50#EHu~4x!{L<}-7%d`ZF6S6}4Ft`d9q%0{ty
zV}0kWo{;kPHqXNL17?tXs|{w58ZK~Xy1~IY5jcmuOJOU{^{EM|@8&rAl=P8xyqT{Y
zFZO<CpxJ0N+q<BZgg^dclBdWanwI<I#BwKT^)nOF-v7j-sAaEL37qn&0+sLlE~W2$
zf~l(kov*k+#BAkk$2l15@!$Kr=EBDwg)OVy(l(bmNft10qR9v33zl`<nU6+as#%9`
zHgaY4J&;nir-<7miy@~LU=#T`mbQ1@r=QsASq#7V;PTdYKFLTLt}r#2)TLl{A~<l|
zrvi3+6$8x$=d=+U<WdGs49%I9t03kJS9{hOSa0OSRu`1AgPcVUVYKovXC%*&j%jze
z#@@SWV&=D>vaECh1EM+ulYxTOaGrqb1&qNAO`T6Amu<*qvi<*DWAF1A>6mWLI5bC^
zD+9-y`M~K??sW#6jYhIm?aXe3qCX!Jn=(>&X^Tb0&v6o0t(=g!`W5$_A3yahYTJV_
zQD&k*_6DjaR1Ig!$xtBahNZ!$+SnTyCCfAf&1YyE+4vyZTI>{5O}4ZB9IjNcj3Z`q
zbz^fM-D7!fhsO#aaT$sF0&Fa!oG{hX3WeUmbS1icoMhpO35l!LPt5#si)ViQx1O_L
zKL(G0s%JnknFDP&ldVkRenuF2s`u{|JzlF~u#gBQ0_FfV!#h1^!xoSH`VH<`Uyx0u
zF0#dFV<NLPhHR%fupY;pam?V1v4dlMkj60QPGI-BP-7{@lpjv-V23kVi2^h^bhKOE
z)#Ji%e0W0AnspPVZhOZ)?+BI-9R-$3-XZTY4lF7w^(?FO0IW|@Mxp1{VG~cUJ>p%?
zWtUyp%Y5cBL-)?aX-A&Jv1rVz#)aL4HsrHRLpH@aux#UO+J%?0Ie4-;*)xufKyqN)
z_T$*f#D`rAl9^%Zk(s)ILM3O7^__E-bNCH+x=w!Zi3v&1KRqGsy-jXeJKma@yYJnJ
zdB;9<FF3K)qo`rKd!g!cj~SXTJZEaK^r*Js|9$LUc;Y?xykFj)IBnmH_!@dGonyIc
z`~!4OI`_ztBU9K|acpcZ)AWEw#%%Rrw!5;qIM~6lEl8KM6^S`3x%PmGt_?}>tsH_)
zX(R=2!kNCQH&l~ZhDfB~`;BqV4jJuM5I@#?M)FwqStR<I{*Qjg0GUGNvd8PYVPTDM
zG#fK=wCOKYB+RCs(3s2AC^i>6IOhSR-dU+9OcUAi*O$HH38-MUn&Y7I8|4&B%VjQG
znYIafDz=x-{0^UM$||E`Oy@AcLgyZB`nxy@8`GEBFtHajy|axSoM8&nShn#to;9Z)
ztWou286k)Tn|cu$1)nkofxr~b6vp5PVSvckYb5L(0qmUKYz#LxrVF#d4$TD$)8#B^
zqgZq5$o5p6S^s1PYa%Nx9;~7DVlecS7yF$Dd+x*@pp0YZbYf$SW@C=*Ri5n7T;M?U
zgvtz-0}J>V7JNsRHTshI_hZ;=9D0D#6Bau#mk3n7;Tq8kw4UngIla$w$vyrbRS`%m
Tm_A~j00000NkvXXu0mjf?lK6S

diff --git a/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp b/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp
new file mode 100644
index 0000000000000000000000000000000000000000..a2564f7e625b8dd2a16179cdbfb3165eeced4477
GIT binary patch
literal 7206
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

literal 0
HcmV?d00001

diff --git a/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png
deleted file mode 100644
index d1cf872dbd9e24e78e8f98ccba38fc611ec079d8..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 7132
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

diff --git a/app/src/main/res/mipmap-xxxhdpi/ic_launcher.webp b/app/src/main/res/mipmap-xxxhdpi/ic_launcher.webp
new file mode 100644
index 0000000000000000000000000000000000000000..eb7ef4836dd597cc5d89e40c1e4df77e9d68f6f4
GIT binary patch
literal 5614
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
ImJ1~S08BaJZU6uP

literal 0
HcmV?d00001

diff --git a/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png b/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png
deleted file mode 100644
index 79b8131e4f648a2a453cad97c78f228958eae728..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 13045
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

diff --git a/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp b/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp
new file mode 100644
index 0000000000000000000000000000000000000000..78b6bf7919e10d659b3576505d88e028f1ccd0dd
GIT binary patch
literal 9770
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
E0-o{BBme*a

literal 0
HcmV?d00001

diff --git a/app/src/main/res/values-cat/help.xml b/app/src/main/res/values-cat/help.xml
index a72ebbdd66..51298dddd4 100644
--- a/app/src/main/res/values-cat/help.xml
+++ b/app/src/main/res/values-cat/help.xml
@@ -251,4 +251,37 @@
         <p>This is an .onion node. In order to use it, you must enable Tor mode by touching the
         <img src="ic_network_clearnet"/> icon near the top of the Wallet List page.</p>
     ]]></string>
+
+    <string name="help_sidekick"><![CDATA[
+        <h2>Using your sidekick wallet</h2>
+        Check that both phones are connected via Bluetooth and both apps are opened.
+
+        <h3>On sidekick:</h3>
+        Open your wallet of choice.
+
+        <h3>On monerujo:</h3>
+        Connect to sidekick.
+
+        Open the wallet matching the one you have opened on the sidekick phone.
+
+        Use it as you\'d normally use any wallet. Let it scan to see incoming transactions, share addresses, or send moneros. If the app needs to do something that involves your keys, it\'ll ask for permission from sidekick.
+
+        <h3>On sidekick:</h3>
+        If monerujo requested permission, you should see a dialog that shows the transaction details like amount and fees. You\'ll also see two options, to ACCEPT or DENY it. Choose wisely.
+
+        <h3>On monerujo:</h3>
+        The transaction should be signed and ready to be sent. Press to make it so.
+         <br/>
+    ]]></string>
+
+    <string name="help_create_sidekick" translatable="false"><![CDATA[
+        <h1>Create Wallet - Sidekick</h1>
+        <p>You want to recover your wallet from your awesome Sidekick device.</p>
+        <p>Et netus et malesuada fames. Mattis enim ut tellus elementum sagittis vitae. Eget duis at
+        tellus at. Id aliquet risus feugiat in. Donec et odio pellentesque diam. Dictum fusce ut
+        placerat orci nulla. Amet nisl suscipit adipiscing bibendum est ultricies integer quis.</p>
+        <p>Enter the block number of the first transaction used for this address in the
+        field \"Restore Height\". You can also use a date in the format YYYY-MM-DD. If you are not sure,
+        enter an approximate date/blockheight <em>before</em> you first used this wallet address.</p>
+    ]]></string>
 </resources>
diff --git a/app/src/main/res/values-cat/strings.xml b/app/src/main/res/values-cat/strings.xml
index 88c331549c..804d592db2 100644
--- a/app/src/main/res/values-cat/strings.xml
+++ b/app/src/main/res/values-cat/strings.xml
@@ -447,4 +447,17 @@
     <string name="label_apply">APPLY</string>
 
     <string name="setting_lock">Lock Wallet in Background</string>
+
+    <string name="bluetooth_permissions">Bluetooth permissions are required to connect your Sidekick Wallet!</string>
+    <string name="bluetooth_permissions_ok">OK</string>
+    <string name="bluetooth_permissions_settings">App Settings</string>
+    <string name="bluetooth_permissions_cancel">Cancel</string>
+
+    <string name="sidekick_pin">PIN: %1$s</string>
+    <string name="sidekick_not_connected">[not connected]</string>
+    <string name="sidekick_confirm_tx">Confirm Transaction</string>
+    <string name="sidekick_network_warning">Network is on - this is a security risk. It is recommended
+        to turn on flight mode and restart the app with only Bluetooth enabled!</string>
+    <string name="open_wallet_sidekick_missing">Please connect Sidekick device</string>
+    <string name="fab_restore_sidekick">Restore from Sidekick</string>
 </resources>
diff --git a/app/src/main/res/values-de/help.xml b/app/src/main/res/values-de/help.xml
index 058272bc0b..c680b56c19 100644
--- a/app/src/main/res/values-de/help.xml
+++ b/app/src/main/res/values-de/help.xml
@@ -311,4 +311,37 @@
         <p>This is an .onion node. In order to use it, you must enable Tor mode by touching the
         <img src="ic_network_clearnet"/> icon near the top of the Wallet List page.</p>
     ]]></string>
+
+    <string name="help_sidekick"><![CDATA[
+        <h2>Using your sidekick wallet</h2>
+        Check that both phones are connected via Bluetooth and both apps are opened.
+
+        <h3>On sidekick:</h3>
+        Open your wallet of choice.
+
+        <h3>On monerujo:</h3>
+        Connect to sidekick.
+
+        Open the wallet matching the one you have opened on the sidekick phone.
+
+        Use it as you\'d normally use any wallet. Let it scan to see incoming transactions, share addresses, or send moneros. If the app needs to do something that involves your keys, it\'ll ask for permission from sidekick.
+
+        <h3>On sidekick:</h3>
+        If monerujo requested permission, you should see a dialog that shows the transaction details like amount and fees. You\'ll also see two options, to ACCEPT or DENY it. Choose wisely.
+
+        <h3>On monerujo:</h3>
+        The transaction should be signed and ready to be sent. Press to make it so.
+         <br/>
+    ]]></string>
+
+    <string name="help_create_sidekick" translatable="false"><![CDATA[
+        <h1>Create Wallet - Sidekick</h1>
+        <p>You want to recover your wallet from your awesome Sidekick device.</p>
+        <p>Et netus et malesuada fames. Mattis enim ut tellus elementum sagittis vitae. Eget duis at
+        tellus at. Id aliquet risus feugiat in. Donec et odio pellentesque diam. Dictum fusce ut
+        placerat orci nulla. Amet nisl suscipit adipiscing bibendum est ultricies integer quis.</p>
+        <p>Enter the block number of the first transaction used for this address in the
+        field \"Restore Height\". You can also use a date in the format YYYY-MM-DD. If you are not sure,
+        enter an approximate date/blockheight <em>before</em> you first used this wallet address.</p>
+    ]]></string>
 </resources>
diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml
index 3868613cde..78a6fb0af4 100644
--- a/app/src/main/res/values-de/strings.xml
+++ b/app/src/main/res/values-de/strings.xml
@@ -448,4 +448,17 @@
     <string name="label_apply">ANWENDEN</string>
 
     <string name="setting_lock">Lock Wallet in Background</string>
+
+    <string name="bluetooth_permissions">Bluetooth permissions are required to connect your Sidekick Wallet!</string>
+    <string name="bluetooth_permissions_ok">OK</string>
+    <string name="bluetooth_permissions_settings">App Settings</string>
+    <string name="bluetooth_permissions_cancel">Cancel</string>
+
+    <string name="sidekick_pin">PIN: %1$s</string>
+    <string name="sidekick_not_connected">[not connected]</string>
+    <string name="sidekick_confirm_tx">Confirm Transaction</string>
+    <string name="sidekick_network_warning">Network is on - this is a security risk. It is recommended
+        to turn on flight mode and restart the app with only Bluetooth enabled!</string>
+    <string name="open_wallet_sidekick_missing">Please connect Sidekick device</string>
+    <string name="fab_restore_sidekick">Restore from Sidekick</string>
 </resources>
diff --git a/app/src/main/res/values-el/help.xml b/app/src/main/res/values-el/help.xml
index 9683ba5920..c1a7434ca6 100644
--- a/app/src/main/res/values-el/help.xml
+++ b/app/src/main/res/values-el/help.xml
@@ -293,4 +293,37 @@
         <p>This is an .onion node. In order to use it, you must enable Tor mode by touching the
         <img src="ic_network_clearnet"/> icon near the top of the Wallet List page.</p>
     ]]></string>
+
+    <string name="help_sidekick"><![CDATA[
+        <h2>Using your sidekick wallet</h2>
+        Check that both phones are connected via Bluetooth and both apps are opened.
+
+        <h3>On sidekick:</h3>
+        Open your wallet of choice.
+
+        <h3>On monerujo:</h3>
+        Connect to sidekick.
+
+        Open the wallet matching the one you have opened on the sidekick phone.
+
+        Use it as you\'d normally use any wallet. Let it scan to see incoming transactions, share addresses, or send moneros. If the app needs to do something that involves your keys, it\'ll ask for permission from sidekick.
+
+        <h3>On sidekick:</h3>
+        If monerujo requested permission, you should see a dialog that shows the transaction details like amount and fees. You\'ll also see two options, to ACCEPT or DENY it. Choose wisely.
+
+        <h3>On monerujo:</h3>
+        The transaction should be signed and ready to be sent. Press to make it so.
+         <br/>
+    ]]></string>
+
+    <string name="help_create_sidekick" translatable="false"><![CDATA[
+        <h1>Create Wallet - Sidekick</h1>
+        <p>You want to recover your wallet from your awesome Sidekick device.</p>
+        <p>Et netus et malesuada fames. Mattis enim ut tellus elementum sagittis vitae. Eget duis at
+        tellus at. Id aliquet risus feugiat in. Donec et odio pellentesque diam. Dictum fusce ut
+        placerat orci nulla. Amet nisl suscipit adipiscing bibendum est ultricies integer quis.</p>
+        <p>Enter the block number of the first transaction used for this address in the
+        field \"Restore Height\". You can also use a date in the format YYYY-MM-DD. If you are not sure,
+        enter an approximate date/blockheight <em>before</em> you first used this wallet address.</p>
+    ]]></string>
 </resources>
diff --git a/app/src/main/res/values-el/strings.xml b/app/src/main/res/values-el/strings.xml
index 522ba7c723..855b3477fe 100644
--- a/app/src/main/res/values-el/strings.xml
+++ b/app/src/main/res/values-el/strings.xml
@@ -449,4 +449,17 @@
     <string name="label_apply">APPLY</string>
 
     <string name="setting_lock">Lock Wallet in Background</string>
+
+    <string name="bluetooth_permissions">Bluetooth permissions are required to connect your Sidekick Wallet!</string>
+    <string name="bluetooth_permissions_ok">OK</string>
+    <string name="bluetooth_permissions_settings">App Settings</string>
+    <string name="bluetooth_permissions_cancel">Cancel</string>
+
+    <string name="sidekick_pin">PIN: %1$s</string>
+    <string name="sidekick_not_connected">[not connected]</string>
+    <string name="sidekick_confirm_tx">Confirm Transaction</string>
+    <string name="sidekick_network_warning">Network is on - this is a security risk. It is recommended
+        to turn on flight mode and restart the app with only Bluetooth enabled!</string>
+    <string name="open_wallet_sidekick_missing">Please connect Sidekick device</string>
+    <string name="fab_restore_sidekick">Restore from Sidekick</string>
 </resources>
diff --git a/app/src/main/res/values-eo/help.xml b/app/src/main/res/values-eo/help.xml
index 601cd27ef0..1785c885d0 100644
--- a/app/src/main/res/values-eo/help.xml
+++ b/app/src/main/res/values-eo/help.xml
@@ -337,4 +337,37 @@
         <p>This is an .onion node. In order to use it, you must enable Tor mode by touching the
         <img src="ic_network_clearnet"/> icon near the top of the Wallet List page.</p>
     ]]></string>
+
+    <string name="help_sidekick"><![CDATA[
+        <h2>Using your sidekick wallet</h2>
+        Check that both phones are connected via Bluetooth and both apps are opened.
+
+        <h3>On sidekick:</h3>
+        Open your wallet of choice.
+
+        <h3>On monerujo:</h3>
+        Connect to sidekick.
+
+        Open the wallet matching the one you have opened on the sidekick phone.
+
+        Use it as you\'d normally use any wallet. Let it scan to see incoming transactions, share addresses, or send moneros. If the app needs to do something that involves your keys, it\'ll ask for permission from sidekick.
+
+        <h3>On sidekick:</h3>
+        If monerujo requested permission, you should see a dialog that shows the transaction details like amount and fees. You\'ll also see two options, to ACCEPT or DENY it. Choose wisely.
+
+        <h3>On monerujo:</h3>
+        The transaction should be signed and ready to be sent. Press to make it so.
+         <br/>
+    ]]></string>
+
+    <string name="help_create_sidekick" translatable="false"><![CDATA[
+        <h1>Create Wallet - Sidekick</h1>
+        <p>You want to recover your wallet from your awesome Sidekick device.</p>
+        <p>Et netus et malesuada fames. Mattis enim ut tellus elementum sagittis vitae. Eget duis at
+        tellus at. Id aliquet risus feugiat in. Donec et odio pellentesque diam. Dictum fusce ut
+        placerat orci nulla. Amet nisl suscipit adipiscing bibendum est ultricies integer quis.</p>
+        <p>Enter the block number of the first transaction used for this address in the
+        field \"Restore Height\". You can also use a date in the format YYYY-MM-DD. If you are not sure,
+        enter an approximate date/blockheight <em>before</em> you first used this wallet address.</p>
+    ]]></string>
 </resources>
diff --git a/app/src/main/res/values-eo/strings.xml b/app/src/main/res/values-eo/strings.xml
index f6d669f316..bd4b49a1ab 100644
--- a/app/src/main/res/values-eo/strings.xml
+++ b/app/src/main/res/values-eo/strings.xml
@@ -447,4 +447,17 @@
     <string name="label_apply">APPLY</string>
 
     <string name="setting_lock">Lock Wallet in Background</string>
+
+    <string name="bluetooth_permissions">Bluetooth permissions are required to connect your Sidekick Wallet!</string>
+    <string name="bluetooth_permissions_ok">OK</string>
+    <string name="bluetooth_permissions_settings">App Settings</string>
+    <string name="bluetooth_permissions_cancel">Cancel</string>
+
+    <string name="sidekick_pin">PIN: %1$s</string>
+    <string name="sidekick_not_connected">[not connected]</string>
+    <string name="sidekick_confirm_tx">Confirm Transaction</string>
+    <string name="sidekick_network_warning">Network is on - this is a security risk. It is recommended
+        to turn on flight mode and restart the app with only Bluetooth enabled!</string>
+    <string name="open_wallet_sidekick_missing">Please connect Sidekick device</string>
+    <string name="fab_restore_sidekick">Restore from Sidekick</string>
 </resources>
diff --git a/app/src/main/res/values-es/help.xml b/app/src/main/res/values-es/help.xml
index c398da6a8a..4fd451f196 100644
--- a/app/src/main/res/values-es/help.xml
+++ b/app/src/main/res/values-es/help.xml
@@ -138,15 +138,6 @@
 		<h2>Tasa de cambio</h2>
 		<p>Debajo verás la cotización actual ofrecida por el exchange, junto con los montos mínimos y máximos. Por favor ten presente que en este paso esta cotización no está garantizada aún, va a confirarse en la siguiente pantalla, cuando tu transacción esté lista para aprobarse.</p>
 	]]></string>
-		
-	<string name="help_confirm"><![CDATA[		
-		<h1>Orden de cambio</h1>
-		<p>En esta pantalla estás viendo la orden coordinada con el exchange. Esta es válida por un tiempo limitado, quizás notes una cuenta regresiva en el botón de \"Enviar\". Esta cotización puede ser diferente a la indicada en los pasos anteriores, pero mientras autorices el envío antes de que se acabe el tiempo, quedará fija.</p>
-		<h2>Número de orden</h2>
-		<p>Como Monerujo solamente maneja el lado de XMR de la transacción, vas a necesitar este <em>número de orden</em> para rastrear el proceso de tu intercambio o recibir soporte en el sitio del exchange.</p>
-		<h2>El tiempo se acabó</h2>
-		<p>En caso de que la cuenta atrás llegue a cero, necesitarás conseguir una nueva cotización del exchange. Para eso debes volver a la pantalla anterior, y luego avanzar nuevamente a esta.</p>
-    ]]></string>
 
     <string name="help_create_ledger"><![CDATA[
         <h1>Crear Monedero con Ledger</h1>
@@ -220,4 +211,37 @@
         <h1>Nodo de Tor</h1>
         <p>Este nodo tiene una dirección <em>.onion</em>. Para usarlo, debes activar el modo Tor presionando el ícono <img src="ic_network_clearnet"/> junto al nodo en la pantalla principal.</p>
     ]]></string>
+
+    <string name="help_sidekick"><![CDATA[
+        <h2>Using your sidekick wallet</h2>
+        Check that both phones are connected via Bluetooth and both apps are opened.
+
+        <h3>On sidekick:</h3>
+        Open your wallet of choice.
+
+        <h3>On monerujo:</h3>
+        Connect to sidekick.
+
+        Open the wallet matching the one you have opened on the sidekick phone.
+
+        Use it as you\'d normally use any wallet. Let it scan to see incoming transactions, share addresses, or send moneros. If the app needs to do something that involves your keys, it\'ll ask for permission from sidekick.
+
+        <h3>On sidekick:</h3>
+        If monerujo requested permission, you should see a dialog that shows the transaction details like amount and fees. You\'ll also see two options, to ACCEPT or DENY it. Choose wisely.
+
+        <h3>On monerujo:</h3>
+        The transaction should be signed and ready to be sent. Press to make it so.
+         <br/>
+    ]]></string>
+
+    <string name="help_create_sidekick" translatable="false"><![CDATA[
+        <h1>Create Wallet - Sidekick</h1>
+        <p>You want to recover your wallet from your awesome Sidekick device.</p>
+        <p>Et netus et malesuada fames. Mattis enim ut tellus elementum sagittis vitae. Eget duis at
+        tellus at. Id aliquet risus feugiat in. Donec et odio pellentesque diam. Dictum fusce ut
+        placerat orci nulla. Amet nisl suscipit adipiscing bibendum est ultricies integer quis.</p>
+        <p>Enter the block number of the first transaction used for this address in the
+        field \"Restore Height\". You can also use a date in the format YYYY-MM-DD. If you are not sure,
+        enter an approximate date/blockheight <em>before</em> you first used this wallet address.</p>
+    ]]></string>
 </resources>
diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml
index bf6bbe0169..8f8de438f4 100644
--- a/app/src/main/res/values-es/strings.xml
+++ b/app/src/main/res/values-es/strings.xml
@@ -444,4 +444,17 @@
     <string name="label_apply">APLICAR</string>
 
     <string name="setting_lock">Lock Wallet in Background</string>
+
+    <string name="bluetooth_permissions">Bluetooth permissions are required to connect your Sidekick Wallet!</string>
+    <string name="bluetooth_permissions_ok">OK</string>
+    <string name="bluetooth_permissions_settings">App Settings</string>
+    <string name="bluetooth_permissions_cancel">Cancel</string>
+
+    <string name="sidekick_pin">PIN: %1$s</string>
+    <string name="sidekick_not_connected">[not connected]</string>
+    <string name="sidekick_confirm_tx">Confirm Transaction</string>
+    <string name="sidekick_network_warning">Network is on - this is a security risk. It is recommended
+        to turn on flight mode and restart the app with only Bluetooth enabled!</string>
+    <string name="open_wallet_sidekick_missing">Please connect Sidekick device</string>
+    <string name="fab_restore_sidekick">Restore from Sidekick</string>
 </resources>
diff --git a/app/src/main/res/values-et/help.xml b/app/src/main/res/values-et/help.xml
index cf7e47a02a..dcd16fbb20 100644
--- a/app/src/main/res/values-et/help.xml
+++ b/app/src/main/res/values-et/help.xml
@@ -313,4 +313,37 @@
         <p>This is an .onion node. In order to use it, you must enable Tor mode by touching the
         <img src="ic_network_clearnet"/> icon near the top of the Wallet List page.</p>
     ]]></string>
+
+    <string name="help_sidekick"><![CDATA[
+        <h2>Using your sidekick wallet</h2>
+        Check that both phones are connected via Bluetooth and both apps are opened.
+
+        <h3>On sidekick:</h3>
+        Open your wallet of choice.
+
+        <h3>On monerujo:</h3>
+        Connect to sidekick.
+
+        Open the wallet matching the one you have opened on the sidekick phone.
+
+        Use it as you\'d normally use any wallet. Let it scan to see incoming transactions, share addresses, or send moneros. If the app needs to do something that involves your keys, it\'ll ask for permission from sidekick.
+
+        <h3>On sidekick:</h3>
+        If monerujo requested permission, you should see a dialog that shows the transaction details like amount and fees. You\'ll also see two options, to ACCEPT or DENY it. Choose wisely.
+
+        <h3>On monerujo:</h3>
+        The transaction should be signed and ready to be sent. Press to make it so.
+         <br/>
+    ]]></string>
+
+    <string name="help_create_sidekick" translatable="false"><![CDATA[
+        <h1>Create Wallet - Sidekick</h1>
+        <p>You want to recover your wallet from your awesome Sidekick device.</p>
+        <p>Et netus et malesuada fames. Mattis enim ut tellus elementum sagittis vitae. Eget duis at
+        tellus at. Id aliquet risus feugiat in. Donec et odio pellentesque diam. Dictum fusce ut
+        placerat orci nulla. Amet nisl suscipit adipiscing bibendum est ultricies integer quis.</p>
+        <p>Enter the block number of the first transaction used for this address in the
+        field \"Restore Height\". You can also use a date in the format YYYY-MM-DD. If you are not sure,
+        enter an approximate date/blockheight <em>before</em> you first used this wallet address.</p>
+    ]]></string>
 </resources>
diff --git a/app/src/main/res/values-et/strings.xml b/app/src/main/res/values-et/strings.xml
index f0468de113..9100252f8c 100644
--- a/app/src/main/res/values-et/strings.xml
+++ b/app/src/main/res/values-et/strings.xml
@@ -447,4 +447,17 @@
     <string name="label_apply">APPLY</string>
 
     <string name="setting_lock">Lock Wallet in Background</string>
+
+    <string name="bluetooth_permissions">Bluetooth permissions are required to connect your Sidekick Wallet!</string>
+    <string name="bluetooth_permissions_ok">OK</string>
+    <string name="bluetooth_permissions_settings">App Settings</string>
+    <string name="bluetooth_permissions_cancel">Cancel</string>
+
+    <string name="sidekick_pin">PIN: %1$s</string>
+    <string name="sidekick_not_connected">[not connected]</string>
+    <string name="sidekick_confirm_tx">Confirm Transaction</string>
+    <string name="sidekick_network_warning">Network is on - this is a security risk. It is recommended
+        to turn on flight mode and restart the app with only Bluetooth enabled!</string>
+    <string name="open_wallet_sidekick_missing">Please connect Sidekick device</string>
+    <string name="fab_restore_sidekick">Restore from Sidekick</string>
 </resources>
diff --git a/app/src/main/res/values-fa/help.xml b/app/src/main/res/values-fa/help.xml
index e557243ee9..d6ea0761f7 100644
--- a/app/src/main/res/values-fa/help.xml
+++ b/app/src/main/res/values-fa/help.xml
@@ -422,4 +422,37 @@
         
         </p>
     ]]></string>
+
+    <string name="help_sidekick"><![CDATA[
+        <h2>Using your sidekick wallet</h2>
+        Check that both phones are connected via Bluetooth and both apps are opened.
+
+        <h3>On sidekick:</h3>
+        Open your wallet of choice.
+
+        <h3>On monerujo:</h3>
+        Connect to sidekick.
+
+        Open the wallet matching the one you have opened on the sidekick phone.
+
+        Use it as you\'d normally use any wallet. Let it scan to see incoming transactions, share addresses, or send moneros. If the app needs to do something that involves your keys, it\'ll ask for permission from sidekick.
+
+        <h3>On sidekick:</h3>
+        If monerujo requested permission, you should see a dialog that shows the transaction details like amount and fees. You\'ll also see two options, to ACCEPT or DENY it. Choose wisely.
+
+        <h3>On monerujo:</h3>
+        The transaction should be signed and ready to be sent. Press to make it so.
+         <br/>
+    ]]></string>
+
+    <string name="help_create_sidekick" translatable="false"><![CDATA[
+        <h1>Create Wallet - Sidekick</h1>
+        <p>You want to recover your wallet from your awesome Sidekick device.</p>
+        <p>Et netus et malesuada fames. Mattis enim ut tellus elementum sagittis vitae. Eget duis at
+        tellus at. Id aliquet risus feugiat in. Donec et odio pellentesque diam. Dictum fusce ut
+        placerat orci nulla. Amet nisl suscipit adipiscing bibendum est ultricies integer quis.</p>
+        <p>Enter the block number of the first transaction used for this address in the
+        field \"Restore Height\". You can also use a date in the format YYYY-MM-DD. If you are not sure,
+        enter an approximate date/blockheight <em>before</em> you first used this wallet address.</p>
+    ]]></string>
 </resources>
diff --git a/app/src/main/res/values-fa/strings.xml b/app/src/main/res/values-fa/strings.xml
index 2b34fa2fe5..96a5e71969 100644
--- a/app/src/main/res/values-fa/strings.xml
+++ b/app/src/main/res/values-fa/strings.xml
@@ -687,4 +687,17 @@
     <string name="label_apply">APPLY</string>
 
     <string name="setting_lock">Lock Wallet in Background</string>
+
+    <string name="bluetooth_permissions">Bluetooth permissions are required to connect your Sidekick Wallet!</string>
+    <string name="bluetooth_permissions_ok">OK</string>
+    <string name="bluetooth_permissions_settings">App Settings</string>
+    <string name="bluetooth_permissions_cancel">Cancel</string>
+
+    <string name="sidekick_pin">PIN: %1$s</string>
+    <string name="sidekick_not_connected">[not connected]</string>
+    <string name="sidekick_confirm_tx">Confirm Transaction</string>
+    <string name="sidekick_network_warning">Network is on - this is a security risk. It is recommended
+        to turn on flight mode and restart the app with only Bluetooth enabled!</string>
+    <string name="open_wallet_sidekick_missing">Please connect Sidekick device</string>
+    <string name="fab_restore_sidekick">Restore from Sidekick</string>
 </resources>
diff --git a/app/src/main/res/values-fr/help.xml b/app/src/main/res/values-fr/help.xml
index 58aa78add1..c7b17caf3f 100644
--- a/app/src/main/res/values-fr/help.xml
+++ b/app/src/main/res/values-fr/help.xml
@@ -331,4 +331,37 @@
         <p>This is an .onion node. In order to use it, you must enable Tor mode by touching the
         <img src="ic_network_clearnet"/> icon near the top of the Wallet List page.</p>
     ]]></string>
+
+    <string name="help_sidekick"><![CDATA[
+        <h2>Using your sidekick wallet</h2>
+        Check that both phones are connected via Bluetooth and both apps are opened.
+
+        <h3>On sidekick:</h3>
+        Open your wallet of choice.
+
+        <h3>On monerujo:</h3>
+        Connect to sidekick.
+
+        Open the wallet matching the one you have opened on the sidekick phone.
+
+        Use it as you\'d normally use any wallet. Let it scan to see incoming transactions, share addresses, or send moneros. If the app needs to do something that involves your keys, it\'ll ask for permission from sidekick.
+
+        <h3>On sidekick:</h3>
+        If monerujo requested permission, you should see a dialog that shows the transaction details like amount and fees. You\'ll also see two options, to ACCEPT or DENY it. Choose wisely.
+
+        <h3>On monerujo:</h3>
+        The transaction should be signed and ready to be sent. Press to make it so.
+         <br/>
+    ]]></string>
+
+    <string name="help_create_sidekick" translatable="false"><![CDATA[
+        <h1>Create Wallet - Sidekick</h1>
+        <p>You want to recover your wallet from your awesome Sidekick device.</p>
+        <p>Et netus et malesuada fames. Mattis enim ut tellus elementum sagittis vitae. Eget duis at
+        tellus at. Id aliquet risus feugiat in. Donec et odio pellentesque diam. Dictum fusce ut
+        placerat orci nulla. Amet nisl suscipit adipiscing bibendum est ultricies integer quis.</p>
+        <p>Enter the block number of the first transaction used for this address in the
+        field \"Restore Height\". You can also use a date in the format YYYY-MM-DD. If you are not sure,
+        enter an approximate date/blockheight <em>before</em> you first used this wallet address.</p>
+    ]]></string>
 </resources>
diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml
index 860edf1f09..905b6c86a0 100644
--- a/app/src/main/res/values-fr/strings.xml
+++ b/app/src/main/res/values-fr/strings.xml
@@ -460,4 +460,17 @@
     <string name="label_apply">APPLY</string>
 
     <string name="setting_lock">Lock Wallet in Background</string>
+
+    <string name="bluetooth_permissions">Bluetooth permissions are required to connect your Sidekick Wallet!</string>
+    <string name="bluetooth_permissions_ok">OK</string>
+    <string name="bluetooth_permissions_settings">App Settings</string>
+    <string name="bluetooth_permissions_cancel">Cancel</string>
+
+    <string name="sidekick_pin">PIN: %1$s</string>
+    <string name="sidekick_not_connected">[not connected]</string>
+    <string name="sidekick_confirm_tx">Confirm Transaction</string>
+    <string name="sidekick_network_warning">Network is on - this is a security risk. It is recommended
+        to turn on flight mode and restart the app with only Bluetooth enabled!</string>
+    <string name="open_wallet_sidekick_missing">Please connect Sidekick device</string>
+    <string name="fab_restore_sidekick">Restore from Sidekick</string>
 </resources>
diff --git a/app/src/main/res/values-he/help.xml b/app/src/main/res/values-he/help.xml
index 3bb802ec8e..e6800a4894 100644
--- a/app/src/main/res/values-he/help.xml
+++ b/app/src/main/res/values-he/help.xml
@@ -310,4 +310,37 @@
         <p>זהו חוליית אוניון. כדי להשתמש בה, עליך להפעיל את מצב טור על-ידי לחיצה
         <img src="ic_network_clearnet"/> ב-סמל ליד החלק העליון של דף רשימת הארנקים.</p>
     ]]></string>
+
+    <string name="help_sidekick"><![CDATA[
+        <h2>Using your sidekick wallet</h2>
+        Check that both phones are connected via Bluetooth and both apps are opened.
+
+        <h3>On sidekick:</h3>
+        Open your wallet of choice.
+
+        <h3>On monerujo:</h3>
+        Connect to sidekick.
+
+        Open the wallet matching the one you have opened on the sidekick phone.
+
+        Use it as you\'d normally use any wallet. Let it scan to see incoming transactions, share addresses, or send moneros. If the app needs to do something that involves your keys, it\'ll ask for permission from sidekick.
+
+        <h3>On sidekick:</h3>
+        If monerujo requested permission, you should see a dialog that shows the transaction details like amount and fees. You\'ll also see two options, to ACCEPT or DENY it. Choose wisely.
+
+        <h3>On monerujo:</h3>
+        The transaction should be signed and ready to be sent. Press to make it so.
+         <br/>
+    ]]></string>
+
+    <string name="help_create_sidekick" translatable="false"><![CDATA[
+        <h1>Create Wallet - Sidekick</h1>
+        <p>You want to recover your wallet from your awesome Sidekick device.</p>
+        <p>Et netus et malesuada fames. Mattis enim ut tellus elementum sagittis vitae. Eget duis at
+        tellus at. Id aliquet risus feugiat in. Donec et odio pellentesque diam. Dictum fusce ut
+        placerat orci nulla. Amet nisl suscipit adipiscing bibendum est ultricies integer quis.</p>
+        <p>Enter the block number of the first transaction used for this address in the
+        field \"Restore Height\". You can also use a date in the format YYYY-MM-DD. If you are not sure,
+        enter an approximate date/blockheight <em>before</em> you first used this wallet address.</p>
+    ]]></string>
 </resources>
diff --git a/app/src/main/res/values-he/strings.xml b/app/src/main/res/values-he/strings.xml
index c05e502066..5bf905d979 100644
--- a/app/src/main/res/values-he/strings.xml
+++ b/app/src/main/res/values-he/strings.xml
@@ -447,4 +447,17 @@
     <string name="label_apply">APPLY</string>
 
     <string name="setting_lock">Lock Wallet in Background</string>
+
+    <string name="bluetooth_permissions">Bluetooth permissions are required to connect your Sidekick Wallet!</string>
+    <string name="bluetooth_permissions_ok">OK</string>
+    <string name="bluetooth_permissions_settings">App Settings</string>
+    <string name="bluetooth_permissions_cancel">Cancel</string>
+
+    <string name="sidekick_pin">PIN: %1$s</string>
+    <string name="sidekick_not_connected">[not connected]</string>
+    <string name="sidekick_confirm_tx">Confirm Transaction</string>
+    <string name="sidekick_network_warning">Network is on - this is a security risk. It is recommended
+        to turn on flight mode and restart the app with only Bluetooth enabled!</string>
+    <string name="open_wallet_sidekick_missing">Please connect Sidekick device</string>
+    <string name="fab_restore_sidekick">Restore from Sidekick</string>
 </resources>
diff --git a/app/src/main/res/values-hu/help.xml b/app/src/main/res/values-hu/help.xml
index af34a4510d..d3541c8bef 100644
--- a/app/src/main/res/values-hu/help.xml
+++ b/app/src/main/res/values-hu/help.xml
@@ -315,4 +315,37 @@
         <p>This is an .onion node. In order to use it, you must enable Tor mode by touching the
         <img src="ic_network_clearnet"/> icon near the top of the Wallet List page.</p>
     ]]></string>
+
+    <string name="help_sidekick"><![CDATA[
+        <h2>Using your sidekick wallet</h2>
+        Check that both phones are connected via Bluetooth and both apps are opened.
+
+        <h3>On sidekick:</h3>
+        Open your wallet of choice.
+
+        <h3>On monerujo:</h3>
+        Connect to sidekick.
+
+        Open the wallet matching the one you have opened on the sidekick phone.
+
+        Use it as you\'d normally use any wallet. Let it scan to see incoming transactions, share addresses, or send moneros. If the app needs to do something that involves your keys, it\'ll ask for permission from sidekick.
+
+        <h3>On sidekick:</h3>
+        If monerujo requested permission, you should see a dialog that shows the transaction details like amount and fees. You\'ll also see two options, to ACCEPT or DENY it. Choose wisely.
+
+        <h3>On monerujo:</h3>
+        The transaction should be signed and ready to be sent. Press to make it so.
+         <br/>
+    ]]></string>
+
+    <string name="help_create_sidekick" translatable="false"><![CDATA[
+        <h1>Create Wallet - Sidekick</h1>
+        <p>You want to recover your wallet from your awesome Sidekick device.</p>
+        <p>Et netus et malesuada fames. Mattis enim ut tellus elementum sagittis vitae. Eget duis at
+        tellus at. Id aliquet risus feugiat in. Donec et odio pellentesque diam. Dictum fusce ut
+        placerat orci nulla. Amet nisl suscipit adipiscing bibendum est ultricies integer quis.</p>
+        <p>Enter the block number of the first transaction used for this address in the
+        field \"Restore Height\". You can also use a date in the format YYYY-MM-DD. If you are not sure,
+        enter an approximate date/blockheight <em>before</em> you first used this wallet address.</p>
+    ]]></string>
 </resources>
diff --git a/app/src/main/res/values-hu/strings.xml b/app/src/main/res/values-hu/strings.xml
index 29d01b2d6b..9fb4ac1db0 100644
--- a/app/src/main/res/values-hu/strings.xml
+++ b/app/src/main/res/values-hu/strings.xml
@@ -451,4 +451,17 @@
     <string name="label_apply">APPLY</string>
 
     <string name="setting_lock">Lock Wallet in Background</string>
+
+    <string name="bluetooth_permissions">Bluetooth permissions are required to connect your Sidekick Wallet!</string>
+    <string name="bluetooth_permissions_ok">OK</string>
+    <string name="bluetooth_permissions_settings">App Settings</string>
+    <string name="bluetooth_permissions_cancel">Cancel</string>
+
+    <string name="sidekick_pin">PIN: %1$s</string>
+    <string name="sidekick_not_connected">[not connected]</string>
+    <string name="sidekick_confirm_tx">Confirm Transaction</string>
+    <string name="sidekick_network_warning">Network is on - this is a security risk. It is recommended
+        to turn on flight mode and restart the app with only Bluetooth enabled!</string>
+    <string name="open_wallet_sidekick_missing">Please connect Sidekick device</string>
+    <string name="fab_restore_sidekick">Restore from Sidekick</string>
 </resources>
diff --git a/app/src/main/res/values-it/help.xml b/app/src/main/res/values-it/help.xml
index 84e772f498..a32e3d4b3d 100644
--- a/app/src/main/res/values-it/help.xml
+++ b/app/src/main/res/values-it/help.xml
@@ -316,4 +316,37 @@
         <p>This is an .onion node. In order to use it, you must enable Tor mode by touching the
         <img src="ic_network_clearnet"/> icon near the top of the Wallet List page.</p>
     ]]></string>
+
+    <string name="help_sidekick"><![CDATA[
+        <h2>Using your sidekick wallet</h2>
+        Check that both phones are connected via Bluetooth and both apps are opened.
+
+        <h3>On sidekick:</h3>
+        Open your wallet of choice.
+
+        <h3>On monerujo:</h3>
+        Connect to sidekick.
+
+        Open the wallet matching the one you have opened on the sidekick phone.
+
+        Use it as you\'d normally use any wallet. Let it scan to see incoming transactions, share addresses, or send moneros. If the app needs to do something that involves your keys, it\'ll ask for permission from sidekick.
+
+        <h3>On sidekick:</h3>
+        If monerujo requested permission, you should see a dialog that shows the transaction details like amount and fees. You\'ll also see two options, to ACCEPT or DENY it. Choose wisely.
+
+        <h3>On monerujo:</h3>
+        The transaction should be signed and ready to be sent. Press to make it so.
+         <br/>
+    ]]></string>
+
+    <string name="help_create_sidekick" translatable="false"><![CDATA[
+        <h1>Create Wallet - Sidekick</h1>
+        <p>You want to recover your wallet from your awesome Sidekick device.</p>
+        <p>Et netus et malesuada fames. Mattis enim ut tellus elementum sagittis vitae. Eget duis at
+        tellus at. Id aliquet risus feugiat in. Donec et odio pellentesque diam. Dictum fusce ut
+        placerat orci nulla. Amet nisl suscipit adipiscing bibendum est ultricies integer quis.</p>
+        <p>Enter the block number of the first transaction used for this address in the
+        field \"Restore Height\". You can also use a date in the format YYYY-MM-DD. If you are not sure,
+        enter an approximate date/blockheight <em>before</em> you first used this wallet address.</p>
+    ]]></string>
 </resources>
diff --git a/app/src/main/res/values-it/strings.xml b/app/src/main/res/values-it/strings.xml
index 9d915f3c6a..f4b88c5f4c 100644
--- a/app/src/main/res/values-it/strings.xml
+++ b/app/src/main/res/values-it/strings.xml
@@ -452,4 +452,17 @@
     <string name="label_apply">APPLY</string>
 
     <string name="setting_lock">Lock Wallet in Background</string>
+
+    <string name="bluetooth_permissions">Bluetooth permissions are required to connect your Sidekick Wallet!</string>
+    <string name="bluetooth_permissions_ok">OK</string>
+    <string name="bluetooth_permissions_settings">App Settings</string>
+    <string name="bluetooth_permissions_cancel">Cancel</string>
+
+    <string name="sidekick_pin">PIN: %1$s</string>
+    <string name="sidekick_not_connected">[not connected]</string>
+    <string name="sidekick_confirm_tx">Confirm Transaction</string>
+    <string name="sidekick_network_warning">Network is on - this is a security risk. It is recommended
+        to turn on flight mode and restart the app with only Bluetooth enabled!</string>
+    <string name="open_wallet_sidekick_missing">Please connect Sidekick device</string>
+    <string name="fab_restore_sidekick">Restore from Sidekick</string>
 </resources>
diff --git a/app/src/main/res/values-ja/help.xml b/app/src/main/res/values-ja/help.xml
index cbc0d117a9..c58ba6d82a 100644
--- a/app/src/main/res/values-ja/help.xml
+++ b/app/src/main/res/values-ja/help.xml
@@ -444,4 +444,37 @@
         <p>This is an .onion node. In order to use it, you must enable Tor mode by touching the
         <img src="ic_network_clearnet"/> icon near the top of the Wallet List page.</p>
     ]]></string>
+
+    <string name="help_sidekick"><![CDATA[
+        <h2>Using your sidekick wallet</h2>
+        Check that both phones are connected via Bluetooth and both apps are opened.
+
+        <h3>On sidekick:</h3>
+        Open your wallet of choice.
+
+        <h3>On monerujo:</h3>
+        Connect to sidekick.
+
+        Open the wallet matching the one you have opened on the sidekick phone.
+
+        Use it as you\'d normally use any wallet. Let it scan to see incoming transactions, share addresses, or send moneros. If the app needs to do something that involves your keys, it\'ll ask for permission from sidekick.
+
+        <h3>On sidekick:</h3>
+        If monerujo requested permission, you should see a dialog that shows the transaction details like amount and fees. You\'ll also see two options, to ACCEPT or DENY it. Choose wisely.
+
+        <h3>On monerujo:</h3>
+        The transaction should be signed and ready to be sent. Press to make it so.
+         <br/>
+    ]]></string>
+
+    <string name="help_create_sidekick" translatable="false"><![CDATA[
+        <h1>Create Wallet - Sidekick</h1>
+        <p>You want to recover your wallet from your awesome Sidekick device.</p>
+        <p>Et netus et malesuada fames. Mattis enim ut tellus elementum sagittis vitae. Eget duis at
+        tellus at. Id aliquet risus feugiat in. Donec et odio pellentesque diam. Dictum fusce ut
+        placerat orci nulla. Amet nisl suscipit adipiscing bibendum est ultricies integer quis.</p>
+        <p>Enter the block number of the first transaction used for this address in the
+        field \"Restore Height\". You can also use a date in the format YYYY-MM-DD. If you are not sure,
+        enter an approximate date/blockheight <em>before</em> you first used this wallet address.</p>
+    ]]></string>
 </resources>
diff --git a/app/src/main/res/values-ja/strings.xml b/app/src/main/res/values-ja/strings.xml
index 196a1caf70..c305f3552c 100644
--- a/app/src/main/res/values-ja/strings.xml
+++ b/app/src/main/res/values-ja/strings.xml
@@ -452,4 +452,17 @@
     <string name="label_apply">APPLY</string>
 
     <string name="setting_lock">Lock Wallet in Background</string>
+
+    <string name="bluetooth_permissions">Bluetooth permissions are required to connect your Sidekick Wallet!</string>
+    <string name="bluetooth_permissions_ok">OK</string>
+    <string name="bluetooth_permissions_settings">App Settings</string>
+    <string name="bluetooth_permissions_cancel">Cancel</string>
+
+    <string name="sidekick_pin">PIN: %1$s</string>
+    <string name="sidekick_not_connected">[not connected]</string>
+    <string name="sidekick_confirm_tx">Confirm Transaction</string>
+    <string name="sidekick_network_warning">Network is on - this is a security risk. It is recommended
+        to turn on flight mode and restart the app with only Bluetooth enabled!</string>
+    <string name="open_wallet_sidekick_missing">Please connect Sidekick device</string>
+    <string name="fab_restore_sidekick">Restore from Sidekick</string>
 </resources>
diff --git a/app/src/main/res/values-nb/help.xml b/app/src/main/res/values-nb/help.xml
index 70cdab6d9d..7644f54153 100644
--- a/app/src/main/res/values-nb/help.xml
+++ b/app/src/main/res/values-nb/help.xml
@@ -313,4 +313,37 @@
         <p>This is an .onion node. In order to use it, you must enable Tor mode by touching the
         <img src="ic_network_clearnet"/> icon near the top of the Wallet List page.</p>
     ]]></string>
+
+    <string name="help_sidekick"><![CDATA[
+        <h2>Using your sidekick wallet</h2>
+        Check that both phones are connected via Bluetooth and both apps are opened.
+
+        <h3>On sidekick:</h3>
+        Open your wallet of choice.
+
+        <h3>On monerujo:</h3>
+        Connect to sidekick.
+
+        Open the wallet matching the one you have opened on the sidekick phone.
+
+        Use it as you\'d normally use any wallet. Let it scan to see incoming transactions, share addresses, or send moneros. If the app needs to do something that involves your keys, it\'ll ask for permission from sidekick.
+
+        <h3>On sidekick:</h3>
+        If monerujo requested permission, you should see a dialog that shows the transaction details like amount and fees. You\'ll also see two options, to ACCEPT or DENY it. Choose wisely.
+
+        <h3>On monerujo:</h3>
+        The transaction should be signed and ready to be sent. Press to make it so.
+         <br/>
+    ]]></string>
+
+    <string name="help_create_sidekick" translatable="false"><![CDATA[
+        <h1>Create Wallet - Sidekick</h1>
+        <p>You want to recover your wallet from your awesome Sidekick device.</p>
+        <p>Et netus et malesuada fames. Mattis enim ut tellus elementum sagittis vitae. Eget duis at
+        tellus at. Id aliquet risus feugiat in. Donec et odio pellentesque diam. Dictum fusce ut
+        placerat orci nulla. Amet nisl suscipit adipiscing bibendum est ultricies integer quis.</p>
+        <p>Enter the block number of the first transaction used for this address in the
+        field \"Restore Height\". You can also use a date in the format YYYY-MM-DD. If you are not sure,
+        enter an approximate date/blockheight <em>before</em> you first used this wallet address.</p>
+    ]]></string>
 </resources>
diff --git a/app/src/main/res/values-nb/strings.xml b/app/src/main/res/values-nb/strings.xml
index 431d1d24ad..80453eac7e 100644
--- a/app/src/main/res/values-nb/strings.xml
+++ b/app/src/main/res/values-nb/strings.xml
@@ -449,4 +449,17 @@
     <string name="label_apply">APPLY</string>
 
     <string name="setting_lock">Lock Wallet in Background</string>
+
+    <string name="bluetooth_permissions">Bluetooth permissions are required to connect your Sidekick Wallet!</string>
+    <string name="bluetooth_permissions_ok">OK</string>
+    <string name="bluetooth_permissions_settings">App Settings</string>
+    <string name="bluetooth_permissions_cancel">Cancel</string>
+
+    <string name="sidekick_pin">PIN: %1$s</string>
+    <string name="sidekick_not_connected">[not connected]</string>
+    <string name="sidekick_confirm_tx">Confirm Transaction</string>
+    <string name="sidekick_network_warning">Network is on - this is a security risk. It is recommended
+        to turn on flight mode and restart the app with only Bluetooth enabled!</string>
+    <string name="open_wallet_sidekick_missing">Please connect Sidekick device</string>
+    <string name="fab_restore_sidekick">Restore from Sidekick</string>
 </resources>
diff --git a/app/src/main/res/values-nl/help.xml b/app/src/main/res/values-nl/help.xml
index 60ff8f6b3c..a150953cde 100644
--- a/app/src/main/res/values-nl/help.xml
+++ b/app/src/main/res/values-nl/help.xml
@@ -251,4 +251,37 @@
         <p>This is an .onion node. In order to use it, you must enable Tor mode by touching the
         <img src="ic_network_clearnet"/> icon near the top of the Wallet List page.</p>
     ]]></string>
+
+    <string name="help_sidekick"><![CDATA[
+        <h2>Using your sidekick wallet</h2>
+        Check that both phones are connected via Bluetooth and both apps are opened.
+
+        <h3>On sidekick:</h3>
+        Open your wallet of choice.
+
+        <h3>On monerujo:</h3>
+        Connect to sidekick.
+
+        Open the wallet matching the one you have opened on the sidekick phone.
+
+        Use it as you\'d normally use any wallet. Let it scan to see incoming transactions, share addresses, or send moneros. If the app needs to do something that involves your keys, it\'ll ask for permission from sidekick.
+
+        <h3>On sidekick:</h3>
+        If monerujo requested permission, you should see a dialog that shows the transaction details like amount and fees. You\'ll also see two options, to ACCEPT or DENY it. Choose wisely.
+
+        <h3>On monerujo:</h3>
+        The transaction should be signed and ready to be sent. Press to make it so.
+         <br/>
+    ]]></string>
+
+    <string name="help_create_sidekick" translatable="false"><![CDATA[
+        <h1>Create Wallet - Sidekick</h1>
+        <p>You want to recover your wallet from your awesome Sidekick device.</p>
+        <p>Et netus et malesuada fames. Mattis enim ut tellus elementum sagittis vitae. Eget duis at
+        tellus at. Id aliquet risus feugiat in. Donec et odio pellentesque diam. Dictum fusce ut
+        placerat orci nulla. Amet nisl suscipit adipiscing bibendum est ultricies integer quis.</p>
+        <p>Enter the block number of the first transaction used for this address in the
+        field \"Restore Height\". You can also use a date in the format YYYY-MM-DD. If you are not sure,
+        enter an approximate date/blockheight <em>before</em> you first used this wallet address.</p>
+    ]]></string>
 </resources>
diff --git a/app/src/main/res/values-nl/strings.xml b/app/src/main/res/values-nl/strings.xml
index 222f455788..59f0449c67 100644
--- a/app/src/main/res/values-nl/strings.xml
+++ b/app/src/main/res/values-nl/strings.xml
@@ -449,4 +449,17 @@
     <string name="label_apply">APPLY</string>
 
     <string name="setting_lock">Lock Wallet in Background</string>
+
+    <string name="bluetooth_permissions">Bluetooth permissions are required to connect your Sidekick Wallet!</string>
+    <string name="bluetooth_permissions_ok">OK</string>
+    <string name="bluetooth_permissions_settings">App Settings</string>
+    <string name="bluetooth_permissions_cancel">Cancel</string>
+
+    <string name="sidekick_pin">PIN: %1$s</string>
+    <string name="sidekick_not_connected">[not connected]</string>
+    <string name="sidekick_confirm_tx">Confirm Transaction</string>
+    <string name="sidekick_network_warning">Network is on - this is a security risk. It is recommended
+        to turn on flight mode and restart the app with only Bluetooth enabled!</string>
+    <string name="open_wallet_sidekick_missing">Please connect Sidekick device</string>
+    <string name="fab_restore_sidekick">Restore from Sidekick</string>
 </resources>
diff --git a/app/src/main/res/values-pt-rBR/help.xml b/app/src/main/res/values-pt-rBR/help.xml
index f1ecf142e6..a4d386adbe 100755
--- a/app/src/main/res/values-pt-rBR/help.xml
+++ b/app/src/main/res/values-pt-rBR/help.xml
@@ -312,4 +312,37 @@
         <p>This is an .onion node. In order to use it, you must enable Tor mode by touching the
         <img src="ic_network_clearnet"/> icon near the top of the Wallet List page.</p>
     ]]></string>
+
+    <string name="help_sidekick"><![CDATA[
+        <h2>Using your sidekick wallet</h2>
+        Check that both phones are connected via Bluetooth and both apps are opened.
+
+        <h3>On sidekick:</h3>
+        Open your wallet of choice.
+
+        <h3>On monerujo:</h3>
+        Connect to sidekick.
+
+        Open the wallet matching the one you have opened on the sidekick phone.
+
+        Use it as you\'d normally use any wallet. Let it scan to see incoming transactions, share addresses, or send moneros. If the app needs to do something that involves your keys, it\'ll ask for permission from sidekick.
+
+        <h3>On sidekick:</h3>
+        If monerujo requested permission, you should see a dialog that shows the transaction details like amount and fees. You\'ll also see two options, to ACCEPT or DENY it. Choose wisely.
+
+        <h3>On monerujo:</h3>
+        The transaction should be signed and ready to be sent. Press to make it so.
+         <br/>
+    ]]></string>
+
+    <string name="help_create_sidekick" translatable="false"><![CDATA[
+        <h1>Create Wallet - Sidekick</h1>
+        <p>You want to recover your wallet from your awesome Sidekick device.</p>
+        <p>Et netus et malesuada fames. Mattis enim ut tellus elementum sagittis vitae. Eget duis at
+        tellus at. Id aliquet risus feugiat in. Donec et odio pellentesque diam. Dictum fusce ut
+        placerat orci nulla. Amet nisl suscipit adipiscing bibendum est ultricies integer quis.</p>
+        <p>Enter the block number of the first transaction used for this address in the
+        field \"Restore Height\". You can also use a date in the format YYYY-MM-DD. If you are not sure,
+        enter an approximate date/blockheight <em>before</em> you first used this wallet address.</p>
+    ]]></string>
 </resources>
diff --git a/app/src/main/res/values-pt-rBR/strings.xml b/app/src/main/res/values-pt-rBR/strings.xml
index 8218cb911c..189354e134 100755
--- a/app/src/main/res/values-pt-rBR/strings.xml
+++ b/app/src/main/res/values-pt-rBR/strings.xml
@@ -442,4 +442,17 @@ aqui.</string>
     <string name="label_apply">APPLY</string>
 
     <string name="setting_lock">Lock Wallet in Background</string>
+
+    <string name="bluetooth_permissions">Bluetooth permissions are required to connect your Sidekick Wallet!</string>
+    <string name="bluetooth_permissions_ok">OK</string>
+    <string name="bluetooth_permissions_settings">App Settings</string>
+    <string name="bluetooth_permissions_cancel">Cancel</string>
+
+    <string name="sidekick_pin">PIN: %1$s</string>
+    <string name="sidekick_not_connected">[not connected]</string>
+    <string name="sidekick_confirm_tx">Confirm Transaction</string>
+    <string name="sidekick_network_warning">Network is on - this is a security risk. It is recommended
+        to turn on flight mode and restart the app with only Bluetooth enabled!</string>
+    <string name="open_wallet_sidekick_missing">Please connect Sidekick device</string>
+    <string name="fab_restore_sidekick">Restore from Sidekick</string>
 </resources>
diff --git a/app/src/main/res/values-pt/help.xml b/app/src/main/res/values-pt/help.xml
index 8d2ada4564..86fbd010d5 100644
--- a/app/src/main/res/values-pt/help.xml
+++ b/app/src/main/res/values-pt/help.xml
@@ -312,4 +312,37 @@
         <p>This is an .onion node. In order to use it, you must enable Tor mode by touching the
         <img src="ic_network_clearnet"/> icon near the top of the Wallet List page.</p>
     ]]></string>
+
+    <string name="help_sidekick"><![CDATA[
+        <h2>Using your sidekick wallet</h2>
+        Check that both phones are connected via Bluetooth and both apps are opened.
+
+        <h3>On sidekick:</h3>
+        Open your wallet of choice.
+
+        <h3>On monerujo:</h3>
+        Connect to sidekick.
+
+        Open the wallet matching the one you have opened on the sidekick phone.
+
+        Use it as you\'d normally use any wallet. Let it scan to see incoming transactions, share addresses, or send moneros. If the app needs to do something that involves your keys, it\'ll ask for permission from sidekick.
+
+        <h3>On sidekick:</h3>
+        If monerujo requested permission, you should see a dialog that shows the transaction details like amount and fees. You\'ll also see two options, to ACCEPT or DENY it. Choose wisely.
+
+        <h3>On monerujo:</h3>
+        The transaction should be signed and ready to be sent. Press to make it so.
+         <br/>
+    ]]></string>
+
+    <string name="help_create_sidekick" translatable="false"><![CDATA[
+        <h1>Create Wallet - Sidekick</h1>
+        <p>You want to recover your wallet from your awesome Sidekick device.</p>
+        <p>Et netus et malesuada fames. Mattis enim ut tellus elementum sagittis vitae. Eget duis at
+        tellus at. Id aliquet risus feugiat in. Donec et odio pellentesque diam. Dictum fusce ut
+        placerat orci nulla. Amet nisl suscipit adipiscing bibendum est ultricies integer quis.</p>
+        <p>Enter the block number of the first transaction used for this address in the
+        field \"Restore Height\". You can also use a date in the format YYYY-MM-DD. If you are not sure,
+        enter an approximate date/blockheight <em>before</em> you first used this wallet address.</p>
+    ]]></string>
 </resources>
diff --git a/app/src/main/res/values-pt/strings.xml b/app/src/main/res/values-pt/strings.xml
index e6ccbc0abc..31e58f0528 100644
--- a/app/src/main/res/values-pt/strings.xml
+++ b/app/src/main/res/values-pt/strings.xml
@@ -453,4 +453,17 @@
     <string name="label_apply">APPLY</string>
 
     <string name="setting_lock">Lock Wallet in Background</string>
+
+    <string name="bluetooth_permissions">Bluetooth permissions are required to connect your Sidekick Wallet!</string>
+    <string name="bluetooth_permissions_ok">OK</string>
+    <string name="bluetooth_permissions_settings">App Settings</string>
+    <string name="bluetooth_permissions_cancel">Cancel</string>
+
+    <string name="sidekick_pin">PIN: %1$s</string>
+    <string name="sidekick_not_connected">[not connected]</string>
+    <string name="sidekick_confirm_tx">Confirm Transaction</string>
+    <string name="sidekick_network_warning">Network is on - this is a security risk. It is recommended
+        to turn on flight mode and restart the app with only Bluetooth enabled!</string>
+    <string name="open_wallet_sidekick_missing">Please connect Sidekick device</string>
+    <string name="fab_restore_sidekick">Restore from Sidekick</string>
 </resources>
diff --git a/app/src/main/res/values-ro/help.xml b/app/src/main/res/values-ro/help.xml
index 5509965f34..e2d42d9ce9 100644
--- a/app/src/main/res/values-ro/help.xml
+++ b/app/src/main/res/values-ro/help.xml
@@ -319,4 +319,37 @@
         <p>This is an .onion node. In order to use it, you must enable Tor mode by touching the
         <img src="ic_network_clearnet"/> icon near the top of the Wallet List page.</p>
     ]]></string>
+
+    <string name="help_sidekick"><![CDATA[
+        <h2>Using your sidekick wallet</h2>
+        Check that both phones are connected via Bluetooth and both apps are opened.
+
+        <h3>On sidekick:</h3>
+        Open your wallet of choice.
+
+        <h3>On monerujo:</h3>
+        Connect to sidekick.
+
+        Open the wallet matching the one you have opened on the sidekick phone.
+
+        Use it as you\'d normally use any wallet. Let it scan to see incoming transactions, share addresses, or send moneros. If the app needs to do something that involves your keys, it\'ll ask for permission from sidekick.
+
+        <h3>On sidekick:</h3>
+        If monerujo requested permission, you should see a dialog that shows the transaction details like amount and fees. You\'ll also see two options, to ACCEPT or DENY it. Choose wisely.
+
+        <h3>On monerujo:</h3>
+        The transaction should be signed and ready to be sent. Press to make it so.
+         <br/>
+    ]]></string>
+
+    <string name="help_create_sidekick" translatable="false"><![CDATA[
+        <h1>Create Wallet - Sidekick</h1>
+        <p>You want to recover your wallet from your awesome Sidekick device.</p>
+        <p>Et netus et malesuada fames. Mattis enim ut tellus elementum sagittis vitae. Eget duis at
+        tellus at. Id aliquet risus feugiat in. Donec et odio pellentesque diam. Dictum fusce ut
+        placerat orci nulla. Amet nisl suscipit adipiscing bibendum est ultricies integer quis.</p>
+        <p>Enter the block number of the first transaction used for this address in the
+        field \"Restore Height\". You can also use a date in the format YYYY-MM-DD. If you are not sure,
+        enter an approximate date/blockheight <em>before</em> you first used this wallet address.</p>
+    ]]></string>
 </resources>
diff --git a/app/src/main/res/values-ro/strings.xml b/app/src/main/res/values-ro/strings.xml
index 9aa4201ef5..a98b2f6165 100644
--- a/app/src/main/res/values-ro/strings.xml
+++ b/app/src/main/res/values-ro/strings.xml
@@ -449,4 +449,17 @@
     <string name="label_apply">APPLY</string>
 
     <string name="setting_lock">Lock Wallet in Background</string>
+
+    <string name="bluetooth_permissions">Bluetooth permissions are required to connect your Sidekick Wallet!</string>
+    <string name="bluetooth_permissions_ok">OK</string>
+    <string name="bluetooth_permissions_settings">App Settings</string>
+    <string name="bluetooth_permissions_cancel">Cancel</string>
+
+    <string name="sidekick_pin">PIN: %1$s</string>
+    <string name="sidekick_not_connected">[not connected]</string>
+    <string name="sidekick_confirm_tx">Confirm Transaction</string>
+    <string name="sidekick_network_warning">Network is on - this is a security risk. It is recommended
+        to turn on flight mode and restart the app with only Bluetooth enabled!</string>
+    <string name="open_wallet_sidekick_missing">Please connect Sidekick device</string>
+    <string name="fab_restore_sidekick">Restore from Sidekick</string>
 </resources>
diff --git a/app/src/main/res/values-ru/help.xml b/app/src/main/res/values-ru/help.xml
index 28fb0b0ce6..664b9daff0 100644
--- a/app/src/main/res/values-ru/help.xml
+++ b/app/src/main/res/values-ru/help.xml
@@ -316,4 +316,37 @@
         <p>Это .onion узел. Для того, чтобы использовать его, вы должны включить Tor, нажав
         <img src="ic_network_clearnet"/> значок в верхней части страницы списка кошельков.</p>
     ]]></string>
+
+    <string name="help_sidekick"><![CDATA[
+        <h2>Using your sidekick wallet</h2>
+        Check that both phones are connected via Bluetooth and both apps are opened.
+
+        <h3>On sidekick:</h3>
+        Open your wallet of choice.
+
+        <h3>On monerujo:</h3>
+        Connect to sidekick.
+
+        Open the wallet matching the one you have opened on the sidekick phone.
+
+        Use it as you\'d normally use any wallet. Let it scan to see incoming transactions, share addresses, or send moneros. If the app needs to do something that involves your keys, it\'ll ask for permission from sidekick.
+
+        <h3>On sidekick:</h3>
+        If monerujo requested permission, you should see a dialog that shows the transaction details like amount and fees. You\'ll also see two options, to ACCEPT or DENY it. Choose wisely.
+
+        <h3>On monerujo:</h3>
+        The transaction should be signed and ready to be sent. Press to make it so.
+         <br/>
+    ]]></string>
+
+    <string name="help_create_sidekick" translatable="false"><![CDATA[
+        <h1>Create Wallet - Sidekick</h1>
+        <p>You want to recover your wallet from your awesome Sidekick device.</p>
+        <p>Et netus et malesuada fames. Mattis enim ut tellus elementum sagittis vitae. Eget duis at
+        tellus at. Id aliquet risus feugiat in. Donec et odio pellentesque diam. Dictum fusce ut
+        placerat orci nulla. Amet nisl suscipit adipiscing bibendum est ultricies integer quis.</p>
+        <p>Enter the block number of the first transaction used for this address in the
+        field \"Restore Height\". You can also use a date in the format YYYY-MM-DD. If you are not sure,
+        enter an approximate date/blockheight <em>before</em> you first used this wallet address.</p>
+    ]]></string>
 </resources>
diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml
index 3b3967c076..af38c4bfc9 100644
--- a/app/src/main/res/values-ru/strings.xml
+++ b/app/src/main/res/values-ru/strings.xml
@@ -453,4 +453,17 @@
     <string name="label_apply">APPLY</string>
 
     <string name="setting_lock">Lock Wallet in Background</string>
+
+    <string name="bluetooth_permissions">Bluetooth permissions are required to connect your Sidekick Wallet!</string>
+    <string name="bluetooth_permissions_ok">OK</string>
+    <string name="bluetooth_permissions_settings">App Settings</string>
+    <string name="bluetooth_permissions_cancel">Cancel</string>
+
+    <string name="sidekick_pin">PIN: %1$s</string>
+    <string name="sidekick_not_connected">[not connected]</string>
+    <string name="sidekick_confirm_tx">Confirm Transaction</string>
+    <string name="sidekick_network_warning">Network is on - this is a security risk. It is recommended
+        to turn on flight mode and restart the app with only Bluetooth enabled!</string>
+    <string name="open_wallet_sidekick_missing">Please connect Sidekick device</string>
+    <string name="fab_restore_sidekick">Restore from Sidekick</string>
 </resources>
diff --git a/app/src/main/res/values-sk/help.xml b/app/src/main/res/values-sk/help.xml
index 93c4672556..7d4910a7e8 100644
--- a/app/src/main/res/values-sk/help.xml
+++ b/app/src/main/res/values-sk/help.xml
@@ -280,4 +280,37 @@
         <p>This is an .onion node. In order to use it, you must enable Tor mode by touching the
         <img src="ic_network_clearnet"/> icon near the top of the Wallet List page.</p>
     ]]></string>
+
+    <string name="help_sidekick"><![CDATA[
+        <h2>Using your sidekick wallet</h2>
+        Check that both phones are connected via Bluetooth and both apps are opened.
+
+        <h3>On sidekick:</h3>
+        Open your wallet of choice.
+
+        <h3>On monerujo:</h3>
+        Connect to sidekick.
+
+        Open the wallet matching the one you have opened on the sidekick phone.
+
+        Use it as you\'d normally use any wallet. Let it scan to see incoming transactions, share addresses, or send moneros. If the app needs to do something that involves your keys, it\'ll ask for permission from sidekick.
+
+        <h3>On sidekick:</h3>
+        If monerujo requested permission, you should see a dialog that shows the transaction details like amount and fees. You\'ll also see two options, to ACCEPT or DENY it. Choose wisely.
+
+        <h3>On monerujo:</h3>
+        The transaction should be signed and ready to be sent. Press to make it so.
+         <br/>
+    ]]></string>
+
+    <string name="help_create_sidekick" translatable="false"><![CDATA[
+        <h1>Create Wallet - Sidekick</h1>
+        <p>You want to recover your wallet from your awesome Sidekick device.</p>
+        <p>Et netus et malesuada fames. Mattis enim ut tellus elementum sagittis vitae. Eget duis at
+        tellus at. Id aliquet risus feugiat in. Donec et odio pellentesque diam. Dictum fusce ut
+        placerat orci nulla. Amet nisl suscipit adipiscing bibendum est ultricies integer quis.</p>
+        <p>Enter the block number of the first transaction used for this address in the
+        field \"Restore Height\". You can also use a date in the format YYYY-MM-DD. If you are not sure,
+        enter an approximate date/blockheight <em>before</em> you first used this wallet address.</p>
+    ]]></string>
 </resources>
diff --git a/app/src/main/res/values-sk/strings.xml b/app/src/main/res/values-sk/strings.xml
index 9b38847499..bac5fd2663 100644
--- a/app/src/main/res/values-sk/strings.xml
+++ b/app/src/main/res/values-sk/strings.xml
@@ -450,4 +450,17 @@
     <string name="label_apply">APPLY</string>
 
     <string name="setting_lock">Lock Wallet in Background</string>
+
+    <string name="bluetooth_permissions">Bluetooth permissions are required to connect your Sidekick Wallet!</string>
+    <string name="bluetooth_permissions_ok">OK</string>
+    <string name="bluetooth_permissions_settings">App Settings</string>
+    <string name="bluetooth_permissions_cancel">Cancel</string>
+
+    <string name="sidekick_pin">PIN: %1$s</string>
+    <string name="sidekick_not_connected">[not connected]</string>
+    <string name="sidekick_confirm_tx">Confirm Transaction</string>
+    <string name="sidekick_network_warning">Network is on - this is a security risk. It is recommended
+        to turn on flight mode and restart the app with only Bluetooth enabled!</string>
+    <string name="open_wallet_sidekick_missing">Please connect Sidekick device</string>
+    <string name="fab_restore_sidekick">Restore from Sidekick</string>
 </resources>
diff --git a/app/src/main/res/values-sr/help.xml b/app/src/main/res/values-sr/help.xml
index d8b92bbc5e..8625bb9a43 100644
--- a/app/src/main/res/values-sr/help.xml
+++ b/app/src/main/res/values-sr/help.xml
@@ -311,4 +311,37 @@
         <p>This is an .onion node. In order to use it, you must enable Tor mode by touching the
         <img src="ic_network_clearnet"/> icon near the top of the Wallet List page.</p>
     ]]></string>
+
+    <string name="help_sidekick"><![CDATA[
+        <h2>Using your sidekick wallet</h2>
+        Check that both phones are connected via Bluetooth and both apps are opened.
+
+        <h3>On sidekick:</h3>
+        Open your wallet of choice.
+
+        <h3>On monerujo:</h3>
+        Connect to sidekick.
+
+        Open the wallet matching the one you have opened on the sidekick phone.
+
+        Use it as you\'d normally use any wallet. Let it scan to see incoming transactions, share addresses, or send moneros. If the app needs to do something that involves your keys, it\'ll ask for permission from sidekick.
+
+        <h3>On sidekick:</h3>
+        If monerujo requested permission, you should see a dialog that shows the transaction details like amount and fees. You\'ll also see two options, to ACCEPT or DENY it. Choose wisely.
+
+        <h3>On monerujo:</h3>
+        The transaction should be signed and ready to be sent. Press to make it so.
+         <br/>
+    ]]></string>
+
+    <string name="help_create_sidekick" translatable="false"><![CDATA[
+        <h1>Create Wallet - Sidekick</h1>
+        <p>You want to recover your wallet from your awesome Sidekick device.</p>
+        <p>Et netus et malesuada fames. Mattis enim ut tellus elementum sagittis vitae. Eget duis at
+        tellus at. Id aliquet risus feugiat in. Donec et odio pellentesque diam. Dictum fusce ut
+        placerat orci nulla. Amet nisl suscipit adipiscing bibendum est ultricies integer quis.</p>
+        <p>Enter the block number of the first transaction used for this address in the
+        field \"Restore Height\". You can also use a date in the format YYYY-MM-DD. If you are not sure,
+        enter an approximate date/blockheight <em>before</em> you first used this wallet address.</p>
+    ]]></string>
 </resources>
diff --git a/app/src/main/res/values-sr/strings.xml b/app/src/main/res/values-sr/strings.xml
index 36daf710d5..e09c8291f4 100644
--- a/app/src/main/res/values-sr/strings.xml
+++ b/app/src/main/res/values-sr/strings.xml
@@ -448,4 +448,17 @@
     <string name="label_apply">APPLY</string>
 
     <string name="setting_lock">Lock Wallet in Background</string>
+
+    <string name="bluetooth_permissions">Bluetooth permissions are required to connect your Sidekick Wallet!</string>
+    <string name="bluetooth_permissions_ok">OK</string>
+    <string name="bluetooth_permissions_settings">App Settings</string>
+    <string name="bluetooth_permissions_cancel">Cancel</string>
+
+    <string name="sidekick_pin">PIN: %1$s</string>
+    <string name="sidekick_not_connected">[not connected]</string>
+    <string name="sidekick_confirm_tx">Confirm Transaction</string>
+    <string name="sidekick_network_warning">Network is on - this is a security risk. It is recommended
+        to turn on flight mode and restart the app with only Bluetooth enabled!</string>
+    <string name="open_wallet_sidekick_missing">Please connect Sidekick device</string>
+    <string name="fab_restore_sidekick">Restore from Sidekick</string>
 </resources>
diff --git a/app/src/main/res/values-sv/help.xml b/app/src/main/res/values-sv/help.xml
index e3f80d884a..851c64621d 100644
--- a/app/src/main/res/values-sv/help.xml
+++ b/app/src/main/res/values-sv/help.xml
@@ -300,4 +300,37 @@
         <p>This is an .onion node. In order to use it, you must enable Tor mode by touching the
         <img src="ic_network_clearnet"/> icon near the top of the Wallet List page.</p>
     ]]></string>
+
+    <string name="help_sidekick"><![CDATA[
+        <h2>Using your sidekick wallet</h2>
+        Check that both phones are connected via Bluetooth and both apps are opened.
+
+        <h3>On sidekick:</h3>
+        Open your wallet of choice.
+
+        <h3>On monerujo:</h3>
+        Connect to sidekick.
+
+        Open the wallet matching the one you have opened on the sidekick phone.
+
+        Use it as you\'d normally use any wallet. Let it scan to see incoming transactions, share addresses, or send moneros. If the app needs to do something that involves your keys, it\'ll ask for permission from sidekick.
+
+        <h3>On sidekick:</h3>
+        If monerujo requested permission, you should see a dialog that shows the transaction details like amount and fees. You\'ll also see two options, to ACCEPT or DENY it. Choose wisely.
+
+        <h3>On monerujo:</h3>
+        The transaction should be signed and ready to be sent. Press to make it so.
+         <br/>
+    ]]></string>
+
+    <string name="help_create_sidekick" translatable="false"><![CDATA[
+        <h1>Create Wallet - Sidekick</h1>
+        <p>You want to recover your wallet from your awesome Sidekick device.</p>
+        <p>Et netus et malesuada fames. Mattis enim ut tellus elementum sagittis vitae. Eget duis at
+        tellus at. Id aliquet risus feugiat in. Donec et odio pellentesque diam. Dictum fusce ut
+        placerat orci nulla. Amet nisl suscipit adipiscing bibendum est ultricies integer quis.</p>
+        <p>Enter the block number of the first transaction used for this address in the
+        field \"Restore Height\". You can also use a date in the format YYYY-MM-DD. If you are not sure,
+        enter an approximate date/blockheight <em>before</em> you first used this wallet address.</p>
+    ]]></string>
 </resources>
diff --git a/app/src/main/res/values-sv/strings.xml b/app/src/main/res/values-sv/strings.xml
index a0ab29dce1..7fdb0e7bc4 100644
--- a/app/src/main/res/values-sv/strings.xml
+++ b/app/src/main/res/values-sv/strings.xml
@@ -441,4 +441,17 @@
     <string name="label_apply">APPLY</string>
 
     <string name="setting_lock">Lock Wallet in Background</string>
+
+    <string name="bluetooth_permissions">Bluetooth permissions are required to connect your Sidekick Wallet!</string>
+    <string name="bluetooth_permissions_ok">OK</string>
+    <string name="bluetooth_permissions_settings">App Settings</string>
+    <string name="bluetooth_permissions_cancel">Cancel</string>
+
+    <string name="sidekick_pin">PIN: %1$s</string>
+    <string name="sidekick_not_connected">[not connected]</string>
+    <string name="sidekick_confirm_tx">Confirm Transaction</string>
+    <string name="sidekick_network_warning">Network is on - this is a security risk. It is recommended
+        to turn on flight mode and restart the app with only Bluetooth enabled!</string>
+    <string name="open_wallet_sidekick_missing">Please connect Sidekick device</string>
+    <string name="fab_restore_sidekick">Restore from Sidekick</string>
 </resources>
diff --git a/app/src/main/res/values-ta/help.xml b/app/src/main/res/values-ta/help.xml
index a81a79bddd..03ea448a23 100644
--- a/app/src/main/res/values-ta/help.xml
+++ b/app/src/main/res/values-ta/help.xml
@@ -319,4 +319,37 @@
         <p>இது ஒரு .onion கணுவாகும். இதை பயன்படுத்த நீங்கள் பணப்பை பட்டியல் பக்கத்தின் மேல் உள்ள <img src="ic_network_clearnet"/>
         சின்னத்தை தட்டி TOR பயன்முறையை செயல்படுத்தவும்.</p>
     ]]></string>
+
+    <string name="help_sidekick"><![CDATA[
+        <h2>Using your sidekick wallet</h2>
+        Check that both phones are connected via Bluetooth and both apps are opened.
+
+        <h3>On sidekick:</h3>
+        Open your wallet of choice.
+
+        <h3>On monerujo:</h3>
+        Connect to sidekick.
+
+        Open the wallet matching the one you have opened on the sidekick phone.
+
+        Use it as you\'d normally use any wallet. Let it scan to see incoming transactions, share addresses, or send moneros. If the app needs to do something that involves your keys, it\'ll ask for permission from sidekick.
+
+        <h3>On sidekick:</h3>
+        If monerujo requested permission, you should see a dialog that shows the transaction details like amount and fees. You\'ll also see two options, to ACCEPT or DENY it. Choose wisely.
+
+        <h3>On monerujo:</h3>
+        The transaction should be signed and ready to be sent. Press to make it so.
+         <br/>
+    ]]></string>
+
+    <string name="help_create_sidekick" translatable="false"><![CDATA[
+        <h1>Create Wallet - Sidekick</h1>
+        <p>You want to recover your wallet from your awesome Sidekick device.</p>
+        <p>Et netus et malesuada fames. Mattis enim ut tellus elementum sagittis vitae. Eget duis at
+        tellus at. Id aliquet risus feugiat in. Donec et odio pellentesque diam. Dictum fusce ut
+        placerat orci nulla. Amet nisl suscipit adipiscing bibendum est ultricies integer quis.</p>
+        <p>Enter the block number of the first transaction used for this address in the
+        field \"Restore Height\". You can also use a date in the format YYYY-MM-DD. If you are not sure,
+        enter an approximate date/blockheight <em>before</em> you first used this wallet address.</p>
+    ]]></string>
 </resources>
diff --git a/app/src/main/res/values-ta/strings.xml b/app/src/main/res/values-ta/strings.xml
index e75e0ae6de..6a0abb25ec 100644
--- a/app/src/main/res/values-ta/strings.xml
+++ b/app/src/main/res/values-ta/strings.xml
@@ -447,4 +447,17 @@
     <string name="label_apply">APPLY</string>
 
     <string name="setting_lock">Lock Wallet in Background</string>
+
+    <string name="bluetooth_permissions">Bluetooth permissions are required to connect your Sidekick Wallet!</string>
+    <string name="bluetooth_permissions_ok">OK</string>
+    <string name="bluetooth_permissions_settings">App Settings</string>
+    <string name="bluetooth_permissions_cancel">Cancel</string>
+
+    <string name="sidekick_pin">PIN: %1$s</string>
+    <string name="sidekick_not_connected">[not connected]</string>
+    <string name="sidekick_confirm_tx">Confirm Transaction</string>
+    <string name="sidekick_network_warning">Network is on - this is a security risk. It is recommended
+        to turn on flight mode and restart the app with only Bluetooth enabled!</string>
+    <string name="open_wallet_sidekick_missing">Please connect Sidekick device</string>
+    <string name="fab_restore_sidekick">Restore from Sidekick</string>
 </resources>
diff --git a/app/src/main/res/values-uk/help.xml b/app/src/main/res/values-uk/help.xml
index c968fea975..5216f57599 100644
--- a/app/src/main/res/values-uk/help.xml
+++ b/app/src/main/res/values-uk/help.xml
@@ -311,4 +311,37 @@
         <p>This is an .onion node. In order to use it, you must enable Tor mode by touching the
         <img src="ic_network_clearnet"/> icon near the top of the Wallet List page.</p>
     ]]></string>
+
+    <string name="help_sidekick"><![CDATA[
+        <h2>Using your sidekick wallet</h2>
+        Check that both phones are connected via Bluetooth and both apps are opened.
+
+        <h3>On sidekick:</h3>
+        Open your wallet of choice.
+
+        <h3>On monerujo:</h3>
+        Connect to sidekick.
+
+        Open the wallet matching the one you have opened on the sidekick phone.
+
+        Use it as you\'d normally use any wallet. Let it scan to see incoming transactions, share addresses, or send moneros. If the app needs to do something that involves your keys, it\'ll ask for permission from sidekick.
+
+        <h3>On sidekick:</h3>
+        If monerujo requested permission, you should see a dialog that shows the transaction details like amount and fees. You\'ll also see two options, to ACCEPT or DENY it. Choose wisely.
+
+        <h3>On monerujo:</h3>
+        The transaction should be signed and ready to be sent. Press to make it so.
+         <br/>
+    ]]></string>
+
+    <string name="help_create_sidekick" translatable="false"><![CDATA[
+        <h1>Create Wallet - Sidekick</h1>
+        <p>You want to recover your wallet from your awesome Sidekick device.</p>
+        <p>Et netus et malesuada fames. Mattis enim ut tellus elementum sagittis vitae. Eget duis at
+        tellus at. Id aliquet risus feugiat in. Donec et odio pellentesque diam. Dictum fusce ut
+        placerat orci nulla. Amet nisl suscipit adipiscing bibendum est ultricies integer quis.</p>
+        <p>Enter the block number of the first transaction used for this address in the
+        field \"Restore Height\". You can also use a date in the format YYYY-MM-DD. If you are not sure,
+        enter an approximate date/blockheight <em>before</em> you first used this wallet address.</p>
+    ]]></string>
 </resources>
diff --git a/app/src/main/res/values-uk/strings.xml b/app/src/main/res/values-uk/strings.xml
index 38c0e34b0d..64c482dd6b 100644
--- a/app/src/main/res/values-uk/strings.xml
+++ b/app/src/main/res/values-uk/strings.xml
@@ -453,4 +453,17 @@
     <string name="label_apply">APPLY</string>
 
     <string name="setting_lock">Lock Wallet in Background</string>
+
+    <string name="bluetooth_permissions">Bluetooth permissions are required to connect your Sidekick Wallet!</string>
+    <string name="bluetooth_permissions_ok">OK</string>
+    <string name="bluetooth_permissions_settings">App Settings</string>
+    <string name="bluetooth_permissions_cancel">Cancel</string>
+
+    <string name="sidekick_pin">PIN: %1$s</string>
+    <string name="sidekick_not_connected">[not connected]</string>
+    <string name="sidekick_confirm_tx">Confirm Transaction</string>
+    <string name="sidekick_network_warning">Network is on - this is a security risk. It is recommended
+        to turn on flight mode and restart the app with only Bluetooth enabled!</string>
+    <string name="open_wallet_sidekick_missing">Please connect Sidekick device</string>
+    <string name="fab_restore_sidekick">Restore from Sidekick</string>
 </resources>
diff --git a/app/src/main/res/values-zh-rCN/help.xml b/app/src/main/res/values-zh-rCN/help.xml
index 2d508d2721..12d6493d5c 100644
--- a/app/src/main/res/values-zh-rCN/help.xml
+++ b/app/src/main/res/values-zh-rCN/help.xml
@@ -251,4 +251,37 @@
         <p>This is an .onion node. In order to use it, you must enable Tor mode by touching the
         <img src="ic_network_clearnet"/> icon near the top of the Wallet List page.</p>
     ]]></string>
+
+    <string name="help_sidekick"><![CDATA[
+        <h2>Using your sidekick wallet</h2>
+        Check that both phones are connected via Bluetooth and both apps are opened.
+
+        <h3>On sidekick:</h3>
+        Open your wallet of choice.
+
+        <h3>On monerujo:</h3>
+        Connect to sidekick.
+
+        Open the wallet matching the one you have opened on the sidekick phone.
+
+        Use it as you\'d normally use any wallet. Let it scan to see incoming transactions, share addresses, or send moneros. If the app needs to do something that involves your keys, it\'ll ask for permission from sidekick.
+
+        <h3>On sidekick:</h3>
+        If monerujo requested permission, you should see a dialog that shows the transaction details like amount and fees. You\'ll also see two options, to ACCEPT or DENY it. Choose wisely.
+
+        <h3>On monerujo:</h3>
+        The transaction should be signed and ready to be sent. Press to make it so.
+         <br/>
+    ]]></string>
+
+    <string name="help_create_sidekick" translatable="false"><![CDATA[
+        <h1>Create Wallet - Sidekick</h1>
+        <p>You want to recover your wallet from your awesome Sidekick device.</p>
+        <p>Et netus et malesuada fames. Mattis enim ut tellus elementum sagittis vitae. Eget duis at
+        tellus at. Id aliquet risus feugiat in. Donec et odio pellentesque diam. Dictum fusce ut
+        placerat orci nulla. Amet nisl suscipit adipiscing bibendum est ultricies integer quis.</p>
+        <p>Enter the block number of the first transaction used for this address in the
+        field \"Restore Height\". You can also use a date in the format YYYY-MM-DD. If you are not sure,
+        enter an approximate date/blockheight <em>before</em> you first used this wallet address.</p>
+    ]]></string>
 </resources>
diff --git a/app/src/main/res/values-zh-rCN/strings.xml b/app/src/main/res/values-zh-rCN/strings.xml
index ac4e912757..3fdae218cc 100644
--- a/app/src/main/res/values-zh-rCN/strings.xml
+++ b/app/src/main/res/values-zh-rCN/strings.xml
@@ -374,4 +374,17 @@
     <string name="label_apply">APPLY</string>
 
     <string name="setting_lock">Lock Wallet in Background</string>
+
+    <string name="bluetooth_permissions">Bluetooth permissions are required to connect your Sidekick Wallet!</string>
+    <string name="bluetooth_permissions_ok">OK</string>
+    <string name="bluetooth_permissions_settings">App Settings</string>
+    <string name="bluetooth_permissions_cancel">Cancel</string>
+
+    <string name="sidekick_pin">PIN: %1$s</string>
+    <string name="sidekick_not_connected">[not connected]</string>
+    <string name="sidekick_confirm_tx">Confirm Transaction</string>
+    <string name="sidekick_network_warning">Network is on - this is a security risk. It is recommended
+        to turn on flight mode and restart the app with only Bluetooth enabled!</string>
+    <string name="open_wallet_sidekick_missing">Please connect Sidekick device</string>
+    <string name="fab_restore_sidekick">Restore from Sidekick</string>
 </resources>
diff --git a/app/src/main/res/values-zh-rTW/help.xml b/app/src/main/res/values-zh-rTW/help.xml
index 6613b5e363..a145690525 100644
--- a/app/src/main/res/values-zh-rTW/help.xml
+++ b/app/src/main/res/values-zh-rTW/help.xml
@@ -252,4 +252,37 @@
         <p>This is an .onion node. In order to use it, you must enable Tor mode by touching the
         <img src="ic_network_clearnet"/> icon near the top of the Wallet List page.</p>
     ]]></string>
+
+    <string name="help_sidekick"><![CDATA[
+        <h2>Using your sidekick wallet</h2>
+        Check that both phones are connected via Bluetooth and both apps are opened.
+
+        <h3>On sidekick:</h3>
+        Open your wallet of choice.
+
+        <h3>On monerujo:</h3>
+        Connect to sidekick.
+
+        Open the wallet matching the one you have opened on the sidekick phone.
+
+        Use it as you\'d normally use any wallet. Let it scan to see incoming transactions, share addresses, or send moneros. If the app needs to do something that involves your keys, it\'ll ask for permission from sidekick.
+
+        <h3>On sidekick:</h3>
+        If monerujo requested permission, you should see a dialog that shows the transaction details like amount and fees. You\'ll also see two options, to ACCEPT or DENY it. Choose wisely.
+
+        <h3>On monerujo:</h3>
+        The transaction should be signed and ready to be sent. Press to make it so.
+         <br/>
+    ]]></string>
+
+    <string name="help_create_sidekick" translatable="false"><![CDATA[
+        <h1>Create Wallet - Sidekick</h1>
+        <p>You want to recover your wallet from your awesome Sidekick device.</p>
+        <p>Et netus et malesuada fames. Mattis enim ut tellus elementum sagittis vitae. Eget duis at
+        tellus at. Id aliquet risus feugiat in. Donec et odio pellentesque diam. Dictum fusce ut
+        placerat orci nulla. Amet nisl suscipit adipiscing bibendum est ultricies integer quis.</p>
+        <p>Enter the block number of the first transaction used for this address in the
+        field \"Restore Height\". You can also use a date in the format YYYY-MM-DD. If you are not sure,
+        enter an approximate date/blockheight <em>before</em> you first used this wallet address.</p>
+    ]]></string>
 </resources>
diff --git a/app/src/main/res/values-zh-rTW/strings.xml b/app/src/main/res/values-zh-rTW/strings.xml
index df112e3a98..37a6fa68b4 100644
--- a/app/src/main/res/values-zh-rTW/strings.xml
+++ b/app/src/main/res/values-zh-rTW/strings.xml
@@ -448,4 +448,17 @@
     <string name="label_apply">APPLY</string>
 
     <string name="setting_lock">Lock Wallet in Background</string>
+
+    <string name="bluetooth_permissions">Bluetooth permissions are required to connect your Sidekick Wallet!</string>
+    <string name="bluetooth_permissions_ok">OK</string>
+    <string name="bluetooth_permissions_settings">App Settings</string>
+    <string name="bluetooth_permissions_cancel">Cancel</string>
+
+    <string name="sidekick_pin">PIN: %1$s</string>
+    <string name="sidekick_not_connected">[not connected]</string>
+    <string name="sidekick_confirm_tx">Confirm Transaction</string>
+    <string name="sidekick_network_warning">Network is on - this is a security risk. It is recommended
+        to turn on flight mode and restart the app with only Bluetooth enabled!</string>
+    <string name="open_wallet_sidekick_missing">Please connect Sidekick device</string>
+    <string name="fab_restore_sidekick">Restore from Sidekick</string>
 </resources>
diff --git a/app/src/main/res/values/help.xml b/app/src/main/res/values/help.xml
index d5e4a397d4..b25c7c3dd5 100644
--- a/app/src/main/res/values/help.xml
+++ b/app/src/main/res/values/help.xml
@@ -179,22 +179,10 @@
     <string name="help_xmrto"><![CDATA[
         <h1>Converting XMR</h1>
         <h2>Amounts<h2>
-        <p>Enter on the \"Amount\" field the amount of cryptocurrency you want to send. By default, it will show you the equivalent amount of XMR to be sent from your wallet. You can pick a different currency from the dropdown if you want to fix your amount on it. Monerujo uses a fixed rate, so at the end of the process you should get the exact amount you specify here.</p> 
+        <p>Enter on the \"Amount\" field the amount of cryptocurrency you want to send. By default, it will show you the equivalent amount of XMR to be sent from your wallet. You can pick a different currency from the dropdown if you want to fix your amount on it. Monerujo uses a fixed rate, so at the end of the process you should get the exact amount you specify here.</p>
 		<h2>Exchange rate</h2>
         <p>Below you will see the current rate provided by the exchange, along with their lower and upper limits. Please note that this rate is not guaranteed at this point, it will be set the moment your transaction is ready to be approved on the next screen.</p>
 	]]></string>
-	
-	<string name="help_confirm"><![CDATA[
-        <h1>Exchange Order<h1>
-        <p>On this screen you will see the actual exchange order. This order is valid for
-        a limited time - you may notice a countdown on the \"Spend\" button. This exchange rate may
-        be different to the one shown on previous screens, but as long as you accept before the time runs out, it\'ll be fixed.</p>
-        <h2>Order Number<h2>
-        <p>Since Monerujo only handles the XMR side of your transaction, your <em>order number</em> can be used to track or get support for your order on the exchange\'s website.</p>
-        <h2>Countdown is over</h2>
-        <p>Once the countdown reaches zero, you need to get a new quote from the exchange by going back to the
-        previous screen, and then coming back to this screen.</p>
-    ]]></string>
 
     <string name="help_wallet"><![CDATA[
         <h1>The Wallet</h1>
@@ -300,4 +288,37 @@
         <p>This is an .onion node. In order to use it, you must enable Tor mode by touching the
         <img src="ic_network_clearnet"/> icon near the top of the Wallet List page.</p>
     ]]></string>
+
+    <string name="help_sidekick"><![CDATA[
+        <h2>Using your sidekick wallet</h2>
+        Check that both phones are connected via Bluetooth and both apps are opened.
+
+        <h3>On sidekick:</h3>
+        Open your wallet of choice.
+
+        <h3>On monerujo:</h3>
+        Connect to sidekick.
+
+        Open the wallet matching the one you have opened on the sidekick phone.
+
+        Use it as you\'d normally use any wallet. Let it scan to see incoming transactions, share addresses, or send moneros. If the app needs to do something that involves your keys, it\'ll ask for permission from sidekick.
+
+        <h3>On sidekick:</h3>
+        If monerujo requested permission, you should see a dialog that shows the transaction details like amount and fees. You\'ll also see two options, to ACCEPT or DENY it. Choose wisely.
+
+        <h3>On monerujo:</h3>
+        The transaction should be signed and ready to be sent. Press to make it so.
+         <br/>
+    ]]></string>
+
+    <string name="help_create_sidekick" translatable="false"><![CDATA[
+        <h1>Create Wallet - Sidekick</h1>
+        <p>You want to recover your wallet from your awesome Sidekick device.</p>
+        <p>Et netus et malesuada fames. Mattis enim ut tellus elementum sagittis vitae. Eget duis at
+        tellus at. Id aliquet risus feugiat in. Donec et odio pellentesque diam. Dictum fusce ut
+        placerat orci nulla. Amet nisl suscipit adipiscing bibendum est ultricies integer quis.</p>
+        <p>Enter the block number of the first transaction used for this address in the
+        field \"Restore Height\". You can also use a date in the format YYYY-MM-DD. If you are not sure,
+        enter an approximate date/blockheight <em>before</em> you first used this wallet address.</p>
+    ]]></string>
 </resources>
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index 49b006cbe4..c31a5d728f 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -27,7 +27,7 @@
     <string name="label_credits">Credits</string>
     <string name="label_ok">OK</string>
     <string name="label_cancel">Cancel</string>
-    <string name="label_close">Close Note</string>
+    <string name="label_close">Close</string>
     <string name="label_wallet_advanced_details">Detailed information</string>
 
     <string name="label_send_success">Successfully sent</string>
@@ -197,6 +197,7 @@
     <string name="generate_wallet_type_seed">Seed</string>
     <string name="generate_wallet_type_view">View</string>
     <string name="generate_wallet_type_ledger" translatable="false">Ledger</string>
+    <string name="generate_wallet_type_sidekick" translatable="false">Sidekick</string>
 
     <string name="generate_address_hint">Public Address</string>
     <string name="generate_viewkey_hint">View Key</string>
@@ -501,4 +502,32 @@
     <string name="label_apply">APPLY</string>
 
     <string name="setting_lock">Lock Wallet in Background</string>
+
+    <string name="sidekick_activity_name" translatable="false">Sidekick Wallet</string>
+    <string name="sidekick" translatable="false">monerujo Sidekick Service</string>
+
+    <string name="bt_not_connected" translatable="false">Bluetooth not connected</string>
+    <string name="title_paired_devices" translatable="false">Paired Devices</string>
+    <string name="title_other_devices" translatable="false">Other Devices</string>
+    <string name="button_scan" translatable="false">Scan</string>
+    <string name="none_paired" translatable="false">None paired</string>
+    <string name="none_found" translatable="false">None found</string>
+    <string name="select_device" translatable="false">Select Device</string>
+    <string name="label_bluetooth" translatable="false">Bluetooth</string>
+    <string name="menu_bluetooth" translatable="false">Connect Sidekick</string>
+    <string name="bluetooth_select_label" translatable="false">Select Sidekick device</string>
+    <string name="bluetooth_scanning" translatable="false">Scanning for devices</string>
+
+    <string name="bluetooth_permissions">Bluetooth permissions are required to connect your Sidekick Wallet!</string>
+    <string name="bluetooth_permissions_ok">OK</string>
+    <string name="bluetooth_permissions_settings">App Settings</string>
+    <string name="bluetooth_permissions_cancel">Cancel</string>
+
+    <string name="sidekick_pin">PIN: %1$s</string>
+    <string name="sidekick_not_connected">[not connected]</string>
+    <string name="sidekick_confirm_tx">Confirm Transaction</string>
+    <string name="sidekick_network_warning">Network is on - this is a security risk. It is recommended
+        to turn on flight mode and restart the app with only Bluetooth enabled!</string>
+    <string name="open_wallet_sidekick_missing">Please connect Sidekick device</string>
+    <string name="fab_restore_sidekick">Restore from Sidekick</string>
 </resources>
diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml
index 4501c4dd07..1a5256fa0c 100644
--- a/app/src/main/res/values/styles.xml
+++ b/app/src/main/res/values/styles.xml
@@ -265,6 +265,9 @@
         <item name="android:textSize">24sp</item>
     </style>
 
+    <style name="MoneroText.Large.Accent">
+        <item name="android:textColor">?attr/colorAccent</item>
+    </style>
 
     <style name="MoneroText.Success">
         <item name="android:textSize">18sp</item>
diff --git a/build.gradle b/build.gradle
index bf3aa26616..493bee81f4 100644
--- a/build.gradle
+++ b/build.gradle
@@ -5,7 +5,7 @@ buildscript {
         google()
     }
     dependencies {
-        classpath 'com.android.tools.build:gradle:8.3.1'
+        classpath 'com.android.tools.build:gradle:8.5.1'
     }
 }
 
diff --git a/external-libs/Makefile b/external-libs/Makefile
index 19d3b28168..2a5c6d34f4 100644
--- a/external-libs/Makefile
+++ b/external-libs/Makefile
@@ -1,11 +1,13 @@
 FLAVOUR = monero
+NPROC=16
 
-all: arm64-v8a armeabi-v7a x86_64 x86 include/wallet2_api.h VERSION
+all: arm64-v8a armeabi-v7a x86_64 include/wallet2_api.h VERSION
+debug: arm64-v8a armeabi-v7a include/wallet2_api.h VERSION
 
 arm64-v8a: $(FLAVOUR) android64.Dockerfile
 	-rm -rf arm64-v8a
 	-docker container rm $(FLAVOUR)-android-arm64 -f
-	docker build -f android64.Dockerfile -t $(FLAVOUR)-android-arm64 $(FLAVOUR)
+	docker build -f android64.Dockerfile -t $(FLAVOUR)-android-arm64 $(FLAVOUR) --build-arg NPROC=$(NPROC)
 	docker create -it --name $(FLAVOUR)-android-arm64 $(FLAVOUR)-android-arm64 bash
 	docker cp $(FLAVOUR)-android-arm64:/opt/android/prefix/lib/. arm64-v8a/
 	docker cp $(FLAVOUR)-android-arm64:/src/build/release/lib/. arm64-v8a/$(FLAVOUR)
@@ -13,7 +15,7 @@ arm64-v8a: $(FLAVOUR) android64.Dockerfile
 armeabi-v7a: $(FLAVOUR) android32.Dockerfile
 	-rm -rf armeabi-v7a
 	-docker container rm $(FLAVOUR)-android-arm32 -f
-	docker build -f android32.Dockerfile -t $(FLAVOUR)-android-arm32 $(FLAVOUR)
+	docker build -f android32.Dockerfile -t $(FLAVOUR)-android-arm32 $(FLAVOUR) --build-arg NPROC=$(NPROC)
 	docker create -it --name $(FLAVOUR)-android-arm32 $(FLAVOUR)-android-arm32 bash
 	docker cp $(FLAVOUR)-android-arm32:/opt/android/prefix/lib/. armeabi-v7a
 	docker cp $(FLAVOUR)-android-arm32:/src/build/release/lib/. armeabi-v7a/$(FLAVOUR)
@@ -21,7 +23,7 @@ armeabi-v7a: $(FLAVOUR) android32.Dockerfile
 x86_64: $(FLAVOUR) android64_x86.Dockerfile
 	-rm -rf x86_64
 	-docker container rm $(FLAVOUR)-android-x86_64 -f
-	docker build -f android64_x86.Dockerfile -t $(FLAVOUR)-android-x86_64 $(FLAVOUR)
+	docker build -f android64_x86.Dockerfile -t $(FLAVOUR)-android-x86_64 $(FLAVOUR) --build-arg NPROC=$(NPROC)
 	docker create -it --name $(FLAVOUR)-android-x86_64 $(FLAVOUR)-android-x86_64 bash
 	docker cp $(FLAVOUR)-android-x86_64:/opt/android/prefix/lib/. x86_64
 	docker cp $(FLAVOUR)-android-x86_64:/src/build/release/lib/. x86_64/$(FLAVOUR)
@@ -29,7 +31,7 @@ x86_64: $(FLAVOUR) android64_x86.Dockerfile
 x86: $(FLAVOUR) android32_x86.Dockerfile
 	-rm -rf x86
 	-docker container rm $(FLAVOUR)-android-x86 -f
-	docker build -f android32_x86.Dockerfile -t $(FLAVOUR)-android-x86 $(FLAVOUR)
+	docker build -f android32_x86.Dockerfile -t $(FLAVOUR)-android-x86 $(FLAVOUR) --build-arg NPROC=$(NPROC)
 	docker create -it --name $(FLAVOUR)-android-x86 $(FLAVOUR)-android-x86 bash
 	docker cp $(FLAVOUR)-android-x86:/opt/android/prefix/lib/. x86
 	docker cp $(FLAVOUR)-android-x86:/src/build/release/lib/. x86/$(FLAVOUR)
diff --git a/external-libs/android32.Dockerfile b/external-libs/android32.Dockerfile
index 6df797e75f..4514c3605b 100644
--- a/external-libs/android32.Dockerfile
+++ b/external-libs/android32.Dockerfile
@@ -1,11 +1,11 @@
 FROM debian:stable
 
-RUN set -x && apt-get update && apt-get install -y unzip automake build-essential curl file pkg-config git python3 python-is-python3 libtool libtinfo5
+RUN set -x && apt-get update && apt-get install -y unzip automake build-essential curl file pkg-config git python3 python-is-python3 libtool libtinfo5 yacc
 
 WORKDIR /opt/android
 ## INSTALL ANDROID SDK
-ENV ANDROID_SDK_REVISION 4333796
-ENV ANDROID_SDK_HASH 92ffee5a1d98d856634e8b71132e8a95d96c83a63fde1099be3d86df3106def9
+ENV ANDROID_SDK_REVISION=4333796
+ENV ANDROID_SDK_HASH=92ffee5a1d98d856634e8b71132e8a95d96c83a63fde1099be3d86df3106def9
 RUN set -x \
     && curl -O https://dl.google.com/android/repository/sdk-tools-linux-${ANDROID_SDK_REVISION}.zip \
     && echo "${ANDROID_SDK_HASH}  sdk-tools-linux-${ANDROID_SDK_REVISION}.zip" | sha256sum -c \
@@ -13,20 +13,20 @@ RUN set -x \
     && rm -f sdk-tools-linux-${ANDROID_SDK_REVISION}.zip
 
 ## INSTALL ANDROID NDK
-ENV ANDROID_NDK_REVISION 17c
-ENV ANDROID_NDK_HASH 3f541adbd0330a9205ba12697f6d04ec90752c53d6b622101a2a8a856e816589
+ENV ANDROID_NDK_REVISION=17c
+ENV ANDROID_NDK_HASH=3f541adbd0330a9205ba12697f6d04ec90752c53d6b622101a2a8a856e816589
 RUN set -x \
     && curl -O https://dl.google.com/android/repository/android-ndk-r${ANDROID_NDK_REVISION}-linux-x86_64.zip \
     && echo "${ANDROID_NDK_HASH}  android-ndk-r${ANDROID_NDK_REVISION}-linux-x86_64.zip" | sha256sum -c \
     && unzip android-ndk-r${ANDROID_NDK_REVISION}-linux-x86_64.zip \
     && rm -f android-ndk-r${ANDROID_NDK_REVISION}-linux-x86_64.zip
 
-ENV WORKDIR /opt/android
-ENV ANDROID_SDK_ROOT ${WORKDIR}/tools
-ENV ANDROID_NDK_ROOT ${WORKDIR}/android-ndk-r${ANDROID_NDK_REVISION}
-ENV PREFIX /opt/android/prefix
+ENV WORKDIR=/opt/android
+ENV ANDROID_SDK_ROOT=${WORKDIR}/tools
+ENV ANDROID_NDK_ROOT=${WORKDIR}/android-ndk-r${ANDROID_NDK_REVISION}
+ENV PREFIX=/opt/android/prefix
 
-ENV TOOLCHAIN_DIR ${WORKDIR}/toolchain
+ENV TOOLCHAIN_DIR=${WORKDIR}/toolchain
 RUN set -x \
     && ${ANDROID_NDK_ROOT}/build/tools/make_standalone_toolchain.py \
          --arch arm \
@@ -43,7 +43,7 @@ RUN set -x \
     && echo "${CMAKE_HASH}  cmake-${CMAKE_VERSION}-Linux-x86_64.tar.gz" | sha256sum -c \
     && tar -xzf /usr/cmake-${CMAKE_VERSION}-Linux-x86_64.tar.gz \
     && rm -f /usr/cmake-${CMAKE_VERSION}-Linux-x86_64.tar.gz
-ENV PATH /usr/cmake-${CMAKE_VERSION}-Linux-x86_64/bin:$PATH
+ENV PATH=/usr/cmake-${CMAKE_VERSION}-Linux-x86_64/bin:$PATH
 
 ## Boost
 ARG BOOST_VERSION=1_70_0
@@ -57,14 +57,14 @@ RUN set -x \
     && cd boost_${BOOST_VERSION} \
     && ./bootstrap.sh --prefix=${PREFIX}
 
-ENV HOST_PATH $PATH
-ENV PATH $TOOLCHAIN_DIR/arm-linux-androideabi/bin:$TOOLCHAIN_DIR/bin:$PATH
+ENV HOST_PATH=$PATH
+ENV PATH=$TOOLCHAIN_DIR/arm-linux-androideabi/bin:$TOOLCHAIN_DIR/bin:$PATH
 
 ARG NPROC=4
 
 # Build iconv for lib boost locale
-ENV ICONV_VERSION 1.16
-ENV ICONV_HASH e6a1b1b589654277ee790cce3734f07876ac4ccfaecbee8afa0b649cf529cc04
+ENV ICONV_VERSION=1.16
+ENV ICONV_HASH=e6a1b1b589654277ee790cce3734f07876ac4ccfaecbee8afa0b649cf529cc04
 RUN set -x \
     && curl -O http://ftp.gnu.org/pub/gnu/libiconv/libiconv-${ICONV_VERSION}.tar.gz \
     && echo "${ICONV_HASH}  libiconv-${ICONV_VERSION}.tar.gz" | sha256sum -c \
@@ -80,8 +80,8 @@ RUN set -x \
     && ./b2 --build-type=minimal link=static runtime-link=static --with-chrono --with-date_time --with-filesystem --with-program_options --with-regex --with-serialization --with-system --with-thread --with-locale --build-dir=android --stagedir=android toolset=clang threading=multi threadapi=pthread target-os=android -sICONV_PATH=${PREFIX} install -j${NPROC}
 
 # download, configure and make Zlib
-ENV ZLIB_VERSION 1.3.1
-ENV ZLIB_HASH 9a93b2b7dfdac77ceba5a558a580e74667dd6fede4585b91eefb60f03b72df23
+ENV ZLIB_VERSION=1.3.1
+ENV ZLIB_HASH=9a93b2b7dfdac77ceba5a558a580e74667dd6fede4585b91eefb60f03b72df23
 RUN set -x \
     && curl -O https://zlib.net/zlib-${ZLIB_VERSION}.tar.gz \
     && echo "${ZLIB_HASH}  zlib-${ZLIB_VERSION}.tar.gz" | sha256sum -c \
diff --git a/external-libs/android64.Dockerfile b/external-libs/android64.Dockerfile
index 7e2ca0e819..ffd9dd70e4 100644
--- a/external-libs/android64.Dockerfile
+++ b/external-libs/android64.Dockerfile
@@ -1,11 +1,11 @@
 FROM debian:stable
 
-RUN set -x && apt-get update && apt-get install -y unzip automake build-essential curl file pkg-config git python3 python-is-python3 libtool libtinfo5
+RUN set -x && apt-get update && apt-get install -y unzip automake build-essential curl file pkg-config git python3 python-is-python3 libtool libtinfo5 yacc
 
 WORKDIR /opt/android
 ## INSTALL ANDROID SDK
-ENV ANDROID_SDK_REVISION 4333796
-ENV ANDROID_SDK_HASH 92ffee5a1d98d856634e8b71132e8a95d96c83a63fde1099be3d86df3106def9
+ENV ANDROID_SDK_REVISION=4333796
+ENV ANDROID_SDK_HASH=92ffee5a1d98d856634e8b71132e8a95d96c83a63fde1099be3d86df3106def9
 RUN set -x \
     && curl -O https://dl.google.com/android/repository/sdk-tools-linux-${ANDROID_SDK_REVISION}.zip \
     && echo "${ANDROID_SDK_HASH}  sdk-tools-linux-${ANDROID_SDK_REVISION}.zip" | sha256sum -c \
@@ -13,20 +13,20 @@ RUN set -x \
     && rm -f sdk-tools-linux-${ANDROID_SDK_REVISION}.zip
 
 ## INSTALL ANDROID NDK
-ENV ANDROID_NDK_REVISION 17c
-ENV ANDROID_NDK_HASH 3f541adbd0330a9205ba12697f6d04ec90752c53d6b622101a2a8a856e816589
+ENV ANDROID_NDK_REVISION=17c
+ENV ANDROID_NDK_HASH=3f541adbd0330a9205ba12697f6d04ec90752c53d6b622101a2a8a856e816589
 RUN set -x \
     && curl -O https://dl.google.com/android/repository/android-ndk-r${ANDROID_NDK_REVISION}-linux-x86_64.zip \
     && echo "${ANDROID_NDK_HASH}  android-ndk-r${ANDROID_NDK_REVISION}-linux-x86_64.zip" | sha256sum -c \
     && unzip android-ndk-r${ANDROID_NDK_REVISION}-linux-x86_64.zip \
     && rm -f android-ndk-r${ANDROID_NDK_REVISION}-linux-x86_64.zip
 
-ENV WORKDIR /opt/android
-ENV ANDROID_SDK_ROOT ${WORKDIR}/tools
-ENV ANDROID_NDK_ROOT ${WORKDIR}/android-ndk-r${ANDROID_NDK_REVISION}
-ENV PREFIX /opt/android/prefix
+ENV WORKDIR=/opt/android
+ENV ANDROID_SDK_ROOT=${WORKDIR}/tools
+ENV ANDROID_NDK_ROOT=${WORKDIR}/android-ndk-r${ANDROID_NDK_REVISION}
+ENV PREFIX=/opt/android/prefix
 
-ENV TOOLCHAIN_DIR ${WORKDIR}/toolchain
+ENV TOOLCHAIN_DIR=${WORKDIR}/toolchain
 RUN set -x \
     && ${ANDROID_NDK_ROOT}/build/tools/make_standalone_toolchain.py \
          --arch arm64 \
@@ -43,7 +43,7 @@ RUN set -x \
     && echo "${CMAKE_HASH}  cmake-${CMAKE_VERSION}-Linux-x86_64.tar.gz" | sha256sum -c \
     && tar -xzf /usr/cmake-${CMAKE_VERSION}-Linux-x86_64.tar.gz \
     && rm -f /usr/cmake-${CMAKE_VERSION}-Linux-x86_64.tar.gz
-ENV PATH /usr/cmake-${CMAKE_VERSION}-Linux-x86_64/bin:$PATH
+ENV PATH=/usr/cmake-${CMAKE_VERSION}-Linux-x86_64/bin:$PATH
 
 ## Boost
 ARG BOOST_VERSION=1_70_0
@@ -57,14 +57,14 @@ RUN set -x \
     && cd boost_${BOOST_VERSION} \
     && ./bootstrap.sh --prefix=${PREFIX}
 
-ENV HOST_PATH $PATH
-ENV PATH $TOOLCHAIN_DIR/aarch64-linux-android/bin:$TOOLCHAIN_DIR/bin:$PATH
+ENV HOST_PATH=$PATH
+ENV PATH=$TOOLCHAIN_DIR/aarch64-linux-android/bin:$TOOLCHAIN_DIR/bin:$PATH
 
 ARG NPROC=4
 
 # Build iconv for lib boost locale
-ENV ICONV_VERSION 1.16
-ENV ICONV_HASH e6a1b1b589654277ee790cce3734f07876ac4ccfaecbee8afa0b649cf529cc04
+ENV ICONV_VERSION=1.16
+ENV ICONV_HASH=e6a1b1b589654277ee790cce3734f07876ac4ccfaecbee8afa0b649cf529cc04
 RUN set -x \
     && curl -O http://ftp.gnu.org/pub/gnu/libiconv/libiconv-${ICONV_VERSION}.tar.gz \
     && echo "${ICONV_HASH}  libiconv-${ICONV_VERSION}.tar.gz" | sha256sum -c \
@@ -80,8 +80,8 @@ RUN set -x \
     && ./b2 --build-type=minimal link=static runtime-link=static --with-chrono --with-date_time --with-filesystem --with-program_options --with-regex --with-serialization --with-system --with-thread --with-locale --build-dir=android --stagedir=android toolset=clang threading=multi threadapi=pthread target-os=android -sICONV_PATH=${PREFIX} install -j${NPROC}
 
 # download, configure and make Zlib
-ENV ZLIB_VERSION 1.3.1
-ENV ZLIB_HASH 9a93b2b7dfdac77ceba5a558a580e74667dd6fede4585b91eefb60f03b72df23
+ENV ZLIB_VERSION=1.3.1
+ENV ZLIB_HASH=9a93b2b7dfdac77ceba5a558a580e74667dd6fede4585b91eefb60f03b72df23
 RUN set -x \
     && curl -O https://zlib.net/zlib-${ZLIB_VERSION}.tar.gz \
     && echo "${ZLIB_HASH}  zlib-${ZLIB_VERSION}.tar.gz" | sha256sum -c \
diff --git a/external-libs/android64_x86.Dockerfile b/external-libs/android64_x86.Dockerfile
index 9d287df2c5..60207e93e7 100644
--- a/external-libs/android64_x86.Dockerfile
+++ b/external-libs/android64_x86.Dockerfile
@@ -1,11 +1,11 @@
 FROM debian:stable
 
-RUN set -x && apt-get update && apt-get install -y unzip automake build-essential curl file pkg-config git python3 python-is-python3 libtool libtinfo5
+RUN set -x && apt-get update && apt-get install -y unzip automake build-essential curl file pkg-config git python3 python-is-python3 libtool libtinfo5 yacc
 
 WORKDIR /opt/android
 ## INSTALL ANDROID SDK
-ENV ANDROID_SDK_REVISION 4333796
-ENV ANDROID_SDK_HASH 92ffee5a1d98d856634e8b71132e8a95d96c83a63fde1099be3d86df3106def9
+ENV ANDROID_SDK_REVISION=4333796
+ENV ANDROID_SDK_HASH=92ffee5a1d98d856634e8b71132e8a95d96c83a63fde1099be3d86df3106def9
 RUN set -x \
     && curl -O https://dl.google.com/android/repository/sdk-tools-linux-${ANDROID_SDK_REVISION}.zip \
     && echo "${ANDROID_SDK_HASH}  sdk-tools-linux-${ANDROID_SDK_REVISION}.zip" | sha256sum -c \
@@ -13,20 +13,20 @@ RUN set -x \
     && rm -f sdk-tools-linux-${ANDROID_SDK_REVISION}.zip
 
 ## INSTALL ANDROID NDK
-ENV ANDROID_NDK_REVISION 17c
-ENV ANDROID_NDK_HASH 3f541adbd0330a9205ba12697f6d04ec90752c53d6b622101a2a8a856e816589
+ENV ANDROID_NDK_REVISION=17c
+ENV ANDROID_NDK_HASH=3f541adbd0330a9205ba12697f6d04ec90752c53d6b622101a2a8a856e816589
 RUN set -x \
     && curl -O https://dl.google.com/android/repository/android-ndk-r${ANDROID_NDK_REVISION}-linux-x86_64.zip \
     && echo "${ANDROID_NDK_HASH}  android-ndk-r${ANDROID_NDK_REVISION}-linux-x86_64.zip" | sha256sum -c \
     && unzip android-ndk-r${ANDROID_NDK_REVISION}-linux-x86_64.zip \
     && rm -f android-ndk-r${ANDROID_NDK_REVISION}-linux-x86_64.zip
 
-ENV WORKDIR /opt/android
-ENV ANDROID_SDK_ROOT ${WORKDIR}/tools
-ENV ANDROID_NDK_ROOT ${WORKDIR}/android-ndk-r${ANDROID_NDK_REVISION}
-ENV PREFIX /opt/android/prefix
+ENV WORKDIR=/opt/android
+ENV ANDROID_SDK_ROOT=${WORKDIR}/tools
+ENV ANDROID_NDK_ROOT=${WORKDIR}/android-ndk-r${ANDROID_NDK_REVISION}
+ENV PREFIX=/opt/android/prefix
 
-ENV TOOLCHAIN_DIR ${WORKDIR}/toolchain
+ENV TOOLCHAIN_DIR=${WORKDIR}/toolchain
 RUN set -x \
     && ${ANDROID_NDK_ROOT}/build/tools/make_standalone_toolchain.py \
          --arch x86_64 \
@@ -43,7 +43,7 @@ RUN set -x \
     && echo "${CMAKE_HASH}  cmake-${CMAKE_VERSION}-Linux-x86_64.tar.gz" | sha256sum -c \
     && tar -xzf /usr/cmake-${CMAKE_VERSION}-Linux-x86_64.tar.gz \
     && rm -f /usr/cmake-${CMAKE_VERSION}-Linux-x86_64.tar.gz
-ENV PATH /usr/cmake-${CMAKE_VERSION}-Linux-x86_64/bin:$PATH
+ENV PATH=/usr/cmake-${CMAKE_VERSION}-Linux-x86_64/bin:$PATH
 
 ## Boost
 ARG BOOST_VERSION=1_70_0
@@ -57,14 +57,14 @@ RUN set -x \
     && cd boost_${BOOST_VERSION} \
     && ./bootstrap.sh --prefix=${PREFIX}
 
-ENV HOST_PATH $PATH
-ENV PATH $TOOLCHAIN_DIR/x86_64-linux-android/bin:$TOOLCHAIN_DIR/bin:$PATH
+ENV HOST_PATH=$PATH
+ENV PATH=$TOOLCHAIN_DIR/x86_64-linux-android/bin:$TOOLCHAIN_DIR/bin:$PATH
 
 ARG NPROC=4
 
 # Build iconv for lib boost locale
-ENV ICONV_VERSION 1.16
-ENV ICONV_HASH e6a1b1b589654277ee790cce3734f07876ac4ccfaecbee8afa0b649cf529cc04
+ENV ICONV_VERSION=1.16
+ENV ICONV_HASH=e6a1b1b589654277ee790cce3734f07876ac4ccfaecbee8afa0b649cf529cc04
 RUN set -x \
     && curl -O http://ftp.gnu.org/pub/gnu/libiconv/libiconv-${ICONV_VERSION}.tar.gz \
     && echo "${ICONV_HASH}  libiconv-${ICONV_VERSION}.tar.gz" | sha256sum -c \
@@ -80,8 +80,8 @@ RUN set -x \
     && ./b2 --build-type=minimal link=static runtime-link=static --with-chrono --with-date_time --with-filesystem --with-program_options --with-regex --with-serialization --with-system --with-thread --with-locale --build-dir=android --stagedir=android toolset=clang threading=multi threadapi=pthread target-os=android -sICONV_PATH=${PREFIX} install -j${NPROC}
 
 # download, configure and make Zlib
-ENV ZLIB_VERSION 1.3.1
-ENV ZLIB_HASH 9a93b2b7dfdac77ceba5a558a580e74667dd6fede4585b91eefb60f03b72df23
+ENV ZLIB_VERSION=1.3.1
+ENV ZLIB_HASH=9a93b2b7dfdac77ceba5a558a580e74667dd6fede4585b91eefb60f03b72df23
 RUN set -x \
     && curl -O https://zlib.net/zlib-${ZLIB_VERSION}.tar.gz \
     && echo "${ZLIB_HASH}  zlib-${ZLIB_VERSION}.tar.gz" | sha256sum -c \
diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties
index bf82d4032f..f2756f2688 100644
--- a/gradle/wrapper/gradle-wrapper.properties
+++ b/gradle/wrapper/gradle-wrapper.properties
@@ -1,6 +1,5 @@
-#Mon May 22 20:01:18 CEST 2023
 distributionBase=GRADLE_USER_HOME
-distributionUrl=https\://services.gradle.org/distributions/gradle-8.4-bin.zip
+distributionUrl=https\://services.gradle.org/distributions/gradle-8.7-bin.zip
 distributionPath=wrapper/dists
-zipStorePath=wrapper/dists
 zipStoreBase=GRADLE_USER_HOME
+zipStorePath=wrapper/dists

From 059438a09e2bd34e0b4d18cc126d33e3d94fec75 Mon Sep 17 00:00:00 2001
From: m2049r <m2049r@monerujo.io>
Date: Tue, 13 Aug 2024 21:43:27 +0200
Subject: [PATCH 2/2] targetSdkVersion 35

---
 app/build.gradle                                          | 2 +-
 app/src/main/AndroidManifest.xml                          | 8 +++++++-
 .../java/com/m2049r/xmrwallet/service/WalletService.java  | 8 +++++++-
 .../java/com/m2049r/xmrwallet/util/NetCipherHelper.java   | 4 +++-
 app/src/main/res/menu/sidekick_connect_menu.xml           | 2 ++
 5 files changed, 20 insertions(+), 4 deletions(-)

diff --git a/app/build.gradle b/app/build.gradle
index e6a60be301..533145f350 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -7,7 +7,7 @@ android {
         buildToolsVersion = '34.0.0'
         compileSdk 34
         minSdkVersion 21
-        targetSdkVersion 33
+        targetSdkVersion 35
         versionCode 4005
         versionName "4.0.5 'Sidekick'"
         testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index a592db59cb..4d36af7777 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -17,6 +17,7 @@
     <uses-permission android:name="android.permission.CAMERA" />
     <uses-permission android:name="android.permission.USE_BIOMETRIC" />
     <uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
+    <uses-permission android:name="android.permission.FOREGROUND_SERVICE_SPECIAL_USE" />
 
     <queries>
         <intent>
@@ -103,7 +104,12 @@
             android:name=".service.WalletService"
             android:description="@string/service_description"
             android:exported="false"
-            android:label="Monero Wallet Service" />
+            android:foregroundServiceType="specialUse"
+            android:label="Monero Wallet Service">
+            <property
+                android:name="android.app.PROPERTY_SPECIAL_USE_FGS_SUBTYPE"
+                android:value="Keeps app in sync with the blockchain" />
+        </service>
 
         <provider
             android:name="androidx.core.content.FileProvider"
diff --git a/app/src/main/java/com/m2049r/xmrwallet/service/WalletService.java b/app/src/main/java/com/m2049r/xmrwallet/service/WalletService.java
index 89ce46177b..0607ce63c5 100644
--- a/app/src/main/java/com/m2049r/xmrwallet/service/WalletService.java
+++ b/app/src/main/java/com/m2049r/xmrwallet/service/WalletService.java
@@ -16,6 +16,8 @@
 
 package com.m2049r.xmrwallet.service;
 
+import static android.content.pm.ServiceInfo.FOREGROUND_SERVICE_TYPE_SPECIAL_USE;
+
 import android.app.Notification;
 import android.app.NotificationChannel;
 import android.app.NotificationManager;
@@ -581,7 +583,11 @@ private void startNotfication() {
                 .setCategory(NotificationCompat.CATEGORY_SERVICE)
                 .setContentIntent(pendingIntent)
                 .build();
-        startForeground(NOTIFICATION_ID, notification);
+        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.UPSIDE_DOWN_CAKE) {
+            startForeground(NOTIFICATION_ID, notification, FOREGROUND_SERVICE_TYPE_SPECIAL_USE);
+        } else {
+            startForeground(NOTIFICATION_ID, notification);
+        }
     }
 
     @RequiresApi(Build.VERSION_CODES.O)
diff --git a/app/src/main/java/com/m2049r/xmrwallet/util/NetCipherHelper.java b/app/src/main/java/com/m2049r/xmrwallet/util/NetCipherHelper.java
index 8dc481f289..b5d765ea52 100644
--- a/app/src/main/java/com/m2049r/xmrwallet/util/NetCipherHelper.java
+++ b/app/src/main/java/com/m2049r/xmrwallet/util/NetCipherHelper.java
@@ -23,6 +23,8 @@
 import android.content.Intent;
 import android.content.IntentFilter;
 
+import androidx.core.content.ContextCompat;
+
 import com.burgstaller.okhttp.AuthenticationCacheInterceptor;
 import com.burgstaller.okhttp.CachingAuthenticatorDecorator;
 import com.burgstaller.okhttp.digest.CachingAuthenticator;
@@ -144,7 +146,7 @@ public static void register(OnStatusChangedListener listener) {
                 .addStatusCallback(me);
 
         // deal with  org.torproject.android.intent.action.STATUS = STARTS_DISABLED
-        me.context.registerReceiver(orbotStatusReceiver, new IntentFilter(OrbotHelper.ACTION_STATUS));
+        ContextCompat.registerReceiver(me.context, orbotStatusReceiver, new IntentFilter(OrbotHelper.ACTION_STATUS), ContextCompat.RECEIVER_NOT_EXPORTED);
 
         me.startTor();
     }
diff --git a/app/src/main/res/menu/sidekick_connect_menu.xml b/app/src/main/res/menu/sidekick_connect_menu.xml
index 3957b5db1a..6baa7ff710 100644
--- a/app/src/main/res/menu/sidekick_connect_menu.xml
+++ b/app/src/main/res/menu/sidekick_connect_menu.xml
@@ -4,7 +4,9 @@
 
     <item
         android:id="@+id/action_help_sidekick"
+        android:icon="@drawable/ic_help_white_24dp"
         android:orderInCategory="300"
         android:title="@string/menu_help"
         app:showAsAction="ifRoom" />
+
 </menu>
\ No newline at end of file