Merge branch 'master' into Icon_size

This commit is contained in:
Marcel Hibbe 2023-08-30 11:02:43 +02:00 committed by GitHub
commit 9431dd4ddb
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
39 changed files with 352 additions and 236 deletions

View File

@ -33,7 +33,7 @@ jobs:
echo "pr=${{ github.event.pull_request.number }}" >> "$GITHUB_OUTPUT" echo "pr=${{ github.event.pull_request.number }}" >> "$GITHUB_OUTPUT"
echo "repo=${{ github.event.pull_request.head.repo.full_name }}" >> "$GITHUB_OUTPUT" echo "repo=${{ github.event.pull_request.head.repo.full_name }}" >> "$GITHUB_OUTPUT"
fi fi
- uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # v3.5.3 - uses: actions/checkout@f43a0e5ff2bd294095638e18286ca9a3d1956744 # v3.6.0
with: with:
repository: ${{ steps.get-vars.outputs.repo }} repository: ${{ steps.get-vars.outputs.repo }}
ref: ${{ steps.get-vars.outputs.branch }} ref: ${{ steps.get-vars.outputs.branch }}

View File

@ -19,7 +19,7 @@ jobs:
matrix: matrix:
flavor: [ Generic, Gplay ] flavor: [ Generic, Gplay ]
steps: steps:
- uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # v3.5.3 - uses: actions/checkout@f43a0e5ff2bd294095638e18286ca9a3d1956744 # v3.6.0
- name: set up JDK 17 - name: set up JDK 17
uses: actions/setup-java@cd89f46ac9d01407894225f350157564c9c7cee2 # v3.12.0 uses: actions/setup-java@cd89f46ac9d01407894225f350157564c9c7cee2 # v3.12.0
with: with:

View File

@ -19,7 +19,7 @@ jobs:
matrix: matrix:
task: [ detekt, ktlintCheck ] task: [ detekt, ktlintCheck ]
steps: steps:
- uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # v3.5.3 - uses: actions/checkout@f43a0e5ff2bd294095638e18286ca9a3d1956744 # v3.6.0
- name: Set up JDK 17 - name: Set up JDK 17
uses: actions/setup-java@cd89f46ac9d01407894225f350157564c9c7cee2 # v3.12.0 uses: actions/setup-java@cd89f46ac9d01407894225f350157564c9c7cee2 # v3.12.0
with: with:

View File

@ -26,13 +26,13 @@ jobs:
language: [ 'java' ] language: [ 'java' ]
steps: steps:
- name: Checkout repository - name: Checkout repository
uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # v3.5.3 uses: actions/checkout@f43a0e5ff2bd294095638e18286ca9a3d1956744 # v3.6.0
- name: Set Swap Space - name: Set Swap Space
uses: pierotofy/set-swap-space@49819abfb41bd9b44fb781159c033dba90353a7c # v1.0 uses: pierotofy/set-swap-space@49819abfb41bd9b44fb781159c033dba90353a7c # v1.0
with: with:
swap-size-gb: 10 swap-size-gb: 10
- name: Initialize CodeQL - name: Initialize CodeQL
uses: github/codeql-action/init@a09933a12a80f87b87005513f0abb1494c27a716 # v2.21.4 uses: github/codeql-action/init@00e563ead9f72a8461b24876bee2d0c2e8bd2ee8 # v2.21.5
with: with:
languages: ${{ matrix.language }} languages: ${{ matrix.language }}
- name: Set up JDK 17 - name: Set up JDK 17
@ -46,4 +46,4 @@ jobs:
echo "org.gradle.jvmargs=-Xmx2g -XX:MaxMetaspaceSize=512m -XX:+HeapDumpOnOutOfMemoryError" > "$HOME/.gradle/gradle.properties" echo "org.gradle.jvmargs=-Xmx2g -XX:MaxMetaspaceSize=512m -XX:+HeapDumpOnOutOfMemoryError" > "$HOME/.gradle/gradle.properties"
./gradlew assembleDebug ./gradlew assembleDebug
- name: Perform CodeQL Analysis - name: Perform CodeQL Analysis
uses: github/codeql-action/analyze@a09933a12a80f87b87005513f0abb1494c27a716 # v2.21.4 uses: github/codeql-action/analyze@00e563ead9f72a8461b24876bee2d0c2e8bd2ee8 # v2.21.5

View File

@ -31,7 +31,7 @@ jobs:
reaction-type: "+1" reaction-type: "+1"
- name: Checkout the latest code - name: Checkout the latest code
uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # v3.5.3 uses: actions/checkout@f43a0e5ff2bd294095638e18286ca9a3d1956744 # v3.6.0
with: with:
fetch-depth: 0 fetch-depth: 0
token: ${{ secrets.COMMAND_BOT_PAT }} token: ${{ secrets.COMMAND_BOT_PAT }}

View File

@ -18,5 +18,5 @@ jobs:
name: "Validation" name: "Validation"
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # v3.5.3 - uses: actions/checkout@f43a0e5ff2bd294095638e18286ca9a3d1956744 # v3.6.0
- uses: gradle/wrapper-validation-action@56b90f209b02bf6d1deae490e9ef18b21a389cd4 # v1.1.0 - uses: gradle/wrapper-validation-action@56b90f209b02bf6d1deae490e9ef18b21a389cd4 # v1.1.0

View File

@ -19,7 +19,7 @@ jobs:
- name: Check if secrets are available - name: Check if secrets are available
run: echo "::set-output name=ok::${{ secrets.KS_PASS != '' }}" run: echo "::set-output name=ok::${{ secrets.KS_PASS != '' }}"
id: check-secrets id: check-secrets
- uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # v3.5.3 - uses: actions/checkout@f43a0e5ff2bd294095638e18286ca9a3d1956744 # v3.6.0
if: ${{ steps.check-secrets.outputs.ok == 'true' }} if: ${{ steps.check-secrets.outputs.ok == 'true' }}
- name: set up JDK 17 - name: set up JDK 17
uses: actions/setup-java@cd89f46ac9d01407894225f350157564c9c7cee2 # v3.12.0 uses: actions/setup-java@cd89f46ac9d01407894225f350157564c9c7cee2 # v3.12.0

View File

@ -24,7 +24,7 @@ jobs:
steps: steps:
- name: "Checkout code" - name: "Checkout code"
uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # v3.5.3 uses: actions/checkout@f43a0e5ff2bd294095638e18286ca9a3d1956744 # v3.6.0
with: with:
persist-credentials: false persist-credentials: false
@ -37,6 +37,6 @@ jobs:
# Upload the results to GitHub's code scanning dashboard. # Upload the results to GitHub's code scanning dashboard.
- name: "Upload to code-scanning" - name: "Upload to code-scanning"
uses: github/codeql-action/upload-sarif@a09933a12a80f87b87005513f0abb1494c27a716 # v2.21.4 uses: github/codeql-action/upload-sarif@00e563ead9f72a8461b24876bee2d0c2e8bd2ee8 # v2.21.5
with: with:
sarif_file: results.sarif sarif_file: results.sarif

View File

