From a88068267280520f637c354fdf1ffb2d4e857c9d Mon Sep 17 00:00:00 2001 From: Sylvain Berfini Date: Mon, 1 Jun 2020 11:39:05 +0200 Subject: [PATCH] Finished send logs feature from debug popup --- .../activities/main/about/AboutFragment.kt | 23 +----- .../activities/main/about/AboutViewModel.kt | 49 +------------ .../main/dialer/fragments/DialerFragment.kt | 28 +++++++- .../main/dialer/viewmodels/DialerViewModel.kt | 4 +- .../main/java/org/linphone/utils/AppUtils.kt | 24 ++++++- .../org/linphone/utils/LogsUploadViewModel.kt | 70 +++++++++++++++++++ app/src/main/res/values/strings.xml | 1 + 7 files changed, 126 insertions(+), 73 deletions(-) create mode 100644 app/src/main/java/org/linphone/utils/LogsUploadViewModel.kt diff --git a/app/src/main/java/org/linphone/activities/main/about/AboutFragment.kt b/app/src/main/java/org/linphone/activities/main/about/AboutFragment.kt index ecdcaa69d..c52eca8ec 100644 --- a/app/src/main/java/org/linphone/activities/main/about/AboutFragment.kt +++ b/app/src/main/java/org/linphone/activities/main/about/AboutFragment.kt @@ -31,8 +31,8 @@ import androidx.lifecycle.ViewModelProvider import androidx.navigation.fragment.findNavController import org.linphone.R import org.linphone.activities.main.MainActivity -import org.linphone.core.tools.Log import org.linphone.databinding.AboutFragmentBinding +import org.linphone.utils.AppUtils class AboutFragment : Fragment() { private lateinit var binding: AboutFragmentBinding @@ -83,27 +83,8 @@ class AboutFragment : Fragment() { val activity = requireActivity() as MainActivity activity.showSnackBar(R.string.logs_url_copied_to_clipboard) - shareUploadedLogsUrl(url) + AppUtils.shareUploadedLogsUrl(activity, url) } }) } - - // Logs - private fun shareUploadedLogsUrl(info: String) { - val appName = getString(R.string.app_name) - val intent = Intent(Intent.ACTION_SEND) - intent.putExtra( - Intent.EXTRA_EMAIL, - arrayOf(getString(R.string.about_bugreport_email)) - ) - intent.putExtra(Intent.EXTRA_SUBJECT, "$appName Logs") - intent.putExtra(Intent.EXTRA_TEXT, info) - intent.type = "text/plain" - - try { - startActivity(Intent.createChooser(intent, "Send mail...")) - } catch (ex: ActivityNotFoundException) { - Log.e(ex) - } - } } diff --git a/app/src/main/java/org/linphone/activities/main/about/AboutViewModel.kt b/app/src/main/java/org/linphone/activities/main/about/AboutViewModel.kt index 5857bddb9..e047a59af 100644 --- a/app/src/main/java/org/linphone/activities/main/about/AboutViewModel.kt +++ b/app/src/main/java/org/linphone/activities/main/about/AboutViewModel.kt @@ -19,59 +19,14 @@ */ package org.linphone.activities.main.about -import androidx.lifecycle.MutableLiveData -import androidx.lifecycle.ViewModel import org.linphone.LinphoneApplication.Companion.coreContext import org.linphone.LinphoneApplication.Companion.corePreferences -import org.linphone.core.Core -import org.linphone.core.CoreListenerStub -import org.linphone.utils.Event +import org.linphone.utils.LogsUploadViewModel -class AboutViewModel : ViewModel() { +class AboutViewModel : LogsUploadViewModel() { val appVersion: String = coreContext.appVersion val sdkVersion: String = coreContext.sdkVersion val showLogsButtons: Boolean = corePreferences.debugLogs - - val uploadInProgress = MutableLiveData() - - val uploadFinishedEvent: MutableLiveData> by lazy { - MutableLiveData>() - } - - private val listener = object : CoreListenerStub() { - override fun onLogCollectionUploadStateChanged( - core: Core, - state: Core.LogCollectionUploadState, - info: String - ) { - if (state == Core.LogCollectionUploadState.Delivered) { - uploadInProgress.value = false - uploadFinishedEvent.value = Event(info) - } else if (state == Core.LogCollectionUploadState.NotDelivered) { - uploadInProgress.value = false - } - } - } - - init { - coreContext.core.addListener(listener) - uploadInProgress.value = false - } - - override fun onCleared() { - coreContext.core.removeListener(listener) - - super.onCleared() - } - - fun uploadLogs() { - uploadInProgress.value = true - coreContext.core.uploadLogCollection() - } - - fun resetLogs() { - coreContext.core.resetLogCollection() - } } diff --git a/app/src/main/java/org/linphone/activities/main/dialer/fragments/DialerFragment.kt b/app/src/main/java/org/linphone/activities/main/dialer/fragments/DialerFragment.kt index 2d77b40af..0c5d4a054 100644 --- a/app/src/main/java/org/linphone/activities/main/dialer/fragments/DialerFragment.kt +++ b/app/src/main/java/org/linphone/activities/main/dialer/fragments/DialerFragment.kt @@ -20,6 +20,9 @@ package org.linphone.activities.main.dialer.fragments import android.app.AlertDialog +import android.content.ClipData +import android.content.ClipboardManager +import android.content.Context import android.net.Uri import android.os.Bundle import android.view.LayoutInflater @@ -32,16 +35,20 @@ import androidx.navigation.fragment.findNavController 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.SharedMainViewModel import org.linphone.core.tools.Log import org.linphone.databinding.DialerFragmentBinding +import org.linphone.utils.AppUtils class DialerFragment : Fragment() { private lateinit var binding: DialerFragmentBinding private lateinit var viewModel: DialerViewModel private lateinit var sharedViewModel: SharedMainViewModel + private var uploadLogsInitiatedByUs = false + override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, @@ -115,6 +122,23 @@ class DialerFragment : Fragment() { } }) + viewModel.uploadFinishedEvent.observe(viewLifecycleOwner, Observer { + it.consume { url -> + // To prevent being trigger when using the Send Logs button in About page + if (uploadLogsInitiatedByUs) { + val clipboard = + requireContext().getSystemService(Context.CLIPBOARD_SERVICE) as ClipboardManager + val clip = ClipData.newPlainText("Logs url", url) + clipboard.setPrimaryClip(clip) + + val activity = requireActivity() as MainActivity + activity.showSnackBar(R.string.logs_url_copied_to_clipboard) + + AppUtils.shareUploadedLogsUrl(activity, url) + } + } + }) + Log.i("[Dialer] Pending call transfer mode = ${sharedViewModel.pendingCallTransfer}") viewModel.transferVisibility.value = sharedViewModel.pendingCallTransfer } @@ -126,6 +150,7 @@ class DialerFragment : Fragment() { coreContext.core.nativePreviewWindowId = binding.videoPreviewWindow } viewModel.updateShowVideoPreview() + uploadLogsInitiatedByUs = false } private fun displayDebugPopup() { @@ -137,7 +162,8 @@ class DialerFragment : Fragment() { corePreferences.debugLogs = false } if (which == 1) { - // TODO: upload logs + uploadLogsInitiatedByUs = true + viewModel.uploadLogs() } } } else { diff --git a/app/src/main/java/org/linphone/activities/main/dialer/viewmodels/DialerViewModel.kt b/app/src/main/java/org/linphone/activities/main/dialer/viewmodels/DialerViewModel.kt index 918277aac..3a053537c 100644 --- a/app/src/main/java/org/linphone/activities/main/dialer/viewmodels/DialerViewModel.kt +++ b/app/src/main/java/org/linphone/activities/main/dialer/viewmodels/DialerViewModel.kt @@ -21,14 +21,14 @@ package org.linphone.activities.main.dialer.viewmodels import android.provider.Settings import androidx.lifecycle.MutableLiveData -import androidx.lifecycle.ViewModel import org.linphone.LinphoneApplication.Companion.coreContext 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.LogsUploadViewModel -class DialerViewModel : ViewModel() { +class DialerViewModel : LogsUploadViewModel() { val enteredUri = MutableLiveData() val atLeastOneCall = MutableLiveData() diff --git a/app/src/main/java/org/linphone/utils/AppUtils.kt b/app/src/main/java/org/linphone/utils/AppUtils.kt index 10622a345..13affca54 100644 --- a/app/src/main/java/org/linphone/utils/AppUtils.kt +++ b/app/src/main/java/org/linphone/utils/AppUtils.kt @@ -19,8 +19,8 @@ */ package org.linphone.utils -import android.content.ContentUris -import android.content.ContentValues +import android.app.Activity +import android.content.* import android.provider.ContactsContract import android.text.Spanned import android.util.TypedValue @@ -29,6 +29,8 @@ import java.util.* import java.util.regex.Pattern import org.linphone.LinphoneApplication.Companion.coreContext import org.linphone.LinphoneApplication.Companion.corePreferences +import org.linphone.R +import org.linphone.core.tools.Log /** * Various utility methods for application @@ -125,5 +127,23 @@ class AppUtils { coreContext.context.resources.displayMetrics ) } + + fun shareUploadedLogsUrl(activity: Activity, info: String) { + val appName = activity.getString(R.string.app_name) + val intent = Intent(Intent.ACTION_SEND) + intent.putExtra( + Intent.EXTRA_EMAIL, + arrayOf(activity.getString(R.string.about_bugreport_email)) + ) + intent.putExtra(Intent.EXTRA_SUBJECT, "$appName Logs") + intent.putExtra(Intent.EXTRA_TEXT, info) + intent.type = "text/plain" + + try { + activity.startActivity(Intent.createChooser(intent, activity.getString(R.string.share_uploaded_logs_link))) + } catch (ex: ActivityNotFoundException) { + Log.e(ex) + } + } } } diff --git a/app/src/main/java/org/linphone/utils/LogsUploadViewModel.kt b/app/src/main/java/org/linphone/utils/LogsUploadViewModel.kt new file mode 100644 index 000000000..519539c2f --- /dev/null +++ b/app/src/main/java/org/linphone/utils/LogsUploadViewModel.kt @@ -0,0 +1,70 @@ +/* + * Copyright (c) 2010-2020 Belledonne Communications SARL. + * + * This file is part of linphone-android + * (see https://www.linphone.org). + * + * 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, see . + */ + +package org.linphone.utils + +import androidx.lifecycle.MutableLiveData +import androidx.lifecycle.ViewModel +import org.linphone.LinphoneApplication.Companion.coreContext +import org.linphone.core.Core +import org.linphone.core.CoreListenerStub + +open class LogsUploadViewModel : ViewModel() { + val uploadInProgress = MutableLiveData() + + val uploadFinishedEvent: MutableLiveData> by lazy { + MutableLiveData>() + } + + private val listener = object : CoreListenerStub() { + override fun onLogCollectionUploadStateChanged( + core: Core, + state: Core.LogCollectionUploadState, + info: String + ) { + if (state == Core.LogCollectionUploadState.Delivered) { + uploadInProgress.value = false + uploadFinishedEvent.value = Event(info) + } else if (state == Core.LogCollectionUploadState.NotDelivered) { + uploadInProgress.value = false + } + } + } + + init { + coreContext.core.addListener(listener) + uploadInProgress.value = false + } + + override fun onCleared() { + coreContext.core.removeListener(listener) + + super.onCleared() + } + + fun uploadLogs() { + uploadInProgress.value = true + coreContext.core.uploadLogCollection() + } + + fun resetLogs() { + coreContext.core.resetLogCollection() + } +} diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 582b42bc0..a3d42bb8a 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -42,6 +42,7 @@ %d day %d days + Share logs link using... Invalid email