diff --git a/zcash-android-wallet-app/app/libs/zcash-android-wallet-sdk-1.6.0.aar b/zcash-android-wallet-app/app/libs/zcash-android-wallet-sdk-1.6.0.aar index 85887b2..1de8313 100644 Binary files a/zcash-android-wallet-app/app/libs/zcash-android-wallet-sdk-1.6.0.aar and b/zcash-android-wallet-app/app/libs/zcash-android-wallet-sdk-1.6.0.aar differ diff --git a/zcash-android-wallet-app/app/src/main/java/cash/z/android/wallet/ZcashWalletApplication.kt b/zcash-android-wallet-app/app/src/main/java/cash/z/android/wallet/ZcashWalletApplication.kt index 2e894ce..a1949f1 100644 --- a/zcash-android-wallet-app/app/src/main/java/cash/z/android/wallet/ZcashWalletApplication.kt +++ b/zcash-android-wallet-app/app/src/main/java/cash/z/android/wallet/ZcashWalletApplication.kt @@ -3,6 +3,8 @@ package cash.z.android.wallet import android.content.Context import androidx.multidex.MultiDex import cash.z.android.wallet.di.component.DaggerApplicationComponent +import cash.z.wallet.sdk.data.TroubleshootingTwig +import cash.z.wallet.sdk.data.Twig import com.facebook.stetho.Stetho import dagger.android.AndroidInjector import dagger.android.DaggerApplication @@ -14,6 +16,7 @@ class ZcashWalletApplication : DaggerApplication() { instance = this super.onCreate() Stetho.initializeWithDefaults(this) + Twig.plant(TroubleshootingTwig()) } /** diff --git a/zcash-android-wallet-app/app/src/main/java/cash/z/android/wallet/di/component/ApplicationComponent.kt b/zcash-android-wallet-app/app/src/main/java/cash/z/android/wallet/di/component/ApplicationComponent.kt index 86b9671..6f9a85c 100644 --- a/zcash-android-wallet-app/app/src/main/java/cash/z/android/wallet/di/component/ApplicationComponent.kt +++ b/zcash-android-wallet-app/app/src/main/java/cash/z/android/wallet/di/component/ApplicationComponent.kt @@ -26,12 +26,15 @@ import javax.inject.Singleton AboutFragmentModule::class, HistoryFragmentModule::class, HomeFragmentModule::class, - ImportFragmentModule::class, + WelcomeFragmentModule::class, ReceiveFragmentModule::class, RequestFragmentModule::class, SendFragmentModule::class, ScanFragmentModule::class, - SettingsFragmentModule::class + SettingsFragmentModule::class, + WelcomeFragmentModule::class, + FirstrunFragmentModule::class, + SyncFragmentModule::class ] ) interface ApplicationComponent : AndroidInjector { diff --git a/zcash-android-wallet-app/app/src/main/java/cash/z/android/wallet/extention/Global.kt b/zcash-android-wallet-app/app/src/main/java/cash/z/android/wallet/extention/Global.kt index e7431d7..43a5770 100644 --- a/zcash-android-wallet-app/app/src/main/java/cash/z/android/wallet/extention/Global.kt +++ b/zcash-android-wallet-app/app/src/main/java/cash/z/android/wallet/extention/Global.kt @@ -6,4 +6,8 @@ internal inline fun tryIgnore(block: () -> Unit) { internal inline fun tryNull(block: () -> T): T? { return try { block() } catch(ignored: Throwable) { null } +} + +internal inline fun String.truncate(): String { + return "${substring(0..4)}...${substring(length-5, length)}" } \ No newline at end of file diff --git a/zcash-android-wallet-app/app/src/main/java/cash/z/android/wallet/ui/activity/MainActivity.kt b/zcash-android-wallet-app/app/src/main/java/cash/z/android/wallet/ui/activity/MainActivity.kt index 32873d9..529fa39 100644 --- a/zcash-android-wallet-app/app/src/main/java/cash/z/android/wallet/ui/activity/MainActivity.kt +++ b/zcash-android-wallet-app/app/src/main/java/cash/z/android/wallet/ui/activity/MainActivity.kt @@ -1,14 +1,23 @@ package cash.z.android.wallet.ui.activity +import android.animation.ObjectAnimator +import android.animation.ValueAnimator +import android.annotation.SuppressLint import android.os.Bundle import android.util.Log +import android.view.Gravity import android.view.View import android.view.inputmethod.InputMethodManager import android.view.inputmethod.InputMethodManager.HIDE_NOT_ALWAYS +import android.widget.TextView +import androidx.appcompat.app.AppCompatActivity import androidx.appcompat.app.AppCompatDelegate +import androidx.appcompat.graphics.drawable.DrawerArrowDrawable +import androidx.core.app.ActivityCompat import androidx.core.content.getSystemService import androidx.core.view.GravityCompat import androidx.core.view.doOnLayout +import androidx.databinding.DataBindingUtil import androidx.drawerlayout.widget.DrawerLayout import androidx.navigation.NavController import androidx.navigation.NavDestination @@ -20,15 +29,13 @@ import androidx.navigation.ui.setupWithNavController import cash.z.android.wallet.BuildConfig import cash.z.android.wallet.R import cash.z.android.wallet.ZcashWalletApplication +import cash.z.android.wallet.databinding.ActivityMainBinding import dagger.Module import dagger.android.ContributesAndroidInjector import dagger.android.support.DaggerAppCompatActivity -import kotlinx.android.synthetic.main.activity_main.* -import kotlinx.android.synthetic.main.nav_header_main.* import cash.z.wallet.sdk.data.Synchronizer import com.google.android.material.snackbar.Snackbar import dagger.android.AndroidInjection -import kotlinx.android.synthetic.main.activity_main_first_run.* import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.GlobalScope import kotlinx.coroutines.channels.ReceiveChannel @@ -41,34 +48,44 @@ class MainActivity : BaseActivity() { @Inject lateinit var synchronizer: Synchronizer + lateinit var binding: ActivityMainBinding + // used to manage the drawer and drawerToggle interactions private lateinit var appBarConfiguration: AppBarConfiguration lateinit var navController: NavController + private val multiStartNavigationUi = MultiStartNavigationUI(listOf( + R.id.nav_home_fragment, + R.id.nav_welcome_fragment + )) override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) - setContentView(R.layout.activity_main) + binding = DataBindingUtil.setContentView(this, R.layout.activity_main) + initAppBar() + synchronizer.start(this) } + private fun initAppBar() { + setSupportActionBar(findViewById(R.id.main_toolbar)) +// supportActionBar?.setDisplayHomeAsUpEnabled(false) + setupNavigation() + supportActionBar?.setTitle("main title") + } + override fun onDestroy() { super.onDestroy() synchronizer.stop() } override fun onBackPressed() { - if (drawer_layout.isDrawerOpen(GravityCompat.START)) { - drawer_layout.closeDrawer(GravityCompat.START) + if (binding.drawerLayout.isDrawerOpen(GravityCompat.START)) { + binding.drawerLayout.closeDrawer(GravityCompat.START) } else { super.onBackPressed() } } - override fun onResume() { - super.onResume() -// if(DEV_MODE) navController.navigate(R.id.nav_send_fragment) - } - /** * Let the navController override the default behavior when the drawer icon or back arrow are clicked. This * automatically takes care of the drawer toggle behavior. Note that without overriding this method, the up/drawer @@ -79,30 +96,39 @@ class MainActivity : BaseActivity() { } fun setDrawerLocked(isLocked: Boolean) { - drawer_layout.setDrawerLockMode(if (isLocked) DrawerLayout.LOCK_MODE_LOCKED_CLOSED else DrawerLayout.LOCK_MODE_UNLOCKED) + binding.drawerLayout.setDrawerLockMode(if (isLocked) DrawerLayout.LOCK_MODE_LOCKED_CLOSED else DrawerLayout.LOCK_MODE_UNLOCKED) + } + + fun openDrawer(view: View) { + binding.drawerLayout.openDrawer(GravityCompat.START) + } + + fun setToolbarShown(isShown: Boolean) { + binding.mainAppBar.visibility = if (isShown) View.VISIBLE else View.INVISIBLE } fun setupNavigation() { // create and setup the navController and appbarConfiguration navController = Navigation.findNavController(this, R.id.nav_host_fragment).also { n -> - appBarConfiguration = AppBarConfiguration(n.graph, drawer_layout).also { a -> - nav_view.setupWithNavController(n) - setupActionBarWithNavController(n, a) + appBarConfiguration = AppBarConfiguration(n.graph, binding.drawerLayout).also { a -> + binding.navView.setupWithNavController(n) + multiStartNavigationUi.setupActionBarWithNavController(this, n, binding.drawerLayout) } } navController.addOnNavigatedListener { _, _ -> // hide the keyboard anytime we change destinations - getSystemService()?.hideSoftInputFromWindow(nav_view.windowToken, HIDE_NOT_ALWAYS) + getSystemService()?.hideSoftInputFromWindow(binding.navView.windowToken, HIDE_NOT_ALWAYS) } // remove icon tint so that our colored nav icons show through - nav_view.itemIconTintList = null + binding.navView.itemIconTintList = null - nav_view.doOnLayout { - text_nav_header_subtitle.text = "Version ${BuildConfig.VERSION_NAME}" + binding.navView.doOnLayout { + binding.navView.findViewById(R.id.text_nav_header_subtitle).text = "Version ${BuildConfig.VERSION_NAME}" } } + companion object { init { // Enable vector drawable magic @@ -115,4 +141,82 @@ class MainActivity : BaseActivity() { abstract class MainActivityModule { @ContributesAndroidInjector abstract fun contributeMainActivity(): MainActivity +} + + +class MultiStartNavigationUI(private val startDestinations: List) { + fun setupActionBarWithNavController(activity: AppCompatActivity, navController: NavController, + drawerLayout: DrawerLayout?) { + + navController.addOnNavigatedListener(ActionBarOnNavigatedListener( + activity, startDestinations, drawerLayout)) + } + + fun navigateUp(drawerLayout: DrawerLayout?, navController: NavController): Boolean { + if (drawerLayout != null && startDestinations.contains(navController.currentDestination?.id)) { + drawerLayout.openDrawer(GravityCompat.START) + return true + } else { + return navController.navigateUp() + } + } + + fun onBackPressed(activity: AppCompatActivity, + navController: NavController): Boolean { + if (startDestinations.contains(navController.currentDestination?.id)) { + ActivityCompat.finishAfterTransition(activity) + return true + } + + return false + } + + private class ActionBarOnNavigatedListener( + private val mActivity: AppCompatActivity, + private val startDestinations: List, + private val mDrawerLayout: DrawerLayout? + ) : NavController.OnNavigatedListener { + private var mArrowDrawable: DrawerArrowDrawable? = null + private var mAnimator: ValueAnimator? = null + + override fun onNavigated(controller: NavController, destination: NavDestination) { + val actionBar = mActivity.supportActionBar + + val title = destination.label + if (!title.isNullOrEmpty()) { + actionBar?.title = title + } + + val isStartDestination = startDestinations.contains(destination.id) + actionBar?.setDisplayHomeAsUpEnabled(this.mDrawerLayout != null || !isStartDestination) + setActionBarUpIndicator(mDrawerLayout != null && isStartDestination) + } + + + private fun setActionBarUpIndicator(showAsDrawerIndicator: Boolean) { + val delegate = mActivity.drawerToggleDelegate + var animate = true + if (mArrowDrawable == null) { + mArrowDrawable = DrawerArrowDrawable(delegate!!.actionBarThemedContext) + delegate.setActionBarUpIndicator(mArrowDrawable, 0) + animate = false + } + + mArrowDrawable?.let { + val endValue = if (showAsDrawerIndicator) 0.0f else 1.0f + + if (animate) { + val startValue = it.progress + mAnimator?.cancel() + + @SuppressLint("ObjectAnimatorBinding") + mAnimator = ObjectAnimator.ofFloat(it, "progress", startValue, endValue) + mAnimator?.start() + } else { + it.progress = endValue + } + } + + } + } } \ No newline at end of file diff --git a/zcash-android-wallet-app/app/src/main/java/cash/z/android/wallet/ui/fragment/FirstrunFragment.kt b/zcash-android-wallet-app/app/src/main/java/cash/z/android/wallet/ui/fragment/FirstrunFragment.kt new file mode 100644 index 0000000..23a8370 --- /dev/null +++ b/zcash-android-wallet-app/app/src/main/java/cash/z/android/wallet/ui/fragment/FirstrunFragment.kt @@ -0,0 +1,94 @@ +package cash.z.android.wallet.ui.fragment + +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.core.view.doOnPreDraw +import androidx.databinding.DataBindingUtil +import androidx.transition.Transition +import androidx.transition.TransitionInflater +import cash.z.android.wallet.R +import cash.z.android.wallet.databinding.FragmentFirstrunBinding +import dagger.Module +import dagger.android.ContributesAndroidInjector + +class FirstrunFragment : ProgressFragment(R.id.progress_firstrun), Transition.TransitionListener { + + private lateinit var binding: FragmentFirstrunBinding + + // + // Lifecycle + // + + override fun onCreateView( + inflater: LayoutInflater, container: ViewGroup?, + savedInstanceState: Bundle? + ): View? { + setupSharedElementTransitions() + return DataBindingUtil.inflate( + inflater, R.layout.fragment_firstrun, container, false + ).let { + binding = it + it.root + } + } + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + postponeEnterTransition() + binding.buttonNext.setOnClickListener { + mainActivity.navController.navigate(R.id.nav_sync_fragment) + } + binding.buttonNext.alpha = 0f + binding.textProgressFirstrun.alpha = 0f + } + + override fun onActivityCreated(savedInstanceState: Bundle?) { + super.onActivityCreated(savedInstanceState) + (view?.parent as? ViewGroup)?.doOnPreDraw { + startPostponedEnterTransition() + } + } + + override fun onResume() { + super.onResume() + mainActivity.setDrawerLocked(true) + mainActivity.setToolbarShown(false) + } + + private fun setupSharedElementTransitions() { + TransitionInflater.from(mainActivity).inflateTransition(R.transition.transition_zec_sent).apply { + duration = 250L + addListener(this@FirstrunFragment) + this@FirstrunFragment.sharedElementEnterTransition = this + this@FirstrunFragment.sharedElementReturnTransition = this + } + } + + override fun onProgressComplete() { + super.onProgressComplete() + binding.textProgressFirstrun.visibility = View.GONE + } + + override fun onTransitionEnd(transition: Transition) { + binding.buttonNext.animate().apply { + duration = 300L + }.alpha(1.0f) + binding.textProgressFirstrun.animate().apply { + duration = 300L + }.alpha(1.0f) + } + + override fun onTransitionResume(transition: Transition) {} + override fun onTransitionPause(transition: Transition) {} + override fun onTransitionCancel(transition: Transition) {} + override fun onTransitionStart(transition: Transition) {} +} + +@Module +abstract class FirstrunFragmentModule { + + @ContributesAndroidInjector + abstract fun contributeFirstrunFragment(): FirstrunFragment +} \ No newline at end of file diff --git a/zcash-android-wallet-app/app/src/main/java/cash/z/android/wallet/ui/fragment/HistoryFragment.kt b/zcash-android-wallet-app/app/src/main/java/cash/z/android/wallet/ui/fragment/HistoryFragment.kt index 99faf60..5c2cd68 100644 --- a/zcash-android-wallet-app/app/src/main/java/cash/z/android/wallet/ui/fragment/HistoryFragment.kt +++ b/zcash-android-wallet-app/app/src/main/java/cash/z/android/wallet/ui/fragment/HistoryFragment.kt @@ -30,15 +30,6 @@ class HistoryFragment : BaseFragment(), HistoryPresenter.HistoryView { .root } - override fun onViewCreated(view: View, savedInstanceState: Bundle?) { - super.onViewCreated(view, savedInstanceState) - mainActivity.let { mainActivity -> - mainActivity.setSupportActionBar(view.findViewById(R.id.toolbar)) - mainActivity.supportActionBar?.setDisplayHomeAsUpEnabled(true) - mainActivity.supportActionBar?.setTitle(R.string.destination_title_history) - } - } - override fun onActivityCreated(savedInstanceState: Bundle?) { super.onActivityCreated(savedInstanceState) historyPresenter = HistoryPresenter(this, mainActivity.synchronizer) diff --git a/zcash-android-wallet-app/app/src/main/java/cash/z/android/wallet/ui/fragment/HomeFragment.kt b/zcash-android-wallet-app/app/src/main/java/cash/z/android/wallet/ui/fragment/HomeFragment.kt index 12ac3cc..532600a 100644 --- a/zcash-android-wallet-app/app/src/main/java/cash/z/android/wallet/ui/fragment/HomeFragment.kt +++ b/zcash-android-wallet-app/app/src/main/java/cash/z/android/wallet/ui/fragment/HomeFragment.kt @@ -26,6 +26,7 @@ import cash.z.android.wallet.sample.SampleProperties import cash.z.android.wallet.ui.adapter.TransactionAdapter import cash.z.android.wallet.ui.presenter.HomePresenter import cash.z.android.wallet.ui.util.AlternatingRowColorDecoration +import cash.z.android.wallet.ui.util.AnimatorCompleteListener import cash.z.android.wallet.ui.util.LottieLooper import cash.z.android.wallet.ui.util.TopAlignedSpan import cash.z.wallet.sdk.dao.WalletTransaction @@ -93,11 +94,8 @@ class HomeFragment : BaseFragment(), SwipeRefreshLayout.OnRefreshListener, HomeP override fun onActivityCreated(savedInstanceState: Bundle?) { super.onActivityCreated(savedInstanceState) - with(mainActivity) { - setSupportActionBar(binding.includeHeader.homeToolbar) - setupNavigation() - supportActionBar?.setTitle(R.string.destination_title_home) - } + mainActivity.setToolbarShown(false) + mainActivity.setDrawerLocked(false) initFab() homePresenter = HomePresenter(this, mainActivity.synchronizer) @@ -162,9 +160,6 @@ class HomeFragment : BaseFragment(), SwipeRefreshLayout.OnRefreshListener, HomeP - - - //TODO: pull some of this logic into the presenter, particularly the part that deals with ZEC <-> USD price conversion override fun updateBalance(old: Long, new: Long) { val zecValue = new.convertZatoshiToZec() @@ -176,7 +171,9 @@ class HomeFragment : BaseFragment(), SwipeRefreshLayout.OnRefreshListener, HomeP override fun setTransactions(transactions: List) { with (binding.includeContent.recyclerTransactions) { - (adapter as TransactionAdapter).submitList(transactions) + (adapter as TransactionAdapter).submitList(transactions.sortedByDescending { + it.timeInSeconds + }) postDelayed({ smoothScrollToPosition(0) }, 100L) @@ -242,23 +239,27 @@ class HomeFragment : BaseFragment(), SwipeRefreshLayout.OnRefreshListener, HomeP } private fun updatePrimaryTransaction(transaction: ActiveTransaction, transactionState: TransactionState) { - setActiveTransactionsShown(true) + Log.e("TWIG", "setting transaction state to ${transactionState::class.simpleName}") var title = binding.includeContent.textActiveTransactionTitle.text?.toString() ?: "" var subtitle = binding.includeContent.textActiveTransactionSubtitle.text?.toString() ?: "" + var isShown = binding.includeContent.textActiveTransactionHeader.visibility == View.VISIBLE when (transactionState) { TransactionState.Creating -> { binding.includeContent.headerActiveTransaction.visibility = View.VISIBLE title = "Preparing ${transaction.value.convertZatoshiToZecString(3)} ZEC" - subtitle = "to ${(transaction as ActiveSendTransaction).toAddress}" + subtitle = "to ${(transaction as ActiveSendTransaction).toAddress.truncate()}" setTransactionActive(transaction, true) + isShown = true } TransactionState.SendingToNetwork -> { title = "Sending Transaction" - subtitle = "to ${(transaction as ActiveSendTransaction).toAddress}" - binding.includeContent.textActiveTransactionValue.text = "${transaction.value/1000L}" + subtitle = "to ${(transaction as ActiveSendTransaction).toAddress.truncate()}" + binding.includeContent.textActiveTransactionValue.text = "${transaction.value.convertZatoshiToZecString(3)}" binding.includeContent.textActiveTransactionValue.visibility = View.VISIBLE binding.includeContent.buttonActiveTransactionCancel.visibility = View.GONE + setTransactionActive(transaction, true) + isShown = true } is TransactionState.Failure -> { binding.includeContent.lottieActiveTransaction.setAnimation(R.raw.lottie_send_failure) @@ -283,21 +284,25 @@ class HomeFragment : BaseFragment(), SwipeRefreshLayout.OnRefreshListener, HomeP binding.includeContent.textActiveTransactionValue.text = transaction.value.convertZatoshiToZecString(3) binding.includeContent.textActiveTransactionValue.visibility = View.VISIBLE binding.includeContent.buttonActiveTransactionCancel.visibility = View.GONE + } else if (transactionState.confirmationCount > 1) { + isShown = false } else { title = "Confirmation Received" subtitle = "Today at 2:12pm" // take it out of the list in a bit and skip counting confirmation animation for now (i.e. one is enough) - setActiveTransactionsShown(false, 3000L) + setActiveTransactionsShown(false, 5000L) } } is TransactionState.Cancelled -> { title = binding.includeContent.textActiveTransactionTitle.text.toString() subtitle = binding.includeContent.textActiveTransactionSubtitle.text.toString() setTransactionActive(transaction, false) + setActiveTransactionsShown(false, 10000L) } } binding.includeContent.textActiveTransactionTitle.text = title binding.includeContent.textActiveTransactionSubtitle.text = subtitle + setActiveTransactionsShown(isShown) } @@ -306,9 +311,10 @@ class HomeFragment : BaseFragment(), SwipeRefreshLayout.OnRefreshListener, HomeP // private fun setActiveTransactionsShown(isShown: Boolean, delay: Long = 0L) { - Log.e("TWIG-a", "setActiveTransactionsShown: $isShown") binding.includeContent.headerActiveTransaction.postDelayed({ - binding.includeContent.groupActiveTransactionItems.visibility = if (isShown) View.VISIBLE else View.GONE + binding.includeContent.headerActiveTransaction.animate().alpha(if(isShown) 1f else 0f).setDuration(250).setListener( + AnimatorCompleteListener{ binding.includeContent.groupActiveTransactionItems.visibility = if (isShown) View.VISIBLE else View.GONE } + ) }, delay) } @@ -377,17 +383,7 @@ class HomeFragment : BaseFragment(), SwipeRefreshLayout.OnRefreshListener, HomeP } speedDial.setOnActionSelectedListener { item -> - if (item.id == R.id.fab_request) { - Toaster.short("off!") - setActiveTransactionsShown(false) -// setRefreshAnimationPlaying(false) - } else if (item.id == R.id.fab_receive) { - Toaster.short("on!") - setActiveTransactionsShown(true) -// setRefreshAnimationPlaying(true) - } else { - HomeFab.fromId(item.id)?.destination?.apply { nav.navigate(this) } - } + HomeFab.fromId(item.id)?.destination?.apply { nav.navigate(this) } false } } @@ -404,8 +400,9 @@ class HomeFragment : BaseFragment(), SwipeRefreshLayout.OnRefreshListener, HomeP .create() } - private fun setUsdValue(valueString: String) { - val hairSpace = "\u200A" + private fun setUsdValue(value: String) { + val valueString = String.format("$ $value") +// val hairSpace = "\u200A" // val adjustedValue = "$$hairSpace$valueString" val textSpan = SpannableString(valueString) textSpan.setSpan(TopAlignedSpan(), 0, 2, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE) diff --git a/zcash-android-wallet-app/app/src/main/java/cash/z/android/wallet/ui/fragment/ImportFragment.kt b/zcash-android-wallet-app/app/src/main/java/cash/z/android/wallet/ui/fragment/ImportFragment.kt deleted file mode 100644 index 966147a..0000000 --- a/zcash-android-wallet-app/app/src/main/java/cash/z/android/wallet/ui/fragment/ImportFragment.kt +++ /dev/null @@ -1,13 +0,0 @@ -package cash.z.android.wallet.ui.fragment - -import dagger.Module -import dagger.android.ContributesAndroidInjector - - -class ImportFragment : PlaceholderFragment() - -@Module -abstract class ImportFragmentModule { - @ContributesAndroidInjector - abstract fun contributeImportFragment(): ImportFragment -} \ No newline at end of file diff --git a/zcash-android-wallet-app/app/src/main/java/cash/z/android/wallet/ui/fragment/PlaceholderFragment.kt b/zcash-android-wallet-app/app/src/main/java/cash/z/android/wallet/ui/fragment/PlaceholderFragment.kt index 5896c0c..65c1dd5 100644 --- a/zcash-android-wallet-app/app/src/main/java/cash/z/android/wallet/ui/fragment/PlaceholderFragment.kt +++ b/zcash-android-wallet-app/app/src/main/java/cash/z/android/wallet/ui/fragment/PlaceholderFragment.kt @@ -23,15 +23,4 @@ open class PlaceholderFragment : BaseFragment() { return inflater.inflate(R.layout.fragment_placeholder, container, false) } - - override fun onViewCreated(view: View, savedInstanceState: Bundle?) { - super.onViewCreated(view, savedInstanceState) - (activity as MainActivity).let { mainActivity -> - mainActivity.setSupportActionBar(view.findViewById(R.id.toolbar)) - mainActivity.supportActionBar?.setDisplayHomeAsUpEnabled(true) - mainActivity.supportActionBar?.setTitle(R.string.destination_title_placeholder) - } - } - - } diff --git a/zcash-android-wallet-app/app/src/main/java/cash/z/android/wallet/ui/fragment/ProgressFragment.kt b/zcash-android-wallet-app/app/src/main/java/cash/z/android/wallet/ui/fragment/ProgressFragment.kt new file mode 100644 index 0000000..3a11289 --- /dev/null +++ b/zcash-android-wallet-app/app/src/main/java/cash/z/android/wallet/ui/fragment/ProgressFragment.kt @@ -0,0 +1,53 @@ +package cash.z.android.wallet.ui.fragment + +import android.os.Bundle +import android.view.View +import android.widget.ProgressBar +import androidx.annotation.IdRes +import cash.z.android.wallet.ui.presenter.ProgressPresenter +import cash.z.android.wallet.ui.util.AnimatorCompleteListener +import kotlinx.coroutines.launch + +abstract class ProgressFragment(@IdRes private val progressBarId: Int) : BaseFragment(), + ProgressPresenter.ProgressView { + + private lateinit var progressPresenter: ProgressPresenter + private lateinit var progressBar: ProgressBar + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + progressBar = view.findViewById(progressBarId) + } + + override fun onActivityCreated(savedInstanceState: Bundle?) { + super.onActivityCreated(savedInstanceState) + progressPresenter = ProgressPresenter(this, mainActivity.synchronizer) + } + + override fun onResume() { + super.onResume() + launch { + progressPresenter.start() + } + } + + override fun onPause() { + super.onPause() + progressPresenter.stop() + } + + override fun showProgress(progress: Int) { + if (progress >= 100) { + onProgressComplete() + progressBar.animate().alpha(0.0f).apply { + duration = 250L + setListener(AnimatorCompleteListener { + progressBar.visibility = View.GONE + }) + } + } + progressBar.progress = progress + } + + open fun onProgressComplete() {} +} diff --git a/zcash-android-wallet-app/app/src/main/java/cash/z/android/wallet/ui/fragment/ReceiveFragment.kt b/zcash-android-wallet-app/app/src/main/java/cash/z/android/wallet/ui/fragment/ReceiveFragment.kt index ec1d16c..914c479 100644 --- a/zcash-android-wallet-app/app/src/main/java/cash/z/android/wallet/ui/fragment/ReceiveFragment.kt +++ b/zcash-android-wallet-app/app/src/main/java/cash/z/android/wallet/ui/fragment/ReceiveFragment.kt @@ -43,11 +43,6 @@ class ReceiveFragment : BaseFragment() { override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) - (activity as MainActivity).let { mainActivity -> - mainActivity.setSupportActionBar(view.findViewById(R.id.toolbar)) - mainActivity.supportActionBar?.setDisplayHomeAsUpEnabled(true) - mainActivity.supportActionBar?.setTitle(R.string.destination_title_receive) - } addressParts = arrayOf( text_address_part_1, text_address_part_2, diff --git a/zcash-android-wallet-app/app/src/main/java/cash/z/android/wallet/ui/fragment/RequestFragment.kt b/zcash-android-wallet-app/app/src/main/java/cash/z/android/wallet/ui/fragment/RequestFragment.kt index 4980ce7..0c8d3a6 100644 --- a/zcash-android-wallet-app/app/src/main/java/cash/z/android/wallet/ui/fragment/RequestFragment.kt +++ b/zcash-android-wallet-app/app/src/main/java/cash/z/android/wallet/ui/fragment/RequestFragment.kt @@ -49,12 +49,6 @@ class RequestFragment : BaseFragment() { return inflater.inflate(R.layout.fragment_request, container, false) } - override fun onViewCreated(view: View, savedInstanceState: Bundle?) { - super.onViewCreated(view, savedInstanceState) - (activity as MainActivity).setSupportActionBar(view.findViewById(R.id.toolbar)) - (activity as MainActivity).supportActionBar?.setDisplayHomeAsUpEnabled(true) - } - // TODO: Rename method, update argument and hook method into UI event fun onButtonPressed(uri: Uri) { listener?.onFragmentInteraction(uri) diff --git a/zcash-android-wallet-app/app/src/main/java/cash/z/android/wallet/ui/fragment/ScanFragment.kt b/zcash-android-wallet-app/app/src/main/java/cash/z/android/wallet/ui/fragment/ScanFragment.kt index d4b38d8..a7832f0 100644 --- a/zcash-android-wallet-app/app/src/main/java/cash/z/android/wallet/ui/fragment/ScanFragment.kt +++ b/zcash-android-wallet-app/app/src/main/java/cash/z/android/wallet/ui/fragment/ScanFragment.kt @@ -93,11 +93,7 @@ class ScanFragment : BaseFragment() { override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) - (activity as MainActivity).let { mainActivity -> - mainActivity.setSupportActionBar(view.findViewById(R.id.toolbar)) - mainActivity.supportActionBar?.setDisplayHomeAsUpEnabled(true) - mainActivity.supportActionBar?.setTitle(R.string.destination_title_send) - } + // binding.previewCameraSource.doOnLayout { // if (allPermissionsGranted()) { // createCameraSource(it.width, it.height) diff --git a/zcash-android-wallet-app/app/src/main/java/cash/z/android/wallet/ui/fragment/SendFragment.kt b/zcash-android-wallet-app/app/src/main/java/cash/z/android/wallet/ui/fragment/SendFragment.kt index 9bbce1e..d4ebd7e 100644 --- a/zcash-android-wallet-app/app/src/main/java/cash/z/android/wallet/ui/fragment/SendFragment.kt +++ b/zcash-android-wallet-app/app/src/main/java/cash/z/android/wallet/ui/fragment/SendFragment.kt @@ -69,11 +69,6 @@ class SendFragment : BaseFragment(), SendPresenter.SendView, ScanFragment.Barcod override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) - (activity as MainActivity).let { mainActivity -> - mainActivity.setSupportActionBar(view.findViewById(R.id.toolbar)) - mainActivity.supportActionBar?.setDisplayHomeAsUpEnabled(true) - mainActivity.supportActionBar?.setTitle(R.string.destination_title_send) - } init() } @@ -128,7 +123,7 @@ class SendFragment : BaseFragment(), SendPresenter.SendView, ScanFragment.Barcod binding.groupDialogSend.visibility = View.VISIBLE } - override fun updateBalance(old: Long, new: Long) { + override fun updateBalance(new: Long) { // TODO: use a formatted string resource here val availableTextSpan = "${new.convertZatoshiToZecString(8)} $zec Available".toSpannable() availableTextSpan.setSpan(ForegroundColorSpan(R.color.colorPrimary.toAppColor()), availableTextSpan.length - "Available".length, availableTextSpan.length, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE) diff --git a/zcash-android-wallet-app/app/src/main/java/cash/z/android/wallet/ui/fragment/SyncFragment.kt b/zcash-android-wallet-app/app/src/main/java/cash/z/android/wallet/ui/fragment/SyncFragment.kt new file mode 100644 index 0000000..1d16b95 --- /dev/null +++ b/zcash-android-wallet-app/app/src/main/java/cash/z/android/wallet/ui/fragment/SyncFragment.kt @@ -0,0 +1,64 @@ +package cash.z.android.wallet.ui.fragment + +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.databinding.DataBindingUtil +import cash.z.android.wallet.R +import cash.z.android.wallet.databinding.FragmentSyncBinding +import dagger.Module +import dagger.android.ContributesAndroidInjector + +class SyncFragment : ProgressFragment(R.id.progress_sync) { + + private lateinit var binding: FragmentSyncBinding + + // + // Lifecycle + // + + override fun onCreateView( + inflater: LayoutInflater, container: ViewGroup?, + savedInstanceState: Bundle? + ): View? { + return DataBindingUtil.inflate( + inflater, R.layout.fragment_sync, container, false + ).let { + binding = it + it.root + } + } + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + binding.buttonNext.setOnClickListener { + mainActivity.navController.navigate(R.id.nav_home_fragment) + } + } + + override fun onResume() { + super.onResume() + mainActivity.setDrawerLocked(true) + mainActivity.setToolbarShown(true) + } + + override fun onProgressComplete() { + super.onProgressComplete() + binding.textProgressSync.visibility = View.GONE + with (binding.buttonNext) { + isEnabled = true + alpha = 0.3f + animate().alpha(1.0f).duration = 300L + text = "Start" + } + } + +} + +@Module +abstract class SyncFragmentModule { + + @ContributesAndroidInjector + abstract fun contributeSyncFragment(): SyncFragment +} \ No newline at end of file diff --git a/zcash-android-wallet-app/app/src/main/java/cash/z/android/wallet/ui/fragment/WelcomeFragment.kt b/zcash-android-wallet-app/app/src/main/java/cash/z/android/wallet/ui/fragment/WelcomeFragment.kt new file mode 100644 index 0000000..b956ef8 --- /dev/null +++ b/zcash-android-wallet-app/app/src/main/java/cash/z/android/wallet/ui/fragment/WelcomeFragment.kt @@ -0,0 +1,123 @@ +package cash.z.android.wallet.ui.fragment + +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.databinding.DataBindingUtil +import androidx.navigation.fragment.FragmentNavigatorExtras +import cash.z.android.wallet.R +import cash.z.android.wallet.databinding.FragmentWelcomeBinding +import dagger.Module +import dagger.android.ContributesAndroidInjector +import kotlinx.coroutines.coroutineScope +import kotlinx.coroutines.launch +import android.graphics.Bitmap +import android.R.attr.top +import android.R.attr.left +import android.graphics.RectF +import android.os.Parcelable +import androidx.core.app.ActivityCompat.setExitSharedElementCallback +import android.graphics.Canvas +import android.graphics.Matrix +import android.util.Log +import androidx.core.app.SharedElementCallback +import androidx.transition.TransitionInflater +import cash.z.android.wallet.ui.presenter.ProgressPresenter +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.withContext + + +class WelcomeFragment : ProgressFragment(R.id.progress_welcome) { + + private lateinit var binding: FragmentWelcomeBinding + private lateinit var progressPresenter: ProgressPresenter + + // + // Lifecycle + // + + override fun onCreateView( + inflater: LayoutInflater, container: ViewGroup?, + savedInstanceState: Bundle? + ): View? { + setupSharedElementTransitions() + return DataBindingUtil.inflate( + inflater, R.layout.fragment_welcome, container, false + ).let { + binding = it + it.root + } + } + + override fun onActivityCreated(savedInstanceState: Bundle?) { + super.onActivityCreated(savedInstanceState) + view!!.postDelayed({ + launch { + onNext() + } + }, 2000L) + +// this.setExitSharedElementCallback(object : SharedElementCallback() { +// override fun onCaptureSharedElementSnapshot( +// sharedElement: View, +// viewToGlobalMatrix: Matrix, +// screenBounds: RectF +// ): Parcelable? { +// val width = Math.round(screenBounds.width()) +// val height = Math.round(screenBounds.height()) +// var bitmap: Bitmap? = null +// if (width > 0 && height > 0) { +// val matrix = Matrix() +// matrix.set(viewToGlobalMatrix) +// matrix.postTranslate(screenBounds.left, screenBounds.top) +// bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888) +// val canvas = Canvas(bitmap) +// canvas.concat(matrix) +// sharedElement.draw(canvas) +// } +// return bitmap +// } +// }) + } + + override fun onResume() { + super.onResume() + mainActivity.setDrawerLocked(true) + mainActivity.setToolbarShown(false) + } + + private fun setupSharedElementTransitions() { + TransitionInflater.from(mainActivity).inflateTransition(R.transition.transition_zec_sent).apply { + duration = 2500L + this@WelcomeFragment.sharedElementReturnTransition = this + } + } + private suspend fun onNext() = coroutineScope { + val isFirstRun = mainActivity.synchronizer.isFirstRun() + val destination = if (isFirstRun) R.id.nav_firstrun_fragment else R.id.nav_sync_fragment + +// var extras = with(binding) { +// listOf(progressWelcome, textProgressWelcome) +// .map { it to it.transitionName } +// .let { FragmentNavigatorExtras(*it.toTypedArray()) } +// } + val extras = FragmentNavigatorExtras( + binding.progressWelcome to binding.progressWelcome.transitionName + ) + mainActivity.navController.navigate( + destination, + null, + null, + extras + ) + } + +} + +@Module +abstract class WelcomeFragmentModule { + + @ContributesAndroidInjector + abstract fun contributeWelcomeFragment(): WelcomeFragment +} \ No newline at end of file diff --git a/zcash-android-wallet-app/app/src/main/java/cash/z/android/wallet/ui/presenter/ProgressPresenter.kt b/zcash-android-wallet-app/app/src/main/java/cash/z/android/wallet/ui/presenter/ProgressPresenter.kt new file mode 100644 index 0000000..d05e1c6 --- /dev/null +++ b/zcash-android-wallet-app/app/src/main/java/cash/z/android/wallet/ui/presenter/ProgressPresenter.kt @@ -0,0 +1,50 @@ +package cash.z.android.wallet.ui.presenter + +import cash.z.android.wallet.ui.presenter.Presenter.PresenterView +import cash.z.wallet.sdk.data.Synchronizer +import cash.z.wallet.sdk.data.Twig +import cash.z.wallet.sdk.data.twig +import kotlinx.coroutines.* +import kotlinx.coroutines.channels.ReceiveChannel +import kotlin.coroutines.CoroutineContext + +class ProgressPresenter( + private val view: ProgressView, + private val synchronizer: Synchronizer +) : Presenter, CoroutineScope { + + private val job = Job() + override val coroutineContext: CoroutineContext get() = Dispatchers.Main + job + + interface ProgressView : PresenterView { + fun showProgress(progress: Int) + } + + // + // LifeCycle + // + + override suspend fun start() { + Twig.sprout("ProgressPresenter") + twig("starting") + launchProgressMonitor(synchronizer.progress()) + } + + override fun stop() { + Twig.clip("ProgressPresenter") + twig("stopping") + } + + private fun CoroutineScope.launchProgressMonitor(channel: ReceiveChannel) = launch { + twig("progress monitor starting on thread ${Thread.currentThread().name}!") + for (i in channel) { + bind(i) + } + twig("progress monitor exiting!") + } + + private fun bind(progress: Int) = launch { + twig("binding progress of $progress on thread ${Thread.currentThread().name}!") + view.showProgress(progress) + } +} \ No newline at end of file diff --git a/zcash-android-wallet-app/app/src/main/java/cash/z/android/wallet/ui/presenter/SendPresenter.kt b/zcash-android-wallet-app/app/src/main/java/cash/z/android/wallet/ui/presenter/SendPresenter.kt index 304f971..067dc6f 100644 --- a/zcash-android-wallet-app/app/src/main/java/cash/z/android/wallet/ui/presenter/SendPresenter.kt +++ b/zcash-android-wallet-app/app/src/main/java/cash/z/android/wallet/ui/presenter/SendPresenter.kt @@ -4,6 +4,7 @@ import android.util.Log import cash.z.android.wallet.sample.SampleProperties import cash.z.android.wallet.ui.presenter.Presenter.PresenterView import cash.z.wallet.sdk.data.Synchronizer +import cash.z.wallet.sdk.data.twig import cash.z.wallet.sdk.ext.* import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.GlobalScope @@ -18,7 +19,7 @@ class SendPresenter( ) : Presenter { interface SendView : PresenterView { - fun updateBalance(old: Long, new: Long) + fun updateBalance(new: Long) fun setHeaders(isUsdSelected: Boolean, headerString: String, subheaderString: String) fun setHeaderValue(usdString: String) fun setSubheaderValue(usdString: String, isUsdSelected: Boolean) @@ -148,10 +149,8 @@ class SendPresenter( fun bind(newZecBalance: Long) { if (newZecBalance >= 0) { - Log.e("@TWIG-v", "binding balance of $newZecBalance") - val old = sendUiModel.zecValue - sendUiModel = sendUiModel.copy(zecValue = newZecBalance) - view.updateBalance(old ?: 0L, newZecBalance) + twig("binding balance of $newZecBalance") + view.updateBalance(newZecBalance) } } diff --git a/zcash-android-wallet-app/app/src/main/java/cash/z/android/wallet/ui/util/AnimatorCompleteListener.kt b/zcash-android-wallet-app/app/src/main/java/cash/z/android/wallet/ui/util/AnimatorCompleteListener.kt new file mode 100644 index 0000000..dbf58ca --- /dev/null +++ b/zcash-android-wallet-app/app/src/main/java/cash/z/android/wallet/ui/util/AnimatorCompleteListener.kt @@ -0,0 +1,18 @@ +package cash.z.android.wallet.ui.util + +import android.animation.Animator + +class AnimatorCompleteListener(val block: (Animator) -> Unit) : Animator.AnimatorListener { + override fun onAnimationRepeat(animation: Animator?) { + } + + override fun onAnimationEnd(animation: Animator) { + block(animation) + } + + override fun onAnimationStart(animation: Animator?) { + } + + override fun onAnimationCancel(animation: Animator?) { + } +} \ No newline at end of file diff --git a/zcash-android-wallet-app/app/src/main/res/drawable-hdpi/ic_first_run.png b/zcash-android-wallet-app/app/src/main/res/drawable-hdpi/ic_first_run.png new file mode 100755 index 0000000..3c4685c Binary files /dev/null and b/zcash-android-wallet-app/app/src/main/res/drawable-hdpi/ic_first_run.png differ diff --git a/zcash-android-wallet-app/app/src/main/res/drawable-hdpi/ic_sync.png b/zcash-android-wallet-app/app/src/main/res/drawable-hdpi/ic_sync.png new file mode 100755 index 0000000..c7a09b9 Binary files /dev/null and b/zcash-android-wallet-app/app/src/main/res/drawable-hdpi/ic_sync.png differ diff --git a/zcash-android-wallet-app/app/src/main/res/drawable-mdpi/ic_first_run.png b/zcash-android-wallet-app/app/src/main/res/drawable-mdpi/ic_first_run.png new file mode 100755 index 0000000..dff8153 Binary files /dev/null and b/zcash-android-wallet-app/app/src/main/res/drawable-mdpi/ic_first_run.png differ diff --git a/zcash-android-wallet-app/app/src/main/res/drawable-mdpi/ic_sync.png b/zcash-android-wallet-app/app/src/main/res/drawable-mdpi/ic_sync.png new file mode 100755 index 0000000..4cd3b5d Binary files /dev/null and b/zcash-android-wallet-app/app/src/main/res/drawable-mdpi/ic_sync.png differ diff --git a/zcash-android-wallet-app/app/src/main/res/drawable-xhdpi/ic_first_run.png b/zcash-android-wallet-app/app/src/main/res/drawable-xhdpi/ic_first_run.png new file mode 100755 index 0000000..f7da99d Binary files /dev/null and b/zcash-android-wallet-app/app/src/main/res/drawable-xhdpi/ic_first_run.png differ diff --git a/zcash-android-wallet-app/app/src/main/res/drawable-xhdpi/ic_sync.png b/zcash-android-wallet-app/app/src/main/res/drawable-xhdpi/ic_sync.png new file mode 100755 index 0000000..ff624a9 Binary files /dev/null and b/zcash-android-wallet-app/app/src/main/res/drawable-xhdpi/ic_sync.png differ diff --git a/zcash-android-wallet-app/app/src/main/res/drawable-xxhdpi/ic_first_run.png b/zcash-android-wallet-app/app/src/main/res/drawable-xxhdpi/ic_first_run.png new file mode 100755 index 0000000..34786c0 Binary files /dev/null and b/zcash-android-wallet-app/app/src/main/res/drawable-xxhdpi/ic_first_run.png differ diff --git a/zcash-android-wallet-app/app/src/main/res/drawable-xxhdpi/ic_sync.png b/zcash-android-wallet-app/app/src/main/res/drawable-xxhdpi/ic_sync.png new file mode 100755 index 0000000..45abaa3 Binary files /dev/null and b/zcash-android-wallet-app/app/src/main/res/drawable-xxhdpi/ic_sync.png differ diff --git a/zcash-android-wallet-app/app/src/main/res/drawable-xxxhdpi/ic_first_run.png b/zcash-android-wallet-app/app/src/main/res/drawable-xxxhdpi/ic_first_run.png new file mode 100755 index 0000000..afc96b1 Binary files /dev/null and b/zcash-android-wallet-app/app/src/main/res/drawable-xxxhdpi/ic_first_run.png differ diff --git a/zcash-android-wallet-app/app/src/main/res/drawable-xxxhdpi/ic_sync.png b/zcash-android-wallet-app/app/src/main/res/drawable-xxxhdpi/ic_sync.png new file mode 100755 index 0000000..9b1defa Binary files /dev/null and b/zcash-android-wallet-app/app/src/main/res/drawable-xxxhdpi/ic_sync.png differ diff --git a/zcash-android-wallet-app/app/src/main/res/drawable/background_selector_primary_button.xml b/zcash-android-wallet-app/app/src/main/res/drawable/background_selector_primary_button.xml new file mode 100644 index 0000000..332dcc7 --- /dev/null +++ b/zcash-android-wallet-app/app/src/main/res/drawable/background_selector_primary_button.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/zcash-android-wallet-app/app/src/main/res/drawable-v21/ic_add_black_24dp.xml b/zcash-android-wallet-app/app/src/main/res/drawable/ic_add_black_24dp.xml similarity index 100% rename from zcash-android-wallet-app/app/src/main/res/drawable-v21/ic_add_black_24dp.xml rename to zcash-android-wallet-app/app/src/main/res/drawable/ic_add_black_24dp.xml diff --git a/zcash-android-wallet-app/app/src/main/res/drawable-v21/ic_add_white_24dp.xml b/zcash-android-wallet-app/app/src/main/res/drawable/ic_add_white_24dp.xml similarity index 100% rename from zcash-android-wallet-app/app/src/main/res/drawable-v21/ic_add_white_24dp.xml rename to zcash-android-wallet-app/app/src/main/res/drawable/ic_add_white_24dp.xml diff --git a/zcash-android-wallet-app/app/src/main/res/drawable-v21/ic_chat_24dp.xml b/zcash-android-wallet-app/app/src/main/res/drawable/ic_chat_24dp.xml similarity index 100% rename from zcash-android-wallet-app/app/src/main/res/drawable-v21/ic_chat_24dp.xml rename to zcash-android-wallet-app/app/src/main/res/drawable/ic_chat_24dp.xml diff --git a/zcash-android-wallet-app/app/src/main/res/drawable/ic_hamburger.xml b/zcash-android-wallet-app/app/src/main/res/drawable/ic_hamburger.xml new file mode 100644 index 0000000..de103a6 --- /dev/null +++ b/zcash-android-wallet-app/app/src/main/res/drawable/ic_hamburger.xml @@ -0,0 +1,5 @@ + + + diff --git a/zcash-android-wallet-app/app/src/main/res/drawable-v21/ic_history_24dp.xml b/zcash-android-wallet-app/app/src/main/res/drawable/ic_history_24dp.xml similarity index 100% rename from zcash-android-wallet-app/app/src/main/res/drawable-v21/ic_history_24dp.xml rename to zcash-android-wallet-app/app/src/main/res/drawable/ic_history_24dp.xml diff --git a/zcash-android-wallet-app/app/src/main/res/drawable-v21/ic_home_24dp.xml b/zcash-android-wallet-app/app/src/main/res/drawable/ic_home_24dp.xml similarity index 100% rename from zcash-android-wallet-app/app/src/main/res/drawable-v21/ic_home_24dp.xml rename to zcash-android-wallet-app/app/src/main/res/drawable/ic_home_24dp.xml diff --git a/zcash-android-wallet-app/app/src/main/res/drawable-v21/ic_import.xml b/zcash-android-wallet-app/app/src/main/res/drawable/ic_import.xml similarity index 100% rename from zcash-android-wallet-app/app/src/main/res/drawable-v21/ic_import.xml rename to zcash-android-wallet-app/app/src/main/res/drawable/ic_import.xml diff --git a/zcash-android-wallet-app/app/src/main/res/drawable-v21/ic_menu_camera.xml b/zcash-android-wallet-app/app/src/main/res/drawable/ic_menu_camera.xml similarity index 100% rename from zcash-android-wallet-app/app/src/main/res/drawable-v21/ic_menu_camera.xml rename to zcash-android-wallet-app/app/src/main/res/drawable/ic_menu_camera.xml diff --git a/zcash-android-wallet-app/app/src/main/res/drawable-v21/ic_menu_gallery.xml b/zcash-android-wallet-app/app/src/main/res/drawable/ic_menu_gallery.xml similarity index 100% rename from zcash-android-wallet-app/app/src/main/res/drawable-v21/ic_menu_gallery.xml rename to zcash-android-wallet-app/app/src/main/res/drawable/ic_menu_gallery.xml diff --git a/zcash-android-wallet-app/app/src/main/res/drawable-v21/ic_menu_manage.xml b/zcash-android-wallet-app/app/src/main/res/drawable/ic_menu_manage.xml similarity index 100% rename from zcash-android-wallet-app/app/src/main/res/drawable-v21/ic_menu_manage.xml rename to zcash-android-wallet-app/app/src/main/res/drawable/ic_menu_manage.xml diff --git a/zcash-android-wallet-app/app/src/main/res/drawable-v21/ic_menu_send.xml b/zcash-android-wallet-app/app/src/main/res/drawable/ic_menu_send.xml similarity index 100% rename from zcash-android-wallet-app/app/src/main/res/drawable-v21/ic_menu_send.xml rename to zcash-android-wallet-app/app/src/main/res/drawable/ic_menu_send.xml diff --git a/zcash-android-wallet-app/app/src/main/res/drawable-v21/ic_menu_share.xml b/zcash-android-wallet-app/app/src/main/res/drawable/ic_menu_share.xml similarity index 100% rename from zcash-android-wallet-app/app/src/main/res/drawable-v21/ic_menu_share.xml rename to zcash-android-wallet-app/app/src/main/res/drawable/ic_menu_share.xml diff --git a/zcash-android-wallet-app/app/src/main/res/drawable-v21/ic_menu_slideshow.xml b/zcash-android-wallet-app/app/src/main/res/drawable/ic_menu_slideshow.xml similarity index 100% rename from zcash-android-wallet-app/app/src/main/res/drawable-v21/ic_menu_slideshow.xml rename to zcash-android-wallet-app/app/src/main/res/drawable/ic_menu_slideshow.xml diff --git a/zcash-android-wallet-app/app/src/main/res/drawable-v21/ic_qrcode_24dp.xml b/zcash-android-wallet-app/app/src/main/res/drawable/ic_qrcode_24dp.xml similarity index 100% rename from zcash-android-wallet-app/app/src/main/res/drawable-v21/ic_qrcode_24dp.xml rename to zcash-android-wallet-app/app/src/main/res/drawable/ic_qrcode_24dp.xml diff --git a/zcash-android-wallet-app/app/src/main/res/drawable-v21/ic_receipt_24dp.xml b/zcash-android-wallet-app/app/src/main/res/drawable/ic_receipt_24dp.xml similarity index 100% rename from zcash-android-wallet-app/app/src/main/res/drawable-v21/ic_receipt_24dp.xml rename to zcash-android-wallet-app/app/src/main/res/drawable/ic_receipt_24dp.xml diff --git a/zcash-android-wallet-app/app/src/main/res/drawable-v21/ic_settings_24dp.xml b/zcash-android-wallet-app/app/src/main/res/drawable/ic_settings_24dp.xml similarity index 100% rename from zcash-android-wallet-app/app/src/main/res/drawable-v21/ic_settings_24dp.xml rename to zcash-android-wallet-app/app/src/main/res/drawable/ic_settings_24dp.xml diff --git a/zcash-android-wallet-app/app/src/main/res/drawable-v21/ic_zcash_logo_white.xml b/zcash-android-wallet-app/app/src/main/res/drawable/ic_zcash_logo_white.xml similarity index 100% rename from zcash-android-wallet-app/app/src/main/res/drawable-v21/ic_zcash_logo_white.xml rename to zcash-android-wallet-app/app/src/main/res/drawable/ic_zcash_logo_white.xml diff --git a/zcash-android-wallet-app/app/src/main/res/drawable/ic_zcashlogo.xml b/zcash-android-wallet-app/app/src/main/res/drawable/ic_zcashlogo.xml new file mode 100644 index 0000000..8e682d1 --- /dev/null +++ b/zcash-android-wallet-app/app/src/main/res/drawable/ic_zcashlogo.xml @@ -0,0 +1,64 @@ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/zcash-android-wallet-app/app/src/main/res/drawable-v21/ic_zcashlogo_badge.xml b/zcash-android-wallet-app/app/src/main/res/drawable/ic_zcashlogo_badge.xml similarity index 100% rename from zcash-android-wallet-app/app/src/main/res/drawable-v21/ic_zcashlogo_badge.xml rename to zcash-android-wallet-app/app/src/main/res/drawable/ic_zcashlogo_badge.xml diff --git a/zcash-android-wallet-app/app/src/main/res/layout/activity_main.xml b/zcash-android-wallet-app/app/src/main/res/layout/activity_main.xml index 937eda4..cbc256b 100644 --- a/zcash-android-wallet-app/app/src/main/res/layout/activity_main.xml +++ b/zcash-android-wallet-app/app/src/main/res/layout/activity_main.xml @@ -1,28 +1,41 @@ - + xmlns:tools="http://schemas.android.com/tools"> - - - + tools:openDrawer="start"> - + + + + + + + + + + + diff --git a/zcash-android-wallet-app/app/src/main/res/layout/fragment_firstrun.xml b/zcash-android-wallet-app/app/src/main/res/layout/fragment_firstrun.xml new file mode 100644 index 0000000..fab808a --- /dev/null +++ b/zcash-android-wallet-app/app/src/main/res/layout/fragment_firstrun.xml @@ -0,0 +1,96 @@ + + + + + + + + + + + + + + + + + + + +