@ -46,8 +46,8 @@ android {
// mayor.minor.hotfix.increment (for increment: 01-50=Alpha / 51-89=RC / 90-99=stable) // mayor.minor.hotfix.increment (for increment: 01-50=Alpha / 51-89=RC / 90-99=stable)
// xx .xxx .xx .xx // xx .xxx .xx .xx
versionCode 170100017 versionCode 170100020
versionName "17.10.0 Alpha 17" versionName "17.10.0 Alpha 20"
flavorDimensions "default" flavorDimensions "default"
renderscriptTargetApi 19 renderscriptTargetApi 19
@ -152,6 +152,7 @@ ext {
roomVersion = "2.5.2" roomVersion = "2.5.2"
workVersion = "2.8.1" workVersion = "2.8.1"
espressoVersion = "3.5.1" espressoVersion = "3.5.1"
media3_version = "1.1.1"
} }
configurations.all { configurations.all {
@ -263,7 +264,9 @@ dependencies {
implementation "com.afollestad.material-dialogs:lifecycle:${materialDialogsVersion}" implementation "com.afollestad.material-dialogs:lifecycle:${materialDialogsVersion}"
implementation 'com.google.code.gson:gson:2.10.1' implementation 'com.google.code.gson:gson:2.10.1'
implementation 'com.google.android.exoplayer:exoplayer:2.19.0'
implementation "androidx.media3:media3-exoplayer:$media3_version"
implementation "androidx.media3:media3-ui:$media3_version"
implementation 'com.github.chrisbanes:PhotoView:2.3.0' implementation 'com.github.chrisbanes:PhotoView:2.3.0'
implementation 'pl.droidsonroids.gif:android-gif-drawable:1.2.27' implementation 'pl.droidsonroids.gif:android-gif-drawable:1.2.27'
@ -273,8 +276,7 @@ dependencies {
implementation "io.noties.markwon:ext-tasklist:$markwonVersion" implementation "io.noties.markwon:ext-tasklist:$markwonVersion"
implementation 'com.github.nextcloud-deps:ImagePicker:2.1.0.2' implementation 'com.github.nextcloud-deps:ImagePicker:2.1.0.2'
implementation 'com.elyeproj.libraries:loaderviewlibrary:2.0.0' implementation 'io.github.elye:loaderviewlibrary:3.0.0'
implementation 'org.osmdroid:osmdroid-android:6.1.16' implementation 'org.osmdroid:osmdroid-android:6.1.16'
implementation ('fr.dudie:nominatim-api:3.4', { implementation ('fr.dudie:nominatim-api:3.4', {
//noinspection DuplicatePlatformClasses //noinspection DuplicatePlatformClasses
@ -284,7 +286,7 @@ dependencies {
implementation 'androidx.core:core-ktx:1.10.1' implementation 'androidx.core:core-ktx:1.10.1'
testImplementation 'junit:junit:4.13.2' testImplementation 'junit:junit:4.13.2'
testImplementation 'org.mockito:mockito-core:5.4.0' testImplementation 'org.mockito:mockito-core:5.5.0'
testImplementation 'androidx.arch.core:core-testing:2.2.0' testImplementation 'androidx.arch.core:core-testing:2.2.0'
androidTestImplementation "androidx.test:core:1.5.0" androidTestImplementation "androidx.test:core:1.5.0"

View File

@ -159,17 +159,17 @@
<activity <activity
android:name=".activities.FullScreenImageActivity" android:name=".activities.FullScreenImageActivity"
android:configChanges="orientation|keyboardHidden|screenSize" android:configChanges="orientation|keyboardHidden|screenSize"
android:theme="@style/FullScreenImageTheme"></activity> android:theme="@style/FullScreenImageTheme"/>
<activity <activity
android:name=".activities.FullScreenMediaActivity" android:name=".activities.FullScreenMediaActivity"
android:configChanges="orientation|keyboardHidden|screenSize" android:configChanges="orientation|keyboardHidden|screenSize"
android:theme="@style/FullScreenMediaTheme"></activity> android:theme="@style/FullScreenMediaTheme"/>
<activity <activity
android:name=".activities.FullScreenTextViewerActivity" android:name=".activities.FullScreenTextViewerActivity"
android:configChanges="orientation|keyboardHidden|screenSize" android:configChanges="orientation|keyboardHidden|screenSize"
android:theme="@style/FullScreenTextTheme"></activity> android:theme="@style/FullScreenTextTheme"/>
<activity <activity
android:name=".activities.TakePhotoActivity" android:name=".activities.TakePhotoActivity"

View File

@ -57,7 +57,6 @@ import android.view.ViewTreeObserver.OnGlobalLayoutListener
import android.widget.AdapterView import android.widget.AdapterView
import android.widget.FrameLayout import android.widget.FrameLayout
import android.widget.RelativeLayout import android.widget.RelativeLayout
import android.widget.Toast
import androidx.activity.result.contract.ActivityResultContracts import androidx.activity.result.contract.ActivityResultContracts
import androidx.annotation.DrawableRes import androidx.annotation.DrawableRes
import androidx.annotation.RequiresApi import androidx.annotation.RequiresApi
@ -67,6 +66,7 @@ import androidx.lifecycle.ViewModelProvider
import autodagger.AutoInjector import autodagger.AutoInjector
import com.bluelinelabs.logansquare.LoganSquare import com.bluelinelabs.logansquare.LoganSquare
import com.google.android.material.dialog.MaterialAlertDialogBuilder import com.google.android.material.dialog.MaterialAlertDialogBuilder
import com.google.android.material.snackbar.Snackbar
import com.nextcloud.talk.R import com.nextcloud.talk.R
import com.nextcloud.talk.adapters.ParticipantDisplayItem import com.nextcloud.talk.adapters.ParticipantDisplayItem
import com.nextcloud.talk.adapters.ParticipantsAdapter import com.nextcloud.talk.adapters.ParticipantsAdapter
@ -427,8 +427,11 @@ class CallActivity : CallBaseActivity() {
binding!!.callRecordingIndicator.visibility = View.VISIBLE binding!!.callRecordingIndicator.visibility = View.VISIBLE
if (viewState.showStartedInfo) { if (viewState.showStartedInfo) {
vibrateShort(context) vibrateShort(context)
Toast.makeText(context, context.resources.getString(R.string.record_active_info), Toast.LENGTH_LONG) Snackbar.make(
.show() binding!!.root,
context.resources.getString(R.string.record_active_info),
Snackbar.LENGTH_LONG
).show()
} }
} else if (viewState is RecordingStartingState) { } else if (viewState is RecordingStartingState) {
if (isAllowedToStartOrStopRecording) { if (isAllowedToStartOrStopRecording) {
@ -459,10 +462,10 @@ class CallActivity : CallBaseActivity() {
} }
} else if (viewState is RecordingErrorState) { } else if (viewState is RecordingErrorState) {
if (isAllowedToStartOrStopRecording) { if (isAllowedToStartOrStopRecording) {
Toast.makeText( Snackbar.make(
context, binding!!.root,
context.resources.getString(R.string.record_failed_info), context.resources.getString(R.string.record_failed_info),
Toast.LENGTH_LONG Snackbar.LENGTH_LONG
).show() ).show()
} }
binding!!.callRecordingIndicator.visibility = View.GONE binding!!.callRecordingIndicator.visibility = View.GONE
@ -567,10 +570,10 @@ class CallActivity : CallBaseActivity() {
} }
} else { } else {
binding!!.microphoneButton.setOnClickListener { binding!!.microphoneButton.setOnClickListener {
Toast.makeText( Snackbar.make(
context, binding!!.root,
R.string.nc_not_allowed_to_activate_audio, R.string.nc_not_allowed_to_activate_audio,
Toast.LENGTH_SHORT Snackbar.LENGTH_SHORT
).show() ).show()
} }
} }
@ -579,10 +582,10 @@ class CallActivity : CallBaseActivity() {
binding!!.cameraButton.setOnClickListener { onCameraClick() } binding!!.cameraButton.setOnClickListener { onCameraClick() }
} else { } else {
binding!!.cameraButton.setOnClickListener { binding!!.cameraButton.setOnClickListener {
Toast.makeText( Snackbar.make(
context, binding!!.root,
R.string.nc_not_allowed_to_activate_video, R.string.nc_not_allowed_to_activate_video,
Toast.LENGTH_SHORT Snackbar.LENGTH_SHORT
).show() ).show()
} }
} }
@ -612,8 +615,11 @@ class CallActivity : CallBaseActivity() {
callRecordingViewModel!!.clickRecordButton() callRecordingViewModel!!.clickRecordButton()
} }
} else { } else {
Toast.makeText(context, context.resources.getString(R.string.record_active_info), Toast.LENGTH_LONG) Snackbar.make(
.show() binding!!.root,
context.resources.getString(R.string.record_active_info),
Snackbar.LENGTH_LONG
).show()
} }
} }
binding!!.lowerHandButton.setOnClickListener { l: View? -> raiseHandViewModel!!.lowerHand() } binding!!.lowerHandButton.setOnClickListener { l: View? -> raiseHandViewModel!!.lowerHand() }
@ -1437,7 +1443,7 @@ class CallActivity : CallBaseActivity() {
} }
override fun onError(e: Throwable) { override fun onError(e: Throwable) {
Toast.makeText(context, R.string.nc_common_error_sorry, Toast.LENGTH_LONG).show() Snackbar.make(binding!!.root, R.string.nc_common_error_sorry, Snackbar.LENGTH_LONG).show()
Log.e(TAG, "Failed to fetch capabilities", e) Log.e(TAG, "Failed to fetch capabilities", e)
// unused atm // unused atm
} }
@ -1632,10 +1638,10 @@ class CallActivity : CallBaseActivity() {
private fun showCallRunningSinceOneHourOrMoreInfo() { private fun showCallRunningSinceOneHourOrMoreInfo() {
binding!!.callDuration.setTypeface(null, Typeface.BOLD) binding!!.callDuration.setTypeface(null, Typeface.BOLD)
vibrateShort(context) vibrateShort(context)
Toast.makeText( Snackbar.make(
context, binding!!.root,
context.resources.getString(R.string.call_running_since_one_hour), context.resources.getString(R.string.call_running_since_one_hour),
Toast.LENGTH_LONG Snackbar.LENGTH_LONG
).show() ).show()
} }
@ -1909,7 +1915,7 @@ class CallActivity : CallBaseActivity() {
} }
override fun onError(e: Throwable) { override fun onError(e: Throwable) {
Toast.makeText(context, R.string.nc_common_error_sorry, Toast.LENGTH_LONG).show() Snackbar.make(binding!!.root, R.string.nc_common_error_sorry, Snackbar.LENGTH_LONG).show()
Log.e(TAG, "Error while leaving the call", e) Log.e(TAG, "Error while leaving the call", e)
} }
@ -2091,10 +2097,10 @@ class CallActivity : CallBaseActivity() {
} else { } else {
if (peerConnectionFactory == null) { if (peerConnectionFactory == null) {
Log.e(TAG, "peerConnectionFactory was null in getOrCreatePeerConnectionWrapperForSessionIdAndType") Log.e(TAG, "peerConnectionFactory was null in getOrCreatePeerConnectionWrapperForSessionIdAndType")
Toast.makeText( Snackbar.make(
context, binding!!.root,
context.resources.getString(R.string.nc_common_error_sorry), context.resources.getString(R.string.nc_common_error_sorry),
Toast.LENGTH_LONG Snackbar.LENGTH_LONG
).show() ).show()
hangup(true) hangup(true)
return null return null
@ -2723,10 +2729,10 @@ class CallActivity : CallBaseActivity() {
} }
raisedHand = true raisedHand = true
val nick = callParticipantModel.nick val nick = callParticipantModel.nick
Toast.makeText( Snackbar.make(
context, binding!!.root,
String.format(context.resources.getString(R.string.nc_call_raised_hand), nick), String.format(context.resources.getString(R.string.nc_call_raised_hand), nick),
Toast.LENGTH_LONG Snackbar.LENGTH_LONG
).show() ).show()
} }

View File

@ -32,9 +32,9 @@ import android.util.Log
import android.view.Menu import android.view.Menu
import android.view.MenuItem import android.view.MenuItem
import android.view.View import android.view.View
import android.widget.Toast
import androidx.appcompat.app.AppCompatActivity import androidx.appcompat.app.AppCompatActivity
import androidx.core.content.FileProvider import androidx.core.content.FileProvider
import com.google.android.material.snackbar.Snackbar
import com.nextcloud.talk.BuildConfig import com.nextcloud.talk.BuildConfig
import com.nextcloud.talk.R import com.nextcloud.talk.R
import com.nextcloud.talk.databinding.ActivityFullScreenImageBinding import com.nextcloud.talk.databinding.ActivityFullScreenImageBinding
@ -133,7 +133,7 @@ class FullScreenImageActivity : AppCompatActivity() {
// info that 100MB is the limit comes from https://stackoverflow.com/a/53334563 // info that 100MB is the limit comes from https://stackoverflow.com/a/53334563
if (bitmapSize > HUNDRED_MB) { if (bitmapSize > HUNDRED_MB) {
Log.e(TAG, "bitmap will be too large to display. It won't be displayed to avoid RuntimeException") Log.e(TAG, "bitmap will be too large to display. It won't be displayed to avoid RuntimeException")
Toast.makeText(this, R.string.nc_common_error_sorry, Toast.LENGTH_LONG).show() Snackbar.make(binding.root, R.string.nc_common_error_sorry, Snackbar.LENGTH_LONG).show()
} else { } else {
binding.photoView.setImageBitmap(bitmap) binding.photoView.setImageBitmap(bitmap)
} }

View File

@ -4,9 +4,11 @@
* @author Marcel Hibbe * @author Marcel Hibbe
* @author Andy Scherzinger * @author Andy Scherzinger
* @author Ezhil Shanmugham * @author Ezhil Shanmugham
* @author Parneet Singh
* Copyright (C) 2021 Andy Scherzinger <info@andy-scherzinger.de> * Copyright (C) 2021 Andy Scherzinger <info@andy-scherzinger.de>
* Copyright (C) 2021 Marcel Hibbe <dev@mhibbe.de> * Copyright (C) 2021 Marcel Hibbe <dev@mhibbe.de>
* Copyright (C) 2023 Ezhil Shanmugham <ezhil56x.contact@gmail.com> * Copyright (C) 2023 Ezhil Shanmugham <ezhil56x.contact@gmail.com>
* Copyright (c) 2023 Parneet Singh <gurayaparneet@gmail.com>
* *
* This program is free software: you can redistribute it and/or modify * 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 * it under the terms of the GNU General Public License as published by
@ -30,13 +32,15 @@ import android.view.Menu
import android.view.MenuItem import android.view.MenuItem
import android.view.View import android.view.View
import android.view.WindowManager import android.view.WindowManager
import androidx.annotation.OptIn
import androidx.appcompat.app.AppCompatActivity import androidx.appcompat.app.AppCompatActivity
import androidx.core.content.FileProvider import androidx.core.content.FileProvider
import androidx.media3.common.MediaItem
import androidx.media3.common.Player
import androidx.media3.common.util.UnstableApi
import androidx.media3.exoplayer.ExoPlayer
import androidx.media3.ui.PlayerView
import autodagger.AutoInjector import autodagger.AutoInjector
import com.google.android.exoplayer2.MediaItem
import com.google.android.exoplayer2.Player
import com.google.android.exoplayer2.SimpleExoPlayer
import com.google.android.exoplayer2.ui.StyledPlayerView
import com.nextcloud.talk.BuildConfig import com.nextcloud.talk.BuildConfig
import com.nextcloud.talk.R import com.nextcloud.talk.R
import com.nextcloud.talk.application.NextcloudTalkApplication import com.nextcloud.talk.application.NextcloudTalkApplication
@ -49,7 +53,10 @@ class FullScreenMediaActivity : AppCompatActivity(), Player.Listener {
lateinit var binding: ActivityFullScreenMediaBinding lateinit var binding: ActivityFullScreenMediaBinding
private lateinit var path: String private lateinit var path: String
private lateinit var player: SimpleExoPlayer private var player: ExoPlayer? = null
private var playWhenReadyState: Boolean = true
private var playBackPosition: Long = 0L
override fun onCreateOptionsMenu(menu: Menu): Boolean { override fun onCreateOptionsMenu(menu: Menu): Boolean {
menuInflater.inflate(R.menu.menu_preview, menu) menuInflater.inflate(R.menu.menu_preview, menu)
@ -81,6 +88,7 @@ class FullScreenMediaActivity : AppCompatActivity(), Player.Listener {
} }
} }
@OptIn(UnstableApi::class)
override fun onCreate(savedInstanceState: Bundle?) { override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState) super.onCreate(savedInstanceState)
@ -104,7 +112,7 @@ class FullScreenMediaActivity : AppCompatActivity(), Player.Listener {
} }
binding.playerView.setControllerVisibilityListener( binding.playerView.setControllerVisibilityListener(
StyledPlayerView.ControllerVisibilityListener { v -> PlayerView.ControllerVisibilityListener { v ->
if (v != 0) { if (v != 0) {
hideSystemUI() hideSystemUI()
supportActionBar?.hide() supportActionBar?.hide()
@ -119,11 +127,7 @@ class FullScreenMediaActivity : AppCompatActivity(), Player.Listener {
override fun onStart() { override fun onStart() {
super.onStart() super.onStart()
initializePlayer() initializePlayer()
preparePlayer()
val mediaItem: MediaItem = MediaItem.fromUri(path)
player.setMediaItem(mediaItem)
player.prepare()
player.play()
} }
override fun onStop() { override fun onStop() {
@ -132,14 +136,28 @@ class FullScreenMediaActivity : AppCompatActivity(), Player.Listener {
} }
private fun initializePlayer() { private fun initializePlayer() {
player = SimpleExoPlayer.Builder(applicationContext).build() player = ExoPlayer.Builder(applicationContext).build()
binding.playerView.player = player binding.playerView.player = player
player.playWhenReady = true player?.addListener(this)
player.addListener(this) }
private fun preparePlayer() {
val mediaItem: MediaItem = MediaItem.fromUri(path)
player?.let { exoPlayer ->
exoPlayer.setMediaItem(mediaItem)
exoPlayer.playWhenReady = playWhenReadyState
exoPlayer.seekTo(playBackPosition)
exoPlayer.prepare()
}
} }
private fun releasePlayer() { private fun releasePlayer() {
player.release() player?.let { exoPlayer ->
playBackPosition = exoPlayer.currentPosition
playWhenReadyState = exoPlayer.playWhenReady
exoPlayer.release()
}
player = null
} }
private fun hideSystemUI() { private fun hideSystemUI() {

View File

@ -37,8 +37,7 @@ import android.view.OrientationEventListener;
import android.view.ScaleGestureDetector; import android.view.ScaleGestureDetector;
import android.view.Surface; import android.view.Surface;
import android.view.View; import android.view.View;
import android.widget.Toast; import com.google.android.material.snackbar.Snackbar;
import com.google.common.util.concurrent.ListenableFuture; import com.google.common.util.concurrent.ListenableFuture;
import com.nextcloud.talk.R; import com.nextcloud.talk.R;
import com.nextcloud.talk.application.NextcloudTalkApplication; import com.nextcloud.talk.application.NextcloudTalkApplication;
@ -234,7 +233,7 @@ public class TakePhotoActivity extends AppCompatActivity {
binding.photoPreview.setMediumScale(MEDIUM_SCALE); binding.photoPreview.setMediumScale(MEDIUM_SCALE);
} catch (IllegalArgumentException | ExecutionException | InterruptedException e) { } catch (IllegalArgumentException | ExecutionException | InterruptedException e) {
Log.e(TAG, "Error taking picture", e); Log.e(TAG, "Error taking picture", e);
Toast.makeText(this, e.getMessage(), Toast.LENGTH_LONG).show(); Snackbar.make(binding.getRoot(), e.getMessage(), Snackbar.LENGTH_LONG).show();
finish(); finish();
} }
}, ContextCompat.getMainExecutor(this)); }, ContextCompat.getMainExecutor(this));
@ -326,7 +325,7 @@ public class TakePhotoActivity extends AppCompatActivity {
}); });
} catch (Exception e) { } catch (Exception e) {
Log.e(TAG, "error while taking picture", e); Log.e(TAG, "error while taking picture", e);
Toast.makeText(this, R.string.take_photo_error_deleting_picture, Toast.LENGTH_SHORT).show(); Snackbar.make(binding.getRoot(), R.string.take_photo_error_deleting_picture, Snackbar.LENGTH_SHORT).show();
} }
}); });

