Skip to content

Commit

Permalink
fix StrictMode wrong context error
Browse files Browse the repository at this point in the history
  • Loading branch information
Razeeman committed Oct 19, 2024
1 parent 2b4e725 commit a02906a
Show file tree
Hide file tree
Showing 12 changed files with 63 additions and 26 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,17 @@ inline fun <T, R> T.allowDiskRead(block: T.() -> R): R {
}
}

// Used to block StrictMode assertConfigurationContext log error.
inline fun <T, R> T.allowVmViolations(block: T.() -> R): R {
val oldPolicy = StrictMode.getVmPolicy()
try {
StrictMode.setVmPolicy(StrictMode.VmPolicy.LAX)
return block()
} finally {
StrictMode.setVmPolicy(oldPolicy)
}
}

fun Calendar.setWeekToFirstDay() {
val another = Calendar.getInstance()
another.timeInMillis = timeInMillis
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ import android.view.ContextThemeWrapper
import android.widget.RemoteViews
import androidx.core.app.NotificationCompat
import androidx.core.app.NotificationManagerCompat
import com.example.util.simpletimetracker.core.extension.allowVmViolations
import com.example.util.simpletimetracker.feature_views.extension.getBitmapFromView
import com.example.util.simpletimetracker.feature_views.extension.measureExactly
import com.example.util.simpletimetracker.core.mapper.ColorMapper
Expand All @@ -33,8 +34,9 @@ class NotificationActivityManager @Inject constructor(

private val notificationManager: NotificationManagerCompat =
NotificationManagerCompat.from(context)
private val iconView =
private val iconView = allowVmViolations {
NotificationIconView(ContextThemeWrapper(context, R.style.AppTheme))
}
private val iconSize by lazy {
context.resources.getDimensionPixelSize(R.dimen.notification_icon_size)
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ import android.view.ContextThemeWrapper
import android.widget.RemoteViews
import androidx.core.app.NotificationCompat
import androidx.core.app.NotificationManagerCompat
import com.example.util.simpletimetracker.core.extension.allowVmViolations
import com.example.util.simpletimetracker.feature_views.extension.getBitmapFromView
import com.example.util.simpletimetracker.feature_views.extension.measureExactly
import com.example.util.simpletimetracker.core.mapper.ColorMapper
Expand All @@ -33,8 +34,9 @@ class NotificationActivitySwitchManager @Inject constructor(

private val notificationManager: NotificationManagerCompat =
NotificationManagerCompat.from(context)
private val iconView =
private val iconView = allowVmViolations {
NotificationIconView(ContextThemeWrapper(context, R.style.AppTheme))
}
private val iconSize by lazy {
context.resources.getDimensionPixelSize(R.dimen.notification_icon_size)
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ import android.graphics.Bitmap
import android.view.ContextThemeWrapper
import android.view.View
import android.widget.RemoteViews
import com.example.util.simpletimetracker.core.extension.allowVmViolations
import com.example.util.simpletimetracker.core.utils.PendingIntents
import com.example.util.simpletimetracker.domain.extension.orFalse
import com.example.util.simpletimetracker.feature_notification.R
Expand All @@ -24,8 +25,9 @@ class NotificationControlsManager @Inject constructor(
private val notificationControlsMapper: NotificationControlsMapper,
) {

private val iconView =
private val iconView = allowVmViolations {
NotificationIconView(ContextThemeWrapper(context, R.style.AppTheme))
}
private val iconSize by lazy {
context.resources.getDimensionPixelSize(R.dimen.notification_icon_size)
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ import android.widget.RemoteViews
import androidx.appcompat.widget.AppCompatImageView
import androidx.core.app.NotificationCompat
import androidx.core.app.NotificationManagerCompat
import com.example.util.simpletimetracker.core.extension.allowVmViolations
import com.example.util.simpletimetracker.core.utils.PendingIntents
import com.example.util.simpletimetracker.domain.model.RecordTypeGoal
import com.example.util.simpletimetracker.feature_notification.R
Expand All @@ -33,14 +34,15 @@ class NotificationGoalTimeManager @Inject constructor(

private val notificationManager: NotificationManagerCompat =
NotificationManagerCompat.from(context)
private val iconView =
private val iconView = allowVmViolations {
NotificationIconView(ContextThemeWrapper(context, R.style.AppTheme))
}
private val iconSize by lazy {
context.resources.getDimensionPixelSize(R.dimen.notification_icon_size)
}
private val checkView = AppCompatImageView(
ContextThemeWrapper(context, R.style.AppTheme),
).apply {
private val checkView = allowVmViolations {
AppCompatImageView(ContextThemeWrapper(context, R.style.AppTheme))
}.apply {
val size = context.resources.getDimensionPixelSize(R.dimen.notification_icon_half_size)
val specWidth = View.MeasureSpec.makeMeasureSpec(size, View.MeasureSpec.EXACTLY)
val specHeight = View.MeasureSpec.makeMeasureSpec(size, View.MeasureSpec.EXACTLY)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ import android.view.ContextThemeWrapper
import android.widget.RemoteViews
import androidx.core.app.NotificationCompat
import androidx.core.app.NotificationManagerCompat
import com.example.util.simpletimetracker.core.extension.allowVmViolations
import com.example.util.simpletimetracker.feature_views.extension.getBitmapFromView
import com.example.util.simpletimetracker.feature_views.extension.measureExactly
import com.example.util.simpletimetracker.core.mapper.ColorMapper
Expand All @@ -33,8 +34,9 @@ class NotificationInactivityManager @Inject constructor(

private val notificationManager: NotificationManagerCompat =
NotificationManagerCompat.from(context)
private val iconView =
private val iconView = allowVmViolations {
NotificationIconView(ContextThemeWrapper(context, R.style.AppTheme))
}
private val iconSize by lazy {
context.resources.getDimensionPixelSize(R.dimen.notification_icon_size)
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ import android.view.ContextThemeWrapper
import android.widget.RemoteViews
import androidx.core.app.NotificationCompat
import androidx.core.app.NotificationManagerCompat
import com.example.util.simpletimetracker.core.extension.allowVmViolations
import com.example.util.simpletimetracker.feature_views.extension.getBitmapFromView
import com.example.util.simpletimetracker.feature_views.extension.measureExactly
import com.example.util.simpletimetracker.core.mapper.ColorMapper
Expand All @@ -33,8 +34,9 @@ class NotificationPomodoroManager @Inject constructor(

private val notificationManager: NotificationManagerCompat =
NotificationManagerCompat.from(context)
private val iconView =
private val iconView = allowVmViolations {
NotificationIconView(ContextThemeWrapper(context, R.style.AppTheme))
}
private val iconSize by lazy {
context.resources.getDimensionPixelSize(R.dimen.notification_icon_size)
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ import android.view.View
import android.widget.RemoteViews
import androidx.core.app.NotificationCompat
import androidx.core.app.NotificationManagerCompat
import com.example.util.simpletimetracker.core.extension.allowVmViolations
import com.example.util.simpletimetracker.core.utils.PendingIntents
import com.example.util.simpletimetracker.domain.extension.orFalse
import com.example.util.simpletimetracker.feature_notification.R
Expand All @@ -38,8 +39,9 @@ class NotificationTypeManager @Inject constructor(

private val notificationManager: NotificationManagerCompat =
NotificationManagerCompat.from(context)
private val iconView =
private val iconView = allowVmViolations {
NotificationIconView(ContextThemeWrapper(context, R.style.AppTheme))
}
private val iconSize by lazy {
context.resources.getDimensionPixelSize(R.dimen.notification_icon_size)
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ import android.view.LayoutInflater
import android.view.View
import android.widget.FrameLayout
import android.widget.RemoteViews
import com.example.util.simpletimetracker.core.extension.allowVmViolations
import com.example.util.simpletimetracker.core.repo.ResourceRepo
import com.example.util.simpletimetracker.core.utils.PendingIntents
import com.example.util.simpletimetracker.domain.interactor.PrefsInteractor
Expand All @@ -21,6 +22,7 @@ import com.example.util.simpletimetracker.feature_views.viewData.RecordTypeIcon
import com.example.util.simpletimetracker.feature_widget.R
import com.example.util.simpletimetracker.feature_widget.quickSettings.customView.WidgetQuickSettingsView
import dagger.hilt.android.AndroidEntryPoint
import kotlinx.coroutines.DelicateCoroutinesApi
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.GlobalScope
import kotlinx.coroutines.launch
Expand Down Expand Up @@ -61,6 +63,7 @@ class WidgetQuickSettingsProvider : AppWidgetProvider() {
}
}

@OptIn(DelicateCoroutinesApi::class)
private fun updateAppWidget(
context: Context?,
appWidgetManager: AppWidgetManager?,
Expand Down Expand Up @@ -121,8 +124,12 @@ class WidgetQuickSettingsProvider : AppWidgetProvider() {
}

// TODO setting alpha on cardView doesn't work for some reason, wrap in layout before setting
val container = FrameLayout(ContextThemeWrapper(context, R.style.AppTheme))
WidgetQuickSettingsView(ContextThemeWrapper(context, R.style.AppTheme)).apply {
val container = allowVmViolations {
FrameLayout(ContextThemeWrapper(context, R.style.AppTheme))
}
allowVmViolations {
WidgetQuickSettingsView(ContextThemeWrapper(context, R.style.AppTheme))
}.apply {
cardElevation = 0f
itemIcon = icon
itemIconColor = iconColor
Expand All @@ -138,7 +145,7 @@ class WidgetQuickSettingsProvider : AppWidgetProvider() {
var height = context.resources.getDimensionPixelSize(R.dimen.record_type_card_height)
val inflater = LayoutInflater.from(context)

val entireView: View = inflater.inflate(R.layout.widget_layout, null)
val entireView: View = allowVmViolations { inflater.inflate(R.layout.widget_layout, null) }
entireView.measureExactly(width = width, height = height)

val imageView = entireView.findViewById<View>(R.id.ivWidgetBackground)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ import android.view.View
import android.view.ViewGroup
import android.widget.RemoteViews
import com.example.util.simpletimetracker.core.extension.allowDiskRead
import com.example.util.simpletimetracker.core.extension.allowVmViolations
import com.example.util.simpletimetracker.core.interactor.FilterGoalsByDayOfWeekInteractor
import com.example.util.simpletimetracker.core.interactor.GetCurrentRecordsDurationInteractor
import com.example.util.simpletimetracker.core.interactor.RecordRepeatInteractor
Expand Down Expand Up @@ -261,9 +262,9 @@ class WidgetSingleProvider : AppWidgetProvider() {
private fun getView(context: Context): RecordTypeView {
preparedView?.let { return it }

val view = RecordTypeView(
ContextThemeWrapper(context, R.style.AppTheme),
).apply {
val view = allowVmViolations {
RecordTypeView(ContextThemeWrapper(context, R.style.AppTheme))
}.apply {
getContainer().radius =
resources.getDimensionPixelOffset(R.dimen.widget_universal_corner_radius).toFloat()
getContainer().cardElevation = 0f
Expand All @@ -280,8 +281,8 @@ class WidgetSingleProvider : AppWidgetProvider() {
var height = context.resources.getDimensionPixelSize(R.dimen.record_type_card_height)

fun inflate(): View {
return LayoutInflater.from(context)
.inflate(R.layout.widget_layout, null)
val inflater = LayoutInflater.from(context)
return allowVmViolations { inflater.inflate(R.layout.widget_layout, null) }
.also { entireView = it }
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ import android.view.View
import android.widget.RemoteViews
import androidx.core.text.bold
import com.example.util.simpletimetracker.core.extension.allowDiskRead
import com.example.util.simpletimetracker.core.extension.allowVmViolations
import com.example.util.simpletimetracker.core.interactor.StatisticsChartViewDataInteractor
import com.example.util.simpletimetracker.core.interactor.StatisticsMediator
import com.example.util.simpletimetracker.core.mapper.TimeMapper
Expand Down Expand Up @@ -103,7 +104,7 @@ class WidgetStatisticsChartProvider : AppWidgetProvider() {
val view = prepareView(context, appWidgetId)
val options = appWidgetManager.getAppWidgetOptions(appWidgetId)
measureView(context, options, view)
val bitmap = view.getBitmapFromView()
val bitmap = allowVmViolations { view.getBitmapFromView() }
val refreshButtonBitmap = prepareRefreshButtonView(context).getBitmapFromView()

val views = RemoteViews(context.packageName, R.layout.widget_layout)
Expand Down Expand Up @@ -176,7 +177,9 @@ class WidgetStatisticsChartProvider : AppWidgetProvider() {
.append("\n")
.bold { append(total) }

return WidgetStatisticsChartView(ContextThemeWrapper(context, R.style.AppTheme)).apply {
return allowVmViolations {
WidgetStatisticsChartView(ContextThemeWrapper(context, R.style.AppTheme))
}.apply {
setSegments(
data = chart,
total = totalTracked,
Expand All @@ -192,7 +195,7 @@ class WidgetStatisticsChartProvider : AppWidgetProvider() {
.getDimenInDp(R.dimen.widget_statistics_refresh_button_size)
.dpToPx()

return IconView(ContextThemeWrapper(context, R.style.AppTheme)).apply {
return allowVmViolations { IconView(ContextThemeWrapper(context, R.style.AppTheme)) }.apply {
itemIcon = RecordTypeIcon.Image(R.drawable.refresh)
itemIconColor = resourceRepo.getColor(R.color.white)
measureExactly(size)
Expand All @@ -213,7 +216,7 @@ class WidgetStatisticsChartProvider : AppWidgetProvider() {
.dpToPx().takeUnless { it == 0 } ?: defaultHeight
val inflater = LayoutInflater.from(context)

val entireView: View = inflater.inflate(R.layout.widget_layout, null)
val entireView: View = allowVmViolations { inflater.inflate(R.layout.widget_layout, null) }
entireView.measureExactly(width = width, height = height)

val imageView = entireView.findViewById<View>(R.id.ivWidgetBackground)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ import android.view.ContextThemeWrapper
import android.view.LayoutInflater
import android.view.View
import android.widget.RemoteViews
import com.example.util.simpletimetracker.core.extension.allowVmViolations
import com.example.util.simpletimetracker.core.utils.PendingIntents
import com.example.util.simpletimetracker.domain.extension.orZero
import com.example.util.simpletimetracker.domain.interactor.PrefsInteractor
Expand Down Expand Up @@ -106,9 +107,9 @@ class WidgetUniversalProvider : AppWidgetProvider() {
context: Context,
data: WidgetUniversalViewData,
): View {
return WidgetUniversalView(
ContextThemeWrapper(context, R.style.AppTheme),
).apply {
return allowVmViolations {
WidgetUniversalView(ContextThemeWrapper(context, R.style.AppTheme))
}.apply {
setData(data)
}
}
Expand All @@ -133,7 +134,7 @@ class WidgetUniversalProvider : AppWidgetProvider() {
var height = context.resources.getDimensionPixelSize(R.dimen.widget_height)
val inflater = LayoutInflater.from(context)

val entireView: View = inflater.inflate(R.layout.widget_layout, null)
val entireView: View = allowVmViolations { inflater.inflate(R.layout.widget_layout, null) }
entireView.measureExactly(width = width, height = height)

val imageView = entireView.findViewById<View>(R.id.ivWidgetBackground)
Expand Down

0 comments on commit a02906a

Please sign in to comment.