diff --git a/android/app/build.gradle b/android/app/build.gradle index 089caa3..99ced59 100644 --- a/android/app/build.gradle +++ b/android/app/build.gradle @@ -47,4 +47,5 @@ dependencies { implementation 'org.jetbrains.anko:anko-common:0.9' implementation 'com.github.bumptech.glide:glide:4.9.0' implementation 'com.google.zxing:core:3.3.3' + implementation 'com.journeyapps:zxing-android-embedded:3.6.0' } diff --git a/android/app/src/main/java/io/github/assis10t/bobandroid/OrdersActivity.kt b/android/app/src/main/java/io/github/assis10t/bobandroid/OrdersActivity.kt index 19776d4..a66dae9 100644 --- a/android/app/src/main/java/io/github/assis10t/bobandroid/OrdersActivity.kt +++ b/android/app/src/main/java/io/github/assis10t/bobandroid/OrdersActivity.kt @@ -1,5 +1,6 @@ package io.github.assis10t.bobandroid +import android.content.Intent import android.os.Bundle import android.support.v7.widget.CardView import android.support.v7.widget.LinearLayoutManager @@ -79,14 +80,20 @@ class OrdersActivity : ActivityWithLoginMenu() { vh.title.text = order.warehouse!!.name vh.timestamp.text = order.getTimeString() vh.container.setOnClickListener {v -> - Toast.makeText(vh.container.context, "TODO: Open order details dialog", Toast.LENGTH_SHORT).show() + ViewOrderDialog(v.context, order).show() } vh.status.text = when(order.status) { Order.Status.PENDING -> "Pending" Order.Status.IN_TRANSIT -> "In transit" - Order.Status.COMPLETE -> "Ready to collect" + Order.Status.COMPLETE -> "Ready" Order.Status.CANCELED -> "Canceled" } + vh.status.setTextColor(when(order.status) { + Order.Status.PENDING -> R.color.statusPending + Order.Status.IN_TRANSIT -> R.color.statusInTransit + Order.Status.COMPLETE -> R.color.statusReady + Order.Status.CANCELED -> R.color.statusCanceled + }) vh.summary.text = "${order.items.size} items" } diff --git a/android/app/src/main/java/io/github/assis10t/bobandroid/ViewCartDialog.kt b/android/app/src/main/java/io/github/assis10t/bobandroid/ViewCartDialog.kt index c873ddb..654461b 100644 --- a/android/app/src/main/java/io/github/assis10t/bobandroid/ViewCartDialog.kt +++ b/android/app/src/main/java/io/github/assis10t/bobandroid/ViewCartDialog.kt @@ -21,9 +21,14 @@ import timber.log.Timber class ViewCartDialog(context: Context, val warehouseId: String): Dialog(context) { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) - setContentView(R.layout.dialog_view_cart) val data = getCart(context) + if (data.isEmpty()) { + setContentView(R.layout.dialog_view_cart_empty) + return + } else { + setContentView(R.layout.dialog_view_cart) + } cart.layoutManager = LinearLayoutManager(context, LinearLayoutManager.VERTICAL, false) cart.adapter = CartAdapter(data) @@ -38,6 +43,11 @@ class ViewCartDialog(context: Context, val warehouseId: String): Dialog(context) total.text = "£${"%.2f".format(totalAmount)}" + clear.setOnClickListener { + clearCart(context) + dismiss() + } + complete_order.setOnClickListener { val order = Order.Factory() .items(data) diff --git a/android/app/src/main/java/io/github/assis10t/bobandroid/ViewOrderDialog.kt b/android/app/src/main/java/io/github/assis10t/bobandroid/ViewOrderDialog.kt new file mode 100644 index 0000000..541f2c4 --- /dev/null +++ b/android/app/src/main/java/io/github/assis10t/bobandroid/ViewOrderDialog.kt @@ -0,0 +1,75 @@ +package io.github.assis10t.bobandroid + +import android.app.Dialog +import android.content.Context +import android.content.Intent +import android.net.Uri +import android.os.Bundle +import android.support.v7.widget.LinearLayoutManager +import android.support.v7.widget.RecyclerView +import android.text.Editable +import android.text.TextWatcher +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.TextView +import android.widget.Toast +import io.github.assis10t.bobandroid.pojo.Item +import io.github.assis10t.bobandroid.pojo.Order +import kotlinx.android.synthetic.main.dialog_view_order.* +import org.w3c.dom.Text +import timber.log.Timber + +class ViewOrderDialog(context: Context, val order: Order): Dialog(context) { + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + setContentView(R.layout.dialog_view_order) + + cart.layoutManager = LinearLayoutManager(context, LinearLayoutManager.VERTICAL, false) + cart.adapter = ViewCartDialog.CartAdapter(order.items) + + warehouse_title.text = order.warehouse!!.name + status.text = when(order.status) { + Order.Status.PENDING -> "Pending" + Order.Status.IN_TRANSIT -> "In transit" + Order.Status.COMPLETE -> "Ready" + Order.Status.CANCELED -> "Canceled" + } + status.setTextColor(when(order.status) { + Order.Status.PENDING -> R.color.statusPending + Order.Status.IN_TRANSIT -> R.color.statusInTransit + Order.Status.COMPLETE -> R.color.statusReady + Order.Status.CANCELED -> R.color.statusCanceled + }) + + view_qr.visibility = + if (order.status == Order.Status.COMPLETE) + View.VISIBLE + else + View.VISIBLE //TODO: Change to View.GONE + + val totalAmount = + if (order.items.isEmpty()) + 0.0 + else + order.items + .map{ it.quantity!! * it.price } + .reduce { a, b -> a + b} + + total.text = "£${"%.2f".format(totalAmount)}" + + + view_qr.setOnClickListener { + ViewQRDialog(context, order).show() + } + + get_directions.setOnClickListener { + val location = order.warehouse!!.location!! + val intent = Intent( + Intent.ACTION_VIEW, + Uri.parse("https://www.google.com/maps/dir/?api=1&destination=${location.latitude},${location.longitude}") + ) + context.startActivity(intent) + } + } +} \ No newline at end of file diff --git a/android/app/src/main/java/io/github/assis10t/bobandroid/ViewQRDialog.kt b/android/app/src/main/java/io/github/assis10t/bobandroid/ViewQRDialog.kt new file mode 100644 index 0000000..6a76a25 --- /dev/null +++ b/android/app/src/main/java/io/github/assis10t/bobandroid/ViewQRDialog.kt @@ -0,0 +1,21 @@ +package io.github.assis10t.bobandroid + +import android.app.Dialog +import android.content.Context +import android.os.Bundle +import com.bumptech.glide.Glide +import io.github.assis10t.bobandroid.pojo.Order +import kotlinx.android.synthetic.main.dialog_view_qr.* + +class ViewQRDialog(context: Context, val order: Order): Dialog(context) { + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + setContentView(R.layout.dialog_view_qr) + + instructions.text = "Show this code to the cashier at ${order.warehouse!!.name}." + + Glide.with(context) + .load(generateQRCode(order._id!!)) + .into(qr) + } +} \ No newline at end of file diff --git a/android/app/src/main/java/io/github/assis10t/bobandroid/pojo/Warehouse.kt b/android/app/src/main/java/io/github/assis10t/bobandroid/pojo/Warehouse.kt index 71b67a8..498135b 100644 --- a/android/app/src/main/java/io/github/assis10t/bobandroid/pojo/Warehouse.kt +++ b/android/app/src/main/java/io/github/assis10t/bobandroid/pojo/Warehouse.kt @@ -11,8 +11,8 @@ class Warehouse ( ) { companion object { class Location( - latitude: Double = 0.0, - longitude: Double = 0.0 + val latitude: Double = 0.0, + val longitude: Double = 0.0 ) fun fromString(str: String) = Gson().fromJson(str, Warehouse::class.java) diff --git a/android/app/src/main/java/io/github/assis10t/bobandroid/utils.kt b/android/app/src/main/java/io/github/assis10t/bobandroid/utils.kt index 05741c1..3fb84df 100644 --- a/android/app/src/main/java/io/github/assis10t/bobandroid/utils.kt +++ b/android/app/src/main/java/io/github/assis10t/bobandroid/utils.kt @@ -2,9 +2,13 @@ package io.github.assis10t.bobandroid import android.content.Context import android.content.SharedPreferences +import android.graphics.Bitmap import android.util.TypedValue import android.provider.SyncStateContract.Helpers.update import android.util.Base64 +import com.google.zxing.BarcodeFormat +import com.google.zxing.MultiFormatWriter +import com.journeyapps.barcodescanner.BarcodeEncoder import io.github.assis10t.bobandroid.pojo.Item import timber.log.Timber import java.security.NoSuchAlgorithmException @@ -77,4 +81,9 @@ fun base64ToByteArray(str: String): ByteArray? { val pureStr = str.substring(str.indexOf(",")+1) val bytes = Base64.decode(pureStr, Base64.DEFAULT) return bytes +} + +fun generateQRCode(str: String): Bitmap { + val bitMatrix = MultiFormatWriter().encode(str, BarcodeFormat.QR_CODE, 300, 300) + return BarcodeEncoder().createBitmap(bitMatrix) } \ No newline at end of file diff --git a/android/app/src/main/res/drawable/ic_delete_black_24dp.xml b/android/app/src/main/res/drawable/ic_delete_black_24dp.xml new file mode 100644 index 0000000..39e64d6 --- /dev/null +++ b/android/app/src/main/res/drawable/ic_delete_black_24dp.xml @@ -0,0 +1,9 @@ + + + diff --git a/android/app/src/main/res/layout/dialog_view_cart.xml b/android/app/src/main/res/layout/dialog_view_cart.xml index bc0b68b..8950195 100644 --- a/android/app/src/main/res/layout/dialog_view_cart.xml +++ b/android/app/src/main/res/layout/dialog_view_cart.xml @@ -3,7 +3,7 @@ xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" style="@style/Widget.MaterialComponents.CardView" - android:layout_width="300dp" + android:layout_width="350dp" android:layout_height="wrap_content" app:cardElevation="8dp"> + + + + + + + \ No newline at end of file diff --git a/android/app/src/main/res/layout/dialog_view_order.xml b/android/app/src/main/res/layout/dialog_view_order.xml index f799671..23f08e4 100644 --- a/android/app/src/main/res/layout/dialog_view_order.xml +++ b/android/app/src/main/res/layout/dialog_view_order.xml @@ -3,40 +3,47 @@ xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" style="@style/Widget.MaterialComponents.CardView" - android:layout_width="300dp" + android:layout_width="350dp" android:layout_height="wrap_content" app:cardElevation="8dp"> - - - + android:text="Pending" + android:layout_alignParentEnd="true" + android:layout_margin="8dp" + android:layout_alignBaseline="@id/title" + android:textSize="16sp" + android:textColor="@color/statusPending" + /> + + android:layout_below="@id/warehouse_title"> - + android:orientation="horizontal" + android:layout_below="@id/footer"> + + + \ No newline at end of file diff --git a/android/app/src/main/res/layout/dialog_view_qr.xml b/android/app/src/main/res/layout/dialog_view_qr.xml new file mode 100644 index 0000000..9b0089d --- /dev/null +++ b/android/app/src/main/res/layout/dialog_view_qr.xml @@ -0,0 +1,27 @@ + + + + + + + \ No newline at end of file diff --git a/android/app/src/main/res/layout/fragment_orders_list_item.xml b/android/app/src/main/res/layout/fragment_orders_list_item.xml index 608283a..9244d8e 100644 --- a/android/app/src/main/res/layout/fragment_orders_list_item.xml +++ b/android/app/src/main/res/layout/fragment_orders_list_item.xml @@ -35,12 +35,14 @@ android:layout_below="@id/timestamp" /> + android:layout_centerVertical="true" + android:textSize="14sp" + android:textColor="@color/statusPending"/> \ No newline at end of file diff --git a/android/app/src/main/res/values/colors.xml b/android/app/src/main/res/values/colors.xml index f2b8831..93e4d2d 100644 --- a/android/app/src/main/res/values/colors.xml +++ b/android/app/src/main/res/values/colors.xml @@ -6,4 +6,8 @@ #FFFFFF #E0F2F1 #33000000 + #FFDD57 + #0053FF + #FF3860 + #23D160