View File

@ -37,9 +37,9 @@ import android.view.MotionEvent
import android.view.View import android.view.View
import android.webkit.WebView import android.webkit.WebView
import android.webkit.WebViewClient import android.webkit.WebViewClient
import android.widget.Toast
import autodagger.AutoInjector import autodagger.AutoInjector
import coil.load import coil.load
import com.google.android.material.snackbar.Snackbar
import com.nextcloud.talk.R import com.nextcloud.talk.R
import com.nextcloud.talk.application.NextcloudTalkApplication import com.nextcloud.talk.application.NextcloudTalkApplication
import com.nextcloud.talk.application.NextcloudTalkApplication.Companion.sharedApplication import com.nextcloud.talk.application.NextcloudTalkApplication.Companion.sharedApplication
@ -263,7 +263,7 @@ class IncomingLocationMessageViewHolder(incomingView: View, payload: Any) :
browserIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK) browserIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
context.startActivity(browserIntent) context.startActivity(browserIntent)
} else { } else {
Toast.makeText(context, R.string.nc_common_error_sorry, Toast.LENGTH_LONG).show() Snackbar.make(binding.root, R.string.nc_common_error_sorry, Snackbar.LENGTH_LONG).show()
Log.e(TAG, "locationGeoLink was null or empty") Log.e(TAG, "locationGeoLink was null or empty")
} }
} }

View File

@ -32,12 +32,11 @@ import android.view.MotionEvent
import android.view.View import android.view.View
import android.webkit.WebView import android.webkit.WebView
import android.webkit.WebViewClient import android.webkit.WebViewClient
import android.widget.Toast
import androidx.appcompat.content.res.AppCompatResources import androidx.appcompat.content.res.AppCompatResources
import autodagger.AutoInjector import autodagger.AutoInjector
import coil.load import coil.load
import com.google.android.flexbox.FlexboxLayout import com.google.android.flexbox.FlexboxLayout
import com.nextcloud.android.common.ui.theme.utils.ColorRole import com.google.android.material.snackbar.Snackbar
import com.nextcloud.talk.R import com.nextcloud.talk.R
import com.nextcloud.talk.application.NextcloudTalkApplication import com.nextcloud.talk.application.NextcloudTalkApplication
import com.nextcloud.talk.application.NextcloudTalkApplication.Companion.sharedApplication import com.nextcloud.talk.application.NextcloudTalkApplication.Companion.sharedApplication
@ -45,6 +44,7 @@ import com.nextcloud.talk.databinding.ItemCustomOutcomingLocationMessageBinding
import com.nextcloud.talk.models.json.chat.ChatMessage import com.nextcloud.talk.models.json.chat.ChatMessage
import com.nextcloud.talk.models.json.chat.ReadStatus import com.nextcloud.talk.models.json.chat.ReadStatus
import com.nextcloud.talk.ui.theme.ViewThemeUtils import com.nextcloud.talk.ui.theme.ViewThemeUtils
import com.nextcloud.android.common.ui.theme.utils.ColorRole
import com.nextcloud.talk.utils.ApiUtils import com.nextcloud.talk.utils.ApiUtils
import com.nextcloud.talk.utils.DateUtils import com.nextcloud.talk.utils.DateUtils
import com.nextcloud.talk.utils.UriUtils import com.nextcloud.talk.utils.UriUtils
@ -249,7 +249,7 @@ class OutcomingLocationMessageViewHolder(incomingView: View) :
browserIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK) browserIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
context.startActivity(browserIntent) context.startActivity(browserIntent)
} else { } else {
Toast.makeText(context, R.string.nc_common_error_sorry, Toast.LENGTH_LONG).show() Snackbar.make(binding.root, R.string.nc_common_error_sorry, Snackbar.LENGTH_LONG).show()
Log.e(TAG, "locationGeoLink was null or empty") Log.e(TAG, "locationGeoLink was null or empty")
} }
} }

View File

@ -30,11 +30,11 @@ import android.os.Handler
import android.os.Looper import android.os.Looper
import android.util.Log import android.util.Log
import android.view.View import android.view.View
import android.widget.Toast
import androidx.annotation.RequiresApi import androidx.annotation.RequiresApi
import androidx.core.app.NotificationManagerCompat import androidx.core.app.NotificationManagerCompat
import androidx.lifecycle.ViewModelProvider import androidx.lifecycle.ViewModelProvider
import autodagger.AutoInjector import autodagger.AutoInjector
import com.google.android.material.snackbar.Snackbar
import com.nextcloud.talk.R import com.nextcloud.talk.R
import com.nextcloud.talk.activities.CallActivity import com.nextcloud.talk.activities.CallActivity
import com.nextcloud.talk.activities.CallBaseActivity import com.nextcloud.talk.activities.CallBaseActivity
@ -210,7 +210,7 @@ class CallNotificationActivity : CallBaseActivity() {
} }
is CallNotificationViewModel.GetRoomErrorState -> { is CallNotificationViewModel.GetRoomErrorState -> {
Toast.makeText(context, R.string.nc_common_error_sorry, Toast.LENGTH_LONG).show() Snackbar.make(binding!!.root, R.string.nc_common_error_sorry, Snackbar.LENGTH_LONG).show()
} }
else -> {} else -> {}

View File

