Procházet zdrojové kódy

Replaced all the Toasts with Snackbar

Smarshall před 1 rokem
rodič
revize
a447196257
23 změnil soubory, kde provedl 224 přidání a 175 odebrání
  1. 26 23
      app/src/main/java/com/nextcloud/talk/activities/CallActivity.kt
  2. 2 2
      app/src/main/java/com/nextcloud/talk/activities/FullScreenImageActivity.kt
  3. 3 4
      app/src/main/java/com/nextcloud/talk/activities/TakePhotoActivity.java
  4. 2 2
      app/src/main/java/com/nextcloud/talk/adapters/messages/IncomingLocationMessageViewHolder.kt
  5. 2 2
      app/src/main/java/com/nextcloud/talk/adapters/messages/OutcomingLocationMessageViewHolder.kt
  6. 2 2
      app/src/main/java/com/nextcloud/talk/callnotification/CallNotificationActivity.kt
  7. 62 51
      app/src/main/java/com/nextcloud/talk/chat/ChatActivity.kt
  8. 2 2
      app/src/main/java/com/nextcloud/talk/controllers/AccountVerificationController.kt
  9. 3 3
      app/src/main/java/com/nextcloud/talk/conversationinfo/ConversationInfoActivity.kt
  10. 5 5
      app/src/main/java/com/nextcloud/talk/conversationinfo/GuestAccessHelper.kt
  11. 11 11
      app/src/main/java/com/nextcloud/talk/conversationinfoedit/ConversationInfoEditActivity.kt
  12. 23 21
      app/src/main/java/com/nextcloud/talk/conversationlist/ConversationsListActivity.kt
  13. 35 2
      app/src/main/java/com/nextcloud/talk/jobs/NotificationWorker.kt
  14. 2 2
      app/src/main/java/com/nextcloud/talk/location/GeocodingActivity.kt
  15. 8 8
      app/src/main/java/com/nextcloud/talk/location/LocationPickerActivity.kt
  16. 2 2
      app/src/main/java/com/nextcloud/talk/messagesearch/MessageSearchActivity.kt
  17. 2 2
      app/src/main/java/com/nextcloud/talk/openconversations/ListOpenConversationsActivity.kt
  18. 2 2
      app/src/main/java/com/nextcloud/talk/polls/ui/PollCreateDialogFragment.kt
  19. 4 4
      app/src/main/java/com/nextcloud/talk/polls/ui/PollVoteFragment.kt
  20. 10 10
      app/src/main/java/com/nextcloud/talk/profile/ProfileActivity.kt
  21. 6 5
      app/src/main/java/com/nextcloud/talk/receivers/ShareRecordingToChatReceiver.kt
  22. 7 7
      app/src/main/java/com/nextcloud/talk/settings/SettingsActivity.kt
  23. 3 3
      app/src/main/java/com/nextcloud/talk/utils/FileViewerUtils.kt

+ 26 - 23
app/src/main/java/com/nextcloud/talk/activities/CallActivity.kt

@@ -57,7 +57,6 @@ import android.view.ViewTreeObserver.OnGlobalLayoutListener
 import android.widget.AdapterView
 import android.widget.FrameLayout
 import android.widget.RelativeLayout
-import android.widget.Toast
 import androidx.activity.result.contract.ActivityResultContracts
 import androidx.annotation.DrawableRes
 import androidx.annotation.RequiresApi
@@ -67,6 +66,7 @@ import androidx.lifecycle.ViewModelProvider
 import autodagger.AutoInjector
 import com.bluelinelabs.logansquare.LoganSquare
 import com.google.android.material.dialog.MaterialAlertDialogBuilder
+import com.google.android.material.snackbar.Snackbar
 import com.nextcloud.talk.R
 import com.nextcloud.talk.adapters.ParticipantDisplayItem
 import com.nextcloud.talk.adapters.ParticipantsAdapter
@@ -427,7 +427,9 @@ class CallActivity : CallBaseActivity() {
                 binding!!.callRecordingIndicator.visibility = View.VISIBLE
                 if (viewState.showStartedInfo) {
                     vibrateShort(context)
-                    Toast.makeText(context, context.resources.getString(R.string.record_active_info), Toast.LENGTH_LONG)
+                    Snackbar.make(
+                        binding!!.root, context.resources.getString(R.string.record_active_info), Snackbar
+                        .LENGTH_LONG)
                         .show()
                 }
             } else if (viewState is RecordingStartingState) {
@@ -459,10 +461,10 @@ class CallActivity : CallBaseActivity() {
                 }
             } else if (viewState is RecordingErrorState) {
                 if (isAllowedToStartOrStopRecording) {
-                    Toast.makeText(
-                        context,
+                    Snackbar.make(
+                        binding!!.root,
                         context.resources.getString(R.string.record_failed_info),
-                        Toast.LENGTH_LONG
+                        Snackbar.LENGTH_LONG
                     ).show()
                 }
                 binding!!.callRecordingIndicator.visibility = View.GONE
@@ -567,10 +569,10 @@ class CallActivity : CallBaseActivity() {
             }
         } else {
             binding!!.microphoneButton.setOnClickListener {
-                Toast.makeText(
-                    context,
+                Snackbar.make(
+                    binding!!.root,
                     R.string.nc_not_allowed_to_activate_audio,
-                    Toast.LENGTH_SHORT
+                    Snackbar.LENGTH_SHORT
                 ).show()
             }
         }
@@ -579,10 +581,10 @@ class CallActivity : CallBaseActivity() {
             binding!!.cameraButton.setOnClickListener { onCameraClick() }
         } else {
             binding!!.cameraButton.setOnClickListener {
-                Toast.makeText(
-                    context,
+                Snackbar.make(
+                    binding!!.root,
                     R.string.nc_not_allowed_to_activate_video,
-                    Toast.LENGTH_SHORT
+                    Snackbar.LENGTH_SHORT
                 ).show()
             }
         }
@@ -612,7 +614,8 @@ class CallActivity : CallBaseActivity() {
                     callRecordingViewModel!!.clickRecordButton()
                 }
             } else {
-                Toast.makeText(context, context.resources.getString(R.string.record_active_info), Toast.LENGTH_LONG)
+                Snackbar.make(binding!!.root, context.resources.getString(R.string.record_active_info), Snackbar
+                    .LENGTH_LONG)
                     .show()
             }
         }
@@ -1439,7 +1442,7 @@ class CallActivity : CallBaseActivity() {
                 }
 
                 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)
                     // unused atm
                 }
