diff --git a/.idea/modules.xml b/.idea/modules.xml index 8d9fd1f..62cc6ac 100644 --- a/.idea/modules.xml +++ b/.idea/modules.xml @@ -2,6 +2,7 @@ + diff --git a/app/build.gradle b/app/build.gradle index f118913..8cd8421 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -11,14 +11,25 @@ android { applicationId "xyz.mtfos.buywhat" minSdkVersion 15 targetSdkVersion 26 - versionCode 1 - versionName "1.0" + versionCode 4 + versionName "1.0.1" testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" } + + signingConfigs { + release { + storeFile file("${rootDir}/mtfos") + storePassword "pass.ok=1" + keyAlias "mtfos" + keyPassword "pass.ok=1" + } + } + buildTypes { release { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' + signingConfig signingConfigs.release } } } diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 45f0bf2..6b36685 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -6,9 +6,9 @@ @@ -19,6 +19,7 @@ + \ No newline at end of file diff --git a/app/src/main/java/xyz/mtfos/buywhat/ItemRandom.kt b/app/src/main/java/xyz/mtfos/buywhat/ItemRandom.kt new file mode 100644 index 0000000..00f1df5 --- /dev/null +++ b/app/src/main/java/xyz/mtfos/buywhat/ItemRandom.kt @@ -0,0 +1,223 @@ +package xyz.mtfos.buywhat + +import android.annotation.SuppressLint +import android.content.Context +import android.os.Bundle +import android.os.Handler +import android.os.Message +import android.view.View +import android.view.ViewGroup +import android.widget.* +import org.json.JSONArray +import org.json.JSONObject +import xyz.mtfos.tools.apiObject +import xyz.mtfos.tools.objectTool.bind +import java.util.* +import kotlin.collections.ArrayList + +/** + * Created by jay on 2017/7/6. + */ +class ItemRandom : SampleActivity() { + private val tvTitle: TextView by bind(R.id.tvTitle) + private val ivRefresh: ImageView by bind(R.id.ivRefresh) + private val lvCommodity: ListView by bind(R.id.lvCommodity) + private var store_id: Int? = null + private var itemList: ArrayList = ArrayList() + private var adapter: lvAdapter? = null + private val rangeMin: EditText by bind(R.id.rangeMin) + private val rangeMax: EditText by bind(R.id.rangeMax) + private val btnRandom: Button by bind(R.id.btnRandom) + private val tvResult: TextView by bind(R.id.tvResult) + private val ivBack: ImageView by bind(R.id.ivBack) + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + setViewSource(R.layout.activity_item_random) + + tvTitle?.text = intent?.getStringExtra("name") + store_id = intent?.getIntExtra("id", 0) + + adapter = lvAdapter(this@ItemRandom, 0) + + lvCommodity.adapter = adapter + + lvCommodity.setOnItemClickListener({parent, view, position, id -> + val data: JSONObject = itemList.get(position) as JSONObject + var sk:Boolean = data!!["skip"] as Boolean + data?.put("skip", !sk) + itemList.set(position, data) + adapter?.notifyDataSetChanged() + + randomItem() + }) + + btnRandom.setOnClickListener{v-> + val json : JSONObject? = randomItem() + val str : String = if(json != null) { + "Result : ${json!!["name"]} $${json!!["price"]}" + }else{ + "Result : 目標區間無商品" + } + tvResult.text = str + } + + ivRefresh.setOnClickListener({ v -> + getList() + }) + + ivBack.setOnClickListener({ v -> + finish() + }) + + getList() + } + + fun getList() { + if(store_id == 0 || store_id == null) return + resetView() + toggleLoading(true) + api.getItems(store_id!!, object: apiObject.apicb{ + override fun Callback(json: JSONObject?) { + uiHandler.post { toggleLoading(false) } + if(json!!["status"] == 1) { + val jarr :JSONArray = json!!["record"] as JSONArray + itemList.clear() + if(jarr.length() > 0) { + uiHandler.sendEmptyMessage(3) + for(i in 0..(jarr.length() - 1)){ + val tmp: JSONObject =jarr!![i] as JSONObject + tmp.put("skip", false) + itemList.add(tmp) + } + }else{ + uiHandler.sendEmptyMessage(2) + } + uiHandler.sendEmptyMessage(1) + } + } + }) + } + + + fun resetView () { + rangeMin.setText("0") + rangeMax.setText("0") + tvResult.text = "" + } + + fun randomItem (): JSONObject? { + val min: String = rangeMin.text.toString() + val max: String = rangeMax.text.toString() + + var imin = if(min.toIntOrNull() == null) 0 else min.toInt() + var imax = if(max.toIntOrNull() == null) 0 else max.toInt() + + val tmp: ArrayList = ArrayList() + + for(i in 0..(itemList.size - 1)){ + val t:JSONObject = itemList[i] + var flag:Boolean = false + + val price:Int = t!!["price"] as Int + + if(t!!["skip"] == false){ + if(imin == 0 && imax == 0){ + flag = true + }else if(imin > 0 && imax == 0){ + if(price >= imin){ + flag = true + } + }else if(imin == 0 && imax > 0) { + if(price <= imax) { + flag = true + } + }else{ + if(price in imin..imax) { + flag = true + } + } + } + + if(flag){ + tmp.add(t) + } + } + + var arr: Array = tmp.toTypedArray() + + if(arr.isNotEmpty()) { + arr = shuffleArray(arr) as Array + } + + return if(arr.isNotEmpty()) { + arr[0] + } else { + null + } + } + + fun shuffleArray(arr: Array) : Array{ + var tmp = arr + + var rand: Random = Random() + + var limit: Int = 0 + while (limit < 2) { + for (i in 0..(tmp.size - 1)) { + val pos: Int = rand.nextInt(tmp.size) + val a = tmp[pos] + tmp[pos] = tmp[i] + tmp[i] = a + } + limit ++ + } + + return tmp + } + + @SuppressLint("HandlerLeak") + private val uiHandler = object : Handler() { + override fun handleMessage(msg: Message?) { + super.handleMessage(msg) + when (msg!!.what) { + 1 -> { + // update listview data + adapter!!.clear() + adapter!!.addAll(itemList) + } + 2 -> { + btnRandom.isClickable = false + } + 3 -> { + btnRandom.isClickable = true + } + } + } + } + + class lvAdapter(context: Context, resource: Int) : ArrayAdapter(context, resource) { + + override fun getView(position: Int, convertView: View?, parent: ViewGroup?): View { + val data = getItem(position) as JSONObject + var v: View = if (convertView == null) { + View.inflate(context, R.layout.listview_commodity_item, null) + } else { + convertView + } + + val tvSkip: TextView = v.findViewById(R.id.tvSkip) + tvSkip.text = if(data!!["skip"] == false){ + context.getString(R.string.commodity_no_skip) + }else{ + context.getString(R.string.commodity_skip) + } + + val tv: TextView = v.findViewById(R.id.tvItem) + val name:String = data!!["name"] as String + val price:Int = data!!["price"] as Int + tv.text = "${name} $${price}" + return v + } + } +} \ No newline at end of file diff --git a/app/src/main/java/xyz/mtfos/buywhat/SampleActivity.kt b/app/src/main/java/xyz/mtfos/buywhat/SampleActivity.kt new file mode 100644 index 0000000..8295b4c --- /dev/null +++ b/app/src/main/java/xyz/mtfos/buywhat/SampleActivity.kt @@ -0,0 +1,45 @@ +package xyz.mtfos.buywhat + +import android.app.Activity +import android.os.Handler +import android.view.View +import android.view.ViewGroup +import android.widget.LinearLayout +import android.widget.RelativeLayout +import xyz.mtfos.tools.apiObject +import xyz.mtfos.tools.objectTool.bind + +/** + * Created by jay on 2017/7/6. + */ +open class SampleActivity : Activity() { + protected val api: apiObject = apiObject(this@SampleActivity) + protected val layMain: RelativeLayout by bind(R.id.layMain) + protected val layLoading: LinearLayout by bind(R.id.layLoading) + + fun setViewSource(v: View?) { + setContentView(v) + setDynView() + } + + fun setViewSource(v: Int) { + setContentView(v) + setDynView() + } + + fun setDynView() { + val loadingItem: LinearLayout = layoutInflater.inflate(R.layout.lay_loading, null) as LinearLayout + + loadingItem.layoutParams = ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT) + + layLoading?.addView(loadingItem) + } + + fun toggleLoading(flag: Boolean) { + layLoading?.visibility = if (flag == true) { + View.VISIBLE + } else { + View.GONE + } + } +} \ No newline at end of file diff --git a/app/src/main/java/xyz/mtfos/buywhat/StoreList.kt b/app/src/main/java/xyz/mtfos/buywhat/StoreList.kt index d0360c1..77ac50f 100644 --- a/app/src/main/java/xyz/mtfos/buywhat/StoreList.kt +++ b/app/src/main/java/xyz/mtfos/buywhat/StoreList.kt @@ -1,7 +1,6 @@ package xyz.mtfos.buywhat import android.annotation.SuppressLint -import android.app.Activity import android.content.Context import android.content.Intent import android.os.Bundle @@ -18,28 +17,28 @@ import xyz.mtfos.tools.objectTool.bind /** * Created by jay on 2017/7/5. */ -class StoreList : Activity() { +class StoreList : SampleActivity() { private val lv: ListView by bind(R.id.storelv) - private val tvTitle: TextView by bind(R.id.tvTitle) private val ivRefresh: ImageView by bind(R.id.ivRefresh) - private val api: apiObject = apiObject(this@StoreList) private var storeList: ArrayList = ArrayList() private var adapter: lvAdapter? = null override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) - setContentView(R.layout.activity_store_list) + setViewSource(R.layout.activity_store_list) adapter = lvAdapter(this@StoreList, 0) lv.adapter = adapter - lv.setOnItemClickListener({parent, view, position, id -> + lv.setOnItemClickListener({ parent, view, position, id -> val data: JSONObject = storeList.get(position) as JSONObject val sid: Int = data!!["id"] as Int + val name: String = data!!["name"] as String - var intent = Intent(this@StoreList, null) + val intent = Intent(this@StoreList, ItemRandom::class.java) intent.putExtra("id", sid) + intent.putExtra("name", name) startActivity(intent) }) @@ -51,13 +50,15 @@ class StoreList : Activity() { } fun getList() { + toggleLoading(true) api.getStore(object : apiObject.apicb { override fun Callback(json: JSONObject?) { + uiHandler.post({ toggleLoading(false) }) if (json!!["status"] == 1) { var jarr: JSONArray = json!!["record"] as JSONArray - if(jarr.length() > 0) { - storeList.clear() - for(i in 0..(jarr.length() - 1)) { + storeList.clear() + if (jarr.length() > 0) { + for (i in 0..(jarr.length() - 1)) { val tmp = jarr.getJSONObject(i) storeList.add(tmp) } @@ -82,13 +83,13 @@ class StoreList : Activity() { } } - class lvAdapter(context: Context, resource: Int): ArrayAdapter(context, resource) { + class lvAdapter(context: Context, resource: Int) : ArrayAdapter(context, resource) { override fun getView(position: Int, convertView: View?, parent: ViewGroup?): View { val data = getItem(position) as JSONObject - var v: View = if(convertView == null) { + var v: View = if (convertView == null) { View.inflate(context, R.layout.listview_store_item, null) - }else { + } else { convertView } val tv: TextView = v.findViewById(R.id.tvItem) diff --git a/app/src/main/java/xyz/mtfos/tools/apiObject.kt b/app/src/main/java/xyz/mtfos/tools/apiObject.kt index 2891cec..10087de 100644 --- a/app/src/main/java/xyz/mtfos/tools/apiObject.kt +++ b/app/src/main/java/xyz/mtfos/tools/apiObject.kt @@ -37,7 +37,7 @@ open class apiObject constructor(val ctx: Context) { open fun getItems(storeId: Int, cb: apicb) { val url:String = "${projectSet.apiUrl}/item/${storeId}" - var req:Request = Request.Builder() + val req:Request = Request.Builder() .url(url) .build() send(req, object : apicb { diff --git a/app/src/main/res/drawable-hdpi/ic_keyboard_arrow_left_black_24dp.png b/app/src/main/res/drawable-hdpi/ic_keyboard_arrow_left_black_24dp.png new file mode 100644 index 0000000..05b3579 Binary files /dev/null and b/app/src/main/res/drawable-hdpi/ic_keyboard_arrow_left_black_24dp.png differ diff --git a/app/src/main/res/drawable-mdpi/ic_keyboard_arrow_left_black_24dp.png b/app/src/main/res/drawable-mdpi/ic_keyboard_arrow_left_black_24dp.png new file mode 100644 index 0000000..22b624b Binary files /dev/null and b/app/src/main/res/drawable-mdpi/ic_keyboard_arrow_left_black_24dp.png differ diff --git a/app/src/main/res/drawable-xhdpi/ic_keyboard_arrow_left_black_24dp.png b/app/src/main/res/drawable-xhdpi/ic_keyboard_arrow_left_black_24dp.png new file mode 100644 index 0000000..49ef87d Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/ic_keyboard_arrow_left_black_24dp.png differ diff --git a/app/src/main/res/drawable-xxhdpi/ic_keyboard_arrow_left_black_24dp.png b/app/src/main/res/drawable-xxhdpi/ic_keyboard_arrow_left_black_24dp.png new file mode 100644 index 0000000..da52e03 Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/ic_keyboard_arrow_left_black_24dp.png differ diff --git a/app/src/main/res/drawable-xxxhdpi/ic_keyboard_arrow_left_black_24dp.png b/app/src/main/res/drawable-xxxhdpi/ic_keyboard_arrow_left_black_24dp.png new file mode 100644 index 0000000..55f211b Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/ic_keyboard_arrow_left_black_24dp.png differ diff --git a/app/src/main/res/drawable/logo.png b/app/src/main/res/drawable/logo.png new file mode 100644 index 0000000..bec307d Binary files /dev/null and b/app/src/main/res/drawable/logo.png differ diff --git a/app/src/main/res/layout/activity_item_random.xml b/app/src/main/res/layout/activity_item_random.xml new file mode 100644 index 0000000..7be9061 --- /dev/null +++ b/app/src/main/res/layout/activity_item_random.xml @@ -0,0 +1,166 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +