From 3be62a5e576043885c0c71395cddb7fa0724e108 Mon Sep 17 00:00:00 2001 From: Guillaume Jacquart Date: Wed, 27 Dec 2023 08:52:16 +0100 Subject: [PATCH 1/4] 1736: update widget UX. --- .../features/dashboard/DashboardState.kt | 2 - .../e/advancedprivacy/widget/Widget.kt | 29 +- .../e/advancedprivacy/widget/WidgetUI.kt | 380 +++----- .../main/res/drawable/bg_stroke_rounded_8.xml | 21 + .../main/res/drawable/ic_switch_disabled.xml | 8 - .../drawable/ic_switch_disabled_raster.png | Bin 0 -> 4651 bytes .../main/res/drawable/ic_switch_enabled.xml | 22 - .../res/drawable/ic_switch_enabled_raster.png | Bin 0 -> 4601 bytes app/src/main/res/layout/widget.xml | 876 ++++-------------- app/src/main/res/values/strings.xml | 29 +- 10 files changed, 318 insertions(+), 1049 deletions(-) create mode 100644 app/src/main/res/drawable/bg_stroke_rounded_8.xml delete mode 100644 app/src/main/res/drawable/ic_switch_disabled.xml create mode 100644 app/src/main/res/drawable/ic_switch_disabled_raster.png delete mode 100644 app/src/main/res/drawable/ic_switch_enabled.xml create mode 100644 app/src/main/res/drawable/ic_switch_enabled_raster.png diff --git a/app/src/main/java/foundation/e/advancedprivacy/features/dashboard/DashboardState.kt b/app/src/main/java/foundation/e/advancedprivacy/features/dashboard/DashboardState.kt index e7b39b64..7dc3c0b5 100644 --- a/app/src/main/java/foundation/e/advancedprivacy/features/dashboard/DashboardState.kt +++ b/app/src/main/java/foundation/e/advancedprivacy/features/dashboard/DashboardState.kt @@ -18,11 +18,9 @@ package foundation.e.advancedprivacy.features.dashboard import foundation.e.advancedprivacy.domain.entities.FeatureState -import foundation.e.advancedprivacy.domain.entities.QuickPrivacyState import foundation.e.advancedprivacy.domain.entities.TrackerMode data class DashboardState( - val quickPrivacyState: QuickPrivacyState = QuickPrivacyState.DISABLED, val trackerMode: TrackerMode = TrackerMode.VULNERABLE, val isLocationHidden: Boolean = false, val ipScramblingMode: FeatureState = FeatureState.STOPPING, diff --git a/app/src/main/java/foundation/e/advancedprivacy/widget/Widget.kt b/app/src/main/java/foundation/e/advancedprivacy/widget/Widget.kt index 66cf87ea..d2c51659 100644 --- a/app/src/main/java/foundation/e/advancedprivacy/widget/Widget.kt +++ b/app/src/main/java/foundation/e/advancedprivacy/widget/Widget.kt @@ -25,7 +25,6 @@ import foundation.e.advancedprivacy.domain.usecases.GetQuickPrivacyStateUseCase import foundation.e.advancedprivacy.domain.usecases.TrackersStatisticsUseCase import foundation.e.advancedprivacy.widget.State import foundation.e.advancedprivacy.widget.render -import java.time.temporal.ChronoUnit import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.DelicateCoroutinesApi import kotlinx.coroutines.Dispatchers @@ -44,13 +43,18 @@ import kotlinx.coroutines.flow.onStart import kotlinx.coroutines.flow.sample import kotlinx.coroutines.flow.stateIn import kotlinx.coroutines.launch +import java.time.temporal.ChronoUnit /** * Implementation of App Widget functionality. */ class Widget : AppWidgetProvider() { - override fun onUpdate(context: Context, appWidgetManager: AppWidgetManager, appWidgetIds: IntArray) { + override fun onUpdate( + context: Context, + appWidgetManager: AppWidgetManager, + appWidgetIds: IntArray + ) { render(context, state.value, appWidgetManager) } @@ -76,15 +80,13 @@ class Widget : AppWidgetProvider() { trackersStatisticsUseCase: TrackersStatisticsUseCase, coroutineScope: CoroutineScope ): StateFlow { + return combine( - getPrivacyStateUseCase.quickPrivacyState, getPrivacyStateUseCase.trackerMode, getPrivacyStateUseCase.isLocationHidden, - getPrivacyStateUseCase.ipScramblingMode - ) { quickPrivacyState, trackerMode, isLocationHidden, ipScramblingMode -> - + getPrivacyStateUseCase.ipScramblingMode, + ) { trackerMode, isLocationHidden, ipScramblingMode -> State( - quickPrivacyState = quickPrivacyState, trackerMode = trackerMode, isLocationHidden = isLocationHidden, ipScramblingMode = ipScramblingMode @@ -105,8 +107,8 @@ class Widget : AppWidgetProvider() { ) ) { state, _ -> state.copy( - dayStatistics = trackersStatisticsUseCase.getDayTrackersCalls(), - activeTrackersCount = trackersStatisticsUseCase.getDayTrackersCount() + blockedCallsCount = trackersStatisticsUseCase.getLastMonthBlockedLeaksCount(), + appsWithCallsCount = trackersStatisticsUseCase.getLastMonthAppsWithBLockedLeaksCount() ) }.stateIn( scope = coroutineScope, @@ -119,7 +121,7 @@ class Widget : AppWidgetProvider() { fun startListening( appContext: Context, getPrivacyStateUseCase: GetQuickPrivacyStateUseCase, - trackersStatisticsUseCase: TrackersStatisticsUseCase + trackersStatisticsUseCase: TrackersStatisticsUseCase, ) { state = initState( getPrivacyStateUseCase, @@ -136,7 +138,12 @@ class Widget : AppWidgetProvider() { } } - override fun onAppWidgetOptionsChanged(context: Context, appWidgetManager: AppWidgetManager, appWidgetId: Int, newOptions: Bundle?) { + override fun onAppWidgetOptionsChanged( + context: Context, + appWidgetManager: AppWidgetManager, + appWidgetId: Int, + newOptions: Bundle? + ) { super.onAppWidgetOptionsChanged(context, appWidgetManager, appWidgetId, newOptions) if (newOptions != null) { isDarkText = newOptions.getBoolean(DARK_TEXT_KEY) diff --git a/app/src/main/java/foundation/e/advancedprivacy/widget/WidgetUI.kt b/app/src/main/java/foundation/e/advancedprivacy/widget/WidgetUI.kt index 3d58999b..e3cfc515 100644 --- a/app/src/main/java/foundation/e/advancedprivacy/widget/WidgetUI.kt +++ b/app/src/main/java/foundation/e/advancedprivacy/widget/WidgetUI.kt @@ -25,14 +25,16 @@ import android.appwidget.AppWidgetManager import android.content.ComponentName import android.content.Context import android.content.Intent -import android.view.View +import android.graphics.drawable.Icon +import android.text.Spannable +import android.text.SpannableString +import android.text.style.ForegroundColorSpan import android.widget.RemoteViews +import androidx.annotation.StringRes import foundation.e.advancedprivacy.R import foundation.e.advancedprivacy.Widget import foundation.e.advancedprivacy.Widget.Companion.isDarkText -import foundation.e.advancedprivacy.common.extensions.dpToPxF import foundation.e.advancedprivacy.domain.entities.FeatureState -import foundation.e.advancedprivacy.domain.entities.QuickPrivacyState import foundation.e.advancedprivacy.domain.entities.TrackerMode import foundation.e.advancedprivacy.main.MainActivity import foundation.e.advancedprivacy.widget.WidgetCommandReceiver.Companion.ACTION_TOGGLE_IPSCRAMBLING @@ -41,17 +43,22 @@ import foundation.e.advancedprivacy.widget.WidgetCommandReceiver.Companion.ACTIO import foundation.e.advancedprivacy.widget.WidgetCommandReceiver.Companion.PARAM_FEATURE_ENABLED data class State( - val quickPrivacyState: QuickPrivacyState = QuickPrivacyState.DISABLED, val trackerMode: TrackerMode = TrackerMode.VULNERABLE, val isLocationHidden: Boolean = false, val ipScramblingMode: FeatureState = FeatureState.STOPPING, - val dayStatistics: List> = emptyList(), - val activeTrackersCount: Int = 0 + val blockedCallsCount: Int = 0, + val appsWithCallsCount: Int = 0, ) -fun render(context: Context, state: State, appWidgetManager: AppWidgetManager) { +fun render( + context: Context, + state: State, + appWidgetManager: AppWidgetManager, +) { val views = RemoteViews(context.packageName, R.layout.widget) - applyDarkText(context, state, views) + + applyDarkText(context, isDarkText, views) + views.apply { val openPIntent = PendingIntent.getActivity( context, @@ -63,24 +70,21 @@ fun render(context: Context, state: State, appWidgetManager: AppWidgetManager) { setOnClickPendingIntent(R.id.widget_container, openPIntent) setTextViewText( - R.id.state_label, - context.getString( - when (state.quickPrivacyState) { - QuickPrivacyState.DISABLED -> R.string.widget_state_title_off - QuickPrivacyState.FULL_ENABLED -> R.string.widget_state_title_on - QuickPrivacyState.ENABLED -> R.string.widget_state_title_custom - } - ) + R.id.data_blocked_trackers_secondary, + buildDataSecondarySpan(context, isDarkText, state.blockedCallsCount, R.string.widget_data_blocked_trackers_secondary) ) - val trackersEnabled = state.trackerMode != TrackerMode.VULNERABLE - setImageViewResource( - R.id.toggle_trackers, - if (trackersEnabled) R.drawable.ic_switch_enabled else R.drawable.ic_switch_disabled + setTextViewText( + R.id.data_apps_secondary, + buildDataSecondarySpan(context, isDarkText, state.appsWithCallsCount, R.string.widget_data_apps_secondary) ) + val trackersEnabled = state.trackerMode != TrackerMode.VULNERABLE + + setSwitchState(views, R.id.toggle_trackers, trackersEnabled) + setOnClickPendingIntent( - R.id.toggle_trackers, + R.id.trackers_control, PendingIntent.getBroadcast( context, REQUEST_CODE_TOGGLE_TRACKERS, @@ -92,28 +96,10 @@ fun render(context: Context, state: State, appWidgetManager: AppWidgetManager) { ) ) - setTextViewText( - R.id.state_trackers, - context.getString( - when (state.trackerMode) { - TrackerMode.DENIED -> R.string.widget_state_trackers_on - TrackerMode.VULNERABLE -> R.string.widget_state_trackers_off - TrackerMode.CUSTOM -> R.string.widget_state_trackers_custom - } - ) - ) - - setImageViewResource( - R.id.toggle_location, - if (state.isLocationHidden) { - R.drawable.ic_switch_enabled - } else { - R.drawable.ic_switch_disabled - } - ) + setSwitchState(views, R.id.toggle_location, state.isLocationHidden) setOnClickPendingIntent( - R.id.toggle_location, + R.id.fake_location, PendingIntent.getBroadcast( context, REQUEST_CODE_TOGGLE_LOCATION, @@ -125,28 +111,10 @@ fun render(context: Context, state: State, appWidgetManager: AppWidgetManager) { ) ) - setTextViewText( - R.id.state_geolocation, - context.getString( - if (state.isLocationHidden) { - R.string.widget_state_geolocation_on - } else { - R.string.widget_state_geolocation_off - } - ) - ) - - setImageViewResource( - R.id.toggle_ipscrambling, - if (state.ipScramblingMode.isChecked) { - R.drawable.ic_switch_enabled - } else { - R.drawable.ic_switch_disabled - } - ) + setSwitchState(views, R.id.toggle_ipscrambling, state.ipScramblingMode.isChecked) setOnClickPendingIntent( - R.id.toggle_ipscrambling, + R.id.ipscrambling, PendingIntent.getBroadcast( context, REQUEST_CODE_TOGGLE_IPSCRAMBLING, @@ -157,233 +125,99 @@ fun render(context: Context, state: State, appWidgetManager: AppWidgetManager) { FLAG_IMMUTABLE or FLAG_UPDATE_CURRENT ) ) - - setTextViewText( - R.id.state_ip_address, - context.getString( - if (state.ipScramblingMode == FeatureState.ON) { - R.string.widget_state_ipaddress_on - } else { - R.string.widget_state_ipaddress_off - } - ) - ) - - val loading = state.ipScramblingMode.isLoading - - setViewVisibility(R.id.state_ip_address, if (loading) View.GONE else View.VISIBLE) - - setViewVisibility(R.id.state_ip_address_loader, if (loading) View.VISIBLE else View.GONE) - - if (state.dayStatistics.all { it.first == 0 && it.second == 0 }) { - setViewVisibility(R.id.graph, View.GONE) - setViewVisibility(R.id.graph_legend, View.GONE) - setViewVisibility(R.id.graph_empty, View.VISIBLE) - setViewVisibility(R.id.graph_legend_values, View.GONE) - setViewVisibility(R.id.graph_view_trackers_btn, View.GONE) - } else { - setViewVisibility(R.id.graph, View.VISIBLE) - setViewVisibility(R.id.graph_legend, View.VISIBLE) - setViewVisibility(R.id.graph_empty, View.GONE) - setViewVisibility(R.id.graph_legend_values, View.VISIBLE) - setViewVisibility(R.id.graph_view_trackers_btn, View.VISIBLE) - - val pIntent = MainActivity.deepLinkBuilder(context) - .setDestination(R.id.trackersFragment) - .createPendingIntent() - - setOnClickPendingIntent(R.id.graph_view_trackers_btn, pIntent) - - val graphHeightPx = 26.dpToPxF(context) - val maxValue = - state.dayStatistics - .map { it.first + it.second } - .maxOrNull() - .let { if (it == null || it == 0) 1 else it } - val ratio = graphHeightPx / maxValue - - state.dayStatistics.forEachIndexed { index, (blocked, leaked) -> - // blocked (the bar below) - val middlePadding = graphHeightPx - blocked * ratio - setViewPadding(blockedBarIds[index], 0, middlePadding.toInt(), 0, 0) - - // leaked (the bar above) - val topPadding = graphHeightPx - (blocked + leaked) * ratio - setViewPadding(leakedBarIds[index], 0, topPadding.toInt(), 0, 0) - } - - setTextViewText( - R.id.graph_legend, - context.getString( - R.string.widget_graph_trackers_legend, - state.activeTrackersCount.toString() - ) - ) - } } appWidgetManager.updateAppWidget(ComponentName(context, Widget::class.java), views) } -private val containerBarIds = listOf( - R.id.widget_graph_bar_container_0, - R.id.widget_graph_bar_container_1, - R.id.widget_graph_bar_container_2, - R.id.widget_graph_bar_container_3, - R.id.widget_graph_bar_container_4, - R.id.widget_graph_bar_container_5, - R.id.widget_graph_bar_container_6, - R.id.widget_graph_bar_container_7, - R.id.widget_graph_bar_container_8, - R.id.widget_graph_bar_container_9, - R.id.widget_graph_bar_container_10, - R.id.widget_graph_bar_container_11, - R.id.widget_graph_bar_container_12, - R.id.widget_graph_bar_container_13, - R.id.widget_graph_bar_container_14, - R.id.widget_graph_bar_container_15, - R.id.widget_graph_bar_container_16, - R.id.widget_graph_bar_container_17, - R.id.widget_graph_bar_container_18, - R.id.widget_graph_bar_container_19, - R.id.widget_graph_bar_container_20, - R.id.widget_graph_bar_container_21, - R.id.widget_graph_bar_container_22, - R.id.widget_graph_bar_container_23 -) - -private val blockedBarIds = listOf( - R.id.widget_graph_bar_0, - R.id.widget_graph_bar_1, - R.id.widget_graph_bar_2, - R.id.widget_graph_bar_3, - R.id.widget_graph_bar_4, - R.id.widget_graph_bar_5, - R.id.widget_graph_bar_6, - R.id.widget_graph_bar_7, - R.id.widget_graph_bar_8, - R.id.widget_graph_bar_9, - R.id.widget_graph_bar_10, - R.id.widget_graph_bar_11, - R.id.widget_graph_bar_12, - R.id.widget_graph_bar_13, - R.id.widget_graph_bar_14, - R.id.widget_graph_bar_15, - R.id.widget_graph_bar_16, - R.id.widget_graph_bar_17, - R.id.widget_graph_bar_18, - R.id.widget_graph_bar_19, - R.id.widget_graph_bar_20, - R.id.widget_graph_bar_21, - R.id.widget_graph_bar_22, - R.id.widget_graph_bar_23 -) - -private val leakedBarIds = listOf( - R.id.widget_leaked_graph_bar_0, - R.id.widget_leaked_graph_bar_1, - R.id.widget_leaked_graph_bar_2, - R.id.widget_leaked_graph_bar_3, - R.id.widget_leaked_graph_bar_4, - R.id.widget_leaked_graph_bar_5, - R.id.widget_leaked_graph_bar_6, - R.id.widget_leaked_graph_bar_7, - R.id.widget_leaked_graph_bar_8, - R.id.widget_leaked_graph_bar_9, - R.id.widget_leaked_graph_bar_10, - R.id.widget_leaked_graph_bar_11, - R.id.widget_leaked_graph_bar_12, - R.id.widget_leaked_graph_bar_13, - R.id.widget_leaked_graph_bar_14, - R.id.widget_leaked_graph_bar_15, - R.id.widget_leaked_graph_bar_16, - R.id.widget_leaked_graph_bar_17, - R.id.widget_leaked_graph_bar_18, - R.id.widget_leaked_graph_bar_19, - R.id.widget_leaked_graph_bar_20, - R.id.widget_leaked_graph_bar_21, - R.id.widget_leaked_graph_bar_22, - R.id.widget_leaked_graph_bar_23 -) - private const val REQUEST_CODE_DASHBOARD = 1 -private const val REQUEST_CODE_TRACKERS = 3 private const val REQUEST_CODE_TOGGLE_TRACKERS = 4 private const val REQUEST_CODE_TOGGLE_LOCATION = 5 private const val REQUEST_CODE_TOGGLE_IPSCRAMBLING = 6 -private const val REQUEST_CODE_HIGHLIGHT = 100 -fun applyDarkText(context: Context, state: State, views: RemoteViews) { +private fun applyDarkText(context: Context, isDarkText: Boolean, views: RemoteViews) { views.apply { - listOf( - R.id.state_label, - R.id.graph_legend_blocked, - R.id.graph_legend_allowed - - ) - .forEach { - setTextColor( - it, - context.getColor(if (isDarkText) R.color.on_surface_disabled_light else R.color.on_primary_medium_emphasis) - ) - } - setTextColor( - R.id.widget_title, - context.getColor(if (isDarkText) R.color.on_surface_medium_emphasis_light else R.color.on_surface_high_emphasis) + // FFFFFF %87 + val primaryColor = context.getColor( + if (isDarkText) R.color.on_surface_medium_emphasis_light + else R.color.on_surface_high_emphasis ) + listOf( - R.id.state_trackers, - R.id.state_geolocation, - R.id.state_ip_address, - R.id.graph_legend, - R.id.graph_view_trackers_btn - ) - .forEach { - setTextColor( - it, - context.getColor(if (isDarkText) R.color.on_surface_medium_emphasis_light else R.color.on_primary_high_emphasis) - ) - } + R.id.widget_title, + R.id.data_blocked_trackers_primary, + R.id.data_apps_primary, + R.id.trackers_control_label, + R.id.fake_location_label, + R.id.ipscrambling_label + ).forEach { + setTextColor( + it, + primaryColor + ) + } listOf( - R.id.trackers_label, - R.id.geolocation_label, - R.id.ip_address_label, - R.id.graph_empty + R.id.settings_btn to R.drawable.ic_settings, + R.id.data_blocked_trackers_icon to R.drawable.ic_block_24, + R.id.data_apps_icon to R.drawable.ic_apps_24, + ).forEach { (viewId, drawableId) -> + setImageViewIcon( + viewId, + Icon.createWithResource(context, drawableId).apply { setTint(primaryColor) } + ) + } - ) - .forEach { - setTextColor( - it, - context.getColor(if (isDarkText) R.color.on_surface_disabled_light else R.color.on_primary_disabled) - ) - } - setTextViewCompoundDrawables( - R.id.graph_view_trackers_btn, - 0, - 0, - if (isDarkText) R.drawable.ic_chevron_right_24dp_light else R.drawable.ic_chevron_right_24dp, - 0 - ) - setImageViewResource( - R.id.settings_btn, - if (isDarkText) R.drawable.ic_settings_light else R.drawable.ic_settings - ) - setImageViewResource( - R.id.state_icon, - if (isDarkText) { - if (state.quickPrivacyState.isEnabled()) { - R.drawable.ic_shield_on_light - } else { - R.drawable.ic_shield_off_light - } - } else { - if (state.quickPrivacyState.isEnabled()) { - R.drawable.ic_shield_on_white - } else { - R.drawable.ic_shield_off_white - } - } - ) + // FFFFFF %60 + val secondaryColor = context.getColor(if (isDarkText) R.color.on_surface_disabled_light else R.color.on_primary_medium_emphasis) + + setTextColor(R.id.period_label, secondaryColor) + +// // FFFFFF %38 +// val disabledColor = context.getColor(if (isDarkText) R.color.on_surface_disabled_light else R.color.on_primary_disabled) +// +// listOf( +// R.id.data_blocked_trackers, +// R.id.data_apps +// ).forEach { +// // No control on background tint, should use ImageView With FrameLayout ? +// } } } + +private fun buildDataSecondarySpan(context: Context, isDarkText: Boolean, count: Int, @StringRes secondaryRes: Int): CharSequence { + val primaryColor = context.getColor( + if (isDarkText) R.color.on_surface_medium_emphasis_light + else R.color.on_surface_high_emphasis + ) + + val secondaryColor = context.getColor(if (isDarkText) R.color.on_surface_disabled_light else R.color.on_primary_medium_emphasis) + + val countStr = count.toString() + val secondary = context.getString(secondaryRes) + + val spannable = SpannableString("$countStr $secondary") + + spannable.setSpan( + ForegroundColorSpan(primaryColor), + 0, + countStr.length, + Spannable.SPAN_INCLUSIVE_EXCLUSIVE + ) + + spannable.setSpan( + ForegroundColorSpan(secondaryColor), + countStr.length, + spannable.length, + Spannable.SPAN_INCLUSIVE_EXCLUSIVE + ) + return spannable +} + +private fun setSwitchState(views: RemoteViews, switchId: Int, checked: Boolean) { + views.setImageViewResource( + switchId, + if (checked) R.drawable.ic_switch_enabled_raster + else R.drawable.ic_switch_disabled_raster + ) +} diff --git a/app/src/main/res/drawable/bg_stroke_rounded_8.xml b/app/src/main/res/drawable/bg_stroke_rounded_8.xml new file mode 100644 index 00000000..488961c1 --- /dev/null +++ b/app/src/main/res/drawable/bg_stroke_rounded_8.xml @@ -0,0 +1,21 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_switch_disabled.xml b/app/src/main/res/drawable/ic_switch_disabled.xml deleted file mode 100644 index 41584832..00000000 --- a/app/src/main/res/drawable/ic_switch_disabled.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - diff --git a/app/src/main/res/drawable/ic_switch_disabled_raster.png b/app/src/main/res/drawable/ic_switch_disabled_raster.png new file mode 100644 index 0000000000000000000000000000000000000000..d07fc453ff8c289df60affc625ef3e8ae7ea1a17 GIT binary patch literal 4651 zcmV+`64dR9P)003SH1^@s6q*otA00009a7bBm001mY z001mY0i`{bsQ>@~0drDELIAGL9O(c600d`2O+f$vv5yP@ma;TOP|85(5X4kaTyuFTda0_x4uO z>2!NK38Z@;X4$>Fy_59r`+oo4+qVoZA%@!9TDX8V3EtZo$Tobc9vEwp68DxOkiB|; z7=XVbU49rUhkL7ja0o&!qQu{BaAZJ{F z%F1!?qmscUeAoh(iwKL)40vuVt@*YeswnljmTeSxG zsva?hW98;Qp004b-@36 zBZ!+nGHs%p2=DN-;O=}JJhYCMl99w(;;j{3&+mdMFeL$wydPbz%mN2v9 zVeo#o8!V+^sxG-`0S>QU`2fEAllji!C_3lwH(zw&jm1OvoWAD{fRnF-r35g!t#a@4 zcR&#oCBTtuS3N30Zkq5zF^i4eb)TQjUczL)hi>_sU-mO;%alNOydB-~tq_sO0-Q{I zWc6aV|0~QE$StSt{09J=s7#q+L>Nhc`P?qWdd|JuR5@iflKIkSRia{Tm*K2IiVu(HT81PHn<>rI0T?eWUW5#Tm3hX_fUb+zOf92Hvg3d1FBt5M5==gWz z+y8hu#5=bs5zYnNpM4)PpZzpgrUnk*Z7O8=Zc+hKk(s6AhhR*dPtu!l7cKTEQh{?%$uoO)ai`7?8R;=bQ2`Ij&AS^yDS+aO@QG5h-EV21+)yXdMoZZ<> zy&4^BZ_7JCkv9g^ao9gJ`sMbvfk@&C~Ma{78M8A%)R3KOyP~0Nfih%bzN&4gs$n3 z>SQR}#A6~T8>Z`7loe#QL>(R0KGc3yyLl7{(Dg(RAeuObtz2WRUk;oNH~MX4eQ{AR z!GqDYK!6O``@$zt9b9yRHv2kEAFwRxJp#;d89OY|0Y*XjYI>0h9l#I~j z2hs+D#i2Fl$AFS4HJapu+Elcy1xtPe7U(^zzasH9$5s5t{0XN_xf7-?r<{uuO-l{G z{7US*OqHuFk*QC$x3%%KCtA!izV(y9SFQ%jxLtO?be1_Fl$i{wD^<-w8L)&!<&|1oB5Rk>xLtO$uEad zH-TYx>^CB&14boDNl21J=X($dX}fN6B;0}XDtVLAcg2=S_yY7Zxa>@r^cz-$g_1sb!nb_P zy5Q)@UM^iYY$hS-C$U%CMY{`S=%pimEl}Fo(a~Y&XechJCt(HCv4)Qw0ZU=HXaW6+ z(b5*8BZ8f_8@-3@HZ^=>1&5Cv1xsNJVQ2NbttBd)%R^iUx0{@Y8cPSiE_30~GhmsV z!RMY)?ZtHxXGItdmJzS=_|ISL#)eD!^*`SYlLd79Z5%im7qFcq^M^4_9o14W$#|l> zTMxyt?x2LFhcx>SJq?!pocqOI-vWY;p{)&!0EK>fB*gRNZbla(F$i4ox&2*WnV1nQ zRSg`_`3Wr)H$shBkrSy6uP zv@7H(n7-SOwSEPGqaVio5`h456ht!4cF+^1ap{;`&AI2S6*Tmr^`mxCofP~|suDPB z0Sf|~Yul*D=78MDSy88Gi^HIjLL>_gxGfAM4yw)^)*?KiCPs|KXECd>m6DirENj0rQf>`Vpg7$!AP{ z=g&WQHZ8qRQO}N}_$qW`)5ObH(E^ks{lcFtrCwbxG%;@Z@OIW zp!KWV*RwR&OF7#vkx0mXm*1~q9c+49 zpg^R@J0^N9*R8tLMP83~-1L+S>qku1 zfmPA}_N{@{D?(!Kwtjw`gQ zttRoIzpX^^RcKFOCLvgIgTmRAtL&2FyxdSW40`2>4JT4NQj-05CD*Q)Yqx}F48C*} zx<58IV#3$HwH=OPy;HeeEk632D+N;-un9r9RbE~w?khxm1k3+Hl9CcNJlxdO6g#l2 z;d6q?+lQ1Tl&UO~#&c+8fcT;%uXdZlolYxg%}>f(vN){ zTK?%@V75S(`*}>L1~KmAs_f*)cooL_X#vJV#b?3_a6ITPcT{!tY>M)pLfg??vFS86 zHpULDc*`RKL zF!TmC_M3oW#7Bq-=TcS-7cN|YFZP}O@vWEDF2FBk4buyBn=i$ql~(Z!r7w2~txMgC zR?L#;!KK96gHOZJd$+*rJHG{x8p)3D@~rqOwcDi{pf5}-zC1jL;=2usAc_EC?b@|$ zWMl+}hKAVJe%If%v7uVv7qw1blA{MkrM^y-MW?IrpDzP8XDqzu4uer zkt4pCVR9ah9b-}gDly5RYj(k3bDC1=3UtQ{R$l{4|M}xH?wXTm@m@w(OP3e;7qKxt zmybjS%F6k19}g^GT#s}(j0N$BB?Q*_aM0}5imvB(!4!xpKo;7I=H_N6j@((xmwj-4 z{7H-h-);zj5ty{p&ugfU2M-=p-{-t}^J4ccu3vinAJuHf@A0a%N97q%8FEHjKqW!| z?V7WbIF%;xQ)`#M1Dx7<{vO2`!?=-R$M6-8nSt{va~(d>2Ls2B!VvB$&g5F$TrUl6L`{SI0} zr@Fe@d2Dg@#zir47n+}D&%}kgX6WjBY8WvpDTWq!H1{nwzo1z_ldPANdQou5P6iEn zgPtN~#3OW4bs(Jwl+c(EiEmgx3^ch<+{2$2Svp9 zyrb#EjWOp#_{IOJamTJUWxgPNk(qU>J$+2Fpkoq-9P@)@$l95E1sV$|xJfvS2(^{d z?$)?t!LqK}Y~_tiNG3bgaxF7JsoOjF9%<xCA0+#7C2|mo>e)({mYwMu5GCP zP#xnNPzf7!Bv?hV6a0{`-a zbW^)$T6AHiQ-I;UT0jcxh9aF#^HZlzDIK7D=9swfnwlDpR!;nTb3^m;n%LVGir70V z9e8UM@PS+6AoW! zz4$jKvDLbHh=zn?qPM4u1UeYptw=L zpWd!=lEJ}2K(PiNj*lf;QxC1FhhhfKxhI5h@$<|bRD%u2u_b2fD$jvAtGL<6jCmg| zB)H|4Tlf=CJTXd;Xc-xnap*J=dY+-n_9H*W)Y3KRz8S`o>h7o*Q_^cnP>qd^62&Lc zvU->RNyl;I@#Dvh2qld7>XvdvkAj3Pp-N6^!^9 - - - - - diff --git a/app/src/main/res/drawable/ic_switch_enabled_raster.png b/app/src/main/res/drawable/ic_switch_enabled_raster.png new file mode 100644 index 0000000000000000000000000000000000000000..72cc22b7ef0401b7aac0b2941fd40baaa2d84d4d GIT binary patch literal 4601 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 jD5giJCfkIm`$H00000NkvXXu0mjfo;J6> literal 0 HcmV?d00001 diff --git a/app/src/main/res/layout/widget.xml b/app/src/main/res/layout/widget.xml index 8a84112f..02ad816a 100644 --- a/app/src/main/res/layout/widget.xml +++ b/app/src/main/res/layout/widget.xml @@ -15,18 +15,18 @@ ~ You should have received a copy of the GNU General Public License ~ along with this program. If not, see . --> - + android:id="@+id/widget_container"> - - - - + android:layout_marginStart="16dp" + android:textSize="14sp" + android:lineHeight="20sp" + android:textFontWeight="400" + android:textColor="@color/on_primary_medium_emphasis" + android:text="@string/widget_number_period" + /> - - - - - - + android:paddingHorizontal="16dp" + android:orientation="horizontal" + > - - + - - + - + - - + android:orientation="vertical" + > + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + android:layout_marginStart="16dp" + android:textSize="16sp" + android:lineHeight="24sp" + android:textFontWeight="400" + android:textColor="@color/on_primary_high_emphasis" + android:text="@string/widget_state_trackers_label" + /> + + - + + + - - - diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 5177868b..88528f2b 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -17,7 +17,7 @@ ~ along with this program. If not, see . --> - Advanced Privacy + Advanced Privacy_4 @@ -187,22 +187,17 @@ - @string/app_name - Your online privacy is protected - Your online privacy is unprotected - Custom privacy settings applied - @string/dashboard_state_trackers_label - @string/dashboard_state_trackers_off - @string/dashboard_state_trackers_on - @string/dashboard_state_trackers_custom - @string/dashboard_state_geolocation_label - @string/dashboard_state_geolocation_off - @string/dashboard_state_geolocation_on - @string/dashboard_state_ipaddress_label - @string/dashboard_state_ipaddress_off - @string/dashboard_state_ipaddress_on - @string/dashboard_graph_trackers_legend - View + @string/app_name + + @string/dashboard_number_period + @string/dashboard_data_blocked_trackers_primary + @string/dashboard_data_blocked_trackers_secondary + @string/dashboard_data_apps_primary + @string/dashboard_data_apps_secondary + + Block app trackers + Fake geolocation + Hide IP Address First Boot -- GitLab From 6154107b42212e988946a0ff3595561f68aacf12 Mon Sep 17 00:00:00 2001 From: Guillaume Jacquart Date: Wed, 27 Dec 2023 11:46:14 +0100 Subject: [PATCH 2/4] Chore: cleanup resources. --- .../e/advancedprivacy/Notifications.kt | 2 +- .../main/res/drawable-night/ic_shield_off.xml | 19 --- .../main/res/drawable-night/ic_shield_on.xml | 18 --- app/src/main/res/drawable/ic_back_24dp.xml | 27 ---- .../drawable/ic_chevron_right_24dp_light.xml | 28 ---- .../main/res/drawable/ic_legend_blocked.xml | 3 +- .../main/res/drawable/ic_legend_blocked_2.xml | 22 --- .../main/res/drawable/ic_map_marker_blue.xml | 11 -- .../main/res/drawable/ic_map_marker_red.xml | 28 ---- .../main/res/drawable/ic_settings_light.xml | 27 ---- app/src/main/res/drawable/ic_shield_off.xml | 19 --- .../main/res/drawable/ic_shield_off_light.xml | 35 ----- .../main/res/drawable/ic_shield_off_white.xml | 19 --- app/src/main/res/drawable/ic_shield_on.xml | 18 --- .../main/res/drawable/ic_shield_on_light.xml | 34 ----- .../main/res/drawable/ic_shield_on_white.xml | 18 --- app/src/main/res/layout/item_list_tracker.xml | 29 ---- .../main/res/layout/trackers_item_graph.xml | 2 +- app/src/main/res/mipmap-hdpi/ic_launcher.png | Bin 1736 -> 0 bytes app/src/main/res/mipmap-mdpi/ic_launcher.png | Bin 1195 -> 0 bytes app/src/main/res/mipmap-xhdpi/ic_launcher.png | Bin 2437 -> 0 bytes .../main/res/mipmap-xxhdpi/ic_launcher.png | Bin 3564 -> 0 bytes .../main/res/mipmap-xxxhdpi/ic_launcher.png | Bin 4646 -> 0 bytes app/src/main/res/navigation/nav_graph.xml | 2 +- app/src/main/res/values-de/strings.xml | 12 -- app/src/main/res/values-es/strings.xml | 30 ----- app/src/main/res/values-fi/strings.xml | 30 ----- app/src/main/res/values-fr/strings.xml | 12 -- app/src/main/res/values-is/strings.xml | 12 -- app/src/main/res/values-it/strings.xml | 30 ----- app/src/main/res/values-nl/strings.xml | 4 - app/src/main/res/values-ru/strings.xml | 30 ----- app/src/main/res/values-sv/strings.xml | 12 -- app/src/main/res/values-uk/strings.xml | 8 -- app/src/main/res/values/colors.xml | 3 - app/src/main/res/values/strings.xml | 125 ++++++++---------- 36 files changed, 63 insertions(+), 606 deletions(-) delete mode 100644 app/src/main/res/drawable-night/ic_shield_off.xml delete mode 100644 app/src/main/res/drawable-night/ic_shield_on.xml delete mode 100644 app/src/main/res/drawable/ic_back_24dp.xml delete mode 100644 app/src/main/res/drawable/ic_chevron_right_24dp_light.xml delete mode 100644 app/src/main/res/drawable/ic_legend_blocked_2.xml delete mode 100644 app/src/main/res/drawable/ic_map_marker_blue.xml delete mode 100644 app/src/main/res/drawable/ic_map_marker_red.xml delete mode 100644 app/src/main/res/drawable/ic_settings_light.xml delete mode 100644 app/src/main/res/drawable/ic_shield_off.xml delete mode 100644 app/src/main/res/drawable/ic_shield_off_light.xml delete mode 100644 app/src/main/res/drawable/ic_shield_off_white.xml delete mode 100644 app/src/main/res/drawable/ic_shield_on.xml delete mode 100644 app/src/main/res/drawable/ic_shield_on_light.xml delete mode 100644 app/src/main/res/drawable/ic_shield_on_white.xml delete mode 100644 app/src/main/res/layout/item_list_tracker.xml delete mode 100644 app/src/main/res/mipmap-hdpi/ic_launcher.png delete mode 100644 app/src/main/res/mipmap-mdpi/ic_launcher.png delete mode 100644 app/src/main/res/mipmap-xhdpi/ic_launcher.png delete mode 100644 app/src/main/res/mipmap-xxhdpi/ic_launcher.png delete mode 100644 app/src/main/res/mipmap-xxxhdpi/ic_launcher.png diff --git a/app/src/main/java/foundation/e/advancedprivacy/Notifications.kt b/app/src/main/java/foundation/e/advancedprivacy/Notifications.kt index ec92ebe9..d6e50a87 100644 --- a/app/src/main/java/foundation/e/advancedprivacy/Notifications.kt +++ b/app/src/main/java/foundation/e/advancedprivacy/Notifications.kt @@ -93,7 +93,7 @@ object Notifications { permissionsPrivacyModule = permissionsPrivacyModule, channelId = CHANNEL_TRACKER_FLAG, channelName = R.string.notifications_tracker_channel_name, - channelDescription = R.string.notifications_ipscrambling_channel_description + channelDescription = R.string.notifications_tracker_channel_description ) getQuickPrivacyStateUseCase.isLocationHidden.onEach { diff --git a/app/src/main/res/drawable-night/ic_shield_off.xml b/app/src/main/res/drawable-night/ic_shield_off.xml deleted file mode 100644 index f45fd988..00000000 --- a/app/src/main/res/drawable-night/ic_shield_off.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - - - - - diff --git a/app/src/main/res/drawable-night/ic_shield_on.xml b/app/src/main/res/drawable-night/ic_shield_on.xml deleted file mode 100644 index ecc27b4c..00000000 --- a/app/src/main/res/drawable-night/ic_shield_on.xml +++ /dev/null @@ -1,18 +0,0 @@ - - - - - - - diff --git a/app/src/main/res/drawable/ic_back_24dp.xml b/app/src/main/res/drawable/ic_back_24dp.xml deleted file mode 100644 index ec67587b..00000000 --- a/app/src/main/res/drawable/ic_back_24dp.xml +++ /dev/null @@ -1,27 +0,0 @@ - - - - - diff --git a/app/src/main/res/drawable/ic_chevron_right_24dp_light.xml b/app/src/main/res/drawable/ic_chevron_right_24dp_light.xml deleted file mode 100644 index acbf2f2a..00000000 --- a/app/src/main/res/drawable/ic_chevron_right_24dp_light.xml +++ /dev/null @@ -1,28 +0,0 @@ - - - - - - diff --git a/app/src/main/res/drawable/ic_legend_blocked.xml b/app/src/main/res/drawable/ic_legend_blocked.xml index 15f8c565..9a146a8b 100644 --- a/app/src/main/res/drawable/ic_legend_blocked.xml +++ b/app/src/main/res/drawable/ic_legend_blocked.xml @@ -1,4 +1,5 @@ - + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_legend_blocked_2.xml b/app/src/main/res/drawable/ic_legend_blocked_2.xml deleted file mode 100644 index 9a146a8b..00000000 --- a/app/src/main/res/drawable/ic_legend_blocked_2.xml +++ /dev/null @@ -1,22 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_map_marker_blue.xml b/app/src/main/res/drawable/ic_map_marker_blue.xml deleted file mode 100644 index 619dc47c..00000000 --- a/app/src/main/res/drawable/ic_map_marker_blue.xml +++ /dev/null @@ -1,11 +0,0 @@ - - - diff --git a/app/src/main/res/drawable/ic_map_marker_red.xml b/app/src/main/res/drawable/ic_map_marker_red.xml deleted file mode 100644 index 48fae251..00000000 --- a/app/src/main/res/drawable/ic_map_marker_red.xml +++ /dev/null @@ -1,28 +0,0 @@ - - - - - diff --git a/app/src/main/res/drawable/ic_settings_light.xml b/app/src/main/res/drawable/ic_settings_light.xml deleted file mode 100644 index 4eca968d..00000000 --- a/app/src/main/res/drawable/ic_settings_light.xml +++ /dev/null @@ -1,27 +0,0 @@ - - - - - - diff --git a/app/src/main/res/drawable/ic_shield_off.xml b/app/src/main/res/drawable/ic_shield_off.xml deleted file mode 100644 index cd60ba4a..00000000 --- a/app/src/main/res/drawable/ic_shield_off.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - - - - - diff --git a/app/src/main/res/drawable/ic_shield_off_light.xml b/app/src/main/res/drawable/ic_shield_off_light.xml deleted file mode 100644 index c5628357..00000000 --- a/app/src/main/res/drawable/ic_shield_off_light.xml +++ /dev/null @@ -1,35 +0,0 @@ - - - - - - - - - - diff --git a/app/src/main/res/drawable/ic_shield_off_white.xml b/app/src/main/res/drawable/ic_shield_off_white.xml deleted file mode 100644 index f45fd988..00000000 --- a/app/src/main/res/drawable/ic_shield_off_white.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - - - - - diff --git a/app/src/main/res/drawable/ic_shield_on.xml b/app/src/main/res/drawable/ic_shield_on.xml deleted file mode 100644 index e29f766f..00000000 --- a/app/src/main/res/drawable/ic_shield_on.xml +++ /dev/null @@ -1,18 +0,0 @@ - - - - - - - diff --git a/app/src/main/res/drawable/ic_shield_on_light.xml b/app/src/main/res/drawable/ic_shield_on_light.xml deleted file mode 100644 index ef34c063..00000000 --- a/app/src/main/res/drawable/ic_shield_on_light.xml +++ /dev/null @@ -1,34 +0,0 @@ - - - - - - - - - - diff --git a/app/src/main/res/drawable/ic_shield_on_white.xml b/app/src/main/res/drawable/ic_shield_on_white.xml deleted file mode 100644 index ecc27b4c..00000000 --- a/app/src/main/res/drawable/ic_shield_on_white.xml +++ /dev/null @@ -1,18 +0,0 @@ - - - - - - - diff --git a/app/src/main/res/layout/item_list_tracker.xml b/app/src/main/res/layout/item_list_tracker.xml deleted file mode 100644 index 1b5ecc22..00000000 --- a/app/src/main/res/layout/item_list_tracker.xml +++ /dev/null @@ -1,29 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/layout/trackers_item_graph.xml b/app/src/main/res/layout/trackers_item_graph.xml index b21371d2..e6f2d1ab 100644 --- a/app/src/main/res/layout/trackers_item_graph.xml +++ b/app/src/main/res/layout/trackers_item_graph.xml @@ -68,7 +68,7 @@ app:layout_constraintTop_toBottomOf="@+id/graph" android:layout_marginTop="19dp" android:layout_marginStart="16dp" - android:background="@drawable/ic_legend_blocked_2" + android:background="@drawable/ic_legend_blocked" app:layout_constraintHorizontal_chainStyle="packed" app:layout_constraintHorizontal_bias="0" /> diff --git a/app/src/main/res/mipmap-hdpi/ic_launcher.png b/app/src/main/res/mipmap-hdpi/ic_launcher.png deleted file mode 100644 index 0a08efdc5968e3627f4aec9d24f891494d30db6a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1736 zcmV;(1~>VMP)3 z000>30lzO5M*si-0drDELIAGL9O(c600d`2O+f$vv5yP2rO*%TPk`(brTqQHHJQF%l>;}5nbfn4H>7W2- zQknsKhIAo_!jxE@DX^FQ-|D2*>b|slcYE0S&B&aNlkEH7dvD*qeRqsf!sls<&UiD# z`Gj~|X}vxsn&P!fjP26<<1MyI+i5?@;{Ha>w`V5CUC z;;| zw?sevPc%ACj;RP`=7TrVk{DYim(2VoMFO8zh;9n6pS(d%VQeng^!Sp9MXsy}?sfAq z(dD`B{ljAa_4ST$ZaC}5X@Vsk(KT|xNQG$e8PWNv=wl!ftjrZdQX7vvR(t?};O-q3w)FUmQgP1?Rl9pAh zSQY$W{71$qZy?UqU&3AM%`VaUcSHxTyZ6I_Aj+_o7QAgpF?Tk4Ka&IO4rlp^gqU+- zM!urr&Od8JTMO~u@%>}@Zx~NEh+h0f^xw9$#vHI0Dfr`Ywc!$Q1>`tiPDP&>c)2ab zd9z2UKsxa4a`JcL`(FM{bl8*@2e54+pt(r+V-Z{Qz?%e41n~wZV)8pL-H@+1vBF5Q z*ci-3Lg3YNn<#Jz9fClZ{k`nt z1p+r-u&DFj$hbE)(Z7YI#7rceKdRFA_jd~!aoQX-gjkJEZiNhfY+PQ%3)eE6+GHcr z&V4Ecu-L$*Ayh^pc{CuAfk-JBh?IhXNGZrBaNB}>=kgD77{@4y`P{>mVn@mt+>3}=?_e(iOx6eYB{z@?P2bhVJc4SHeO0HoG3bvVchHX4%BI&`_ zW>s}8LX6P~vO*W$VzO)|k{)QsEKVrOt&l|8h_71WpLy z1fc?gu2~nrE%k2Qhc(Iq`?(uLQsau>`d4skanLWN@+i9{DSMG%O<4L-(PLGfV2(EX zXSbUndCV|2W>W>g2%>kA6(Lk$L2A+ot45=0hGbVNf!nF^3FO(Vjzm-!2=%A1PF_p0 zttY{nifC4c_>0fGT?_)fk1xcTeuyH{QBgwU#kj&bJ(pGaPNCpa_>GV=C+Bbkq!dF;-XG6 z>eh*VYj$R^`lkT5xKxIzNZa*4^BEja=c!nv0#l z?b>?U@V1#tOY$E9#GZ?H6>1h=6;I+0000M3AA^;yZ*kv_xrs+zgK|<$Z4dINTeZTN*yL~8VGDc zq6#U?qKL)tO9FU?cZd>B%jm{XNFgXB;XjZwiCJa*I{rQ5NfJVoWKP-W<8KRi#!Hz; zJ0L|~6b}k~>j{uKWT+19#BVtvo};2eNQhaurmF{-S^#dif3%0rQ*?UXcOCP+N#Ma6 z(3jN5eFH!_2kiZXLz3)p63Y9Na7q8gdgIAhMxW~)fKw7kD*=wY&yZob6 zC!)ZI($L*1@U?O@Orr2{N&k_-ah>FB-An24)@eXA0UN$AbqSqfT96&VSkn5|1lpXo z7Z5FkqA-}!Ny=VjW3jb-Ifi%yOg__HuYrRYM`d=6j&UDC^t|7A14VTAz%?-l7!N;B z<2liDjC%oYr_4=pFM#7jmW24c_!4o^CWA z0bat6)Q%e^wgc=0m~gP|2K~mHW7~VpvUBg3)#Y{qOgPwfgJIX%-fL!}%o_{r1eo4q z__o#M7zzoQV5@{dk!D$Hxk9rOzy%9o7}&(~*^zMLnsIGfzcOSkyIi}u5Ff^eb{|$A znyr+)g-_tzev_DH=v+8-&Q|lKq``hN$B7t?=Uj)aaGZyh?;$c=iJ9l1CUb>;*7{UT5`tdWw}c7a|xsnYa2q9TdU)B-%j6u&JxGwOB3; zmLXXTi#TFOABia-SS~!tNXsG>8WdaW0CX*^4X{;IP- z%*-`+7j%medVRIvWQ|M#-{4|{BUtk^t1~tO)*>ITc2(c4`c!H5f|%d~k)@!52k&UeARRGOPAp z*WnV=8nGcguXqEQm_tRSa|~{Z3Exi+>V7LBXOLGd5!1%5Bed~(b105{?(G{Z5w3Hh zRrsqF73yBJ_z(@R_kMl=?ja}DWftqfIFMCkctr*JQqb`KhCgL)b0}hPNO=GN002ov JPDHLkV1j{!B$NOE diff --git a/app/src/main/res/mipmap-xhdpi/ic_launcher.png b/app/src/main/res/mipmap-xhdpi/ic_launcher.png deleted file mode 100644 index b6b63b6726bb22124da5b4b8d6474050a6414189..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2437 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 F`agQ>p>Y5J diff --git a/app/src/main/res/navigation/nav_graph.xml b/app/src/main/res/navigation/nav_graph.xml index 04564373..83636df8 100644 --- a/app/src/main/res/navigation/nav_graph.xml +++ b/app/src/main/res/navigation/nav_graph.xml @@ -24,7 +24,7 @@ Verschleiere meine echte IP-Adresse Ich bin anonym im Internet Bemerkung: Wenn diese Option aktiviert ist, kann das Internet spürbar langsamer sein. - Aktiviere „Schneller Datenschutz“, um diese Funktionen zu benutzen Unser IP-Verschlüsselungsdienst benötigt Zeit zum Starten. Das kann einige Minuten dauern. Der Bildschirm kann verlassen werden, ohne dass der Prozess unterbrochen wird. Meinen echten Standort benutzen Einen zufälligen, aber möglichen Standort benutzen @@ -59,24 +58,14 @@ Tracker-Kontrolle anschalten Es wurden noch keine Tracker gefunden. Sobald welche entdeckt werden, wird das hier aktualisiert. Es wurden noch keine Tracker entdeckt. Alle zukünftigen Tracker werden blockiert. - Aktiviere „Schneller Datenschutz“, um Tracker aktivieren und deaktivieren zu können. - App ist nicht installiert. - Dein Online-Datenschutz ist gewährleistet - Dein Online-Datenschutz ist nicht gewährleistet Meine Internetaktivität soll erscheinen von: Deine Internetadresse oder IP-Adresse ist die Kennung deines Telefons, wenn es mit dem Internet verbunden ist. \n \n„Meine IP-Adresse verwalten“ ermöglicht dir, eine gefälschte IP-Adresse anstatt deiner echten IP-Adresse zu benutzen. Auf diese Weise kann deine Internetaktivität nicht mit deiner echten IP-Adresse und deinem Telefon verknüpft werden. Glückwunsch! Es wird kein Profil über dich von Trackern erstellt. - Blockierte Lecks - Erlaubte Lecks Entdecke Advanced Privacy - Tippe auf die Balken für weitere Informationen. Tippe, um herauszufinden, wie Tracker einfach blockiert, dein Standort gefälscht und deine IP-Adresse verschleiert werden kann. Benutzerdefinierte Datenschutz-Einstellungen werden angewendet - Schließen - Benutzerdefinierte Datenschutz-Einstellungen werden angewandt - Ansicht Ansicht Nur Apps mit Internet-Berechtigung sind aufgeführt. Benutzerdefiniert @@ -123,7 +112,6 @@ Bemerkung: Schalte die Tracker aus, die du zulassen möchtest: %s Tracker-Übersicht - Tracker verwalten Schalte die Apps um, für die du diesen Tracker erlauben willst: Tracker-Kontrolle Warnung Blockierte Datenlecks diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml index 787e49d6..7f6bb29f 100644 --- a/app/src/main/res/values-es/strings.xml +++ b/app/src/main/res/values-es/strings.xml @@ -1,24 +1,12 @@ - Rastreadores Vulnerable Rechazado - Ubicación Expuesto Falso - Direccion IP real Expuesto Oculto - Filtración de datos personales: - Hoy - Gestionar rastreadores de aplicaciones - %1$d rastreadores detectados, %2$d rastreadores permitidos Gestionar permisos de aplicaciones - Geolocalización real - Geolocalización falsa específica - Geolocalización falsa al azar - Gestionar mi dirección de Internet - Dirección IP real oculta Gestionar mi dirección de Internet Usar mi dirección IP real Puedo ser rastreado por mi dirección IP @@ -27,9 +15,6 @@ Mi actividad en internet debe aparecer desde: País al azar Aplicar esta configuración a todas las aplicaciones seleccionadas * : - Tu privacidad en linea está desprotegida - Gestiona tus permisos - Activar \"Privacidad rápida\" para poder activar/desactivar rastreadores. Gestionar mi ubicación Usar mi ubicación real Usar una ubicación aceptable al azar @@ -49,12 +34,8 @@ Rastreadores bloqueados No se ha detectado ningún rastreador. Nuevos rastreadores se actualizarán aquí. - Privacidad rápida activada para utilizar funciones No se ha detectado ningún rastreador. Futuros rastreadores serán todos bloqueados. - Tu privacidad en línea está protegida - %s rastreadores te han perfilado en las últimas 24 horas Gestionar mi ubicación - Dirección IP real expuesta Nuestro servicio de codificación de IP está tardando en lanzarse. Puede tardar unos minutos. Salir de la pantalla no interrumpirá el proceso. Tu dirección de Internet o dirección IP es el identificador asignado a tu teléfono cuando estás conectado al Internet. \n @@ -65,9 +46,6 @@ Los rastreadores son fragmentos de código ocultos en las aplicaciones. Recopilan tus datos y siguen tu actividad 24/7. Comprueba qué rastreadores están activos y bloquéalos todos para una mejor protección. Puedes elegir específicamente qué rastreadores quieres bloquear para evitar el mal funcionamiento de algunas aplicaciones. Nota: Mientras esta opción esté activa, es probable que tu velocidad de Internet se reduzca considerablemente. Sistema - Tu privacidad en línea está protegida - Tu privacidad en línea está desprotegida - Aplicación no instalada. Esto podría afectar el funcionamiento de algunas aplicaciones. IP real oculta Resaltar que la IP está actualmente oculta por Advanced Privacy @@ -78,7 +56,6 @@ Indicador de ubicación falsa Toca para descubrir cómo bloquear rastreadores, falsificar tu ubicación y ocultar tu dirección IP facilmente. Primer arranque - Configuración de privacidad personalizada Entendido Esta opción utiliza la red TOR para ocultar tu dirección IP real. Utilízala sólo para aplicaciones específicas. Mientras tu IP sea falsa, es probable que tu velocidad de Internet se vea reducida. \nImportante: te aconsejamos que desactives esta función para los servicios de correo electrónico, ya que tu dirección podría ser bloqueada permanentemente por tu proveedor. @@ -94,15 +71,8 @@ Por favor, desactiva la VPN %s de terceros para que Advanced Privacy pueda ocultar tu dirección IP real. Sólo aparecen aplicaciones con acceso a Internet. Personalizado - Configuración de privacidad personalizada No hay aplicación para ver páginas web - Pulse en las barras para más información. - Fugas permitidas - Fugas bloqueadas - Cerrar Ok Enhorabuena. Ningún rastreador te está haciendo un perfil. - Vista - Vista Ocultar mi indicador IP \ No newline at end of file diff --git a/app/src/main/res/values-fi/strings.xml b/app/src/main/res/values-fi/strings.xml index f9a16c06..7148e866 100644 --- a/app/src/main/res/values-fi/strings.xml +++ b/app/src/main/res/values-fi/strings.xml @@ -1,14 +1,7 @@ - Yksityisyyttäsi verkossa ei ole suojattu Napauta nädäksesi, miten helposti voit estää seuraimet, väärentää sijaintisi ja piilottaa IP-osoitteesi. Tutustu Advanced Privacy:n - Näytä - Sovelletaan mukautettuja yksityisyysasetuksia - Yksityisyyttäsi verkossa ei ole suojattu - Yksityisyytesi verkossa on suojattu - Sovellusta ei ole asennettu. - Ota Quick Privacy käyttöön, jotta voit ottaa käyttöön tai poistaa käytöstä seuraimia. Seuraimia ei ole vielä havaittu. Kaikki jatkossa ilmestyvät seuraimet estetään. Seuraimia ei ole vielä havaittu. Jos uusia seuraimia havaitaan, ne päivitetään tähän. Estä seuraimet @@ -25,7 +18,6 @@ Virheelliset koordinaatit Leveysaste Pituusaste - Tietty väärennetty sijainti Käytä tiettyä sijaintia Käytä satunnaista uskottavaa sijaintia Käytä oikeaa sijaintiani @@ -34,38 +26,18 @@ \nSijainnin hallinta mahdollistaa väärennetyn sijainnin käyttämisen todellisen sijaintisi sijasta. Näin todellista sijaintiasi ei jaeta sovelluksille, jotka saattavat nuuskia liikaa. Hallitse sijaintiani Piilotetun IP-palvelumme käynnistäminen vie aikaa. Se voi kestää muutaman minuutin. Ruudulta poistuminen ei keskeytä prosessia. - Quick Privacy on otettu käyttöön toimintojen käyttöä varten Sovella tätä asetusta kaikkiin valittuihin sovelluksiin * : Satunnaisesta maasta Internet-toimintani täytyy näyttää olevan peräisin: Huomaa: Kun tämä vaihtoehto on käytössä, Internetyhteytesi nopeus todennäköisesti alenee merkittävästi. - Hallitse Internet-osoitettani - Satunnainen väärennetty sijainti - Todellinen sijainti Hallitse sijaintiasi - Hallitse käyttöoikeuksiasi Hallitse sovellusten käyttöoikeuksia - %1$d havaittua seurainta, %2$d sallittua seurainta - Hallitse sovellusten seuraimia - Näytä - %s seurainta on profiloinut tietojasi viimeisen 24 tunnin aikana - Tänään - Henkilötietojen vuoto: Piilotettu Paljastettu - Todellinen IP-osoite Väärennetty Paljastettu - Sijainti Estetty Haavoittuvainen - Seuraimet - Sovelletaan mukautettuja yksityisyysasetuksia - Yksityisyytesi verkossa on suojattu - Sulje - Napauta palkkeja saadaksesi lisätietoja. - Sallittuja tietovuotoja - Estettyjä tietovuotoja Onnittelut! Yksikään seurain ei profiloi sinua. Järjestelmä Olen anonyymi Internetissä @@ -76,8 +48,6 @@ \n \nInternet-osoitteen hallinta mahdollistaa väärennetyn IP-osoitteen käyttämisen oikean IP-osoitteesi sijaan. Näin Internet-toimintaasi ei voida yhdistää oikeaan IP-osoitteeseesi eikä laitteeseesi. Hallitse Internet-osoitettani - Todellinen IP-osoite piilotettu - Todellinen IP-osoite paljastettu Tämä voi vaikuttaa joidenkin sovellusten toimintaan. Todellinen IP piilotettu Korosta, että sijainti on tällä hetkellä väärennetty Advanced Privacy -sovelluksella diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml index aebb68b4..b0279454 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -44,7 +44,6 @@ Activer le contrôle des pisteurs Aucun pisteur n\'a été détecté pour l\'instant. Si de nouveaux pisteurs sont détectés, ils seront listés ici. Aucun pisteur n\'a été détecté pour l\'instant. Tous les futurs pisteurs seront bloqués. - Activez \"Confidentialité Rapide\" pour pouvoir bloquer/autoriser les pisteurs. Gérer ma position Utiliser ma vraie position Utiliser une position aléatoire plausible @@ -52,26 +51,16 @@ Votre adresse Internet ou adresse IP est l\'identifiant attribué à votre téléphone lorsqu\'il est connecté à Internet. \n \n\"Gérer mon adresse Internet\" vous permet d\'utiliser une adresse IP fictive au lieu de votre véritable adresse IP. Ainsi, votre activité Internet ne peut pas être liée à votre vraie adresse IP et à votre appareil. - Activation de la confidentialité rapide pour utiliser les fonctionnalités Notre service de brouillage des adresses IP prend du temps à se lancer. Cela peut prendre quelques minutes. Quitter l\'écran n\'interrompra pas le processus. Votre position peut révéler beaucoup de choses sur vous-même ou sur vos activités. \n \n\"Gérer ma position\" vous permet d\'utiliser une position fictive au lieu de votre véritable position. De cette façon, votre vraie position n\'est pas partagée avec des applications qui pourraient vous espionner. Les pisteurs sont des morceaux de code dissimulés dans les applications. Ils collectent vos données et suivent votre activité 24h/24 et 7j/7. Découvrez les pisteurs actifs et bloquez-les tous pour une meilleure protection. Pour éviter le dysfonctionnement de certaines applications, vous pouvez également choisir spécifiquement les pisteurs que vous souhaitez bloquer. - Fuites autorisées - Fuites bloquées - Appuyez sur les barres pour plus d\'informations. Félicitations ! Aucun pisteur ne vous profile. Paramètres de confidentialité personnalisés appliqués Découvrez Advanced Privacy - Application non installée. Cliquez pour découvrir comment bloquer facilement les pisteurs, falsifier votre position et masquer votre adresse IP. - Voir - Paramètres de confidentialité personnalisés appliqués - Votre vie privée en ligne n\'est pas protégée - Votre vie privée en ligne est protégée Voir - Fermer Applications Système Merci de désactiver le VPN tiers %s afin de permettre à Advanced Privacy de masquer votre vraie adresse IP. Seules les applications ayant la permission Internet sont listées. @@ -119,7 +108,6 @@ Note : Désactivez les pisteur que vous voulez autoriser : Activité de %s - Gérer les pisteurs Désactiver les apps pour lesquelles vous souhaitez autoriser ce pisteur Fuites bloquées Voir plus. diff --git a/app/src/main/res/values-is/strings.xml b/app/src/main/res/values-is/strings.xml index 10ee239d..392cf5af 100644 --- a/app/src/main/res/values-is/strings.xml +++ b/app/src/main/res/values-is/strings.xml @@ -1,11 +1,8 @@ - Loka Í lagi Kerfi Samhæfni forrita - Útilokaðir lekar - Leyfðir lekar Rekjarar Viðkvæmt Hafnað @@ -33,12 +30,10 @@ dd/MM MMM Víxla á rekjarastýringu - Forritið er ekki uppsett. Ekki sýna þetta aftur Falsa staðsetninguna þína Fela IP-vistfangið mitt Ég skil - Skoða Friðhelgi þín á netinu er óvarin Handahófskennd fölsuð hnattstaðsetning Sýsla með internetslóðina mína @@ -54,7 +49,6 @@ Nota handahófskennda en sennilega staðsetningu Fyrsta ræsing Til hamingju! Engir rekjarar eru að njósna um þig. - Ýttu á stikurnar til að fá frekari upplýsingar. Ekkert forrit til að skoða vefsíður Friðhelgi þín á netinu er varin Sérsniðnar stillingar á friðhelgi virkjaðar @@ -69,9 +63,6 @@ Sýsla með rekjara í forriti Frumstilla rekjara Sýsla með rekjara í forritum - Friðhelgi þín á netinu er varin - Friðhelgi þín á netinu er óvarin - Sérsniðnar stillingar á friðhelgi virkjaðar Raunverulegt IP-vistfang falið Hægt er að rekja slóðir mínar frá IP-vistfanginu mínu Virkni mín á netinu verður að sýnast vera frá: @@ -82,12 +73,10 @@ Kveikt á falsaðri staðsetningu Þetta gæti haft áhrif á virkni sumra forrita. Athugaðu: Á meðan þessi kostur er virkur, er hraði internettengingarinnar þinnar líklega verulega takmarkaður. - Virkjaði flýtileynd (Quick Privacy) til að nota eiginleika Gerðu utanaðkomandi %s VPN-tenginguna þína óvirka til að ítarlega persónuverndin geti falið raunverulega IP-vistfangið þitt. Engir rekjarar hafa enn fundist. Ef nýir rekjarar finnast mun það sjást hér. Engir rekjarar hafa enn fundist. Allir rekjarar sem finnast munu verða útilokaðir. Engir rekjarar hafa enn fundist. Einhverjir rekjarar hafa verið teknir úr banni. - Virkjaðu flýtileynd (Quick Privacy) til að geta virkjað rekjara eða gert óvirka. Breytingar taka gildi þegar kveikt er á útilokun rekjara. Falsa staðsetningarflagg Merkja að þessi staðsetning sé núna fölsuð af ítarlegu persónuverndinni @@ -124,7 +113,6 @@ Athugaðu: Veldu hvaða rekjara þú vilt leyfa: %s yfirlit rekjara - Stýra rekjara Víxlaðu af þeim forritum þar sem þú vilt leyfa þennan rekjara: Útilokaðir lekar Kanna nánar. diff --git a/app/src/main/res/values-it/strings.xml b/app/src/main/res/values-it/strings.xml index 1842dd53..2812faee 100644 --- a/app/src/main/res/values-it/strings.xml +++ b/app/src/main/res/values-it/strings.xml @@ -1,27 +1,13 @@ - La tua privacy online non è protetta - Tracker Vulnerabile Negato - Posizione Esposta Fasulla - Indirizzo IP reale Esposto Nascosto - Fuga di dati personali: - Oggi - Gestisci i trackers delle app - %1$d tracker trovati, %2$d ammessi Gestisci i permessi delle app - Gestisci i permessi Gestisci la posizione - Posizione reale - Posizione fasulla casuale - Gestisci indirizzo Internet - Indirizzo IP reale esposto - Indirizzo IP reale nascosto Gestisci indirizzo Internet Usa indirizzo IP reale Posso essere tracciato dal mio indirizzo IP @@ -51,14 +37,9 @@ Blocca tracker Non sono ancora stati rilevati tracker. Nel caso in cui accadesse verranno mostrati qui. Non sono ancora stati rilevati tracker. Tutti quelli trovati in futuro verranno bloccati. - Abilita Quick Privacy per poter attivare/disattivare i tracker. - La tua privacy online è protetta - %s tracker ti hanno profilato nelle ultime 24 ore - Scegli posizione fasulla L\'indirizzo Internet o indirizzo IP è l\'identificatore assegnato al telefono quando è connesso a Internet. \n \nGestisci indirizzo Internet ti permette di utilizzare un falso indirizzo IP al posto di quello reale. In questo modo, la tua attività su Internet non può essere collegata al tuo indirizzo IP reale e al tuo dispositivo. - Quick Privacy abilitato ad usare le sue funzioni Il servizio di cifratura dell\'IP richiede tempo per essere lanciato. Può richiedere alcuni minuti. Chiudere lo schermo non interromperà il processo. La posizione può rivelare molto su di te o sulle tue attività. \n @@ -66,17 +47,6 @@ I tracker sono pezzi di codice nascosti nelle app. Raccolgono i tuoi dati e seguono la tua attività 24/7. Guarda quali tracker sono attivi e bloccali tutti per una migliore protezione. Dal momento che ciò potrebbe causare il malfunzionamento di alcune app, puoi scegliere di bloccarne solo alcuni. Tocca per scoprire com\'è facile bloccare i tracker, nascondere la posizione & l\'indirizzo IP. Scopri Advanced Privacy - Visualizza - Impostazioni privacy personalizzate applicate - La tua privavy online non è protetta - La tua privacy online è protetta - App non installata. - Visualizza - Impostazioni della privacy personalizzate applicate - Chiudi - Tocca le barre per maggiori informazioni. - Fughe di dati ammesse - Fughe di dati bloccate Complimenti! Nessun tracker ti sta profilando. Sistema Disabilita la VPN %s di terze parti in modo da permettere ad Advanced Privacy di nascondere l\'indirizzo IP reale. diff --git a/app/src/main/res/values-nl/strings.xml b/app/src/main/res/values-nl/strings.xml index d96d54c0..a3210236 100644 --- a/app/src/main/res/values-nl/strings.xml +++ b/app/src/main/res/values-nl/strings.xml @@ -1,10 +1,6 @@ OK - Sluiten - Tik op de balk voor meer info. - Toegestane lekken - Geblokkeerde lekken Gefeliciteerd! Er zijn geen trackers you aan het profileren. Systeem diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index 2793ec62..e9cbb0c9 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -2,25 +2,15 @@ Скрытый Раскрыто - Настоящий IP-адрес Поддельный Раскрыто - Местоположение Пользовательские Отказано Уязвимые места - Трекеры - Применение пользовательских настроек конфиденциальности - Ваша конфиденциальность в Интернете не защищена - Ваша конфиденциальность в Интернете защищена Нет приложения для просмотра веб-страниц - Нажмите на полоски для получения дополнительной информации. - Допустимые утечки - Заблокированные утечки Поздравляем! Никакие трекеры не профилируют вас. Система ОК - Закрыть Это может повлиять на работу некоторых приложений. Настоящий IP-адрес скрыт Выделите тот IP, который в настоящее время скрыт с помощью \"Advanced Privacy\" @@ -32,10 +22,6 @@ Нажмите, чтобы узнать, как легко блокировать трекеры, подделывать свое местоположение и скрывать свой IP-адрес. Откройте для себя \"Advanced Privacy\" Первая Загрузка - Вид - Применение пользовательских настроек конфиденциальности - Ваша конфиденциальность в Интернете не защищена - Ваша конфиденциальность в Интернете защищена Я понимаю Этот параметр использует сеть TOR, чтобы скрыть ваш реальный IP-адрес. Используйте его только для определенных приложений. Хотя ваш IP-адрес подделан, скорость вашего Интернета, скорее всего, будет снижена. \nВажно: мы рекомендуем отключить эту функцию для служб электронной почты, так как ваш адрес может быть заблокирован вашим провайдером навсегда. @@ -45,8 +31,6 @@ Управление трекерами приложений Пока эта опция активна, в редких случаях, некоторые приложения могут работать некорректно. Если у вас возникли проблемы, вы можете в любое время отключить контроль за трекерами для определенных приложений и веб-сайтов. Изменения вступят в силу, если включен блокировщик трекеров. - Приложение не установлено. - Включите \"Quick Privacy\", чтобы иметь возможность активировать/деактивировать трекеры. Контроль за трекерами Не показывать снова Трекеры пока не обнаружены. Все будущие трекеры будут заблокированы. @@ -75,7 +59,6 @@ \nФункция \"Управление моим местоположением\" позволяет вам использовать поддельное местоположение вместо вашего настоящего. Таким образом, ваше настоящее местоположение не будет передано приложениям, которые могут слишком много шпионить. Управление своим местоположением Запуск нашей услуги скремблирования IP-адресов занимает некоторое время. Это может занять несколько минут. Уход с экрана не прервет процесс. - Включена \"Quick Privacy\" для использования функциональных возможностей Пожалуйста, отключите сторонние VPN %s, чтобы \"Advanced Privacy\" скрыл ваш реальный IP-адрес. В списке отображаются только приложения с разрешением на использование Интернета. Применить эту настройку ко всем выбранным приложениям * : @@ -90,20 +73,7 @@ \n \nУправление своим интернет-адресом позволяет использовать поддельный IP-адрес вместо своего настоящего IP-адреса. Таким образом, ваша деятельность в Интернете не может быть связана с вашим настоящим IP-адресом и вашим устройством. Управление своим Интернет-адресом - Настоящий IP-адрес скрыт - Настоящие IP-адрес раскрыт - Управление своим Интернет-адресом - Случайная поддельная геолокация - Специфичная поддельная геолокация - Реальная геолокация Управление личным местоположением - Управление правами доступа Управление разрешениями приложения - %1$d обнаруженных трекеров, %2$d разрешенных трекеров - Управление трекерами приложений - %s трекеров составили ваш профиль за последние 24 часа - Вид - Сегодня - Утечка персональных данных: Совместимость приложений \ No newline at end of file diff --git a/app/src/main/res/values-sv/strings.xml b/app/src/main/res/values-sv/strings.xml index 5c2c59eb..58d5a992 100644 --- a/app/src/main/res/values-sv/strings.xml +++ b/app/src/main/res/values-sv/strings.xml @@ -2,15 +2,10 @@ Göm mitt IP Jag förstår - Visa - Stäng OK System Applikationers kompabilitet Grattis! Inga spårare profilerar dig. - Blockerade läckor - Tillåtna läckor - Tryck på staplarna för mer information. Ingen applikation för att kunna se webbsidor Din integritet online är skyddad Din integritet online är inte skyddad @@ -73,19 +68,14 @@ Inga spårare har upptäckts än. Om nya spårare upptäcks kommer de uppdateras här. Inga spårare har upptäckts än. Alla framtida spårare kommer blockeras. Inga spårare har upptäckts än. Vissa spårare har tidigare avblockerats. - Appen är inte installerad. Ändringar kommer gälla från när spårarblockeraren är på. Återställ spårare Visa inte igen - Din integritet online är skyddad - Din integritet online är inte skyddad - Anpassade integritetsinställningar applicerade Första start Upptäck Avancerad Integritet Tryck för att få reda på hur du lätt blockerar spårare, fejkar din plats & gömmer din IP-adress. Verklig IP är dold Detta kan påverka funktionen hos vissa appar. - Aktivera Snabb integritet för att använda funktionerna Inaktivera tredjeparts-VPN %s för att dölja din verkliga IP-adress med Avancerad Integritet. Vår tjänst för förvrängning av IP tar tid att starta. Det kan ta några minuter. Att lämna sidan kommer inte avbryta processen. HH:mm @@ -93,7 +83,6 @@ MMMM yyyy dd/MM MMM - Aktivera Snabb integritet för att kunna aktivera/inaktivera spårare. Spårarkontroll Medan detta alternativ är aktiverat kan, i sällsynta fall, vissa appar sluta fungera korrekt. Om du stöter på problem kan du inaktivera Spårarkontroll för specifika appar och webbsidor när som helst. Hantera spårare i appar @@ -128,7 +117,6 @@ Läckor senaste 30 dagarna %d tillåtna %s spårarsammandrag - Hantera spårare Läckor senaste 12 månaderna Växla av apparna där du vill tillåta denna spårare: Tryck för mer info diff --git a/app/src/main/res/values-uk/strings.xml b/app/src/main/res/values-uk/strings.xml index edebac18..bc8041a0 100644 --- a/app/src/main/res/values-uk/strings.xml +++ b/app/src/main/res/values-uk/strings.xml @@ -2,16 +2,8 @@ Відхилені Вразливі - Трекери - Опції приватності застосовані - Ваша приватність в інтернеті не захищена - Ваша приватність в інтернеті захищена Нема застосунку для перегляду вебсторінок - Натисніть на панель щоб показати більше інформації. - Дозволені витіки - Заблоковані витіки Вітаємо! Жодних трекерів, що за вами стежать. Система Ок - Закрити \ No newline at end of file diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml index 8b9d534d..240694c7 100644 --- a/app/src/main/res/values/colors.xml +++ b/app/src/main/res/values/colors.xml @@ -44,9 +44,6 @@ - - #AADCFE - @color/e_primary_text_color_dark @color/e_secondary_text_color_dark diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 88528f2b..926a4f48 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -17,44 +17,39 @@ ~ along with this program. If not, see . --> - Advanced Privacy_4 + Advanced Privacy - Close OK System Applications compatibility - Congratulations! No trackers are profiling you. - Blocked leaks - Allowed leaks - Tap on the bars for more information. - + Congratulations! No trackers are profiling you. No application to see webpages @string/app_name - Last 30 days - View Statistics - Blocked - Leaks - From - Apps - Your Privacy Settings - App trackers - Vulnerable + Last 30 days + View Statistics + Blocked + Leaks + From + Apps + Your Privacy Settings + App trackers + Vulnerable Denied Custom - Geolocation + Geolocation Exposed Protected - Real IP address + Real IP address Exposed Hidden - App permission request + App permission request Your online privacy is protected Your online privacy is unprotected @@ -93,7 +88,6 @@ Random country Apply this setting to all selected applications * : Only apps with Internet permission are listed. - Enabled Quick Privacy to use functionalities Please disable the 3rd-party VPN %s in order for Advanced Privacy to hide your real IP address. Our scrambling IP service is taking time to launch. It can take a few minutes. Leaving the screen won\'t interrupt the process. @@ -113,24 +107,24 @@ Know more Day - Month + Month Year - Leaks in the last 24 hours - Leaks in the last 30 days - Leaks in the last 12 months - Tap for more info - Blocked leaks - Allowed leaks - %d detected trackers - %d allowed - - Apps - Trackers - Trackers Activity Summary - Apps with trackers - - %s trackers detected - detected in %s apps + Leaks in the last 24 hours + Leaks in the last 30 days + Leaks in the last 12 months + Tap for more info + Blocked leaks + Allowed leaks + %d detected trackers + %d allowed + + Apps + Trackers + Trackers Activity Summary + Apps with trackers + + %s trackers detected + detected in %s apps HH:mm EEE d MMMM @@ -140,33 +134,30 @@ MMM - %s tracking summary - Total - Detected trackers - Blocked - Trackers - Blocked leaks - %s allowed leaks - Manage tracker - Toggle on trackers control - Toggle off the trackers you want to allow: - No trackers were detected yet. If new trackers are detected they will be updated here. - No trackers were detected yet. All future trackers will be blocked. - No trackers were detected yet. Some trackers were unblocked previously. - Enable Quick Privacy to be able to activate/deactivate trackers. - App not installed. - Changes will take effect when tracker blocker is on. - Reset trackers + %s tracking summary + Total + Detected trackers + Blocked + Trackers + Blocked leaks + %s allowed leaks + Toggle on trackers control + Toggle off the trackers you want to allow: + No trackers were detected yet. If new trackers are detected they will be updated here. + No trackers were detected yet. All future trackers will be blocked. + No trackers were detected yet. Some trackers were unblocked previously. + Changes will take effect when tracker blocker is on. + Reset trackers - %s tracking summary - Detected in - Different applications - Blocked leaks - %s allowed leaks - Manage tracker - Block this tracker across all apps - Toggle off the apps for which you want to allow this tracker: + %s tracking summary + Detected in + Different applications + Blocked leaks + %s allowed leaks + Manage tracker + Block this tracker across all apps + Toggle off the apps for which you want to allow this tracker: Note: @@ -189,11 +180,11 @@ @string/app_name - @string/dashboard_number_period - @string/dashboard_data_blocked_trackers_primary - @string/dashboard_data_blocked_trackers_secondary - @string/dashboard_data_apps_primary - @string/dashboard_data_apps_secondary + @string/dashboard_number_period + @string/dashboard_data_blocked_trackers_primary + @string/dashboard_data_blocked_trackers_secondary + @string/dashboard_data_apps_primary + @string/dashboard_data_apps_secondary Block app trackers Fake geolocation -- GitLab From 716ca77cd73955cad5d3f26864dc397a1f58f407 Mon Sep 17 00:00:00 2001 From: Guillaume Jacquart Date: Wed, 27 Dec 2023 12:03:58 +0100 Subject: [PATCH 3/4] Chore: cleanup unused code. --- .../e/advancedprivacy/common/Factory.kt | 23 ------- .../domain/entities/AppWithCounts.kt | 61 ------------------- .../domain/entities/QuickPrivacyState.kt | 26 -------- .../usecases/GetQuickPrivacyStateUseCase.kt | 28 +-------- .../usecases/TrackersStatisticsUseCase.kt | 15 ++--- .../InternetPrivacyFragment.kt | 1 - .../internetprivacy}/ToggleAppsAdapter.kt | 2 +- .../e/advancedprivacy/trackers/KoinModule.kt | 3 - .../trackers/data/StatsDatabase.kt | 24 -------- .../domain/usecases/StatisticsUseCase.kt | 34 ----------- 10 files changed, 7 insertions(+), 210 deletions(-) delete mode 100644 app/src/main/java/foundation/e/advancedprivacy/common/Factory.kt delete mode 100644 app/src/main/java/foundation/e/advancedprivacy/domain/entities/AppWithCounts.kt delete mode 100644 app/src/main/java/foundation/e/advancedprivacy/domain/entities/QuickPrivacyState.kt rename app/src/main/java/foundation/e/advancedprivacy/{common => features/internetprivacy}/ToggleAppsAdapter.kt (97%) delete mode 100644 trackers/src/main/java/foundation/e/advancedprivacy/trackers/domain/usecases/StatisticsUseCase.kt diff --git a/app/src/main/java/foundation/e/advancedprivacy/common/Factory.kt b/app/src/main/java/foundation/e/advancedprivacy/common/Factory.kt deleted file mode 100644 index 3af0b371..00000000 --- a/app/src/main/java/foundation/e/advancedprivacy/common/Factory.kt +++ /dev/null @@ -1,23 +0,0 @@ -/* - * Copyright (C) 2021 E FOUNDATION - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -package foundation.e.advancedprivacy.common - -// Definition of a Factory interface with a function to create objects of a type -interface Factory { - fun create(): T -} diff --git a/app/src/main/java/foundation/e/advancedprivacy/domain/entities/AppWithCounts.kt b/app/src/main/java/foundation/e/advancedprivacy/domain/entities/AppWithCounts.kt deleted file mode 100644 index 244b1337..00000000 --- a/app/src/main/java/foundation/e/advancedprivacy/domain/entities/AppWithCounts.kt +++ /dev/null @@ -1,61 +0,0 @@ -/* - * Copyright (C) 2023 MURENA SAS - * Copyright (C) 2022 E FOUNDATION - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -package foundation.e.advancedprivacy.domain.entities - -import android.graphics.drawable.Drawable - -data class AppWithCounts( - val appDesc: ApplicationDescription, - val packageName: String, - val uid: Int, - var label: CharSequence?, - var icon: Drawable?, - val isWhitelisted: Boolean = false, - val trackersCount: Int = 0, - val whiteListedTrackersCount: Int = 0, - val blockedLeaks: Int = 0, - val leaks: Int = 0 -) { - constructor( - app: ApplicationDescription, - isWhitelisted: Boolean, - trackersCount: Int, - whiteListedTrackersCount: Int, - blockedLeaks: Int, - leaks: Int - ) : - this( - appDesc = app, - packageName = app.packageName, - uid = app.uid, - label = app.label, - icon = app.icon, - isWhitelisted = isWhitelisted, - trackersCount = trackersCount, - whiteListedTrackersCount = whiteListedTrackersCount, - blockedLeaks = blockedLeaks, - leaks = leaks - ) - - val blockedTrackersCount get() = if (isWhitelisted) { - 0 - } else { - Math.max(trackersCount - whiteListedTrackersCount, 0) - } -} diff --git a/app/src/main/java/foundation/e/advancedprivacy/domain/entities/QuickPrivacyState.kt b/app/src/main/java/foundation/e/advancedprivacy/domain/entities/QuickPrivacyState.kt deleted file mode 100644 index 247e8349..00000000 --- a/app/src/main/java/foundation/e/advancedprivacy/domain/entities/QuickPrivacyState.kt +++ /dev/null @@ -1,26 +0,0 @@ -/* - * Copyright (C) 2022 E FOUNDATION - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -package foundation.e.advancedprivacy.domain.entities - -enum class QuickPrivacyState { - DISABLED, - ENABLED, - FULL_ENABLED; - - fun isEnabled(): Boolean = this != DISABLED -} diff --git a/app/src/main/java/foundation/e/advancedprivacy/domain/usecases/GetQuickPrivacyStateUseCase.kt b/app/src/main/java/foundation/e/advancedprivacy/domain/usecases/GetQuickPrivacyStateUseCase.kt index 962a87ad..26b4fb33 100644 --- a/app/src/main/java/foundation/e/advancedprivacy/domain/usecases/GetQuickPrivacyStateUseCase.kt +++ b/app/src/main/java/foundation/e/advancedprivacy/domain/usecases/GetQuickPrivacyStateUseCase.kt @@ -21,40 +21,16 @@ package foundation.e.advancedprivacy.domain.usecases import foundation.e.advancedprivacy.domain.entities.ApplicationDescription import foundation.e.advancedprivacy.domain.entities.FeatureState import foundation.e.advancedprivacy.domain.entities.LocationMode -import foundation.e.advancedprivacy.domain.entities.QuickPrivacyState import foundation.e.advancedprivacy.domain.entities.TrackerMode import foundation.e.advancedprivacy.domain.repositories.LocalStateRepository import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.SharedFlow -import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.flow.combine import kotlinx.coroutines.flow.map class GetQuickPrivacyStateUseCase( - private val localStateRepository: LocalStateRepository + private val localStateRepository: LocalStateRepository, ) { - val quickPrivacyState: Flow = combine( - localStateRepository.blockTrackers, - localStateRepository.areAllTrackersBlocked, - localStateRepository.locationMode, - localStateRepository.internetPrivacyMode - ) { isBlockTrackers, isAllTrackersBlocked, locationMode, internetPrivacyMode -> - when { - !isBlockTrackers && - locationMode == LocationMode.REAL_LOCATION && - internetPrivacyMode == FeatureState.OFF -> QuickPrivacyState.DISABLED - - isAllTrackersBlocked && - locationMode != LocationMode.REAL_LOCATION && - internetPrivacyMode in listOf( - FeatureState.ON, - FeatureState.STARTING - ) -> QuickPrivacyState.FULL_ENABLED - - else -> QuickPrivacyState.ENABLED - } - } - val trackerMode: Flow = combine( localStateRepository.blockTrackers, localStateRepository.areAllTrackersBlocked @@ -70,8 +46,6 @@ class GetQuickPrivacyStateUseCase( locationMode != LocationMode.REAL_LOCATION } - val locationMode: StateFlow = localStateRepository.locationMode - val ipScramblingMode: Flow = localStateRepository.internetPrivacyMode diff --git a/app/src/main/java/foundation/e/advancedprivacy/domain/usecases/TrackersStatisticsUseCase.kt b/app/src/main/java/foundation/e/advancedprivacy/domain/usecases/TrackersStatisticsUseCase.kt index 374afe66..6af7a6b1 100644 --- a/app/src/main/java/foundation/e/advancedprivacy/domain/usecases/TrackersStatisticsUseCase.kt +++ b/app/src/main/java/foundation/e/advancedprivacy/domain/usecases/TrackersStatisticsUseCase.kt @@ -29,17 +29,14 @@ import foundation.e.advancedprivacy.trackers.data.StatsDatabase import foundation.e.advancedprivacy.trackers.data.TrackersRepository import foundation.e.advancedprivacy.trackers.data.WhitelistRepository import foundation.e.advancedprivacy.trackers.domain.entities.Tracker -import foundation.e.advancedprivacy.trackers.domain.usecases.StatisticsUseCase +import kotlinx.coroutines.FlowPreview +import kotlinx.coroutines.flow.onStart import java.time.ZonedDateTime import java.time.temporal.ChronoUnit import kotlin.time.Duration import kotlin.time.Duration.Companion.seconds -import kotlinx.coroutines.FlowPreview -import kotlinx.coroutines.flow.map -import kotlinx.coroutines.flow.onStart class TrackersStatisticsUseCase( - private val statisticsUseCase: StatisticsUseCase, private val whitelistRepository: WhitelistRepository, private val trackersRepository: TrackersRepository, private val appListsRepository: AppListsRepository, @@ -55,10 +52,6 @@ class TrackersStatisticsUseCase( .throttleFirst(windowDuration = debounce) .onStart { emit(Unit) } - fun getDayTrackersCalls() = statisticsUseCase.getTrackersCallsOnPeriod(24, ChronoUnit.HOURS) - - fun getDayTrackersCount() = statisticsUseCase.getActiveTrackersByPeriod(24, ChronoUnit.HOURS) - private fun buildGraduations(period: Period): List { return when (period) { Period.DAY -> buildDayGraduations() @@ -159,7 +152,9 @@ class TrackersStatisticsUseCase( suspend fun getGraphData(period: Period): TrackersPeriodicStatistics { return TrackersPeriodicStatistics( - callsBlockedNLeaked = statisticsUseCase.getTrackersCallsOnPeriod(period.periodsCount, period.periodUnit), + callsBlockedNLeaked = statsDatabase.getTrackersCallsOnPeriod( + period.periodsCount, period.periodUnit + ), periods = buildLabels(period), trackersCount = statsDatabase.getTrackersCount(period.periodsCount, period.periodUnit), trackersAllowedCount = statsDatabase.getLeakedTrackersCount(period.periodsCount, period.periodUnit), diff --git a/app/src/main/java/foundation/e/advancedprivacy/features/internetprivacy/InternetPrivacyFragment.kt b/app/src/main/java/foundation/e/advancedprivacy/features/internetprivacy/InternetPrivacyFragment.kt index fb01c437..9fec91e5 100644 --- a/app/src/main/java/foundation/e/advancedprivacy/features/internetprivacy/InternetPrivacyFragment.kt +++ b/app/src/main/java/foundation/e/advancedprivacy/features/internetprivacy/InternetPrivacyFragment.kt @@ -29,7 +29,6 @@ import androidx.lifecycle.repeatOnLifecycle import androidx.recyclerview.widget.LinearLayoutManager import foundation.e.advancedprivacy.R import foundation.e.advancedprivacy.common.NavToolbarFragment -import foundation.e.advancedprivacy.common.ToggleAppsAdapter import foundation.e.advancedprivacy.common.setToolTipForAsterisk import foundation.e.advancedprivacy.databinding.FragmentInternetActivityPolicyBinding import foundation.e.advancedprivacy.domain.entities.FeatureState diff --git a/app/src/main/java/foundation/e/advancedprivacy/common/ToggleAppsAdapter.kt b/app/src/main/java/foundation/e/advancedprivacy/features/internetprivacy/ToggleAppsAdapter.kt similarity index 97% rename from app/src/main/java/foundation/e/advancedprivacy/common/ToggleAppsAdapter.kt rename to app/src/main/java/foundation/e/advancedprivacy/features/internetprivacy/ToggleAppsAdapter.kt index 8a0cc83d..205abce4 100644 --- a/app/src/main/java/foundation/e/advancedprivacy/common/ToggleAppsAdapter.kt +++ b/app/src/main/java/foundation/e/advancedprivacy/features/internetprivacy/ToggleAppsAdapter.kt @@ -15,7 +15,7 @@ * along with this program. If not, see . */ -package foundation.e.advancedprivacy.common +package foundation.e.advancedprivacy.features.internetprivacy import android.view.LayoutInflater import android.view.View diff --git a/trackers/src/main/java/foundation/e/advancedprivacy/trackers/KoinModule.kt b/trackers/src/main/java/foundation/e/advancedprivacy/trackers/KoinModule.kt index 6a5bcef6..e8a4da0b 100644 --- a/trackers/src/main/java/foundation/e/advancedprivacy/trackers/KoinModule.kt +++ b/trackers/src/main/java/foundation/e/advancedprivacy/trackers/KoinModule.kt @@ -22,7 +22,6 @@ import foundation.e.advancedprivacy.trackers.data.StatsDatabase import foundation.e.advancedprivacy.trackers.data.TrackersRepository import foundation.e.advancedprivacy.trackers.data.WhitelistRepository import foundation.e.advancedprivacy.trackers.domain.usecases.FilterHostnameUseCase -import foundation.e.advancedprivacy.trackers.domain.usecases.StatisticsUseCase import foundation.e.advancedprivacy.trackers.domain.usecases.UpdateTrackerListUseCase import org.koin.android.ext.koin.androidContext import org.koin.core.module.dsl.factoryOf @@ -40,8 +39,6 @@ val trackersModule = module { StatsDatabase(context = androidContext()) } - singleOf(::StatisticsUseCase) - single { WhitelistRepository( context = androidContext(), diff --git a/trackers/src/main/java/foundation/e/advancedprivacy/trackers/data/StatsDatabase.kt b/trackers/src/main/java/foundation/e/advancedprivacy/trackers/data/StatsDatabase.kt index da6ee868..beaf109b 100644 --- a/trackers/src/main/java/foundation/e/advancedprivacy/trackers/data/StatsDatabase.kt +++ b/trackers/src/main/java/foundation/e/advancedprivacy/trackers/data/StatsDatabase.kt @@ -174,30 +174,6 @@ class StatsDatabase( return callsByPeriodToPeriodsList(callsByPeriod, periodsCount, periodUnit, javaPeriodFormat) } - fun getActiveTrackersByPeriod(periodsCount: Int, periodUnit: TemporalUnit): Int { - synchronized(lock) { - val minTimestamp = getPeriodStartTs(periodsCount, periodUnit) - val db = writableDatabase - val selection = "$COLUMN_NAME_TIMESTAMP >= ? AND " + - "$COLUMN_NAME_NUMBER_CONTACTED > $COLUMN_NAME_NUMBER_BLOCKED" - val selectionArg = arrayOf("" + minTimestamp) - val projection = - "COUNT(DISTINCT $COLUMN_NAME_TRACKER) $PROJECTION_NAME_TRACKERS_COUNT" - - val cursor = db.rawQuery( - "SELECT $projection FROM $TABLE_NAME WHERE $selection", - selectionArg - ) - var count = 0 - if (cursor.moveToNext()) { - count = cursor.getInt(0) - } - cursor.close() - db.close() - return count - } - } - suspend fun getTrackersCount(periodsCount: Int, periodUnit: TemporalUnit): Int = withContext(Dispatchers.IO) { synchronized(lock) { val minTimestamp = getPeriodStartTs(periodsCount, periodUnit) diff --git a/trackers/src/main/java/foundation/e/advancedprivacy/trackers/domain/usecases/StatisticsUseCase.kt b/trackers/src/main/java/foundation/e/advancedprivacy/trackers/domain/usecases/StatisticsUseCase.kt deleted file mode 100644 index a36a6bf1..00000000 --- a/trackers/src/main/java/foundation/e/advancedprivacy/trackers/domain/usecases/StatisticsUseCase.kt +++ /dev/null @@ -1,34 +0,0 @@ -/* - * Copyright (C) 2023 MURENA SAS - * Copyright (C) 2022 E FOUNDATION - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -package foundation.e.advancedprivacy.trackers.domain.usecases - -import foundation.e.advancedprivacy.trackers.data.StatsDatabase -import java.time.temporal.TemporalUnit - -class StatisticsUseCase( - private val database: StatsDatabase -) { - fun getTrackersCallsOnPeriod(periodsCount: Int, periodUnit: TemporalUnit): List> { - return database.getTrackersCallsOnPeriod(periodsCount, periodUnit) - } - - fun getActiveTrackersByPeriod(periodsCount: Int, periodUnit: TemporalUnit): Int { - return database.getActiveTrackersByPeriod(periodsCount, periodUnit) - } -} -- GitLab From 4b750381f0dea19b1341dabbb74ed147823a5394 Mon Sep 17 00:00:00 2001 From: Guillaume Jacquart Date: Wed, 27 Dec 2023 15:54:40 +0100 Subject: [PATCH 4/4] 1736: improve resize widget behavior. --- .../usecases/GetQuickPrivacyStateUseCase.kt | 2 +- .../usecases/TrackersStatisticsUseCase.kt | 7 +- .../e/advancedprivacy/widget/Widget.kt | 30 +-- .../e/advancedprivacy/widget/WidgetUI.kt | 69 +++-- .../layout/{widget.xml => widget_large.xml} | 4 +- app/src/main/res/layout/widget_narrow.xml | 254 ++++++++++++++++++ app/src/main/res/xml/widget_info.xml | 6 +- 7 files changed, 320 insertions(+), 52 deletions(-) rename app/src/main/res/layout/{widget.xml => widget_large.xml} (99%) create mode 100644 app/src/main/res/layout/widget_narrow.xml diff --git a/app/src/main/java/foundation/e/advancedprivacy/domain/usecases/GetQuickPrivacyStateUseCase.kt b/app/src/main/java/foundation/e/advancedprivacy/domain/usecases/GetQuickPrivacyStateUseCase.kt index 26b4fb33..4f8afb02 100644 --- a/app/src/main/java/foundation/e/advancedprivacy/domain/usecases/GetQuickPrivacyStateUseCase.kt +++ b/app/src/main/java/foundation/e/advancedprivacy/domain/usecases/GetQuickPrivacyStateUseCase.kt @@ -29,7 +29,7 @@ import kotlinx.coroutines.flow.combine import kotlinx.coroutines.flow.map class GetQuickPrivacyStateUseCase( - private val localStateRepository: LocalStateRepository, + private val localStateRepository: LocalStateRepository ) { val trackerMode: Flow = combine( localStateRepository.blockTrackers, diff --git a/app/src/main/java/foundation/e/advancedprivacy/domain/usecases/TrackersStatisticsUseCase.kt b/app/src/main/java/foundation/e/advancedprivacy/domain/usecases/TrackersStatisticsUseCase.kt index 6af7a6b1..765255fc 100644 --- a/app/src/main/java/foundation/e/advancedprivacy/domain/usecases/TrackersStatisticsUseCase.kt +++ b/app/src/main/java/foundation/e/advancedprivacy/domain/usecases/TrackersStatisticsUseCase.kt @@ -29,12 +29,12 @@ import foundation.e.advancedprivacy.trackers.data.StatsDatabase import foundation.e.advancedprivacy.trackers.data.TrackersRepository import foundation.e.advancedprivacy.trackers.data.WhitelistRepository import foundation.e.advancedprivacy.trackers.domain.entities.Tracker -import kotlinx.coroutines.FlowPreview -import kotlinx.coroutines.flow.onStart import java.time.ZonedDateTime import java.time.temporal.ChronoUnit import kotlin.time.Duration import kotlin.time.Duration.Companion.seconds +import kotlinx.coroutines.FlowPreview +import kotlinx.coroutines.flow.onStart class TrackersStatisticsUseCase( private val whitelistRepository: WhitelistRepository, @@ -153,7 +153,8 @@ class TrackersStatisticsUseCase( suspend fun getGraphData(period: Period): TrackersPeriodicStatistics { return TrackersPeriodicStatistics( callsBlockedNLeaked = statsDatabase.getTrackersCallsOnPeriod( - period.periodsCount, period.periodUnit + period.periodsCount, + period.periodUnit ), periods = buildLabels(period), trackersCount = statsDatabase.getTrackersCount(period.periodsCount, period.periodUnit), diff --git a/app/src/main/java/foundation/e/advancedprivacy/widget/Widget.kt b/app/src/main/java/foundation/e/advancedprivacy/widget/Widget.kt index d2c51659..a7cec14a 100644 --- a/app/src/main/java/foundation/e/advancedprivacy/widget/Widget.kt +++ b/app/src/main/java/foundation/e/advancedprivacy/widget/Widget.kt @@ -25,6 +25,8 @@ import foundation.e.advancedprivacy.domain.usecases.GetQuickPrivacyStateUseCase import foundation.e.advancedprivacy.domain.usecases.TrackersStatisticsUseCase import foundation.e.advancedprivacy.widget.State import foundation.e.advancedprivacy.widget.render +import foundation.e.advancedprivacy.widget.renderAll +import java.time.temporal.ChronoUnit import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.DelicateCoroutinesApi import kotlinx.coroutines.Dispatchers @@ -43,19 +45,16 @@ import kotlinx.coroutines.flow.onStart import kotlinx.coroutines.flow.sample import kotlinx.coroutines.flow.stateIn import kotlinx.coroutines.launch -import java.time.temporal.ChronoUnit /** * Implementation of App Widget functionality. */ class Widget : AppWidgetProvider() { - override fun onUpdate( - context: Context, - appWidgetManager: AppWidgetManager, - appWidgetIds: IntArray - ) { - render(context, state.value, appWidgetManager) + override fun onUpdate(context: Context, appWidgetManager: AppWidgetManager, appWidgetIds: IntArray) { + appWidgetIds.forEach { id -> + render(context, state.value, appWidgetManager, id) + } } override fun onEnabled(context: Context) { @@ -80,11 +79,10 @@ class Widget : AppWidgetProvider() { trackersStatisticsUseCase: TrackersStatisticsUseCase, coroutineScope: CoroutineScope ): StateFlow { - return combine( getPrivacyStateUseCase.trackerMode, getPrivacyStateUseCase.isLocationHidden, - getPrivacyStateUseCase.ipScramblingMode, + getPrivacyStateUseCase.ipScramblingMode ) { trackerMode, isLocationHidden, ipScramblingMode -> State( trackerMode = trackerMode, @@ -121,7 +119,7 @@ class Widget : AppWidgetProvider() { fun startListening( appContext: Context, getPrivacyStateUseCase: GetQuickPrivacyStateUseCase, - trackersStatisticsUseCase: TrackersStatisticsUseCase, + trackersStatisticsUseCase: TrackersStatisticsUseCase ) { state = initState( getPrivacyStateUseCase, @@ -132,22 +130,18 @@ class Widget : AppWidgetProvider() { updateWidgetJob?.cancel() updateWidgetJob = GlobalScope.launch(Dispatchers.Main) { state.collect { - render(appContext, it, AppWidgetManager.getInstance(appContext)) + renderAll(appContext, it) } } } } - override fun onAppWidgetOptionsChanged( - context: Context, - appWidgetManager: AppWidgetManager, - appWidgetId: Int, - newOptions: Bundle? - ) { + override fun onAppWidgetOptionsChanged(context: Context, appWidgetManager: AppWidgetManager, appWidgetId: Int, newOptions: Bundle?) { super.onAppWidgetOptionsChanged(context, appWidgetManager, appWidgetId, newOptions) if (newOptions != null) { isDarkText = newOptions.getBoolean(DARK_TEXT_KEY) } - render(context, state.value, appWidgetManager) + + render(context, state.value, appWidgetManager, appWidgetId) } } diff --git a/app/src/main/java/foundation/e/advancedprivacy/widget/WidgetUI.kt b/app/src/main/java/foundation/e/advancedprivacy/widget/WidgetUI.kt index e3cfc515..f5ae2c7f 100644 --- a/app/src/main/java/foundation/e/advancedprivacy/widget/WidgetUI.kt +++ b/app/src/main/java/foundation/e/advancedprivacy/widget/WidgetUI.kt @@ -47,15 +47,20 @@ data class State( val isLocationHidden: Boolean = false, val ipScramblingMode: FeatureState = FeatureState.STOPPING, val blockedCallsCount: Int = 0, - val appsWithCallsCount: Int = 0, + val appsWithCallsCount: Int = 0 ) -fun render( - context: Context, - state: State, - appWidgetManager: AppWidgetManager, -) { - val views = RemoteViews(context.packageName, R.layout.widget) +fun renderAll(context: Context, state: State) { + val appWidgetManager = AppWidgetManager.getInstance(context) + appWidgetManager.getAppWidgetIds( + ComponentName(context, Widget::class.java) + ).forEach { id -> + render(context, state, appWidgetManager, id) + } +} + +fun render(context: Context, state: State, appWidgetManager: AppWidgetManager, widgetId: Int) { + val views = buildLayout(context, appWidgetManager, widgetId) applyDarkText(context, isDarkText, views) @@ -127,7 +132,7 @@ fun render( ) } - appWidgetManager.updateAppWidget(ComponentName(context, Widget::class.java), views) + appWidgetManager.updateAppWidget(widgetId, views) } private const val REQUEST_CODE_DASHBOARD = 1 @@ -135,12 +140,30 @@ private const val REQUEST_CODE_TOGGLE_TRACKERS = 4 private const val REQUEST_CODE_TOGGLE_LOCATION = 5 private const val REQUEST_CODE_TOGGLE_IPSCRAMBLING = 6 +private const val NARROW_MAXWIDTH_DP_BREAKPOINT = 240 +private fun buildLayout(context: Context, appWidgetManager: AppWidgetManager, widgetId: Int): RemoteViews { + val width = appWidgetManager.getAppWidgetOptions(widgetId) + .getInt(AppWidgetManager.OPTION_APPWIDGET_MIN_WIDTH) + + return RemoteViews( + context.packageName, + when (width) { + in 0..NARROW_MAXWIDTH_DP_BREAKPOINT -> + R.layout.widget_narrow + else -> R.layout.widget_large + } + ) +} + private fun applyDarkText(context: Context, isDarkText: Boolean, views: RemoteViews) { views.apply { // FFFFFF %87 val primaryColor = context.getColor( - if (isDarkText) R.color.on_surface_medium_emphasis_light - else R.color.on_surface_high_emphasis + if (isDarkText) { + R.color.on_surface_medium_emphasis_light + } else { + R.color.on_surface_high_emphasis + } ) listOf( @@ -160,7 +183,7 @@ private fun applyDarkText(context: Context, isDarkText: Boolean, views: RemoteVi listOf( R.id.settings_btn to R.drawable.ic_settings, R.id.data_blocked_trackers_icon to R.drawable.ic_block_24, - R.id.data_apps_icon to R.drawable.ic_apps_24, + R.id.data_apps_icon to R.drawable.ic_apps_24 ).forEach { (viewId, drawableId) -> setImageViewIcon( viewId, @@ -172,23 +195,16 @@ private fun applyDarkText(context: Context, isDarkText: Boolean, views: RemoteVi val secondaryColor = context.getColor(if (isDarkText) R.color.on_surface_disabled_light else R.color.on_primary_medium_emphasis) setTextColor(R.id.period_label, secondaryColor) - -// // FFFFFF %38 -// val disabledColor = context.getColor(if (isDarkText) R.color.on_surface_disabled_light else R.color.on_primary_disabled) -// -// listOf( -// R.id.data_blocked_trackers, -// R.id.data_apps -// ).forEach { -// // No control on background tint, should use ImageView With FrameLayout ? -// } } } private fun buildDataSecondarySpan(context: Context, isDarkText: Boolean, count: Int, @StringRes secondaryRes: Int): CharSequence { val primaryColor = context.getColor( - if (isDarkText) R.color.on_surface_medium_emphasis_light - else R.color.on_surface_high_emphasis + if (isDarkText) { + R.color.on_surface_medium_emphasis_light + } else { + R.color.on_surface_high_emphasis + } ) val secondaryColor = context.getColor(if (isDarkText) R.color.on_surface_disabled_light else R.color.on_primary_medium_emphasis) @@ -217,7 +233,10 @@ private fun buildDataSecondarySpan(context: Context, isDarkText: Boolean, count: private fun setSwitchState(views: RemoteViews, switchId: Int, checked: Boolean) { views.setImageViewResource( switchId, - if (checked) R.drawable.ic_switch_enabled_raster - else R.drawable.ic_switch_disabled_raster + if (checked) { + R.drawable.ic_switch_enabled_raster + } else { + R.drawable.ic_switch_disabled_raster + } ) } diff --git a/app/src/main/res/layout/widget.xml b/app/src/main/res/layout/widget_large.xml similarity index 99% rename from app/src/main/res/layout/widget.xml rename to app/src/main/res/layout/widget_large.xml index 02ad816a..1f1015e7 100644 --- a/app/src/main/res/layout/widget.xml +++ b/app/src/main/res/layout/widget_large.xml @@ -103,7 +103,7 @@ android:textColor="@color/on_primary_high_emphasis" android:textAllCaps="true" android:text="@string/widget_data_blocked_trackers_primary" - /> + /> + /> . + --> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/xml/widget_info.xml b/app/src/main/res/xml/widget_info.xml index ade68495..388252f3 100644 --- a/app/src/main/res/xml/widget_info.xml +++ b/app/src/main/res/xml/widget_info.xml @@ -18,14 +18,14 @@ -->