diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index d438d98..92a013f 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -2,6 +2,8 @@
xmlns:android="http://schemas.android.com/apk/res/android"
package="cash.z.ecc.android">
+
+
0;
+ val sdk = Build.MODEL.toLowerCase().contains("sdk")
+ return goldfish || emu || sdk;
+}
diff --git a/app/src/main/java/cash/z/ecc/android/di/AppComponent.kt b/app/src/main/java/cash/z/ecc/android/di/AppComponent.kt
index e031930..0bf9cfd 100644
--- a/app/src/main/java/cash/z/ecc/android/di/AppComponent.kt
+++ b/app/src/main/java/cash/z/ecc/android/di/AppComponent.kt
@@ -6,6 +6,8 @@ import cash.z.ecc.android.ui.detail.WalletDetailFragmentModule
import cash.z.ecc.android.ui.home.HomeFragmentModule
import cash.z.ecc.android.ui.receive.ReceiveFragmentModule
import cash.z.ecc.android.ui.send.SendFragmentModule
+import cash.z.ecc.android.ui.setup.BackupFragmentModule
+import cash.z.ecc.android.ui.setup.LandingFragmentModule
import dagger.Component
import dagger.android.AndroidInjector
import dagger.android.support.AndroidSupportInjectionModule
@@ -23,7 +25,9 @@ import javax.inject.Singleton
HomeFragmentModule::class,
ReceiveFragmentModule::class,
SendFragmentModule::class,
- WalletDetailFragmentModule::class
+ WalletDetailFragmentModule::class,
+ LandingFragmentModule::class,
+ BackupFragmentModule::class
]
)
interface AppComponent : AndroidInjector {
diff --git a/app/src/main/java/cash/z/ecc/android/ext/View.kt b/app/src/main/java/cash/z/ecc/android/ext/View.kt
new file mode 100644
index 0000000..4754a76
--- /dev/null
+++ b/app/src/main/java/cash/z/ecc/android/ext/View.kt
@@ -0,0 +1,31 @@
+package cash.z.ecc.android.ext
+
+import android.view.View
+import android.view.View.*
+import cash.z.ecc.android.ui.MainActivity
+
+fun View.goneIf(isGone: Boolean) {
+ visibility = if (isGone) GONE else VISIBLE
+}
+
+fun View.invisibleIf(isInvisible: Boolean) {
+ visibility = if (isInvisible) INVISIBLE else VISIBLE
+}
+
+fun View.onClickNavTo(navResId: Int) {
+ setOnClickListener {
+ (context as? MainActivity)?.navController?.navigate(navResId)
+ ?: throw IllegalStateException("Cannot navigate from this activity. " +
+ "Expected MainActivity but found ${context.javaClass.simpleName}")
+ }
+}
+
+fun View.onClickNavUp() {
+ setOnClickListener {
+ (context as? MainActivity)?.navController?.navigateUp()
+ ?: throw IllegalStateException(
+ "Cannot navigate from this activity. " +
+ "Expected MainActivity but found ${context.javaClass.simpleName}"
+ )
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/cash/z/ecc/android/ui/MainActivity.kt b/app/src/main/java/cash/z/ecc/android/ui/MainActivity.kt
index f74984f..80b650a 100644
--- a/app/src/main/java/cash/z/ecc/android/ui/MainActivity.kt
+++ b/app/src/main/java/cash/z/ecc/android/ui/MainActivity.kt
@@ -4,7 +4,10 @@ import android.content.ClipData
import android.content.ClipboardManager
import android.content.Context
import android.graphics.Color
+import android.media.MediaPlayer
import android.os.Bundle
+import android.os.Vibrator
+import android.util.Log
import android.view.View
import android.view.WindowManager
import android.view.inputmethod.InputMethodManager
@@ -14,7 +17,6 @@ import androidx.navigation.NavController
import androidx.navigation.findNavController
import cash.z.ecc.android.R
import cash.z.ecc.android.di.annotation.ActivityScope
-import com.google.android.material.snackbar.Snackbar
import dagger.Module
import dagger.android.ContributesAndroidInjector
import dagger.android.support.DaggerAppCompatActivity
@@ -22,7 +24,7 @@ import dagger.android.support.DaggerAppCompatActivity
class MainActivity : DaggerAppCompatActivity() {
lateinit var navController: NavController
- private var snackbar: Snackbar? = null
+ private val mediaPlayer: MediaPlayer = MediaPlayer()
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
@@ -34,7 +36,10 @@ class MainActivity : DaggerAppCompatActivity() {
WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS,
WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS
)
- setWindowFlag(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS, false)// | WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION, false)
+ setWindowFlag(
+ WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS,
+ false
+ )// | WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION, false)
}
private fun setWindowFlag(bits: Int, on: Boolean) {
@@ -47,6 +52,7 @@ class MainActivity : DaggerAppCompatActivity() {
}
win.attributes = winParams
}
+
private fun initNavigation() {
navController = findNavController(R.id.nav_host_fragment)
navController.addOnDestinationChangedListener { _, _, _ ->
@@ -58,9 +64,34 @@ class MainActivity : DaggerAppCompatActivity() {
}
}
+ fun playSound(fileName: String) {
+ mediaPlayer.apply {
+ if (isPlaying) stop()
+ try {
+ reset()
+ assets.openFd(fileName).let { afd ->
+ setDataSource(afd.fileDescriptor, afd.startOffset, afd.length)
+ }
+ prepare()
+ start()
+ } catch (t: Throwable) {
+ Log.e("SDK_ERROR", "ERROR: unable to play sound due to $t")
+ }
+ }
+ }
+
+ // TODO: spruce this up with API 26 stuff
+ fun vibrateSuccess() {
+ val vibrator = getSystemService(Context.VIBRATOR_SERVICE) as Vibrator
+ if (vibrator.hasVibrator()) {
+ vibrator.vibrate(longArrayOf(0, 200, 200, 100, 100, 800), -1)
+ }
+ }
+
fun copyAddress(view: View) {
// TODO: get address from synchronizer
- val address = "zs1qduvdyuv83pyygjvc4cfcuc2wj5flnqn730iigf0tjct8k5ccs9y30p96j2gvn9gzyxm6q0vj12c4"
+ val address =
+ "zs1qduvdyuv83pyygjvc4cfcuc2wj5flnqn730iigf0tjct8k5ccs9y30p96j2gvn9gzyxm6q0vj12c4"
val clipboard: ClipboardManager =
getSystemService(Context.CLIPBOARD_SERVICE) as ClipboardManager
clipboard.setPrimaryClip(
@@ -74,14 +105,6 @@ class MainActivity : DaggerAppCompatActivity() {
private fun showMessage(message: String, action: String) {
Toast.makeText(this, message, Toast.LENGTH_SHORT).show()
-// val view = findViewById(android.R.id.content)
-// if (snackbar == null) {
-// snackbar = Snackbar.make(view, "$message", Snackbar.LENGTH_INDEFINITE)
-// .setAction(action) { /*auto-close*/ }
-// } else {
-// snackbar?.setText(message)
-// }
-// if (snackbar?.isShownOrQueued == false) snackbar?.show()
}
}
@@ -89,5 +112,5 @@ class MainActivity : DaggerAppCompatActivity() {
abstract class MainActivityModule {
@ActivityScope
@ContributesAndroidInjector
- abstract fun contributeMainActivity(): MainActivity
+ abstract fun contributeActivity(): MainActivity
}
\ No newline at end of file
diff --git a/app/src/main/java/cash/z/ecc/android/ui/detail/WalletDetailFragment.kt b/app/src/main/java/cash/z/ecc/android/ui/detail/WalletDetailFragment.kt
index 3afdbd7..0080a20 100644
--- a/app/src/main/java/cash/z/ecc/android/ui/detail/WalletDetailFragment.kt
+++ b/app/src/main/java/cash/z/ecc/android/ui/detail/WalletDetailFragment.kt
@@ -1,8 +1,11 @@
package cash.z.ecc.android.ui.detail
+import android.os.Bundle
import android.view.LayoutInflater
+import android.view.View
import cash.z.ecc.android.databinding.FragmentDetailBinding
import cash.z.ecc.android.di.annotation.FragmentScope
+import cash.z.ecc.android.ext.onClickNavUp
import cash.z.ecc.android.ui.base.BaseFragment
import dagger.Module
import dagger.android.ContributesAndroidInjector
@@ -10,6 +13,11 @@ import dagger.android.ContributesAndroidInjector
class WalletDetailFragment : BaseFragment() {
override fun inflate(inflater: LayoutInflater): FragmentDetailBinding =
FragmentDetailBinding.inflate(inflater)
+
+ override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
+ super.onViewCreated(view, savedInstanceState)
+ binding.backButton.onClickNavUp()
+ }
}
@@ -17,5 +25,5 @@ class WalletDetailFragment : BaseFragment() {
abstract class WalletDetailFragmentModule {
@FragmentScope
@ContributesAndroidInjector
- abstract fun contributeWalletDetailFragment(): WalletDetailFragment
+ abstract fun contributeFragment(): WalletDetailFragment
}
\ No newline at end of file
diff --git a/app/src/main/java/cash/z/ecc/android/ui/home/HomeFragment.kt b/app/src/main/java/cash/z/ecc/android/ui/home/HomeFragment.kt
index 63fa9a1..af2ce96 100644
--- a/app/src/main/java/cash/z/ecc/android/ui/home/HomeFragment.kt
+++ b/app/src/main/java/cash/z/ecc/android/ui/home/HomeFragment.kt
@@ -3,10 +3,15 @@ package cash.z.ecc.android.ui.home
import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
+import android.widget.TextView
import cash.z.ecc.android.R
import cash.z.ecc.android.databinding.FragmentHomeBinding
import cash.z.ecc.android.di.annotation.FragmentScope
+import cash.z.ecc.android.ext.goneIf
+import cash.z.ecc.android.ext.onClickNavTo
import cash.z.ecc.android.ui.base.BaseFragment
+import cash.z.ecc.android.ui.home.HomeFragment.BannerAction.*
+import com.google.android.material.dialog.MaterialAlertDialogBuilder
import dagger.Module
import dagger.android.ContributesAndroidInjector
@@ -16,14 +21,74 @@ class HomeFragment : BaseFragment() {
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
- binding.hitAreaReceive.setOnClickListener {
- mainActivity?.navController?.navigate(R.id.action_nav_home_to_nav_receive)
+ // TODO: trigger this from presenter
+ onNoFunds()
+ }
+
+ override fun onActivityCreated(savedInstanceState: Bundle?) {
+ super.onActivityCreated(savedInstanceState)
+ binding.hitAreaReceive.onClickNavTo(R.id.action_nav_home_to_nav_receive)
+ binding.iconDetail.onClickNavTo(R.id.action_nav_home_to_nav_detail)
+ binding.textDetail.onClickNavTo(R.id.action_nav_home_to_nav_detail)
+ binding.hitAreaScan.onClickNavTo(R.id.action_nav_home_to_nav_send)
+
+ binding.textBannerAction.setOnClickListener {
+ onBannerAction(BannerAction.from((it as? TextView)?.text?.toString()))
}
- binding.iconDetail.setOnClickListener {
- mainActivity?.navController?.navigate(R.id.action_nav_home_to_nav_detail)
+ }
+
+ private fun onBannerAction(action: BannerAction) {
+ when (action) {
+ LEARN_MORE -> {
+ MaterialAlertDialogBuilder(activity)
+ .setMessage("To make full use of this wallet, deposit funds to your address or tap the faucet to trigger a tiny automatic deposit.\n\nFaucet funds are made available for the community by the community for testing. So please be kind enough to return what you borrow!")
+ .setTitle("No Balance")
+ .setCancelable(true)
+ .setPositiveButton("Tap Faucet") { dialog, _ ->
+ dialog.dismiss()
+ setBanner("Tapping faucet...", CANCEL)
+ }
+ .setNegativeButton("View Address") { dialog, _ ->
+ dialog.dismiss()
+ mainActivity?.navController?.navigate(R.id.action_nav_home_to_nav_receive)
+ }
+ .show()
+ }
+ CANCEL -> {
+ // TODO: trigger banner / balance update
+ onNoFunds()
+ }
}
- binding.hitAreaScan.setOnClickListener {
- mainActivity?.navController?.navigate(R.id.action_nav_home_to_nav_send)
+ }
+
+ private fun onNoFunds() {
+ setBanner("No Balance", LEARN_MORE)
+ }
+
+ private fun setBanner(message: String = "", action: BannerAction = CLEAR) {
+ with(binding) {
+ val hasMessage = !message.isEmpty() || action != CLEAR
+ groupBalance.goneIf(hasMessage)
+ groupBanner.goneIf(!hasMessage)
+ layerLock.goneIf(!hasMessage)
+
+ textBannerMessage.text = message
+ textBannerAction.text = action.action
+ }
+ }
+
+ enum class BannerAction(val action: String) {
+ LEARN_MORE("Learn More"),
+ CANCEL("Cancel"),
+ CLEAR("");
+
+ companion object {
+ fun from(action: String?): BannerAction {
+ values().forEach {
+ if (it.action == action) return it
+ }
+ throw IllegalArgumentException("Invalid BannerAction: $action")
+ }
}
}
}
@@ -33,5 +98,5 @@ class HomeFragment : BaseFragment() {
abstract class HomeFragmentModule {
@FragmentScope
@ContributesAndroidInjector
- abstract fun contributeHomeFragment(): HomeFragment
+ abstract fun contributeFragment(): HomeFragment
}
\ No newline at end of file
diff --git a/app/src/main/java/cash/z/ecc/android/ui/receive/ReceiveFragment.kt b/app/src/main/java/cash/z/ecc/android/ui/receive/ReceiveFragment.kt
index 58986fa..3b7c5b8 100644
--- a/app/src/main/java/cash/z/ecc/android/ui/receive/ReceiveFragment.kt
+++ b/app/src/main/java/cash/z/ecc/android/ui/receive/ReceiveFragment.kt
@@ -12,6 +12,8 @@ import androidx.lifecycle.lifecycleScope
import cash.z.android.qrecycler.QRecycler
import cash.z.ecc.android.databinding.FragmentReceiveBinding
import cash.z.ecc.android.di.annotation.FragmentScope
+import cash.z.ecc.android.ext.onClickNavTo
+import cash.z.ecc.android.ext.onClickNavUp
import cash.z.ecc.android.ui.base.BaseFragment
import cash.z.ecc.android.ui.util.AddressPartNumberSpan
import dagger.Module
@@ -39,6 +41,7 @@ class ReceiveFragment : BaseFragment() {
text_address_part_7,
text_address_part_8
)
+ binding.backButton.onClickNavUp()
}
override fun onAttach(context: Context) {
@@ -81,5 +84,5 @@ class ReceiveFragment : BaseFragment() {
abstract class ReceiveFragmentModule {
@FragmentScope
@ContributesAndroidInjector
- abstract fun contributeReceiveFragment(): ReceiveFragment
+ abstract fun contributeFragment(): ReceiveFragment
}
\ No newline at end of file
diff --git a/app/src/main/java/cash/z/ecc/android/ui/send/SendFragment.kt b/app/src/main/java/cash/z/ecc/android/ui/send/SendFragment.kt
index 380655c..c4e572b 100644
--- a/app/src/main/java/cash/z/ecc/android/ui/send/SendFragment.kt
+++ b/app/src/main/java/cash/z/ecc/android/ui/send/SendFragment.kt
@@ -1,8 +1,11 @@
package cash.z.ecc.android.ui.send
+import android.os.Bundle
import android.view.LayoutInflater
+import android.view.View
import cash.z.ecc.android.databinding.FragmentSendBinding
import cash.z.ecc.android.di.annotation.FragmentScope
+import cash.z.ecc.android.ext.onClickNavUp
import cash.z.ecc.android.ui.base.BaseFragment
import dagger.Module
import dagger.android.ContributesAndroidInjector
@@ -10,6 +13,11 @@ import dagger.android.ContributesAndroidInjector
class SendFragment : BaseFragment() {
override fun inflate(inflater: LayoutInflater): FragmentSendBinding =
FragmentSendBinding.inflate(inflater)
+
+ override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
+ super.onViewCreated(view, savedInstanceState)
+ binding.backButton.onClickNavUp()
+ }
}
@@ -17,5 +25,5 @@ class SendFragment : BaseFragment() {
abstract class SendFragmentModule {
@FragmentScope
@ContributesAndroidInjector
- abstract fun contributeSendFragment(): SendFragment
+ abstract fun contributeFragment(): SendFragment
}
diff --git a/app/src/main/java/cash/z/ecc/android/ui/setup/BackupFragment.kt b/app/src/main/java/cash/z/ecc/android/ui/setup/BackupFragment.kt
new file mode 100644
index 0000000..7068c89
--- /dev/null
+++ b/app/src/main/java/cash/z/ecc/android/ui/setup/BackupFragment.kt
@@ -0,0 +1,63 @@
+package cash.z.ecc.android.ui.setup
+
+import android.os.Bundle
+import android.text.SpannableString
+import android.text.Spanned
+import android.view.LayoutInflater
+import android.view.View
+import android.widget.TextView
+import android.widget.Toast
+import cash.z.ecc.android.R
+import cash.z.ecc.android.databinding.FragmentBackupBinding
+import cash.z.ecc.android.di.annotation.FragmentScope
+import cash.z.ecc.android.ui.base.BaseFragment
+import cash.z.ecc.android.ui.util.AddressPartNumberSpan
+import dagger.Module
+import dagger.android.ContributesAndroidInjector
+
+class BackupFragment : BaseFragment() {
+
+ override fun inflate(inflater: LayoutInflater): FragmentBackupBinding =
+ FragmentBackupBinding.inflate(inflater)
+
+ override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
+ super.onViewCreated(view, savedInstanceState)
+ with(binding) {
+ applySpan(
+ textAddressPart1,
+ textAddressPart2,
+ textAddressPart3,
+ textAddressPart4,
+ textAddressPart5,
+ textAddressPart6,
+ textAddressPart7,
+ textAddressPart8
+ )
+ }
+ binding.buttonPositive.setOnClickListener {
+ onEnterWallet()
+ }
+ }
+
+ private fun onEnterWallet() {
+ Toast.makeText(activity, "Backup verification coming soon! For now, enjoy your new wallet!", Toast.LENGTH_LONG).show()
+ mainActivity?.navController?.navigate(R.id.action_nav_backup_to_nav_home)
+ }
+
+ private fun applySpan(vararg textViews: TextView) {
+ val thinSpace = "\u2005" // 0.25 em space
+ textViews.forEachIndexed { index, textView ->
+ textView.text = SpannableString("${index + 1}$thinSpace${textView.text}").apply {
+ setSpan(AddressPartNumberSpan(), 0, 2, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE)
+ }
+ }
+ }
+}
+
+
+@Module
+abstract class BackupFragmentModule {
+ @FragmentScope
+ @ContributesAndroidInjector
+ abstract fun contributeFragment(): BackupFragment
+}
\ No newline at end of file
diff --git a/app/src/main/java/cash/z/ecc/android/ui/setup/LandingFragment.kt b/app/src/main/java/cash/z/ecc/android/ui/setup/LandingFragment.kt
new file mode 100644
index 0000000..5e999dc
--- /dev/null
+++ b/app/src/main/java/cash/z/ecc/android/ui/setup/LandingFragment.kt
@@ -0,0 +1,89 @@
+package cash.z.ecc.android.ui.setup
+
+import android.os.Bundle
+import android.view.LayoutInflater
+import android.view.View
+import android.widget.Toast
+import cash.z.ecc.android.R
+import cash.z.ecc.android.ZcashWalletApp
+import cash.z.ecc.android.databinding.FragmentLandingBinding
+import cash.z.ecc.android.di.annotation.FragmentScope
+import cash.z.ecc.android.isEmulator
+import cash.z.ecc.android.ui.base.BaseFragment
+import dagger.Module
+import dagger.android.ContributesAndroidInjector
+
+class LandingFragment : BaseFragment() {
+ private var skipCount: Int = 0
+
+ override fun inflate(inflater: LayoutInflater): FragmentLandingBinding =
+ FragmentLandingBinding.inflate(inflater)
+
+ override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
+ super.onViewCreated(view, savedInstanceState)
+ binding.buttonPositive.setOnClickListener {
+ when (binding.buttonPositive.text.toString().toLowerCase()) {
+ "new" -> onNewWallet()
+ "backup" -> onBackupWallet()
+ }
+ }
+ binding.buttonNegative.setOnClickListener {
+ when (binding.buttonNegative.text.toString().toLowerCase()) {
+ "restore" -> onRestoreWallet()
+ else -> onSkip(++skipCount)
+ }
+ }
+ }
+
+ private fun onSkip(count: Int) {
+ when (count) {
+ 1 -> {
+ binding.textMessage.text =
+ "Are you sure? Without a backup, funds can be lost FOREVER!"
+ binding.buttonNegative.text = "Later"
+ }
+ 2 -> {
+ binding.textMessage.text =
+ "You can't backup later. You're probably going to lose your funds!"
+ binding.buttonNegative.text = "I've been warned"
+ }
+ else -> {
+ onEnterWallet()
+ }
+ }
+ }
+
+ private fun onRestoreWallet() {
+ if (ZcashWalletApp.instance.isEmulator()) {
+ onEnterWallet()
+ } else {
+ Toast.makeText(activity, "Coming soon!", Toast.LENGTH_SHORT).show()
+ }
+ }
+
+ private fun onNewWallet() {
+ binding.textMessage.text = "Wallet created! Congratulations!"
+ binding.buttonNegative.text = "Skip"
+ binding.buttonPositive.text = "Backup"
+ mainActivity?.playSound("sound_receive_small.mp3")
+ mainActivity?.vibrateSuccess()
+ }
+
+ private fun onBackupWallet() {
+ skipCount = 0
+ mainActivity?.navController?.navigate(R.id.action_nav_landing_to_nav_backup)
+ }
+
+ private fun onEnterWallet() {
+
+ skipCount = 0
+ mainActivity?.navController?.navigate(R.id.action_nav_landing_to_nav_home)
+ }
+}
+
+@Module
+abstract class LandingFragmentModule {
+ @FragmentScope
+ @ContributesAndroidInjector
+ abstract fun contributeFragment(): LandingFragment
+}
\ No newline at end of file
diff --git a/app/src/main/res/drawable/background_banner.xml b/app/src/main/res/drawable/background_banner.xml
new file mode 100644
index 0000000..5c45e99
--- /dev/null
+++ b/app/src/main/res/drawable/background_banner.xml
@@ -0,0 +1,7 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/background_title_primary.xml b/app/src/main/res/drawable/background_title_primary.xml
new file mode 100644
index 0000000..5c45e99
--- /dev/null
+++ b/app/src/main/res/drawable/background_title_primary.xml
@@ -0,0 +1,7 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/ic_arrow_back_black_24dp.xml b/app/src/main/res/drawable/ic_arrow_back_black_24dp.xml
new file mode 100644
index 0000000..beafea3
--- /dev/null
+++ b/app/src/main/res/drawable/ic_arrow_back_black_24dp.xml
@@ -0,0 +1,9 @@
+
+
+
diff --git a/app/src/main/res/drawable/ic_logo_landing.xml b/app/src/main/res/drawable/ic_logo_landing.xml
new file mode 100644
index 0000000..ef31e7a
--- /dev/null
+++ b/app/src/main/res/drawable/ic_logo_landing.xml
@@ -0,0 +1,55 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/src/main/res/layout/fragment_address.xml b/app/src/main/res/layout/fragment_address.xml
new file mode 100644
index 0000000..8b12740
--- /dev/null
+++ b/app/src/main/res/layout/fragment_address.xml
@@ -0,0 +1,19 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/fragment_backup.xml b/app/src/main/res/layout/fragment_backup.xml
new file mode 100644
index 0000000..515d55f
--- /dev/null
+++ b/app/src/main/res/layout/fragment_backup.xml
@@ -0,0 +1,187 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/fragment_confirm.xml b/app/src/main/res/layout/fragment_confirm.xml
new file mode 100644
index 0000000..fc88c16
--- /dev/null
+++ b/app/src/main/res/layout/fragment_confirm.xml
@@ -0,0 +1,19 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/fragment_detail.xml b/app/src/main/res/layout/fragment_detail.xml
index 1f4ab0e..2700275 100644
--- a/app/src/main/res/layout/fragment_detail.xml
+++ b/app/src/main/res/layout/fragment_detail.xml
@@ -7,6 +7,20 @@
android:background="@drawable/background_home"
xmlns:tools="http://schemas.android.com/tools">
+
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+ app:layout_constraintVertical_chainStyle="spread_inside"
+ app:layout_constraintWidth_percent="@dimen/calculator_button_width_percent" />
+ app:layout_constraintDimensionRatio="H,1:1"
+ app:layout_constraintEnd_toEndOf="@id/guide_keys"
+ app:layout_constraintStart_toStartOf="@id/guide_keys"
+ app:layout_constraintTop_toTopOf="@id/guide_keys"
+ app:layout_constraintVertical_chainStyle="spread_inside"
+ app:layout_constraintWidth_percent="@dimen/calculator_button_width_percent" />
+ app:layout_constraintVertical_chainStyle="spread_inside"
+ app:layout_constraintWidth_percent="@dimen/calculator_button_width_percent" />
+ app:layout_constraintWidth_percent="@dimen/calculator_button_width_percent" />
+ app:layout_constraintWidth_percent="@dimen/calculator_button_width_percent" />
+ app:layout_constraintWidth_percent="@dimen/calculator_button_width_percent" />
@@ -295,20 +222,67 @@
android:background="@drawable/background_button_rounded"
android:gravity="center"
android:text="Send Amount"
- android:textColor="#000000"
android:textAppearance="@style/TextAppearance.MaterialComponents.Body1"
+ android:textColor="#000000"
app:layout_constraintEnd_toEndOf="@id/guide_keys"
app:layout_constraintStart_toStartOf="@id/guide_keys"
app:layout_constraintTop_toBottomOf="@id/guide_keys" />
-
+
-
+
+
+
+
+
+
+
+
@@ -326,7 +301,99 @@
android:layout_height="68dp"
android:layout_marginEnd="24dp"
android:background="@android:color/transparent"
+ android:elevation="6dp"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="@id/guideline_hit_area_top" />
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/fragment_landing.xml b/app/src/main/res/layout/fragment_landing.xml
new file mode 100644
index 0000000..6f85813
--- /dev/null
+++ b/app/src/main/res/layout/fragment_landing.xml
@@ -0,0 +1,83 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/fragment_memo.xml b/app/src/main/res/layout/fragment_memo.xml
new file mode 100644
index 0000000..b7d2264
--- /dev/null
+++ b/app/src/main/res/layout/fragment_memo.xml
@@ -0,0 +1,19 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/fragment_placeholder.xml b/app/src/main/res/layout/fragment_placeholder.xml
deleted file mode 100644
index 3c51294..0000000
--- a/app/src/main/res/layout/fragment_placeholder.xml
+++ /dev/null
@@ -1,35 +0,0 @@
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/app/src/main/res/layout/fragment_receive.xml b/app/src/main/res/layout/fragment_receive.xml
index b41acaa..36a221c 100644
--- a/app/src/main/res/layout/fragment_receive.xml
+++ b/app/src/main/res/layout/fragment_receive.xml
@@ -1,5 +1,6 @@
-
-
-
-
-
-
+
+
+ app:layout_constraintWidth_percent="0.84988"
+ app:srcCompat="@drawable/ic_shield" />
+ app:srcCompat="@drawable/ic_zcash_white" />
-
-
-
+ app:layout_constraintTop_toTopOf="@id/image_shield"
+ app:layout_constraintVertical_bias="0.924">
+
+
+
-
-
-
+ android:backgroundTint="#282828"
+ app:layout_constraintEnd_toEndOf="@id/image_shield"
+ app:layout_constraintStart_toStartOf="@id/image_shield"
+ app:layout_constraintTop_toBottomOf="@id/image_shield">
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
-
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/fragment_send.xml b/app/src/main/res/layout/fragment_send.xml
index 6844730..12b86d8 100644
--- a/app/src/main/res/layout/fragment_send.xml
+++ b/app/src/main/res/layout/fragment_send.xml
@@ -7,6 +7,20 @@
android:background="@drawable/background_home"
xmlns:tools="http://schemas.android.com/tools">
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/fragment_wallet_new.xml b/app/src/main/res/layout/fragment_wallet_new.xml
new file mode 100644
index 0000000..b7d2264
--- /dev/null
+++ b/app/src/main/res/layout/fragment_wallet_new.xml
@@ -0,0 +1,19 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/navigation/mobile_navigation.xml b/app/src/main/res/navigation/mobile_navigation.xml
index 3636cc2..55a5133 100644
--- a/app/src/main/res/navigation/mobile_navigation.xml
+++ b/app/src/main/res/navigation/mobile_navigation.xml
@@ -4,7 +4,28 @@
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/mobile_navigation"
- app:startDestination="@+id/nav_home">
+ app:startDestination="@+id/nav_landing">
+
+
+
+
+
+
+
+
+
Zcash Wallet
- Your Zcash shielded address
+ Your Shielded Address
diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml
index d9ed9cd..29b38a5 100644
--- a/app/src/main/res/values/styles.xml
+++ b/app/src/main/res/values/styles.xml
@@ -1,11 +1,15 @@
-
-
@@ -22,6 +26,10 @@
- @drawable/selector_pressed_ripple_circle
+
+
+
+
+
+