@ -83,7 +83,6 @@ import android.widget.RelativeLayout.BELOW
import android.widget.RelativeLayout.LayoutParams import android.widget.RelativeLayout.LayoutParams
import android.widget.SeekBar import android.widget.SeekBar
import android.widget.TextView import android.widget.TextView
import android.widget.Toast
import androidx.activity.OnBackPressedCallback import androidx.activity.OnBackPressedCallback
import androidx.appcompat.app.AlertDialog import androidx.appcompat.app.AlertDialog
import androidx.appcompat.view.ContextThemeWrapper import androidx.appcompat.view.ContextThemeWrapper
@ -114,6 +113,7 @@ import coil.transform.CircleCropTransformation
import com.google.android.flexbox.FlexboxLayout import com.google.android.flexbox.FlexboxLayout
import com.google.android.material.button.MaterialButton import com.google.android.material.button.MaterialButton
import com.google.android.material.dialog.MaterialAlertDialogBuilder import com.google.android.material.dialog.MaterialAlertDialogBuilder
import com.google.android.material.snackbar.Snackbar
import com.nextcloud.android.common.ui.theme.utils.ColorRole import com.nextcloud.android.common.ui.theme.utils.ColorRole
import com.nextcloud.talk.BuildConfig import com.nextcloud.talk.BuildConfig
import com.nextcloud.talk.R import com.nextcloud.talk.R
@ -348,6 +348,7 @@ class ChatActivity :
AudioFormat.CHANNEL_IN_MONO, AudioFormat.CHANNEL_IN_MONO,
AudioFormat.ENCODING_PCM_16BIT AudioFormat.ENCODING_PCM_16BIT
) )
private var voiceRecordDuration = 0L
// messy workaround for a mediaPlayer bug, don't delete // messy workaround for a mediaPlayer bug, don't delete
private var lastRecordMediaPosition: Int = 0 private var lastRecordMediaPosition: Int = 0
@ -568,7 +569,7 @@ class ChatActivity :
} }
is ChatViewModel.GetRoomErrorState -> { is ChatViewModel.GetRoomErrorState -> {
Toast.makeText(context, R.string.nc_common_error_sorry, Toast.LENGTH_LONG).show() Snackbar.make(binding.root, R.string.nc_common_error_sorry, Snackbar.LENGTH_LONG).show()
} }
else -> {} else -> {}
@ -612,7 +613,7 @@ class ChatActivity :
} }
is ChatViewModel.JoinRoomErrorState -> { is ChatViewModel.JoinRoomErrorState -> {
Toast.makeText(context, R.string.nc_common_error_sorry, Toast.LENGTH_LONG).show() Snackbar.make(binding.root, R.string.nc_common_error_sorry, Snackbar.LENGTH_LONG).show()
} }
else -> {} else -> {}
@ -1003,7 +1004,11 @@ class ChatActivity :
@SuppressLint("ClickableViewAccessibility") @SuppressLint("ClickableViewAccessibility")
private fun initVoiceRecordButton() { private fun initVoiceRecordButton() {
if (!isVoiceRecordingLocked) { if (!isVoiceRecordingLocked) {
showMicrophoneButton(true) if (binding.messageInputView.messageInput.text!!.isNotEmpty()) {
showMicrophoneButton(false)
} else {
showMicrophoneButton(true)
}
} else if (isVoiceRecordingInProgress) { } else if (isVoiceRecordingInProgress) {
binding.messageInputView.playPauseBtn.visibility = View.GONE binding.messageInputView.playPauseBtn.visibility = View.GONE
binding.messageInputView.seekBar.visibility = View.GONE binding.messageInputView.seekBar.visibility = View.GONE
@ -1163,13 +1168,13 @@ class ChatActivity :
showRecordAudioUi(false) showRecordAudioUi(false)
voiceRecordEndTime = System.currentTimeMillis() voiceRecordEndTime = System.currentTimeMillis()
val voiceRecordDuration = voiceRecordEndTime - voiceRecordStartTime voiceRecordDuration = voiceRecordEndTime - voiceRecordStartTime
if (voiceRecordDuration < MINIMUM_VOICE_RECORD_DURATION) { if (voiceRecordDuration < MINIMUM_VOICE_RECORD_DURATION) {
Log.d(TAG, "voiceRecordDuration: $voiceRecordDuration") Log.d(TAG, "voiceRecordDuration: $voiceRecordDuration")
Toast.makeText( Snackbar.make(
context, binding.root,
context.getString(R.string.nc_voice_message_hold_to_record_info), context.getString(R.string.nc_voice_message_hold_to_record_info),
Toast.LENGTH_SHORT Snackbar.LENGTH_SHORT
).show() ).show()
stopAndDiscardAudioRecording() stopAndDiscardAudioRecording()
return true return true
@ -1676,16 +1681,16 @@ class ChatActivity :
if (conversationUser != null) { if (conversationUser != null) {
runOnUiThread { runOnUiThread {
if (currentConversation?.objectType == ObjectType.ROOM) { if (currentConversation?.objectType == ObjectType.ROOM) {
Toast.makeText( Snackbar.make(
context, binding.root,
context.resources.getString(R.string.switch_to_main_room), context.resources.getString(R.string.switch_to_main_room),
Toast.LENGTH_LONG Snackbar.LENGTH_LONG
).show() ).show()
} else { } else {
Toast.makeText( Snackbar.make(
context, binding.root,
context.resources.getString(R.string.switch_to_breakout_room), context.resources.getString(R.string.switch_to_breakout_room),
Toast.LENGTH_LONG Snackbar.LENGTH_LONG
).show() ).show()
} }
} }
@ -1847,7 +1852,7 @@ class ChatActivity :
} }
} catch (e: Exception) { } catch (e: Exception) {
Log.e(TAG, "failed to initialize mediaPlayer", e) Log.e(TAG, "failed to initialize mediaPlayer", e)
Toast.makeText(context, R.string.nc_common_error_sorry, Toast.LENGTH_LONG).show() Snackbar.make(binding.root, R.string.nc_common_error_sorry, Snackbar.LENGTH_LONG).show()
} }
} }
} }
@ -2075,6 +2080,7 @@ class ChatActivity :
try { try {
start() start()
Log.d(TAG, "recording started")
isVoiceRecordingInProgress = true isVoiceRecordingInProgress = true
} catch (e: IllegalStateException) { } catch (e: IllegalStateException) {
Log.e(TAG, "start for audio recording failed") Log.e(TAG, "start for audio recording failed")
@ -2087,15 +2093,16 @@ class ChatActivity :
private fun stopAndSendAudioRecording() { private fun stopAndSendAudioRecording() {
if (isVoiceRecordingInProgress) { if (isVoiceRecordingInProgress) {
stopAudioRecording() stopAudioRecording()
Log.d(TAG, "stopped and sent audio recording")
val uri = Uri.fromFile(File(currentVoiceRecordFile))
uploadFile(uri.toString(), true)
} }
val uri = Uri.fromFile(File(currentVoiceRecordFile))
uploadFile(uri.toString(), true)
} }
private fun stopAndDiscardAudioRecording() { private fun stopAndDiscardAudioRecording() {
if (isVoiceRecordingInProgress) { if (isVoiceRecordingInProgress) {
stopAudioRecording() stopAudioRecording()
Log.d(TAG, "stopped and discarded audio recording")
} }
val cachedFile = File(currentVoiceRecordFile) val cachedFile = File(currentVoiceRecordFile)
@ -2109,12 +2116,17 @@ class ChatActivity :
recorder?.apply { recorder?.apply {
try { try {
stop() Log.d(TAG, "recording stopped with $voiceRecordDuration")
if (voiceRecordDuration > MINIMUM_VOICE_RECORD_TO_STOP) {
stop()
}
release() release()
isVoiceRecordingInProgress = false isVoiceRecordingInProgress = false
Log.d(TAG, "stopped recorder. isVoiceRecordingInProgress = false") Log.d(TAG, "stopped recorder. isVoiceRecordingInProgress = false")
} catch (e: java.lang.IllegalStateException) { } catch (e: java.lang.IllegalStateException) {
error("error while stopping recorder!" + e) error("error while stopping recorder!" + e)
} catch (e: java.lang.RuntimeException) {
error("error while stopping recorder!" + e)
} }
VibrationUtils.vibrateShort(context) VibrationUtils.vibrateShort(context)
@ -2365,12 +2377,22 @@ class ChatActivity :
) )
} }
} catch (e: IllegalStateException) { } catch (e: IllegalStateException) {
Toast.makeText(context, context.resources?.getString(R.string.nc_upload_failed), Toast.LENGTH_LONG) context.resources?.getString(R.string.nc_upload_failed)?.let {
.show() Snackbar.make(
binding.root,
it,
Snackbar.LENGTH_LONG
).show()
}
Log.e(javaClass.simpleName, "Something went wrong when trying to upload file", e) Log.e(javaClass.simpleName, "Something went wrong when trying to upload file", e)
} catch (e: IllegalArgumentException) { } catch (e: IllegalArgumentException) {
Toast.makeText(context, context.resources?.getString(R.string.nc_upload_failed), Toast.LENGTH_LONG) context.resources?.getString(R.string.nc_upload_failed)?.let {
.show() Snackbar.make(
binding.root,
it,
Snackbar.LENGTH_LONG
).show()
}
Log.e(javaClass.simpleName, "Something went wrong when trying to upload file", e) Log.e(javaClass.simpleName, "Something went wrong when trying to upload file", e)
} }
} }
@ -2420,20 +2442,22 @@ class ChatActivity :
UploadAndShareFilesWorker.requestStoragePermission(this) UploadAndShareFilesWorker.requestStoragePermission(this)
} }
} catch (e: IllegalStateException) { } catch (e: IllegalStateException) {
Toast.makeText( Snackbar.make(
context, binding.root,
context.resources?.getString(R.string.nc_upload_failed), R.string.nc_upload_failed,
Toast.LENGTH_LONG Snackbar.LENGTH_LONG
) )
.show() .show()
Log.e(javaClass.simpleName, "Something went wrong when trying to upload file", e) Log.e(javaClass.simpleName, "Something went wrong when trying to upload file", e)
} catch (e: IllegalArgumentException) { } catch (e: IllegalArgumentException) {
Toast.makeText( context.resources?.getString(R.string.nc_upload_failed)?.let {
context, Snackbar.make(
context.resources?.getString(R.string.nc_upload_failed), binding.root,
Toast.LENGTH_LONG it,
) Snackbar.LENGTH_LONG
.show() )
.show()
}
Log.e(javaClass.simpleName, "Something went wrong when trying to upload file", e) Log.e(javaClass.simpleName, "Something went wrong when trying to upload file", e)
} }
} }
@ -2489,28 +2513,28 @@ class ChatActivity :
uploadFiles(filesToUpload) uploadFiles(filesToUpload)
} }
} else { } else {
Toast Snackbar
.makeText(context, context.getString(R.string.read_storage_no_permission), Toast.LENGTH_LONG) .make(binding.root, context.getString(R.string.read_storage_no_permission), Snackbar.LENGTH_LONG)
.show() .show()
} }
} else if (requestCode == REQUEST_SHARE_FILE_PERMISSION) { } else if (requestCode == REQUEST_SHARE_FILE_PERMISSION) {
if (grantResults.isNotEmpty() && grantResults[0] == PackageManager.PERMISSION_GRANTED) { if (grantResults.isNotEmpty() && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
showLocalFilePicker() showLocalFilePicker()
} else { } else {
Toast.makeText( Snackbar.make(
context, binding.root,
context.getString(R.string.nc_file_storage_permission), context.getString(R.string.nc_file_storage_permission),
Toast.LENGTH_LONG Snackbar.LENGTH_LONG
).show() ).show()
} }
} else if (requestCode == REQUEST_RECORD_AUDIO_PERMISSION) { } else if (requestCode == REQUEST_RECORD_AUDIO_PERMISSION) {
if (grantResults.isNotEmpty() && grantResults[0] == PackageManager.PERMISSION_GRANTED) { if (grantResults.isNotEmpty() && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
// do nothing. user will tap on the microphone again if he wants to record audio.. // do nothing. user will tap on the microphone again if he wants to record audio..
} else { } else {
Toast.makeText( Snackbar.make(
context, binding.root,
context.getString(R.string.nc_voice_message_missing_audio_permission), context.getString(R.string.nc_voice_message_missing_audio_permission),
Toast.LENGTH_LONG Snackbar.LENGTH_LONG
).show() ).show()
} }
} else if (requestCode == REQUEST_READ_CONTACT_PERMISSION) { } else if (requestCode == REQUEST_READ_CONTACT_PERMISSION) {
@ -2518,20 +2542,20 @@ class ChatActivity :
val intent = Intent(Intent.ACTION_PICK, ContactsContract.Contacts.CONTENT_URI) val intent = Intent(Intent.ACTION_PICK, ContactsContract.Contacts.CONTENT_URI)
startActivityForResult(intent, REQUEST_CODE_SELECT_CONTACT) startActivityForResult(intent, REQUEST_CODE_SELECT_CONTACT)
} else { } else {
Toast.makeText( Snackbar.make(
context, binding.root,
context.getString(R.string.nc_share_contact_permission), context.getString(R.string.nc_share_contact_permission),
Toast.LENGTH_LONG Snackbar.LENGTH_LONG
).show() ).show()
} }
} else if (requestCode == REQUEST_CAMERA_PERMISSION) { } else if (requestCode == REQUEST_CAMERA_PERMISSION) {
if (grantResults.isNotEmpty() && grantResults[0] == PackageManager.PERMISSION_GRANTED) { if (grantResults.isNotEmpty() && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
Toast Snackbar
.makeText(context, context.getString(R.string.camera_permission_granted), Toast.LENGTH_LONG) .make(binding.root, context.getString(R.string.camera_permission_granted), Snackbar.LENGTH_LONG)
.show() .show()
} else { } else {
Toast Snackbar
.makeText(context, context.getString(R.string.take_photo_permission), Toast.LENGTH_LONG) .make(binding.root, context.getString(R.string.take_photo_permission), Snackbar.LENGTH_LONG)
.show() .show()
} }
} }
@ -2564,7 +2588,10 @@ class ChatActivity :
metaData metaData
) )
} catch (e: IllegalArgumentException) { } catch (e: IllegalArgumentException) {
Toast.makeText(context, context.resources?.getString(R.string.nc_upload_failed), Toast.LENGTH_LONG).show() context.resources?.getString(R.string.nc_upload_failed)?.let {
Snackbar.make(binding.root, it, Snackbar.LENGTH_LONG)
.show()
}
Log.e(javaClass.simpleName, "Something went wrong when trying to upload file", e) Log.e(javaClass.simpleName, "Something went wrong when trying to upload file", e)
} }
} }
@ -3565,7 +3592,7 @@ class ChatActivity :
if (conversationUser != null) { if (conversationUser != null) {
val pp = ParticipantPermissions(conversationUser!!, it) val pp = ParticipantPermissions(conversationUser!!, it)
if (!pp.canStartCall() && currentConversation?.hasCall == false) { if (!pp.canStartCall() && currentConversation?.hasCall == false) {
Toast.makeText(context, R.string.startCallForbidden, Toast.LENGTH_LONG).show() Snackbar.make(binding.root, R.string.startCallForbidden, Snackbar.LENGTH_LONG).show()
} else { } else {
ApplicationWideCurrentRoomHolder.getInstance().isDialing = true ApplicationWideCurrentRoomHolder.getInstance().isDialing = true
val callIntent = getIntentForCall(isVoiceOnlyCall, callWithoutNotification) val callIntent = getIntentForCall(isVoiceOnlyCall, callWithoutNotification)
@ -3726,7 +3753,7 @@ class ChatActivity :
"Deletion of message is skipped because of restrictions by permissions. " + "Deletion of message is skipped because of restrictions by permissions. " +
"This method should not have been called!" "This method should not have been called!"
) )
Toast.makeText(context, R.string.nc_common_error_sorry, Toast.LENGTH_LONG).show() Snackbar.make(binding.root, R.string.nc_common_error_sorry, Snackbar.LENGTH_LONG).show()
} else { } else {
var apiVersion = 1 var apiVersion = 1
// FIXME Fix API checking with guests? // FIXME Fix API checking with guests?
@ -3751,10 +3778,10 @@ class ChatActivity :
override fun onNext(t: ChatOverallSingleMessage) { override fun onNext(t: ChatOverallSingleMessage) {
if (t.ocs!!.meta!!.statusCode == HttpURLConnection.HTTP_ACCEPTED) { if (t.ocs!!.meta!!.statusCode == HttpURLConnection.HTTP_ACCEPTED) {
Toast.makeText( Snackbar.make(
context, binding.root,
R.string.nc_delete_message_leaked_to_matterbridge, R.string.nc_delete_message_leaked_to_matterbridge,
Toast.LENGTH_LONG Snackbar.LENGTH_LONG
).show() ).show()
} }
} }
@ -3766,7 +3793,7 @@ class ChatActivity :
message?.id, message?.id,
e e
) )
Toast.makeText(context, R.string.nc_common_error_sorry, Toast.LENGTH_LONG).show() Snackbar.make(binding.root, R.string.nc_common_error_sorry, Snackbar.LENGTH_LONG).show()
} }
override fun onComplete() { override fun onComplete() {
@ -3956,9 +3983,11 @@ class ChatActivity :
private fun showMicrophoneButton(show: Boolean) { private fun showMicrophoneButton(show: Boolean) {
if (show && CapabilitiesUtilNew.hasSpreedFeatureCapability(conversationUser, "voice-message-sharing")) { if (show && CapabilitiesUtilNew.hasSpreedFeatureCapability(conversationUser, "voice-message-sharing")) {
Log.d(TAG, "Microphone shown")
binding.messageInputView.messageSendButton.visibility = View.GONE binding.messageInputView.messageSendButton.visibility = View.GONE
binding.messageInputView.recordAudioButton.visibility = View.VISIBLE binding.messageInputView.recordAudioButton.visibility = View.VISIBLE
} else { } else {
Log.d(TAG, "Microphone hidden")
binding.messageInputView.messageSendButton.visibility = View.VISIBLE binding.messageInputView.messageSendButton.visibility = View.VISIBLE
binding.messageInputView.recordAudioButton.visibility = View.GONE binding.messageInputView.recordAudioButton.visibility = View.GONE
} }
@ -4126,7 +4155,7 @@ class ChatActivity :
override fun onError(e: Throwable) { override fun onError(e: Throwable) {
Log.e(TAG, "error after clicking on user mention chip", e) Log.e(TAG, "error after clicking on user mention chip", e)
Toast.makeText(context, R.string.nc_common_error_sorry, Toast.LENGTH_LONG).show() Snackbar.make(binding.root, R.string.nc_common_error_sorry, Snackbar.LENGTH_LONG).show()
} }
override fun onComplete() { override fun onComplete() {
@ -4160,7 +4189,7 @@ class ChatActivity :
) )
File("$outputDir/$videoName$VIDEO_SUFFIX") File("$outputDir/$videoName$VIDEO_SUFFIX")
} catch (e: IOException) { } catch (e: IOException) {
Toast.makeText(context, R.string.nc_common_error_sorry, Toast.LENGTH_LONG).show() Snackbar.make(binding.root, R.string.nc_common_error_sorry, Snackbar.LENGTH_LONG).show()
Log.e(TAG, "error while creating video file", e) Log.e(TAG, "error while creating video file", e)
null null
} }
@ -4226,6 +4255,7 @@ class ChatActivity :
private const val REQUEST_CODE_SELECT_REMOTE_FILES = 888 private const val REQUEST_CODE_SELECT_REMOTE_FILES = 888
private const val OBJECT_MESSAGE: String = "{object}" private const val OBJECT_MESSAGE: String = "{object}"
private const val MINIMUM_VOICE_RECORD_DURATION: Int = 1000 private const val MINIMUM_VOICE_RECORD_DURATION: Int = 1000
private const val MINIMUM_VOICE_RECORD_TO_STOP: Int = 200
private const val VOICE_RECORD_CANCEL_SLIDER_X: Int = -50 private const val VOICE_RECORD_CANCEL_SLIDER_X: Int = -50
private const val VOICE_RECORD_LOCK_BUTTON_Y: Int = -130 private const val VOICE_RECORD_LOCK_BUTTON_Y: Int = -130
private const val VOICE_MESSAGE_META_DATA = "{\"messageType\":\"voice-message\"}" private const val VOICE_MESSAGE_META_DATA = "{\"messageType\":\"voice-message\"}"

View File

@ -29,7 +29,6 @@ import android.os.Handler
import android.text.TextUtils import android.text.TextUtils
import android.util.Log import android.util.Log
import android.view.View import android.view.View
import android.widget.Toast
import androidx.work.Data import androidx.work.Data
import androidx.work.OneTimeWorkRequest import androidx.work.OneTimeWorkRequest
import androidx.work.WorkManager import androidx.work.WorkManager
@ -37,6 +36,7 @@ import autodagger.AutoInjector
import com.bluelinelabs.conductor.RouterTransaction import com.bluelinelabs.conductor.RouterTransaction
import com.bluelinelabs.conductor.changehandler.HorizontalChangeHandler import com.bluelinelabs.conductor.changehandler.HorizontalChangeHandler
import com.bluelinelabs.logansquare.LoganSquare import com.bluelinelabs.logansquare.LoganSquare
import com.google.android.material.snackbar.Snackbar
import com.nextcloud.talk.R import com.nextcloud.talk.R
import com.nextcloud.talk.api.NcApi import com.nextcloud.talk.api.NcApi
import com.nextcloud.talk.application.NextcloudTalkApplication import com.nextcloud.talk.application.NextcloudTalkApplication
@ -474,7 +474,7 @@ class AccountVerificationController(args: Bundle? = null) : BaseController(
} }
} else { } else {
Log.e(TAG, "failed to set active user") Log.e(TAG, "failed to set active user")
Toast.makeText(context, R.string.nc_common_error_sorry, Toast.LENGTH_LONG).show() Snackbar.make(binding!!.root, R.string.nc_common_error_sorry, Snackbar.LENGTH_LONG).show()
} }
} }
} }

View File

@ -39,7 +39,6 @@ import android.view.MenuItem
import android.view.View import android.view.View
import android.view.View.GONE import android.view.View.GONE
import android.view.View.VISIBLE import android.view.View.VISIBLE
import android.widget.Toast
import androidx.appcompat.app.AlertDialog import androidx.appcompat.app.AlertDialog
import androidx.work.Data import androidx.work.Data
import androidx.work.OneTimeWorkRequest import androidx.work.OneTimeWorkRequest
@ -50,6 +49,7 @@ import com.afollestad.materialdialogs.MaterialDialog
import com.afollestad.materialdialogs.bottomsheets.BottomSheet import com.afollestad.materialdialogs.bottomsheets.BottomSheet
import com.afollestad.materialdialogs.datetime.dateTimePicker import com.afollestad.materialdialogs.datetime.dateTimePicker
import com.google.android.material.dialog.MaterialAlertDialogBuilder import com.google.android.material.dialog.MaterialAlertDialogBuilder
import com.google.android.material.snackbar.Snackbar
import com.nextcloud.android.common.ui.theme.utils.ColorRole import com.nextcloud.android.common.ui.theme.utils.ColorRole
import com.nextcloud.talk.R import com.nextcloud.talk.R
import com.nextcloud.talk.activities.BaseActivity import com.nextcloud.talk.activities.BaseActivity
@ -594,12 +594,15 @@ class ConversationInfoActivity :
} }
override fun onNext(genericOverall: GenericOverall) { override fun onNext(genericOverall: GenericOverall) {
Toast.makeText(context, context.getString(R.string.nc_clear_history_success), Toast.LENGTH_LONG) Snackbar.make(
.show() binding.root,
context.getString(R.string.nc_clear_history_success),
Snackbar.LENGTH_LONG
).show()
} }
override fun onError(e: Throwable) { override fun onError(e: Throwable) {
Toast.makeText(context, R.string.nc_common_error_sorry, Toast.LENGTH_LONG).show() Snackbar.make(binding.root, R.string.nc_common_error_sorry, Snackbar.LENGTH_LONG).show()
Log.e(TAG, "failed to clear chat history", e) Log.e(TAG, "failed to clear chat history", e)
} }

View File

