From c18877466ffea8848ef47025c2edd945bb48d1c9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rafa=C5=82=20Borcz?= Date: Mon, 8 Apr 2019 00:18:45 +0200 Subject: [PATCH] Add account picker for timetable widget (#314) Close #281 --- app/src/main/AndroidManifest.xml | 11 +- .../wulkanowy/data/db/SharedPrefHelper.kt | 6 +- .../io/github/wulkanowy/di/BuilderModule.kt | 6 +- .../widgets/TimetableWidgetService.kt | 2 +- .../TimetableWidgetConfigureActivity.kt | 79 ++++++++++++++ .../TimetableWidgetConfigureItem.kt | 53 ++++++++++ .../TimetableWidgetConfigurePresenter.kt | 65 ++++++++++++ .../TimetableWidgetConfigureView.kt | 18 ++++ .../TimetableWidgetFactory.kt | 52 ++++++---- .../TimetableWidgetProvider.kt | 83 ++++++++++++--- .../github/wulkanowy/utils/TimeExtension.kt | 3 + .../res/drawable-hdpi/ic_widget_account.png | Bin 0 -> 461 bytes .../res/drawable-mdpi/ic_widget_account.png | Bin 0 -> 319 bytes .../res/drawable-xhdpi/ic_widget_account.png | Bin 0 -> 596 bytes .../res/drawable-xxhdpi/ic_widget_account.png | Bin 0 -> 922 bytes .../drawable/img_timetable_widget_preview.png | Bin 3425 -> 5284 bytes .../activity_timetable_widget_configure.xml | 31 ++++++ app/src/main/res/layout/item_account.xml | 4 +- .../main/res/layout/item_widget_timetable.xml | 2 +- app/src/main/res/layout/widget_timetable.xml | 97 ++++++++++-------- app/src/main/res/values-night/styles.xml | 5 - app/src/main/res/values-pl/strings.xml | 2 - app/src/main/res/values/dimens.xml | 3 - app/src/main/res/values/strings.xml | 2 - app/src/main/res/values/styles.xml | 8 ++ .../res/xml/provider_widget_timetable.xml | 7 +- 26 files changed, 437 insertions(+), 102 deletions(-) create mode 100644 app/src/main/java/io/github/wulkanowy/ui/modules/timetablewidget/TimetableWidgetConfigureActivity.kt create mode 100644 app/src/main/java/io/github/wulkanowy/ui/modules/timetablewidget/TimetableWidgetConfigureItem.kt create mode 100644 app/src/main/java/io/github/wulkanowy/ui/modules/timetablewidget/TimetableWidgetConfigurePresenter.kt create mode 100644 app/src/main/java/io/github/wulkanowy/ui/modules/timetablewidget/TimetableWidgetConfigureView.kt rename app/src/main/java/io/github/wulkanowy/ui/{widgets/timetable => modules/timetablewidget}/TimetableWidgetFactory.kt (67%) rename app/src/main/java/io/github/wulkanowy/ui/{widgets/timetable => modules/timetablewidget}/TimetableWidgetProvider.kt (57%) create mode 100644 app/src/main/res/drawable-hdpi/ic_widget_account.png create mode 100644 app/src/main/res/drawable-mdpi/ic_widget_account.png create mode 100644 app/src/main/res/drawable-xhdpi/ic_widget_account.png create mode 100644 app/src/main/res/drawable-xxhdpi/ic_widget_account.png create mode 100644 app/src/main/res/layout/activity_timetable_widget_configure.xml diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 0c6edab4..f0dd9cb4 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -45,13 +45,22 @@ android:configChanges="orientation|screenSize" android:label="@string/send_message_title" android:theme="@style/WulkanowyTheme.NoActionBar" /> + + + + + diff --git a/app/src/main/java/io/github/wulkanowy/data/db/SharedPrefHelper.kt b/app/src/main/java/io/github/wulkanowy/data/db/SharedPrefHelper.kt index b3b6f5e3..74f9fa65 100644 --- a/app/src/main/java/io/github/wulkanowy/data/db/SharedPrefHelper.kt +++ b/app/src/main/java/io/github/wulkanowy/data/db/SharedPrefHelper.kt @@ -6,18 +6,16 @@ import javax.inject.Inject import javax.inject.Singleton @Singleton +@SuppressLint("ApplySharedPref") class SharedPrefHelper @Inject constructor(private val sharedPref: SharedPreferences) { - @SuppressLint("ApplySharedPref") fun putLong(key: String, value: Long, sync: Boolean = false) { sharedPref.edit().putLong(key, value).apply { if (sync) commit() else apply() } } - fun getLong(key: String, defaultValue: Long): Long { - return sharedPref.getLong(key, defaultValue) - } + fun getLong(key: String, defaultValue: Long) = sharedPref.getLong(key, defaultValue) fun delete(key: String) { sharedPref.edit().remove(key).apply() diff --git a/app/src/main/java/io/github/wulkanowy/di/BuilderModule.kt b/app/src/main/java/io/github/wulkanowy/di/BuilderModule.kt index 7f477630..2b48029e 100644 --- a/app/src/main/java/io/github/wulkanowy/di/BuilderModule.kt +++ b/app/src/main/java/io/github/wulkanowy/di/BuilderModule.kt @@ -9,7 +9,8 @@ import io.github.wulkanowy.ui.modules.main.MainActivity import io.github.wulkanowy.ui.modules.main.MainModule import io.github.wulkanowy.ui.modules.message.send.SendMessageActivity import io.github.wulkanowy.ui.modules.splash.SplashActivity -import io.github.wulkanowy.ui.widgets.timetable.TimetableWidgetProvider +import io.github.wulkanowy.ui.modules.timetablewidget.TimetableWidgetConfigureActivity +import io.github.wulkanowy.ui.modules.timetablewidget.TimetableWidgetProvider @Module internal abstract class BuilderModule { @@ -29,6 +30,9 @@ internal abstract class BuilderModule { @ContributesAndroidInjector abstract fun bindMessageSendActivity(): SendMessageActivity + @ContributesAndroidInjector + abstract fun bindTimetableWidgetAccountActivity(): TimetableWidgetConfigureActivity + @ContributesAndroidInjector abstract fun bindTimetableWidgetProvider(): TimetableWidgetProvider } diff --git a/app/src/main/java/io/github/wulkanowy/services/widgets/TimetableWidgetService.kt b/app/src/main/java/io/github/wulkanowy/services/widgets/TimetableWidgetService.kt index 0432ee14..f3429457 100644 --- a/app/src/main/java/io/github/wulkanowy/services/widgets/TimetableWidgetService.kt +++ b/app/src/main/java/io/github/wulkanowy/services/widgets/TimetableWidgetService.kt @@ -7,7 +7,7 @@ import io.github.wulkanowy.data.db.SharedPrefHelper import io.github.wulkanowy.data.repositories.semester.SemesterRepository import io.github.wulkanowy.data.repositories.student.StudentRepository import io.github.wulkanowy.data.repositories.timetable.TimetableRepository -import io.github.wulkanowy.ui.widgets.timetable.TimetableWidgetFactory +import io.github.wulkanowy.ui.modules.timetablewidget.TimetableWidgetFactory import io.github.wulkanowy.utils.SchedulersProvider import javax.inject.Inject diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/timetablewidget/TimetableWidgetConfigureActivity.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/timetablewidget/TimetableWidgetConfigureActivity.kt new file mode 100644 index 00000000..37d0571a --- /dev/null +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/timetablewidget/TimetableWidgetConfigureActivity.kt @@ -0,0 +1,79 @@ +package io.github.wulkanowy.ui.modules.timetablewidget + +import android.appwidget.AppWidgetManager.ACTION_APPWIDGET_UPDATE +import android.appwidget.AppWidgetManager.EXTRA_APPWIDGET_ID +import android.appwidget.AppWidgetManager.EXTRA_APPWIDGET_IDS +import android.content.Intent +import android.os.Bundle +import android.widget.Toast +import android.widget.Toast.LENGTH_LONG +import eu.davidea.flexibleadapter.FlexibleAdapter +import eu.davidea.flexibleadapter.common.SmoothScrollLinearLayoutManager +import eu.davidea.flexibleadapter.items.AbstractFlexibleItem +import io.github.wulkanowy.R +import io.github.wulkanowy.ui.base.BaseActivity +import io.github.wulkanowy.ui.modules.login.LoginActivity +import io.github.wulkanowy.ui.modules.timetablewidget.TimetableWidgetProvider.Companion.EXTRA_FROM_PROVIDER +import io.github.wulkanowy.utils.setOnItemClickListener +import kotlinx.android.synthetic.main.activity_timetable_widget_configure.* +import javax.inject.Inject + +class TimetableWidgetConfigureActivity : BaseActivity(), TimetableWidgetConfigureView { + + @Inject + lateinit var configureAdapter: FlexibleAdapter> + + @Inject + lateinit var presenter: TimetableWidgetConfigurePresenter + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + setResult(RESULT_CANCELED) + setContentView(R.layout.activity_timetable_widget_configure) + + intent.extras.let { + presenter.onAttachView(this, it?.getInt(EXTRA_APPWIDGET_ID), it?.getBoolean(EXTRA_FROM_PROVIDER)) + } + } + + override fun initView() { + timetableWidgetConfigureRecycler.apply { + adapter = configureAdapter + layoutManager = SmoothScrollLinearLayoutManager(context) + } + configureAdapter.setOnItemClickListener { presenter.onItemSelect(it) } + } + + override fun updateData(data: List) { + configureAdapter.updateDataSet(data) + } + + override fun updateTimetableWidget(widgetId: Int) { + sendBroadcast(Intent(this, TimetableWidgetProvider::class.java) + .apply { + action = ACTION_APPWIDGET_UPDATE + putExtra(EXTRA_APPWIDGET_IDS, intArrayOf(widgetId)) + }) + } + + override fun setSuccessResult(widgetId: Int) { + setResult(RESULT_OK, Intent().apply { putExtra(EXTRA_APPWIDGET_ID, widgetId) }) + } + + override fun showError(text: String, error: Throwable) { + Toast.makeText(this, text, LENGTH_LONG).show() + } + + override fun finishView() { + finish() + } + + override fun openLoginView() { + startActivity(LoginActivity.getStartIntent(this)) + } + + override fun onDestroy() { + super.onDestroy() + presenter.onDetachView() + } +} diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/timetablewidget/TimetableWidgetConfigureItem.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/timetablewidget/TimetableWidgetConfigureItem.kt new file mode 100644 index 00000000..f6ec1519 --- /dev/null +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/timetablewidget/TimetableWidgetConfigureItem.kt @@ -0,0 +1,53 @@ +package io.github.wulkanowy.ui.modules.timetablewidget + +import android.annotation.SuppressLint +import android.view.View +import eu.davidea.flexibleadapter.FlexibleAdapter +import eu.davidea.flexibleadapter.items.AbstractFlexibleItem +import eu.davidea.flexibleadapter.items.IFlexible +import eu.davidea.viewholders.FlexibleViewHolder +import io.github.wulkanowy.R +import io.github.wulkanowy.data.db.entities.Student +import kotlinx.android.extensions.LayoutContainer +import kotlinx.android.synthetic.main.item_account.* + +class TimetableWidgetConfigureItem(val student: Student, private val isCurrent: Boolean) : + AbstractFlexibleItem() { + + override fun getLayoutRes() = R.layout.item_account + + override fun createViewHolder(view: View, adapter: FlexibleAdapter>): ViewHolder { + return ViewHolder(view, adapter) + } + + @SuppressLint("SetTextI18n") + override fun bindViewHolder(adapter: FlexibleAdapter>, holder: ViewHolder, position: Int, payloads: MutableList) { + holder.apply { + accountItemName.text = "${student.studentName} ${student.className}" + accountItemSchool.text = student.schoolName + accountItemImage.setBackgroundResource(if (isCurrent) R.drawable.ic_account_circular_border else 0) + } + } + + override fun equals(other: Any?): Boolean { + if (this === other) return true + if (javaClass != other?.javaClass) return false + + other as TimetableWidgetConfigureItem + + if (student != other.student) return false + + return true + } + + override fun hashCode(): Int { + var result = student.hashCode() + result = 31 * result + student.id.toInt() + return result + } + + class ViewHolder(view: View, adapter: FlexibleAdapter<*>) : FlexibleViewHolder(view, adapter), LayoutContainer { + override val containerView: View + get() = contentView + } +} diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/timetablewidget/TimetableWidgetConfigurePresenter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/timetablewidget/TimetableWidgetConfigurePresenter.kt new file mode 100644 index 00000000..5a7bdd7c --- /dev/null +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/timetablewidget/TimetableWidgetConfigurePresenter.kt @@ -0,0 +1,65 @@ +package io.github.wulkanowy.ui.modules.timetablewidget + +import eu.davidea.flexibleadapter.items.AbstractFlexibleItem +import io.github.wulkanowy.data.db.SharedPrefHelper +import io.github.wulkanowy.data.db.entities.Student +import io.github.wulkanowy.data.repositories.student.StudentRepository +import io.github.wulkanowy.ui.base.BasePresenter +import io.github.wulkanowy.ui.base.ErrorHandler +import io.github.wulkanowy.ui.modules.timetablewidget.TimetableWidgetProvider.Companion.getStudentWidgetKey +import io.github.wulkanowy.utils.SchedulersProvider +import javax.inject.Inject + +class TimetableWidgetConfigurePresenter @Inject constructor( + private val errorHandler: ErrorHandler, + private val schedulers: SchedulersProvider, + private val studentRepository: StudentRepository, + private val sharedPref: SharedPrefHelper +) : BasePresenter(errorHandler) { + + private var appWidgetId: Int? = null + + private var isFromProvider = false + + fun onAttachView(view: TimetableWidgetConfigureView, appWidgetId: Int?, isFromProvider: Boolean?) { + super.onAttachView(view) + this.appWidgetId = appWidgetId + this.isFromProvider = isFromProvider ?: false + view.initView() + loadData() + } + + fun onItemSelect(item: AbstractFlexibleItem<*>) { + if (item is TimetableWidgetConfigureItem) { + registerStudent(item.student) + } + } + + private fun loadData() { + disposable.add(studentRepository.getSavedStudents(false) + .map { it to appWidgetId?.let { id -> sharedPref.getLong(getStudentWidgetKey(id), 0) } } + .map { (students, currentStudentId) -> + students.map { student -> TimetableWidgetConfigureItem(student, student.id == currentStudentId) } + } + .subscribeOn(schedulers.backgroundThread) + .observeOn(schedulers.mainThread) + .subscribe({ + when { + it.isEmpty() -> view?.openLoginView() + it.size == 1 && !isFromProvider -> registerStudent(it.single().student) + else -> view?.updateData(it) + } + }, { errorHandler.dispatch(it) })) + } + + private fun registerStudent(student: Student) { + appWidgetId?.also { + sharedPref.putLong(getStudentWidgetKey(it), student.id) + view?.apply { + updateTimetableWidget(it) + setSuccessResult(it) + } + } + view?.finishView() + } +} diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/timetablewidget/TimetableWidgetConfigureView.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/timetablewidget/TimetableWidgetConfigureView.kt new file mode 100644 index 00000000..98c800d4 --- /dev/null +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/timetablewidget/TimetableWidgetConfigureView.kt @@ -0,0 +1,18 @@ +package io.github.wulkanowy.ui.modules.timetablewidget + +import io.github.wulkanowy.ui.base.BaseView + +interface TimetableWidgetConfigureView : BaseView { + + fun initView() + + fun updateData(data: List) + + fun updateTimetableWidget(widgetId: Int) + + fun setSuccessResult(widgetId: Int) + + fun finishView() + + fun openLoginView() +} diff --git a/app/src/main/java/io/github/wulkanowy/ui/widgets/timetable/TimetableWidgetFactory.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/timetablewidget/TimetableWidgetFactory.kt similarity index 67% rename from app/src/main/java/io/github/wulkanowy/ui/widgets/timetable/TimetableWidgetFactory.kt rename to app/src/main/java/io/github/wulkanowy/ui/modules/timetablewidget/TimetableWidgetFactory.kt index f2d40ba7..b288f7b7 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/widgets/timetable/TimetableWidgetFactory.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/timetablewidget/TimetableWidgetFactory.kt @@ -1,5 +1,6 @@ -package io.github.wulkanowy.ui.widgets.timetable +package io.github.wulkanowy.ui.modules.timetablewidget +import android.appwidget.AppWidgetManager.EXTRA_APPWIDGET_ID import android.content.Context import android.content.Intent import android.graphics.Paint.ANTI_ALIAS_FLAG @@ -15,9 +16,11 @@ import io.github.wulkanowy.data.db.entities.Timetable import io.github.wulkanowy.data.repositories.semester.SemesterRepository import io.github.wulkanowy.data.repositories.student.StudentRepository import io.github.wulkanowy.data.repositories.timetable.TimetableRepository +import io.github.wulkanowy.ui.modules.timetablewidget.TimetableWidgetProvider.Companion.getDateWidgetKey +import io.github.wulkanowy.ui.modules.timetablewidget.TimetableWidgetProvider.Companion.getStudentWidgetKey import io.github.wulkanowy.utils.SchedulersProvider import io.github.wulkanowy.utils.toFormattedString -import io.reactivex.Single +import io.reactivex.Maybe import org.threeten.bp.LocalDate import timber.log.Timber @@ -48,28 +51,37 @@ class TimetableWidgetFactory( override fun onDestroy() {} override fun onDataSetChanged() { - intent?.action?.let { LocalDate.ofEpochDay(sharedPref.getLong(it, 0)) } - ?.let { date -> - try { - lessons = studentRepository.isStudentSaved() - .flatMap { isSaved -> - if (isSaved) { - studentRepository.getCurrentStudent() - .flatMap { semesterRepository.getCurrentSemester(it) } - .flatMap { timetableRepository.getTimetable(it, date, date) } - } else Single.just(emptyList()) - } - .map { item -> item.sortedBy { it.number } } - .subscribeOn(schedulers.backgroundThread) - .blockingGet() - } catch (e: Exception) { - Timber.e(e, "An error has occurred while downloading data for the widget") - } + intent?.extras?.getInt(EXTRA_APPWIDGET_ID)?.let { appWidgetId -> + val date = LocalDate.ofEpochDay(sharedPref.getLong(getDateWidgetKey(appWidgetId), 0)) + val studentId = sharedPref.getLong(getStudentWidgetKey(appWidgetId), 0) + + lessons = try { + studentRepository.isStudentSaved() + .filter { true } + .flatMap { studentRepository.getSavedStudents().toMaybe() } + .flatMap { + if (studentId == 0L) throw IllegalArgumentException("Student id is 0") + + it.singleOrNull { student -> student.id == studentId } + .let { student -> + if (student != null) Maybe.just(student) + else Maybe.empty() + } + } + .flatMap { semesterRepository.getCurrentSemester(it).toMaybe() } + .flatMap { timetableRepository.getTimetable(it, date, date).toMaybe() } + .map { item -> item.sortedBy { it.number } } + .subscribeOn(schedulers.backgroundThread) + .blockingGet(emptyList()) + } catch (e: Exception) { + Timber.e(e, "An error has occurred in timetable widget factory") + emptyList() } + } } override fun getViewAt(position: Int): RemoteViews? { - if (position == INVALID_POSITION || lessons.getOrNull(position) === null) return null + if (position == INVALID_POSITION || lessons.getOrNull(position) == null) return null return RemoteViews(context.packageName, R.layout.item_widget_timetable).apply { lessons[position].let { diff --git a/app/src/main/java/io/github/wulkanowy/ui/widgets/timetable/TimetableWidgetProvider.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/timetablewidget/TimetableWidgetProvider.kt similarity index 57% rename from app/src/main/java/io/github/wulkanowy/ui/widgets/timetable/TimetableWidgetProvider.kt rename to app/src/main/java/io/github/wulkanowy/ui/modules/timetablewidget/TimetableWidgetProvider.kt index 402366ec..83334c78 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/widgets/timetable/TimetableWidgetProvider.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/timetablewidget/TimetableWidgetProvider.kt @@ -1,4 +1,4 @@ -package io.github.wulkanowy.ui.widgets.timetable +package io.github.wulkanowy.ui.modules.timetablewidget import android.app.PendingIntent import android.app.PendingIntent.FLAG_UPDATE_CURRENT @@ -10,21 +10,28 @@ import android.appwidget.AppWidgetManager.EXTRA_APPWIDGET_IDS import android.content.BroadcastReceiver import android.content.Context import android.content.Intent +import android.content.Intent.FLAG_ACTIVITY_CLEAR_TASK +import android.content.Intent.FLAG_ACTIVITY_NEW_TASK import android.widget.RemoteViews import dagger.android.AndroidInjection import io.github.wulkanowy.R import io.github.wulkanowy.data.db.SharedPrefHelper +import io.github.wulkanowy.data.db.entities.Student +import io.github.wulkanowy.data.repositories.student.StudentRepository import io.github.wulkanowy.services.widgets.TimetableWidgetService import io.github.wulkanowy.ui.modules.main.MainActivity import io.github.wulkanowy.ui.modules.main.MainActivity.Companion.EXTRA_START_MENU_INDEX import io.github.wulkanowy.utils.FirebaseAnalyticsHelper +import io.github.wulkanowy.utils.SchedulersProvider import io.github.wulkanowy.utils.nextOrSameSchoolDay import io.github.wulkanowy.utils.nextSchoolDay import io.github.wulkanowy.utils.previousSchoolDay +import io.github.wulkanowy.utils.shortcutWeekDayName import io.github.wulkanowy.utils.toFormattedString -import io.github.wulkanowy.utils.weekDayName +import io.reactivex.Maybe import org.threeten.bp.LocalDate import org.threeten.bp.LocalDate.now +import timber.log.Timber import javax.inject.Inject class TimetableWidgetProvider : BroadcastReceiver() { @@ -32,13 +39,21 @@ class TimetableWidgetProvider : BroadcastReceiver() { @Inject lateinit var appWidgetManager: AppWidgetManager + @Inject + lateinit var studentRepository: StudentRepository + @Inject lateinit var sharedPref: SharedPrefHelper + @Inject + lateinit var schedulers: SchedulersProvider + @Inject lateinit var analytics: FirebaseAnalyticsHelper companion object { + const val EXTRA_FROM_PROVIDER = "extraFromProvider" + const val EXTRA_TOGGLED_WIDGET_ID = "extraToggledWidget" const val EXTRA_BUTTON_TYPE = "extraButtonType" @@ -49,7 +64,9 @@ class TimetableWidgetProvider : BroadcastReceiver() { const val BUTTON_RESET = "buttonReset" - fun createWidgetKey(appWidgetId: Int) = "timetable_widget_$appWidgetId" + fun getDateWidgetKey(appWidgetId: Int) = "timetable_widget_date_$appWidgetId" + + fun getStudentWidgetKey(appWidgetId: Int) = "timetable_widget_student_$appWidgetId" } override fun onReceive(context: Context, intent: Intent) { @@ -63,12 +80,14 @@ class TimetableWidgetProvider : BroadcastReceiver() { private fun onUpdate(context: Context, intent: Intent) { if (intent.getStringExtra(EXTRA_BUTTON_TYPE) === null) { intent.getIntArrayExtra(EXTRA_APPWIDGET_IDS)?.forEach { appWidgetId -> - updateWidget(context, appWidgetId, now().nextOrSameSchoolDay) + val student = getStudent(sharedPref.getLong(getStudentWidgetKey(appWidgetId), 0), appWidgetId) + updateWidget(context, appWidgetId, now().nextOrSameSchoolDay, student) } } else { val buttonType = intent.getStringExtra(EXTRA_BUTTON_TYPE) val toggledWidgetId = intent.getIntExtra(EXTRA_TOGGLED_WIDGET_ID, 0) - val savedDate = LocalDate.ofEpochDay(sharedPref.getLong(createWidgetKey(toggledWidgetId), 0)) + val student = getStudent(sharedPref.getLong(getStudentWidgetKey(toggledWidgetId), 0), toggledWidgetId) + val savedDate = LocalDate.ofEpochDay(sharedPref.getLong(getDateWidgetKey(toggledWidgetId), 0)) val date = when (buttonType) { BUTTON_RESET -> now().nextOrSameSchoolDay BUTTON_NEXT -> savedDate.nextSchoolDay @@ -76,35 +95,46 @@ class TimetableWidgetProvider : BroadcastReceiver() { else -> now().nextOrSameSchoolDay } if (!buttonType.isNullOrBlank()) analytics.logEvent("changed_timetable_widget_day", "button" to buttonType) - updateWidget(context, toggledWidgetId, date) + updateWidget(context, toggledWidgetId, date, student) } } private fun onDelete(intent: Intent) { intent.getIntExtra(EXTRA_APPWIDGET_ID, 0).let { - if (it != 0) sharedPref.delete(createWidgetKey(it)) + if (it != 0) { + sharedPref.apply { + delete(getStudentWidgetKey(it)) + delete(getDateWidgetKey(it)) + } + } } } - private fun updateWidget(context: Context, appWidgetId: Int, date: LocalDate) { + private fun updateWidget(context: Context, appWidgetId: Int, date: LocalDate, student: Student?) { RemoteViews(context.packageName, R.layout.widget_timetable).apply { setEmptyView(R.id.timetableWidgetList, R.id.timetableWidgetEmpty) - setTextViewText(R.id.timetableWidgetDay, date.weekDayName.capitalize()) - setTextViewText(R.id.timetableWidgetDate, date.toFormattedString()) + setTextViewText(R.id.timetableWidgetDate, "${date.shortcutWeekDayName.capitalize()} ${date.toFormattedString()}") + setTextViewText(R.id.timetableWidgetName, student?.studentName ?: context.getString(R.string.all_no_data)) setRemoteAdapter(R.id.timetableWidgetList, Intent(context, TimetableWidgetService::class.java) - .apply { action = createWidgetKey(appWidgetId) }) + .apply { putExtra(EXTRA_APPWIDGET_ID, appWidgetId) }) setOnClickPendingIntent(R.id.timetableWidgetNext, createNavIntent(context, appWidgetId, appWidgetId, BUTTON_NEXT)) setOnClickPendingIntent(R.id.timetableWidgetPrev, createNavIntent(context, -appWidgetId, appWidgetId, BUTTON_PREV)) - createNavIntent(context, Int.MAX_VALUE - appWidgetId, appWidgetId, BUTTON_RESET).also { + createNavIntent(context, Int.MAX_VALUE - appWidgetId, appWidgetId, BUTTON_RESET).let { setOnClickPendingIntent(R.id.timetableWidgetDate, it) - setOnClickPendingIntent(R.id.timetableWidgetDay, it) + setOnClickPendingIntent(R.id.timetableWidgetName, it) } + setOnClickPendingIntent(R.id.timetableWidgetAccount, PendingIntent.getActivity(context, -Int.MAX_VALUE + appWidgetId, + Intent(context, TimetableWidgetConfigureActivity::class.java).apply { + addFlags(FLAG_ACTIVITY_NEW_TASK or FLAG_ACTIVITY_CLEAR_TASK) + putExtra(EXTRA_APPWIDGET_ID, appWidgetId) + putExtra(EXTRA_FROM_PROVIDER, true) + }, FLAG_UPDATE_CURRENT)) setPendingIntentTemplate(R.id.timetableWidgetList, PendingIntent.getActivity(context, 1, MainActivity.getStartIntent(context).apply { putExtra(EXTRA_START_MENU_INDEX, 3) }, FLAG_UPDATE_CURRENT)) }.also { - sharedPref.putLong(createWidgetKey(appWidgetId), date.toEpochDay(), true) + sharedPref.putLong(getDateWidgetKey(appWidgetId), date.toEpochDay(), true) appWidgetManager.apply { notifyAppWidgetViewDataChanged(appWidgetId, R.id.timetableWidgetList) updateAppWidget(appWidgetId, it) @@ -120,4 +150,29 @@ class TimetableWidgetProvider : BroadcastReceiver() { putExtra(EXTRA_TOGGLED_WIDGET_ID, appWidgetId) }, FLAG_UPDATE_CURRENT) } + + private fun getStudent(id: Long, appWidgetId: Int): Student? { + return try { + studentRepository.isStudentSaved() + .filter { true } + .flatMap { studentRepository.getSavedStudents(false).toMaybe() } + .flatMap { students -> + students.singleOrNull { student -> student.id == id } + .let { student -> + if (student != null) { + Maybe.just(student) + } else { + studentRepository.getCurrentStudent(false) + .toMaybe() + .doOnSuccess { sharedPref.putLong(getStudentWidgetKey(appWidgetId), it.id) } + } + } + } + .subscribeOn(schedulers.backgroundThread) + .blockingGet() + } catch (e: Exception) { + Timber.e(e, "An error has occurred in timetable widget provider") + null + } + } } diff --git a/app/src/main/java/io/github/wulkanowy/utils/TimeExtension.kt b/app/src/main/java/io/github/wulkanowy/utils/TimeExtension.kt index 886b3d4d..426816f4 100644 --- a/app/src/main/java/io/github/wulkanowy/utils/TimeExtension.kt +++ b/app/src/main/java/io/github/wulkanowy/utils/TimeExtension.kt @@ -99,6 +99,9 @@ inline val LocalDate.previousOrSameSchoolDay: LocalDate inline val LocalDate.weekDayName: String get() = this.format(ofPattern("EEEE", Locale.getDefault())) +inline val LocalDate.shortcutWeekDayName: String + get() = this.format(ofPattern("EEE", Locale.getDefault())) + inline val LocalDate.monday: LocalDate get() = this.with(MONDAY) diff --git a/app/src/main/res/drawable-hdpi/ic_widget_account.png b/app/src/main/res/drawable-hdpi/ic_widget_account.png new file mode 100644 index 0000000000000000000000000000000000000000..4cb5ac89ee607739a25ef940414c0078935095ee GIT binary patch literal 461 zcmV;;0W$uHP)ez@{UYVF$Jfuci`E`od4Yrm^74g<_qLzlw1t96tD2r5~( z4yC!a0tjkZH&*}E!)e?`9aA7RNM zKUoTIKogt`O?egvAM#VT2BmUQOzkS2%0C;9mKOU2BUBLzN;jw600000NkvXXu0mjf DT=U0= literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-mdpi/ic_widget_account.png b/app/src/main/res/drawable-mdpi/ic_widget_account.png new file mode 100644 index 0000000000000000000000000000000000000000..237a6b6c2f50466f445527c9e5bdd4e36d653890 GIT binary patch literal 319 zcmV-F0l@x=P)DN5-{$#d zetB=^&0_J_5<++&27AzgE74L+e)DWMkHAUHOXfr-8#`bp%q7=2ItB%^_yKaTCUT06 zRp^w3Q^w?G6SG-0h1_tTu zMPo)q4-$>d6UtSO3dOLi!3Ma49G7CX(Xg8t*YYpVL~lK=KmOo+?aBNZJpn_cLIUNR RPo)3=002ovPDHLkV1k4EipKx| literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xhdpi/ic_widget_account.png b/app/src/main/res/drawable-xhdpi/ic_widget_account.png new file mode 100644 index 0000000000000000000000000000000000000000..0ea798a8a340da00140b71138d6a538183b29bd6 GIT binary patch literal 596 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 + + + + + + diff --git a/app/src/main/res/layout/item_account.xml b/app/src/main/res/layout/item_account.xml index 56f553e5..5f76dded 100644 --- a/app/src/main/res/layout/item_account.xml +++ b/app/src/main/res/layout/item_account.xml @@ -33,7 +33,8 @@ android:ellipsize="end" android:maxLines="1" android:textSize="16sp" - tools:text="@tools:sample/lorem/random" /> + tools:text="@tools:sample/lorem/random" + android:textColor="?android:textColorSecondary"/> diff --git a/app/src/main/res/layout/item_widget_timetable.xml b/app/src/main/res/layout/item_widget_timetable.xml index af055280..aa808864 100644 --- a/app/src/main/res/layout/item_widget_timetable.xml +++ b/app/src/main/res/layout/item_widget_timetable.xml @@ -7,7 +7,7 @@ android:background="@drawable/ic_all_divider" android:minHeight="45dp" android:orientation="horizontal" - tools:context=".ui.widgets.timetable.TimetableWidgetFactory"> + tools:context=".ui.modules.timetablewidget.TimetableWidgetFactory"> + tools:context=".ui.modules.timetablewidget.TimetableWidgetProvider"> + + + + + + + + + - - - - - @color/about_libraries_dividerDark_openSource_dark @color/about_libraries_dividerLight_openSource_dark - - diff --git a/app/src/main/res/values-pl/strings.xml b/app/src/main/res/values-pl/strings.xml index 3caa356e..144772a5 100644 --- a/app/src/main/res/values-pl/strings.xml +++ b/app/src/main/res/values-pl/strings.xml @@ -233,8 +233,6 @@ Brak lekcji - Dziś - Jutro diff --git a/app/src/main/res/values/dimens.xml b/app/src/main/res/values/dimens.xml index e0708095..a4bf80ed 100644 --- a/app/src/main/res/values/dimens.xml +++ b/app/src/main/res/values/dimens.xml @@ -2,7 +2,4 @@ 8dp 8dp - - - 60dp diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 6a56b441..a00514be 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -218,8 +218,6 @@ No lessons - Today - Tomorrow diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml index 4bbe3bc1..58cd99eb 100644 --- a/app/src/main/res/values/styles.xml +++ b/app/src/main/res/values/styles.xml @@ -40,4 +40,12 @@ + + diff --git a/app/src/main/res/xml/provider_widget_timetable.xml b/app/src/main/res/xml/provider_widget_timetable.xml index 48c6ba39..1e0eedcb 100644 --- a/app/src/main/res/xml/provider_widget_timetable.xml +++ b/app/src/main/res/xml/provider_widget_timetable.xml @@ -1,8 +1,11 @@