@@ -1634,10 +1637,10 @@ class CallActivity : CallBaseActivity() {
     private fun showCallRunningSinceOneHourOrMoreInfo() {
         binding!!.callDuration.setTypeface(null, Typeface.BOLD)
         vibrateShort(context)
-        Toast.makeText(
-            context,
+        Snackbar.make(
+            binding!!.root,
             context.resources.getString(R.string.call_running_since_one_hour),
-            Toast.LENGTH_LONG
+            Snackbar.LENGTH_LONG
         ).show()
     }
 
@@ -1911,7 +1914,7 @@ class CallActivity : CallBaseActivity() {
                 }
 
                 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)
                 }
 
@@ -2093,10 +2096,10 @@ class CallActivity : CallBaseActivity() {
         } else {
             if (peerConnectionFactory == null) {
                 Log.e(TAG, "peerConnectionFactory was null in getOrCreatePeerConnectionWrapperForSessionIdAndType")
-                Toast.makeText(
-                    context,
+                Snackbar.make(
+                    binding!!.root,
                     context.resources.getString(R.string.nc_common_error_sorry),
-                    Toast.LENGTH_LONG
+                    Snackbar.LENGTH_LONG
                 ).show()
                 hangup(true)
                 return null
@@ -2725,10 +2728,10 @@ class CallActivity : CallBaseActivity() {
             }
             raisedHand = true
             val nick = callParticipantModel.nick
-            Toast.makeText(
-                context,
+            Snackbar.make(
+                binding!!.root,
                 String.format(context.resources.getString(R.string.nc_call_raised_hand), nick),
-                Toast.LENGTH_LONG
+                Snackbar.LENGTH_LONG
             ).show()
         }
 

+ 2 - 2
app/src/main/java/com/nextcloud/talk/activities/FullScreenImageActivity.kt

@@ -32,9 +32,9 @@ import android.util.Log
 import android.view.Menu
 import android.view.MenuItem
 import android.view.View
-import android.widget.Toast
 import androidx.appcompat.app.AppCompatActivity
 import androidx.core.content.FileProvider
+import com.google.android.material.snackbar.Snackbar
 import com.nextcloud.talk.BuildConfig
 import com.nextcloud.talk.R
 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
         if (bitmapSize > HUNDRED_MB) {
             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 {
             binding.photoView.setImageBitmap(bitmap)
         }

+ 3 - 4
app/src/main/java/com/nextcloud/talk/activities/TakePhotoActivity.java

@@ -37,8 +37,7 @@ import android.view.OrientationEventListener;
 import android.view.ScaleGestureDetector;
 import android.view.Surface;
 import android.view.View;
-import android.widget.Toast;
-
+import com.google.android.material.snackbar.Snackbar;
 import com.google.common.util.concurrent.ListenableFuture;
 import com.nextcloud.talk.R;
 import com.nextcloud.talk.application.NextcloudTalkApplication;
@@ -234,7 +233,7 @@ public class TakePhotoActivity extends AppCompatActivity {
                 binding.photoPreview.setMediumScale(MEDIUM_SCALE);
             } catch (IllegalArgumentException | ExecutionException | InterruptedException 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();
             }
         }, ContextCompat.getMainExecutor(this));
@@ -326,7 +325,7 @@ public class TakePhotoActivity extends AppCompatActivity {
                     });
             } catch (Exception 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();
             }
         });
 

+ 2 - 2
app/src/main/java/com/nextcloud/talk/adapters/messages/IncomingLocationMessageViewHolder.kt

@@ -37,9 +37,9 @@ import android.view.MotionEvent
 import android.view.View
 import android.webkit.WebView
 import android.webkit.WebViewClient
-import android.widget.Toast
 import autodagger.AutoInjector
 import coil.load
+import com.google.android.material.snackbar.Snackbar
 import com.nextcloud.talk.R
 import com.nextcloud.talk.application.NextcloudTalkApplication
 import com.nextcloud.talk.application.NextcloudTalkApplication.Companion.sharedApplication
@@ -264,7 +264,7 @@ class IncomingLocationMessageViewHolder(incomingView: View, payload: Any) :
             browserIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
             context!!.startActivity(browserIntent)
         } 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")
         }
     }

+ 2 - 2
app/src/main/java/com/nextcloud/talk/adapters/messages/OutcomingLocationMessageViewHolder.kt

@@ -33,11 +33,11 @@ import android.view.MotionEvent
 import android.view.View
 import android.webkit.WebView
 import android.webkit.WebViewClient
-import android.widget.Toast
 import androidx.appcompat.content.res.AppCompatResources
 import autodagger.AutoInjector
 import coil.load
 import com.google.android.flexbox.FlexboxLayout
+import com.google.android.material.snackbar.Snackbar
 import com.nextcloud.talk.R
 import com.nextcloud.talk.application.NextcloudTalkApplication
 import com.nextcloud.talk.application.NextcloudTalkApplication.Companion.sharedApplication
@@ -252,7 +252,7 @@ class OutcomingLocationMessageViewHolder(incomingView: View) :
             browserIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
             context!!.startActivity(browserIntent)
         } 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")
         }
     }

+ 2 - 2
app/src/main/java/com/nextcloud/talk/callnotification/CallNotificationActivity.kt

@@ -30,11 +30,11 @@ import android.os.Handler
 import android.os.Looper
 import android.util.Log
 import android.view.View
-import android.widget.Toast
 import androidx.annotation.RequiresApi
 import androidx.core.app.NotificationManagerCompat
 import androidx.lifecycle.ViewModelProvider
 import autodagger.AutoInjector
+import com.google.android.material.snackbar.Snackbar
 import com.nextcloud.talk.R
 import com.nextcloud.talk.activities.CallActivity
 import com.nextcloud.talk.activities.CallBaseActivity
@@ -210,7 +210,7 @@ class CallNotificationActivity : CallBaseActivity() {
                 }
 
                 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 -> {}

+ 62 - 51
app/src/main/java/com/nextcloud/talk/chat/ChatActivity.kt

@@ -83,7 +83,6 @@ import android.widget.RelativeLayout.BELOW
 import android.widget.RelativeLayout.LayoutParams
 import android.widget.SeekBar
 import android.widget.TextView
-import android.widget.Toast
 import androidx.activity.OnBackPressedCallback
 import androidx.appcompat.app.AlertDialog
 import androidx.appcompat.view.ContextThemeWrapper
@@ -114,6 +113,7 @@ import coil.transform.CircleCropTransformation
 import com.google.android.flexbox.FlexboxLayout
 import com.google.android.material.button.MaterialButton
 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.talk.BuildConfig
 import com.nextcloud.talk.R
@@ -568,7 +568,7 @@ class ChatActivity :
                 }
 
                 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 -> {}
@@ -612,7 +612,7 @@ class ChatActivity :
                 }
 
                 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 -> {}
@@ -1166,10 +1166,10 @@ class ChatActivity :
                         val voiceRecordDuration = voiceRecordEndTime - voiceRecordStartTime
                         if (voiceRecordDuration < MINIMUM_VOICE_RECORD_DURATION) {
                             Log.d(TAG, "voiceRecordDuration: $voiceRecordDuration")
-                            Toast.makeText(
-                                context,
+                            Snackbar.make(
+                                binding.root,
                                 context.getString(R.string.nc_voice_message_hold_to_record_info),
-                                Toast.LENGTH_SHORT
+                                Snackbar.LENGTH_SHORT
                             ).show()
                             stopAndDiscardAudioRecording()
                             return true
@@ -1675,16 +1675,16 @@ class ChatActivity :
         if (conversationUser != null) {
             runOnUiThread {
                 if (currentConversation?.objectType == ObjectType.ROOM) {
-                    Toast.makeText(
-                        context,
+                    Snackbar.make(
+                        binding.root,
                         context.resources.getString(R.string.switch_to_main_room),
-                        Toast.LENGTH_LONG
+                        Snackbar.LENGTH_LONG
                     ).show()
                 } else {
-                    Toast.makeText(
-                        context,
+                    Snackbar.make(
+                        binding.root,
                         context.resources.getString(R.string.switch_to_breakout_room),
-                        Toast.LENGTH_LONG
+                        Snackbar.LENGTH_LONG
                     ).show()
                 }
             }
@@ -1846,7 +1846,7 @@ class ChatActivity :
                 }
             } catch (e: Exception) {
                 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()
             }
         }
     }
@@ -2364,12 +2364,18 @@ class ChatActivity :
                         )
                     }
                 } catch (e: IllegalStateException) {
-                    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)
                 } 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)
                 }
             }
@@ -2419,20 +2425,22 @@ class ChatActivity :
                             UploadAndShareFilesWorker.requestStoragePermission(this)
                         }
                     } catch (e: IllegalStateException) {
-                        Toast.makeText(
-                            context,
-                            context.resources?.getString(R.string.nc_upload_failed),
-                            Toast.LENGTH_LONG
+                        Snackbar.make(
+                            binding.root,
+                            R.string.nc_upload_failed,
+                            Snackbar.LENGTH_LONG
                         )
                             .show()
                         Log.e(javaClass.simpleName, "Something went wrong when trying to upload file", e)
                     } 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)
                     }
                 }