@ -4,9 +4,9 @@ import android.content.Intent
import android.util.Log import android.util.Log
import android.view.LayoutInflater import android.view.LayoutInflater
import android.view.View import android.view.View
import android.widget.Toast
import androidx.appcompat.app.AlertDialog import androidx.appcompat.app.AlertDialog
import com.google.android.material.dialog.MaterialAlertDialogBuilder import com.google.android.material.dialog.MaterialAlertDialogBuilder
import com.google.android.material.snackbar.Snackbar
import com.nextcloud.talk.R import com.nextcloud.talk.R
import com.nextcloud.talk.data.user.model.User import com.nextcloud.talk.data.user.model.User
import com.nextcloud.talk.databinding.ActivityConversationInfoBinding import com.nextcloud.talk.databinding.ActivityConversationInfoBinding
@ -145,14 +145,17 @@ class GuestAccessHelper(
override fun onError(e: Throwable) { override fun onError(e: Throwable) {
val message = context.getString(R.string.nc_guest_access_resend_invitations_failed) val message = context.getString(R.string.nc_guest_access_resend_invitations_failed)
Toast.makeText(context, message, Toast.LENGTH_SHORT).show() Snackbar.make(binding.root, message, Snackbar.LENGTH_SHORT).show()
Log.e(TAG, message, e) Log.e(TAG, message, e)
} }
override fun onComplete() { override fun onComplete() {
if (resendInvitationsResult.successful) { if (resendInvitationsResult.successful) {
Toast.makeText(context, R.string.nc_guest_access_resend_invitations_successful, Toast.LENGTH_SHORT) Snackbar.make(
.show() binding.root,
R.string.nc_guest_access_resend_invitations_successful,
Snackbar.LENGTH_SHORT
).show()
} }
} }
} }
@ -167,7 +170,7 @@ class GuestAccessHelper(
override fun onError(e: Throwable) { override fun onError(e: Throwable) {
val message = context.getString(R.string.nc_guest_access_allow_failed) val message = context.getString(R.string.nc_guest_access_allow_failed)
Toast.makeText(context, message, Toast.LENGTH_LONG).show() Snackbar.make(binding.root, message, Snackbar.LENGTH_LONG).show()
Log.e(TAG, message, e) Log.e(TAG, message, e)
} }
@ -210,7 +213,7 @@ class GuestAccessHelper(
override fun onError(e: Throwable) { override fun onError(e: Throwable) {
val message = context.getString(R.string.nc_guest_access_password_failed) val message = context.getString(R.string.nc_guest_access_password_failed)
Toast.makeText(context, message, Toast.LENGTH_LONG).show() Snackbar.make(binding.root, message, Snackbar.LENGTH_LONG).show()
Log.e(TAG, message, e) Log.e(TAG, message, e)
} }

View File

@ -31,12 +31,12 @@ import android.util.Log
import android.view.Menu import android.view.Menu
import android.view.MenuItem import android.view.MenuItem
import android.view.View import android.view.View
import android.widget.Toast
import androidx.core.net.toFile import androidx.core.net.toFile
import androidx.core.view.ViewCompat import androidx.core.view.ViewCompat
import androidx.lifecycle.ViewModelProvider import androidx.lifecycle.ViewModelProvider
import autodagger.AutoInjector import autodagger.AutoInjector
import com.github.dhaval2404.imagepicker.ImagePicker import com.github.dhaval2404.imagepicker.ImagePicker
import com.google.android.material.snackbar.Snackbar
import com.nextcloud.talk.R import com.nextcloud.talk.R
import com.nextcloud.talk.activities.BaseActivity import com.nextcloud.talk.activities.BaseActivity
import com.nextcloud.talk.api.NcApi import com.nextcloud.talk.api.NcApi
@ -141,7 +141,7 @@ class ConversationInfoEditActivity :
} }
is ConversationInfoEditViewModel.GetRoomErrorState -> { is ConversationInfoEditViewModel.GetRoomErrorState -> {
Toast.makeText(context, R.string.nc_common_error_sorry, Toast.LENGTH_LONG).show() Snackbar.make(binding.root, R.string.nc_common_error_sorry, Snackbar.LENGTH_LONG).show()
} }
is ConversationInfoEditViewModel.UploadAvatarSuccessState -> { is ConversationInfoEditViewModel.UploadAvatarSuccessState -> {
@ -150,7 +150,7 @@ class ConversationInfoEditActivity :
} }
is ConversationInfoEditViewModel.UploadAvatarErrorState -> { is ConversationInfoEditViewModel.UploadAvatarErrorState -> {
Toast.makeText(context, R.string.nc_common_error_sorry, Toast.LENGTH_LONG).show() Snackbar.make(binding.root, R.string.nc_common_error_sorry, Snackbar.LENGTH_LONG).show()
} }
is ConversationInfoEditViewModel.DeleteAvatarSuccessState -> { is ConversationInfoEditViewModel.DeleteAvatarSuccessState -> {
@ -159,7 +159,7 @@ class ConversationInfoEditActivity :
} }
is ConversationInfoEditViewModel.DeleteAvatarErrorState -> { is ConversationInfoEditViewModel.DeleteAvatarErrorState -> {
Toast.makeText(context, R.string.nc_common_error_sorry, Toast.LENGTH_LONG).show() Snackbar.make(binding.root, R.string.nc_common_error_sorry, Snackbar.LENGTH_LONG).show()
} }
else -> {} else -> {}
@ -249,10 +249,10 @@ class ConversationInfoEditActivity :
} }
override fun onError(e: Throwable) { override fun onError(e: Throwable) {
Toast.makeText( Snackbar.make(
applicationContext, binding.root,
context.getString(R.string.default_error_msg), context.getString(R.string.default_error_msg),
Toast.LENGTH_LONG Snackbar.LENGTH_LONG
).show() ).show()
Log.e(TAG, "Error while saving conversation name", e) Log.e(TAG, "Error while saving conversation name", e)
} }
@ -289,10 +289,10 @@ class ConversationInfoEditActivity :
} }
override fun onError(e: Throwable) { override fun onError(e: Throwable) {
Toast.makeText( Snackbar.make(
applicationContext, binding.root,
context.getString(R.string.default_error_msg), context.getString(R.string.default_error_msg),
Toast.LENGTH_LONG Snackbar.LENGTH_LONG
).show() ).show()
Log.e(TAG, "Error while saving conversation description", e) Log.e(TAG, "Error while saving conversation description", e)
} }
@ -315,7 +315,7 @@ class ConversationInfoEditActivity :
} }
ImagePicker.RESULT_ERROR -> { ImagePicker.RESULT_ERROR -> {
Toast.makeText(this, ImagePicker.getError(data), Toast.LENGTH_SHORT).show() Snackbar.make(binding.root, ImagePicker.getError(data), Snackbar.LENGTH_SHORT).show()
} }
else -> { else -> {

View File

@ -50,7 +50,6 @@ import android.view.MotionEvent
import android.view.View import android.view.View
import android.view.inputmethod.EditorInfo import android.view.inputmethod.EditorInfo
import android.view.inputmethod.InputMethodManager import android.view.inputmethod.InputMethodManager
import android.widget.Toast
import androidx.activity.OnBackPressedCallback import androidx.activity.OnBackPressedCallback
import androidx.appcompat.app.AlertDialog import androidx.appcompat.app.AlertDialog
import androidx.appcompat.widget.SearchView import androidx.appcompat.widget.SearchView
@ -68,6 +67,7 @@ import coil.transform.CircleCropTransformation
import com.google.android.material.appbar.AppBarLayout import com.google.android.material.appbar.AppBarLayout
import com.google.android.material.button.MaterialButton import com.google.android.material.button.MaterialButton
import com.google.android.material.dialog.MaterialAlertDialogBuilder import com.google.android.material.dialog.MaterialAlertDialogBuilder
import com.google.android.material.snackbar.Snackbar
import com.nextcloud.android.common.ui.theme.utils.ColorRole import com.nextcloud.android.common.ui.theme.utils.ColorRole
import com.nextcloud.talk.R import com.nextcloud.talk.R
import com.nextcloud.talk.activities.BaseActivity import com.nextcloud.talk.activities.BaseActivity
@ -267,7 +267,7 @@ class ConversationsListActivity :
fetchRooms() fetchRooms()
} else { } else {
Log.e(TAG, "userManager.currentUser.blockingGet() returned null") Log.e(TAG, "userManager.currentUser.blockingGet() returned null")
Toast.makeText(context, R.string.nc_common_error_sorry, Toast.LENGTH_LONG).show() Snackbar.make(binding.root, R.string.nc_common_error_sorry, Snackbar.LENGTH_LONG).show()
} }
showSearchOrToolbar() showSearchOrToolbar()
@ -309,7 +309,7 @@ class ConversationsListActivity :
) )
} else { } else {
Log.e(TAG, "currentUser was null in loadUserAvatar") Log.e(TAG, "currentUser was null in loadUserAvatar")
Toast.makeText(context, R.string.nc_common_error_sorry, Toast.LENGTH_LONG).show() Snackbar.make(binding.root, R.string.nc_common_error_sorry, Snackbar.LENGTH_LONG).show()
} }
} }
@ -956,9 +956,11 @@ class ConversationsListActivity :
selectedMessageId = messageItem.messageEntry.messageId selectedMessageId = messageItem.messageEntry.messageId
showConversationByToken(conversationToken) showConversationByToken(conversationToken)
} }
LoadMoreResultsItem.VIEW_TYPE -> { LoadMoreResultsItem.VIEW_TYPE -> {
loadMoreMessages() loadMoreMessages()
} }
ConversationItem.VIEW_TYPE -> { ConversationItem.VIEW_TYPE -> {
handleConversation((Objects.requireNonNull(item) as ConversationItem).model) handleConversation((Objects.requireNonNull(item) as ConversationItem).model)
} }
@ -989,14 +991,14 @@ class ConversationsListActivity :
) { ) {
handleSharedData() handleSharedData()
} else { } else {
Toast.makeText(context, R.string.send_to_forbidden, Toast.LENGTH_LONG).show() Snackbar.make(binding.root, R.string.send_to_forbidden, Snackbar.LENGTH_LONG).show()
} }
} else if (forwardMessage) { } else if (forwardMessage) {
if (hasChatPermission && !isReadOnlyConversation(selectedConversation!!)) { if (hasChatPermission && !isReadOnlyConversation(selectedConversation!!)) {
openConversation(intent.getStringExtra(KEY_FORWARD_MSG_TEXT)) openConversation(intent.getStringExtra(KEY_FORWARD_MSG_TEXT))
forwardMessage = false forwardMessage = false
} else { } else {
Toast.makeText(context, R.string.send_to_forbidden, Toast.LENGTH_LONG).show() Snackbar.make(binding.root, R.string.send_to_forbidden, Snackbar.LENGTH_LONG).show()
} }
} else { } else {
openConversation() openConversation()
@ -1023,8 +1025,8 @@ class ConversationsListActivity :
} else if (filesToShare != null && filesToShare!!.isNotEmpty()) { } else if (filesToShare != null && filesToShare!!.isNotEmpty()) {
showSendFilesConfirmDialog() showSendFilesConfirmDialog()
} else { } else {
Toast Snackbar
.makeText(context, context.resources.getString(R.string.nc_common_error_sorry), Toast.LENGTH_LONG) .make(binding.root, context.resources.getString(R.string.nc_common_error_sorry), Snackbar.LENGTH_LONG)
.show() .show()
} }
} }
@ -1125,18 +1127,18 @@ class ConversationsListActivity :
} }
} }
if (filesToShare!!.isEmpty() && textToPaste!!.isEmpty()) { if (filesToShare!!.isEmpty() && textToPaste!!.isEmpty()) {
Toast.makeText( Snackbar.make(
context, binding.root,
context.resources.getString(R.string.nc_common_error_sorry), context.resources.getString(R.string.nc_common_error_sorry),
Toast.LENGTH_LONG Snackbar.LENGTH_LONG
).show() ).show()
Log.e(TAG, "failed to get data from intent") Log.e(TAG, "failed to get data from intent")
} }
} catch (e: Exception) { } catch (e: Exception) {
Toast.makeText( Snackbar.make(
context, binding.root,
context.resources.getString(R.string.nc_common_error_sorry), context.resources.getString(R.string.nc_common_error_sorry),
Toast.LENGTH_LONG Snackbar.LENGTH_LONG
).show() ).show()
Log.e(TAG, "Something went wrong when extracting data from intent") Log.e(TAG, "Something went wrong when extracting data from intent")
} }
@ -1146,10 +1148,10 @@ class ConversationsListActivity :
private fun upload() { private fun upload() {
if (selectedConversation == null) { if (selectedConversation == null) {
Toast.makeText( Snackbar.make(
context, binding.root,
context.resources.getString(R.string.nc_common_error_sorry), context.resources.getString(R.string.nc_common_error_sorry),
Toast.LENGTH_LONG Snackbar.LENGTH_LONG
).show() ).show()
Log.e(TAG, "not able to upload any files because conversation was null.") Log.e(TAG, "not able to upload any files because conversation was null.")
return return
@ -1164,21 +1166,25 @@ class ConversationsListActivity :
) )
} }
} catch (e: IllegalArgumentException) { } catch (e: IllegalArgumentException) {
Toast.makeText(context, context.resources.getString(R.string.nc_upload_failed), Toast.LENGTH_LONG).show() Snackbar.make(binding.root, context.resources.getString(R.string.nc_upload_failed), Snackbar.LENGTH_LONG)
.show()
Log.e(TAG, "Something went wrong when trying to upload file", e) Log.e(TAG, "Something went wrong when trying to upload file", e)
} }
} }
override fun onRequestPermissionsResult(requestCode: Int, permissions: Array<String>, grantResults: IntArray) { override fun onRequestPermissionsResult(requestCode: Int, permissions: Array<String>, grantResults: IntArray) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults) super.onRequestPermissionsResult(requestCode, permissions, grantResults)
if (requestCode == UploadAndShareFilesWorker.REQUEST_PERMISSION && if (requestCode == UploadAndShareFilesWorker.REQUEST_PERMISSION) {
grantResults.isNotEmpty() && if (grantResults.isNotEmpty() && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
grantResults[0] == PackageManager.PERMISSION_GRANTED Log.d(TAG, "upload starting after permissions were granted")
) { showSendFilesConfirmDialog()
Log.d(TAG, "upload starting after permissions were granted") } else {
showSendFilesConfirmDialog() Snackbar.make(
} else { binding.root,
Toast.makeText(context, context.getString(R.string.read_storage_no_permission), Toast.LENGTH_LONG).show() context.getString(R.string.read_storage_no_permission),
Snackbar.LENGTH_LONG
).show()
}
} }
} }
@ -1186,10 +1192,10 @@ class ConversationsListActivity :
if (CallActivity.active && if (CallActivity.active &&
selectedConversation!!.token != ApplicationWideCurrentRoomHolder.getInstance().currentRoomToken selectedConversation!!.token != ApplicationWideCurrentRoomHolder.getInstance().currentRoomToken
) { ) {
Toast.makeText( Snackbar.make(
context, binding.root,
context.getString(R.string.restrict_join_other_room_while_call), context.getString(R.string.restrict_join_other_room_while_call),
Toast.LENGTH_LONG Snackbar.LENGTH_LONG
).show() ).show()
return return
} }
@ -1217,6 +1223,7 @@ class ConversationsListActivity :
EventStatus.EventType.CONVERSATION_UPDATE -> if (eventStatus.isAllGood && !isRefreshing) { EventStatus.EventType.CONVERSATION_UPDATE -> if (eventStatus.isAllGood && !isRefreshing) {
fetchRooms() fetchRooms()
} }
else -> {} else -> {}
} }
} }
@ -1493,7 +1500,9 @@ class ConversationsListActivity :
filterState[FilterConversationFragment.UNREAD] = unread filterState[FilterConversationFragment.UNREAD] = unread
} }
fun setFilterableItems(items: MutableList<AbstractFlexibleItem<*>>) { filterableConversationItems = items } fun setFilterableItems(items: MutableList<AbstractFlexibleItem<*>>) {
filterableConversationItems = items
}
fun updateFilterConversationButtonColor() { fun updateFilterConversationButtonColor() {
if (filterState.containsValue(true)) { if (filterState.containsValue(true)) {

View File

@ -23,10 +23,12 @@
*/ */
package com.nextcloud.talk.jobs package com.nextcloud.talk.jobs
import android.Manifest
import android.app.Notification import android.app.Notification
import android.app.PendingIntent import android.app.PendingIntent
import android.content.Context import android.content.Context
import android.content.Intent import android.content.Intent
import android.content.pm.PackageManager
import android.graphics.Bitmap import android.graphics.Bitmap
import android.media.AudioAttributes import android.media.AudioAttributes
import android.media.MediaPlayer import android.media.MediaPlayer
@ -40,7 +42,8 @@ import android.service.notification.StatusBarNotification
import android.text.TextUtils import android.text.TextUtils
import android.util.Base64 import android.util.Base64
import android.util.Log import android.util.Log
import android.widget.Toast import android.view.View
import androidx.core.app.ActivityCompat
import androidx.core.app.NotificationCompat import androidx.core.app.NotificationCompat
import androidx.core.app.NotificationManagerCompat import androidx.core.app.NotificationManagerCompat
import androidx.core.app.Person import androidx.core.app.Person
@ -53,6 +56,7 @@ import androidx.work.Worker
import androidx.work.WorkerParameters import androidx.work.WorkerParameters
import autodagger.AutoInjector import autodagger.AutoInjector
import com.bluelinelabs.logansquare.LoganSquare import com.bluelinelabs.logansquare.LoganSquare
import com.google.android.material.snackbar.Snackbar
import com.nextcloud.talk.BuildConfig import com.nextcloud.talk.BuildConfig
import com.nextcloud.talk.R import com.nextcloud.talk.R
import com.nextcloud.talk.activities.MainActivity import com.nextcloud.talk.activities.MainActivity
@ -325,7 +329,11 @@ class NotificationWorker(context: Context, workerParams: WorkerParameters) : Wor
Log.e(TAG, "Failed to get NC notification", e) Log.e(TAG, "Failed to get NC notification", e)
if (BuildConfig.DEBUG) { if (BuildConfig.DEBUG) {
Handler(Looper.getMainLooper()).post { Handler(Looper.getMainLooper()).post {
Toast.makeText(context, "Failed to get NC notification", Toast.LENGTH_LONG).show() Snackbar.make(
View(applicationContext),
"Failed to get NC notification",
Snackbar.LENGTH_LONG
).show()
} }
} }
} }
@ -734,6 +742,18 @@ class NotificationWorker(context: Context, workerParams: WorkerParameters) : Wor
private fun sendNotification(notificationId: Int, notification: Notification) { private fun sendNotification(notificationId: Int, notification: Notification) {
Log.d(TAG, "show notification with id $notificationId") Log.d(TAG, "show notification with id $notificationId")
if (ActivityCompat.checkSelfPermission(
applicationContext,
Manifest.permission.POST_NOTIFICATIONS
) != PackageManager.PERMISSION_GRANTED
) {
// here to request the missing permissions, and then overriding
// public void onRequestPermissionsResult(int requestCode, String[] permissions,
// int[] grantResults)
// to handle the case where the user grants the permission. See the documentation
// for ActivityCompat#requestPermissions for more details.
return
}
notificationManager.notify(notificationId, notification) notificationManager.notify(notificationId, notification)
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
@ -902,6 +922,18 @@ class NotificationWorker(context: Context, workerParams: WorkerParameters) : Wor
.build() .build()
val notificationId: Int = SystemClock.uptimeMillis().toInt() val notificationId: Int = SystemClock.uptimeMillis().toInt()
if (ActivityCompat.checkSelfPermission(
applicationContext,
Manifest.permission.POST_NOTIFICATIONS
) != PackageManager.PERMISSION_GRANTED
) {
// here to request the missing permissions, and then overriding
// public void onRequestPermissionsResult(int requestCode, String[] permissions,
// int[] grantResults)
// to handle the case where the user grants the permission. See the documentation
// for ActivityCompat#requestPermissions for more details.
return
}
notificationManager.notify(notificationId, notification) notificationManager.notify(notificationId, notification)
Log.d(TAG, "'you missed a call' notification was created") Log.d(TAG, "'you missed a call' notification was created")
} }

View File

@ -32,11 +32,11 @@ import android.view.Menu
import android.view.MenuItem import android.view.MenuItem
import android.view.inputmethod.EditorInfo import android.view.inputmethod.EditorInfo
import android.widget.AdapterView import android.widget.AdapterView
import android.widget.Toast
import androidx.appcompat.widget.SearchView import androidx.appcompat.widget.SearchView
import androidx.core.view.MenuItemCompat import androidx.core.view.MenuItemCompat
import androidx.preference.PreferenceManager import androidx.preference.PreferenceManager
import autodagger.AutoInjector import autodagger.AutoInjector
import com.google.android.material.snackbar.Snackbar
import com.nextcloud.talk.R import com.nextcloud.talk.R
import com.nextcloud.talk.activities.BaseActivity import com.nextcloud.talk.activities.BaseActivity
import com.nextcloud.talk.adapters.GeocodingAdapter import com.nextcloud.talk.adapters.GeocodingAdapter
@ -216,7 +216,7 @@ class GeocodingActivity :
} }
} catch (e: Exception) { } catch (e: Exception) {
Log.e(TAG, "Failed to get geocoded addresses", e) Log.e(TAG, "Failed to get geocoded addresses", e)
Toast.makeText(context, R.string.nc_common_error_sorry, Toast.LENGTH_LONG).show() Snackbar.make(binding.root, R.string.nc_common_error_sorry, Snackbar.LENGTH_LONG).show()
} }
updateResultsOnMainThread(results) updateResultsOnMainThread(results)
} }

View File

