diff --git a/app/build.gradle b/app/build.gradle index ccd18c8..23ad625 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -81,4 +81,8 @@ dependencies { implementation 'com.squareup.retrofit2:retrofit:2.3.0' + + implementation 'com.miguelcatalan:materialsearchview:1.4.0' + + } diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index ed925bf..8b04cc3 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -2,48 +2,61 @@ - + - - - - - - - - - - - - - - + + - - - - + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/java/me/gilo/wc/repo/ProductRepository.java b/app/src/main/java/me/gilo/wc/repo/ProductRepository.java index f103cb9..353ed2a 100644 --- a/app/src/main/java/me/gilo/wc/repo/ProductRepository.java +++ b/app/src/main/java/me/gilo/wc/repo/ProductRepository.java @@ -22,4 +22,12 @@ public class ProductRepository extends WoocommerceRepository { } + public WooLiveData> search(String term) { + final WooLiveData> callBack = new WooLiveData(); + + woocommerce.ProductRepository().search(term).enqueue(callBack); + return callBack; + } + + } diff --git a/app/src/main/java/me/gilo/wc/ui/product/ProductSearchActivity.kt b/app/src/main/java/me/gilo/wc/ui/product/ProductSearchActivity.kt new file mode 100644 index 0000000..3ef054d --- /dev/null +++ b/app/src/main/java/me/gilo/wc/ui/product/ProductSearchActivity.kt @@ -0,0 +1,132 @@ +package me.gilo.wc.ui.product + +import android.app.SearchManager +import android.content.Context +import android.content.Intent +import android.os.Bundle +import android.support.design.widget.Snackbar +import android.support.v7.app.AppCompatActivity; +import android.support.v7.widget.GridLayoutManager +import android.support.v7.widget.SearchView +import android.view.Menu +import android.widget.Toast +import io.github.inflationx.viewpump.ViewPumpContextWrapper +import me.gilo.wc.R + +import kotlinx.android.synthetic.main.activity_product_search.* +import kotlinx.android.synthetic.main.content_shop.* +import me.gilo.wc.adapter.ProductAdapter +import me.gilo.wc.common.BaseActivity +import me.gilo.wc.common.Status +import me.gilo.wc.ui.state.ProgressDialogFragment +import me.gilo.wc.viewmodels.ProductViewModel +import me.gilo.woodroid.models.Product +import org.json.JSONObject +import java.util.ArrayList + +class ProductSearchActivity : BaseActivity() { + + lateinit var adapter: ProductAdapter + lateinit var products: ArrayList + + lateinit var viewModel: ProductViewModel + val TAG = this::getLocalClassName + + override fun attachBaseContext(newBase: Context) { + super.attachBaseContext(ViewPumpContextWrapper.wrap(newBase)) + } + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + setContentView(R.layout.activity_product_search) + setSupportActionBar(toolbar) + + viewModel = getViewModel(ProductViewModel::class.java) + + title = "Search" + + val layoutManager = GridLayoutManager(baseContext, 2) + rvShop.layoutManager = layoutManager + rvShop.isNestedScrollingEnabled = false + + products = ArrayList() + + adapter = ProductAdapter(products) + rvShop.adapter = adapter + + handleIntent(intent) + } + + override fun onNewIntent(intent: Intent) { + handleIntent(intent) + } + + private fun handleIntent(intent: Intent) { + + if (Intent.ACTION_SEARCH == intent.action) { + val query = intent.getStringExtra(SearchManager.QUERY) + search(query) + } + } + + private fun search(query : String) { + viewModel.search(query).observe(this, android.arch.lifecycle.Observer { response -> + when (response!!.status()) { + Status.LOADING -> { + showLoading("Performing search", "This will only take a short while") + } + + Status.SUCCESS -> { + stopShowingLoading() + + val productsResponse = response.data() + for (product in productsResponse) { + products.add(product) + } + + adapter.notifyDataSetChanged() + + } + + Status.ERROR -> { + stopShowingLoading() + + var message: String + var loginError = JSONObject(response.error().message) + + if (loginError.has("status_message")) { + message = loginError.getString("status_message") + } else { + message = response.error().message.toString() + } + + Toast.makeText(baseContext, message, Toast.LENGTH_LONG).show() + } + + Status.EMPTY -> { + stopShowingLoading() + } + } + + }) + + } + + private lateinit var progressDialog: ProgressDialogFragment + + fun showLoading(title: String, message: String) { + val manager = supportFragmentManager + progressDialog = ProgressDialogFragment.newInstance(title, message) + progressDialog.isCancelable = false + progressDialog.show(manager, "progress") + } + + fun showLoading() { + showLoading("This will only take a sec", "Loading") + } + + fun stopShowingLoading() { + progressDialog.dismiss() + } + +} diff --git a/app/src/main/java/me/gilo/wc/ui/product/ShopActivity.kt b/app/src/main/java/me/gilo/wc/ui/product/ShopActivity.kt index 3c4293a..953e0de 100644 --- a/app/src/main/java/me/gilo/wc/ui/product/ShopActivity.kt +++ b/app/src/main/java/me/gilo/wc/ui/product/ShopActivity.kt @@ -3,7 +3,9 @@ package me.gilo.wc.ui.product import android.content.Context import android.os.Bundle import android.support.v7.widget.GridLayoutManager +import android.view.Menu import android.widget.Toast +import com.miguelcatalan.materialsearchview.MaterialSearchView import io.github.inflationx.viewpump.ViewPumpContextWrapper import kotlinx.android.synthetic.main.activity_shop.* import kotlinx.android.synthetic.main.content_shop.* @@ -16,6 +18,9 @@ import me.gilo.wc.viewmodels.ProductViewModel import me.gilo.woodroid.models.Product import org.json.JSONObject import java.util.* +import android.text.Editable +import android.text.TextWatcher + class ShopActivity : BaseActivity() { @@ -49,17 +54,29 @@ class ShopActivity : BaseActivity() { products() + etSearch.addTextChangedListener(object : TextWatcher { + + override fun afterTextChanged(s: Editable) {} + override fun beforeTextChanged(s: CharSequence, start: Int, count: Int, after: Int) {} + + override fun onTextChanged(s: CharSequence, start: Int, before: Int, count: Int) { + if (s.isNotEmpty()) { + search(s.toString()) + }else{ + products() + } + } + }) } - private fun products() { - viewModel.products().observe(this, android.arch.lifecycle.Observer { response -> + private fun search(query : String) { + viewModel.search(query).observe(this, android.arch.lifecycle.Observer { response -> when (response!!.status()) { Status.LOADING -> { - showLoading("Performing log in", "This will only take a short while") } Status.SUCCESS -> { - stopShowingLoading() + products.clear() val productsResponse = response.data() for (product in productsResponse) { @@ -71,22 +88,12 @@ class ShopActivity : BaseActivity() { } Status.ERROR -> { - stopShowingLoading() - var message: String - var loginError = JSONObject(response.error().message) - if (loginError.has("status_message")) { - message = loginError.getString("status_message") - } else { - message = response.error().message.toString() - } - - Toast.makeText(baseContext, message, Toast.LENGTH_LONG).show() } Status.EMPTY -> { - stopShowingLoading() + } } @@ -94,6 +101,43 @@ class ShopActivity : BaseActivity() { } + private fun products() { + viewModel.products().observe(this, android.arch.lifecycle.Observer { response -> + when (response!!.status()) { + Status.LOADING -> { + + } + + Status.SUCCESS -> { + products.clear() + val productsResponse = response.data() + for (product in productsResponse) { + products.add(product) + } + + adapter.notifyDataSetChanged() + + } + + Status.ERROR -> { + + } + + Status.EMPTY -> { + + } + } + + }) + + } + + override fun onCreateOptionsMenu(menu: Menu): Boolean { + menuInflater.inflate(R.menu.products, menu) + + return true + } + private lateinit var progressDialog: ProgressDialogFragment fun showLoading(title: String, message: String) { diff --git a/app/src/main/java/me/gilo/wc/viewmodels/ProductViewModel.java b/app/src/main/java/me/gilo/wc/viewmodels/ProductViewModel.java index ce68eac..1df5280 100644 --- a/app/src/main/java/me/gilo/wc/viewmodels/ProductViewModel.java +++ b/app/src/main/java/me/gilo/wc/viewmodels/ProductViewModel.java @@ -20,4 +20,8 @@ public final class ProductViewModel extends ViewModel { public WooLiveData> products() { return productRepository.products(); } + + public WooLiveData> search(String term) { + return productRepository.search(term); + } } \ No newline at end of file diff --git a/app/src/main/res/drawable-hdpi/baseline_filter_list_white_18.png b/app/src/main/res/drawable-hdpi/baseline_filter_list_white_18.png new file mode 100644 index 0000000..88908b7 Binary files /dev/null and b/app/src/main/res/drawable-hdpi/baseline_filter_list_white_18.png differ diff --git a/app/src/main/res/drawable-hdpi/baseline_filter_list_white_24.png b/app/src/main/res/drawable-hdpi/baseline_filter_list_white_24.png new file mode 100644 index 0000000..fec1fe4 Binary files /dev/null and b/app/src/main/res/drawable-hdpi/baseline_filter_list_white_24.png differ diff --git a/app/src/main/res/drawable-hdpi/baseline_filter_list_white_36.png b/app/src/main/res/drawable-hdpi/baseline_filter_list_white_36.png new file mode 100644 index 0000000..5e8fde1 Binary files /dev/null and b/app/src/main/res/drawable-hdpi/baseline_filter_list_white_36.png differ diff --git a/app/src/main/res/drawable-hdpi/baseline_filter_list_white_48.png b/app/src/main/res/drawable-hdpi/baseline_filter_list_white_48.png new file mode 100644 index 0000000..1263ae8 Binary files /dev/null and b/app/src/main/res/drawable-hdpi/baseline_filter_list_white_48.png differ diff --git a/app/src/main/res/drawable-mdpi/baseline_filter_list_white_18.png b/app/src/main/res/drawable-mdpi/baseline_filter_list_white_18.png new file mode 100644 index 0000000..0dffc0b Binary files /dev/null and b/app/src/main/res/drawable-mdpi/baseline_filter_list_white_18.png differ diff --git a/app/src/main/res/drawable-mdpi/baseline_filter_list_white_24.png b/app/src/main/res/drawable-mdpi/baseline_filter_list_white_24.png new file mode 100644 index 0000000..e327bb0 Binary files /dev/null and b/app/src/main/res/drawable-mdpi/baseline_filter_list_white_24.png differ diff --git a/app/src/main/res/drawable-mdpi/baseline_filter_list_white_36.png b/app/src/main/res/drawable-mdpi/baseline_filter_list_white_36.png new file mode 100644 index 0000000..fec1fe4 Binary files /dev/null and b/app/src/main/res/drawable-mdpi/baseline_filter_list_white_36.png differ diff --git a/app/src/main/res/drawable-mdpi/baseline_filter_list_white_48.png b/app/src/main/res/drawable-mdpi/baseline_filter_list_white_48.png new file mode 100644 index 0000000..242ba3a Binary files /dev/null and b/app/src/main/res/drawable-mdpi/baseline_filter_list_white_48.png differ diff --git a/app/src/main/res/drawable-xhdpi/baseline_filter_list_white_18.png b/app/src/main/res/drawable-xhdpi/baseline_filter_list_white_18.png new file mode 100644 index 0000000..fec1fe4 Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/baseline_filter_list_white_18.png differ diff --git a/app/src/main/res/drawable-xhdpi/baseline_filter_list_white_24.png b/app/src/main/res/drawable-xhdpi/baseline_filter_list_white_24.png new file mode 100644 index 0000000..242ba3a Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/baseline_filter_list_white_24.png differ diff --git a/app/src/main/res/drawable-xhdpi/baseline_filter_list_white_36.png b/app/src/main/res/drawable-xhdpi/baseline_filter_list_white_36.png new file mode 100644 index 0000000..1263ae8 Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/baseline_filter_list_white_36.png differ diff --git a/app/src/main/res/drawable-xhdpi/baseline_filter_list_white_48.png b/app/src/main/res/drawable-xhdpi/baseline_filter_list_white_48.png new file mode 100644 index 0000000..cb2207f Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/baseline_filter_list_white_48.png differ diff --git a/app/src/main/res/drawable-xxhdpi/baseline_filter_list_white_18.png b/app/src/main/res/drawable-xxhdpi/baseline_filter_list_white_18.png new file mode 100644 index 0000000..5e8fde1 Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/baseline_filter_list_white_18.png differ diff --git a/app/src/main/res/drawable-xxhdpi/baseline_filter_list_white_24.png b/app/src/main/res/drawable-xxhdpi/baseline_filter_list_white_24.png new file mode 100644 index 0000000..1263ae8 Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/baseline_filter_list_white_24.png differ diff --git a/app/src/main/res/drawable-xxhdpi/baseline_filter_list_white_36.png b/app/src/main/res/drawable-xxhdpi/baseline_filter_list_white_36.png new file mode 100644 index 0000000..afc68c4 Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/baseline_filter_list_white_36.png differ diff --git a/app/src/main/res/drawable-xxhdpi/baseline_filter_list_white_48.png b/app/src/main/res/drawable-xxhdpi/baseline_filter_list_white_48.png new file mode 100644 index 0000000..8604aba Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/baseline_filter_list_white_48.png differ diff --git a/app/src/main/res/drawable-xxxhdpi/baseline_filter_list_white_18.png b/app/src/main/res/drawable-xxxhdpi/baseline_filter_list_white_18.png new file mode 100644 index 0000000..1263ae8 Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/baseline_filter_list_white_18.png differ diff --git a/app/src/main/res/drawable-xxxhdpi/baseline_filter_list_white_24.png b/app/src/main/res/drawable-xxxhdpi/baseline_filter_list_white_24.png new file mode 100644 index 0000000..cb2207f Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/baseline_filter_list_white_24.png differ diff --git a/app/src/main/res/drawable-xxxhdpi/baseline_filter_list_white_36.png b/app/src/main/res/drawable-xxxhdpi/baseline_filter_list_white_36.png new file mode 100644 index 0000000..8604aba Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/baseline_filter_list_white_36.png differ diff --git a/app/src/main/res/drawable-xxxhdpi/baseline_filter_list_white_48.png b/app/src/main/res/drawable-xxxhdpi/baseline_filter_list_white_48.png new file mode 100644 index 0000000..7b4cc29 Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/baseline_filter_list_white_48.png differ diff --git a/app/src/main/res/drawable/baseline_filter_list_24.xml b/app/src/main/res/drawable/baseline_filter_list_24.xml new file mode 100644 index 0000000..88cc530 --- /dev/null +++ b/app/src/main/res/drawable/baseline_filter_list_24.xml @@ -0,0 +1,10 @@ + + + diff --git a/app/src/main/res/drawable/baseline_search_white_18dp.png b/app/src/main/res/drawable/baseline_search_white_18dp.png new file mode 100644 index 0000000..bf2c964 Binary files /dev/null and b/app/src/main/res/drawable/baseline_search_white_18dp.png differ diff --git a/app/src/main/res/layout/activity_product_search.xml b/app/src/main/res/layout/activity_product_search.xml new file mode 100644 index 0000000..286ad3b --- /dev/null +++ b/app/src/main/res/layout/activity_product_search.xml @@ -0,0 +1,26 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_shop.xml b/app/src/main/res/layout/activity_shop.xml index d3bcd80..3282ab5 100644 --- a/app/src/main/res/layout/activity_shop.xml +++ b/app/src/main/res/layout/activity_shop.xml @@ -17,7 +17,47 @@ android:layout_width="match_parent" android:layout_height="?attr/actionBarSize" android:background="?attr/colorPrimary" - app:popupTheme="@style/AppTheme.PopupOverlay"/> + app:popupTheme="@style/AppTheme.PopupOverlay"> + + + + + + + + + + + diff --git a/app/src/main/res/layout/content_product_search.xml b/app/src/main/res/layout/content_product_search.xml new file mode 100644 index 0000000..a0df100 --- /dev/null +++ b/app/src/main/res/layout/content_product_search.xml @@ -0,0 +1,20 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/menu/products.xml b/app/src/main/res/menu/products.xml new file mode 100644 index 0000000..35fbee3 --- /dev/null +++ b/app/src/main/res/menu/products.xml @@ -0,0 +1,10 @@ + + + + \ No newline at end of file diff --git a/app/src/main/res/values/dimens.xml b/app/src/main/res/values/dimens.xml index 184ee9b..59a0b0c 100644 --- a/app/src/main/res/values/dimens.xml +++ b/app/src/main/res/values/dimens.xml @@ -1,3 +1,3 @@ - 16dp + 16dp diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 89c5ccb..f46e41b 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -1,14 +1,17 @@ - wc-app - ShopActivity - CouponActivity - MenuActivity + wc-app + ShopActivity + CouponActivity + MenuActivity - fonts/GT-America-Bold.otf - fonts/GT-America-Medium.otf - fonts/GT-America-Regular.otf - AddCouponActivity - CouponsActivity + fonts/GT-America-Bold.otf + fonts/GT-America-Medium.otf + fonts/GT-America-Regular.otf + AddCouponActivity + CouponsActivity + search + Search product + ProductSearchActivity diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml index e38303a..177cefc 100644 --- a/app/src/main/res/values/styles.xml +++ b/app/src/main/res/values/styles.xml @@ -1,20 +1,20 @@ - - + + - + -