Loading app/src/main/java/foundation/e/privacycentralapp/common/GraphHolder.kt +17 −10 Original line number Diff line number Diff line Loading @@ -31,6 +31,7 @@ import androidx.core.view.isVisible import com.github.mikephil.charting.charts.BarChart import com.github.mikephil.charting.components.MarkerView import com.github.mikephil.charting.components.XAxis import com.github.mikephil.charting.components.YAxis import com.github.mikephil.charting.data.BarData import com.github.mikephil.charting.data.BarDataSet import com.github.mikephil.charting.data.BarEntry Loading Loading @@ -87,7 +88,7 @@ class GraphHolder(val barChart: BarChart, val context: Context, val isMarkerAbov override fun onValueSelected(e: Entry?, h: Highlight?) { h?.let { val index = it.x.toInt() if (index > 0 && if (index >= 0 && index < labels.size && index < this@GraphHolder.data.size ) { Loading @@ -97,17 +98,30 @@ class GraphHolder(val barChart: BarChart, val context: Context, val isMarkerAbov } } isHighlighted = true refreshDataSet() } override fun onNothingSelected() { isHighlighted = false refreshDataSet() } }) } } fun highlightIndex(index: Int) { if (index >= 0 && index < data.size) { val xPx = barChart.getTransformer(YAxis.AxisDependency.LEFT) .getPixelForValues(index.toFloat(), 0f) .x val highlight = Highlight( index.toFloat(), 0f, xPx.toFloat(), 0f, 0, YAxis.AxisDependency.LEFT ) barChart.highlightValue(highlight, true) } } private fun refreshDataSet() { val trackersDataSet = BarDataSet( data.mapIndexed { index, value -> Loading @@ -122,19 +136,12 @@ class GraphHolder(val barChart: BarChart, val context: Context, val isMarkerAbov val blockedColor = ContextCompat.getColor(context, R.color.accent) val leakedColor = ContextCompat.getColor(context, R.color.red_off) // ColorUtils.setAlphaComponent() colors = listOf( blockedColor, // if (isHighlighted) R.color.blue_unselected else R.color.accent leakedColor ) setDrawValues(false) // highLightColor = ContextCompat.getColor( // context, R.color.accent // ) // highLightAlpha = 255 } barChart.data = BarData(trackersDataSet) Loading app/src/main/java/foundation/e/privacycentralapp/features/dashboard/DashboardFragment.kt +19 −0 Original line number Diff line number Diff line Loading @@ -24,6 +24,7 @@ import android.text.Html.FROM_HTML_MODE_LEGACY import android.view.View import android.widget.Toast import androidx.core.content.ContextCompat.getColor import androidx.core.os.bundleOf import androidx.core.view.isVisible import androidx.fragment.app.activityViewModels import androidx.fragment.app.commit Loading Loading @@ -56,6 +57,13 @@ class DashboardFragment : NavToolbarFragment(R.layout.fragment_dashboard), MVIView<DashboardFeature.State, DashboardFeature.Action> { companion object { private const val PARAM_HIGHLIGHT_INDEX = "PARAM_HIGHLIGHT_INDEX" fun buildArgs(highlightIndex: Int): Bundle = bundleOf( PARAM_HIGHLIGHT_INDEX to highlightIndex ) } private val dependencyContainer: DependencyContainer by lazy { (this.requireActivity().application as PrivacyCentralApplication).dependencyContainer } Loading @@ -69,11 +77,15 @@ class DashboardFragment : private var qpDisabledSnackbar: Snackbar? = null private var highlightIndexOnStart: Int? = null private var updateUIJob: Job? = null override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) highlightIndexOnStart = arguments?.getInt(PARAM_HIGHLIGHT_INDEX, -1) updateUIJob = lifecycleScope.launchWhenStarted { viewModel.dashboardFeature.takeView(this, this@DashboardFragment) } Loading Loading @@ -250,6 +262,13 @@ class DashboardFragment : ), FROM_HTML_MODE_LEGACY ) highlightIndexOnStart?.let { binding.graph.post { graphHolder.highlightIndex(it) } highlightIndexOnStart = null } } if (state.allowedTrackersCount != null && state.trackersCount != null) { Loading app/src/main/java/foundation/e/privacycentralapp/main/MainActivity.kt +23 −1 Original line number Diff line number Diff line Loading @@ -18,6 +18,7 @@ package foundation.e.privacycentralapp.main import android.app.Activity import android.content.Context import android.content.Intent import android.os.Bundle import androidx.fragment.app.FragmentActivity Loading Loading @@ -56,7 +57,18 @@ open class MainActivity : FragmentActivity(R.layout.activity_main) { handleIntent(intent) } open fun handleIntent(intent: Intent) {} open fun handleIntent(intent: Intent) { supportFragmentManager.commit { setReorderingAllowed(true) when (intent.action) { ACTION_HIGHLIGHT_LEAKS -> add<DashboardFragment>( containerViewId = R.id.container, args = intent.extras ) else -> add<DashboardFragment>(R.id.container) } } } override fun finishAfterTransition() { val resultData = Intent() Loading @@ -67,4 +79,14 @@ open class MainActivity : FragmentActivity(R.layout.activity_main) { } open fun onPopulateResultIntent(intent: Intent): Int = Activity.RESULT_OK companion object { private const val ACTION_HIGHLIGHT_LEAKS = "ACTION_HIGHLIGHT_LEAKS" fun createHighlightLeaksIntent(context: Context, highlightIndex: Int) = Intent(context, MainActivity::class.java).apply { action = ACTION_HIGHLIGHT_LEAKS putExtras(DashboardFragment.buildArgs(highlightIndex)) } } } app/src/main/java/foundation/e/privacycentralapp/widget/WidgetUI.kt +43 −2 Original line number Diff line number Diff line Loading @@ -51,7 +51,10 @@ fun render( val views = RemoteViews(context.packageName, R.layout.widget) views.apply { val openPIntent = PendingIntent.getActivity( context, 0, Intent(context, MainActivity::class.java), FLAG_UPDATE_CURRENT context, REQUEST_CODE_DASHBOARD, Intent(context, MainActivity::class.java), FLAG_UPDATE_CURRENT ) setOnClickPendingIntent(R.id.settings_btn, openPIntent) setOnClickPendingIntent(R.id.widget_container, openPIntent) Loading Loading @@ -81,7 +84,7 @@ fun render( R.id.toggle_privacy_central, PendingIntent.getBroadcast( context, 0, REQUEST_CODE_TOGGLE, Intent(context, WidgetCommandReceiver::class.java).apply { action = ACTION_TOGGLE_PRIVACY }, Loading Loading @@ -146,6 +149,13 @@ fun render( // leacked (the bar above) val topPadding = graphHeightPx - (blocked + leaked) * ratio setViewPadding(leakedBarIds[index], 0, topPadding.toInt(), 0, 0) val highlightPIntent = PendingIntent.getActivity( context, REQUEST_CODE_HIGHLIGHT + index, MainActivity.createHighlightLeaksIntent(context, index), FLAG_UPDATE_CURRENT ) setOnClickPendingIntent(containerBarIds[index], highlightPIntent) } setTextViewText( Loading @@ -161,6 +171,33 @@ fun render( 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, Loading Loading @@ -214,3 +251,7 @@ private val leakedBarIds = listOf( 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_TOGGLE = 2 private const val REQUEST_CODE_HIGHLIGHT = 100 app/src/main/res/layout/apptrackers_item_tracker_toggle.xml +0 −1 Original line number Diff line number Diff line Loading @@ -20,7 +20,6 @@ android:textSize="14sp" tools:text="Body sensor" /> <Switch android:id="@+id/toggle" android:layout_width="wrap_content" Loading Loading
app/src/main/java/foundation/e/privacycentralapp/common/GraphHolder.kt +17 −10 Original line number Diff line number Diff line Loading @@ -31,6 +31,7 @@ import androidx.core.view.isVisible import com.github.mikephil.charting.charts.BarChart import com.github.mikephil.charting.components.MarkerView import com.github.mikephil.charting.components.XAxis import com.github.mikephil.charting.components.YAxis import com.github.mikephil.charting.data.BarData import com.github.mikephil.charting.data.BarDataSet import com.github.mikephil.charting.data.BarEntry Loading Loading @@ -87,7 +88,7 @@ class GraphHolder(val barChart: BarChart, val context: Context, val isMarkerAbov override fun onValueSelected(e: Entry?, h: Highlight?) { h?.let { val index = it.x.toInt() if (index > 0 && if (index >= 0 && index < labels.size && index < this@GraphHolder.data.size ) { Loading @@ -97,17 +98,30 @@ class GraphHolder(val barChart: BarChart, val context: Context, val isMarkerAbov } } isHighlighted = true refreshDataSet() } override fun onNothingSelected() { isHighlighted = false refreshDataSet() } }) } } fun highlightIndex(index: Int) { if (index >= 0 && index < data.size) { val xPx = barChart.getTransformer(YAxis.AxisDependency.LEFT) .getPixelForValues(index.toFloat(), 0f) .x val highlight = Highlight( index.toFloat(), 0f, xPx.toFloat(), 0f, 0, YAxis.AxisDependency.LEFT ) barChart.highlightValue(highlight, true) } } private fun refreshDataSet() { val trackersDataSet = BarDataSet( data.mapIndexed { index, value -> Loading @@ -122,19 +136,12 @@ class GraphHolder(val barChart: BarChart, val context: Context, val isMarkerAbov val blockedColor = ContextCompat.getColor(context, R.color.accent) val leakedColor = ContextCompat.getColor(context, R.color.red_off) // ColorUtils.setAlphaComponent() colors = listOf( blockedColor, // if (isHighlighted) R.color.blue_unselected else R.color.accent leakedColor ) setDrawValues(false) // highLightColor = ContextCompat.getColor( // context, R.color.accent // ) // highLightAlpha = 255 } barChart.data = BarData(trackersDataSet) Loading
app/src/main/java/foundation/e/privacycentralapp/features/dashboard/DashboardFragment.kt +19 −0 Original line number Diff line number Diff line Loading @@ -24,6 +24,7 @@ import android.text.Html.FROM_HTML_MODE_LEGACY import android.view.View import android.widget.Toast import androidx.core.content.ContextCompat.getColor import androidx.core.os.bundleOf import androidx.core.view.isVisible import androidx.fragment.app.activityViewModels import androidx.fragment.app.commit Loading Loading @@ -56,6 +57,13 @@ class DashboardFragment : NavToolbarFragment(R.layout.fragment_dashboard), MVIView<DashboardFeature.State, DashboardFeature.Action> { companion object { private const val PARAM_HIGHLIGHT_INDEX = "PARAM_HIGHLIGHT_INDEX" fun buildArgs(highlightIndex: Int): Bundle = bundleOf( PARAM_HIGHLIGHT_INDEX to highlightIndex ) } private val dependencyContainer: DependencyContainer by lazy { (this.requireActivity().application as PrivacyCentralApplication).dependencyContainer } Loading @@ -69,11 +77,15 @@ class DashboardFragment : private var qpDisabledSnackbar: Snackbar? = null private var highlightIndexOnStart: Int? = null private var updateUIJob: Job? = null override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) highlightIndexOnStart = arguments?.getInt(PARAM_HIGHLIGHT_INDEX, -1) updateUIJob = lifecycleScope.launchWhenStarted { viewModel.dashboardFeature.takeView(this, this@DashboardFragment) } Loading Loading @@ -250,6 +262,13 @@ class DashboardFragment : ), FROM_HTML_MODE_LEGACY ) highlightIndexOnStart?.let { binding.graph.post { graphHolder.highlightIndex(it) } highlightIndexOnStart = null } } if (state.allowedTrackersCount != null && state.trackersCount != null) { Loading
app/src/main/java/foundation/e/privacycentralapp/main/MainActivity.kt +23 −1 Original line number Diff line number Diff line Loading @@ -18,6 +18,7 @@ package foundation.e.privacycentralapp.main import android.app.Activity import android.content.Context import android.content.Intent import android.os.Bundle import androidx.fragment.app.FragmentActivity Loading Loading @@ -56,7 +57,18 @@ open class MainActivity : FragmentActivity(R.layout.activity_main) { handleIntent(intent) } open fun handleIntent(intent: Intent) {} open fun handleIntent(intent: Intent) { supportFragmentManager.commit { setReorderingAllowed(true) when (intent.action) { ACTION_HIGHLIGHT_LEAKS -> add<DashboardFragment>( containerViewId = R.id.container, args = intent.extras ) else -> add<DashboardFragment>(R.id.container) } } } override fun finishAfterTransition() { val resultData = Intent() Loading @@ -67,4 +79,14 @@ open class MainActivity : FragmentActivity(R.layout.activity_main) { } open fun onPopulateResultIntent(intent: Intent): Int = Activity.RESULT_OK companion object { private const val ACTION_HIGHLIGHT_LEAKS = "ACTION_HIGHLIGHT_LEAKS" fun createHighlightLeaksIntent(context: Context, highlightIndex: Int) = Intent(context, MainActivity::class.java).apply { action = ACTION_HIGHLIGHT_LEAKS putExtras(DashboardFragment.buildArgs(highlightIndex)) } } }
app/src/main/java/foundation/e/privacycentralapp/widget/WidgetUI.kt +43 −2 Original line number Diff line number Diff line Loading @@ -51,7 +51,10 @@ fun render( val views = RemoteViews(context.packageName, R.layout.widget) views.apply { val openPIntent = PendingIntent.getActivity( context, 0, Intent(context, MainActivity::class.java), FLAG_UPDATE_CURRENT context, REQUEST_CODE_DASHBOARD, Intent(context, MainActivity::class.java), FLAG_UPDATE_CURRENT ) setOnClickPendingIntent(R.id.settings_btn, openPIntent) setOnClickPendingIntent(R.id.widget_container, openPIntent) Loading Loading @@ -81,7 +84,7 @@ fun render( R.id.toggle_privacy_central, PendingIntent.getBroadcast( context, 0, REQUEST_CODE_TOGGLE, Intent(context, WidgetCommandReceiver::class.java).apply { action = ACTION_TOGGLE_PRIVACY }, Loading Loading @@ -146,6 +149,13 @@ fun render( // leacked (the bar above) val topPadding = graphHeightPx - (blocked + leaked) * ratio setViewPadding(leakedBarIds[index], 0, topPadding.toInt(), 0, 0) val highlightPIntent = PendingIntent.getActivity( context, REQUEST_CODE_HIGHLIGHT + index, MainActivity.createHighlightLeaksIntent(context, index), FLAG_UPDATE_CURRENT ) setOnClickPendingIntent(containerBarIds[index], highlightPIntent) } setTextViewText( Loading @@ -161,6 +171,33 @@ fun render( 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, Loading Loading @@ -214,3 +251,7 @@ private val leakedBarIds = listOf( 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_TOGGLE = 2 private const val REQUEST_CODE_HIGHLIGHT = 100
app/src/main/res/layout/apptrackers_item_tracker_toggle.xml +0 −1 Original line number Diff line number Diff line Loading @@ -20,7 +20,6 @@ android:textSize="14sp" tools:text="Body sensor" /> <Switch android:id="@+id/toggle" android:layout_width="wrap_content" Loading