@ -40,7 +40,6 @@ import android.view.Menu
import android.view.MenuItem import android.view.MenuItem
import android.view.View import android.view.View
import android.view.inputmethod.EditorInfo import android.view.inputmethod.EditorInfo
import android.widget.Toast
import androidx.activity.OnBackPressedCallback import androidx.activity.OnBackPressedCallback
import androidx.appcompat.widget.SearchView import androidx.appcompat.widget.SearchView
import androidx.core.content.PermissionChecker import androidx.core.content.PermissionChecker
@ -48,6 +47,7 @@ import androidx.core.content.res.ResourcesCompat
import androidx.core.view.MenuItemCompat import androidx.core.view.MenuItemCompat
import androidx.preference.PreferenceManager import androidx.preference.PreferenceManager
import autodagger.AutoInjector import autodagger.AutoInjector
import com.google.android.material.snackbar.Snackbar
import com.nextcloud.talk.R import com.nextcloud.talk.R
import com.nextcloud.talk.activities.BaseActivity import com.nextcloud.talk.activities.BaseActivity
import com.nextcloud.talk.api.NcApi import com.nextcloud.talk.api.NcApi
@ -319,7 +319,11 @@ class LocationPickerActivity :
binding.centerMapButton.setOnClickListener { binding.centerMapButton.setOnClickListener {
if (myLocation.latitude == COORDINATE_ZERO && myLocation.longitude == COORDINATE_ZERO) { if (myLocation.latitude == COORDINATE_ZERO && myLocation.longitude == COORDINATE_ZERO) {
Toast.makeText(context, context.getString(R.string.nc_location_unknown), Toast.LENGTH_LONG).show() Snackbar.make(
binding.root,
context.getString(R.string.nc_location_unknown),
Snackbar.LENGTH_LONG
).show()
} else { } else {
mapController.animateTo(myLocation) mapController.animateTo(myLocation)
moveToCurrentLocation = true moveToCurrentLocation = true
@ -341,11 +345,13 @@ class LocationPickerActivity :
setLocationDescription(isGpsLocation = true, isGeocodedResult = false) setLocationDescription(isGpsLocation = true, isGeocodedResult = false)
moveToCurrentLocation = false moveToCurrentLocation = false
} }
geocodingResult != null -> { geocodingResult != null -> {
binding.shareLocation.isClickable = true binding.shareLocation.isClickable = true
setLocationDescription(isGpsLocation = false, isGeocodedResult = true) setLocationDescription(isGpsLocation = false, isGeocodedResult = true)
geocodingResult = null geocodingResult = null
} }
else -> { else -> {
binding.shareLocation.isClickable = true binding.shareLocation.isClickable = true
setLocationDescription(isGpsLocation = false, isGeocodedResult = false) setLocationDescription(isGpsLocation = false, isGeocodedResult = false)
@ -377,6 +383,7 @@ class LocationPickerActivity :
this this
) )
} }
locationManager!!.isProviderEnabled(LocationManager.GPS_PROVIDER) -> { locationManager!!.isProviderEnabled(LocationManager.GPS_PROVIDER) -> {
locationManager!!.requestLocationUpdates( locationManager!!.requestLocationUpdates(
LocationManager.GPS_PROVIDER, LocationManager.GPS_PROVIDER,
@ -386,6 +393,7 @@ class LocationPickerActivity :
) )
Log.d(TAG, "LocationManager.NETWORK_PROVIDER falling back to LocationManager.GPS_PROVIDER") Log.d(TAG, "LocationManager.NETWORK_PROVIDER falling back to LocationManager.GPS_PROVIDER")
} }
else -> { else -> {
Log.e( Log.e(
TAG, TAG,
@ -393,16 +401,16 @@ class LocationPickerActivity :
" and there is no alternative like UnifiedNlp installed. Furthermore no GPS is " + " and there is no alternative like UnifiedNlp installed. Furthermore no GPS is " +
"supported." "supported."
) )
Toast.makeText(context, context.getString(R.string.nc_location_unknown), Toast.LENGTH_LONG) Snackbar.make(binding.root, context.getString(R.string.nc_location_unknown), Snackbar.LENGTH_LONG)
.show() .show()
} }
} }
} catch (e: SecurityException) { } catch (e: SecurityException) {
Log.e(TAG, "Error when requesting location updates. Permissions may be missing.", e) Log.e(TAG, "Error when requesting location updates. Permissions may be missing.", e)
Toast.makeText(context, context.getString(R.string.nc_location_unknown), Toast.LENGTH_LONG).show() Snackbar.make(binding.root, context.getString(R.string.nc_location_unknown), Snackbar.LENGTH_LONG).show()
} catch (e: Exception) { } catch (e: Exception) {
Log.e(TAG, "Error when requesting location updates.", e) Log.e(TAG, "Error when requesting location updates.", e)
Toast.makeText(context, context.getString(R.string.nc_common_error_sorry), Toast.LENGTH_LONG).show() Snackbar.make(binding.root, context.getString(R.string.nc_common_error_sorry), Snackbar.LENGTH_LONG).show()
} }
} }
@ -413,11 +421,13 @@ class LocationPickerActivity :
binding.placeName.visibility = View.GONE binding.placeName.visibility = View.GONE
binding.placeName.text = "" binding.placeName.text = ""
} }
isGeocodedResult -> { isGeocodedResult -> {
binding.shareLocationDescription.text = context!!.getText(R.string.nc_share_this_location) binding.shareLocationDescription.text = context!!.getText(R.string.nc_share_this_location)
binding.placeName.visibility = View.VISIBLE binding.placeName.visibility = View.VISIBLE
binding.placeName.text = geocodingResult?.displayName binding.placeName.text = geocodingResult?.displayName
} }
else -> { else -> {
binding.shareLocationDescription.text = context!!.getText(R.string.nc_share_this_location) binding.shareLocationDescription.text = context!!.getText(R.string.nc_share_this_location)
binding.placeName.visibility = View.GONE binding.placeName.visibility = View.GONE
@ -476,7 +486,7 @@ class LocationPickerActivity :
override fun onError(e: Throwable) { override fun onError(e: Throwable) {
Log.e(TAG, "error when trying to share location", e) Log.e(TAG, "error when trying to share location", e)
Toast.makeText(context, R.string.nc_common_error_sorry, Toast.LENGTH_LONG).show() Snackbar.make(binding.root, R.string.nc_common_error_sorry, Snackbar.LENGTH_LONG).show()
finish() finish()
} }
@ -531,8 +541,11 @@ class LocationPickerActivity :
if (requestCode == REQUEST_PERMISSIONS_REQUEST_CODE && areAllGranted(grantResults)) { if (requestCode == REQUEST_PERMISSIONS_REQUEST_CODE && areAllGranted(grantResults)) {
initMap() initMap()
} else { } else {
Toast.makeText(context, context!!.getString(R.string.nc_location_permission_required), Toast.LENGTH_LONG) Snackbar.make(
.show() binding.root,
context!!.getString(R.string.nc_location_permission_required),
Snackbar.LENGTH_LONG
).show()
} }
} }
@ -556,7 +569,7 @@ class LocationPickerActivity :
address = nominatimClient!!.getAddress(lon, lat) address = nominatimClient!!.getAddress(lon, lat)
} catch (e: Exception) { } catch (e: Exception) {
Log.e(TAG, "Failed to get geocoded addresses", e) Log.e(TAG, "Failed to get geocoded addresses", e)
Toast.makeText(context, R.string.nc_common_error_sorry, Toast.LENGTH_LONG).show() Snackbar.make(binding.root, R.string.nc_common_error_sorry, Snackbar.LENGTH_LONG).show()
} }
updateResultOnMainThread(lat, lon, address?.displayName) updateResultOnMainThread(lat, lon, address?.displayName)
} }

View File

@ -30,11 +30,11 @@ import android.text.TextUtils
import android.view.Menu import android.view.Menu
import android.view.MenuItem import android.view.MenuItem
import android.view.View import android.view.View
import android.widget.Toast
import androidx.activity.OnBackPressedCallback import androidx.activity.OnBackPressedCallback
import androidx.appcompat.widget.SearchView import androidx.appcompat.widget.SearchView
import androidx.lifecycle.ViewModelProvider import androidx.lifecycle.ViewModelProvider
import autodagger.AutoInjector import autodagger.AutoInjector
import com.google.android.material.snackbar.Snackbar
import com.nextcloud.talk.R import com.nextcloud.talk.R
import com.nextcloud.talk.activities.BaseActivity import com.nextcloud.talk.activities.BaseActivity
import com.nextcloud.talk.adapters.items.LoadMoreResultsItem import com.nextcloud.talk.adapters.items.LoadMoreResultsItem
@ -127,7 +127,7 @@ class MessageSearchActivity : BaseActivity() {
private fun showError() { private fun showError() {
displayLoading(false) displayLoading(false)
Toast.makeText(this, "Error while searching", Toast.LENGTH_SHORT).show() Snackbar.make(binding.root, "Error while searching", Snackbar.LENGTH_SHORT).show()
} }
private fun showLoading() { private fun showLoading() {

View File

@ -24,9 +24,9 @@ import android.content.Intent
import android.graphics.drawable.ColorDrawable import android.graphics.drawable.ColorDrawable
import android.os.Bundle import android.os.Bundle
import android.view.View import android.view.View
import android.widget.Toast
import androidx.lifecycle.ViewModelProvider import androidx.lifecycle.ViewModelProvider
import autodagger.AutoInjector import autodagger.AutoInjector
import com.google.android.material.snackbar.Snackbar
import com.nextcloud.talk.R import com.nextcloud.talk.R
import com.nextcloud.talk.activities.BaseActivity import com.nextcloud.talk.activities.BaseActivity
import com.nextcloud.talk.api.NcApi import com.nextcloud.talk.api.NcApi
@ -112,7 +112,7 @@ class ListOpenConversationsActivity : BaseActivity() {
binding.emptyList.emptyListViewText.visibility = View.VISIBLE binding.emptyList.emptyListViewText.visibility = View.VISIBLE
} }
is OpenConversationsViewModel.FetchConversationsErrorState -> { is OpenConversationsViewModel.FetchConversationsErrorState -> {
Toast.makeText(context, R.string.nc_common_error_sorry, Toast.LENGTH_LONG).show() Snackbar.make(binding.root, R.string.nc_common_error_sorry, Snackbar.LENGTH_LONG).show()
} }
else -> {} else -> {}
} }

View File

