diff --git a/app/src/main/java/me/gilo/wc/Config.java b/app/src/main/java/me/gilo/wc/Config.java new file mode 100644 index 0000000..6c201b8 --- /dev/null +++ b/app/src/main/java/me/gilo/wc/Config.java @@ -0,0 +1,10 @@ +package me.gilo.wc; + +public class Config { + public static String currencySymbol = "Ksh."; + + public static String siteUrl = "http://192.168.100.61/shop/index.php"; + public static String consumerKey = "ck_da34628a4a69128001876492b842be4cd3c76bf8"; + public static String consumerSecret = "cs_c3c70248288a60bc21a0cddc81acdc018df1632d"; + +} diff --git a/app/src/main/java/me/gilo/wc/di/AppModule.java b/app/src/main/java/me/gilo/wc/di/AppModule.java index f752045..e30c104 100644 --- a/app/src/main/java/me/gilo/wc/di/AppModule.java +++ b/app/src/main/java/me/gilo/wc/di/AppModule.java @@ -2,6 +2,7 @@ package me.gilo.wc.di; import dagger.Module; import dagger.Provides; +import me.gilo.wc.Config; import me.gilo.wc.WcApp; import me.gilo.woodroid.Woocommerce; @@ -26,10 +27,10 @@ public class AppModule { @Singleton Woocommerce providesWoocommerce() { Woocommerce woocommerce = Woocommerce.Builder() - .setSiteUrl("http://157.230.131.179") + .setSiteUrl(Config.siteUrl) .setApiVersion(Woocommerce.API_V3) - .setConsumerKey("ck_26c61abd7eeff238d87dc56585bf26cb2d1a1ec3") - .setConsumerSecret("cs_062e8e3a7ae0ce08fdebc0c39f8f834d5e87598e") + .setConsumerKey(Config.consumerKey) + .setConsumerSecret(Config.consumerSecret) .build(); return woocommerce; diff --git a/app/src/main/java/me/gilo/wc/repo/FirebaseUserRepository.java b/app/src/main/java/me/gilo/wc/repo/FirebaseUserRepository.java index dec741a..ff1f058 100644 --- a/app/src/main/java/me/gilo/wc/repo/FirebaseUserRepository.java +++ b/app/src/main/java/me/gilo/wc/repo/FirebaseUserRepository.java @@ -38,6 +38,11 @@ public class FirebaseUserRepository extends FirebaseRepository { } + public void logout() { + FirebaseAuth auth = FirebaseAuth.getInstance(); + auth.signOut(); + } + public CompletionGenericLiveData anonymousSignIn() { final CompletionGenericLiveData completion = new CompletionGenericLiveData(); diff --git a/app/src/main/java/me/gilo/wc/ui/checkout/CheckoutActivity.kt b/app/src/main/java/me/gilo/wc/ui/checkout/CheckoutActivity.kt index 82194f1..b0bc0bf 100644 --- a/app/src/main/java/me/gilo/wc/ui/checkout/CheckoutActivity.kt +++ b/app/src/main/java/me/gilo/wc/ui/checkout/CheckoutActivity.kt @@ -14,10 +14,6 @@ class CheckoutActivity : AppCompatActivity() { setContentView(R.layout.activity_checkout) setSupportActionBar(toolbar) - fab.setOnClickListener { view -> - Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG) - .setAction("Action", null).show() - } } } diff --git a/app/src/main/java/me/gilo/wc/ui/customer/BasicCustomerDetailsActivity.kt b/app/src/main/java/me/gilo/wc/ui/customer/BasicCustomerDetailsActivity.kt index bd25bc2..94dce72 100644 --- a/app/src/main/java/me/gilo/wc/ui/customer/BasicCustomerDetailsActivity.kt +++ b/app/src/main/java/me/gilo/wc/ui/customer/BasicCustomerDetailsActivity.kt @@ -22,11 +22,13 @@ import java.util.regex.Pattern class BasicCustomerDetailsActivity : WooDroidActivity() { - override lateinit var viewModel : CustomerViewModel + override lateinit var viewModel: CustomerViewModel private val pattern = Pattern.compile(EMAIL_PATTERN) private var matcher: Matcher? = null lateinit var customer: Customer + var newCustomer = false + override fun attachBaseContext(newBase: Context) { super.attachBaseContext(ViewPumpContextWrapper.wrap(newBase)) } @@ -38,22 +40,27 @@ class BasicCustomerDetailsActivity : WooDroidActivity() { viewModel = getViewModel(CustomerViewModel::class.java) title = "Basic Details" - customer() + customer() - flSave.setOnClickListener{save()} + flSave.setOnClickListener { + if (newCustomer) { + create() + } else { + save() + } + } } private fun customer() { - viewModel.currentCustomer().observe(this, Observer { - response-> - when (response!!.status()){ - Status.LOADING ->{ + viewModel.currentCustomer().observe(this, Observer { response -> + when (response!!.status()) { + Status.LOADING -> { showLoading("Retrieve customer details", "This will only take a short while") } - Status.SUCCESS ->{ + Status.SUCCESS -> { stopShowingLoading() customer = response.data()[0] @@ -62,15 +69,18 @@ class BasicCustomerDetailsActivity : WooDroidActivity() { etLastName.setText(customer.lastName) etUsername.setText(customer.username) + newCustomer = false } - Status.ERROR ->{ + Status.ERROR -> { stopShowingLoading() Toast.makeText(baseContext, response.error().message.toString(), Toast.LENGTH_LONG).show() } - Status.EMPTY ->{ + Status.EMPTY -> { stopShowingLoading() + + newCustomer = true } } @@ -81,7 +91,7 @@ class BasicCustomerDetailsActivity : WooDroidActivity() { private fun save() { if (validates()) { val email = etEmail.text.toString() - val firstName = etFirstName.text.toString() + val firstName = etFirstName.text.toString() val lastName = etLastName.text.toString() val username = etUsername.text.toString() @@ -90,24 +100,23 @@ class BasicCustomerDetailsActivity : WooDroidActivity() { customer.lastName = lastName customer.username = username - viewModel.update(customer.id, customer).observe(this, Observer { - response-> - when (response!!.status()){ - Status.LOADING ->{ + viewModel.update(customer.id, customer).observe(this, Observer { response -> + when (response!!.status()) { + Status.LOADING -> { showLoading("Uploading account details", "This will only take a short while") } - Status.SUCCESS ->{ + Status.SUCCESS -> { stopShowingLoading() finish() } - Status.ERROR ->{ + Status.ERROR -> { stopShowingLoading() Toast.makeText(baseContext, response.error().message.toString(), Toast.LENGTH_LONG).show() } - Status.EMPTY ->{ + Status.EMPTY -> { } @@ -115,6 +124,47 @@ class BasicCustomerDetailsActivity : WooDroidActivity() { }) + } else { + Toast.makeText(this, "Please correct the information entered", Toast.LENGTH_SHORT).show() + } + } + + private fun create() { + if (validates()) { + val email = etEmail.text.toString() + val firstName = etFirstName.text.toString() + val lastName = etLastName.text.toString() + val username = etUsername.text.toString() + + var customer = Customer() + customer.email = email + customer.firstName = firstName + customer.lastName = lastName + customer.username = username + + viewModel.create(customer).observe(this, Observer { response -> + when (response!!.status()) { + Status.LOADING -> { + showLoading("Uploading account details", "This will only take a short while") + } + + Status.SUCCESS -> { + stopShowingLoading() + finish() + } + + Status.ERROR -> { + stopShowingLoading() + Toast.makeText(baseContext, response.error().message.toString(), Toast.LENGTH_LONG).show() + } + + Status.EMPTY -> { + + } + + } + }) + } else { Toast.makeText(this, "Please correct the information entered", Toast.LENGTH_SHORT).show() @@ -130,9 +180,9 @@ class BasicCustomerDetailsActivity : WooDroidActivity() { var validation = true val email = tilEmail.editText!!.text.toString() - val firstName = etFirstName.text.toString() + val firstName = etFirstName.text.toString() val lastName = etLastName.text.toString() - val username = etUsername.text.toString() + val username = etUsername.text.toString() @@ -160,7 +210,8 @@ class BasicCustomerDetailsActivity : WooDroidActivity() { } companion object { - private const val EMAIL_PATTERN = "^[a-zA-Z0-9#_~!$&'()*+,;=:.\"(),:;<>@\\[\\]\\\\]+@[a-zA-Z0-9-]+(\\.[a-zA-Z0-9-]+)*$" + private const val EMAIL_PATTERN = + "^[a-zA-Z0-9#_~!$&'()*+,;=:.\"(),:;<>@\\[\\]\\\\]+@[a-zA-Z0-9-]+(\\.[a-zA-Z0-9-]+)*$" } } diff --git a/app/src/main/java/me/gilo/wc/ui/home/ProfileFragment.kt b/app/src/main/java/me/gilo/wc/ui/home/ProfileFragment.kt index f207833..e338852 100644 --- a/app/src/main/java/me/gilo/wc/ui/home/ProfileFragment.kt +++ b/app/src/main/java/me/gilo/wc/ui/home/ProfileFragment.kt @@ -12,12 +12,13 @@ import me.gilo.raison.ui.user.onboarding.SignUpActivity import me.gilo.wc.R import me.gilo.wc.ui.customer.ProfileActivity import me.gilo.wc.viewmodels.ProductViewModel +import me.gilo.wc.viewmodels.UserViewModel class ProfileFragment : Fragment() { - lateinit var viewModel: ProductViewModel + lateinit var viewModel: UserViewModel val TAG = "ProfileFragment" override fun onCreate(savedInstanceState: Bundle?) { @@ -37,6 +38,8 @@ class ProfileFragment : Fragment() { override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) + viewModel = (activity as HomeActivity).getViewModel(UserViewModel::class.java) + llMyProfile.setOnClickListener{ if (FirebaseAuth.getInstance().currentUser != null) { startActivity(Intent(activity, ProfileActivity::class.java)) @@ -45,6 +48,11 @@ class ProfileFragment : Fragment() { } } + llLogout.setOnClickListener{ + viewModel.logout() + startActivity(Intent(activity, SignUpActivity::class.java)) + } + } diff --git a/app/src/main/java/me/gilo/wc/ui/product/CartActivity.kt b/app/src/main/java/me/gilo/wc/ui/product/CartActivity.kt index 432ee77..3875706 100644 --- a/app/src/main/java/me/gilo/wc/ui/product/CartActivity.kt +++ b/app/src/main/java/me/gilo/wc/ui/product/CartActivity.kt @@ -1,16 +1,21 @@ package me.gilo.wc.ui.product +import android.arch.lifecycle.Observer import android.content.Context +import android.content.Intent import android.os.Bundle import android.support.v7.widget.LinearLayoutManager import android.text.SpannableString import android.view.View +import android.widget.Toast import com.google.common.primitives.UnsignedBytes.toInt import io.github.inflationx.viewpump.ViewPumpContextWrapper import kotlinx.android.synthetic.main.activity_cart.* import kotlinx.android.synthetic.main.content_cart.* +import kotlinx.android.synthetic.main.content_profile.* import kotlinx.android.synthetic.main.single_cart_item.* import kotlinx.android.synthetic.main.state_empty.* +import me.gilo.raison.ui.user.onboarding.SignUpActivity import me.gilo.wc.R import me.gilo.wc.adapter.CartAdapter import me.gilo.wc.common.Status @@ -20,6 +25,9 @@ import me.gilo.wc.events.ProductEvent import me.gilo.wc.models.CartLineItem import me.gilo.wc.ui.WooDroidActivity import me.gilo.wc.viewmodels.CartViewModel +import me.gilo.woodroid.models.Customer +import me.gilo.woodroid.models.LineItem +import me.gilo.woodroid.models.Order import org.greenrobot.eventbus.EventBus import org.greenrobot.eventbus.Subscribe import org.greenrobot.eventbus.ThreadMode @@ -31,6 +39,7 @@ class CartActivity : WooDroidActivity() { var cartItems: ArrayList = ArrayList() lateinit var adapter: CartAdapter + lateinit var customer: Customer override fun attachBaseContext(newBase: Context) { super.attachBaseContext(ViewPumpContextWrapper.wrap(newBase)) @@ -55,10 +64,13 @@ class CartActivity : WooDroidActivity() { rvCart.adapter = adapter cart() + customer() llEmptyState_layout.visibility = View.GONE + + } private fun cart() { @@ -97,6 +109,33 @@ class CartActivity : WooDroidActivity() { } + + private fun createOrder(order : Order) { + viewModel.createOrder(order).observe(this, android.arch.lifecycle.Observer { response -> + when (response!!.status()) { + Status.LOADING -> { + showLoading() + } + + Status.SUCCESS -> { + finish() + } + + Status.ERROR -> { + stopShowingLoading() + + toast("Something went wrong!") + } + + Status.EMPTY -> { + stopShowingLoading() + } + } + + }) + + } + private fun setUpPage() { var itemCount = cartItems.size var total = 0 @@ -120,8 +159,34 @@ class CartActivity : WooDroidActivity() { tvTotalItemCountTitle.text = "Items ($itemCount)" } - tvTotalItemCost.text = "$$total" - tvTotal.text = "$$total" + tvTotalItemCost.text = "Ksh$total" + tvTotal.text = "Ksh$total" + + flSave.setOnClickListener{ + prepOrder() + } + } + + private fun prepOrder() { + var order = Order() + + var lineitems = ArrayList() + + for (cartitem in cartItems){ + var lineItem = LineItem() + lineItem.price = cartitem.getPrice().toString() + lineItem.productId = cartitem.productId + lineItem.quantity = cartitem.quantity + + lineitems.add(lineItem); + } + + order.setLineItems(lineitems); + order.setBillingAddress(customer.billingAddress) + order.setShippingAddress(customer.shippingAddress) + order.setCustomer(customer) + + createOrder(order) } @@ -205,5 +270,32 @@ class CartActivity : WooDroidActivity() { } + private fun customer() { + viewModel.currentCustomer().observe(this, Observer { + response-> + when (response!!.status()){ + Status.LOADING ->{ + + } + + Status.SUCCESS ->{ + customer = response.data()[0] + + } + + Status.ERROR ->{ + Toast.makeText(baseContext, response.error().message.toString(), Toast.LENGTH_LONG).show() + } + + Status.EMPTY ->{ + startActivity(Intent(baseContext, SignUpActivity::class.java)) + finish() + } + + } + }) + + } + } diff --git a/app/src/main/java/me/gilo/wc/viewmodels/CartViewModel.java b/app/src/main/java/me/gilo/wc/viewmodels/CartViewModel.java index 7cd33a1..58437b5 100644 --- a/app/src/main/java/me/gilo/wc/viewmodels/CartViewModel.java +++ b/app/src/main/java/me/gilo/wc/viewmodels/CartViewModel.java @@ -8,11 +8,10 @@ import me.gilo.wc.common.QueryLiveData; import me.gilo.wc.common.WooLiveData; import me.gilo.wc.models.CartLineItem; import me.gilo.wc.repo.CartRepository; +import me.gilo.wc.repo.CustomerRepository; import me.gilo.wc.repo.OrderRepository; import me.gilo.wc.repo.ProductRepository; -import me.gilo.woodroid.models.LineItem; -import me.gilo.woodroid.models.Product; -import me.gilo.woodroid.models.ProductReview; +import me.gilo.woodroid.models.*; import me.gilo.woodroid.models.filters.ProductFilter; import javax.inject.Inject; @@ -23,10 +22,14 @@ import java.util.Map; public final class CartViewModel extends ViewModel { private final CartRepository cartRepository; + private final OrderRepository orderRepository; + private final CustomerRepository customerRepository; @Inject - CartViewModel(CartRepository cartRepository) { + CartViewModel(CartRepository cartRepository, OrderRepository orderRepository, CustomerRepository customerRepository) { this.cartRepository = cartRepository; + this.orderRepository = orderRepository; + this.customerRepository = customerRepository; } public CompletionGenericLiveData addToCart(Product product) { @@ -53,4 +56,12 @@ public final class CartViewModel extends ViewModel { return cartRepository.cart(context); } + public WooLiveData createOrder(Order order) { + return orderRepository.create(order); + } + + public WooLiveData> currentCustomer() { + return customerRepository.currentCustomer(); + } + } \ No newline at end of file diff --git a/app/src/main/java/me/gilo/wc/viewmodels/UserViewModel.java b/app/src/main/java/me/gilo/wc/viewmodels/UserViewModel.java index b2e85cf..7d3c314 100644 --- a/app/src/main/java/me/gilo/wc/viewmodels/UserViewModel.java +++ b/app/src/main/java/me/gilo/wc/viewmodels/UserViewModel.java @@ -29,6 +29,10 @@ public final class UserViewModel extends ViewModel { return firebaseUserRepository.login(username, password); } + public void logout() { + firebaseUserRepository.logout(); + } + public CompletionGenericLiveData anonymousSignIn() { return firebaseUserRepository.anonymousSignIn(); } diff --git a/app/src/main/res/drawable/baseline_cancel_24.xml b/app/src/main/res/drawable/baseline_cancel_24.xml new file mode 100755 index 0000000..8625b9c --- /dev/null +++ b/app/src/main/res/drawable/baseline_cancel_24.xml @@ -0,0 +1,10 @@ + + + diff --git a/app/src/main/res/layout/activity_cart.xml b/app/src/main/res/layout/activity_cart.xml index 6045bad..205ecfe 100644 --- a/app/src/main/res/layout/activity_cart.xml +++ b/app/src/main/res/layout/activity_cart.xml @@ -47,7 +47,7 @@ android:layout_height="wrap_content" android:layout_gravity="center_horizontal" android:background="@color/colorPrimary" - android:text="Proceed to checkout" + android:text="Place Order" android:padding="12dp" android:gravity="center" android:textAllCaps="false" diff --git a/app/src/main/res/layout/fragment_profile.xml b/app/src/main/res/layout/fragment_profile.xml index 81c9e6d..f675279 100644 --- a/app/src/main/res/layout/fragment_profile.xml +++ b/app/src/main/res/layout/fragment_profile.xml @@ -320,6 +320,65 @@ /> + + + + + + + + + + + + + + + + + + \ No newline at end of file