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 @@ - - + + + + + +