From 9f22717e631676944d949e5aad87abd5c4317992 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Deniz=20D=C3=BCzg=C3=B6ren?= Date: Sun, 26 May 2019 11:35:36 +0200 Subject: [PATCH] Plan and personal plan now use the same Kotlin class, food fragment doesnt work properly (yet) --- app/src/main/AndroidManifest.xml | 3 + .../denizd/substitutionplan/FoodFragment.kt | 41 +++-- .../denizd/substitutionplan/FragmentFood.java | 4 +- .../java/com/denizd/substitutionplan/Main.kt | 10 +- .../substitutionplan/NotificationService.kt | 48 +++++- .../substitutionplan/PersonalFragment.kt | 4 + .../denizd/substitutionplan/PlanFragment.kt | 151 ++++++++++++++++++ .../substitutionplan/SettingsFragment.kt | 2 - app/src/main/res/layout/dating_dialog.xml | 3 +- app/src/main/res/layout/food_layout.xml | 15 +- app/src/main/res/layout/plan.xml | 12 +- 11 files changed, 242 insertions(+), 51 deletions(-) create mode 100644 app/src/main/java/com/denizd/substitutionplan/PersonalFragment.kt create mode 100644 app/src/main/java/com/denizd/substitutionplan/PlanFragment.kt diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 4b01236..997b8d1 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -48,6 +48,9 @@ + \ No newline at end of file diff --git a/app/src/main/java/com/denizd/substitutionplan/FoodFragment.kt b/app/src/main/java/com/denizd/substitutionplan/FoodFragment.kt index 8f49cb0..5437ece 100644 --- a/app/src/main/java/com/denizd/substitutionplan/FoodFragment.kt +++ b/app/src/main/java/com/denizd/substitutionplan/FoodFragment.kt @@ -1,5 +1,6 @@ package com.denizd.substitutionplan +import android.content.Context import android.content.SharedPreferences import android.os.Bundle import android.preference.PreferenceManager @@ -12,47 +13,53 @@ import com.madapps.prefrences.EasyPrefrences class FoodFragment : Fragment(R.layout.food_layout) { - private lateinit var foodArrayList: ArrayList - private lateinit var recyclerView: RecyclerView + public 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 easyPrefs: EasyPrefrences + private lateinit var foodListPopulation: ArrayList + private lateinit var recyclerView: RecyclerView -// override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { -// return inflater.inflate(R.layout.food_layout, null) -// } // TODO do I need this? + override fun onAttach(context: Context) { + super.onAttach(context) + mContext = context + prefs = PreferenceManager.getDefaultSharedPreferences(mContext) +// edit = prefs.edit() + easyPrefs = EasyPrefrences(mContext) + } override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) - val pullToRefresh = getView()?.findViewById(R.id.pullToRefresh) as SwipeRefreshLayout - val prefs = PreferenceManager.getDefaultSharedPreferences(activity) as SharedPreferences -// val edit = prefs.edit() as SharedPreferences.Editor - val easyPrefs = EasyPrefrences(context!!) - val foodListPopulation = ArrayList(easyPrefs.getListString("foodListPrefs")) + val pullToRefresh = view.findViewById(R.id.pullToRefresh) + foodListPopulation = ArrayList(easyPrefs.getListString("foodListPrefs")) try { - recyclerView = getView()?.findViewById(R.id.linear_food) as RecyclerView + recyclerView = view.findViewById(R.id.linear_food) recyclerView.hasFixedSize() - recyclerView.layoutManager = LinearLayoutManager(context, RecyclerView.VERTICAL ,false) + recyclerView.layoutManager = LinearLayoutManager(mContext, RecyclerView.VERTICAL,false) recyclerView.adapter = mAdapter try { recyclerView.removeAllViews() - } catch (e: NullPointerException) {} + } catch (ignored: NullPointerException) {} - for (i in 0..foodListPopulation.size) { + for (i in 0 until foodListPopulation.size) { foodArrayList.add(Food(foodListPopulation[i])) mAdapter.setFood(foodArrayList) recyclerView.scheduleLayoutAnimation() } - } catch (e: NullPointerException) {} + } catch (ignored: NullPointerException) {} if (prefs.getBoolean("autoRefresh", false)) { pullToRefresh.isRefreshing = true - // coroutines + DataFetcher(false, true, false, mContext, activity!!.application, view.rootView).execute() } pullToRefresh.setOnRefreshListener { pullToRefresh.isRefreshing = true - // coroutines + DataFetcher(false, true, false, mContext, activity!!.application, view.rootView).execute() } } diff --git a/app/src/main/java/com/denizd/substitutionplan/FragmentFood.java b/app/src/main/java/com/denizd/substitutionplan/FragmentFood.java index b452b75..c8ec85f 100644 --- a/app/src/main/java/com/denizd/substitutionplan/FragmentFood.java +++ b/app/src/main/java/com/denizd/substitutionplan/FragmentFood.java @@ -49,7 +49,7 @@ public class FragmentFood extends Fragment { @Override public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); - final SwipeRefreshLayout pullToRefresh = getView().findViewById(R.id.pullToRefreshFood); + final SwipeRefreshLayout pullToRefresh = getView().findViewById(R.id.pullToRefresh); final SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(getActivity()); EasyPrefrences easyPrefs = new EasyPrefrences(getContext()); @@ -91,7 +91,7 @@ public class FragmentFood extends Fragment { boolean attempt = false, npe = false; Elements foodElements; Document docFood; - final SwipeRefreshLayout pullToRefresh = getView().findViewById(R.id.pullToRefreshFood); + final SwipeRefreshLayout pullToRefresh = getView().findViewById(R.id.pullToRefresh); protected fetcher() { } diff --git a/app/src/main/java/com/denizd/substitutionplan/Main.kt b/app/src/main/java/com/denizd/substitutionplan/Main.kt index 857f4fd..06b2eef 100644 --- a/app/src/main/java/com/denizd/substitutionplan/Main.kt +++ b/app/src/main/java/com/denizd/substitutionplan/Main.kt @@ -258,15 +258,15 @@ class Main : AppCompatActivity(R.layout.activity_main) { lateinit var fragment: Fragment when (item.itemId) { R.id.plan -> { - fragment = FragmentPlan() + fragment = PlanFragment(false) toolbarTxt.text = getString(R.string.app_name) } R.id.personal -> { - fragment = FragmentPersonal() + fragment = PlanFragment(true) toolbarTxt.text = userPlan } R.id.menu -> { - fragment = FragmentFood() + fragment = FoodFragment() toolbarTxt.text = getString(R.string.foodmenu) } R.id.openinfopanel -> { @@ -317,9 +317,7 @@ class Main : AppCompatActivity(R.layout.activity_main) { } appbarlayout.setExpanded(true) } - } - } private fun loadFragment(fragment: Fragment): Boolean { @@ -328,7 +326,7 @@ class Main : AppCompatActivity(R.layout.activity_main) { } private fun notificationJob() { - val componentName = ComponentName(this, ScheduledJobService::class.java) + val componentName = ComponentName(this, NotificationService::class.java) val info = JobInfo.Builder(42, componentName) .setRequiresCharging(false) .setPersisted(true) diff --git a/app/src/main/java/com/denizd/substitutionplan/NotificationService.kt b/app/src/main/java/com/denizd/substitutionplan/NotificationService.kt index 163d1ff..84a6193 100644 --- a/app/src/main/java/com/denizd/substitutionplan/NotificationService.kt +++ b/app/src/main/java/com/denizd/substitutionplan/NotificationService.kt @@ -1,4 +1,50 @@ package com.denizd.substitutionplan -class NotificationService { +import android.app.job.JobParameters +import android.app.job.JobService +import android.preference.PreferenceManager +import java.io.IOException +import java.lang.NullPointerException +import java.net.MalformedURLException +import java.net.URL + +class NotificationService : JobService() { + + private var jobCancelled = false + private val context = this + + override fun onStartJob(params: JobParameters): Boolean { + doBackgroundWork(params) + return true + } + + override fun onStopJob(params: JobParameters?): Boolean { + jobCancelled = true + return true + } + + private fun doBackgroundWork(params: JobParameters) { + val prefs = PreferenceManager.getDefaultSharedPreferences(context) + val edit = prefs.edit() + + Thread(Runnable { + if (jobCancelled) { + return@Runnable + } + if (prefs.getBoolean("notif", false)) { + edit.putInt("notificationTestNumberDev", prefs.getInt("notificationTestNumberDev", 0) + 1).apply() + try { + val url = URL("https://djd4rkn355.github.io/subst.html") + val connection = url.openConnection() + if (!connection.getHeaderField("Last-Modified").equals(prefs.getString("time", ""))) { + DataFetcher(true, true, true, context, application, null).execute() + edit.putString("time", connection.getHeaderField("Last-Modified")).apply() + } + } catch (ignored: NullPointerException) {} + catch (ignored: IOException) {} + catch (ignored: MalformedURLException) {} + } + jobFinished(params, false) + }).start() + } } \ No newline at end of file diff --git a/app/src/main/java/com/denizd/substitutionplan/PersonalFragment.kt b/app/src/main/java/com/denizd/substitutionplan/PersonalFragment.kt new file mode 100644 index 0000000..9150efb --- /dev/null +++ b/app/src/main/java/com/denizd/substitutionplan/PersonalFragment.kt @@ -0,0 +1,4 @@ +package com.denizd.substitutionplan + +class PersonalFragment { +} \ 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 new file mode 100644 index 0000000..5a4e583 --- /dev/null +++ b/app/src/main/java/com/denizd/substitutionplan/PlanFragment.kt @@ -0,0 +1,151 @@ +package com.denizd.substitutionplan + +import android.content.Context +import android.content.SharedPreferences +import android.content.res.Configuration +import android.os.Bundle +import android.os.Handler +import android.preference.PreferenceManager +import android.view.View +import android.widget.LinearLayout +import android.widget.TextView +import androidx.fragment.app.Fragment +import androidx.lifecycle.Observer +import androidx.lifecycle.ViewModelProviders +import androidx.recyclerview.widget.GridLayoutManager +import androidx.recyclerview.widget.RecyclerView +import androidx.swiperefreshlayout.widget.SwipeRefreshLayout +import java.util.* +import kotlin.collections.ArrayList + +class PlanFragment(isPersonal: Boolean) : Fragment(R.layout.plan) { + private lateinit var recyclerView: RecyclerView + private lateinit var mAdapter: CardAdapter + private lateinit var layoutManager: GridLayoutManager + private val planCardList = ArrayList() + private lateinit var bottomSheetText: TextView + private lateinit var substViewModel: SubstViewModel + private lateinit var mContext: Context + private lateinit var prefs: SharedPreferences + private lateinit var edit: SharedPreferences.Editor + private val personal = isPersonal + + private lateinit var smileydown: TextView + private lateinit var smileydowntext: TextView + private lateinit var linearsmiley: LinearLayout + private var persPlanEmpty: Boolean = true + private val handler = Handler() + + override fun onAttach(context: Context) { + super.onAttach(context) + mContext = context + prefs = PreferenceManager.getDefaultSharedPreferences(mContext) + edit = prefs.edit() + } + + override fun onConfigurationChanged(newConfig: Configuration) { + super.onConfigurationChanged(newConfig) + val grid = when (newConfig.orientation) { + Configuration.ORIENTATION_PORTRAIT -> 1 + else -> 2 + } + layoutManager = GridLayoutManager(mContext, grid) + recyclerView.layoutManager = layoutManager + } + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + val pullToRefresh = view.findViewById(R.id.pullToRefresh) + bottomSheetText = view.rootView.findViewById(R.id.bottom_sheet_text) + + bottomSheetText.text = prefs.getString("informational", getString(R.string.noinfo)) + + recyclerView = view.findViewById(R.id.linearRecycler) + recyclerView.hasFixedSize() + + val grid = when (resources.configuration.orientation) { + Configuration.ORIENTATION_PORTRAIT -> 1 + else -> 2 + } + layoutManager = GridLayoutManager(mContext, grid) + recyclerView.layoutManager = layoutManager + + mAdapter = CardAdapter(planCardList) + recyclerView.adapter = mAdapter + + if (personal) { + smileydown = view.findViewById(R.id.smileydown) + smileydowntext = view.findViewById(R.id.smileydowntext) + linearsmiley = view.findViewById(R.id.linearsmiley) + } + + if (prefs.getInt("firstTimeOpening", 0) == 2) { + if (!prefs.getBoolean("notif", false)) { + pullToRefresh.isRefreshing = true + DataFetcher(true, false, false, mContext, activity!!.application, view.rootView).execute() + edit.putInt("firstTimeOpening", 3).apply() + } + } + + if (prefs.getBoolean("autoRefresh", false)) { + pullToRefresh.isRefreshing = true + DataFetcher(true, false, false, mContext, activity!!.application, view.rootView).execute() + bottomSheetText.text = prefs.getString("informational", getString(R.string.noinfo)) + } + substViewModel = ViewModelProviders.of(activity!!).get(SubstViewModel::class.java) + substViewModel.allSubst.observe(this, Observer> { + if (personal) { + planCardList.clear() + smileydown.visibility = View.GONE + smileydowntext.visibility = View.GONE + linearsmiley.visibility = View.GONE + persPlanEmpty = true + recyclerView.visibility = View.VISIBLE + for (i in 0 until it.size) { + if (prefs.getString("courses", "").isEmpty() && prefs.getString("classes", "").isNotEmpty()) { + if (it[i].group.toString().isNotEmpty() && !it[i].group.equals("")) { + if (prefs.getString("classes", "").contains(it[i].group.toString()) || it[i].group.toString().contains(prefs.getString("classes", "").toString())) { + planCardList.add(it[i]) + persPlanEmpty = false + } + } + } else if (prefs.getString("classes", "").isNotEmpty() && prefs.getString("courses", "").isNotEmpty()) { + if (!it[i].group.equals("") && !it[i].course.equals("")) { + if (prefs.getString("courses", "").contains(it[i].course.toString())) { + if (prefs.getString("classes", "").contains(it[i].group.toString()) || it[i].group.toString().contains(prefs.getString("classes", "").toString())) { + planCardList.add(it[i]) + persPlanEmpty = false + } + } + } + } +// 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) { + recyclerView.visibility = View.GONE + smileydown.visibility = View.VISIBLE + smileydowntext.visibility = View.VISIBLE + linearsmiley.visibility = View.VISIBLE + linearsmiley.scheduleLayoutAnimation() + } + }, 64) + } + } else { + mAdapter.setSubst(it) + recyclerView.scheduleLayoutAnimation() + bottomSheetText.text = prefs.getString("informational", getString(R.string.noinfo)) + } + }) + + pullToRefresh.setOnRefreshListener { + pullToRefresh.isRefreshing = true + DataFetcher(true, false, false, mContext, activity!!.application, view.rootView).execute() + bottomSheetText.text = prefs.getString("informational", getString(R.string.noinfo)) + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/denizd/substitutionplan/SettingsFragment.kt b/app/src/main/java/com/denizd/substitutionplan/SettingsFragment.kt index ec606bf..49e7530 100644 --- a/app/src/main/java/com/denizd/substitutionplan/SettingsFragment.kt +++ b/app/src/main/java/com/denizd/substitutionplan/SettingsFragment.kt @@ -424,8 +424,6 @@ class SettingsFragment : Fragment(R.layout.content_settings), View.OnClickListen val girlCb = dateDialogView.findViewById(R.id.cb2) val percentage = dateDialogView.findViewById(R.id.dating_txtp) - dateDialogView.findViewById(R.id.textviewtitle).text = getString(R.string.dating) - datingBtn.setOnClickListener { try { val dg = MiscData() diff --git a/app/src/main/res/layout/dating_dialog.xml b/app/src/main/res/layout/dating_dialog.xml index 530c21f..6d03cce 100644 --- a/app/src/main/res/layout/dating_dialog.xml +++ b/app/src/main/res/layout/dating_dialog.xml @@ -14,7 +14,8 @@ android:layout_marginTop="16dp" android:textSize="22sp" android:layout_gravity="center_horizontal" - android:textColor="@color/datingPink"/> + android:textColor="@color/datingPink" + android:text="@string/dating"/>