@@ -2488,28 +2496,28 @@ class ChatActivity :
                     uploadFiles(filesToUpload)
                 }
             } else {
-                Toast
-                    .makeText(context, context.getString(R.string.read_storage_no_permission), Toast.LENGTH_LONG)
+                Snackbar
+                    .make(binding.root, context.getString(R.string.read_storage_no_permission), Snackbar.LENGTH_LONG)
                     .show()
             }
         } else if (requestCode == REQUEST_SHARE_FILE_PERMISSION) {
             if (grantResults.isNotEmpty() && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                 showLocalFilePicker()
             } else {
-                Toast.makeText(
-                    context,
+                Snackbar.make(
+                    binding.root,
                     context.getString(R.string.nc_file_storage_permission),
-                    Toast.LENGTH_LONG
+                    Snackbar.LENGTH_LONG
                 ).show()
             }
         } else if (requestCode == REQUEST_RECORD_AUDIO_PERMISSION) {
             if (grantResults.isNotEmpty() && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                 // do nothing. user will tap on the microphone again if he wants to record audio..
             } else {
-                Toast.makeText(
-                    context,
+                Snackbar.make(
+                    binding.root,
                     context.getString(R.string.nc_voice_message_missing_audio_permission),
-                    Toast.LENGTH_LONG
+                    Snackbar.LENGTH_LONG
                 ).show()
             }
         } else if (requestCode == REQUEST_READ_CONTACT_PERMISSION) {
@@ -2517,20 +2525,20 @@ class ChatActivity :
                 val intent = Intent(Intent.ACTION_PICK, ContactsContract.Contacts.CONTENT_URI)
                 startActivityForResult(intent, REQUEST_CODE_SELECT_CONTACT)
             } else {
-                Toast.makeText(
-                    context,
+                Snackbar.make(
+                    binding.root,
                     context.getString(R.string.nc_share_contact_permission),
-                    Toast.LENGTH_LONG
+                    Snackbar.LENGTH_LONG
                 ).show()
             }
         } else if (requestCode == REQUEST_CAMERA_PERMISSION) {
             if (grantResults.isNotEmpty() && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
-                Toast
-                    .makeText(context, context.getString(R.string.camera_permission_granted), Toast.LENGTH_LONG)
+                Snackbar
+                    .make(binding.root, context.getString(R.string.camera_permission_granted), Snackbar.LENGTH_LONG)
                     .show()
             } else {
-                Toast
-                    .makeText(context, context.getString(R.string.take_photo_permission), Toast.LENGTH_LONG)
+                Snackbar
+                    .make(binding.root, context.getString(R.string.take_photo_permission), Snackbar.LENGTH_LONG)
                     .show()
             }
         }
@@ -2563,7 +2571,10 @@ class ChatActivity :
                 metaData
             )
         } 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)
         }
     }
@@ -3564,7 +3575,7 @@ class ChatActivity :
             if (conversationUser != null) {
                 val pp = ParticipantPermissions(conversationUser!!, it)
                 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 {
                     ApplicationWideCurrentRoomHolder.getInstance().isDialing = true
                     val callIntent = getIntentForCall(isVoiceOnlyCall, callWithoutNotification)
@@ -3725,7 +3736,7 @@ class ChatActivity :
                 "Deletion of message is skipped because of restrictions by permissions. " +
                     "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 {
             var apiVersion = 1
             // FIXME Fix API checking with guests?
@@ -3750,10 +3761,10 @@ class ChatActivity :
 
                     override fun onNext(t: ChatOverallSingleMessage) {
                         if (t.ocs!!.meta!!.statusCode == HttpURLConnection.HTTP_ACCEPTED) {
-                            Toast.makeText(
-                                context,
+                            Snackbar.make(
+                                binding.root,
                                 R.string.nc_delete_message_leaked_to_matterbridge,
-                                Toast.LENGTH_LONG
+                                Snackbar.LENGTH_LONG
                             ).show()
                         }
                     }
@@ -3765,7 +3776,7 @@ class ChatActivity :
                                 message?.id,
                             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() {
@@ -4125,7 +4136,7 @@ class ChatActivity :
 
                     override fun onError(e: Throwable) {
                         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() {
@@ -4159,7 +4170,7 @@ class ChatActivity :
                         )
                         File("$outputDir/$videoName$VIDEO_SUFFIX")
                     } 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)
                         null
                     }

+ 2 - 2
app/src/main/java/com/nextcloud/talk/controllers/AccountVerificationController.kt

@@ -29,7 +29,6 @@ import android.os.Handler
 import android.text.TextUtils
 import android.util.Log
 import android.view.View
-import android.widget.Toast
 import androidx.work.Data
 import androidx.work.OneTimeWorkRequest
 import androidx.work.WorkManager
@@ -37,6 +36,7 @@ import autodagger.AutoInjector
 import com.bluelinelabs.conductor.RouterTransaction
 import com.bluelinelabs.conductor.changehandler.HorizontalChangeHandler
 import com.bluelinelabs.logansquare.LoganSquare
+import com.google.android.material.snackbar.Snackbar
 import com.nextcloud.talk.R
 import com.nextcloud.talk.api.NcApi
 import com.nextcloud.talk.application.NextcloudTalkApplication
@@ -474,7 +474,7 @@ class AccountVerificationController(args: Bundle? = null) : BaseController(
                 }
             } else {
                 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()
             }
         }
     }

