diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/luckynumberwidget/LuckyNumberWidgetConfigureActivity.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/luckynumberwidget/LuckyNumberWidgetConfigureActivity.kt index 3dd0e5df..e8ce3bcf 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/luckynumberwidget/LuckyNumberWidgetConfigureActivity.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/luckynumberwidget/LuckyNumberWidgetConfigureActivity.kt @@ -6,6 +6,7 @@ import android.appwidget.AppWidgetManager.EXTRA_APPWIDGET_IDS import android.content.Intent import android.os.Bundle import android.widget.Toast +import androidx.appcompat.app.AlertDialog import eu.davidea.flexibleadapter.FlexibleAdapter import eu.davidea.flexibleadapter.common.SmoothScrollLinearLayoutManager import eu.davidea.flexibleadapter.items.AbstractFlexibleItem @@ -25,6 +26,8 @@ class LuckyNumberWidgetConfigureActivity : BaseActivity<LuckyNumberWidgetConfigu @Inject override lateinit var presenter: LuckyNumberWidgetConfigurePresenter + private var dialog: AlertDialog? = null + override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setResult(RESULT_CANCELED) @@ -36,11 +39,27 @@ class LuckyNumberWidgetConfigureActivity : BaseActivity<LuckyNumberWidgetConfigu } override fun initView() { - widgetConfigureRecycler.apply { + with(widgetConfigureRecycler) { adapter = configureAdapter layoutManager = SmoothScrollLinearLayoutManager(context) } - configureAdapter.setOnItemClickListener { presenter.onItemSelect(it) } + + configureAdapter.setOnItemClickListener(presenter::onItemSelect) + } + + override fun showThemeDialog() { + val items = arrayOf( + getString(R.string.widget_timetable_theme_light), + getString(R.string.widget_timetable_theme_dark) + ) + + dialog = AlertDialog.Builder(this, R.style.WulkanowyTheme_WidgetAccountSwitcher) + .setTitle(R.string.widget_timetable_theme_title) + .setOnDismissListener { presenter.onDismissThemeView() } + .setSingleChoiceItems(items, -1) { _, which -> + presenter.onThemeSelect(which) + } + .show() } override fun updateData(data: List<LuckyNumberWidgetConfigureItem>) { @@ -70,4 +89,9 @@ class LuckyNumberWidgetConfigureActivity : BaseActivity<LuckyNumberWidgetConfigu override fun openLoginView() { startActivity(LoginActivity.getStartIntent(this)) } + + override fun onDestroy() { + super.onDestroy() + dialog?.dismiss() + } } diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/luckynumberwidget/LuckyNumberWidgetConfigurePresenter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/luckynumberwidget/LuckyNumberWidgetConfigurePresenter.kt index 6f4394ed..3c8f18a0 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/luckynumberwidget/LuckyNumberWidgetConfigurePresenter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/luckynumberwidget/LuckyNumberWidgetConfigurePresenter.kt @@ -7,6 +7,7 @@ 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.luckynumberwidget.LuckyNumberWidgetProvider.Companion.getStudentWidgetKey +import io.github.wulkanowy.ui.modules.luckynumberwidget.LuckyNumberWidgetProvider.Companion.getThemeWidgetKey import io.github.wulkanowy.utils.SchedulersProvider import javax.inject.Inject @@ -19,6 +20,8 @@ class LuckyNumberWidgetConfigurePresenter @Inject constructor( private var appWidgetId: Int? = null + private var selectedStudent: Student? = null + fun onAttachView(view: LuckyNumberWidgetConfigureView, appWidgetId: Int?) { super.onAttachView(view) this.appWidgetId = appWidgetId @@ -28,10 +31,22 @@ class LuckyNumberWidgetConfigurePresenter @Inject constructor( fun onItemSelect(item: AbstractFlexibleItem<*>) { if (item is LuckyNumberWidgetConfigureItem) { - registerStudent(item.student) + selectedStudent = item.student + view?.showThemeDialog() } } + fun onThemeSelect(index: Int) { + appWidgetId?.let { + sharedPref.putLong(getThemeWidgetKey(it), index.toLong()) + } + registerStudent(selectedStudent) + } + + fun onDismissThemeView(){ + view?.finishView() + } + private fun loadData() { disposable.add(studentRepository.getSavedStudents(false) .map { it to appWidgetId?.let { id -> sharedPref.getLong(getStudentWidgetKey(id), 0) } } @@ -49,12 +64,14 @@ class LuckyNumberWidgetConfigurePresenter @Inject constructor( }, { errorHandler.dispatch(it) })) } - private fun registerStudent(student: Student) { - appWidgetId?.also { - sharedPref.putLong(getStudentWidgetKey(it), student.id) - view?.apply { - updateLuckyNumberWidget(it) - setSuccessResult(it) + private fun registerStudent(student: Student?) { + requireNotNull(student) + + appWidgetId?.let { id -> + sharedPref.putLong(getStudentWidgetKey(id), student.id) + view?.run { + updateLuckyNumberWidget(id) + setSuccessResult(id) } } view?.finishView() diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/luckynumberwidget/LuckyNumberWidgetConfigureView.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/luckynumberwidget/LuckyNumberWidgetConfigureView.kt index 49c3f1dc..fa4c0cc6 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/luckynumberwidget/LuckyNumberWidgetConfigureView.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/luckynumberwidget/LuckyNumberWidgetConfigureView.kt @@ -1,12 +1,13 @@ package io.github.wulkanowy.ui.modules.luckynumberwidget import io.github.wulkanowy.ui.base.BaseView -import io.github.wulkanowy.ui.modules.timetablewidget.TimetableWidgetConfigureItem interface LuckyNumberWidgetConfigureView : BaseView { fun initView() + fun showThemeDialog() + fun updateData(data: List<LuckyNumberWidgetConfigureItem>) fun updateLuckyNumberWidget(widgetId: Int) diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/luckynumberwidget/LuckyNumberWidgetProvider.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/luckynumberwidget/LuckyNumberWidgetProvider.kt index 895fe571..12753b35 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/luckynumberwidget/LuckyNumberWidgetProvider.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/luckynumberwidget/LuckyNumberWidgetProvider.kt @@ -55,7 +55,10 @@ class LuckyNumberWidgetProvider : BroadcastReceiver() { lateinit var sharedPref: SharedPrefProvider companion object { + fun getStudentWidgetKey(appWidgetId: Int) = "lucky_number_widget_student_$appWidgetId" + + fun getThemeWidgetKey(appWidgetId: Int) = "lucky_number_widget_theme_$appWidgetId" } @TargetApi(Build.VERSION_CODES.JELLY_BEAN) @@ -70,24 +73,26 @@ class LuckyNumberWidgetProvider : BroadcastReceiver() { private fun onUpdate(context: Context, intent: Intent) { intent.getIntArrayExtra(EXTRA_APPWIDGET_IDS)?.forEach { appWidgetId -> - RemoteViews(context.packageName, R.layout.widget_luckynumber).apply { - setTextViewText(R.id.luckyNumberWidgetNumber, - getLuckyNumber(sharedPref.getLong(getStudentWidgetKey(appWidgetId), 0), appWidgetId)?.luckyNumber?.toString() ?: "#" - ) - setOnClickPendingIntent(R.id.luckyNumberWidgetContainer, - PendingIntent.getActivity(context, MainView.Section.LUCKY_NUMBER.id, - MainActivity.getStartIntent(context, MainView.Section.LUCKY_NUMBER, true), FLAG_UPDATE_CURRENT)) - }.also { - setStyles(it, intent) - appWidgetManager.updateAppWidget(appWidgetId, it) + val savedTheme = sharedPref.getLong(getThemeWidgetKey(appWidgetId), 0) + val layoutId = if (savedTheme == 0L) R.layout.widget_luckynumber else R.layout.widget_luckynumber_dark + + val luckyNumber = getLuckyNumber(sharedPref.getLong(getStudentWidgetKey(appWidgetId), 0), appWidgetId) + val appIntent = PendingIntent.getActivity(context, MainView.Section.LUCKY_NUMBER.id, + MainActivity.getStartIntent(context, MainView.Section.LUCKY_NUMBER, true), FLAG_UPDATE_CURRENT) + + val remoteView = RemoteViews(context.packageName, layoutId).apply { + setTextViewText(R.id.luckyNumberWidgetNumber, luckyNumber?.luckyNumber?.toString() ?: "#") + setOnClickPendingIntent(R.id.luckyNumberWidgetContainer, appIntent) } + + setStyles(remoteView, intent) + appWidgetManager.updateAppWidget(appWidgetId, remoteView) } } private fun onDelete(intent: Intent) { - intent.getIntExtra(EXTRA_APPWIDGET_ID, 0).let { - if (it != 0) sharedPref.delete(getStudentWidgetKey(it)) - } + val appWidgetId = intent.getIntExtra(EXTRA_APPWIDGET_ID, 0) + if (appWidgetId != 0) sharedPref.delete(getStudentWidgetKey(appWidgetId)) } private fun getLuckyNumber(studentId: Long, appWidgetId: Int): LuckyNumber? { @@ -96,19 +101,17 @@ class LuckyNumberWidgetProvider : BroadcastReceiver() { .filter { true } .flatMap { studentRepository.getSavedStudents().toMaybe() } .flatMap { students -> - students.singleOrNull { student -> student.id == studentId } - .let { student -> - when { - student != null -> Maybe.just(student) - studentId != 0L -> { - studentRepository.isCurrentStudentSet() - .filter { true } - .flatMap { studentRepository.getCurrentStudent(false).toMaybe() } - .doOnSuccess { sharedPref.putLong(getStudentWidgetKey(appWidgetId), it.id) } - } - else -> Maybe.empty() - } + val student = students.singleOrNull { student -> student.id == studentId } + when { + student != null -> Maybe.just(student) + studentId != 0L -> { + studentRepository.isCurrentStudentSet() + .filter { true } + .flatMap { studentRepository.getCurrentStudent(false).toMaybe() } + .doOnSuccess { sharedPref.putLong(getStudentWidgetKey(appWidgetId), it.id) } } + else -> Maybe.empty() + } } .flatMap { semesterRepository.getCurrentSemester(it).toMaybe() } .flatMap { luckyNumberRepository.getLuckyNumber(it) } @@ -123,11 +126,14 @@ class LuckyNumberWidgetProvider : BroadcastReceiver() { } private fun onOptionsChange(context: Context, intent: Intent) { - intent.extras?.let { extras -> - RemoteViews(context.packageName, R.layout.widget_luckynumber).apply { - setStyles(this, intent) - appWidgetManager.updateAppWidget(extras.getInt(EXTRA_APPWIDGET_ID), this) - } + intent.extras?.getInt(EXTRA_APPWIDGET_ID)?.let { appWidgetId -> + val savedTheme = sharedPref.getLong(getThemeWidgetKey(appWidgetId), 0) + val layoutId = if (savedTheme == 0L) R.layout.widget_luckynumber else R.layout.widget_luckynumber_dark + + val remoteView = RemoteViews(context.packageName, layoutId) + + setStyles(remoteView, intent) + appWidgetManager.updateAppWidget(appWidgetId, remoteView) } } @@ -144,7 +150,7 @@ class LuckyNumberWidgetProvider : BroadcastReceiver() { // 1x1 maxWidth < 150 && maxHeight < 110 -> { Timber.d("Lucky number widget size: 1x1") - views.run { + with(views) { setViewVisibility(R.id.luckyNumberWidgetImageTop, GONE) setViewVisibility(R.id.luckyNumberWidgetImageLeft, GONE) setViewVisibility(R.id.luckyNumberWidgetTitle, GONE) @@ -154,7 +160,7 @@ class LuckyNumberWidgetProvider : BroadcastReceiver() { // 1x2 maxWidth < 150 && maxHeight > 110 -> { Timber.d("Lucky number widget size: 1x2") - views.run { + with(views) { setViewVisibility(R.id.luckyNumberWidgetImageTop, VISIBLE) setViewVisibility(R.id.luckyNumberWidgetImageLeft, GONE) setViewVisibility(R.id.luckyNumberWidgetTitle, GONE) @@ -164,7 +170,7 @@ class LuckyNumberWidgetProvider : BroadcastReceiver() { // 2x1 maxWidth >= 150 && maxHeight <= 110 -> { Timber.d("Lucky number widget size: 2x1") - views.run { + with(views) { setViewVisibility(R.id.luckyNumberWidgetImageTop, GONE) setViewVisibility(R.id.luckyNumberWidgetImageLeft, VISIBLE) setViewVisibility(R.id.luckyNumberWidgetTitle, GONE) @@ -174,7 +180,7 @@ class LuckyNumberWidgetProvider : BroadcastReceiver() { // 2x2 and bigger else -> { Timber.d("Lucky number widget size: 2x2 and bigger") - views.run { + with(views) { setViewVisibility(R.id.luckyNumberWidgetImageTop, GONE) setViewVisibility(R.id.luckyNumberWidgetImageLeft, GONE) setViewVisibility(R.id.luckyNumberWidgetTitle, VISIBLE) 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 index 79dd59bf..7636637f 100644 --- 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 @@ -7,6 +7,7 @@ import android.content.Intent import android.os.Bundle import android.widget.Toast import android.widget.Toast.LENGTH_LONG +import androidx.appcompat.app.AlertDialog import eu.davidea.flexibleadapter.FlexibleAdapter import eu.davidea.flexibleadapter.common.SmoothScrollLinearLayoutManager import eu.davidea.flexibleadapter.items.AbstractFlexibleItem @@ -27,6 +28,8 @@ class TimetableWidgetConfigureActivity : BaseActivity<TimetableWidgetConfigurePr @Inject override lateinit var presenter: TimetableWidgetConfigurePresenter + private var dialog: AlertDialog? = null + override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setResult(RESULT_CANCELED) @@ -38,11 +41,27 @@ class TimetableWidgetConfigureActivity : BaseActivity<TimetableWidgetConfigurePr } override fun initView() { - widgetConfigureRecycler.apply { + with(widgetConfigureRecycler) { adapter = configureAdapter layoutManager = SmoothScrollLinearLayoutManager(context) } - configureAdapter.setOnItemClickListener { presenter.onItemSelect(it) } + + configureAdapter.setOnItemClickListener(presenter::onItemSelect) + } + + override fun showThemeDialog() { + val items = arrayOf( + getString(R.string.widget_timetable_theme_light), + getString(R.string.widget_timetable_theme_dark) + ) + + dialog = AlertDialog.Builder(this, R.style.WulkanowyTheme_WidgetAccountSwitcher) + .setTitle(R.string.widget_timetable_theme_title) + .setOnDismissListener { presenter.onDismissThemeView() } + .setSingleChoiceItems(items, -1) { _, which -> + presenter.onThemeSelect(which) + } + .show() } override fun updateData(data: List<TimetableWidgetConfigureItem>) { @@ -72,4 +91,9 @@ class TimetableWidgetConfigureActivity : BaseActivity<TimetableWidgetConfigurePr override fun openLoginView() { startActivity(LoginActivity.getStartIntent(this)) } + + override fun onDestroy() { + super.onDestroy() + dialog?.dismiss() + } } 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 index 9c0202db..e1685108 100644 --- 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 @@ -7,6 +7,7 @@ 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.ui.modules.timetablewidget.TimetableWidgetProvider.Companion.getThemeWidgetKey import io.github.wulkanowy.utils.SchedulersProvider import javax.inject.Inject @@ -21,6 +22,8 @@ class TimetableWidgetConfigurePresenter @Inject constructor( private var isFromProvider = false + private var selectedStudent: Student? = null + fun onAttachView(view: TimetableWidgetConfigureView, appWidgetId: Int?, isFromProvider: Boolean?) { super.onAttachView(view) this.appWidgetId = appWidgetId @@ -31,10 +34,24 @@ class TimetableWidgetConfigurePresenter @Inject constructor( fun onItemSelect(item: AbstractFlexibleItem<*>) { if (item is TimetableWidgetConfigureItem) { - registerStudent(item.student) + selectedStudent = item.student + + if (isFromProvider) registerStudent(selectedStudent) + else view?.showThemeDialog() } } + fun onThemeSelect(index: Int) { + appWidgetId?.let { + sharedPref.putLong(getThemeWidgetKey(it), index.toLong()) + } + registerStudent(selectedStudent) + } + + fun onDismissThemeView(){ + view?.finishView() + } + private fun loadData() { disposable.add(studentRepository.getSavedStudents(false) .map { it to appWidgetId?.let { id -> sharedPref.getLong(getStudentWidgetKey(id), 0) } } @@ -46,18 +63,23 @@ class TimetableWidgetConfigurePresenter @Inject constructor( .subscribe({ when { it.isEmpty() -> view?.openLoginView() - it.size == 1 && !isFromProvider -> registerStudent(it.single().student) + it.size == 1 && !isFromProvider -> { + selectedStudent = it.single().student + view?.showThemeDialog() + } 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) + private fun registerStudent(student: Student?) { + requireNotNull(student) + + appWidgetId?.let { id -> + sharedPref.putLong(getStudentWidgetKey(id), student.id) + view?.run { + updateTimetableWidget(id) + setSuccessResult(id) } } 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 index 98c800d4..7cac892d 100644 --- 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 @@ -10,6 +10,8 @@ interface TimetableWidgetConfigureView : BaseView { fun updateTimetableWidget(widgetId: Int) + fun showThemeDialog() + fun setSuccessResult(widgetId: Int) fun finishView() diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/timetablewidget/TimetableWidgetFactory.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/timetablewidget/TimetableWidgetFactory.kt index a0a519e2..a2591ac8 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/timetablewidget/TimetableWidgetFactory.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/timetablewidget/TimetableWidgetFactory.kt @@ -1,5 +1,6 @@ package io.github.wulkanowy.ui.modules.timetablewidget +import android.annotation.SuppressLint import android.appwidget.AppWidgetManager.EXTRA_APPWIDGET_ID import android.content.Context import android.content.Intent @@ -18,6 +19,7 @@ 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.ui.modules.timetablewidget.TimetableWidgetProvider.Companion.getThemeWidgetKey import io.github.wulkanowy.utils.SchedulersProvider import io.github.wulkanowy.utils.toFormattedString import io.reactivex.Maybe @@ -36,6 +38,8 @@ class TimetableWidgetFactory( private var lessons = emptyList<Timetable>() + private var layoutId: Int? = null + override fun getLoadingView() = null override fun hasStableIds() = true @@ -55,16 +59,18 @@ class TimetableWidgetFactory( val date = LocalDate.ofEpochDay(sharedPref.getLong(getDateWidgetKey(appWidgetId), 0)) val studentId = sharedPref.getLong(getStudentWidgetKey(appWidgetId), 0) + val savedTheme = sharedPref.getLong(getThemeWidgetKey(appWidgetId), 0) + layoutId = if (savedTheme == 0L) R.layout.item_widget_timetable else R.layout.item_widget_timetable_dark + lessons = try { studentRepository.isStudentSaved() .filter { true } .flatMap { studentRepository.getSavedStudents().toMaybe() } .flatMap { - it.singleOrNull { student -> student.id == studentId } - .let { student -> - if (student != null) Maybe.just(student) - else Maybe.empty() - } + val student = it.singleOrNull { student -> student.id == studentId } + + if (student != null) Maybe.just(student) + else Maybe.empty() } .flatMap { semesterRepository.getCurrentSemester(it).toMaybe() } .flatMap { timetableRepository.getTimetable(it, date, date).toMaybe() } @@ -78,39 +84,42 @@ class TimetableWidgetFactory( } } + @SuppressLint("DefaultLocale") override fun getViewAt(position: Int): RemoteViews? { if (position == INVALID_POSITION || lessons.getOrNull(position) == null) return null - return RemoteViews(context.packageName, R.layout.item_widget_timetable).apply { - lessons[position].let { - setTextViewText(R.id.timetableWidgetItemSubject, it.subject) - setTextViewText(R.id.timetableWidgetItemNumber, it.number.toString()) - setTextViewText(R.id.timetableWidgetItemTime, it.start.toFormattedString("HH:mm") + - " - ${it.end.toFormattedString("HH:mm")}") + return RemoteViews(context.packageName, layoutId!!).apply { + val lesson = lessons[position] - if (it.room.isNotBlank()) { - setTextViewText(R.id.timetableWidgetItemRoom, "${context.getString(R.string.timetable_room)} ${it.room}") - } else setTextViewText(R.id.timetableWidgetItemRoom, "") + setTextViewText(R.id.timetableWidgetItemSubject, lesson.subject) + setTextViewText(R.id.timetableWidgetItemNumber, lesson.number.toString()) + setTextViewText(R.id.timetableWidgetItemTime, lesson.start.toFormattedString("HH:mm") + + " - ${lesson.end.toFormattedString("HH:mm")}") - if (it.info.isNotBlank()) { - setViewVisibility(R.id.timetableWidgetItemDescription, VISIBLE) - setTextViewText(R.id.timetableWidgetItemDescription, it.run { + if (lesson.room.isNotBlank()) { + setTextViewText(R.id.timetableWidgetItemRoom, "${context.getString(R.string.timetable_room)} ${lesson.room}") + } else setTextViewText(R.id.timetableWidgetItemRoom, "") + + if (lesson.info.isNotBlank()) { + setViewVisibility(R.id.timetableWidgetItemDescription, VISIBLE) + setTextViewText(R.id.timetableWidgetItemDescription, + with(lesson) { when (true) { - canceled && !changes -> "Lekcja odwołana: $info" - changes && teacher.isNotBlank() -> "Zastępstwo: $teacher" - changes && teacher.isBlank() -> "Zastępstwo, ${info.decapitalize()}" - else -> it.info.capitalize() + canceled && !changes -> "Lekcja odwołana: ${lesson.info}" + changes && teacher.isNotBlank() -> "Zastępstwo: ${lesson.teacher}" + changes && teacher.isBlank() -> "Zastępstwo, ${lesson.info.decapitalize()}" + else -> info.capitalize() } }) - } else setViewVisibility(R.id.timetableWidgetItemDescription, GONE) + } else setViewVisibility(R.id.timetableWidgetItemDescription, GONE) - if (it.canceled) { - setInt(R.id.timetableWidgetItemSubject, "setPaintFlags", - STRIKE_THRU_TEXT_FLAG or ANTI_ALIAS_FLAG) - } else { - setInt(R.id.timetableWidgetItemSubject, "setPaintFlags", ANTI_ALIAS_FLAG) - } + if (lesson.canceled) { + setInt(R.id.timetableWidgetItemSubject, "setPaintFlags", + STRIKE_THRU_TEXT_FLAG or ANTI_ALIAS_FLAG) + } else { + setInt(R.id.timetableWidgetItemSubject, "setPaintFlags", ANTI_ALIAS_FLAG) } + setOnClickFillInIntent(R.id.timetableWidgetItemContainer, Intent()) } } diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/timetablewidget/TimetableWidgetProvider.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/timetablewidget/TimetableWidgetProvider.kt index dadbe050..416696a5 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/timetablewidget/TimetableWidgetProvider.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/timetablewidget/TimetableWidgetProvider.kt @@ -54,21 +54,24 @@ class TimetableWidgetProvider : BroadcastReceiver() { lateinit var analytics: FirebaseAnalyticsHelper companion object { + + private const val EXTRA_TOGGLED_WIDGET_ID = "extraToggledWidget" + + private const val EXTRA_BUTTON_TYPE = "extraButtonType" + + private const val BUTTON_NEXT = "buttonNext" + + private const val BUTTON_PREV = "buttonPrev" + + private const val BUTTON_RESET = "buttonReset" + const val EXTRA_FROM_PROVIDER = "extraFromProvider" - const val EXTRA_TOGGLED_WIDGET_ID = "extraToggledWidget" - - const val EXTRA_BUTTON_TYPE = "extraButtonType" - - const val BUTTON_NEXT = "buttonNext" - - const val BUTTON_PREV = "buttonPrev" - - const val BUTTON_RESET = "buttonReset" - fun getDateWidgetKey(appWidgetId: Int) = "timetable_widget_date_$appWidgetId" fun getStudentWidgetKey(appWidgetId: Int) = "timetable_widget_student_$appWidgetId" + + fun getThemeWidgetKey(appWidgetId: Int) = "timetable_widget_theme_$appWidgetId" } override fun onReceive(context: Context, intent: Intent) { @@ -102,45 +105,56 @@ class TimetableWidgetProvider : BroadcastReceiver() { } private fun onDelete(intent: Intent) { - intent.getIntExtra(EXTRA_APPWIDGET_ID, 0).let { - if (it != 0) { - sharedPref.apply { - delete(getStudentWidgetKey(it)) - delete(getDateWidgetKey(it)) - } + val appWidgetId = intent.getIntExtra(EXTRA_APPWIDGET_ID, 0) + + if (appWidgetId != 0) { + with(sharedPref) { + delete(getStudentWidgetKey(appWidgetId)) + delete(getDateWidgetKey(appWidgetId)) } } } @SuppressLint("DefaultLocale") private fun updateWidget(context: Context, appWidgetId: Int, date: LocalDate, student: Student?) { - RemoteViews(context.packageName, R.layout.widget_timetable).apply { + val savedTheme = sharedPref.getLong(getThemeWidgetKey(appWidgetId), 0) + val layoutId = if (savedTheme == 0L) R.layout.widget_timetable else R.layout.widget_timetable_dark + + val nextNavIntent = createNavIntent(context, appWidgetId, appWidgetId, BUTTON_NEXT) + val prevNavIntent = createNavIntent(context, -appWidgetId, appWidgetId, BUTTON_PREV) + val resetNavIntent = createNavIntent(context, Int.MAX_VALUE - appWidgetId, appWidgetId, BUTTON_RESET) + val adapterIntent = Intent(context, TimetableWidgetService::class.java) + .apply { + putExtra(EXTRA_APPWIDGET_ID, appWidgetId) + //make Intent unique + action = appWidgetId.toString() + } + val accountIntent = 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) + val appIntent = PendingIntent.getActivity(context, MainView.Section.TIMETABLE.id, + MainActivity.getStartIntent(context, MainView.Section.TIMETABLE, true), FLAG_UPDATE_CURRENT) + + val remoteView = RemoteViews(context.packageName, layoutId).apply { setEmptyView(R.id.timetableWidgetList, R.id.timetableWidgetEmpty) 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 { 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).let { - setOnClickPendingIntent(R.id.timetableWidgetDate, 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, MainView.Section.TIMETABLE.id, - MainActivity.getStartIntent(context, MainView.Section.TIMETABLE, true), FLAG_UPDATE_CURRENT)) - }.also { - sharedPref.putLong(getDateWidgetKey(appWidgetId), date.toEpochDay(), true) - appWidgetManager.apply { - notifyAppWidgetViewDataChanged(appWidgetId, R.id.timetableWidgetList) - updateAppWidget(appWidgetId, it) - } + setRemoteAdapter(R.id.timetableWidgetList, adapterIntent) + setOnClickPendingIntent(R.id.timetableWidgetNext, nextNavIntent) + setOnClickPendingIntent(R.id.timetableWidgetPrev, prevNavIntent) + setOnClickPendingIntent(R.id.timetableWidgetDate, resetNavIntent) + setOnClickPendingIntent(R.id.timetableWidgetName, resetNavIntent) + setOnClickPendingIntent(R.id.timetableWidgetAccount, accountIntent) + setPendingIntentTemplate(R.id.timetableWidgetList, appIntent) + } + + sharedPref.putLong(getDateWidgetKey(appWidgetId), date.toEpochDay(), true) + with(appWidgetManager) { + notifyAppWidgetViewDataChanged(appWidgetId, R.id.timetableWidgetList) + updateAppWidget(appWidgetId, remoteView) } } @@ -159,19 +173,17 @@ class TimetableWidgetProvider : BroadcastReceiver() { .filter { true } .flatMap { studentRepository.getSavedStudents(false).toMaybe() } .flatMap { students -> - students.singleOrNull { student -> student.id == studentId } - .let { student -> - when { - student != null -> Maybe.just(student) - studentId != 0L -> { - studentRepository.isCurrentStudentSet() - .filter { true } - .flatMap { studentRepository.getCurrentStudent(false).toMaybe() } - .doOnSuccess { sharedPref.putLong(getStudentWidgetKey(appWidgetId), it.id) } - } - else -> Maybe.empty() - } + val student = students.singleOrNull { student -> student.id == studentId } + when { + student != null -> Maybe.just(student) + studentId != 0L -> { + studentRepository.isCurrentStudentSet() + .filter { true } + .flatMap { studentRepository.getCurrentStudent(false).toMaybe() } + .doOnSuccess { sharedPref.putLong(getStudentWidgetKey(appWidgetId), it.id) } } + else -> Maybe.empty() + } } .subscribeOn(schedulers.backgroundThread) .blockingGet() diff --git a/app/src/main/res/drawable/backgorund_luckynumber_widget.xml b/app/src/main/res/drawable/background_luckynumber_widget.xml similarity index 78% rename from app/src/main/res/drawable/backgorund_luckynumber_widget.xml rename to app/src/main/res/drawable/background_luckynumber_widget.xml index 38cbde9b..f29744d0 100644 --- a/app/src/main/res/drawable/backgorund_luckynumber_widget.xml +++ b/app/src/main/res/drawable/background_luckynumber_widget.xml @@ -1,6 +1,6 @@ <?xml version="1.0" encoding="UTF-8"?> <shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle"> - <solid android:color="#FFF" /> + <solid android:color="@android:color/white" /> <corners android:radius="5dp" /> </shape> diff --git a/app/src/main/res/drawable/background_luckynumber_widget_dark.xml b/app/src/main/res/drawable/background_luckynumber_widget_dark.xml new file mode 100644 index 00000000..fa15fd85 --- /dev/null +++ b/app/src/main/res/drawable/background_luckynumber_widget_dark.xml @@ -0,0 +1,6 @@ +<?xml version="1.0" encoding="UTF-8"?> +<shape xmlns:android="http://schemas.android.com/apk/res/android" + android:shape="rectangle"> + <solid android:color="@color/colorWidgetBackground" /> + <corners android:radius="5dp" /> +</shape> diff --git a/app/src/main/res/layout/item_widget_timetable.xml b/app/src/main/res/layout/item_widget_timetable.xml index bffc0bd5..a700fcc0 100644 --- a/app/src/main/res/layout/item_widget_timetable.xml +++ b/app/src/main/res/layout/item_widget_timetable.xml @@ -1,85 +1,95 @@ <?xml version="1.0" encoding="utf-8"?> -<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" +<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/timetableWidgetItemContainer" android:layout_width="match_parent" android:layout_height="wrap_content" - android:background="@drawable/ic_all_divider" android:minHeight="45dp" - android:orientation="horizontal" + android:orientation="vertical" tools:context=".ui.modules.timetablewidget.TimetableWidgetFactory"> - <TextView - android:id="@+id/timetableWidgetItemNumber" - android:layout_width="45dp" - android:layout_height="45dp" - android:layout_centerVertical="true" - android:layout_marginStart="5dp" - android:layout_marginLeft="5dp" - android:gravity="center" - android:maxLines="1" - android:textColor="@android:color/black" - android:textSize="25sp" - tools:text="1" /> - - <TextView - android:id="@+id/timetableWidgetItemTime" - android:layout_width="wrap_content" + <RelativeLayout + android:layout_width="match_parent" android:layout_height="wrap_content" - android:layout_alignParentTop="true" - android:layout_marginStart="5dp" - android:layout_marginLeft="5dp" - android:layout_marginTop="10dp" - android:layout_toEndOf="@id/timetableWidgetItemNumber" - android:layout_toRightOf="@id/timetableWidgetItemNumber" - android:textColor="@android:color/secondary_text_light" - android:textSize="13sp" - tools:text="08:00 - 08:45" /> + android:background="@android:color/white"> - <TextView - android:id="@+id/timetableWidgetItemSubject" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:layout_marginStart="15dp" - android:layout_marginLeft="15dp" - android:layout_marginTop="5dp" - android:layout_marginEnd="25dp" - android:layout_marginRight="25dp" - android:layout_toEndOf="@id/timetableWidgetItemTime" - android:layout_toRightOf="@id/timetableWidgetItemTime" - android:textColor="@android:color/secondary_text_light" - android:textSize="13sp" - tools:text="@tools:sample/lorem" /> + <TextView + android:id="@+id/timetableWidgetItemNumber" + android:layout_width="45dp" + android:layout_height="45dp" + android:layout_centerVertical="true" + android:layout_marginStart="5dp" + android:layout_marginLeft="5dp" + android:gravity="center" + android:maxLines="1" + android:textColor="@android:color/black" + android:textSize="25sp" + tools:text="1" /> - <TextView - android:id="@+id/timetableWidgetItemDescription" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:layout_below="@id/timetableWidgetItemSubject" - android:layout_marginStart="15dp" - android:layout_marginLeft="15dp" - android:layout_marginTop="3dp" - android:layout_marginEnd="25dp" - android:layout_marginRight="25dp" - android:layout_marginBottom="5dp" - android:layout_toEndOf="@id/timetableWidgetItemTime" - android:layout_toRightOf="@id/timetableWidgetItemTime" - android:textColor="@color/colorPrimaryDark" - android:textSize="12sp" - tools:text="Lekcja odwołana: uczniowie zwolnieni do domu" /> + <TextView + android:id="@+id/timetableWidgetItemTime" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_alignParentTop="true" + android:layout_marginStart="5dp" + android:layout_marginLeft="5dp" + android:layout_marginTop="10dp" + android:layout_toEndOf="@id/timetableWidgetItemNumber" + android:layout_toRightOf="@id/timetableWidgetItemNumber" + android:textColor="@android:color/black" + android:textSize="13sp" + tools:text="08:00 - 08:45" /> - <TextView - android:id="@+id/timetableWidgetItemRoom" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:layout_below="@id/timetableWidgetItemTime" - android:layout_marginStart="5dp" - android:layout_marginLeft="5dp" - android:layout_marginTop="3dp" - android:layout_marginBottom="5dp" - android:layout_toEndOf="@id/timetableWidgetItemNumber" - android:layout_toRightOf="@id/timetableWidgetItemNumber" - android:textColor="@android:color/secondary_text_light" - android:textSize="12sp" - tools:text="Sala 25" /> -</RelativeLayout> + <TextView + android:id="@+id/timetableWidgetItemSubject" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_marginStart="15dp" + android:layout_marginLeft="15dp" + android:layout_marginTop="5dp" + android:layout_marginEnd="25dp" + android:layout_marginRight="25dp" + android:layout_toEndOf="@id/timetableWidgetItemTime" + android:layout_toRightOf="@id/timetableWidgetItemTime" + android:textColor="@android:color/black" + android:textSize="13sp" + tools:text="@tools:sample/lorem" /> + + <TextView + android:id="@+id/timetableWidgetItemDescription" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_below="@id/timetableWidgetItemSubject" + android:layout_marginStart="15dp" + android:layout_marginLeft="15dp" + android:layout_marginTop="3dp" + android:layout_marginEnd="25dp" + android:layout_marginRight="25dp" + android:layout_marginBottom="5dp" + android:layout_toEndOf="@id/timetableWidgetItemTime" + android:layout_toRightOf="@id/timetableWidgetItemTime" + android:textColor="@color/colorPrimaryDark" + android:textSize="12sp" + tools:text="Lekcja odwołana: uczniowie zwolnieni do domu" /> + + <TextView + android:id="@+id/timetableWidgetItemRoom" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_below="@id/timetableWidgetItemTime" + android:layout_marginStart="5dp" + android:layout_marginLeft="5dp" + android:layout_marginTop="3dp" + android:layout_marginBottom="5dp" + android:layout_toEndOf="@id/timetableWidgetItemNumber" + android:layout_toRightOf="@id/timetableWidgetItemNumber" + android:textColor="@android:color/black" + android:textSize="12sp" + tools:text="Sala 25" /> + </RelativeLayout> + + <FrameLayout + android:layout_width="match_parent" + android:layout_height="1dp" + android:background="@color/colorDivider" /> +</LinearLayout> diff --git a/app/src/main/res/layout/item_widget_timetable_dark.xml b/app/src/main/res/layout/item_widget_timetable_dark.xml new file mode 100644 index 00000000..011cde6e --- /dev/null +++ b/app/src/main/res/layout/item_widget_timetable_dark.xml @@ -0,0 +1,95 @@ +<?xml version="1.0" encoding="utf-8"?> +<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:tools="http://schemas.android.com/tools" + android:id="@+id/timetableWidgetItemContainer" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:minHeight="45dp" + android:orientation="vertical" + tools:context=".ui.modules.timetablewidget.TimetableWidgetFactory"> + + <RelativeLayout + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:background="@color/colorWidgetBackground"> + + <TextView + android:id="@+id/timetableWidgetItemNumber" + android:layout_width="45dp" + android:layout_height="45dp" + android:layout_centerVertical="true" + android:layout_marginStart="5dp" + android:layout_marginLeft="5dp" + android:gravity="center" + android:maxLines="1" + android:textColor="@android:color/white" + android:textSize="25sp" + tools:text="1" /> + + <TextView + android:id="@+id/timetableWidgetItemTime" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_alignParentTop="true" + android:layout_marginStart="5dp" + android:layout_marginLeft="5dp" + android:layout_marginTop="10dp" + android:layout_toEndOf="@id/timetableWidgetItemNumber" + android:layout_toRightOf="@id/timetableWidgetItemNumber" + android:textColor="@android:color/white" + android:textSize="13sp" + tools:text="08:00 - 08:45" /> + + <TextView + android:id="@+id/timetableWidgetItemSubject" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_marginStart="15dp" + android:layout_marginLeft="15dp" + android:layout_marginTop="5dp" + android:layout_marginEnd="25dp" + android:layout_marginRight="25dp" + android:layout_toEndOf="@id/timetableWidgetItemTime" + android:layout_toRightOf="@id/timetableWidgetItemTime" + android:textColor="@android:color/white" + android:textSize="13sp" + tools:text="@tools:sample/lorem" /> + + <TextView + android:id="@+id/timetableWidgetItemDescription" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_below="@id/timetableWidgetItemSubject" + android:layout_marginStart="15dp" + android:layout_marginLeft="15dp" + android:layout_marginTop="3dp" + android:layout_marginEnd="25dp" + android:layout_marginRight="25dp" + android:layout_marginBottom="5dp" + android:layout_toEndOf="@id/timetableWidgetItemTime" + android:layout_toRightOf="@id/timetableWidgetItemTime" + android:textColor="@color/colorPrimaryLight" + android:textSize="12sp" + tools:text="Lekcja odwołana: uczniowie zwolnieni do domu" /> + + <TextView + android:id="@+id/timetableWidgetItemRoom" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_below="@id/timetableWidgetItemTime" + android:layout_marginStart="5dp" + android:layout_marginLeft="5dp" + android:layout_marginTop="3dp" + android:layout_marginBottom="5dp" + android:layout_toEndOf="@id/timetableWidgetItemNumber" + android:layout_toRightOf="@id/timetableWidgetItemNumber" + android:textColor="@android:color/white" + android:textSize="12sp" + tools:text="Sala 25" /> + </RelativeLayout> + + <FrameLayout + android:layout_width="match_parent" + android:layout_height="1dp" + android:background="@color/colorDividerInverse" /> +</LinearLayout> diff --git a/app/src/main/res/layout/widget_luckynumber.xml b/app/src/main/res/layout/widget_luckynumber.xml index ec12e421..360a1970 100644 --- a/app/src/main/res/layout/widget_luckynumber.xml +++ b/app/src/main/res/layout/widget_luckynumber.xml @@ -4,7 +4,7 @@ android:id="@+id/luckyNumberWidgetContainer" android:layout_width="fill_parent" android:layout_height="fill_parent" - android:background="@drawable/backgorund_luckynumber_widget" + android:background="@drawable/background_luckynumber_widget" android:gravity="center" android:padding="10dp" tools:context=".ui.modules.luckynumberwidget.LuckyNumberWidgetProvider"> diff --git a/app/src/main/res/layout/widget_luckynumber_dark.xml b/app/src/main/res/layout/widget_luckynumber_dark.xml new file mode 100644 index 00000000..77174730 --- /dev/null +++ b/app/src/main/res/layout/widget_luckynumber_dark.xml @@ -0,0 +1,65 @@ +<?xml version="1.0" encoding="utf-8"?> +<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:tools="http://schemas.android.com/tools" + android:id="@+id/luckyNumberWidgetContainer" + android:layout_width="fill_parent" + android:layout_height="fill_parent" + android:background="@drawable/background_luckynumber_widget_dark" + android:gravity="center" + android:padding="10dp" + tools:context=".ui.modules.luckynumberwidget.LuckyNumberWidgetProvider"> + + <ImageView + android:id="@+id/luckyNumberWidgetImageTop" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_above="@id/luckyNumberWidgetNumber" + android:layout_centerHorizontal="true" + android:layout_marginBottom="20dp" + android:contentDescription="@string/lucky_number_title" + android:gravity="center" + android:src="@drawable/ic_widget_clover" + android:tint="@android:color/white" + android:visibility="gone" + tools:visibility="visible" /> + + <TextView + android:id="@+id/luckyNumberWidgetTitle" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:layout_marginTop="0dp" + android:gravity="center" + android:labelFor="@id/luckyNumberWidgetImageTop" + android:text="@string/lucky_number_title" + android:textAlignment="center" + android:textColor="@android:color/white" + android:textSize="22sp" + android:visibility="gone" + tools:visibility="visible" /> + + <ImageView + android:id="@+id/luckyNumberWidgetImageLeft" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_alignTop="@id/luckyNumberWidgetNumber" + android:contentDescription="@string/lucky_number_title" + android:src="@drawable/ic_widget_clover" + android:tint="@android:color/white" + android:visibility="gone" + tools:visibility="visible" /> + + <TextView + android:id="@+id/luckyNumberWidgetNumber" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:layout_below="@id/luckyNumberWidgetTitle" + android:layout_toEndOf="@id/luckyNumberWidgetImageLeft" + android:layout_toRightOf="@id/luckyNumberWidgetImageLeft" + android:gravity="center" + android:text="#" + android:textAlignment="center" + android:textColor="@android:color/white" + android:textSize="34sp" + tools:ignore="HardcodedText" + tools:text="13" /> +</RelativeLayout> diff --git a/app/src/main/res/layout/widget_timetable_dark.xml b/app/src/main/res/layout/widget_timetable_dark.xml new file mode 100644 index 00000000..3a301eb9 --- /dev/null +++ b/app/src/main/res/layout/widget_timetable_dark.xml @@ -0,0 +1,99 @@ +<?xml version="1.0" encoding="utf-8"?> +<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:tools="http://schemas.android.com/tools" + android:layout_width="match_parent" + android:layout_height="match_parent" + android:background="@color/colorWidgetBackground" + tools:context=".ui.modules.timetablewidget.TimetableWidgetProvider"> + + <RelativeLayout + android:layout_width="match_parent" + android:layout_height="56dp" + android:background="@color/colorWidgetTopBar"> + + <LinearLayout + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_centerVertical="true" + android:layout_toStartOf="@id/timetableWidgetAccount" + android:layout_toLeftOf="@id/timetableWidgetAccount" + android:layout_toEndOf="@id/timetableWidgetNext" + android:layout_toRightOf="@id/timetableWidgetNext" + android:orientation="vertical"> + + <TextView + android:id="@+id/timetableWidgetDate" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_marginStart="10dp" + android:layout_marginLeft="10dp" + android:maxLines="1" + android:textColor="@android:color/white" + android:textSize="15sp" + tools:text="Pon. 30.03.2019" /> + + <TextView + android:id="@+id/timetableWidgetName" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_marginStart="10dp" + android:layout_marginLeft="10dp" + android:maxLines="1" + android:textColor="@android:color/white" + android:textSize="13sp" + tools:text="Jan Kowalski" /> + </LinearLayout> + + <ImageButton + android:id="@+id/timetableWidgetAccount" + android:layout_width="50dp" + android:layout_height="match_parent" + android:layout_alignParentEnd="true" + android:layout_alignParentRight="true" + android:background="?android:selectableItemBackground" + android:contentDescription="@string/account_title" + android:src="@drawable/ic_widget_account" /> + + <ImageButton + android:id="@+id/timetableWidgetPrev" + android:layout_width="50dp" + android:layout_height="wrap_content" + android:layout_centerVertical="true" + android:layout_marginStart="10dp" + android:layout_marginLeft="10dp" + android:backgroundTint="@color/colorWidgetNavButton" + android:contentDescription="@string/all_prev" + android:src="@drawable/ic_widget_chevron" + tools:targetApi="lollipop" /> + + <ImageButton + android:id="@+id/timetableWidgetNext" + android:layout_width="50dp" + android:layout_height="wrap_content" + android:layout_centerVertical="true" + android:layout_toEndOf="@id/timetableWidgetPrev" + android:layout_toRightOf="@id/timetableWidgetPrev" + android:backgroundTint="@color/colorWidgetNavButton" + android:contentDescription="@string/all_next" + android:rotation="180" + android:src="@drawable/ic_widget_chevron" + tools:targetApi="lollipop" /> + </RelativeLayout> + + <ListView + android:id="@+id/timetableWidgetList" + android:layout_width="match_parent" + android:layout_height="match_parent" + android:layout_marginTop="56dp" + tools:listitem="@layout/item_widget_timetable_dark" /> + + <TextView + android:id="@+id/timetableWidgetEmpty" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_gravity="center" + android:text="@string/widget_timetable_no_items" + android:textColor="@android:color/white" + android:textSize="20sp" + tools:visibility="invisible" /> +</FrameLayout> diff --git a/app/src/main/res/values-pl/strings.xml b/app/src/main/res/values-pl/strings.xml index 62803deb..e4db5b87 100644 --- a/app/src/main/res/values-pl/strings.xml +++ b/app/src/main/res/values-pl/strings.xml @@ -260,6 +260,9 @@ <!--Timetable Widget--> <string name="widget_timetable_no_items">Brak lekcji</string> + <string name="widget_timetable_theme_title">Wybierz motyw</string> + <string name="widget_timetable_theme_light">Jasny</string> + <string name="widget_timetable_theme_dark">Ciemny</string> <!--Preferences--> diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml index f7accebf..a2bf9e00 100644 --- a/app/src/main/res/values/colors.xml +++ b/app/src/main/res/values/colors.xml @@ -31,9 +31,10 @@ <color name="grade_vulcan_one">#d65757</color> <color name="grade_vulcan_default">#3d5f9c</color> - <color name="chip_backgroundColor_inverse">#595959</color> - <color name="chip_labelColor_inverse">#fefefe</color> - <color name="chip_detailed_backgroundColor">#fefefe</color> - <color name="filterable_list_backgroundColor_inverse">#393939</color> - <color name="filterable_list_textColor_inverse">#fefefe</color> + + <!--Dark color resource for app widgets--> + + <color name="colorWidgetBackground">#121212</color> + <color name="colorWidgetTopBar">#272727</color> + <color name="colorWidgetNavButton">#383838</color> </resources> diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 8ebb4b84..c4e5ed9b 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -244,6 +244,9 @@ <!--Timetable Widget--> <string name="widget_timetable_no_items">No lessons</string> + <string name="widget_timetable_theme_title">Choose theme</string> + <string name="widget_timetable_theme_light">Light</string> + <string name="widget_timetable_theme_dark">Dark</string> <!--Preferences--> diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml index c8b41a1a..8c693f73 100644 --- a/app/src/main/res/values/styles.xml +++ b/app/src/main/res/values/styles.xml @@ -23,6 +23,7 @@ <style name="WulkanowyTheme.WidgetAccountSwitcher" parent="Theme.MaterialComponents.Light.Dialog"> <item name="colorPrimary">@color/colorPrimary</item> + <item name="colorSecondary">@color/colorPrimary</item> <item name="windowActionBar">false</item> <item name="windowNoTitle">true</item> <item name="android:textColor">?android:textColorPrimary</item>