@ -30,12 +30,12 @@ import android.view.LayoutInflater
import android.view.View import android.view.View
import android.view.ViewGroup import android.view.ViewGroup
import android.widget.EditText import android.widget.EditText
import android.widget.Toast
import androidx.fragment.app.DialogFragment import androidx.fragment.app.DialogFragment
import androidx.lifecycle.ViewModelProvider import androidx.lifecycle.ViewModelProvider
import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.LinearLayoutManager
import autodagger.AutoInjector import autodagger.AutoInjector
import com.google.android.material.dialog.MaterialAlertDialogBuilder import com.google.android.material.dialog.MaterialAlertDialogBuilder
import com.google.android.material.snackbar.Snackbar
import com.nextcloud.talk.R import com.nextcloud.talk.R
import com.nextcloud.talk.application.NextcloudTalkApplication import com.nextcloud.talk.application.NextcloudTalkApplication
import com.nextcloud.talk.databinding.DialogPollCreateBinding import com.nextcloud.talk.databinding.DialogPollCreateBinding
@ -172,7 +172,7 @@ class PollCreateDialogFragment : DialogFragment(), PollCreateOptionsItemListener
private fun showError() { private fun showError() {
dismiss() dismiss()
Log.e(TAG, "Failed to create poll") Log.e(TAG, "Failed to create poll")
Toast.makeText(context, R.string.nc_common_error_sorry, Toast.LENGTH_LONG).show() Snackbar.make(binding.root, R.string.nc_common_error_sorry, Snackbar.LENGTH_LONG).show()
} }
override fun onRemoveOptionsItemClick(pollCreateOptionItem: PollCreateOptionItem, position: Int) { override fun onRemoveOptionsItemClick(pollCreateOptionItem: PollCreateOptionItem, position: Int) {

View File

@ -32,12 +32,12 @@ import android.widget.CheckBox
import android.widget.CompoundButton import android.widget.CompoundButton
import android.widget.LinearLayout import android.widget.LinearLayout
import android.widget.RadioButton import android.widget.RadioButton
import android.widget.Toast
import androidx.appcompat.app.AlertDialog import androidx.appcompat.app.AlertDialog
import androidx.fragment.app.Fragment import androidx.fragment.app.Fragment
import androidx.lifecycle.ViewModelProvider import androidx.lifecycle.ViewModelProvider
import autodagger.AutoInjector import autodagger.AutoInjector
import com.google.android.material.dialog.MaterialAlertDialogBuilder import com.google.android.material.dialog.MaterialAlertDialogBuilder
import com.google.android.material.snackbar.Snackbar
import com.nextcloud.talk.R import com.nextcloud.talk.R
import com.nextcloud.talk.application.NextcloudTalkApplication import com.nextcloud.talk.application.NextcloudTalkApplication
import com.nextcloud.talk.databinding.DialogPollVoteBinding import com.nextcloud.talk.databinding.DialogPollVoteBinding
@ -94,10 +94,10 @@ class PollVoteFragment : Fragment() {
PollVoteViewModel.InitialState -> {} PollVoteViewModel.InitialState -> {}
is PollVoteViewModel.PollVoteFailedState -> { is PollVoteViewModel.PollVoteFailedState -> {
Log.e(TAG, "Failed to vote on poll.") Log.e(TAG, "Failed to vote on poll.")
Toast.makeText(context, R.string.nc_common_error_sorry, Toast.LENGTH_LONG).show() Snackbar.make(binding.root, R.string.nc_common_error_sorry, Snackbar.LENGTH_LONG).show()
} }
is PollVoteViewModel.PollVoteHiddenSuccessState -> { is PollVoteViewModel.PollVoteHiddenSuccessState -> {
Toast.makeText(context, R.string.polls_voted_hidden_success, Toast.LENGTH_LONG).show() Snackbar.make(binding.root, R.string.polls_voted_hidden_success, Snackbar.LENGTH_LONG).show()
parentViewModel.dismissDialog() parentViewModel.dismissDialog()
} }
is PollVoteViewModel.PollVoteSuccessState -> { is PollVoteViewModel.PollVoteSuccessState -> {
@ -182,7 +182,7 @@ class PollVoteFragment : Fragment() {
viewModel.selectOption(index, false) viewModel.selectOption(index, false)
} else { } else {
checkBox.isChecked = false checkBox.isChecked = false
Toast.makeText(context, R.string.polls_max_votes_reached, Toast.LENGTH_LONG).show() Snackbar.make(binding.root, R.string.polls_max_votes_reached, Snackbar.LENGTH_LONG).show()
} }
} else { } else {
viewModel.deSelectOption(index) viewModel.deSelectOption(index)

View File

@ -40,7 +40,6 @@ import android.view.Menu
import android.view.MenuItem import android.view.MenuItem
import android.view.View import android.view.View
import android.view.ViewGroup import android.view.ViewGroup
import android.widget.Toast
import androidx.annotation.DrawableRes import androidx.annotation.DrawableRes
import androidx.core.content.ContextCompat import androidx.core.content.ContextCompat
import androidx.core.net.toFile import androidx.core.net.toFile
@ -49,6 +48,7 @@ import androidx.recyclerview.widget.RecyclerView
import autodagger.AutoInjector import autodagger.AutoInjector
import com.github.dhaval2404.imagepicker.ImagePicker import com.github.dhaval2404.imagepicker.ImagePicker
import com.github.dhaval2404.imagepicker.ImagePicker.Companion.getError import com.github.dhaval2404.imagepicker.ImagePicker.Companion.getError
import com.google.android.material.snackbar.Snackbar
import com.nextcloud.android.common.ui.theme.utils.ColorRole import com.nextcloud.android.common.ui.theme.utils.ColorRole
import com.nextcloud.talk.R import com.nextcloud.talk.R
import com.nextcloud.talk.activities.BaseActivity import com.nextcloud.talk.activities.BaseActivity
@ -459,13 +459,13 @@ class ProfileActivity : BaseActivity() {
override fun onError(e: Throwable) { override fun onError(e: Throwable) {
item.text = userInfo?.getValueByField(item.field) item.text = userInfo?.getValueByField(item.field)
Toast.makeText( Snackbar.make(
applicationContext, binding.root,
String.format( String.format(
resources!!.getString(R.string.failed_to_save), resources!!.getString(R.string.failed_to_save),
item.field item.field
), ),
Toast.LENGTH_LONG Snackbar.LENGTH_LONG
).show() ).show()
adapter!!.updateFilteredList() adapter!!.updateFilteredList()
adapter!!.notifyDataSetChanged() adapter!!.notifyDataSetChanged()
@ -492,8 +492,8 @@ class ProfileActivity : BaseActivity() {
if (grantResults.isNotEmpty() && grantResults[0] == PackageManager.PERMISSION_GRANTED) { if (grantResults.isNotEmpty() && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
pickImage.takePicture() pickImage.takePicture()
} else { } else {
Toast Snackbar
.makeText(context, context.getString(R.string.take_photo_permission), Toast.LENGTH_LONG) .make(binding.root, context.getString(R.string.take_photo_permission), Snackbar.LENGTH_LONG)
.show() .show()
} }
} }
@ -510,7 +510,7 @@ class ProfileActivity : BaseActivity() {
) { uploadAvatar(it.toFile()) } ) { uploadAvatar(it.toFile()) }
} }
ImagePicker.RESULT_ERROR -> { ImagePicker.RESULT_ERROR -> {
Toast.makeText(this, getError(data), Toast.LENGTH_SHORT).show() Snackbar.make(binding.root, getError(data), Snackbar.LENGTH_SHORT).show()
} }
else -> { else -> {
Log.i(TAG, "Task Cancelled") Log.i(TAG, "Task Cancelled")
@ -550,10 +550,10 @@ class ProfileActivity : BaseActivity() {
} }
override fun onError(e: Throwable) { override fun onError(e: Throwable) {
Toast.makeText( Snackbar.make(
applicationContext, binding.root,
context.getString(R.string.default_error_msg), context.getString(R.string.default_error_msg),
Toast Snackbar
.LENGTH_LONG .LENGTH_LONG
).show() ).show()
Log.e(TAG, "Error uploading avatar", e) Log.e(TAG, "Error uploading avatar", e)

View File

@ -25,8 +25,9 @@ import android.content.BroadcastReceiver
import android.content.Context import android.content.Context
import android.content.Intent import android.content.Intent
import android.util.Log import android.util.Log
import android.widget.Toast import android.view.View
import autodagger.AutoInjector import autodagger.AutoInjector
import com.google.android.material.snackbar.Snackbar
import com.nextcloud.talk.R import com.nextcloud.talk.R
import com.nextcloud.talk.api.NcApi import com.nextcloud.talk.api.NcApi
import com.nextcloud.talk.application.NextcloudTalkApplication import com.nextcloud.talk.application.NextcloudTalkApplication
@ -91,12 +92,12 @@ class ShareRecordingToChatReceiver : BroadcastReceiver() {
// combined with addNextIntentWithParentStack. For further reading, see // combined with addNextIntentWithParentStack. For further reading, see
// https://developer.android.com/develop/ui/views/notifications/navigation#DirectEntry // https://developer.android.com/develop/ui/views/notifications/navigation#DirectEntry
// As we are using the conductor framework it might be hard the combine this or to keep an overview. // As we are using the conductor framework it might be hard the combine this or to keep an overview.
// For this reason there is only a toast for now until we got rid of conductor. // For this reason there is only a Snackbar for now until we got rid of conductor.
Toast.makeText( Snackbar.make(
context, View(context),
context.resources.getString(R.string.nc_all_ok_operation), context.resources.getString(R.string.nc_all_ok_operation),
Toast.LENGTH_LONG Snackbar.LENGTH_LONG
).show() ).show()
} }

View File

@ -52,7 +52,6 @@ import android.view.View
import android.view.WindowManager import android.view.WindowManager
import android.widget.EditText import android.widget.EditText
import android.widget.LinearLayout import android.widget.LinearLayout
import android.widget.Toast
import androidx.appcompat.app.AlertDialog import androidx.appcompat.app.AlertDialog
import androidx.appcompat.view.ContextThemeWrapper import androidx.appcompat.view.ContextThemeWrapper
import androidx.core.content.ContextCompat import androidx.core.content.ContextCompat
@ -63,6 +62,7 @@ import androidx.work.WorkManager
import autodagger.AutoInjector import autodagger.AutoInjector
import com.afollestad.materialdialogs.utils.MDUtil.getStringArray import com.afollestad.materialdialogs.utils.MDUtil.getStringArray
import com.google.android.material.dialog.MaterialAlertDialogBuilder import com.google.android.material.dialog.MaterialAlertDialogBuilder
import com.google.android.material.snackbar.Snackbar
import com.google.android.material.textfield.TextInputLayout import com.google.android.material.textfield.TextInputLayout
import com.nextcloud.android.common.ui.theme.utils.ColorRole import com.nextcloud.android.common.ui.theme.utils.ColorRole
import com.nextcloud.talk.BuildConfig import com.nextcloud.talk.BuildConfig
@ -471,7 +471,7 @@ class SettingsActivity : BaseActivity() {
private fun removeCurrentAccount() { private fun removeCurrentAccount() {
val otherUserExists = userManager.scheduleUserForDeletionWithId(currentUser!!.id!!).blockingGet() val otherUserExists = userManager.scheduleUserForDeletionWithId(currentUser!!.id!!).blockingGet()
val accountRemovalWork = OneTimeWorkRequest.Builder(AccountRemovalWorker::class.java).build() val accountRemovalWork = OneTimeWorkRequest.Builder(AccountRemovalWorker::class.java).build()
WorkManager.getInstance(this).enqueue(accountRemovalWork) WorkManager.getInstance(applicationContext).enqueue(accountRemovalWork)
if (otherUserExists) { if (otherUserExists) {
// TODO: find better solution once Conductor is removed // TODO: find better solution once Conductor is removed
finish() finish()
@ -888,10 +888,10 @@ class SettingsActivity : BaseActivity() {
} else { } else {
appPreferences.setPhoneBookIntegration(false) appPreferences.setPhoneBookIntegration(false)
binding.settingsPhoneBookIntegrationSwitch.isChecked = appPreferences.isPhoneBookIntegrationEnabled binding.settingsPhoneBookIntegrationSwitch.isChecked = appPreferences.isPhoneBookIntegrationEnabled
Toast.makeText( Snackbar.make(
context, binding.root,
context.resources.getString(R.string.no_phone_book_integration_due_to_permissions), context.resources.getString(R.string.no_phone_book_integration_due_to_permissions),
Toast.LENGTH_LONG Snackbar.LENGTH_LONG
).show() ).show()
} }
} }
@ -1082,12 +1082,12 @@ class SettingsActivity : BaseActivity() {
val statusCode = genericOverall.ocs?.meta?.statusCode val statusCode = genericOverall.ocs?.meta?.statusCode
if (statusCode == HTTP_CODE) { if (statusCode == HTTP_CODE) {
dialog.dismiss() dialog.dismiss()
Toast.makeText( Snackbar.make(
context, binding.root,
context.resources.getString( context.resources.getString(
R.string.nc_settings_phone_book_integration_phone_number_dialog_success R.string.nc_settings_phone_book_integration_phone_number_dialog_success
), ),
Toast.LENGTH_LONG Snackbar.LENGTH_LONG
).show() ).show()
} else { } else {
textInputLayout.helperText = context.resources.getString( textInputLayout.helperText = context.resources.getString(

View File

@ -29,13 +29,13 @@ import android.util.Log
import android.view.View import android.view.View
import android.widget.ImageView import android.widget.ImageView
import android.widget.ProgressBar import android.widget.ProgressBar
import android.widget.Toast
import androidx.core.content.FileProvider import androidx.core.content.FileProvider
import androidx.emoji2.widget.EmojiTextView import androidx.emoji2.widget.EmojiTextView
import androidx.work.Data import androidx.work.Data
import androidx.work.OneTimeWorkRequest import androidx.work.OneTimeWorkRequest
import androidx.work.WorkInfo import androidx.work.WorkInfo
import androidx.work.WorkManager import androidx.work.WorkManager
import com.google.android.material.snackbar.Snackbar
import com.nextcloud.talk.R import com.nextcloud.talk.R
import com.nextcloud.talk.activities.FullScreenImageActivity import com.nextcloud.talk.activities.FullScreenImageActivity
import com.nextcloud.talk.activities.FullScreenMediaActivity import com.nextcloud.talk.activities.FullScreenMediaActivity
@ -122,7 +122,7 @@ class FileViewerUtils(private val context: Context, private val user: User) {
"support it, it can't be handled by an external app and there is no link " + "support it, it can't be handled by an external app and there is no link " +
"to open it in the nextcloud files app" "to open it in the nextcloud files app"
) )
Toast.makeText(context, R.string.nc_common_error_sorry, Toast.LENGTH_LONG).show() Snackbar.make(View(context), R.string.nc_common_error_sorry, Snackbar.LENGTH_LONG).show()
} }
} }
@ -175,7 +175,7 @@ class FileViewerUtils(private val context: Context, private val user: User) {
} }
} else { } else {
Log.e(TAG, "can't open file with unknown mimetype") Log.e(TAG, "can't open file with unknown mimetype")
Toast.makeText(context, R.string.nc_common_error_sorry, Toast.LENGTH_LONG).show() Snackbar.make(View(context), R.string.nc_common_error_sorry, Snackbar.LENGTH_LONG).show()
} }
} }

View File

@ -36,7 +36,7 @@
android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar" android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"
app:popupTheme="@style/ThemeOverlay.AppCompat.Dark" /> app:popupTheme="@style/ThemeOverlay.AppCompat.Dark" />
<com.google.android.exoplayer2.ui.StyledPlayerView <androidx.media3.ui.PlayerView
android:id="@+id/player_view" android:id="@+id/player_view"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="match_parent"

View File

@ -10,6 +10,7 @@
<string name="avatar">Avatarra</string> <string name="avatar">Avatarra</string>
<string name="away">Kanpoan</string> <string name="away">Kanpoan</string>
<string name="call_more_actions_dialog_headline">Dei-ezarpen aurreratuak</string> <string name="call_more_actions_dialog_headline">Dei-ezarpen aurreratuak</string>
<string name="call_running_since_one_hour">Deia ordubetez egon da martxan.</string>
<string name="call_without_notification">Deitu jakinarazpenik gabe</string> <string name="call_without_notification">Deitu jakinarazpenik gabe</string>
<string name="camera_permission_granted">Kameraren baimena eman da. Aukeratu kamera berriro.</string> <string name="camera_permission_granted">Kameraren baimena eman da. Aukeratu kamera berriro.</string>
<string name="choose_avatar_from_cloud">Aukeratu avatarra cloudetik</string> <string name="choose_avatar_from_cloud">Aukeratu avatarra cloudetik</string>

View File

@ -166,7 +166,7 @@
<string name="nc_guest_access_password_title">Захист паролем</string> <string name="nc_guest_access_password_title">Захист паролем</string>
<string name="nc_guest_access_password_weak_alert_title">Слабкий пароль</string> <string name="nc_guest_access_password_weak_alert_title">Слабкий пароль</string>
<string name="nc_guest_access_resend_invitations">Повторно надіслати запрошення</string> <string name="nc_guest_access_resend_invitations">Повторно надіслати запрошення</string>
<string name="nc_guest_access_resend_invitations_failed">Запрошення не були надіслані через помилку.</string> <string name="nc_guest_access_resend_invitations_failed">Запрошення не було надіслано через помилку, що виникла.</string>
<string name="nc_guest_access_resend_invitations_successful">Запрошення було розіслано повторно.</string> <string name="nc_guest_access_resend_invitations_successful">Запрошення було розіслано повторно.</string>
<string name="nc_guest_access_share_link">Поділитися посиланням на бесіду</string> <string name="nc_guest_access_share_link">Поділитися посиланням на бесіду</string>
<string name="nc_hint_enter_a_message">Введіть повідомлення ...</string> <string name="nc_hint_enter_a_message">Введіть повідомлення ...</string>

View File

@ -376,7 +376,6 @@ How to translate with transifex:
<string name="nc_add_attachment">Add attachment</string> <string name="nc_add_attachment">Add attachment</string>
<string name="emoji_category_recent">Recent</string> <string name="emoji_category_recent">Recent</string>
<string name="emoji_backspace">Backspace</string> <string name="emoji_backspace">Backspace</string>
<string name="emoji_search">Search emoji</string>
<!-- Conversation info guest access --> <!-- Conversation info guest access -->
<string name="nc_guest_access">Guest access</string> <string name="nc_guest_access">Guest access</string>

View File

@ -24,7 +24,7 @@
buildscript { buildscript {
ext { ext {
kotlinVersion = '1.8.22' kotlinVersion = '1.9.10'
} }
repositories { repositories {
@ -34,7 +34,7 @@ buildscript {
} }
dependencies { dependencies {
classpath 'com.android.tools.build:gradle:8.1.0' classpath 'com.android.tools.build:gradle:8.1.1'
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:${kotlinVersion}" classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:${kotlinVersion}"
classpath "org.jetbrains.kotlin:kotlin-serialization:${kotlinVersion}" classpath "org.jetbrains.kotlin:kotlin-serialization:${kotlinVersion}"
classpath 'com.github.spotbugs.snom:spotbugs-gradle-plugin:5.1.3' classpath 'com.github.spotbugs.snom:spotbugs-gradle-plugin:5.1.3'