+ 3 - 3
app/src/main/java/com/nextcloud/talk/conversationinfo/ConversationInfoActivity.kt

@@ -39,7 +39,6 @@ import android.view.MenuItem
 import android.view.View
 import android.view.View.GONE
 import android.view.View.VISIBLE
-import android.widget.Toast
 import androidx.appcompat.app.AlertDialog
 import androidx.work.Data
 import androidx.work.OneTimeWorkRequest
@@ -50,6 +49,7 @@ import com.afollestad.materialdialogs.MaterialDialog
 import com.afollestad.materialdialogs.bottomsheets.BottomSheet
 import com.afollestad.materialdialogs.datetime.dateTimePicker
 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.talk.R
 import com.nextcloud.talk.activities.BaseActivity
@@ -594,12 +594,12 @@ class ConversationInfoActivity :
                 }
 
                 override fun onNext(genericOverall: GenericOverall) {
-                    Toast.makeText(context, context.getString(R.string.nc_clear_history_success), Toast.LENGTH_LONG)
+                    Snackbar.make(binding.root, context.getString(R.string.nc_clear_history_success), Snackbar.LENGTH_LONG)
                         .show()
                 }
 
                 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)
                 }
 

+ 5 - 5
app/src/main/java/com/nextcloud/talk/conversationinfo/GuestAccessHelper.kt

@@ -4,9 +4,9 @@ import android.content.Intent
 import android.util.Log
 import android.view.LayoutInflater
 import android.view.View
-import android.widget.Toast
 import androidx.appcompat.app.AlertDialog
 import com.google.android.material.dialog.MaterialAlertDialogBuilder
+import com.google.android.material.snackbar.Snackbar
 import com.nextcloud.talk.R
 import com.nextcloud.talk.data.user.model.User
 import com.nextcloud.talk.databinding.ActivityConversationInfoBinding
@@ -145,13 +145,13 @@ class GuestAccessHelper(
 
         override fun onError(e: Throwable) {
             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)
         }
 
         override fun onComplete() {
             if (resendInvitationsResult.successful) {
-                Toast.makeText(context, R.string.nc_guest_access_resend_invitations_successful, Toast.LENGTH_SHORT)
+                Snackbar.make(binding.root, R.string.nc_guest_access_resend_invitations_successful, Snackbar.LENGTH_SHORT)
                     .show()
             }
         }
@@ -167,7 +167,7 @@ class GuestAccessHelper(
 
         override fun onError(e: Throwable) {
             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)
         }
 
@@ -210,7 +210,7 @@ class GuestAccessHelper(
 
         override fun onError(e: Throwable) {
             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)
         }
 

+ 11 - 11
app/src/main/java/com/nextcloud/talk/conversationinfoedit/ConversationInfoEditActivity.kt

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

+ 23 - 21
app/src/main/java/com/nextcloud/talk/conversationlist/ConversationsListActivity.kt

@@ -50,7 +50,6 @@ import android.view.MotionEvent
 import android.view.View
 import android.view.inputmethod.EditorInfo
 import android.view.inputmethod.InputMethodManager
-import android.widget.Toast
 import androidx.activity.OnBackPressedCallback
 import androidx.appcompat.app.AlertDialog
 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.button.MaterialButton
 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.talk.R
 import com.nextcloud.talk.activities.BaseActivity
@@ -267,7 +267,7 @@ class ConversationsListActivity :
             fetchRooms()
         } else {
             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()
@@ -309,7 +309,7 @@ class ConversationsListActivity :
             )
         } else {
             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()
         }
     }
 
@@ -989,14 +989,14 @@ class ConversationsListActivity :
                 ) {
                     handleSharedData()
                 } 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) {
                 if (hasChatPermission && !isReadOnlyConversation(selectedConversation!!)) {
                     openConversation(intent.getStringExtra(KEY_FORWARD_MSG_TEXT))
                     forwardMessage = false
                 } 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 {
                 openConversation()
@@ -1023,8 +1023,8 @@ class ConversationsListActivity :
         } else if (filesToShare != null && filesToShare!!.isNotEmpty()) {
             showSendFilesConfirmDialog()
         } else {
-            Toast
-                .makeText(context, context.resources.getString(R.string.nc_common_error_sorry), Toast.LENGTH_LONG)
+            Snackbar
+                .make(binding.root, context.resources.getString(R.string.nc_common_error_sorry), Snackbar.LENGTH_LONG)
                 .show()
         }
     }
@@ -1125,18 +1125,18 @@ class ConversationsListActivity :
                         }
                     }
                     if (filesToShare!!.isEmpty() && textToPaste!!.isEmpty()) {
-                        Toast.makeText(
-                            context,
+                        Snackbar.make(
+                            binding.root,
                             context.resources.getString(R.string.nc_common_error_sorry),
-                            Toast.LENGTH_LONG
+                            Snackbar.LENGTH_LONG
                         ).show()
                         Log.e(TAG, "failed to get data from intent")
                     }
                 } catch (e: Exception) {
-                    Toast.makeText(
-                        context,
+                    Snackbar.make(
+                        binding.root,
                         context.resources.getString(R.string.nc_common_error_sorry),
-                        Toast.LENGTH_LONG
+                        Snackbar.LENGTH_LONG
                     ).show()
                     Log.e(TAG, "Something went wrong when extracting data from intent")
                 }
@@ -1146,10 +1146,10 @@ class ConversationsListActivity :
 
     private fun upload() {
         if (selectedConversation == null) {
-            Toast.makeText(
-                context,
+            Snackbar.make(
+                binding.root,
                 context.resources.getString(R.string.nc_common_error_sorry),
-                Toast.LENGTH_LONG
+                Snackbar.LENGTH_LONG
             ).show()
             Log.e(TAG, "not able to upload any files because conversation was null.")
             return
@@ -1164,7 +1164,8 @@ class ConversationsListActivity :
                 )
             }
         } 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)
         }
     }
@@ -1178,7 +1179,8 @@ class ConversationsListActivity :
             Log.d(TAG, "upload starting after permissions were granted")
             showSendFilesConfirmDialog()
         } else {
-            Toast.makeText(context, context.getString(R.string.read_storage_no_permission), Toast.LENGTH_LONG).show()
+            Snackbar.make(binding.root, context.getString(R.string.read_storage_no_permission), Snackbar.LENGTH_LONG)
+                .show()
         }
     }
 
@@ -1186,10 +1188,10 @@ class ConversationsListActivity :
         if (CallActivity.active &&
             selectedConversation!!.token != ApplicationWideCurrentRoomHolder.getInstance().currentRoomToken
         ) {
-            Toast.makeText(
-                context,
+            Snackbar.make(
+                binding.root,
                 context.getString(R.string.restrict_join_other_room_while_call),
-                Toast.LENGTH_LONG
+                Snackbar.LENGTH_LONG
             ).show()
             return
         }

+ 35 - 2
app/src/main/java/com/nextcloud/talk/jobs/NotificationWorker.kt

@@ -23,10 +23,12 @@
  */
 package com.nextcloud.talk.jobs
 
+import android.Manifest
 import android.app.Notification
 import android.app.PendingIntent
 import android.content.Context
 import android.content.Intent
+import android.content.pm.PackageManager
 import android.graphics.Bitmap
 import android.media.AudioAttributes
 import android.media.MediaPlayer
@@ -40,7 +42,8 @@ import android.service.notification.StatusBarNotification
 import android.text.TextUtils
 import android.util.Base64
 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.NotificationManagerCompat
 import androidx.core.app.Person
@@ -53,6 +56,7 @@ import androidx.work.Worker
 import androidx.work.WorkerParameters
 import autodagger.AutoInjector
 import com.bluelinelabs.logansquare.LoganSquare
+import com.google.android.material.snackbar.Snackbar
 import com.nextcloud.talk.BuildConfig
 import com.nextcloud.talk.R
 import com.nextcloud.talk.activities.MainActivity
@@ -325,7 +329,8 @@ class NotificationWorker(context: Context, workerParams: WorkerParameters) : Wor
                     Log.e(TAG, "Failed to get NC notification", e)
                     if (BuildConfig.DEBUG) {
                         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 +739,20 @@ class NotificationWorker(context: Context, workerParams: WorkerParameters) : Wor
 
     private fun sendNotification(notificationId: Int, notification: Notification) {
         Log.d(TAG, "show notification with id $notificationId")
+        if (ActivityCompat.checkSelfPermission(
+                applicationContext,
+                Manifest.permission.POST_NOTIFICATIONS
+            ) != PackageManager.PERMISSION_GRANTED
+        ) {
+            // TODO: Consider calling
+            //    ActivityCompat#requestPermissions
+            // 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)
 
         if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
@@ -902,6 +921,20 @@ class NotificationWorker(context: Context, workerParams: WorkerParameters) : Wor
                             .build()
 
                         val notificationId: Int = SystemClock.uptimeMillis().toInt()
+                        if (ActivityCompat.checkSelfPermission(
+                                applicationContext,
+                                Manifest.permission.POST_NOTIFICATIONS
+                            ) != PackageManager.PERMISSION_GRANTED
+                        ) {
+                            // TODO: Consider calling
+                            //    ActivityCompat#requestPermissions
+                            // 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)
                         Log.d(TAG, "'you missed a call' notification was created")
                     }

+ 2 - 2
app/src/main/java/com/nextcloud/talk/location/GeocodingActivity.kt

@@ -32,11 +32,11 @@ import android.view.Menu
 import android.view.MenuItem
 import android.view.inputmethod.EditorInfo
 import android.widget.AdapterView
-import android.widget.Toast
 import androidx.appcompat.widget.SearchView
 import androidx.core.view.MenuItemCompat
 import androidx.preference.PreferenceManager
 import autodagger.AutoInjector
+import com.google.android.material.snackbar.Snackbar
 import com.nextcloud.talk.R
 import com.nextcloud.talk.activities.BaseActivity
 import com.nextcloud.talk.adapters.GeocodingAdapter
@@ -216,7 +216,7 @@ class GeocodingActivity :
             }
         } catch (e: Exception) {
             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)
     }

+ 8 - 8
app/src/main/java/com/nextcloud/talk/location/LocationPickerActivity.kt

@@ -40,7 +40,6 @@ import android.view.Menu
 import android.view.MenuItem
 import android.view.View
 import android.view.inputmethod.EditorInfo
-import android.widget.Toast
 import androidx.activity.OnBackPressedCallback
 import androidx.appcompat.widget.SearchView
 import androidx.core.content.PermissionChecker
@@ -48,6 +47,7 @@ import androidx.core.content.res.ResourcesCompat
 import androidx.core.view.MenuItemCompat
 import androidx.preference.PreferenceManager
 import autodagger.AutoInjector
+import com.google.android.material.snackbar.Snackbar
 import com.nextcloud.talk.R
 import com.nextcloud.talk.activities.BaseActivity
 import com.nextcloud.talk.api.NcApi
@@ -319,7 +319,7 @@ class LocationPickerActivity :
 
         binding.centerMapButton.setOnClickListener {
             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 {
                 mapController.animateTo(myLocation)
                 moveToCurrentLocation = true
@@ -393,16 +393,16 @@ class LocationPickerActivity :
                             " and there is no alternative like UnifiedNlp installed. Furthermore no GPS is " +
                             "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()
                 }
             }
         } catch (e: SecurityException) {
             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) {
             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()
         }
     }
 
@@ -476,7 +476,7 @@ class LocationPickerActivity :
 
                 override fun onError(e: Throwable) {
                     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()
                 }
 
@@ -531,7 +531,7 @@ class LocationPickerActivity :
         if (requestCode == REQUEST_PERMISSIONS_REQUEST_CODE && areAllGranted(grantResults)) {
             initMap()
         } else {
-            Toast.makeText(context, context!!.getString(R.string.nc_location_permission_required), Toast.LENGTH_LONG)
+            Snackbar.make(binding.root, context!!.getString(R.string.nc_location_permission_required), Snackbar.LENGTH_LONG)
                 .show()
         }
     }
@@ -556,7 +556,7 @@ class LocationPickerActivity :
             address = nominatimClient!!.getAddress(lon, lat)
         } catch (e: Exception) {
             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)
     }

+ 2 - 2
app/src/main/java/com/nextcloud/talk/messagesearch/MessageSearchActivity.kt

@@ -30,11 +30,11 @@ import android.text.TextUtils
 import android.view.Menu
 import android.view.MenuItem
 import android.view.View
-import android.widget.Toast
 import androidx.activity.OnBackPressedCallback
 import androidx.appcompat.widget.SearchView
 import androidx.lifecycle.ViewModelProvider
 import autodagger.AutoInjector
+import com.google.android.material.snackbar.Snackbar
 import com.nextcloud.talk.R
 import com.nextcloud.talk.activities.BaseActivity
 import com.nextcloud.talk.adapters.items.LoadMoreResultsItem
