Skip to content
Snippets Groups Projects
Commit 672e6841 authored by Pavan Koushik Nellore's avatar Pavan Koushik Nellore Committed by Adrien Béraud
Browse files

implementation of connectivity mode selection in settings

Gitlab: #1792
Change-Id: Ibef45fb7656b59d24f235359ae1a7a09fc55ba64
parent b82d9c26
Branches
Tags
No related merge requests found
......@@ -23,13 +23,18 @@ import android.content.Intent
import android.os.Bundle
import android.text.TextUtils
import android.view.*
import android.widget.ArrayAdapter
import android.widget.CompoundButton
import android.widget.ImageView
import android.widget.RadioButton
import android.widget.TextView
import android.widget.Toast
import androidx.activity.OnBackPressedCallback
import androidx.core.view.isVisible
import androidx.fragment.app.Fragment
import androidx.fragment.app.FragmentTransaction
import com.google.android.material.dialog.MaterialAlertDialogBuilder
import cx.ring.BuildConfig
import cx.ring.R
import cx.ring.application.JamiApplication
import cx.ring.client.LogsActivity
......@@ -44,10 +49,12 @@ import cx.ring.settings.extensionssettings.ExtensionSettingsFragment
import cx.ring.settings.extensionssettings.ExtensionsListSettingsFragment
import cx.ring.utils.ActionHelper.openJamiDonateWebPage
import dagger.hilt.android.AndroidEntryPoint
import javax.inject.Inject
import net.jami.daemon.JamiService
import net.jami.model.DonationSettings
import net.jami.model.Settings
import net.jami.mvp.GenericView
import net.jami.services.PreferencesService
import net.jami.settings.SettingsPresenter
import net.jami.settings.SettingsViewModel
import net.jami.utils.DonationUtils
......@@ -57,11 +64,18 @@ class SettingsFragment :
BaseSupportFragment<SettingsPresenter, GenericView<SettingsViewModel>>(),
GenericView<SettingsViewModel>,
AppBarStateListener {
enum class ConnectivityType {
LOCAL_NODE, GOOGLE_SERVICES, UNIFIED_PUSH, CUSTOM
}
private var binding: FragSettingsBinding? = null
private var currentSettings: Settings? = null
private var currentDonationSettings: DonationSettings? = null
private var mIsRefreshingViewFromPresenter = true
private var mNotificationVisibility = NOTIFICATION_PRIVATE
private var mConnectivityMode: ConnectivityType = ConnectivityType.CUSTOM
private lateinit var connectivityOptions: List<ConnectivityOption>
@Inject
lateinit var mPreferencesService: PreferencesService
private val backPressedCallback = object : OnBackPressedCallback(false) {
override fun handleOnBackPressed() { popBackStack() }
......@@ -86,6 +100,31 @@ class SettingsFragment :
}
}
updateConnectionMode()
settingsConnectivityMode.setOnClickListener {
connectivityOptions = getConnectivityOptions(
mPreferencesService.settings.enablePushNotifications,
mPreferencesService.settings.enablePermanentService
)
val currentSelectionIndex = connectivityOptions.indexOfFirst {
it.mode == mConnectivityMode
}
val adapter = ConnectivityOptionsAdapter(requireContext(),
connectivityOptions, currentSelectionIndex)
MaterialAlertDialogBuilder(requireContext())
.setTitle(getString(R.string.pref_connectivity_title))
.setAdapter(adapter, null)
.setPositiveButton(android.R.string.ok) { dialog, _ ->
mConnectivityMode = connectivityOptions[adapter.selectedPosition].mode
adjustSettingsForConnectivityMode()
dialog.dismiss()
}
.setNegativeButton(android.R.string.cancel) { dialog, _ ->
dialog.dismiss()
}
.show()
}
settingsExtensionsLayout.setOnClickListener {
if (JamiService.getPluginsEnabled()) {
goToExtensionsListSettings()
......@@ -161,6 +200,117 @@ class SettingsFragment :
binding = this
}.root
private fun getConnectivityOptions(
enablePushNotifications: Boolean,
enablePermanentService: Boolean
) : List<ConnectivityOption> {
val baseOptions = when (BuildConfig.FLAVOR) {
"noPush" -> listOf(
ConnectivityOption(
mode = ConnectivityType.LOCAL_NODE,
iconResId = R.drawable.connectivity_mode_dht_24,
title = getString(R.string.connectivity_local_node_title),
description = getString(R.string.connectivity_local_node_description)
)
)
"withFirebase" -> listOf(
ConnectivityOption(
mode = ConnectivityType.LOCAL_NODE,
iconResId = R.drawable.connectivity_mode_dht_24,
title = getString(R.string.connectivity_local_node_title),
description = getString(R.string.connectivity_local_node_description)
),
ConnectivityOption(
mode = ConnectivityType.GOOGLE_SERVICES,
iconResId = R.drawable.connectivity_mode_firebase_24,
title = getString(R.string.connectivity_google_services_title),
description = getString(R.string.connectivity_google_services_description)
)
)
"withUnifiedPush" -> listOf(
ConnectivityOption(
mode = ConnectivityType.LOCAL_NODE,
iconResId = R.drawable.connectivity_mode_dht_24,
title = getString(R.string.connectivity_local_node_title),
description = getString(R.string.connectivity_local_node_description)
),
ConnectivityOption(
mode = ConnectivityType.UNIFIED_PUSH,
iconResId = R.drawable.connectivity_mode_firebase_24,
title = getString(R.string.connectivity_unified_push_title),
description = getString(R.string.connectivity_unified_push_description)
)
)
else -> emptyList()
}
return if (((enablePushNotifications && !enablePermanentService) && (BuildConfig.FLAVOR
== "withFirebase")) || (!enablePushNotifications && enablePermanentService)) {
baseOptions
} else if (enablePushNotifications && enablePermanentService
&& BuildConfig.FLAVOR == "noPush") {
baseOptions
} else {
baseOptions + ConnectivityOption(
mode = ConnectivityType.CUSTOM,
iconResId = R.drawable.connectivity_mode_custom_24,
title = getString(R.string.connectivity_custom_title),
description = getString(R.string.connectivity_custom_description)
)
}
}
private fun adjustSettingsForConnectivityMode() {
if(currentSettings != null) {
currentSettings = when (mConnectivityMode) {
ConnectivityType.GOOGLE_SERVICES -> currentSettings?.copy(
enablePushNotifications = true,
enablePermanentService = false
)
ConnectivityType.LOCAL_NODE -> currentSettings?.copy(
enablePushNotifications = false,
enablePermanentService = true
)
ConnectivityType.UNIFIED_PUSH -> currentSettings?.copy(
enablePushNotifications = true,
enablePermanentService = false
)
else -> currentSettings
}
presenter.saveSettings(currentSettings!!)
}
}
private fun updateConnectionMode() {
mConnectivityMode = when {
!mPreferencesService.settings.enablePushNotifications &&
mPreferencesService.settings.enablePermanentService -> {
ConnectivityType.LOCAL_NODE
}
mPreferencesService.settings.enablePushNotifications &&
mPreferencesService.settings.enablePermanentService -> {
when (BuildConfig.FLAVOR) {
"noPush" -> ConnectivityType.LOCAL_NODE
else -> ConnectivityType.CUSTOM
}
}
mPreferencesService.settings.enablePushNotifications &&
!mPreferencesService.settings.enablePermanentService -> {
when (BuildConfig.FLAVOR) {
"withFirebase" -> ConnectivityType.GOOGLE_SERVICES
"withUnifiedPush" -> ConnectivityType.UNIFIED_PUSH
else -> ConnectivityType.CUSTOM
}
}
else -> ConnectivityType.CUSTOM
}
}
private fun goToVideoSettings() {
val binding = binding ?: return
val content = VideoSettingsFragment()
......@@ -289,6 +439,7 @@ class SettingsFragment :
}
override fun showViewModel(viewModel: SettingsViewModel) {
updateConnectionMode()
val settings = viewModel.settings
val donationSettings = viewModel.donationSettings
currentDonationSettings = donationSettings
......@@ -329,3 +480,44 @@ class SettingsFragment :
const val EXTENSION_PATH_PREFERENCE_TAG = "ExtensionPathPreference"
}
}
data class ConnectivityOption (
val mode: SettingsFragment.ConnectivityType,
val iconResId: Int,
val title: String,
val description: String
)
class ConnectivityOptionsAdapter(
context: Context,
private val options: List<ConnectivityOption>,
var selectedPosition: Int
) : ArrayAdapter<ConnectivityOption>(context, 0, options) {
override fun getView(position: Int, convertView: View?, parent: ViewGroup): View {
val view = convertView ?: LayoutInflater.from(context).inflate(R.layout
.dialog_option_item, parent, false)
val option = getItem(position)
val imageView = view.findViewById<ImageView>(R.id.item_image)
val titleView = view.findViewById<TextView>(R.id.item_title)
val descriptionView = view.findViewById<TextView>(R.id.item_description)
val radioButton = view.findViewById<RadioButton>(R.id.item_radio_button)
option?.let {
imageView.setImageResource(it.iconResId)
titleView.text = it.title
descriptionView.text = it.description
radioButton.isChecked = position == selectedPosition
}
view.setOnClickListener {
selectedPosition = position
notifyDataSetChanged()
}
radioButton.setOnClickListener {
selectedPosition = position
notifyDataSetChanged()
}
return view
}
}
\ No newline at end of file
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="960"
android:viewportHeight="960"
android:tint="?attr/colorControlNormal">
<path
android:fillColor="@android:color/white"
android:pathData="M40,480Q40,388 74.5,308Q109,228 169,168.5Q229,109 309,74.5Q389,40 480,40Q571,40 651,74.5Q731,109 791,168.5Q851,228 885.5,308Q920,388 920,480L840,480Q840,405 811.5,339.5Q783,274 734,225Q685,176 619.5,148Q554,120 480,120Q406,120 340.5,148Q275,176 226,225Q177,274 148.5,339.5Q120,405 120,480L40,480ZM200,480Q200,362 282,281Q364,200 480,200Q596,200 678,281Q760,362 760,480L680,480Q680,397 621.5,338.5Q563,280 480,280Q397,280 338.5,338.5Q280,397 280,480L200,480ZM360,896L304,840L440,704L440,572Q413,560 396.5,535Q380,510 380,480Q380,438 409,409Q438,380 480,380Q522,380 551,409Q580,438 580,480Q580,510 563.5,535Q547,560 520,572L520,704L656,840L600,896L480,776L360,896Z"/>
</vector>
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="960"
android:viewportHeight="960"
android:tint="?attr/colorControlNormal">
<path
android:fillColor="@android:color/white"
android:pathData="M339,698Q361,676 388.5,662Q416,648 447,643Q447,643 447,643Q447,643 447,643Q442,662 439,681Q436,700 436,720Q436,744 439.5,767Q443,790 451,811L451,811L339,698ZM254,614L170,528Q232,466 312,433Q392,400 480,400Q529,400 576,410.5Q623,421 666,441Q622,449 584.5,470Q547,491 517,522Q508,521 498.5,520.5Q489,520 480,520Q416,520 357.5,544.5Q299,569 254,614ZM84,444L0,360Q95,263 219.5,211.5Q344,160 480,160Q616,160 740.5,211.5Q865,263 960,360L876,444Q797,365 694.5,322.5Q592,280 480,280Q368,280 265.5,322.5Q163,365 84,444ZM760,520L772,580Q784,585 794.5,590.5Q805,596 816,604L874,586L914,654L868,694Q870,706 870,720Q870,734 868,746L914,786L874,854L816,836Q805,844 794.5,849.5Q784,855 772,860L760,920L680,920L668,860Q656,855 645.5,849.5Q635,844 624,836L566,854L526,786L572,746Q570,734 570,720Q570,706 572,694L526,654L566,586L624,604Q635,596 645.5,590.5Q656,585 668,580L680,520L760,520ZM720,640Q687,640 663.5,663.5Q640,687 640,720Q640,753 663.5,776.5Q687,800 720,800Q753,800 776.5,776.5Q800,753 800,720Q800,687 776.5,663.5Q753,640 720,640Z"/>
</vector>
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="960"
android:viewportHeight="960"
android:tint="?attr/colorControlNormal">
<path
android:fillColor="@android:color/white"
android:pathData="M220,880Q162,880 121,839Q80,798 80,740Q80,682 121,641Q162,600 220,600Q238,600 255,604.5Q272,609 287,617L440,464L440,354Q396,341 368,304.5Q340,268 340,220Q340,162 381,121Q422,80 480,80Q538,80 579,121Q620,162 620,220Q620,268 592,304.5Q564,341 520,354L520,464L674,617Q689,609 705.5,604.5Q722,600 740,600Q798,600 839,641Q880,682 880,740Q880,798 839,839Q798,880 740,880Q682,880 641,839Q600,798 600,740Q600,722 604.5,705Q609,688 617,673L480,536L343,673Q351,688 355.5,705Q360,722 360,740Q360,798 319,839Q278,880 220,880ZM740,800Q765,800 782.5,782.5Q800,765 800,740Q800,715 782.5,697.5Q765,680 740,680Q715,680 697.5,697.5Q680,715 680,740Q680,765 697.5,782.5Q715,800 740,800ZM480,280Q505,280 522.5,262.5Q540,245 540,220Q540,195 522.5,177.5Q505,160 480,160Q455,160 437.5,177.5Q420,195 420,220Q420,245 437.5,262.5Q455,280 480,280ZM220,800Q245,800 262.5,782.5Q280,765 280,740Q280,715 262.5,697.5Q245,680 220,680Q195,680 177.5,697.5Q160,715 160,740Q160,765 177.5,782.5Q195,800 220,800Z"/>
</vector>
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="960"
android:viewportHeight="960"
android:tint="?attr/colorControlNormal">
<path
android:fillColor="@android:color/white"
android:pathData="M260,800Q169,800 104.5,737Q40,674 40,583Q40,505 87,444Q134,383 210,366Q235,274 310,217Q385,160 480,160Q597,160 678.5,241.5Q760,323 760,440L760,440L760,440Q829,448 874.5,499.5Q920,551 920,620Q920,695 867.5,747.5Q815,800 740,800L260,800ZM260,720L740,720Q782,720 811,691Q840,662 840,620Q840,578 811,549Q782,520 740,520L680,520L680,440Q680,357 621.5,298.5Q563,240 480,240Q397,240 338.5,298.5Q280,357 280,440L280,440L260,440Q202,440 161,481Q120,522 120,580Q120,638 161,679Q202,720 260,720ZM480,480Q480,480 480,480Q480,480 480,480Q480,480 480,480Q480,480 480,480L480,480L480,480Q480,480 480,480Q480,480 480,480Q480,480 480,480Q480,480 480,480L480,480L480,480Q480,480 480,480Q480,480 480,480Q480,480 480,480Q480,480 480,480Z"/>
</vector>
<?xml version="1.0" encoding="utf-8"?><!--
Copyright (C) 2004-2024 Savoir-faire Linux Inc.
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, write to the Free Software
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
-->
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:padding="16dp"
android:clickable="true"
android:focusable="true">
<RadioButton
android:id="@+id/item_radio_button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:focusable="false"
android:focusableInTouchMode="false"
android:layout_gravity="center_vertical"
android:paddingEnd="8dp" />
<ImageView
android:id="@+id/item_image"
android:layout_width="40dp"
android:layout_height="40dp"
android:contentDescription="image for options"
android:layout_gravity="center_vertical" />
<LinearLayout
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:orientation="vertical"
android:paddingStart="8dp"
android:paddingEnd="8dp">
<TextView
android:id="@+id/item_title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textStyle="bold" />
<TextView
android:id="@+id/item_description"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="?android:attr/textColorSecondary" />
</LinearLayout>
</LinearLayout>
......@@ -538,6 +538,45 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
android:textSize="18sp"
android:layout_marginStart="64dp" />
<RelativeLayout
android:id="@+id/settings_connectivity_mode"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="?attr/selectableItemBackground"
android:padding="@dimen/padding_large">
<ImageView
android:id="@+id/system_connectivity_image"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="start"
android:contentDescription="@string/pref_connectivity_summary"
android:src="@drawable/connectivity_mode_24"
app:tint="?attr/colorControlNormal"
android:layout_alignParentStart="true"
android:layout_centerVertical="true"
android:layout_marginEnd="32dp" />
<TextView
style="@style/ListPrimary"
android:id="@+id/system_connectivity_title"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:ellipsize="end"
android:lines="1"
android:text="@string/pref_connectivity_title"
android:layout_toEndOf="@+id/system_connectivity_image"/>
<TextView
style="@style/ListSecondary"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/pref_connectivity_summary"
android:layout_toEndOf="@+id/system_connectivity_image"
android:layout_below="@id/system_connectivity_title"/>
</RelativeLayout>
<RelativeLayout
android:id="@+id/settings_push_notifications_layout"
android:layout_width="match_parent"
......
......@@ -46,6 +46,10 @@
<string name="pref_notification_title">Notification visibility</string>
<string name="pref_notification_summary">Set application notifications visibility on lock screen.</string>
<string name="pref_connectivity_title">Connectivity mode</string>
<string name="pref_connectivity_summary">Chose how to connect Jami to the distributed system to
receive calls and messages.</string>
<string name="pref_blackList_title">Block list</string>
<string name="pref_blackList_summary">Check your block list.</string>
......@@ -84,6 +88,19 @@
<string name="notification_private">Private\n(show notifications but hide their content on lock screen)\n</string>
<string name="notification_secret">Secret\n(do not show notifications on lock screen)</string>
<string name="connectivity_google_services_title">Google services</string>
<string name="connectivity_google_services_description">Use Google Firebase and a DHT proxy to
receive push notifications.</string>
<string name="connectivity_local_node_title">Local DHT node</string>
<string name="connectivity_local_node_description">Use a local DHT node to connect with other
Jami devices and contacts.</string>
<string name="connectivity_unified_push_title">Unified push</string>
<string name="connectivity_unified_push_description">Use a custom unified Push server to
receive push notifications.</string>
<string name="connectivity_custom_title">Custom</string>
<string name="connectivity_custom_description">Currently not using any of the
available configuration presets.</string>
<!-- Extension -->
<string name="pref_extensions_title">Extensions</string>
<string name="pref_extensions_summary">Enable extensions and set their parameters</string>
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment