diff --git a/app/src/main/java/com/nextcloud/talk/activities/CallActivity.kt b/app/src/main/java/com/nextcloud/talk/activities/CallActivity.kt index 6149b7d68..9728225cc 100644 --- a/app/src/main/java/com/nextcloud/talk/activities/CallActivity.kt +++ b/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,8 +427,10 @@ 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) - .show() + Snackbar.make( + binding!!.root, + context.resources.getString(R.string.record_active_info), + Snackbar.LENGTH_LONG).show() } } else if (viewState is RecordingStartingState) { if (isAllowedToStartOrStopRecording) { @@ -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() } } @@ -1437,7 +1440,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 } @@ -1632,10 +1635,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() } @@ -1909,7 +1912,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) } @@ -2091,10 +2094,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 @@ -2723,10 +2726,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() } diff --git a/app/src/main/java/com/nextcloud/talk/activities/FullScreenImageActivity.kt b/app/src/main/java/com/nextcloud/talk/activities/FullScreenImageActivity.kt index ddd5c0813..999c6e7fa 100644 --- a/app/src/main/java/com/nextcloud/talk/activities/FullScreenImageActivity.kt +++ b/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) } diff --git a/app/src/main/java/com/nextcloud/talk/activities/TakePhotoActivity.java b/app/src/main/java/com/nextcloud/talk/activities/TakePhotoActivity.java index e7743ca2a..3159decff 100644 --- a/app/src/main/java/com/nextcloud/talk/activities/TakePhotoActivity.java +++ b/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(); } }); diff --git a/app/src/main/java/com/nextcloud/talk/adapters/messages/IncomingLocationMessageViewHolder.kt b/app/src/main/java/com/nextcloud/talk/adapters/messages/IncomingLocationMessageViewHolder.kt index 38a516c33..65af408a8 100644 --- a/app/src/main/java/com/nextcloud/talk/adapters/messages/IncomingLocationMessageViewHolder.kt +++ b/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 @@ -263,7 +263,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") } } diff --git a/app/src/main/java/com/nextcloud/talk/adapters/messages/OutcomingLocationMessageViewHolder.kt b/app/src/main/java/com/nextcloud/talk/adapters/messages/OutcomingLocationMessageViewHolder.kt index e61b6704b..72c32d348 100644 --- a/app/src/main/java/com/nextcloud/talk/adapters/messages/OutcomingLocationMessageViewHolder.kt +++ b/app/src/main/java/com/nextcloud/talk/adapters/messages/OutcomingLocationMessageViewHolder.kt @@ -32,12 +32,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.nextcloud.android.common.ui.theme.utils.ColorRole +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 @@ -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.ReadStatus 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.DateUtils import com.nextcloud.talk.utils.UriUtils @@ -249,7 +249,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") } } diff --git a/app/src/main/java/com/nextcloud/talk/callnotification/CallNotificationActivity.kt b/app/src/main/java/com/nextcloud/talk/callnotification/CallNotificationActivity.kt index dfcbd511a..eb5da933a 100644 --- a/app/src/main/java/com/nextcloud/talk/callnotification/CallNotificationActivity.kt +++ b/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 -> {} diff --git a/app/src/main/java/com/nextcloud/talk/chat/ChatActivity.kt b/app/src/main/java/com/nextcloud/talk/chat/ChatActivity.kt index 23bffe15e..4486144e3 100644 --- a/app/src/main/java/com/nextcloud/talk/chat/ChatActivity.kt +++ b/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 @@ -1676,16 +1676,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() } } @@ -1847,7 +1847,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() } } } @@ -2365,12 +2365,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) } } @@ -2420,20 +2426,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) } } @@ -2489,28 +2497,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) { @@ -2518,20 +2526,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() } } @@ -2564,7 +2572,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) } } @@ -3565,7 +3576,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) @@ -3726,7 +3737,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? @@ -3751,10 +3762,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() } } @@ -3766,7 +3777,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() { @@ -4126,7 +4137,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() { @@ -4160,7 +4171,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 } diff --git a/app/src/main/java/com/nextcloud/talk/controllers/AccountVerificationController.kt b/app/src/main/java/com/nextcloud/talk/controllers/AccountVerificationController.kt index e9e3dc28f..941b74ffc 100644 --- a/app/src/main/java/com/nextcloud/talk/controllers/AccountVerificationController.kt +++ b/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() } } } diff --git a/app/src/main/java/com/nextcloud/talk/conversationinfo/ConversationInfoActivity.kt b/app/src/main/java/com/nextcloud/talk/conversationinfo/ConversationInfoActivity.kt index f4a64a94a..09803559d 100644 --- a/app/src/main/java/com/nextcloud/talk/conversationinfo/ConversationInfoActivity.kt +++ b/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,13 @@ class ConversationInfoActivity : } override fun onNext(genericOverall: GenericOverall) { - Toast.makeText(context, context.getString(R.string.nc_clear_history_success), Toast.LENGTH_LONG) - .show() + 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) } diff --git a/app/src/main/java/com/nextcloud/talk/conversationinfo/GuestAccessHelper.kt b/app/src/main/java/com/nextcloud/talk/conversationinfo/GuestAccessHelper.kt index 5377a8dbd..b0c6aa665 100644 --- a/app/src/main/java/com/nextcloud/talk/conversationinfo/GuestAccessHelper.kt +++ b/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,14 +145,15 @@ 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) - .show() + Snackbar.make(binding.root, + R.string.nc_guest_access_resend_invitations_successful, + Snackbar.LENGTH_SHORT).show() } } } @@ -167,7 +168,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 +211,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) } diff --git a/app/src/main/java/com/nextcloud/talk/conversationinfoedit/ConversationInfoEditActivity.kt b/app/src/main/java/com/nextcloud/talk/conversationinfoedit/ConversationInfoEditActivity.kt index 1316655e1..6329b570d 100644 --- a/app/src/main/java/com/nextcloud/talk/conversationinfoedit/ConversationInfoEditActivity.kt +++ b/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 -> { diff --git a/app/src/main/java/com/nextcloud/talk/conversationlist/ConversationsListActivity.kt b/app/src/main/java/com/nextcloud/talk/conversationlist/ConversationsListActivity.kt index 1bda26f81..eb1caa8c4 100644 --- a/app/src/main/java/com/nextcloud/talk/conversationlist/ConversationsListActivity.kt +++ b/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 } diff --git a/app/src/main/java/com/nextcloud/talk/jobs/NotificationWorker.kt b/app/src/main/java/com/nextcloud/talk/jobs/NotificationWorker.kt index b5d796b04..44c7407d6 100644 --- a/app/src/main/java/com/nextcloud/talk/jobs/NotificationWorker.kt +++ b/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,19 @@ 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 + ) { + + // 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 +920,19 @@ 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 + ) { + + // 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") } diff --git a/app/src/main/java/com/nextcloud/talk/location/GeocodingActivity.kt b/app/src/main/java/com/nextcloud/talk/location/GeocodingActivity.kt index 535356699..854d3825c 100644 --- a/app/src/main/java/com/nextcloud/talk/location/GeocodingActivity.kt +++ b/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) } diff --git a/app/src/main/java/com/nextcloud/talk/location/LocationPickerActivity.kt b/app/src/main/java/com/nextcloud/talk/location/LocationPickerActivity.kt index fef8a16ab..be2bba066 100644 --- a/app/src/main/java/com/nextcloud/talk/location/LocationPickerActivity.kt +++ b/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,11 @@ 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 @@ -341,11 +345,13 @@ class LocationPickerActivity : setLocationDescription(isGpsLocation = true, isGeocodedResult = false) moveToCurrentLocation = false } + geocodingResult != null -> { binding.shareLocation.isClickable = true setLocationDescription(isGpsLocation = false, isGeocodedResult = true) geocodingResult = null } + else -> { binding.shareLocation.isClickable = true setLocationDescription(isGpsLocation = false, isGeocodedResult = false) @@ -377,6 +383,7 @@ class LocationPickerActivity : this ) } + locationManager!!.isProviderEnabled(LocationManager.GPS_PROVIDER) -> { locationManager!!.requestLocationUpdates( LocationManager.GPS_PROVIDER, @@ -386,6 +393,7 @@ class LocationPickerActivity : ) Log.d(TAG, "LocationManager.NETWORK_PROVIDER falling back to LocationManager.GPS_PROVIDER") } + else -> { Log.e( TAG, @@ -393,16 +401,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() } } @@ -413,11 +421,13 @@ class LocationPickerActivity : binding.placeName.visibility = View.GONE binding.placeName.text = "" } + isGeocodedResult -> { binding.shareLocationDescription.text = context!!.getText(R.string.nc_share_this_location) binding.placeName.visibility = View.VISIBLE binding.placeName.text = geocodingResult?.displayName } + else -> { binding.shareLocationDescription.text = context!!.getText(R.string.nc_share_this_location) binding.placeName.visibility = View.GONE @@ -476,7 +486,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,8 +541,11 @@ 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) - .show() + Snackbar.make( + 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) } 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) } diff --git a/app/src/main/java/com/nextcloud/talk/messagesearch/MessageSearchActivity.kt b/app/src/main/java/com/nextcloud/talk/messagesearch/MessageSearchActivity.kt index a4f8373c6..65850c5fa 100644 --- a/app/src/main/java/com/nextcloud/talk/messagesearch/MessageSearchActivity.kt +++ b/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() { diff --git a/app/src/main/java/com/nextcloud/talk/openconversations/ListOpenConversationsActivity.kt b/app/src/main/java/com/nextcloud/talk/openconversations/ListOpenConversationsActivity.kt index 6f1eefd83..aa1b19c97 100644 --- a/app/src/main/java/com/nextcloud/talk/openconversations/ListOpenConversationsActivity.kt +++ b/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 -> {} } diff --git a/app/src/main/java/com/nextcloud/talk/polls/ui/PollCreateDialogFragment.kt b/app/src/main/java/com/nextcloud/talk/polls/ui/PollCreateDialogFragment.kt index ed7c1ce4c..16d8bf67e 100644 --- a/app/src/main/java/com/nextcloud/talk/polls/ui/PollCreateDialogFragment.kt +++ b/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) { diff --git a/app/src/main/java/com/nextcloud/talk/polls/ui/PollVoteFragment.kt b/app/src/main/java/com/nextcloud/talk/polls/ui/PollVoteFragment.kt index 2ce3ccbf4..2443abaca 100644 --- a/app/src/main/java/com/nextcloud/talk/polls/ui/PollVoteFragment.kt +++ b/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) diff --git a/app/src/main/java/com/nextcloud/talk/profile/ProfileActivity.kt b/app/src/main/java/com/nextcloud/talk/profile/ProfileActivity.kt index e54e8d469..c44c50cff 100644 --- a/app/src/main/java/com/nextcloud/talk/profile/ProfileActivity.kt +++ b/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) diff --git a/app/src/main/java/com/nextcloud/talk/receivers/ShareRecordingToChatReceiver.kt b/app/src/main/java/com/nextcloud/talk/receivers/ShareRecordingToChatReceiver.kt index dd52c63b5..11f6c5bf3 100644 --- a/app/src/main/java/com/nextcloud/talk/receivers/ShareRecordingToChatReceiver.kt +++ b/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() } diff --git a/app/src/main/java/com/nextcloud/talk/settings/SettingsActivity.kt b/app/src/main/java/com/nextcloud/talk/settings/SettingsActivity.kt index fc7a796f6..f8c7bb8f2 100644 --- a/app/src/main/java/com/nextcloud/talk/settings/SettingsActivity.kt +++ b/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( diff --git a/app/src/main/java/com/nextcloud/talk/utils/FileViewerUtils.kt b/app/src/main/java/com/nextcloud/talk/utils/FileViewerUtils.kt index a44e3917c..611f6d659 100644 --- a/app/src/main/java/com/nextcloud/talk/utils/FileViewerUtils.kt +++ b/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() } }