Added check for update available feature

This commit is contained in:
Sylvain Berfini 2020-06-24 17:23:53 +02:00
parent 0e20fff7e3
commit 2076d6c492
5 changed files with 78 additions and 1 deletions

View file

@ -20,9 +20,11 @@
package org.linphone.activities.main.dialer.fragments package org.linphone.activities.main.dialer.fragments
import android.app.AlertDialog import android.app.AlertDialog
import android.app.Dialog
import android.content.ClipData import android.content.ClipData
import android.content.ClipboardManager import android.content.ClipboardManager
import android.content.Context import android.content.Context
import android.content.Intent
import android.net.Uri import android.net.Uri
import android.os.Bundle import android.os.Bundle
import android.view.LayoutInflater import android.view.LayoutInflater
@ -32,15 +34,18 @@ import androidx.fragment.app.Fragment
import androidx.lifecycle.Observer import androidx.lifecycle.Observer
import androidx.lifecycle.ViewModelProvider import androidx.lifecycle.ViewModelProvider
import androidx.navigation.fragment.findNavController import androidx.navigation.fragment.findNavController
import org.linphone.BuildConfig
import org.linphone.LinphoneApplication.Companion.coreContext import org.linphone.LinphoneApplication.Companion.coreContext
import org.linphone.LinphoneApplication.Companion.corePreferences import org.linphone.LinphoneApplication.Companion.corePreferences
import org.linphone.R import org.linphone.R
import org.linphone.activities.main.MainActivity import org.linphone.activities.main.MainActivity
import org.linphone.activities.main.dialer.viewmodels.DialerViewModel import org.linphone.activities.main.dialer.viewmodels.DialerViewModel
import org.linphone.activities.main.viewmodels.DialogViewModel
import org.linphone.activities.main.viewmodels.SharedMainViewModel import org.linphone.activities.main.viewmodels.SharedMainViewModel
import org.linphone.core.tools.Log import org.linphone.core.tools.Log
import org.linphone.databinding.DialerFragmentBinding import org.linphone.databinding.DialerFragmentBinding
import org.linphone.utils.AppUtils import org.linphone.utils.AppUtils
import org.linphone.utils.DialogUtils
class DialerFragment : Fragment() { class DialerFragment : Fragment() {
private lateinit var binding: DialerFragmentBinding private lateinit var binding: DialerFragmentBinding
@ -139,8 +144,16 @@ class DialerFragment : Fragment() {
} }
}) })
viewModel.updateAvailableEvent.observe(viewLifecycleOwner, Observer {
it.consume { url ->
displayNewVersionAvailableDialog(url)
}
})
Log.i("[Dialer] Pending call transfer mode = ${sharedViewModel.pendingCallTransfer}") Log.i("[Dialer] Pending call transfer mode = ${sharedViewModel.pendingCallTransfer}")
viewModel.transferVisibility.value = sharedViewModel.pendingCallTransfer viewModel.transferVisibility.value = sharedViewModel.pendingCallTransfer
checkForUpdate()
} }
override fun onResume() { override fun onResume() {
@ -176,4 +189,36 @@ class DialerFragment : Fragment() {
} }
alertDialog.show() alertDialog.show()
} }
private fun checkForUpdate() {
val url: String? = corePreferences.checkIfUpdateAvailableUrl
if (url != null && url.isNotEmpty()) {
val lastTimestamp: Int = corePreferences.lastUpdateAvailableCheckTimestamp
val currentTimeStamp = System.currentTimeMillis().toInt()
val interval: Int = corePreferences.checkUpdateAvailableInterval
if (lastTimestamp == 0 || currentTimeStamp - lastTimestamp >= interval) {
val currentVersion = BuildConfig.VERSION_NAME
Log.i("[Dialer] Checking for update using url [$url] and current version [$currentVersion]")
coreContext.core.checkForUpdate(currentVersion)
corePreferences.lastUpdateAvailableCheckTimestamp = currentTimeStamp
}
}
}
private fun displayNewVersionAvailableDialog(url: String) {
val viewModel = DialogViewModel(getString(R.string.dialog_update_available))
val dialog: Dialog = DialogUtils.getDialog(requireContext(), viewModel)
viewModel.showCancelButton {
dialog.dismiss()
}
viewModel.showOkButton({
val browserIntent = Intent(Intent.ACTION_VIEW, Uri.parse(url))
startActivity(browserIntent)
dialog.dismiss()
}, getString(R.string.dialog_ok))
dialog.show()
}
} }

