From 44269a7defe18e7006a7789c793217dd4411b45e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Deniz=20D=C3=BCzg=C3=B6ren?= Date: Sun, 26 May 2019 14:59:00 +0200 Subject: [PATCH] Food fragment is now using Kotlin too, but doesn't use DataFetcher.kt --- .../denizd/substitutionplan/DataFetcher.kt | 24 ++- .../denizd/substitutionplan/FoodFragment.kt | 144 +++++++++++++++++- .../denizd/substitutionplan/PlanFragment.kt | 4 +- 3 files changed, 154 insertions(+), 18 deletions(-) diff --git a/app/src/main/java/com/denizd/substitutionplan/DataFetcher.kt b/app/src/main/java/com/denizd/substitutionplan/DataFetcher.kt index 07a72cb..178ffa9 100644 --- a/app/src/main/java/com/denizd/substitutionplan/DataFetcher.kt +++ b/app/src/main/java/com/denizd/substitutionplan/DataFetcher.kt @@ -73,6 +73,8 @@ class DataFetcher(isplan: Boolean, ismenu: Boolean, isjobservice: Boolean, conte private val newDateFormat = "yyyy-MM-dd, HH:mm:ss" private var sdf = SimpleDateFormat(oldDateFormat) private lateinit var d: Date + private val fadeOut = AnimationUtils.loadAnimation(mContext, R.anim.fade_out) + private val handler = Handler(Looper.getMainLooper()) override fun doInBackground(vararg params: Void?): Void? { @@ -137,10 +139,22 @@ class DataFetcher(isplan: Boolean, ismenu: Boolean, isjobservice: Boolean, conte } foodInt++ mView?.let { - progressBar.incrementProgressBy(1) + progressBar.progress = foodInt } } + mView?.let { + progressBar.progress = 100 + handler.postDelayed({ progressBar.startAnimation(fadeOut) }, 200) + fadeOut.setAnimationListener(object: Animation.AnimationListener { + override fun onAnimationStart(arg0: Animation) {} + override fun onAnimationRepeat(arg0: Animation) {} + override fun onAnimationEnd(arg0: Animation) { + progressBar.progress = 0 + } + }) + } + easyPrefs.putListString("foodListPrefs", foodList) } @@ -258,21 +272,15 @@ class DataFetcher(isplan: Boolean, ismenu: Boolean, isjobservice: Boolean, conte .build() } notification.sound = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION) - manager.notify(1, notification) // TODO notification plays multiple times + manager.notify(1, notification) } } mView?.let { v: View -> - val fadeOut = AnimationUtils.loadAnimation(mContext, R.anim.fade_out) - - val handler = Handler(Looper.getMainLooper()) handler.postDelayed({ progressBar.startAnimation(fadeOut) }, 200) - fadeOut.setAnimationListener(object: Animation.AnimationListener { override fun onAnimationStart(arg0: Animation) {} - override fun onAnimationRepeat(arg0: Animation) {} - override fun onAnimationEnd(arg0: Animation) { progressBar.progress = 0 } diff --git a/app/src/main/java/com/denizd/substitutionplan/FoodFragment.kt b/app/src/main/java/com/denizd/substitutionplan/FoodFragment.kt index 5437ece..92a0ae2 100644 --- a/app/src/main/java/com/denizd/substitutionplan/FoodFragment.kt +++ b/app/src/main/java/com/denizd/substitutionplan/FoodFragment.kt @@ -2,31 +2,42 @@ package com.denizd.substitutionplan import android.content.Context import android.content.SharedPreferences +import android.os.AsyncTask import android.os.Bundle +import android.os.Handler +import android.os.Looper import android.preference.PreferenceManager import android.view.View +import android.view.animation.Animation +import android.view.animation.AnimationUtils +import android.widget.ProgressBar import androidx.fragment.app.Fragment import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.RecyclerView import androidx.swiperefreshlayout.widget.SwipeRefreshLayout import com.madapps.prefrences.EasyPrefrences +import kotlinx.android.synthetic.main.plan.* +import org.jsoup.Jsoup +import org.jsoup.nodes.Document +import org.jsoup.select.Elements +import java.lang.IndexOutOfBoundsException class FoodFragment : Fragment(R.layout.food_layout) { - public val foodArrayList = ArrayList() + private val foodArrayList = ArrayList() private val mAdapter = FoodAdapter(foodArrayList) private lateinit var mContext: Context private lateinit var prefs: SharedPreferences -// private lateinit var edit: SharedPreferences.Editor + private lateinit var edit: SharedPreferences.Editor private lateinit var easyPrefs: EasyPrefrences - private lateinit var foodListPopulation: ArrayList - private lateinit var recyclerView: RecyclerView + lateinit var foodListPopulation: ArrayList + lateinit var recyclerView: RecyclerView override fun onAttach(context: Context) { super.onAttach(context) mContext = context prefs = PreferenceManager.getDefaultSharedPreferences(mContext) -// edit = prefs.edit() + edit = prefs.edit() easyPrefs = EasyPrefrences(mContext) } @@ -54,13 +65,132 @@ class FoodFragment : Fragment(R.layout.food_layout) { if (prefs.getBoolean("autoRefresh", false)) { pullToRefresh.isRefreshing = true - DataFetcher(false, true, false, mContext, activity!!.application, view.rootView).execute() + RepopulateFood(mContext, recyclerView, easyPrefs, mAdapter, foodArrayList, pullToRefresh, view.rootView).execute() } pullToRefresh.setOnRefreshListener { pullToRefresh.isRefreshing = true - DataFetcher(false, true, false, mContext, activity!!.application, view.rootView).execute() + RepopulateFood(mContext, recyclerView, easyPrefs, mAdapter, foodArrayList, pullToRefresh, view.rootView).execute() + } + /* bad approach - I should be using the DataFetcher.kt class, but that requires figuring out how to access the RecyclerView and its adapter from + * another class - the best approach would be to store the data in the database instead of using EasyPreferences, however, I'm not doing that now */ + } + + class RepopulateFood(context: Context, recyclerView: RecyclerView, easyPrefs: EasyPrefrences, + adapter: FoodAdapter, foodArrayList: ArrayList, + swipeRefreshLayout: SwipeRefreshLayout, rootView: View) : AsyncTask() { + + private val mRecyclerView = recyclerView + private val mEasyPrefs = easyPrefs + private val mAdapter = adapter + private val mFoodArrayList = foodArrayList + private var foodList = ArrayList() + private lateinit var foodElements: Elements + private lateinit var docFood: Document + private val pullToRefresh = swipeRefreshLayout + private lateinit var progressBar: ProgressBar + val mRootView = rootView + private val fadeOut = AnimationUtils.loadAnimation(context, R.anim.fade_out) + private val handler = Handler(Looper.getMainLooper()) + + override fun doInBackground(vararg params: Void?): Void? { + docFood = Jsoup.connect("https://djd4rkn355.github.io/food.html").get() + foodElements = docFood.select("th") + + try { + mFoodArrayList.removeAll(mFoodArrayList) + } catch (ignored: NullPointerException) {} + + progressBar = mRootView.findViewById(R.id.progressBar) + + progressBar.max = foodElements.size + + var foodInt = 0 + while (foodInt in 0 until foodElements.size) { + try { // what a mess this is! + if (foodElements[foodInt].text().contains("Montag") || + foodElements[foodInt].text().contains("Dienstag") || + foodElements[foodInt].text().contains("Mittwoch") || + foodElements[foodInt].text().contains("Donnerstag") || + foodElements[foodInt].text().contains("Freitag")) { + + if (foodElements[foodInt + 3].text().contains("Montag") || + foodElements[foodInt + 3].text().contains("Dienstag") || + foodElements[foodInt + 3].text().contains("Mittwoch") || + foodElements[foodInt + 3].text().contains("Donnerstag") || + foodElements[foodInt + 3].text().contains("Freitag") || + foodElements[foodInt + 3].text().contains("von")) { + foodList.add(foodElements[foodInt].text() + "\n" + + foodElements[foodInt + 1].text() + "\n" + + foodElements[foodInt + 2].text()) + foodInt += 2 + } else if (foodElements[foodInt + 2].text().contains("Montag") || + foodElements[foodInt + 2].text().contains("Dienstag") || + foodElements[foodInt + 2].text().contains("Mittwoch") || + foodElements[foodInt + 2].text().contains("Donnerstag") || + foodElements[foodInt + 2].text().contains("Freitag") || + foodElements[foodInt + 2].text().contains("von")) { + foodList.add(foodElements[foodInt].text() + "\n" + + foodElements[foodInt + 1].text()) + foodInt += 1 + } + + } else { + foodList.add(foodElements[foodInt].text()) + } + } catch (e: IndexOutOfBoundsException) { + try { + foodList.add(foodElements[foodInt].text() + "\n" + + foodElements[foodInt + 1].text() + "\n" + + foodElements[foodInt + 2].text()) + break + } catch (e1: IndexOutOfBoundsException) { + foodList.add(foodElements[foodInt].text() + "\n" + + foodElements[foodInt + 1].text()) + break + } + } + foodInt++ + progressBar.progress = foodInt + } + + progressBar.progress = 100 + + mEasyPrefs.putListString("foodListPrefs", foodList) + return null } + override fun onPostExecute(result: Void?) { + super.onPostExecute(result) + + try { + mRecyclerView.removeAllViews() + } catch (ignored: NullPointerException) {} + + try { + mRecyclerView.removeAllViews() + } catch (ignored: NullPointerException) {} + + val foodListPopulation = ArrayList(mEasyPrefs.getListString("foodListPrefs")) + + for (i in 0 until foodListPopulation.size) { + mFoodArrayList.add(Food(foodListPopulation[i])) + mAdapter.setFood(mFoodArrayList) + mRecyclerView.scheduleLayoutAnimation() + } + + pullToRefresh.isRefreshing = false + + handler.postDelayed({ progressBar.startAnimation(fadeOut) }, 200) + fadeOut.setAnimationListener(object: Animation.AnimationListener { + override fun onAnimationStart(arg0: Animation) {} + override fun onAnimationRepeat(arg0: Animation) {} + override fun onAnimationEnd(arg0: Animation) { + progressBar.progress = 0 + } + }) + } } + + } \ No newline at end of file diff --git a/app/src/main/java/com/denizd/substitutionplan/PlanFragment.kt b/app/src/main/java/com/denizd/substitutionplan/PlanFragment.kt index 5a4e583..b63b0de 100644 --- a/app/src/main/java/com/denizd/substitutionplan/PlanFragment.kt +++ b/app/src/main/java/com/denizd/substitutionplan/PlanFragment.kt @@ -119,11 +119,9 @@ class PlanFragment(isPersonal: Boolean) : Fragment(R.layout.plan) { } } } -// recyclerView.adapter!!.notifyDataSetChanged() // TODO check whether this is necessary planCardList.sortWith(Comparator { lhs, rhs -> Integer.compare(rhs.priority, lhs.priority) }) recyclerView.scheduleLayoutAnimation() mAdapter.setSubst(planCardList) - bottomSheetText.text = prefs.getString("informational", getString(R.string.noinfo)) handler.postDelayed({ if (persPlanEmpty) { @@ -138,8 +136,8 @@ class PlanFragment(isPersonal: Boolean) : Fragment(R.layout.plan) { } else { mAdapter.setSubst(it) recyclerView.scheduleLayoutAnimation() - bottomSheetText.text = prefs.getString("informational", getString(R.string.noinfo)) } + bottomSheetText.text = prefs.getString("informational", getString(R.string.noinfo)) }) pullToRefresh.setOnRefreshListener {