Compare commits

...

13 Commits

  1. 42
      README.md
  2. 5
      app/build.gradle
  3. 42
      app/src/main/java/org/myhush/silentdragon/QrReaderActivity.kt
  4. 8
      app/src/main/java/org/myhush/silentdragon/ReceiveActivity.kt
  5. 8
      app/src/main/java/org/myhush/silentdragon/SendActivity.kt
  6. 37
      app/src/main/res/layout/activity_about.xml
  7. 134
      app/src/main/res/values-nl/strings.xml

42
README.md

@ -1,39 +1,27 @@
# SilentDragon Android
<p align="left">
<a href="https://twitter.com/MyHushTeam">
<img src="https://img.shields.io/twitter/url?style=social&url=https%3A%2F%2Ftwitter.com%2Fmyhushteam"
alt="MyHushTeam's Twitter"></a>
<a href="https://twitter.com/intent/follow?screen_name=MyHushTeam">
<img src="https://img.shields.io/twitter/follow/MyHushTeam?style=social&logo=twitter"
alt="follow on Twitter"></a>
<a href="https://fosstodon.org/@myhushteam">
<img src="https://img.shields.io/badge/Mastodon-MyHushTeam-blue"
alt="follow on Mastodon"></a>
<a href="https://www.reddit.com/r/Myhush/">
<img src="https://img.shields.io/reddit/subreddit-subscribers/Myhush?style=social"
alt="MyHushTeam's Reddit"></a>
</p>
SilentDragon Android is an Android frontend for the desktop [SilentDragon](https://git.hush.is/hush/SilentDragon) or [SilentDragonLite](https://git.hush.is/hush/SilentDragonLite) that lets you send and receive shielded payments from your mobile phone. We are currently working on implementing Lite Wallet and HushChat functionality on Android, so follow us on our [Twitter](https://twitter.com/MyHushTeam) or [Mastodon](https://fosstodon.org/@myhushteam) to stay updated. After this functionality is implemented, we are planning on making an F-Droid release.
SilentDragon Android is an Android frontend for the desktop [SilentDragon](https://git.hush.is/hush/SilentDragon) or [SilentDragonLite](https://git.hush.is/hush/SilentDragonLite) that lets you send and receive shielded payments from your mobile phone. We are currently working on implementing Lite Wallet and HushChat functionality on Android, so follow us on our [Mastodon](https://fosstodon.org/@myhushteam) to stay updated. After this functionality is implemented, we are planning on making an official F-Droid release.
<img height=50% width=50% src="SDA.jpg">
## Installation
The minimum supported Android version is 4.4.x KitKat. There are two ways to install:
The minimum supported Android version is 4.4.x KitKat. There are three ways to install:
1. Via the [Google Play Store](https://play.google.com/store/apps/details?id=org.myhush.silentdragon).
1. Direct APK install available at the [Releases page](https://git.hush.is/hush/SilentDragonAndroid/releases). You will need to allow `Install from untrusted sources` on your Android phone in order to install from this source.
1. Via our custom 3rd-party F-Droid repository, which you can [find here](https://hush.is/fdroid).
1. Least recommended method is via the [Google Play Store](https://play.google.com/store/apps/details?id=org.myhush.silentdragon).
## Running SilentDragon
In order to let your Android phone connect to your desktop, you need to run the desktop [SilentDragon](https://git.hush.is/hush/SilentDragon), and sync fully. This is not a full node
In order to let your Android phone connect to your desktop, you need to run the either desktop
wallet [SilentDragonLite](https://git.hush.is/hush/SilentDragonLite) or
[SilentDragon](https://git.hush.is/hush/SilentDragon) fully synced. This is not a full node
on your Android (your poor battery!). It's a remote control for your full node.
Thankfully this should only take a short time with a fast internet connection!
As the Hush network grows, it will take longer. As of Sept 2019, the blockchain
is about 900MB on disk.
As the Hush network grows, it will take longer. As of December 2021, the Hush blockchain
is over 4GB on disk.
After your node is synced, go to `Apps -> Connect Mobile App` to view the
connection QR Code, which you can scan from the Android App.
@ -42,7 +30,7 @@ connection QR Code, which you can scan from the Android App.
You can file issues in the [issues tab](https://git.hush.is/hush/SilentDragonAndroid/issues).
We appreciate them! Please follow the Github issue template, when reasonable.
We appreciate them! Please follow the Gitea issue template, when reasonable.
## Compiling from source
@ -95,4 +83,12 @@ Contributions to this project are welcome and encouraged.
## Support
For support or other questions, join us on [Telegram](https://hush.is/telegram), or tweet at [@MyHushTeam](https://twitter.com/MyHushTeam), or toot at our [Mastodon](https://fosstodon.org/@myhushteam), or join [Telegram Support](https://hush.is/telegram_support) or [file an issue](https://git.hush.is/hush/SilentDragonAndroid/issues).
For support or other questions, join us on [Telegram](https://hush.is/telegram), or toot at our [Mastodon](https://fosstodon.org/@myhushteam), or join [Telegram Support](https://hush.is/telegram_support) or [file an issue](https://git.hush.is/hush/SilentDragonAndroid/issues).
## Copyright
2016-2022 The Hush Developers
## License
GPLv3 or later

5
app/build.gradle

@ -18,7 +18,7 @@ android {
targetSdkVersion Deps.targetSdkVersion
multiDexEnabled true
versionCode 9
versionName "0.5.20"
versionName "0.5.22"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
vectorDrawables.useSupportLibrary = true
}
@ -86,8 +86,7 @@ dependencies {
implementation 'com.google.android.gms:play-services-vision:17.0.2'
implementation 'com.github.joshjdevl.libsodiumjni:libsodium-jni-aar:2.0.1'
implementation 'pl.droidsonroids.gif:android-gif-drawable:1.2.19'
//implementation 'com.journeyapps:zxing-android-embedded:3.6.0@aar'
implementation 'com.journeyapps:zxing-android-embedded:4.3.0'
implementation 'com.journeyapps:zxing-android-embedded:4.3.0@aar'
implementation 'com.google.zxing:core:3.3.0'
testImplementation 'junit:junit:4.12'
androidTestImplementation 'androidx.test.ext:junit:1.1.1'

42
app/src/main/java/org/myhush/silentdragon/QrReaderActivity.kt

@ -96,7 +96,7 @@ class QrReaderActivity : AppCompatActivity() {
builder.setPositiveButton(getString(R.string.ok)) { dialog, which ->
run {
val txt = input.text.toString()
processText(txt)
processQrCodeText(txt)
}
}
builder.setNegativeButton(getString(R.string.cancel)) { dialog, which -> dialog.cancel() }
@ -123,13 +123,13 @@ class QrReaderActivity : AppCompatActivity() {
captureManager.onDestroy()
}
private fun processText(barcodeInfo: String) {
private fun processQrCodeText(qrcodeInfo: String) {
val code = intent.getIntExtra("REQUEST_CODE", 0)
// See if this the data is of the right format
if (code == REQUEST_CONNDATA && !barcodeInfo.startsWith("ws")) {
// Check if data is websocket connection
if (code == REQUEST_CONNDATA && !qrcodeInfo.startsWith("ws")) {
Log.i(TAG, "Not a connection")
var err = barcodeInfo
var err = qrcodeInfo
if (err.length > 48) {
err = err.substring(0, 22) + "...." + err.substring(err.length - 22, err.length)
}
@ -137,11 +137,12 @@ class QrReaderActivity : AppCompatActivity() {
return
}
// Check if data is valid hush z-address
if (code == REQUEST_ADDRESS &&
!DataModel.isValidAddress(StringBuilder(barcodeInfo).toString()) &&
!barcodeInfo.startsWith("hush:")) {
!DataModel.isValidAddress(StringBuilder(qrcodeInfo).toString()) &&
!qrcodeInfo.startsWith("hush:")) {
Log.i(TAG, "Not an address")
var err = barcodeInfo
var err = qrcodeInfo
if (err.length > 48) {
err = err.substring(0, 22) + "...." + err.substring(err.length - 22, err.length)
}
@ -149,37 +150,20 @@ class QrReaderActivity : AppCompatActivity() {
return
}
// The data seems valid, so return it.
// The data seems valid, so return it
val data = Intent()
// Payment URIs are often formatted as "hush:<addr>", but this causes parsing problems.
// So change it to hush://<addr>, so that it parses properly
if (barcodeInfo.startsWith("hush:") && !barcodeInfo.startsWith("hush://")) {
data.data = Uri.parse(barcodeInfo.replaceFirst("hush:", "hush://"))
if (qrcodeInfo.startsWith("hush:") && !qrcodeInfo.startsWith("hush://")) {
data.data = Uri.parse(qrcodeInfo.replaceFirst("hush:", "hush://"))
} else {
data.data = Uri.parse(barcodeInfo)
data.data = Uri.parse(qrcodeInfo)
}
setResult(Activity.RESULT_OK, data)
finish()
}
private fun processQrCodeText(qrcodeInfo: String) {
if (qrcodeInfo.startsWith("ws")) {
Log.i(TAG, "It's a ws connection")
//Toast.makeText(this, "YEAH: " + qrcodeInfo, Toast.LENGTH_SHORT).show();
val data = Intent() // The data seems valid, so return it
data.data = Uri.parse(qrcodeInfo)
setResult(Activity.RESULT_OK, data)
finish()
} else {
Log.i(TAG, "Not a ws connection")
//Toast.makeText(this, "Not a ws connection", Toast.LENGTH_SHORT).show();
setResult(Activity.RESULT_CANCELED)
finish()
}
}
private val TAG = "QrReader"
}

8
app/src/main/java/org/myhush/silentdragon/ReceiveActivity.kt

@ -43,8 +43,6 @@ class ReceiveActivity : AppCompatActivity() {
override fun onTabSelected(p0: TabLayout.Tab?) {
if (p0?.text == "zAddr") {
setZAddr()
} else {
setTAddr()
}
}
@ -94,12 +92,6 @@ class ReceiveActivity : AppCompatActivity() {
}
}
fun setTAddr() {
addr = DataModel.mainResponseData?.tAddress ?: ""
txtRcvAddrTitle.text = getString(R.string.your_hush_transparent_address)
setAddr()
}
fun setZAddr() {
addr = DataModel.mainResponseData?.saplingAddress ?: ""
txtRcvAddrTitle.text = getString(R.string.your_hush_shielded_address)

8
app/src/main/java/org/myhush/silentdragon/SendActivity.kt

@ -15,6 +15,7 @@ import android.text.Editable
import android.text.InputType
import android.text.SpannableStringBuilder
import android.text.TextWatcher
import android.util.Log
import android.view.inputmethod.EditorInfo
import android.view.inputmethod.InputMethodManager
import android.widget.TextView
@ -24,10 +25,10 @@ import kotlinx.android.synthetic.main.activity_send.*
import kotlinx.android.synthetic.main.content_send.*
import java.text.DecimalFormat
class SendActivity : AppCompatActivity() {
private val REQUEST_CONFIRM = 2
private val TAG = "SendActivity"
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
@ -51,7 +52,7 @@ class SendActivity : AppCompatActivity() {
if (intent.getBooleanExtra("includeReplyTo", false))
chkIncludeReplyTo.isChecked = true
imageButton.setOnClickListener { view ->
imageButton.setOnClickListener {
val intent = Intent(this, QrReaderActivity::class.java)
intent.putExtra("REQUEST_CODE",
QrReaderActivity.REQUEST_ADDRESS
@ -253,7 +254,7 @@ class SendActivity : AppCompatActivity() {
if (amt == null) {
return
}
// Since there is a text-change listner on the USD field, we set the USD first, then override the
// Since there is a text-change listener on the USD field, we set the USD first, then override the
// HUSH field manually.
amountHUSH.setText((DecimalFormat("#.########").format(amt) + "${DataModel.mainResponseData?.tokenName}"))
Toast.makeText(this.applicationContext, amt.toString(), Toast.LENGTH_SHORT).show()
@ -264,6 +265,7 @@ class SendActivity : AppCompatActivity() {
when (requestCode) {
QrReaderActivity.REQUEST_ADDRESS -> {
if (resultCode == Activity.RESULT_OK) {
Log.i(TAG, "Send Activity got result for QrCode: ${data?.dataString}")
if (data?.scheme == "hush") {
sendAddress.setText(data.data?.host ?: "", TextView.BufferType.EDITABLE)

37
app/src/main/res/layout/activity_about.xml

@ -100,41 +100,6 @@
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/TelegramText" />
<TextView
android:id="@+id/Twitter"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="16dp"
android:layout_marginTop="16dp"
android:text="@string/twitter"
android:textStyle="bold"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/divider2" />
<TextView
android:id="@+id/TwitterText"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="16dp"
android:layout_marginTop="2dp"
android:text="@string/twitter_link"
android:textColorLink="@android:color/white"
android:autoLink="web"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/Twitter" />
<View
android:id="@+id/divider3"
android:layout_width="0dp"
android:layout_height="2dp"
android:layout_marginStart="8dp"
android:layout_marginTop="16dp"
android:layout_marginEnd="8dp"
android:background="?android:attr/listDivider"
android:visibility="visible"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/TwitterText" />
<TextView
android:id="@+id/Mastodon"
android:layout_width="wrap_content"
@ -144,7 +109,7 @@
android:text="@string/mastodon"
android:textStyle="bold"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/divider3" />
app:layout_constraintTop_toBottomOf="@id/divider2" />
<TextView
android:id="@+id/MastodonText"

134
app/src/main/res/values-nl/strings.xml

@ -0,0 +1,134 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<!-- general -->
<string name="is_not_a_valid_connection_string">%1$s is geen geldige verbindingslink</string>
<string name="valid_address">Geldig adres</string>
<string name="balance">Saldo</string>
<string name="scan_qr_code">Scan QR-code</string>
<string name="send">Versturen</string>
<string name="address">Adres</string>
<string name="cancel">Annuleren</string>
<string name="amount">Bedrag</string>
<!-- TxDetailsActivity.kt -->
<string name="reply">Antwoorden</string>
<string name="shielded_address">(verborgen adres)</string>
<string name="unconfirmed_tx"> (onbevestigde transactie)</string>
<string name="confirm_transaction">Bevestig transactie</string>
<string name="confirm_and_send">Bevestig en verstuur</string>
<!-- content_main.xml -->
<string name="past_transactions">Eerdere transacties</string>
<string name="or">Of</string>
<string name="reconnect">Opnieuw verbinden</string>
<string name="help">Help</string>
<string name="help_text">Deze applicatie bedient uw full node op afstand.&lt;br>&lt;br>Om uw Android apparaat verbinden met uw desktop moet u de desktop SilentDragon applicatie starten en volledig laten synchroniseren.&lt;br>&lt;br>Nadat uw node gesynchroniseerd is, ga naar &lt;b>Apps -> Mobiele app verbinden&lt;/b> om de QR-code van de verbinding te tonen. Scan de code met deze app om met SilentDragon te verbinden.</string>
<!-- MainActivity.kt -->
<string name="app_name">SilentDragon</string>
<string name="no_connection">Geen verbinding</string>
<string name="connecting">Verbinden&#8230;</string>
<string name="loading">Laden&#8230;</string>
<!-- content_tx_details -->
<string name="memo">Bericht</string>
<string name="memo_contents">Inhoud van bericht</string>
<string name="view_on_block_explorer">Op de blockexplorer bekijken</string>
<string name="date_time">Datum / Tijd</string>
<!-- fragment_transaction_item -->
<string name="date">Datum</string>
<string name="amt">Bedrag</string>
<!-- fragment_unconfirmed_tx_item -->
<string name="unconfirmed_transaction">Onbevestigde transactie</string>
<!-- UnconfirmedTxItemFragment.kt -->
<string name="sending">Versturen </string>
<string name="receiving">Ontvangen </string>
<!-- menu_qrcodereader.xml -->
<string name="manual_input">Handmatige invoer</string>
<!-- menu_recieve -->
<string name="share">Delen</string>
<!-- menu_txdetails -->
<string name="view">Bekijken</string>
<!-- TxDetailsActivity.kt -->
<string name="sent">Verzonden</string>
<string name="received">Ontvangen</string>
<!-- menu_main -->
<string name="refresh">Verversen</string>
<!-- connectionManager.kt -->
<string name="Connecting_over_internet_not_enabled_in_desktop_node">Connectie via internet niet ingeschakeld in de desktop node.</string>
<string name="Connecting_over_internet_is_disabled_in_settings">Connectie via internet is uitgeschakeld in de instellingen.</string>
<!-- activity_qr_reader -->
<string name="how_to_connect_sd2sda">Ga naar \"Apps\" -> \"Mobiele app verbinden\" op de desktop wallet en scan de QR-code om te verbinden.</string>
<!-- activity_settings -->
<string name="disconnect">Verbinding verbreken</string>
<string name="silentDragon_connection_address">SilentDragon verbindingsadres</string>
<string name="disallow_routing_over_external_service">Verbinding via internet verbieden</string>
<string name="only_attempts_direct_connection">Wanneer deze optie is ingeschakeld, probeert de app alleen rechtstreeks verbinding te maken met SilentDragon en wordt data-verkeer niet geleid via de WormHole-service op wormhole.hush.is. Zie https://hush.is/silentdragon voor meer informatie.</string>
<string name="currency">Valuta</string>
<string name="silentdragon_version">SilentDragon versie</string>
<!-- activity_about.xml -->
<string name="website">Bezoek onze website</string>
<string name="telegram">Word lid van ons Telegram kanaal</string>
<string name="twitter">Twitter</string>
<string name="git">Git</string>
<string name="credits">Credits</string>
<string name="license">Licentie</string>
<string name="sda_version">SilentDragonAndroid versie</string>
<string name="copyright">Copyright</string>
<!-- SettingActivity.kt -->
<string name="not_connected">Niet verbonden</string>
<!-- QrReaderActivity.kt -->
<string name="paste_the_code_here_manually">Plak hier handmatig de code</string>
<string name="ok">OK</string>
<string name="is_not_a_valid_hush_address">%1$s is geen geldig Hush adres!</string>
<!-- ReceiveActivity.kt.kt -->
<string name="receive">Ontvangen</string>
<string name="no_address">Geen adres ingevoerd!</string>
<string name="hush_address">Hush adres</string>
<string name="copied_address_to_clipboard">Adres naar klembord gekopieerd</string>
<string name="your_hush_transparent_address">Uw transparante Hush adres</string>
<string name="your_hush_shielded_address">Uw verborgen Hush adres</string>
<!-- SendActivity.kt -->
<string name="send_transaction">Verstuur transactie</string>
<string name="not_a_valid_hush_address">Geen geldig Hush adres!</string>
<string name="memo_optional">Bericht (optioneel)</string>
<string name="send_anyway">Toch versturen</string>
<string name="invalid_amount">Ongeldig bedrag!</string>
<string name="invalid_destination_Hush_address">Ongeldig Hush adres ontvanger!</string>
<string name="send_from_taddr">Vanaf transparant adres versturen?</string>
<string name="cant_send_a_memo_to_a_taddr">Kan geen bericht naar een transparant adres versturen.</string>
<string name="error_sending_transaction">Fout bij het versturen van de transactie!</string>
<string name="memo_field_over_512">Het bericht is te lang. Het bericht kan maximaal 512 karakters bevatten.</string>
<string name="more_than_shielded_address">%1$s %2$s is meer dan er beschikbaar is op één verborgen adres. De transactie moet daarom vanaf een transparant adres verstuurd worden en is dan niet meer anoniem.\n\nWilt u toch versturen?</string>
<string name="max_spend_in_a_single_tx">Kan in een enkele transactie niet meer versturen dan: %1$d %2$s"</string>
<string name="reply_to">Antwoorden aan</string>
<!-- content_send -->
<string name="to">Aan</string>
<string name="fee">Kosten:</string>
<string name="include_reply_to_address">Antwoordadres bijvoegen</string>
<string name="action_settings">Instellingen</string>
<string name="action_about">Over</string>
<string name="transaction_details">Transactiedetails</string>
<string name="title_activity_settings">Instellingen</string>
<string name="title_activity_about">Over</string>
</resources>
Loading…
Cancel
Save