View file

@ -26,6 +26,7 @@ import org.linphone.LinphoneApplication.Companion.corePreferences
import org.linphone.activities.main.dialer.NumpadDigitListener import org.linphone.activities.main.dialer.NumpadDigitListener
import org.linphone.core.* import org.linphone.core.*
import org.linphone.core.tools.Log import org.linphone.core.tools.Log
import org.linphone.utils.Event
import org.linphone.utils.LogsUploadViewModel import org.linphone.utils.LogsUploadViewModel
class DialerViewModel : LogsUploadViewModel() { class DialerViewModel : LogsUploadViewModel() {
@ -41,6 +42,10 @@ class DialerViewModel : LogsUploadViewModel() {
val autoInitiateVideoCalls = MutableLiveData<Boolean>() val autoInitiateVideoCalls = MutableLiveData<Boolean>()
val updateAvailableEvent: MutableLiveData<Event<String>> by lazy {
MutableLiveData<Event<String>>()
}
private var addressWaitingNetworkToBeCalled: String? = null private var addressWaitingNetworkToBeCalled: String? = null
private var timeAtWitchWeTriedToCall: Long = 0 private var timeAtWitchWeTriedToCall: Long = 0
@ -94,6 +99,20 @@ class DialerViewModel : LogsUploadViewModel() {
timeAtWitchWeTriedToCall = 0 timeAtWitchWeTriedToCall = 0
} }
} }
override fun onVersionUpdateCheckResultReceived(
core: Core,
result: VersionUpdateCheckResult,
version: String?,
url: String?
) {
if (result == VersionUpdateCheckResult.NewVersionAvailable) {
Log.i("[Dialer] Update available, version [$version], url [$url]")
if (url != null && url.isNotEmpty()) {
updateAvailableEvent.value = Event(url)
}
}
}
} }
init { init {

View file

@ -198,6 +198,12 @@ class CorePreferences constructor(private val context: Context) {
config.setString("app", "voice_mail", value) config.setString("app", "voice_mail", value)
} }
var lastUpdateAvailableCheckTimestamp: Int
get() = config.getInt("app", "version_check_url_last_timestamp", 0)
set(value) {
config.setInt("app", "version_check_url_last_timestamp", value)
}
/* Read only application settings previously in non_localizable_custom */ /* Read only application settings previously in non_localizable_custom */
val defaultDomain: String val defaultDomain: String
@ -227,6 +233,12 @@ class CorePreferences constructor(private val context: Context) {
val contactOrganizationVisible: Boolean val contactOrganizationVisible: Boolean
get() = config.getBool("app", "display_contact_organization", true) get() = config.getBool("app", "display_contact_organization", true)
val checkIfUpdateAvailableUrl: String?
get() = config.getString("misc", "version_check_url_root", null)
val checkUpdateAvailableInterval: Int
get() = config.getInt("app", "version_check_interval", 86400000)
private val darkModeAllowed: Boolean private val darkModeAllowed: Boolean
get() = config.getBool("app", "dark_mode_allowed", true) get() = config.getBool("app", "dark_mode_allowed", true)

View file

@ -57,7 +57,7 @@
<CheckBox <CheckBox
android:onClick="@{() -> selectionListViewModel.onToggleSelect(position)}" android:onClick="@{() -> selectionListViewModel.onToggleSelect(position)}"
android:visibility="@{selectionListViewModel.isEditionEnabled ? View.VISIBLE : View.GONE}" android:visibility="@{selectionListViewModel.isEditionEnabled ? View.VISIBLE : View.GONE, default=gone}"
android:checked="@{selectionListViewModel.selectedItems.contains(position)}" android:checked="@{selectionListViewModel.selectedItems.contains(position)}"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="match_parent" android:layout_height="match_parent"

View file

@ -559,6 +559,7 @@
<item quantity="one">@string/dialog_default_delete_one</item> <item quantity="one">@string/dialog_default_delete_one</item>
<item quantity="other">@string/dialog_default_delete_many</item> <item quantity="other">@string/dialog_default_delete_many</item>
</plurals> </plurals>
<string name="dialog_update_available">An update is available</string>
<!-- Content description --> <!-- Content description -->
<string name="content_description_add_sip_address_field">Add a SIP address field</string> <string name="content_description_add_sip_address_field">Add a SIP address field</string>