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
import android.app.AlertDialog
import android.app.Dialog
import android.content.ClipData
import android.content.ClipboardManager
import android.content.Context
import android.content.Intent
import android.net.Uri
import android.os.Bundle
import android.view.LayoutInflater
@ -32,15 +34,18 @@ import androidx.fragment.app.Fragment
import androidx.lifecycle.Observer
import androidx.lifecycle.ViewModelProvider
import androidx.navigation.fragment.findNavController
import org.linphone.BuildConfig
import org.linphone.LinphoneApplication.Companion.coreContext
import org.linphone.LinphoneApplication.Companion.corePreferences
import org.linphone.R
import org.linphone.activities.main.MainActivity
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.core.tools.Log
import org.linphone.databinding.DialerFragmentBinding
import org.linphone.utils.AppUtils
import org.linphone.utils.DialogUtils
class DialerFragment : Fragment() {
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}")
viewModel.transferVisibility.value = sharedViewModel.pendingCallTransfer
checkForUpdate()
}
override fun onResume() {
@ -176,4 +189,36 @@ class DialerFragment : Fragment() {
}
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.core.*
import org.linphone.core.tools.Log
import org.linphone.utils.Event
import org.linphone.utils.LogsUploadViewModel
class DialerViewModel : LogsUploadViewModel() {
@ -41,6 +42,10 @@ class DialerViewModel : LogsUploadViewModel() {
val autoInitiateVideoCalls = MutableLiveData<Boolean>()
val updateAvailableEvent: MutableLiveData<Event<String>> by lazy {
MutableLiveData<Event<String>>()
}
private var addressWaitingNetworkToBeCalled: String? = null
private var timeAtWitchWeTriedToCall: Long = 0
@ -94,6 +99,20 @@ class DialerViewModel : LogsUploadViewModel() {
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 {

View file

@ -198,6 +198,12 @@ class CorePreferences constructor(private val context: Context) {
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 */
val defaultDomain: String
@ -227,6 +233,12 @@ class CorePreferences constructor(private val context: Context) {
val contactOrganizationVisible: Boolean
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
get() = config.getBool("app", "dark_mode_allowed", true)

View file

@ -57,7 +57,7 @@
<CheckBox
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:layout_width="wrap_content"
android:layout_height="match_parent"

View file

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