forked from github/wulkanowy-mirror
Add lucky number widget (#292)
This commit is contained in:
parent
baf1420193
commit
f84040109c
@ -7,11 +7,11 @@ references:
|
|||||||
|
|
||||||
container_config: &container_config
|
container_config: &container_config
|
||||||
docker:
|
docker:
|
||||||
- image: circleci/android:api-28-alpha
|
- image: circleci/android:api-28
|
||||||
working_directory: *workspace_root
|
working_directory: *workspace_root
|
||||||
environment:
|
environment:
|
||||||
environment:
|
environment:
|
||||||
JVM_OPTS: -Xmx3200m
|
_JAVA_OPTS: -Xmx2048m
|
||||||
|
|
||||||
attach_workspace: &attach_workspace
|
attach_workspace: &attach_workspace
|
||||||
attach_workspace:
|
attach_workspace:
|
||||||
|
@ -50,7 +50,16 @@
|
|||||||
android:name=".ui.modules.timetablewidget.TimetableWidgetConfigureActivity"
|
android:name=".ui.modules.timetablewidget.TimetableWidgetConfigureActivity"
|
||||||
android:noHistory="true"
|
android:noHistory="true"
|
||||||
android:excludeFromRecents="true"
|
android:excludeFromRecents="true"
|
||||||
android:theme="@style/WulkanowyTheme.TimetableWidgetAccount">
|
android:theme="@style/WulkanowyTheme.WidgetAccountSwitcher">
|
||||||
|
<intent-filter>
|
||||||
|
<action android:name="android.appwidget.action.APPWIDGET_CONFIGURE" />
|
||||||
|
</intent-filter>
|
||||||
|
</activity>
|
||||||
|
<activity
|
||||||
|
android:name=".ui.modules.luckynumberwidget.LuckyNumberWidgetConfigureActivity"
|
||||||
|
android:noHistory="true"
|
||||||
|
android:excludeFromRecents="true"
|
||||||
|
android:theme="@style/WulkanowyTheme.WidgetAccountSwitcher">
|
||||||
<intent-filter>
|
<intent-filter>
|
||||||
<action android:name="android.appwidget.action.APPWIDGET_CONFIGURE" />
|
<action android:name="android.appwidget.action.APPWIDGET_CONFIGURE" />
|
||||||
</intent-filter>
|
</intent-filter>
|
||||||
@ -72,6 +81,17 @@
|
|||||||
android:resource="@xml/provider_widget_timetable" />
|
android:resource="@xml/provider_widget_timetable" />
|
||||||
</receiver>
|
</receiver>
|
||||||
|
|
||||||
|
<receiver
|
||||||
|
android:name=".ui.modules.luckynumberwidget.LuckyNumberWidgetProvider"
|
||||||
|
android:label="@string/lucky_number_title">
|
||||||
|
<intent-filter>
|
||||||
|
<action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
|
||||||
|
</intent-filter>
|
||||||
|
<meta-data
|
||||||
|
android:name="android.appwidget.provider"
|
||||||
|
android:resource="@xml/provider_widget_lucky_number" />
|
||||||
|
</receiver>
|
||||||
|
|
||||||
<provider
|
<provider
|
||||||
android:name="androidx.work.impl.WorkManagerInitializer"
|
android:name="androidx.work.impl.WorkManagerInitializer"
|
||||||
android:authorities="${applicationId}.workmanager-init"
|
android:authorities="${applicationId}.workmanager-init"
|
||||||
|
@ -5,10 +5,12 @@ import dagger.android.ContributesAndroidInjector
|
|||||||
import io.github.wulkanowy.di.scopes.PerActivity
|
import io.github.wulkanowy.di.scopes.PerActivity
|
||||||
import io.github.wulkanowy.ui.modules.login.LoginActivity
|
import io.github.wulkanowy.ui.modules.login.LoginActivity
|
||||||
import io.github.wulkanowy.ui.modules.login.LoginModule
|
import io.github.wulkanowy.ui.modules.login.LoginModule
|
||||||
|
import io.github.wulkanowy.ui.modules.luckynumberwidget.LuckyNumberWidgetConfigureActivity
|
||||||
import io.github.wulkanowy.ui.modules.main.MainActivity
|
import io.github.wulkanowy.ui.modules.main.MainActivity
|
||||||
import io.github.wulkanowy.ui.modules.main.MainModule
|
import io.github.wulkanowy.ui.modules.main.MainModule
|
||||||
import io.github.wulkanowy.ui.modules.message.send.SendMessageActivity
|
import io.github.wulkanowy.ui.modules.message.send.SendMessageActivity
|
||||||
import io.github.wulkanowy.ui.modules.splash.SplashActivity
|
import io.github.wulkanowy.ui.modules.splash.SplashActivity
|
||||||
|
import io.github.wulkanowy.ui.modules.luckynumberwidget.LuckyNumberWidgetProvider
|
||||||
import io.github.wulkanowy.ui.modules.timetablewidget.TimetableWidgetConfigureActivity
|
import io.github.wulkanowy.ui.modules.timetablewidget.TimetableWidgetConfigureActivity
|
||||||
import io.github.wulkanowy.ui.modules.timetablewidget.TimetableWidgetProvider
|
import io.github.wulkanowy.ui.modules.timetablewidget.TimetableWidgetProvider
|
||||||
|
|
||||||
@ -35,4 +37,10 @@ internal abstract class BuilderModule {
|
|||||||
|
|
||||||
@ContributesAndroidInjector
|
@ContributesAndroidInjector
|
||||||
abstract fun bindTimetableWidgetProvider(): TimetableWidgetProvider
|
abstract fun bindTimetableWidgetProvider(): TimetableWidgetProvider
|
||||||
|
|
||||||
|
@ContributesAndroidInjector
|
||||||
|
abstract fun bindLuckyNumberWidgetAccountActivity(): LuckyNumberWidgetConfigureActivity
|
||||||
|
|
||||||
|
@ContributesAndroidInjector
|
||||||
|
abstract fun bindLuckyNumberWidgetProvider(): LuckyNumberWidgetProvider
|
||||||
}
|
}
|
||||||
|
@ -0,0 +1,77 @@
|
|||||||
|
package io.github.wulkanowy.ui.modules.luckynumberwidget
|
||||||
|
|
||||||
|
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 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.utils.setOnItemClickListener
|
||||||
|
import kotlinx.android.synthetic.main.activity_widget_configure.*
|
||||||
|
import javax.inject.Inject
|
||||||
|
|
||||||
|
class LuckyNumberWidgetConfigureActivity : BaseActivity(), LuckyNumberWidgetConfigureView {
|
||||||
|
|
||||||
|
@Inject
|
||||||
|
lateinit var configureAdapter: FlexibleAdapter<AbstractFlexibleItem<*>>
|
||||||
|
|
||||||
|
@Inject
|
||||||
|
lateinit var presenter: LuckyNumberWidgetConfigurePresenter
|
||||||
|
|
||||||
|
override fun onCreate(savedInstanceState: Bundle?) {
|
||||||
|
super.onCreate(savedInstanceState)
|
||||||
|
setResult(RESULT_CANCELED)
|
||||||
|
setContentView(R.layout.activity_widget_configure)
|
||||||
|
|
||||||
|
intent.extras.let {
|
||||||
|
presenter.onAttachView(this, it?.getInt(EXTRA_APPWIDGET_ID))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun initView() {
|
||||||
|
widgetConfigureRecycler.apply {
|
||||||
|
adapter = configureAdapter
|
||||||
|
layoutManager = SmoothScrollLinearLayoutManager(context)
|
||||||
|
}
|
||||||
|
configureAdapter.setOnItemClickListener { presenter.onItemSelect(it) }
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun updateData(data: List<LuckyNumberWidgetConfigureItem>) {
|
||||||
|
configureAdapter.updateDataSet(data)
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun updateLuckyNumberWidget(widgetId: Int) {
|
||||||
|
sendBroadcast(Intent(this, LuckyNumberWidgetProvider::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, Toast.LENGTH_LONG).show()
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun finishView() {
|
||||||
|
finish()
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun openLoginView() {
|
||||||
|
startActivity(LoginActivity.getStartIntent(this))
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun onDestroy() {
|
||||||
|
super.onDestroy()
|
||||||
|
presenter.onDetachView()
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,54 @@
|
|||||||
|
package io.github.wulkanowy.ui.modules.luckynumberwidget
|
||||||
|
|
||||||
|
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 io.github.wulkanowy.ui.modules.timetablewidget.TimetableWidgetConfigureItem
|
||||||
|
import kotlinx.android.extensions.LayoutContainer
|
||||||
|
import kotlinx.android.synthetic.main.item_account.*
|
||||||
|
|
||||||
|
class LuckyNumberWidgetConfigureItem(var student: Student, val isCurrent: Boolean) :
|
||||||
|
AbstractFlexibleItem<LuckyNumberWidgetConfigureItem.ViewHolder>() {
|
||||||
|
|
||||||
|
override fun getLayoutRes() = R.layout.item_account
|
||||||
|
|
||||||
|
override fun createViewHolder(view: View, adapter: FlexibleAdapter<IFlexible<*>>): ViewHolder {
|
||||||
|
return ViewHolder(view, adapter)
|
||||||
|
}
|
||||||
|
|
||||||
|
@SuppressLint("SetTextI18n")
|
||||||
|
override fun bindViewHolder(adapter: FlexibleAdapter<IFlexible<*>>, holder: ViewHolder, position: Int, payloads: MutableList<Any>) {
|
||||||
|
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
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,62 @@
|
|||||||
|
package io.github.wulkanowy.ui.modules.luckynumberwidget
|
||||||
|
|
||||||
|
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.luckynumberwidget.LuckyNumberWidgetProvider.Companion.createWidgetKey
|
||||||
|
import io.github.wulkanowy.utils.SchedulersProvider
|
||||||
|
import javax.inject.Inject
|
||||||
|
|
||||||
|
class LuckyNumberWidgetConfigurePresenter @Inject constructor(
|
||||||
|
private val errorHandler: ErrorHandler,
|
||||||
|
private val schedulers: SchedulersProvider,
|
||||||
|
private val studentRepository: StudentRepository,
|
||||||
|
private val sharedPref: SharedPrefHelper
|
||||||
|
) : BasePresenter<LuckyNumberWidgetConfigureView>(errorHandler) {
|
||||||
|
|
||||||
|
private var appWidgetId: Int? = null
|
||||||
|
|
||||||
|
fun onAttachView(view: LuckyNumberWidgetConfigureView, appWidgetId: Int?) {
|
||||||
|
super.onAttachView(view)
|
||||||
|
this.appWidgetId = appWidgetId
|
||||||
|
view.initView()
|
||||||
|
loadData()
|
||||||
|
}
|
||||||
|
|
||||||
|
fun onItemSelect(item: AbstractFlexibleItem<*>) {
|
||||||
|
if (item is LuckyNumberWidgetConfigureItem) {
|
||||||
|
registerStudent(item.student)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun loadData() {
|
||||||
|
disposable.add(studentRepository.getSavedStudents(false)
|
||||||
|
.map { it to appWidgetId?.let { id -> sharedPref.getLong(createWidgetKey(id), 0) } }
|
||||||
|
.map { (students, currentStudentId) ->
|
||||||
|
students.map { student -> LuckyNumberWidgetConfigureItem(student, student.id == currentStudentId) }
|
||||||
|
}
|
||||||
|
.subscribeOn(schedulers.backgroundThread)
|
||||||
|
.observeOn(schedulers.mainThread)
|
||||||
|
.subscribe({
|
||||||
|
when {
|
||||||
|
it.isEmpty() -> view?.openLoginView()
|
||||||
|
it.size == 1 -> registerStudent(it.single().student)
|
||||||
|
else -> view?.updateData(it)
|
||||||
|
}
|
||||||
|
}, { errorHandler.dispatch(it) }))
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun registerStudent(student: Student) {
|
||||||
|
appWidgetId?.also {
|
||||||
|
sharedPref.putLong(createWidgetKey(it), student.id)
|
||||||
|
view?.apply {
|
||||||
|
updateLuckyNumberWidget(it)
|
||||||
|
setSuccessResult(it)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
view?.finishView()
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,19 @@
|
|||||||
|
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 updateData(data: List<LuckyNumberWidgetConfigureItem>)
|
||||||
|
|
||||||
|
fun updateLuckyNumberWidget(widgetId: Int)
|
||||||
|
|
||||||
|
fun setSuccessResult(widgetId: Int)
|
||||||
|
|
||||||
|
fun finishView()
|
||||||
|
|
||||||
|
fun openLoginView()
|
||||||
|
}
|
@ -0,0 +1,180 @@
|
|||||||
|
package io.github.wulkanowy.ui.modules.luckynumberwidget
|
||||||
|
|
||||||
|
import android.annotation.TargetApi
|
||||||
|
import android.app.PendingIntent
|
||||||
|
import android.appwidget.AppWidgetManager
|
||||||
|
import android.appwidget.AppWidgetManager.ACTION_APPWIDGET_DELETED
|
||||||
|
import android.appwidget.AppWidgetManager.ACTION_APPWIDGET_OPTIONS_CHANGED
|
||||||
|
import android.appwidget.AppWidgetManager.ACTION_APPWIDGET_UPDATE
|
||||||
|
import android.appwidget.AppWidgetManager.EXTRA_APPWIDGET_ID
|
||||||
|
import android.appwidget.AppWidgetManager.EXTRA_APPWIDGET_IDS
|
||||||
|
import android.appwidget.AppWidgetManager.EXTRA_APPWIDGET_OPTIONS
|
||||||
|
import android.appwidget.AppWidgetManager.OPTION_APPWIDGET_MAX_HEIGHT
|
||||||
|
import android.appwidget.AppWidgetManager.OPTION_APPWIDGET_MAX_WIDTH
|
||||||
|
import android.content.BroadcastReceiver
|
||||||
|
import android.content.Context
|
||||||
|
import android.content.Intent
|
||||||
|
import android.os.Build
|
||||||
|
import android.view.View.GONE
|
||||||
|
import android.view.View.VISIBLE
|
||||||
|
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.LuckyNumber
|
||||||
|
import io.github.wulkanowy.data.repositories.luckynumber.LuckyNumberRepository
|
||||||
|
import io.github.wulkanowy.data.repositories.semester.SemesterRepository
|
||||||
|
import io.github.wulkanowy.data.repositories.student.StudentRepository
|
||||||
|
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.SchedulersProvider
|
||||||
|
import io.reactivex.Maybe
|
||||||
|
import timber.log.Timber
|
||||||
|
import javax.inject.Inject
|
||||||
|
|
||||||
|
class LuckyNumberWidgetProvider : BroadcastReceiver() {
|
||||||
|
|
||||||
|
@Inject
|
||||||
|
lateinit var studentRepository: StudentRepository
|
||||||
|
|
||||||
|
@Inject
|
||||||
|
lateinit var semesterRepository: SemesterRepository
|
||||||
|
|
||||||
|
@Inject
|
||||||
|
lateinit var luckyNumberRepository: LuckyNumberRepository
|
||||||
|
|
||||||
|
@Inject
|
||||||
|
lateinit var schedulers: SchedulersProvider
|
||||||
|
|
||||||
|
@Inject
|
||||||
|
lateinit var appWidgetManager: AppWidgetManager
|
||||||
|
|
||||||
|
@Inject
|
||||||
|
lateinit var sharedPref: SharedPrefHelper
|
||||||
|
|
||||||
|
companion object {
|
||||||
|
fun createWidgetKey(appWidgetId: Int) = "lucky_number_widget_$appWidgetId"
|
||||||
|
}
|
||||||
|
|
||||||
|
@TargetApi(Build.VERSION_CODES.JELLY_BEAN)
|
||||||
|
override fun onReceive(context: Context, intent: Intent) {
|
||||||
|
AndroidInjection.inject(this, context)
|
||||||
|
when (intent.action) {
|
||||||
|
ACTION_APPWIDGET_UPDATE -> onUpdate(context, intent)
|
||||||
|
ACTION_APPWIDGET_DELETED -> onDelete(intent)
|
||||||
|
ACTION_APPWIDGET_OPTIONS_CHANGED -> onOptionsChange(context, intent)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
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(createWidgetKey(appWidgetId), 0), appWidgetId)?.luckyNumber?.toString() ?: "#"
|
||||||
|
)
|
||||||
|
setOnClickPendingIntent(R.id.luckyNumberWidgetContainer,
|
||||||
|
PendingIntent.getActivity(context, 2, MainActivity.getStartIntent(context).apply {
|
||||||
|
putExtra(EXTRA_START_MENU_INDEX, 4)
|
||||||
|
}, PendingIntent.FLAG_UPDATE_CURRENT))
|
||||||
|
}.also {
|
||||||
|
setStyles(it, intent)
|
||||||
|
appWidgetManager.updateAppWidget(appWidgetId, it)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun onDelete(intent: Intent) {
|
||||||
|
intent.getIntExtra(EXTRA_APPWIDGET_ID, 0).let {
|
||||||
|
if (it != 0) sharedPref.delete(createWidgetKey(it))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun getLuckyNumber(studentId: Long, appWidgetId: Int): LuckyNumber? {
|
||||||
|
return try {
|
||||||
|
studentRepository.isStudentSaved()
|
||||||
|
.filter { true }
|
||||||
|
.flatMap { studentRepository.getSavedStudents().toMaybe() }
|
||||||
|
.flatMap { students ->
|
||||||
|
students.singleOrNull { student -> student.id == studentId }
|
||||||
|
.let { student ->
|
||||||
|
if (student != null) {
|
||||||
|
Maybe.just(student)
|
||||||
|
} else {
|
||||||
|
studentRepository.getCurrentStudent(false)
|
||||||
|
.toMaybe()
|
||||||
|
.doOnSuccess { sharedPref.putLong(createWidgetKey(appWidgetId), it.id) }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.flatMap { semesterRepository.getCurrentSemester(it).toMaybe() }
|
||||||
|
.flatMap { luckyNumberRepository.getLuckyNumber(it) }
|
||||||
|
.subscribeOn(schedulers.backgroundThread)
|
||||||
|
.blockingGet()
|
||||||
|
} catch (e: Exception) {
|
||||||
|
Timber.e(e, "An error has occurred in lucky number provider")
|
||||||
|
null
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
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)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@TargetApi(Build.VERSION_CODES.JELLY_BEAN)
|
||||||
|
private fun setStyles(views: RemoteViews, intent: Intent) {
|
||||||
|
val options = intent.extras?.getBundle(EXTRA_APPWIDGET_OPTIONS)
|
||||||
|
|
||||||
|
val maxWidth = options?.getInt(OPTION_APPWIDGET_MAX_WIDTH) ?: 150
|
||||||
|
val maxHeight = options?.getInt(OPTION_APPWIDGET_MAX_HEIGHT) ?: 40
|
||||||
|
|
||||||
|
Timber.d("New luckynumber widget measurement: %dx%d", maxWidth, maxHeight)
|
||||||
|
|
||||||
|
when {
|
||||||
|
// 1x1
|
||||||
|
maxWidth < 150 && maxHeight < 110 -> {
|
||||||
|
Timber.d("Luckynumber widget size: 1x1")
|
||||||
|
views.run {
|
||||||
|
setViewVisibility(R.id.luckyNumberWidgetImageTop, GONE)
|
||||||
|
setViewVisibility(R.id.luckyNumberWidgetImageLeft, GONE)
|
||||||
|
setViewVisibility(R.id.luckyNumberWidgetTitle, GONE)
|
||||||
|
setViewVisibility(R.id.luckyNumberWidgetNumber, VISIBLE)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// 1x2
|
||||||
|
maxWidth < 150 && maxHeight > 110 -> {
|
||||||
|
Timber.d("Luckynumber widget size: 1x2")
|
||||||
|
views.run {
|
||||||
|
setViewVisibility(R.id.luckyNumberWidgetImageTop, VISIBLE)
|
||||||
|
setViewVisibility(R.id.luckyNumberWidgetImageLeft, GONE)
|
||||||
|
setViewVisibility(R.id.luckyNumberWidgetTitle, GONE)
|
||||||
|
setViewVisibility(R.id.luckyNumberWidgetNumber, VISIBLE)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// 2x1
|
||||||
|
maxWidth >= 150 && maxHeight <= 110 -> {
|
||||||
|
Timber.d("Luckynumber widget size: 2x1")
|
||||||
|
views.run {
|
||||||
|
setViewVisibility(R.id.luckyNumberWidgetImageTop, GONE)
|
||||||
|
setViewVisibility(R.id.luckyNumberWidgetImageLeft, VISIBLE)
|
||||||
|
setViewVisibility(R.id.luckyNumberWidgetTitle, GONE)
|
||||||
|
setViewVisibility(R.id.luckyNumberWidgetNumber, VISIBLE)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// 2x2 and bigger
|
||||||
|
else -> {
|
||||||
|
Timber.d("Luckynumber widget size: 2x2 and bigger")
|
||||||
|
views.run {
|
||||||
|
setViewVisibility(R.id.luckyNumberWidgetImageTop, GONE)
|
||||||
|
setViewVisibility(R.id.luckyNumberWidgetImageLeft, GONE)
|
||||||
|
setViewVisibility(R.id.luckyNumberWidgetTitle, VISIBLE)
|
||||||
|
setViewVisibility(R.id.luckyNumberWidgetNumber, VISIBLE)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -15,7 +15,7 @@ import io.github.wulkanowy.ui.base.BaseActivity
|
|||||||
import io.github.wulkanowy.ui.modules.login.LoginActivity
|
import io.github.wulkanowy.ui.modules.login.LoginActivity
|
||||||
import io.github.wulkanowy.ui.modules.timetablewidget.TimetableWidgetProvider.Companion.EXTRA_FROM_PROVIDER
|
import io.github.wulkanowy.ui.modules.timetablewidget.TimetableWidgetProvider.Companion.EXTRA_FROM_PROVIDER
|
||||||
import io.github.wulkanowy.utils.setOnItemClickListener
|
import io.github.wulkanowy.utils.setOnItemClickListener
|
||||||
import kotlinx.android.synthetic.main.activity_timetable_widget_configure.*
|
import kotlinx.android.synthetic.main.activity_widget_configure.*
|
||||||
import javax.inject.Inject
|
import javax.inject.Inject
|
||||||
|
|
||||||
class TimetableWidgetConfigureActivity : BaseActivity(), TimetableWidgetConfigureView {
|
class TimetableWidgetConfigureActivity : BaseActivity(), TimetableWidgetConfigureView {
|
||||||
@ -29,7 +29,7 @@ class TimetableWidgetConfigureActivity : BaseActivity(), TimetableWidgetConfigur
|
|||||||
override fun onCreate(savedInstanceState: Bundle?) {
|
override fun onCreate(savedInstanceState: Bundle?) {
|
||||||
super.onCreate(savedInstanceState)
|
super.onCreate(savedInstanceState)
|
||||||
setResult(RESULT_CANCELED)
|
setResult(RESULT_CANCELED)
|
||||||
setContentView(R.layout.activity_timetable_widget_configure)
|
setContentView(R.layout.activity_widget_configure)
|
||||||
|
|
||||||
intent.extras.let {
|
intent.extras.let {
|
||||||
presenter.onAttachView(this, it?.getInt(EXTRA_APPWIDGET_ID), it?.getBoolean(EXTRA_FROM_PROVIDER))
|
presenter.onAttachView(this, it?.getInt(EXTRA_APPWIDGET_ID), it?.getBoolean(EXTRA_FROM_PROVIDER))
|
||||||
@ -37,7 +37,7 @@ class TimetableWidgetConfigureActivity : BaseActivity(), TimetableWidgetConfigur
|
|||||||
}
|
}
|
||||||
|
|
||||||
override fun initView() {
|
override fun initView() {
|
||||||
timetableWidgetConfigureRecycler.apply {
|
widgetConfigureRecycler.apply {
|
||||||
adapter = configureAdapter
|
adapter = configureAdapter
|
||||||
layoutManager = SmoothScrollLinearLayoutManager(context)
|
layoutManager = SmoothScrollLinearLayoutManager(context)
|
||||||
}
|
}
|
||||||
|
6
app/src/main/res/drawable/background_rounded_corner.xml
Normal file
6
app/src/main/res/drawable/background_rounded_corner.xml
Normal file
@ -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="#ffffffff" />
|
||||||
|
<corners android:radius="5dp" />
|
||||||
|
</shape>
|
BIN
app/src/main/res/drawable/ic_widget_clover_24dp.png
Normal file
BIN
app/src/main/res/drawable/ic_widget_clover_24dp.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 1.0 KiB |
BIN
app/src/main/res/drawable/img_luckynumber_widget_preview.png
Normal file
BIN
app/src/main/res/drawable/img_luckynumber_widget_preview.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 19 KiB |
@ -6,7 +6,7 @@
|
|||||||
android:layout_height="wrap_content">
|
android:layout_height="wrap_content">
|
||||||
|
|
||||||
<androidx.appcompat.widget.AppCompatTextView
|
<androidx.appcompat.widget.AppCompatTextView
|
||||||
android:id="@+id/timetableWidgetConfigureTitle"
|
android:id="@+id/widgetConfigureTitle"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="64dp"
|
android:layout_height="64dp"
|
||||||
android:paddingStart="24dp"
|
android:paddingStart="24dp"
|
||||||
@ -20,10 +20,10 @@
|
|||||||
app:firstBaselineToTopHeight="40dp" />
|
app:firstBaselineToTopHeight="40dp" />
|
||||||
|
|
||||||
<androidx.recyclerview.widget.RecyclerView
|
<androidx.recyclerview.widget.RecyclerView
|
||||||
android:id="@+id/timetableWidgetConfigureRecycler"
|
android:id="@+id/widgetConfigureRecycler"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:layout_below="@id/timetableWidgetConfigureTitle"
|
android:layout_below="@id/widgetConfigureTitle"
|
||||||
android:layout_marginBottom="16dp"
|
android:layout_marginBottom="16dp"
|
||||||
android:overScrollMode="never"
|
android:overScrollMode="never"
|
||||||
tools:itemCount="3"
|
tools:itemCount="3"
|
63
app/src/main/res/layout/widget_luckynumber.xml
Normal file
63
app/src/main/res/layout/widget_luckynumber.xml
Normal file
@ -0,0 +1,63 @@
|
|||||||
|
<?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_rounded_corner"
|
||||||
|
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_24dp"
|
||||||
|
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="#8c8c8c"
|
||||||
|
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_24dp"
|
||||||
|
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="#404040"
|
||||||
|
android:textSize="34sp"
|
||||||
|
tools:ignore="HardcodedText"
|
||||||
|
tools:text="13" />
|
||||||
|
</RelativeLayout>
|
@ -14,6 +14,6 @@
|
|||||||
<item>https://edu.gdansk.pl</item>
|
<item>https://edu.gdansk.pl</item>
|
||||||
<item>https://umt.tarnow.pl</item>
|
<item>https://umt.tarnow.pl</item>
|
||||||
<item>https://resman.pl</item>
|
<item>https://resman.pl</item>
|
||||||
<item>https://fakelog.cf</item>
|
<item>http://fakelog.cf</item>
|
||||||
</string-array>
|
</string-array>
|
||||||
</resources>
|
</resources>
|
||||||
|
@ -41,7 +41,7 @@
|
|||||||
<item name="colorControlNormal">@android:color/white</item>
|
<item name="colorControlNormal">@android:color/white</item>
|
||||||
</style>
|
</style>
|
||||||
|
|
||||||
<style name="WulkanowyTheme.TimetableWidgetAccount" parent="Theme.AppCompat.Light.Dialog">
|
<style name="WulkanowyTheme.WidgetAccountSwitcher" parent="Theme.AppCompat.Light.Dialog">
|
||||||
<item name="windowActionBar">false</item>
|
<item name="windowActionBar">false</item>
|
||||||
<item name="windowNoTitle">true</item>
|
<item name="windowNoTitle">true</item>
|
||||||
<item name="android:textColorPrimary">@android:color/primary_text_light</item>
|
<item name="android:textColorPrimary">@android:color/primary_text_light</item>
|
||||||
|
14
app/src/main/res/xml/provider_widget_lucky_number.xml
Normal file
14
app/src/main/res/xml/provider_widget_lucky_number.xml
Normal file
@ -0,0 +1,14 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
xmlns:tools="http://schemas.android.com/tools"
|
||||||
|
android:configure="io.github.wulkanowy.ui.modules.luckynumberwidget.LuckyNumberWidgetConfigureActivity"
|
||||||
|
android:initialLayout="@layout/widget_luckynumber"
|
||||||
|
android:minWidth="110dp"
|
||||||
|
android:minHeight="40dp"
|
||||||
|
android:minResizeWidth="40dp"
|
||||||
|
android:minResizeHeight="40dp"
|
||||||
|
android:previewImage="@drawable/img_luckynumber_widget_preview"
|
||||||
|
android:resizeMode="horizontal|vertical"
|
||||||
|
android:updatePeriodMillis="3600000"
|
||||||
|
android:widgetCategory="home_screen"
|
||||||
|
tools:targetApi="jelly_bean_mr1" />
|
@ -1,5 +1,6 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android"
|
<appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
xmlns:tools="http://schemas.android.com/tools"
|
||||||
android:configure="io.github.wulkanowy.ui.modules.timetablewidget.TimetableWidgetConfigureActivity"
|
android:configure="io.github.wulkanowy.ui.modules.timetablewidget.TimetableWidgetConfigureActivity"
|
||||||
android:initialLayout="@layout/widget_timetable"
|
android:initialLayout="@layout/widget_timetable"
|
||||||
android:minWidth="250dp"
|
android:minWidth="250dp"
|
||||||
@ -9,4 +10,5 @@
|
|||||||
android:previewImage="@drawable/img_timetable_widget_preview"
|
android:previewImage="@drawable/img_timetable_widget_preview"
|
||||||
android:resizeMode="horizontal|vertical"
|
android:resizeMode="horizontal|vertical"
|
||||||
android:updatePeriodMillis="3600000"
|
android:updatePeriodMillis="3600000"
|
||||||
android:widgetCategory="home_screen" />
|
android:widgetCategory="home_screen"
|
||||||
|
tools:targetApi="jelly_bean_mr1" />
|
||||||
|
Loading…
x
Reference in New Issue
Block a user