Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 74b98607 authored by Guillaume Jacquart's avatar Guillaume Jacquart
Browse files

1227: use navigation graph component, avoid view (fragments) duplications

parent 045261f8
Loading
Loading
Loading
Loading
+2 −2
Original line number Diff line number Diff line
@@ -55,7 +55,7 @@ quality-analysis:
build-debug:
  stage: build
  script:
    - ./gradlew assembleDebug
    - ./gradlew :app:assembleDebug
  rules:
    - if: '$CI_PIPELINE_SOURCE == "schedule"'
      when: never
@@ -91,7 +91,7 @@ test-debug:
build-full:
  stage: build
  script:
    - ./gradlew assembleRelease
    - ./gradlew :app:assembleRelease
  rules:
    - if: '$CI_PIPELINE_SOURCE == "schedule"'
      when: never
+5 −0
Original line number Diff line number Diff line
/*
 * Copyright (C) 2023 MURENA SAS
 * Copyright (C) 2022 E FOUNDATION
 *
 * This program is free software: you can redistribute it and/or modify
@@ -19,6 +20,7 @@ plugins {
    id 'com.android.application'
    id 'kotlin-android'
    id 'kotlin-kapt'
    id 'androidx.navigation.safeargs.kotlin'
}

def getSentryDsn = { ->
@@ -162,6 +164,9 @@ dependencies {
        Libs.AndroidX.work,
        Libs.material,

        Libs.AndroidX.navigation.fragmentKtx,
        Libs.AndroidX.navigation.uiKtx,

        Libs.Retrofit.retrofit,
        Libs.Retrofit.scalars,

+3 −3
Original line number Diff line number Diff line
@@ -41,7 +41,7 @@ import foundation.e.advancedprivacy.features.dashboard.DashboardViewModel
import foundation.e.advancedprivacy.features.internetprivacy.InternetPrivacyViewModel
import foundation.e.advancedprivacy.features.location.FakeLocationViewModel
import foundation.e.advancedprivacy.features.trackers.TrackersViewModel
import foundation.e.advancedprivacy.features.trackers.apptrackers.AppTrackersFragment
import foundation.e.advancedprivacy.features.trackers.apptrackers.AppTrackersFragmentArgs
import foundation.e.advancedprivacy.features.trackers.apptrackers.AppTrackersViewModel
import foundation.e.privacymodules.fakelocation.FakeLocationModule
import foundation.e.privacymodules.ipscrambler.IpScramblerModule
@@ -172,8 +172,8 @@ class ViewModelsFactory(
    override fun <T : ViewModel> create(modelClass: Class<T>, extras: CreationExtras): T {
        return when (modelClass) {
            AppTrackersViewModel::class.java -> {
                val app = extras[DEFAULT_ARGS_KEY]?.getInt(AppTrackersFragment.PARAM_APP_UID)?.let {
                    appListUseCase.getApp(it)
                val app = extras[DEFAULT_ARGS_KEY]?.let {
                    appListUseCase.getApp(AppTrackersFragmentArgs.fromBundle(it).appUid)
                } ?: appListUseCase.dummySystemApp

                AppTrackersViewModel(
+12 −14
Original line number Diff line number Diff line
/*
 * Copyright (C) 2023 MURENA SAS
 * Copyright (C) 2022 MURENA SAS
 *
 * This program is free software: you can redistribute it and/or modify
@@ -21,7 +22,6 @@ import android.app.NotificationChannel
import android.app.NotificationManager
import android.app.PendingIntent
import android.content.Context
import android.content.Intent
import androidx.annotation.StringRes
import androidx.core.app.NotificationCompat
import androidx.core.app.NotificationManagerCompat
@@ -54,8 +54,9 @@ object Notifications {
                icon = R.drawable.ic_notification_logo,
                title = R.string.first_notification_title,
                description = R.string.first_notification_summary,
                destinationIntent =
                context.packageManager.getLaunchIntentForPackage(context.packageName)
                pendingIntent = MainActivity.deepLinkBuilder(context)
                    .setDestination(R.id.dashboardFragment)
                    .createPendingIntent()
            )
        )
            .setAutoCancel(true)
@@ -140,7 +141,9 @@ object Notifications {
                    icon = R.drawable.ic_fmd_bad,
                    title = R.string.notifications_fake_location_title,
                    description = R.string.notifications_fake_location_content,
                    destinationIntent = MainActivity.createFakeLocationIntent(context),
                    pendingIntent = MainActivity.deepLinkBuilder(context)
                        .addDestination(R.id.fakeLocationFragment)
                        .createPendingIntent()
                )
            )
            MainFeatures.IP_SCRAMBLING -> showFlagNotification(
@@ -151,7 +154,9 @@ object Notifications {
                    icon = R.drawable.ic_language,
                    title = R.string.notifications_ipscrambling_title,
                    description = R.string.notifications_ipscrambling_content,
                    destinationIntent = MainActivity.createIpScramblingIntent(context),
                    pendingIntent = MainActivity.deepLinkBuilder(context)
                        .addDestination(R.id.internetPrivacyFragment)
                        .createPendingIntent()
                )
            )
            else -> {}
@@ -184,7 +189,7 @@ object Notifications {
        val icon: Int,
        val title: Int,
        val description: Int,
        val destinationIntent: Intent?
        val pendingIntent: PendingIntent?
    )

    private fun notificationBuilder(
@@ -196,14 +201,7 @@ object Notifications {
            .setPriority(NotificationCompat.PRIORITY_LOW)
            .setContentTitle(context.getString(content.title))
            .setStyle(NotificationCompat.BigTextStyle().bigText(context.getString(content.description)))

        content.destinationIntent?.let {
            it.flags = Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK
            val pendingIntent: PendingIntent = PendingIntent.getActivity(
                context, 0, it, PendingIntent.FLAG_IMMUTABLE
            )
            builder.setContentIntent(pendingIntent)
        }
        content.pendingIntent?.let { builder.setContentIntent(it) }

        return builder
    }
+30 −7
Original line number Diff line number Diff line
/*
 * Copyright (C) 2023 MURENA SAS
 * Copyright (C) 2021 E FOUNDATION
 *
 * This program is free software: you can redistribute it and/or modify
@@ -17,17 +18,39 @@

package foundation.e.advancedprivacy.common

import android.os.Bundle
import android.view.View
import androidx.annotation.LayoutRes
import androidx.fragment.app.Fragment
import androidx.navigation.fragment.findNavController
import com.google.android.material.appbar.MaterialToolbar
import foundation.e.advancedprivacy.R

abstract class NavToolbarFragment(@LayoutRes contentLayoutId: Int) : ToolbarFragment(contentLayoutId) {
abstract class NavToolbarFragment(@LayoutRes contentLayoutId: Int) : Fragment(contentLayoutId) {

    override fun setupToolbar(toolbar: MaterialToolbar) {
        super.setupToolbar(toolbar)
        toolbar.apply {
            setNavigationOnClickListener {
                requireActivity().onBackPressed()
    /**
     * @return title to be used in toolbar
     */
    open fun getTitle(): CharSequence {
        return findNavController().currentDestination?.label ?: ""
    }

    fun setTitle(title: CharSequence?) {
        getToolbar()?.title = title
    }

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)

        setupToolbar(view.findViewById(R.id.toolbar))
    }

    open fun setupToolbar(toolbar: MaterialToolbar) {
        toolbar.title = getTitle()
        toolbar.setNavigationOnClickListener {
            requireActivity().onBackPressed()
        }
    }

    fun getToolbar(): MaterialToolbar? = view?.findViewById(R.id.toolbar)
}
Loading