@@ -127,7 +127,7 @@ class MessageSearchActivity : BaseActivity() {
 
     private fun showError() {
         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() {

+ 2 - 2
app/src/main/java/com/nextcloud/talk/openconversations/ListOpenConversationsActivity.kt

@@ -24,9 +24,9 @@ import android.content.Intent
 import android.graphics.drawable.ColorDrawable
 import android.os.Bundle
 import android.view.View
-import android.widget.Toast
 import androidx.lifecycle.ViewModelProvider
 import autodagger.AutoInjector
+import com.google.android.material.snackbar.Snackbar
 import com.nextcloud.talk.R
 import com.nextcloud.talk.activities.BaseActivity
 import com.nextcloud.talk.api.NcApi
@@ -112,7 +112,7 @@ class ListOpenConversationsActivity : BaseActivity() {
                     binding.emptyList.emptyListViewText.visibility = View.VISIBLE
                 }
                 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 -> {}
             }

+ 2 - 2
app/src/main/java/com/nextcloud/talk/polls/ui/PollCreateDialogFragment.kt

@@ -30,12 +30,12 @@ import android.view.LayoutInflater
 import android.view.View
 import android.view.ViewGroup
 import android.widget.EditText
-import android.widget.Toast
 import androidx.fragment.app.DialogFragment
 import androidx.lifecycle.ViewModelProvider
 import androidx.recyclerview.widget.LinearLayoutManager
 import autodagger.AutoInjector
 import com.google.android.material.dialog.MaterialAlertDialogBuilder
+import com.google.android.material.snackbar.Snackbar
 import com.nextcloud.talk.R
 import com.nextcloud.talk.application.NextcloudTalkApplication
 import com.nextcloud.talk.databinding.DialogPollCreateBinding
@@ -172,7 +172,7 @@ class PollCreateDialogFragment : DialogFragment(), PollCreateOptionsItemListener
     private fun showError() {
         dismiss()
         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) {

+ 4 - 4
app/src/main/java/com/nextcloud/talk/polls/ui/PollVoteFragment.kt

@@ -32,12 +32,12 @@ import android.widget.CheckBox
 import android.widget.CompoundButton
 import android.widget.LinearLayout
 import android.widget.RadioButton
-import android.widget.Toast
 import androidx.appcompat.app.AlertDialog
 import androidx.fragment.app.Fragment
 import androidx.lifecycle.ViewModelProvider
 import autodagger.AutoInjector
 import com.google.android.material.dialog.MaterialAlertDialogBuilder
+import com.google.android.material.snackbar.Snackbar
 import com.nextcloud.talk.R
 import com.nextcloud.talk.application.NextcloudTalkApplication
 import com.nextcloud.talk.databinding.DialogPollVoteBinding
@@ -94,10 +94,10 @@ class PollVoteFragment : Fragment() {
                 PollVoteViewModel.InitialState -> {}
                 is PollVoteViewModel.PollVoteFailedState -> {
                     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 -> {
-                    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()
                 }
                 is PollVoteViewModel.PollVoteSuccessState -> {
@@ -182,7 +182,7 @@ class PollVoteFragment : Fragment() {
                             viewModel.selectOption(index, false)
                         } else {
                             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 {
                         viewModel.deSelectOption(index)

+ 10 - 10
app/src/main/java/com/nextcloud/talk/profile/ProfileActivity.kt

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

+ 6 - 5
app/src/main/java/com/nextcloud/talk/receivers/ShareRecordingToChatReceiver.kt

@@ -25,8 +25,9 @@ import android.content.BroadcastReceiver
 import android.content.Context
 import android.content.Intent
 import android.util.Log
-import android.widget.Toast
+import android.view.View
 import autodagger.AutoInjector
+import com.google.android.material.snackbar.Snackbar
 import com.nextcloud.talk.R
 import com.nextcloud.talk.api.NcApi
 import com.nextcloud.talk.application.NextcloudTalkApplication
@@ -91,12 +92,12 @@ class ShareRecordingToChatReceiver : BroadcastReceiver() {
                     // combined with addNextIntentWithParentStack. For further reading, see
                     // 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.
-                    // 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(
-                        context,
+                    Snackbar.make(
+                       View(context),
                         context.resources.getString(R.string.nc_all_ok_operation),
-                        Toast.LENGTH_LONG
+                        Snackbar.LENGTH_LONG
                     ).show()
                 }
 

+ 7 - 7
app/src/main/java/com/nextcloud/talk/settings/SettingsActivity.kt

@@ -52,7 +52,6 @@ import android.view.View
 import android.view.WindowManager
 import android.widget.EditText
 import android.widget.LinearLayout
-import android.widget.Toast
 import androidx.appcompat.app.AlertDialog
 import androidx.appcompat.view.ContextThemeWrapper
 import androidx.core.content.ContextCompat
@@ -63,6 +62,7 @@ import androidx.work.WorkManager
 import autodagger.AutoInjector
 import com.afollestad.materialdialogs.utils.MDUtil.getStringArray
 import com.google.android.material.dialog.MaterialAlertDialogBuilder
+import com.google.android.material.snackbar.Snackbar
 import com.google.android.material.textfield.TextInputLayout
 import com.nextcloud.android.common.ui.theme.utils.ColorRole
 import com.nextcloud.talk.BuildConfig
@@ -888,10 +888,10 @@ class SettingsActivity : BaseActivity() {
         } else {
             appPreferences.setPhoneBookIntegration(false)
             binding.settingsPhoneBookIntegrationSwitch.isChecked = appPreferences.isPhoneBookIntegrationEnabled
-            Toast.makeText(
-                context,
+            Snackbar.make(
+                binding.root,
                 context.resources.getString(R.string.no_phone_book_integration_due_to_permissions),
-                Toast.LENGTH_LONG
+                Snackbar.LENGTH_LONG
             ).show()
         }
     }
@@ -1082,12 +1082,12 @@ class SettingsActivity : BaseActivity() {
                     val statusCode = genericOverall.ocs?.meta?.statusCode
                     if (statusCode == HTTP_CODE) {
                         dialog.dismiss()
-                        Toast.makeText(
-                            context,
+                        Snackbar.make(
+                            binding.root,
                             context.resources.getString(
                                 R.string.nc_settings_phone_book_integration_phone_number_dialog_success
                             ),
-                            Toast.LENGTH_LONG
+                            Snackbar.LENGTH_LONG
                         ).show()
                     } else {
                         textInputLayout.helperText = context.resources.getString(

+ 3 - 3
app/src/main/java/com/nextcloud/talk/utils/FileViewerUtils.kt

@@ -29,13 +29,13 @@ import android.util.Log
 import android.view.View
 import android.widget.ImageView
 import android.widget.ProgressBar
-import android.widget.Toast
 import androidx.core.content.FileProvider
 import androidx.emoji2.widget.EmojiTextView
 import androidx.work.Data
 import androidx.work.OneTimeWorkRequest
 import androidx.work.WorkInfo
 import androidx.work.WorkManager
+import com.google.android.material.snackbar.Snackbar
 import com.nextcloud.talk.R
 import com.nextcloud.talk.activities.FullScreenImageActivity
 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 " +
                     "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 {
             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()
         }
     }