forked from github/wulkanowy-mirror
Add ads to dashboard (#1815)
This commit is contained in:
@ -31,10 +31,14 @@ class WulkanowyApp : Application(), Configuration.Provider {
|
||||
@Inject
|
||||
lateinit var analyticsHelper: AnalyticsHelper
|
||||
|
||||
@Inject
|
||||
lateinit var adsHelper: AdsHelper
|
||||
|
||||
override fun onCreate() {
|
||||
super.onCreate()
|
||||
initializeAppLanguage()
|
||||
themeManager.applyDefaultTheme()
|
||||
adsHelper.initialize()
|
||||
initLogging()
|
||||
}
|
||||
|
||||
|
@ -222,16 +222,14 @@ class PreferencesRepository @Inject constructor(
|
||||
get() = selectedDashboardTilesPreference.asFlow()
|
||||
.map { set ->
|
||||
set.map { DashboardItem.Tile.valueOf(it) }
|
||||
.plus(DashboardItem.Tile.ACCOUNT)
|
||||
.plus(DashboardItem.Tile.ADMIN_MESSAGE)
|
||||
.plus(listOf(DashboardItem.Tile.ACCOUNT, DashboardItem.Tile.ADMIN_MESSAGE))
|
||||
.toSet()
|
||||
}
|
||||
|
||||
var selectedDashboardTiles: Set<DashboardItem.Tile>
|
||||
get() = selectedDashboardTilesPreference.get()
|
||||
.map { DashboardItem.Tile.valueOf(it) }
|
||||
.plus(DashboardItem.Tile.ACCOUNT)
|
||||
.plus(DashboardItem.Tile.ADMIN_MESSAGE)
|
||||
.plus(listOf(DashboardItem.Tile.ACCOUNT, DashboardItem.Tile.ADMIN_MESSAGE))
|
||||
.toSet()
|
||||
set(value) {
|
||||
val filteredValue = value.filterNot { it == DashboardItem.Tile.ACCOUNT }
|
||||
@ -271,7 +269,33 @@ class PreferencesRepository @Inject constructor(
|
||||
|
||||
var isAppReviewDone: Boolean
|
||||
get() = sharedPref.getBoolean(PREF_KEY_IN_APP_REVIEW_DONE, false)
|
||||
set(value) = sharedPref.edit().putBoolean(PREF_KEY_IN_APP_REVIEW_DONE, value).apply()
|
||||
set(value) = sharedPref.edit { putBoolean(PREF_KEY_IN_APP_REVIEW_DONE, value) }
|
||||
|
||||
var isAppSupportShown: Boolean
|
||||
get() = sharedPref.getBoolean(PREF_KEY_APP_SUPPORT_SHOWN, false)
|
||||
set(value) = sharedPref.edit { putBoolean(PREF_KEY_APP_SUPPORT_SHOWN, value) }
|
||||
|
||||
var isAgreeToProcessData: Boolean
|
||||
get() = getBoolean(
|
||||
R.string.pref_key_ads_consent_data_processing,
|
||||
R.bool.pref_default_ads_consent_data_processing
|
||||
)
|
||||
set(value) = sharedPref.edit {
|
||||
putBoolean(context.getString(R.string.pref_key_ads_consent_data_processing), value)
|
||||
}
|
||||
|
||||
var isPersonalizedAdsEnabled: Boolean
|
||||
get() = sharedPref.getBoolean(PREF_KEY_PERSONALIZED_ADS_ENABLED, false)
|
||||
set(value) = sharedPref.edit { putBoolean(PREF_KEY_PERSONALIZED_ADS_ENABLED, value) }
|
||||
|
||||
var isAdsEnabled: Boolean
|
||||
get() = getBoolean(
|
||||
R.string.pref_key_ads_enabled,
|
||||
R.bool.pref_default_ads_enabled
|
||||
)
|
||||
set(value) = sharedPref.edit {
|
||||
putBoolean(context.getString(R.string.pref_key_ads_enabled), value)
|
||||
}
|
||||
|
||||
private fun getLong(id: Int, default: Int) = getLong(context.getString(id), default)
|
||||
|
||||
@ -301,6 +325,10 @@ class PreferencesRepository @Inject constructor(
|
||||
|
||||
private const val PREF_KEY_IN_APP_REVIEW_DONE = "in_app_review_done"
|
||||
|
||||
private const val PREF_KEY_APP_SUPPORT_SHOWN = "app_support_shown"
|
||||
|
||||
private const val PREF_KEY_PERSONALIZED_ADS_ENABLED = "personalized_ads_enabled"
|
||||
|
||||
private const val PREF_KEY_ADMIN_DISMISSED_MESSAGE_IDS = "admin_message_dismissed_ids"
|
||||
}
|
||||
}
|
||||
|
@ -18,6 +18,7 @@ import io.github.wulkanowy.ui.base.BaseFragment
|
||||
import io.github.wulkanowy.ui.modules.account.accountdetails.AccountDetailsFragment
|
||||
import io.github.wulkanowy.ui.modules.attendance.summary.AttendanceSummaryFragment
|
||||
import io.github.wulkanowy.ui.modules.conference.ConferenceFragment
|
||||
import io.github.wulkanowy.ui.modules.dashboard.adapters.DashboardAdapter
|
||||
import io.github.wulkanowy.ui.modules.exam.ExamFragment
|
||||
import io.github.wulkanowy.ui.modules.grade.GradeFragment
|
||||
import io.github.wulkanowy.ui.modules.homework.HomeworkFragment
|
||||
@ -47,6 +48,14 @@ class DashboardFragment : BaseFragment<FragmentDashboardBinding>(R.layout.fragme
|
||||
override var subtitleString =
|
||||
LocalDate.now().toFormattedString("EEEE, d MMMM yyyy").capitalise()
|
||||
|
||||
override val tileWidth: Int
|
||||
get() {
|
||||
val recyclerWidth = binding.dashboardRecycler.width
|
||||
val margin = requireContext().dpToPx(24f).toInt()
|
||||
|
||||
return ((recyclerWidth - margin) / resources.displayMetrics.density).toInt()
|
||||
}
|
||||
|
||||
companion object {
|
||||
|
||||
fun newInstance() = DashboardFragment()
|
||||
|
@ -1,13 +1,9 @@
|
||||
package io.github.wulkanowy.ui.modules.dashboard
|
||||
|
||||
import io.github.wulkanowy.data.db.entities.AdminMessage
|
||||
import io.github.wulkanowy.data.db.entities.Conference
|
||||
import io.github.wulkanowy.data.db.entities.Exam
|
||||
import io.github.wulkanowy.data.db.entities.Grade
|
||||
import io.github.wulkanowy.data.db.entities.SchoolAnnouncement
|
||||
import io.github.wulkanowy.data.db.entities.Student
|
||||
import io.github.wulkanowy.data.db.entities.*
|
||||
import io.github.wulkanowy.data.enums.GradeColorTheme
|
||||
import io.github.wulkanowy.data.pojos.TimetableFull
|
||||
import io.github.wulkanowy.utils.AdBanner
|
||||
import io.github.wulkanowy.data.db.entities.Homework as EntitiesHomework
|
||||
|
||||
sealed class DashboardItem(val type: Type) {
|
||||
@ -106,17 +102,26 @@ sealed class DashboardItem(val type: Type) {
|
||||
override val isDataLoaded get() = conferences != null
|
||||
}
|
||||
|
||||
data class Ads(
|
||||
val adBanner: AdBanner? = null,
|
||||
override val error: Throwable? = null,
|
||||
override val isLoading: Boolean = false
|
||||
) : DashboardItem(Type.ADS) {
|
||||
|
||||
override val isDataLoaded get() = adBanner != null
|
||||
}
|
||||
|
||||
enum class Type {
|
||||
ADMIN_MESSAGE,
|
||||
ACCOUNT,
|
||||
HORIZONTAL_GROUP,
|
||||
LESSONS,
|
||||
ADS,
|
||||
GRADES,
|
||||
HOMEWORK,
|
||||
ANNOUNCEMENTS,
|
||||
EXAMS,
|
||||
CONFERENCES,
|
||||
ADS
|
||||
}
|
||||
|
||||
enum class Tile {
|
||||
@ -126,12 +131,12 @@ sealed class DashboardItem(val type: Type) {
|
||||
MESSAGES,
|
||||
ATTENDANCE,
|
||||
LESSONS,
|
||||
ADS,
|
||||
GRADES,
|
||||
HOMEWORK,
|
||||
ANNOUNCEMENTS,
|
||||
EXAMS,
|
||||
CONFERENCES,
|
||||
ADS
|
||||
}
|
||||
}
|
||||
|
||||
@ -148,4 +153,4 @@ fun DashboardItem.Tile.toDashboardItemType() = when (this) {
|
||||
DashboardItem.Tile.EXAMS -> DashboardItem.Type.EXAMS
|
||||
DashboardItem.Tile.CONFERENCES -> DashboardItem.Type.CONFERENCES
|
||||
DashboardItem.Tile.ADS -> DashboardItem.Type.ADS
|
||||
}
|
||||
}
|
||||
|
@ -2,7 +2,8 @@ package io.github.wulkanowy.ui.modules.dashboard
|
||||
|
||||
import androidx.recyclerview.widget.ItemTouchHelper
|
||||
import androidx.recyclerview.widget.RecyclerView
|
||||
import java.util.Collections
|
||||
import io.github.wulkanowy.ui.modules.dashboard.adapters.DashboardAdapter
|
||||
import java.util.*
|
||||
|
||||
class DashboardItemMoveCallback(
|
||||
private val dashboardAdapter: DashboardAdapter,
|
||||
|
@ -8,6 +8,7 @@ import io.github.wulkanowy.data.enums.MessageFolder
|
||||
import io.github.wulkanowy.data.repositories.*
|
||||
import io.github.wulkanowy.ui.base.BasePresenter
|
||||
import io.github.wulkanowy.ui.base.ErrorHandler
|
||||
import io.github.wulkanowy.utils.AdsHelper
|
||||
import io.github.wulkanowy.utils.calculatePercentage
|
||||
import io.github.wulkanowy.utils.nextOrSameSchoolDay
|
||||
import kotlinx.coroutines.flow.*
|
||||
@ -31,7 +32,8 @@ class DashboardPresenter @Inject constructor(
|
||||
private val conferenceRepository: ConferenceRepository,
|
||||
private val preferencesRepository: PreferencesRepository,
|
||||
private val schoolAnnouncementRepository: SchoolAnnouncementRepository,
|
||||
private val adminMessageRepository: AdminMessageRepository
|
||||
private val adminMessageRepository: AdminMessageRepository,
|
||||
private val adsHelper: AdsHelper
|
||||
) : BasePresenter<DashboardView>(errorHandler, studentRepository) {
|
||||
|
||||
private val dashboardItemLoadedList = mutableListOf<DashboardItem>()
|
||||
@ -166,7 +168,7 @@ class DashboardPresenter @Inject constructor(
|
||||
DashboardItem.Type.CONFERENCES -> {
|
||||
loadConferences(student, forceRefresh)
|
||||
}
|
||||
DashboardItem.Type.ADS -> TODO()
|
||||
DashboardItem.Type.ADS -> loadAds(forceRefresh)
|
||||
DashboardItem.Type.ADMIN_MESSAGE -> loadAdminMessage(student, forceRefresh)
|
||||
}
|
||||
}
|
||||
@ -595,6 +597,23 @@ class DashboardPresenter @Inject constructor(
|
||||
.launchWithUniqueRefreshJob("dashboard_admin_messages", forceRefresh)
|
||||
}
|
||||
|
||||
private fun loadAds(forceRefresh: Boolean) {
|
||||
presenterScope.launch {
|
||||
if (!forceRefresh) {
|
||||
updateData(DashboardItem.Ads(), forceRefresh)
|
||||
}
|
||||
|
||||
val dashboardAdItem =
|
||||
runCatching {
|
||||
DashboardItem.Ads(adsHelper.getDashboardTileAdBanner(view!!.tileWidth))
|
||||
}
|
||||
.onFailure { Timber.e(it) }
|
||||
.getOrElse { DashboardItem.Ads(error = it) }
|
||||
|
||||
updateData(dashboardAdItem, forceRefresh)
|
||||
}
|
||||
}
|
||||
|
||||
private fun updateData(dashboardItem: DashboardItem, forceRefresh: Boolean) {
|
||||
val isForceRefreshError = forceRefresh && dashboardItem.error != null
|
||||
val isFirstRunDataLoadedError =
|
||||
@ -619,6 +638,18 @@ class DashboardPresenter @Inject constructor(
|
||||
}
|
||||
}
|
||||
|
||||
if (dashboardItem is DashboardItem.Ads) {
|
||||
if (!dashboardItem.isDataLoaded) {
|
||||
dashboardItemsToLoad = dashboardItemsToLoad - DashboardItem.Type.ADS
|
||||
dashboardTileLoadedList = dashboardTileLoadedList - DashboardItem.Tile.ADS
|
||||
|
||||
dashboardItemLoadedList.removeAll { it.type == DashboardItem.Type.ADS }
|
||||
} else {
|
||||
dashboardItemsToLoad = dashboardItemsToLoad + DashboardItem.Type.ADS
|
||||
dashboardTileLoadedList = dashboardTileLoadedList + DashboardItem.Tile.ADS
|
||||
}
|
||||
}
|
||||
|
||||
if (forceRefresh) {
|
||||
updateForceRefreshData(dashboardItem)
|
||||
} else {
|
||||
|
@ -4,6 +4,8 @@ import io.github.wulkanowy.ui.base.BaseView
|
||||
|
||||
interface DashboardView : BaseView {
|
||||
|
||||
val tileWidth: Int
|
||||
|
||||
fun initView()
|
||||
|
||||
fun updateData(data: List<DashboardItem>)
|
||||
@ -27,4 +29,4 @@ interface DashboardView : BaseView {
|
||||
fun openNotificationsCenterView()
|
||||
|
||||
fun openInternetBrowser(url: String)
|
||||
}
|
||||
}
|
||||
|
@ -1,4 +1,4 @@
|
||||
package io.github.wulkanowy.ui.modules.dashboard
|
||||
package io.github.wulkanowy.ui.modules.dashboard.adapters
|
||||
|
||||
import android.annotation.SuppressLint
|
||||
import android.content.res.ColorStateList
|
||||
@ -22,24 +22,15 @@ import io.github.wulkanowy.data.db.entities.Student
|
||||
import io.github.wulkanowy.data.db.entities.Timetable
|
||||
import io.github.wulkanowy.data.db.entities.TimetableHeader
|
||||
import io.github.wulkanowy.data.enums.GradeColorTheme
|
||||
import io.github.wulkanowy.databinding.ItemDashboardAccountBinding
|
||||
import io.github.wulkanowy.databinding.ItemDashboardAdminMessageBinding
|
||||
import io.github.wulkanowy.databinding.ItemDashboardAnnouncementsBinding
|
||||
import io.github.wulkanowy.databinding.ItemDashboardConferencesBinding
|
||||
import io.github.wulkanowy.databinding.ItemDashboardExamsBinding
|
||||
import io.github.wulkanowy.databinding.ItemDashboardGradesBinding
|
||||
import io.github.wulkanowy.databinding.ItemDashboardHomeworkBinding
|
||||
import io.github.wulkanowy.databinding.ItemDashboardHorizontalGroupBinding
|
||||
import io.github.wulkanowy.databinding.ItemDashboardLessonsBinding
|
||||
import io.github.wulkanowy.utils.createNameInitialsDrawable
|
||||
import io.github.wulkanowy.utils.dpToPx
|
||||
import io.github.wulkanowy.utils.getThemeAttrColor
|
||||
import io.github.wulkanowy.utils.left
|
||||
import io.github.wulkanowy.utils.nickOrName
|
||||
import io.github.wulkanowy.utils.toFormattedString
|
||||
import io.github.wulkanowy.databinding.*
|
||||
import io.github.wulkanowy.ui.modules.dashboard.DashboardItem
|
||||
import io.github.wulkanowy.utils.*
|
||||
import timber.log.Timber
|
||||
import java.time.*
|
||||
import java.util.Timer
|
||||
import java.time.Duration
|
||||
import java.time.Instant
|
||||
import java.time.LocalDate
|
||||
import java.time.LocalDateTime
|
||||
import java.util.*
|
||||
import javax.inject.Inject
|
||||
import kotlin.concurrent.timer
|
||||
|
||||
@ -120,6 +111,9 @@ class DashboardAdapter @Inject constructor() : RecyclerView.Adapter<RecyclerView
|
||||
DashboardItem.Type.ADMIN_MESSAGE.ordinal -> AdminMessageViewHolder(
|
||||
ItemDashboardAdminMessageBinding.inflate(inflater, parent, false)
|
||||
)
|
||||
DashboardItem.Type.ADS.ordinal -> AdsViewHolder(
|
||||
ItemDashboardAdsBinding.inflate(inflater, parent, false)
|
||||
)
|
||||
else -> throw IllegalArgumentException()
|
||||
}
|
||||
}
|
||||
@ -135,6 +129,7 @@ class DashboardAdapter @Inject constructor() : RecyclerView.Adapter<RecyclerView
|
||||
is ExamsViewHolder -> bindExamsViewHolder(holder, position)
|
||||
is ConferencesViewHolder -> bindConferencesViewHolder(holder, position)
|
||||
is AdminMessageViewHolder -> bindAdminMessage(holder, position)
|
||||
is AdsViewHolder -> bindAdsViewHolder(holder, position)
|
||||
}
|
||||
}
|
||||
|
||||
@ -746,6 +741,20 @@ class DashboardAdapter @Inject constructor() : RecyclerView.Adapter<RecyclerView
|
||||
}
|
||||
}
|
||||
|
||||
private fun bindAdsViewHolder(adsViewHolder: AdsViewHolder, position: Int) {
|
||||
val item = (items[position] as DashboardItem.Ads).adBanner ?: return
|
||||
val binding = adsViewHolder.binding
|
||||
|
||||
binding.dashboardAdminMessageItemContent.removeAllViews()
|
||||
binding.dashboardAdminMessageItemContent.addView(
|
||||
item.view,
|
||||
ViewGroup.LayoutParams(
|
||||
ViewGroup.LayoutParams.MATCH_PARENT,
|
||||
ViewGroup.LayoutParams.WRAP_CONTENT
|
||||
)
|
||||
)
|
||||
}
|
||||
|
||||
class AccountViewHolder(val binding: ItemDashboardAccountBinding) :
|
||||
RecyclerView.ViewHolder(binding.root)
|
||||
|
||||
@ -788,6 +797,9 @@ class DashboardAdapter @Inject constructor() : RecyclerView.Adapter<RecyclerView
|
||||
class AdminMessageViewHolder(val binding: ItemDashboardAdminMessageBinding) :
|
||||
RecyclerView.ViewHolder(binding.root)
|
||||
|
||||
class AdsViewHolder(val binding: ItemDashboardAdsBinding) :
|
||||
RecyclerView.ViewHolder(binding.root)
|
||||
|
||||
private class DiffCallback(
|
||||
private val newList: List<DashboardItem>,
|
||||
private val oldList: List<DashboardItem>
|
@ -1,4 +1,4 @@
|
||||
package io.github.wulkanowy.ui.modules.dashboard
|
||||
package io.github.wulkanowy.ui.modules.dashboard.adapters
|
||||
|
||||
import android.view.LayoutInflater
|
||||
import android.view.ViewGroup
|
||||
@ -33,4 +33,4 @@ class DashboardAnnouncementsAdapter :
|
||||
|
||||
class ViewHolder(val binding: SubitemDashboardAnnouncementsBinding) :
|
||||
RecyclerView.ViewHolder(binding.root)
|
||||
}
|
||||
}
|
@ -1,4 +1,4 @@
|
||||
package io.github.wulkanowy.ui.modules.dashboard
|
||||
package io.github.wulkanowy.ui.modules.dashboard.adapters
|
||||
|
||||
import android.view.LayoutInflater
|
||||
import android.view.ViewGroup
|
||||
@ -33,4 +33,4 @@ class DashboardConferencesAdapter :
|
||||
|
||||
class ViewHolder(val binding: SubitemDashboardConferencesBinding) :
|
||||
RecyclerView.ViewHolder(binding.root)
|
||||
}
|
||||
}
|
@ -1,4 +1,4 @@
|
||||
package io.github.wulkanowy.ui.modules.dashboard
|
||||
package io.github.wulkanowy.ui.modules.dashboard.adapters
|
||||
|
||||
import android.annotation.SuppressLint
|
||||
import android.view.LayoutInflater
|
||||
@ -56,4 +56,4 @@ class DashboardExamsAdapter :
|
||||
|
||||
class ViewHolder(val binding: SubitemDashboardExamsBinding) :
|
||||
RecyclerView.ViewHolder(binding.root)
|
||||
}
|
||||
}
|
@ -1,4 +1,4 @@
|
||||
package io.github.wulkanowy.ui.modules.dashboard
|
||||
package io.github.wulkanowy.ui.modules.dashboard.adapters
|
||||
|
||||
import android.view.LayoutInflater
|
||||
import android.view.ViewGroup
|
@ -1,4 +1,4 @@
|
||||
package io.github.wulkanowy.ui.modules.dashboard
|
||||
package io.github.wulkanowy.ui.modules.dashboard.adapters
|
||||
|
||||
import android.annotation.SuppressLint
|
||||
import android.view.LayoutInflater
|
||||
@ -53,4 +53,4 @@ class DashboardHomeworkAdapter : RecyclerView.Adapter<DashboardHomeworkAdapter.V
|
||||
|
||||
class ViewHolder(val binding: SubitemDashboardHomeworkBinding) :
|
||||
RecyclerView.ViewHolder(binding.root)
|
||||
}
|
||||
}
|
@ -12,6 +12,7 @@ import androidx.fragment.app.DialogFragment
|
||||
import androidx.fragment.app.Fragment
|
||||
import androidx.preference.Preference
|
||||
import androidx.preference.PreferenceFragmentCompat
|
||||
import com.google.android.material.dialog.MaterialAlertDialogBuilder
|
||||
import com.google.android.material.elevation.ElevationOverlayProvider
|
||||
import com.ncapdevi.fragnav.FragNavController
|
||||
import com.ncapdevi.fragnav.FragNavController.Companion.HIDE
|
||||
@ -20,6 +21,7 @@ import io.github.wulkanowy.R
|
||||
import io.github.wulkanowy.data.db.entities.Student
|
||||
import io.github.wulkanowy.data.db.entities.StudentWithSemesters
|
||||
import io.github.wulkanowy.databinding.ActivityMainBinding
|
||||
import io.github.wulkanowy.databinding.DialogAdsConsentBinding
|
||||
import io.github.wulkanowy.ui.base.BaseActivity
|
||||
import io.github.wulkanowy.ui.modules.Destination
|
||||
import io.github.wulkanowy.ui.modules.account.accountquick.AccountQuickDialog
|
||||
@ -288,6 +290,50 @@ class MainActivity : BaseActivity<MainPresenter, ActivityMainBinding>(), MainVie
|
||||
inAppReviewHelper.showInAppReview(this)
|
||||
}
|
||||
|
||||
override fun showAppSupport() {
|
||||
MaterialAlertDialogBuilder(this)
|
||||
.setTitle(R.string.main_support_title)
|
||||
.setMessage(R.string.main_support_description)
|
||||
.setPositiveButton(R.string.main_support_positive) { _, _ -> presenter.onEnableAdsSelected() }
|
||||
.setNegativeButton(android.R.string.cancel) { _, _ -> }
|
||||
.setOnDismissListener { }
|
||||
.show()
|
||||
}
|
||||
|
||||
override fun showPrivacyPolicyDialog() {
|
||||
val dialogAdsConsentBinding = DialogAdsConsentBinding.inflate(layoutInflater)
|
||||
|
||||
val dialog = MaterialAlertDialogBuilder(this)
|
||||
.setTitle(R.string.pref_ads_consent_title)
|
||||
.setMessage(R.string.pref_ads_consent_description)
|
||||
.setView(dialogAdsConsentBinding.root)
|
||||
.show()
|
||||
|
||||
dialogAdsConsentBinding.adsConsentOver.setOnCheckedChangeListener { _, isChecked ->
|
||||
dialogAdsConsentBinding.adsConsentPersonalised.isEnabled = isChecked
|
||||
}
|
||||
|
||||
dialogAdsConsentBinding.adsConsentPersonalised.setOnClickListener {
|
||||
presenter.onPrivacyAgree(true)
|
||||
dialog.dismiss()
|
||||
}
|
||||
|
||||
dialogAdsConsentBinding.adsConsentNonPersonalised.setOnClickListener {
|
||||
presenter.onPrivacyAgree(false)
|
||||
dialog.dismiss()
|
||||
}
|
||||
|
||||
dialogAdsConsentBinding.adsConsentPrivacy.setOnClickListener { presenter.onPrivacySelected() }
|
||||
dialogAdsConsentBinding.adsConsentCancel.setOnClickListener { dialog.cancel() }
|
||||
}
|
||||
|
||||
override fun openPrivacyPolicy() {
|
||||
openInternetBrowser(
|
||||
"https://wulkanowy.github.io/polityka-prywatnosci.html",
|
||||
::showMessage
|
||||
)
|
||||
}
|
||||
|
||||
override fun onSaveInstanceState(outState: Bundle) {
|
||||
super.onSaveInstanceState(outState)
|
||||
navController.onSaveInstanceState(outState)
|
||||
|
@ -14,11 +14,15 @@ import io.github.wulkanowy.ui.base.ErrorHandler
|
||||
import io.github.wulkanowy.ui.modules.Destination
|
||||
import io.github.wulkanowy.ui.modules.account.AccountView
|
||||
import io.github.wulkanowy.ui.modules.account.accountdetails.AccountDetailsView
|
||||
import io.github.wulkanowy.ui.modules.dashboard.DashboardItem
|
||||
import io.github.wulkanowy.ui.modules.grade.GradeView
|
||||
import io.github.wulkanowy.ui.modules.message.MessageView
|
||||
import io.github.wulkanowy.ui.modules.schoolandteachers.SchoolAndTeachersView
|
||||
import io.github.wulkanowy.ui.modules.studentinfo.StudentInfoView
|
||||
import io.github.wulkanowy.utils.AdsHelper
|
||||
import io.github.wulkanowy.utils.AnalyticsHelper
|
||||
import io.github.wulkanowy.utils.AppInfo
|
||||
import kotlinx.coroutines.launch
|
||||
import kotlinx.serialization.decodeFromString
|
||||
import kotlinx.serialization.json.Json
|
||||
import timber.log.Timber
|
||||
@ -29,10 +33,12 @@ import javax.inject.Inject
|
||||
class MainPresenter @Inject constructor(
|
||||
errorHandler: ErrorHandler,
|
||||
studentRepository: StudentRepository,
|
||||
private val prefRepository: PreferencesRepository,
|
||||
private val preferencesRepository: PreferencesRepository,
|
||||
private val syncManager: SyncManager,
|
||||
private val analytics: AnalyticsHelper,
|
||||
private val json: Json
|
||||
private val json: Json,
|
||||
private val adsHelper: AdsHelper,
|
||||
private val appInfo: AppInfo
|
||||
) : BasePresenter<MainView>(errorHandler, studentRepository) {
|
||||
|
||||
private var studentsWitSemesters: List<StudentWithSemesters>? = null
|
||||
@ -47,7 +53,7 @@ class MainPresenter @Inject constructor(
|
||||
|
||||
private val Destination?.startMenuIndex
|
||||
get() = when {
|
||||
this == null -> prefRepository.startMenuIndex
|
||||
this == null -> preferencesRepository.startMenuIndex
|
||||
destinationType in rootDestinationTypeList -> {
|
||||
rootDestinationTypeList.indexOf(destinationType)
|
||||
}
|
||||
@ -71,6 +77,8 @@ class MainPresenter @Inject constructor(
|
||||
|
||||
syncManager.startPeriodicSyncWorker()
|
||||
|
||||
checkAppSupport()
|
||||
|
||||
analytics.logEvent("app_open", "destination" to initDestination.toString())
|
||||
Timber.i("Main view was initialized with $initDestination")
|
||||
}
|
||||
@ -155,18 +163,53 @@ class MainPresenter @Inject constructor(
|
||||
} == true
|
||||
}
|
||||
|
||||
private fun checkInAppReview() {
|
||||
prefRepository.inAppReviewCount++
|
||||
fun onEnableAdsSelected() {
|
||||
view?.showPrivacyPolicyDialog()
|
||||
}
|
||||
|
||||
if (prefRepository.inAppReviewDate == null) {
|
||||
prefRepository.inAppReviewDate = Instant.now()
|
||||
fun onPrivacyAgree(isPersonalizedAds: Boolean) {
|
||||
preferencesRepository.isAdsEnabled = true
|
||||
preferencesRepository.isAgreeToProcessData = true
|
||||
preferencesRepository.isPersonalizedAdsEnabled = isPersonalizedAds
|
||||
|
||||
adsHelper.initialize()
|
||||
|
||||
preferencesRepository.selectedDashboardTiles += DashboardItem.Tile.ADS
|
||||
}
|
||||
|
||||
fun onPrivacySelected() {
|
||||
view?.openPrivacyPolicy()
|
||||
}
|
||||
|
||||
private fun checkInAppReview() {
|
||||
preferencesRepository.inAppReviewCount++
|
||||
|
||||
if (preferencesRepository.inAppReviewDate == null) {
|
||||
preferencesRepository.inAppReviewDate = Instant.now()
|
||||
}
|
||||
|
||||
if (!prefRepository.isAppReviewDone && prefRepository.inAppReviewCount >= 50 &&
|
||||
Instant.now().minus(Duration.ofDays(14)).isAfter(prefRepository.inAppReviewDate)
|
||||
if (!preferencesRepository.isAppReviewDone && preferencesRepository.inAppReviewCount >= 50 &&
|
||||
Instant.now().minus(Duration.ofDays(14)).isAfter(preferencesRepository.inAppReviewDate)
|
||||
) {
|
||||
view?.showInAppReview()
|
||||
prefRepository.isAppReviewDone = true
|
||||
preferencesRepository.isAppReviewDone = true
|
||||
}
|
||||
}
|
||||
|
||||
private fun checkAppSupport() {
|
||||
if (!preferencesRepository.isAppSupportShown && !preferencesRepository.isAdsEnabled
|
||||
&& appInfo.buildFlavor == "play"
|
||||
) {
|
||||
presenterScope.launch {
|
||||
val student = runCatching { studentRepository.getCurrentStudent(false) }
|
||||
.onFailure { Timber.e(it) }
|
||||
.getOrElse { return@launch }
|
||||
|
||||
if (Instant.now().minus(Duration.ofDays(28)).isAfter(student.registrationDate)) {
|
||||
view?.showAppSupport()
|
||||
preferencesRepository.isAppSupportShown = true
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -41,6 +41,12 @@ interface MainView : BaseView {
|
||||
|
||||
fun showInAppReview()
|
||||
|
||||
fun showAppSupport()
|
||||
|
||||
fun showPrivacyPolicyDialog()
|
||||
|
||||
fun openPrivacyPolicy()
|
||||
|
||||
fun openMoreDestination(destination: Destination)
|
||||
|
||||
interface MainChildView {
|
||||
|
@ -13,6 +13,7 @@ import androidx.core.graphics.drawable.RoundedBitmapDrawable
|
||||
import androidx.core.graphics.drawable.RoundedBitmapDrawableFactory
|
||||
import androidx.core.graphics.drawable.toBitmap
|
||||
|
||||
|
||||
@ColorInt
|
||||
fun Context.getThemeAttrColor(@AttrRes colorAttr: Int): Int {
|
||||
val array = obtainStyledAttributes(null, intArrayOf(colorAttr))
|
||||
|
Reference in New Issue
Block a user