Commit a5488355 authored by Filipe de Lima Brito's avatar Filipe de Lima Brito

Merge branch 'develop' of github.com:RocketChat/Rocket.Chat.Android into new/directory

parents d1b4d63b 84bdd7c6
...@@ -13,7 +13,7 @@ internal fun ChatDetailsFragment.setupMenu(menu: Menu) { ...@@ -13,7 +13,7 @@ internal fun ChatDetailsFragment.setupMenu(menu: Menu) {
with(settings.get(it)) { with(settings.get(it)) {
if (isJitsiEnabled()) { if (isJitsiEnabled()) {
if (roomTypeOf(chatRoomType) !is RoomType.DirectMessage && !isJitsiEnabledForChannels()) { if (roomTypeOf(chatRoomType) !is RoomType.DirectMessage && !isJitsiEnabledForChannels()) {
return return@let
} }
menu.add( menu.add(
Menu.NONE, Menu.NONE,
......
...@@ -5,6 +5,7 @@ import android.content.ClipData ...@@ -5,6 +5,7 @@ import android.content.ClipData
import android.content.ClipboardManager import android.content.ClipboardManager
import android.content.Context import android.content.Context
import android.content.Intent import android.content.Intent
import android.content.pm.PackageManager
import android.graphics.drawable.Drawable import android.graphics.drawable.Drawable
import android.net.Uri import android.net.Uri
import android.os.Bundle import android.os.Bundle
...@@ -61,9 +62,13 @@ import chat.rocket.android.emoji.EmojiPickerPopup ...@@ -61,9 +62,13 @@ import chat.rocket.android.emoji.EmojiPickerPopup
import chat.rocket.android.emoji.EmojiReactionListener import chat.rocket.android.emoji.EmojiReactionListener
import chat.rocket.android.emoji.internal.isCustom import chat.rocket.android.emoji.internal.isCustom
import chat.rocket.android.helper.EndlessRecyclerViewScrollListener import chat.rocket.android.helper.EndlessRecyclerViewScrollListener
import chat.rocket.android.helper.ImageHelper
import chat.rocket.android.helper.KeyboardHelper import chat.rocket.android.helper.KeyboardHelper
import chat.rocket.android.helper.MessageParser import chat.rocket.android.helper.MessageParser
import chat.rocket.android.helper.AndroidPermissionsHelper
import chat.rocket.android.helper.AndroidPermissionsHelper.getCameraPermission
import chat.rocket.android.helper.AndroidPermissionsHelper.getWriteExternalStoragePermission
import chat.rocket.android.helper.AndroidPermissionsHelper.hasCameraPermission
import chat.rocket.android.helper.AndroidPermissionsHelper.hasWriteExternalStoragePermission
import chat.rocket.android.util.extension.asObservable import chat.rocket.android.util.extension.asObservable
import chat.rocket.android.util.extension.createImageFile import chat.rocket.android.util.extension.createImageFile
import chat.rocket.android.util.extensions.circularRevealOrUnreveal import chat.rocket.android.util.extensions.circularRevealOrUnreveal
...@@ -81,6 +86,7 @@ import chat.rocket.common.model.RoomType ...@@ -81,6 +86,7 @@ import chat.rocket.common.model.RoomType
import chat.rocket.common.model.roomTypeOf import chat.rocket.common.model.roomTypeOf
import chat.rocket.core.internal.realtime.socket.model.State import chat.rocket.core.internal.realtime.socket.model.State
import com.bumptech.glide.Glide import com.bumptech.glide.Glide
import com.google.android.material.snackbar.Snackbar
import dagger.android.support.AndroidSupportInjection import dagger.android.support.AndroidSupportInjection
import io.reactivex.Observable import io.reactivex.Observable
import io.reactivex.disposables.CompositeDisposable import io.reactivex.disposables.CompositeDisposable
...@@ -886,8 +892,14 @@ class ChatRoomFragment : Fragment(), ChatRoomView, EmojiKeyboardListener, EmojiR ...@@ -886,8 +892,14 @@ class ChatRoomFragment : Fragment(), ChatRoomView, EmojiKeyboardListener, EmojiR
button_add_reaction_or_show_keyboard.setOnClickListener { toggleKeyboard() } button_add_reaction_or_show_keyboard.setOnClickListener { toggleKeyboard() }
button_take_a_photo.setOnClickListener { button_take_a_photo.setOnClickListener {
dispatchTakePictureIntent() // Check for camera permission
context?.let {
if(hasCameraPermission(it)) {
dispatchTakePictureIntent()
} else {
getCameraPermission(this)
}
}
handler.postDelayed({ handler.postDelayed({
hideAttachmentOptions() hideAttachmentOptions()
}, 400) }, 400)
...@@ -905,11 +917,10 @@ class ChatRoomFragment : Fragment(), ChatRoomView, EmojiKeyboardListener, EmojiR ...@@ -905,11 +917,10 @@ class ChatRoomFragment : Fragment(), ChatRoomView, EmojiKeyboardListener, EmojiR
button_drawing.setOnClickListener { button_drawing.setOnClickListener {
activity?.let { fragmentActivity -> activity?.let { fragmentActivity ->
if (!ImageHelper.canWriteToExternalStorage(fragmentActivity)) { if (!hasWriteExternalStoragePermission(fragmentActivity)) {
ImageHelper.checkWritingPermission(fragmentActivity) getWriteExternalStoragePermission(this)
} else { } else {
val intent = Intent(fragmentActivity, DrawingActivity::class.java) dispatchDrawingIntent()
startActivityForResult(intent, REQUEST_CODE_FOR_DRAW)
} }
} }
...@@ -920,6 +931,11 @@ class ChatRoomFragment : Fragment(), ChatRoomView, EmojiKeyboardListener, EmojiR ...@@ -920,6 +931,11 @@ class ChatRoomFragment : Fragment(), ChatRoomView, EmojiKeyboardListener, EmojiR
} }
} }
private fun dispatchDrawingIntent() {
val intent = Intent(activity, DrawingActivity::class.java)
startActivityForResult(intent, REQUEST_CODE_FOR_DRAW)
}
private fun dispatchTakePictureIntent() { private fun dispatchTakePictureIntent() {
Intent(MediaStore.ACTION_IMAGE_CAPTURE).also { takePictureIntent -> Intent(MediaStore.ACTION_IMAGE_CAPTURE).also { takePictureIntent ->
// Create the File where the photo should go // Create the File where the photo should go
...@@ -940,6 +956,44 @@ class ChatRoomFragment : Fragment(), ChatRoomView, EmojiKeyboardListener, EmojiR ...@@ -940,6 +956,44 @@ class ChatRoomFragment : Fragment(), ChatRoomView, EmojiKeyboardListener, EmojiR
} }
} }
override fun onRequestPermissionsResult(
requestCode: Int,
permissions: Array<out String>,
grantResults: IntArray
) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults)
when(requestCode) {
AndroidPermissionsHelper.CAMERA_CODE -> {
if (grantResults.isNotEmpty() && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
// permission was granted
dispatchTakePictureIntent()
} else {
// permission denied
Snackbar.make(
root_layout,
R.string.msg_camera_permission_denied,
Snackbar.LENGTH_SHORT
).show()
}
return
}
AndroidPermissionsHelper.WRITE_EXTERNAL_STORAGE_CODE -> {
if (grantResults.isNotEmpty() && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
// permission was granted
dispatchDrawingIntent()
} else {
// permission denied
Snackbar.make(
root_layout,
R.string.msg_storage_permission_denied,
Snackbar.LENGTH_SHORT
).show()
}
return
}
}
}
private fun getDraftMessage() { private fun getDraftMessage() {
val unfinishedMessage = presenter.getDraftUnfinishedMessage() val unfinishedMessage = presenter.getDraftUnfinishedMessage()
if (unfinishedMessage.isNotNullNorEmpty()) { if (unfinishedMessage.isNotNullNorEmpty()) {
......
package chat.rocket.android.helper package chat.rocket.android.helper
import android.Manifest
import android.app.Activity import android.app.Activity
import android.content.Context import android.content.Context
import android.content.pm.PackageManager import android.content.pm.PackageManager
import android.view.ContextThemeWrapper
import androidx.core.app.ActivityCompat import androidx.core.app.ActivityCompat
import androidx.core.content.ContextCompat import androidx.core.content.ContextCompat
import androidx.fragment.app.Fragment
object AndroidPermissionsHelper { object AndroidPermissionsHelper {
const val WRITE_EXTERNAL_STORAGE_CODE = 1 const val WRITE_EXTERNAL_STORAGE_CODE = 1
const val CAMERA_CODE = 2
fun checkPermission(context: Context, permission: String): Boolean { private fun checkPermission(context: Context, permission: String): Boolean {
return ContextCompat.checkSelfPermission( return ContextCompat.checkSelfPermission(
context, context,
permission permission
) == PackageManager.PERMISSION_GRANTED ) == PackageManager.PERMISSION_GRANTED
} }
fun requestPermission(context: Activity, permission: String, requestCode: Int) { private fun requestPermission(context: Activity, permission: String, requestCode: Int) {
ActivityCompat.requestPermissions(context, arrayOf(permission), requestCode) ActivityCompat.requestPermissions(context, arrayOf(permission), requestCode)
} }
fun hasCameraPermission(context: Context): Boolean {
return AndroidPermissionsHelper.checkPermission(context, Manifest.permission.CAMERA)
}
fun getCameraPermission(fragment: Fragment) {
fragment.requestPermissions(
arrayOf(Manifest.permission.CAMERA),
CAMERA_CODE
)
}
fun hasWriteExternalStoragePermission(context: Context): Boolean {
return checkPermission(context, Manifest.permission.WRITE_EXTERNAL_STORAGE)
}
fun getWriteExternalStoragePermission(fragment: Fragment) {
fragment.requestPermissions(
arrayOf(Manifest.permission.WRITE_EXTERNAL_STORAGE),
WRITE_EXTERNAL_STORAGE_CODE
)
}
fun checkWritingPermission(context: Context) {
if (context is ContextThemeWrapper) {
val activity = if (context.baseContext is Activity) context.baseContext as Activity else context as Activity
AndroidPermissionsHelper.requestPermission(
activity,
Manifest.permission.WRITE_EXTERNAL_STORAGE,
AndroidPermissionsHelper.WRITE_EXTERNAL_STORAGE_CODE
)
}
}
} }
\ No newline at end of file
package chat.rocket.android.helper package chat.rocket.android.helper
import android.Manifest
import android.app.Activity
import android.content.Context import android.content.Context
import android.graphics.Color import android.graphics.Color
import android.graphics.Typeface import android.graphics.Typeface
...@@ -9,7 +7,6 @@ import android.media.MediaScannerConnection ...@@ -9,7 +7,6 @@ import android.media.MediaScannerConnection
import android.os.Environment import android.os.Environment
import android.text.TextUtils import android.text.TextUtils
import android.util.TypedValue import android.util.TypedValue
import android.view.ContextThemeWrapper
import android.view.ViewGroup import android.view.ViewGroup
import android.widget.ImageView import android.widget.ImageView
import android.widget.TextView import android.widget.TextView
...@@ -18,6 +15,8 @@ import androidx.appcompat.widget.Toolbar ...@@ -18,6 +15,8 @@ import androidx.appcompat.widget.Toolbar
import androidx.core.net.toUri import androidx.core.net.toUri
import androidx.core.view.setPadding import androidx.core.view.setPadding
import chat.rocket.android.R import chat.rocket.android.R
import chat.rocket.android.helper.AndroidPermissionsHelper.checkWritingPermission
import chat.rocket.android.helper.AndroidPermissionsHelper.hasWriteExternalStoragePermission
import com.facebook.binaryresource.FileBinaryResource import com.facebook.binaryresource.FileBinaryResource
import com.facebook.cache.common.CacheKey import com.facebook.cache.common.CacheKey
import com.facebook.imageformat.ImageFormatChecker import com.facebook.imageformat.ImageFormatChecker
...@@ -117,7 +116,7 @@ object ImageHelper { ...@@ -117,7 +116,7 @@ object ImageHelper {
} }
private fun saveImage(context: Context): Boolean { private fun saveImage(context: Context): Boolean {
if (!canWriteToExternalStorage(context)) { if (!hasWriteExternalStoragePermission(context)) {
checkWritingPermission(context) checkWritingPermission(context)
return false return false
} }
...@@ -152,22 +151,4 @@ object ImageHelper { ...@@ -152,22 +151,4 @@ object ImageHelper {
} }
return true return true
} }
fun canWriteToExternalStorage(context: Context): Boolean {
return AndroidPermissionsHelper.checkPermission(
context,
Manifest.permission.WRITE_EXTERNAL_STORAGE
)
}
fun checkWritingPermission(context: Context) {
if (context is ContextThemeWrapper) {
val activity = if (context.baseContext is Activity) context.baseContext as Activity else context as Activity
AndroidPermissionsHelper.requestPermission(
activity,
Manifest.permission.WRITE_EXTERNAL_STORAGE,
AndroidPermissionsHelper.WRITE_EXTERNAL_STORAGE_CODE
)
}
}
} }
\ No newline at end of file
...@@ -23,7 +23,6 @@ import chat.rocket.android.settings.presentation.SettingsView ...@@ -23,7 +23,6 @@ import chat.rocket.android.settings.presentation.SettingsView
import chat.rocket.android.util.extensions.inflate import chat.rocket.android.util.extensions.inflate
import chat.rocket.android.util.extensions.showToast import chat.rocket.android.util.extensions.showToast
import chat.rocket.android.util.invalidateFirebaseToken import chat.rocket.android.util.invalidateFirebaseToken
import com.bumptech.glide.Glide
import dagger.android.support.AndroidSupportInjection import dagger.android.support.AndroidSupportInjection
import kotlinx.android.synthetic.main.app_bar.* import kotlinx.android.synthetic.main.app_bar.*
import kotlinx.android.synthetic.main.fragment_settings.* import kotlinx.android.synthetic.main.fragment_settings.*
...@@ -65,7 +64,7 @@ class SettingsFragment : Fragment(), SettingsView { ...@@ -65,7 +64,7 @@ class SettingsFragment : Fragment(), SettingsView {
isDeleteAccountEnabled: Boolean, isDeleteAccountEnabled: Boolean,
serverVersion: String serverVersion: String
) { ) {
context?.let { Glide.with(it).load(avatar).into(image_avatar) } image_avatar.setImageURI(avatar)
text_display_name.text = displayName text_display_name.text = displayName
...@@ -89,7 +88,7 @@ class SettingsFragment : Fragment(), SettingsView { ...@@ -89,7 +88,7 @@ class SettingsFragment : Fragment(), SettingsView {
text_server_version.text = getString(R.string.msg_server_version, serverVersion) text_server_version.text = getString(R.string.msg_server_version, serverVersion)
text_logout.setOnClickListener { showLogoutDialog()} text_logout.setOnClickListener { showLogoutDialog() }
with(text_administration) { with(text_administration) {
isVisible = isAdministrationEnabled isVisible = isAdministrationEnabled
...@@ -143,8 +142,8 @@ class SettingsFragment : Fragment(), SettingsView { ...@@ -143,8 +142,8 @@ class SettingsFragment : Fragment(), SettingsView {
private fun contactSupport() { private fun contactSupport() {
val uriText = "mailto:${"support@rocket.chat"}" + val uriText = "mailto:${"support@rocket.chat"}" +
"?subject=" + Uri.encode(getString(R.string.msg_android_app_support)) + "?subject=" + Uri.encode(getString(R.string.msg_android_app_support)) +
"&body=" + Uri.encode(getDeviceAndAppInformation()) "&body=" + Uri.encode(getDeviceAndAppInformation())
with(Intent(Intent.ACTION_SENDTO)) { with(Intent(Intent.ACTION_SENDTO)) {
data = uriText.toUri() data = uriText.toUri()
...@@ -177,7 +176,7 @@ class SettingsFragment : Fragment(), SettingsView { ...@@ -177,7 +176,7 @@ class SettingsFragment : Fragment(), SettingsView {
context?.let { context?.let {
val builder = AlertDialog.Builder(it) val builder = AlertDialog.Builder(it)
builder.setTitle(R.string.title_are_you_sure) builder.setTitle(R.string.title_are_you_sure)
.setPositiveButton(R.string.action_logout) { _, _ -> presenter.logout()} .setPositiveButton(R.string.action_logout) { _, _ -> presenter.logout() }
.setNegativeButton(android.R.string.no) { dialog, _ -> dialog.cancel() } .setNegativeButton(android.R.string.no) { dialog, _ -> dialog.cancel() }
.create() .create()
.show() .show()
......
...@@ -20,6 +20,7 @@ import chat.rocket.android.util.extensions.showToast ...@@ -20,6 +20,7 @@ import chat.rocket.android.util.extensions.showToast
import chat.rocket.android.util.extensions.ui import chat.rocket.android.util.extensions.ui
import com.bumptech.glide.Glide import com.bumptech.glide.Glide
import com.bumptech.glide.load.MultiTransformation import com.bumptech.glide.load.MultiTransformation
import com.bumptech.glide.load.engine.DiskCacheStrategy
import com.bumptech.glide.load.resource.bitmap.CenterCrop import com.bumptech.glide.load.resource.bitmap.CenterCrop
import com.bumptech.glide.load.resource.bitmap.RoundedCorners import com.bumptech.glide.load.resource.bitmap.RoundedCorners
import com.bumptech.glide.request.RequestOptions import com.bumptech.glide.request.RequestOptions
...@@ -86,6 +87,8 @@ class UserDetailsFragment : Fragment(), UserDetailsView { ...@@ -86,6 +87,8 @@ class UserDetailsFragment : Fragment(), UserDetailsView {
isVideoCallAllowed: Boolean isVideoCallAllowed: Boolean
) { ) {
val requestBuilder = Glide.with(this).load(avatarUrl) val requestBuilder = Glide.with(this).load(avatarUrl)
.apply(RequestOptions.skipMemoryCacheOf(true))
.apply(RequestOptions.diskCacheStrategyOf(DiskCacheStrategy.NONE))
requestBuilder.apply( requestBuilder.apply(
RequestOptions.bitmapTransform(MultiTransformation(BlurTransformation(), CenterCrop())) RequestOptions.bitmapTransform(MultiTransformation(BlurTransformation(), CenterCrop()))
...@@ -147,4 +150,4 @@ class UserDetailsFragment : Fragment(), UserDetailsView { ...@@ -147,4 +150,4 @@ class UserDetailsFragment : Fragment(), UserDetailsView {
private fun setupListeners() { private fun setupListeners() {
image_arrow_back.setOnClickListener { activity?.onBackPressed() } image_arrow_back.setOnClickListener { activity?.onBackPressed() }
} }
} }
\ No newline at end of file
...@@ -3,14 +3,15 @@ package chat.rocket.android.videoconference.ui ...@@ -3,14 +3,15 @@ package chat.rocket.android.videoconference.ui
import android.content.Context import android.content.Context
import android.content.Intent import android.content.Intent
import android.os.Bundle import android.os.Bundle
import androidx.core.os.bundleOf
import chat.rocket.android.videoconference.presenter.JitsiVideoConferenceView import chat.rocket.android.videoconference.presenter.JitsiVideoConferenceView
import chat.rocket.android.videoconference.presenter.VideoConferencePresenter import chat.rocket.android.videoconference.presenter.VideoConferencePresenter
import dagger.android.AndroidInjection import dagger.android.AndroidInjection
import org.jitsi.meet.sdk.JitsiMeetActivity import org.jitsi.meet.sdk.JitsiMeetActivity
import org.jitsi.meet.sdk.JitsiMeetConferenceOptions
import org.jitsi.meet.sdk.JitsiMeetView import org.jitsi.meet.sdk.JitsiMeetView
import org.jitsi.meet.sdk.JitsiMeetViewListener import org.jitsi.meet.sdk.JitsiMeetViewListener
import timber.log.Timber import timber.log.Timber
import java.net.URL
import javax.inject.Inject import javax.inject.Inject
fun Context.videoConferenceIntent(chatRoomId: String, chatRoomType: String): Intent = fun Context.videoConferenceIntent(chatRoomId: String, chatRoomType: String): Intent =
...@@ -23,8 +24,7 @@ private const val INTENT_CHAT_ROOM_TYPE = "chat_room_type" ...@@ -23,8 +24,7 @@ private const val INTENT_CHAT_ROOM_TYPE = "chat_room_type"
class VideoConferenceActivity : JitsiMeetActivity(), JitsiVideoConferenceView, class VideoConferenceActivity : JitsiMeetActivity(), JitsiVideoConferenceView,
JitsiMeetViewListener { JitsiMeetViewListener {
@Inject @Inject lateinit var presenter: VideoConferencePresenter
lateinit var presenter: VideoConferencePresenter
private lateinit var chatRoomId: String private lateinit var chatRoomId: String
private lateinit var chatRoomType: String private lateinit var chatRoomType: String
private var view: JitsiMeetView? = null private var view: JitsiMeetView? = null
...@@ -34,9 +34,7 @@ class VideoConferenceActivity : JitsiMeetActivity(), JitsiVideoConferenceView, ...@@ -34,9 +34,7 @@ class VideoConferenceActivity : JitsiMeetActivity(), JitsiVideoConferenceView,
super.onCreate(savedInstanceState) super.onCreate(savedInstanceState)
chatRoomId = intent.getStringExtra(INTENT_CHAT_ROOM_ID) chatRoomId = intent.getStringExtra(INTENT_CHAT_ROOM_ID)
requireNotNull(chatRoomId) { "no chat_room_id provided in Intent extras" }
chatRoomType = intent.getStringExtra(INTENT_CHAT_ROOM_TYPE) chatRoomType = intent.getStringExtra(INTENT_CHAT_ROOM_TYPE)
requireNotNull(chatRoomType) { "no chat_room_type provided in Intent extras" }
view = JitsiMeetView(this) view = JitsiMeetView(this)
view?.listener = this view?.listener = this
...@@ -52,34 +50,24 @@ class VideoConferenceActivity : JitsiMeetActivity(), JitsiVideoConferenceView, ...@@ -52,34 +50,24 @@ class VideoConferenceActivity : JitsiMeetActivity(), JitsiVideoConferenceView,
override fun onConferenceJoined(map: MutableMap<String, Any>?) = override fun onConferenceJoined(map: MutableMap<String, Any>?) =
logJitsiMeetViewState("Joined video conferencing", map) logJitsiMeetViewState("Joined video conferencing", map)
override fun onConferenceWillLeave(map: MutableMap<String, Any>?) = override fun onConferenceTerminated(map: MutableMap<String, Any>?) {
logJitsiMeetViewState("Leaving video conferencing", map) map?.let {
if (it.containsKey("error")) {
override fun onConferenceLeft(map: MutableMap<String, Any>?) { logJitsiMeetViewState("Terminated video conferencing with error", map)
logJitsiMeetViewState("Left video conferencing", map) } else {
logJitsiMeetViewState("Terminated video conferencing", map)
}
}
finishJitsiVideoConference() finishJitsiVideoConference()
} }
override fun onLoadConfigError(map: MutableMap<String, Any>?) =
logJitsiMeetViewState("Error loading video conference config", map)
override fun onConferenceFailed(map: MutableMap<String, Any>?) =
logJitsiMeetViewState("Video conference failed", map)
override fun startJitsiVideoConference(url: String, name: String?) { override fun startJitsiVideoConference(url: String, name: String?) {
view?.loadURLObject( JitsiMeetConferenceOptions.Builder()
bundleOf( .setAudioMuted(true)
"config" to bundleOf( .setVideoMuted(true)
"startWithAudioMuted" to true, .setServerURL(URL(url))
"startWithVideoMuted" to true .setAudioOnly(false)
), .build().let { view?.join(it) }
"context" to bundleOf(
"user" to bundleOf("name" to name),
"iss" to "rocketchat-android"
),
"url" to url
)
)
} }
override fun finishJitsiVideoConference() { override fun finishJitsiVideoConference() {
......
...@@ -15,6 +15,6 @@ ...@@ -15,6 +15,6 @@
app:layout_constraintLeft_toLeftOf="parent" app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent" app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent" app:layout_constraintTop_toTopOf="parent"
app:roundedCornerRadius="2dp" /> app:roundedCornerRadius="4dp" />
</androidx.constraintlayout.widget.ConstraintLayout> </androidx.constraintlayout.widget.ConstraintLayout>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_margin="16dp"
tools:context="preferences.ui.PreferencesFragment">
<com.wang.avi.AVLoadingIndicatorView
android:id="@+id/view_loading"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:visibility="gone"
app:indicatorColor="@color/colorBlack"
app:indicatorName="BallPulseIndicator"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
tools:visibility="visible" />
<TextView
android:id="@+id/text_analytics_tracking"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/msg_analytics_tracking"
android:textColor="@color/colorPrimaryText"
android:textSize="16sp"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<TextView
android:id="@+id/text_analytics_tracking_description"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/msg_send_analytics_tracking"
android:textColor="@color/colorSecondaryText"
android:textSize="12sp"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/text_analytics_tracking" />
<Switch
android:id="@+id/switch_analytics_tracking"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:checked="true"
app:layout_constraintBottom_toBottomOf="@+id/text_analytics_tracking_description"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="@+id/text_analytics_tracking" />
</androidx.constraintlayout.widget.ConstraintLayout>
\ No newline at end of file
...@@ -34,14 +34,13 @@ ...@@ -34,14 +34,13 @@
android:paddingBottom="5dp" android:paddingBottom="5dp"
app:layout_constraintTop_toTopOf="parent"> app:layout_constraintTop_toTopOf="parent">
<ImageView <com.facebook.drawee.view.SimpleDraweeView
android:id="@+id/image_avatar" android:id="@+id/image_avatar"
android:layout_width="48dp" android:layout_width="48dp"
android:layout_height="48dp" android:layout_height="48dp"
android:background="@drawable/bg_border_user_details_avatar"
app:layout_constraintStart_toStartOf="parent" app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" app:layout_constraintTop_toTopOf="parent"
tools:srcCompat="@tools:sample/avatars[6]" /> app:roundedCornerRadius="4dp" />
<TextView <TextView
android:id="@+id/text_display_name" android:id="@+id/text_display_name"
...@@ -248,7 +247,6 @@ ...@@ -248,7 +247,6 @@
android:textColor="#DE000000" android:textColor="#DE000000"
android:textSize="16sp" android:textSize="16sp"
android:textStyle="normal" android:textStyle="normal"
app:layout_constraintEnd_toStartOf="@id/switch_analytics_tracking"
app:layout_constraintStart_toStartOf="parent" app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" /> app:layout_constraintTop_toTopOf="parent" />
......
...@@ -182,6 +182,8 @@ ...@@ -182,6 +182,8 @@
<item quantity="two">%1$s reacted with %2$s</item> <item quantity="two">%1$s reacted with %2$s</item>
</plurals> </plurals>
<string name="msg_credentials_saved_successfully">Credentials saved successfully</string> <!-- TODO Translate --> <string name="msg_credentials_saved_successfully">Credentials saved successfully</string> <!-- TODO Translate -->
<string name="msg_camera_permission_denied">Camera permission is needed to open camera.</string> <!-- TODO Add translation -->
<string name="msg_storage_permission_denied">Storage permission is needed to open Drawing.</string> <!-- TODO Add translation -->
<string name="msg_server">Server</string> <!-- TODO Translate --> <string name="msg_server">Server</string> <!-- TODO Translate -->
<string name="msg_add_new_server">Add New Server</string> <!-- TODO Translate --> <string name="msg_add_new_server">Add New Server</string> <!-- TODO Translate -->
<string name="msg_directory">Directory</string> <!-- TODO Translate --> <string name="msg_directory">Directory</string> <!-- TODO Translate -->
......
...@@ -173,6 +173,8 @@ ...@@ -173,6 +173,8 @@
<item quantity="other">%1$s reagierte mit %2$s</item> <item quantity="other">%1$s reagierte mit %2$s</item>
</plurals> </plurals>
<string name="msg_credentials_saved_successfully">Login-Daten erfolgreich gespeichert</string> <string name="msg_credentials_saved_successfully">Login-Daten erfolgreich gespeichert</string>
<string name="msg_camera_permission_denied">Camera permission is needed to open camera.</string> <!-- TODO Add translation -->
<string name="msg_storage_permission_denied">Storage permission is needed to open Drawing.</string> <!-- TODO Add translation -->
<string name="msg_server">Server</string> <!-- TODO Translate --> <string name="msg_server">Server</string> <!-- TODO Translate -->
<string name="msg_add_new_server">Add New Server</string> <!-- TODO Translate --> <string name="msg_add_new_server">Add New Server</string> <!-- TODO Translate -->
<string name="msg_directory">Directory</string> <!-- TODO Translate --> <string name="msg_directory">Directory</string> <!-- TODO Translate -->
......
...@@ -193,6 +193,8 @@ ...@@ -193,6 +193,8 @@
<item quantity="other">%1$s reacted with %2$s</item> <!-- TODO - Add proper translation --> <item quantity="other">%1$s reacted with %2$s</item> <!-- TODO - Add proper translation -->
</plurals> </plurals>
<string name="msg_credentials_saved_successfully">Credenciales guardadas con éxito</string> <string name="msg_credentials_saved_successfully">Credenciales guardadas con éxito</string>
<string name="msg_camera_permission_denied">Camera permission is needed to open camera.</string> <!-- TODO Add translation -->
<string name="msg_storage_permission_denied">Storage permission is needed to open Drawing.</string> <!-- TODO Add translation -->
<!-- Preferences messages --> <!-- Preferences messages -->
<string name="msg_analytics_tracking">Analytics tracking</string> <!-- TODO Add translation --> <string name="msg_analytics_tracking">Analytics tracking</string> <!-- TODO Add translation -->
......
...@@ -177,6 +177,8 @@ ...@@ -177,6 +177,8 @@
<item quantity="other">%1$s reacted with %2$s</item> <item quantity="other">%1$s reacted with %2$s</item>
</plurals> <!-- TODO Add translation --> </plurals> <!-- TODO Add translation -->
<string name="msg_credentials_saved_successfully">اختیارها با موفقیت ذخیره شد</string> <string name="msg_credentials_saved_successfully">اختیارها با موفقیت ذخیره شد</string>
<string name="msg_camera_permission_denied">Camera permission is needed to open camera.</string> <!-- TODO Add translation -->
<string name="msg_storage_permission_denied">Storage permission is needed to open Drawing.</string> <!-- TODO Add translation -->
<string name="msg_server">Server</string> <!-- TODO Translate --> <string name="msg_server">Server</string> <!-- TODO Translate -->
<string name="msg_add_new_server">Add New Server</string> <!-- TODO Translate --> <string name="msg_add_new_server">Add New Server</string> <!-- TODO Translate -->
<string name="msg_directory">Directory</string> <!-- TODO Translate --> <string name="msg_directory">Directory</string> <!-- TODO Translate -->
......
...@@ -181,6 +181,8 @@ ...@@ -181,6 +181,8 @@
<item quantity="other">%1$s a réagi avec %2$s</item> <item quantity="other">%1$s a réagi avec %2$s</item>
</plurals> </plurals>
<string name="msg_credentials_saved_successfully">Certificats sauvegardés</string> <string name="msg_credentials_saved_successfully">Certificats sauvegardés</string>
<string name="msg_camera_permission_denied">Camera permission is needed to open camera.</string> <!-- TODO Add translation -->
<string name="msg_storage_permission_denied">Storage permission is needed to open Drawing.</string> <!-- TODO Add translation -->
<string name="msg_server">Server</string> <!-- TODO Translate --> <string name="msg_server">Server</string> <!-- TODO Translate -->
<string name="msg_add_new_server">Add New Server</string> <!-- TODO Translate --> <string name="msg_add_new_server">Add New Server</string> <!-- TODO Translate -->
<string name="msg_directory">Directory</string> <!-- TODO Translate --> <string name="msg_directory">Directory</string> <!-- TODO Translate -->
......
...@@ -167,6 +167,8 @@ ...@@ -167,6 +167,8 @@
<string name="msg_continue_with_wordpress"><b>WordPress</b> के साथ जारी रखें</string> <string name="msg_continue_with_wordpress"><b>WordPress</b> के साथ जारी रखें</string>
<string name="msg_two_factor_authentication">दो तरीकों से प्रमाणीकरण</string> <string name="msg_two_factor_authentication">दो तरीकों से प्रमाणीकरण</string>
<string name="msg__your_2fa_code">आपका 2FA कोड क्या है?</string> <string name="msg__your_2fa_code">आपका 2FA कोड क्या है?</string>
<string name="msg_camera_permission_denied">Camera permission is needed to open camera.</string> <!-- TODO Add translation -->
<string name="msg_storage_permission_denied">Storage permission is needed to open Drawing.</string> <!-- TODO Add translation -->
<!-- Create channel messages --> <!-- Create channel messages -->
<string name="msg_private_channel">प्राइवेट</string> <string name="msg_private_channel">प्राइवेट</string>
......
...@@ -174,6 +174,8 @@ ...@@ -174,6 +174,8 @@
<item quantity="other">%1$s ha reagito con %2$s</item> <item quantity="other">%1$s ha reagito con %2$s</item>
</plurals> </plurals>
<string name="msg_credentials_saved_successfully">Credenziali salvate con successo</string> <string name="msg_credentials_saved_successfully">Credenziali salvate con successo</string>
<string name="msg_camera_permission_denied">Camera permission is needed to open camera.</string> <!-- TODO Add translation -->
<string name="msg_storage_permission_denied">Storage permission is needed to open Drawing.</string> <!-- TODO Add translation -->
<string name="msg_server">Server</string> <!-- TODO Translate --> <string name="msg_server">Server</string> <!-- TODO Translate -->
<string name="msg_add_new_server">Add New Server</string> <!-- TODO Translate --> <string name="msg_add_new_server">Add New Server</string> <!-- TODO Translate -->
<string name="msg_directory">Directory</string> <!-- TODO Translate --> <string name="msg_directory">Directory</string> <!-- TODO Translate -->
......
...@@ -177,6 +177,8 @@ ...@@ -177,6 +177,8 @@
<item quantity="other">%1$s reacted with %2$s</item> <!-- TODO - Add proper translation --> <item quantity="other">%1$s reacted with %2$s</item> <!-- TODO - Add proper translation -->
</plurals> </plurals>
<string name="msg_credentials_saved_successfully">資格情報を正常に保存しました</string> <string name="msg_credentials_saved_successfully">資格情報を正常に保存しました</string>
<string name="msg_camera_permission_denied">Camera permission is needed to open camera.</string> <!-- TODO Add translation -->
<string name="msg_storage_permission_denied">Storage permission is needed to open Drawing.</string> <!-- TODO Add translation -->
<string name="msg_server">Server</string> <!-- TODO Translate --> <string name="msg_server">Server</string> <!-- TODO Translate -->
<string name="msg_add_new_server">Add New Server</string> <!-- TODO Translate --> <string name="msg_add_new_server">Add New Server</string> <!-- TODO Translate -->
<string name="msg_directory">Directory</string> <!-- TODO Translate --> <string name="msg_directory">Directory</string> <!-- TODO Translate -->
......
...@@ -185,6 +185,8 @@ ...@@ -185,6 +185,8 @@
<string name="msg_server">Servidor</string> <string name="msg_server">Servidor</string>
<string name="msg_add_new_server">Adicionar Novo Servidor</string> <string name="msg_add_new_server">Adicionar Novo Servidor</string>
<string name="msg_directory">Diretório</string> <string name="msg_directory">Diretório</string>
<string name="msg_camera_permission_denied">A permissão da câmera é necessária</string>
<string name="msg_storage_permission_denied">A permissão de armazenamento é necessária</string>
<!-- Create channel messages --> <!-- Create channel messages -->
<string name="msg_private_channel">Privado</string> <string name="msg_private_channel">Privado</string>
......
...@@ -173,6 +173,8 @@ ...@@ -173,6 +173,8 @@
<item quantity="one">%1$s reagiu com %2$s</item> <item quantity="one">%1$s reagiu com %2$s</item>
<item quantity="other">%1$s reagiram com %2$s</item> <item quantity="other">%1$s reagiram com %2$s</item>
</plurals> </plurals>
<string name="msg_camera_permission_denied">Camera permission is needed to open camera.</string> <!-- TODO Add translation -->
<string name="msg_storage_permission_denied">Storage permission is needed to open Drawing.</string> <!-- TODO Add translation -->
<string name="msg_server">Server</string> <!-- TODO Translate --> <string name="msg_server">Server</string> <!-- TODO Translate -->
<string name="msg_add_new_server">Add New Server</string> <!-- TODO Translate --> <string name="msg_add_new_server">Add New Server</string> <!-- TODO Translate -->
<string name="msg_directory">Directory</string> <!-- TODO Translate --> <string name="msg_directory">Directory</string> <!-- TODO Translate -->
......
...@@ -180,6 +180,8 @@ ...@@ -180,6 +180,8 @@
<item quantity="many">%1$s реагируют с %2$s</item> <item quantity="many">%1$s реагируют с %2$s</item>
</plurals> </plurals>
<string name="msg_credentials_saved_successfully">Учетные данные успешно сохранены</string> <string name="msg_credentials_saved_successfully">Учетные данные успешно сохранены</string>
<string name="msg_camera_permission_denied">Camera permission is needed to open camera.</string> <!-- TODO Add translation -->
<string name="msg_storage_permission_denied">Storage permission is needed to open Drawing.</string> <!-- TODO Add translation -->
<string name="msg_server">Server</string> <!-- TODO Translate --> <string name="msg_server">Server</string> <!-- TODO Translate -->
<string name="msg_add_new_server">Add New Server</string> <!-- TODO Translate --> <string name="msg_add_new_server">Add New Server</string> <!-- TODO Translate -->
<string name="msg_directory">Directory</string> <!-- TODO Translate --> <string name="msg_directory">Directory</string> <!-- TODO Translate -->
......
...@@ -164,6 +164,8 @@ ...@@ -164,6 +164,8 @@
<string name="msg_continue_with_wordpress">Continue with <b>WordPress</b></string> <!-- TODO Add translation --> <string name="msg_continue_with_wordpress">Continue with <b>WordPress</b></string> <!-- TODO Add translation -->
<string name="msg_two_factor_authentication">Two-factor Authentication</string> <!-- TODO Add translation --> <string name="msg_two_factor_authentication">Two-factor Authentication</string> <!-- TODO Add translation -->
<string name="msg__your_2fa_code">What’s your 2FA code?</string> <!-- TODO Add translation --> <string name="msg__your_2fa_code">What’s your 2FA code?</string> <!-- TODO Add translation -->
<string name="msg_camera_permission_denied">Camera permission is needed to open camera.</string> <!-- TODO Add translation -->
<string name="msg_storage_permission_denied">Storage permission is needed to open Drawing.</string> <!-- TODO Add translation -->
<!-- Create channel messages --> <!-- Create channel messages -->
<string name="msg_private_channel">Özel</string> <string name="msg_private_channel">Özel</string>
......
...@@ -179,6 +179,8 @@ ...@@ -179,6 +179,8 @@
<item quantity="many">%1$s reacted with %2$s</item> <!-- TODO - Add proper translation --> <item quantity="many">%1$s reacted with %2$s</item> <!-- TODO - Add proper translation -->
</plurals> </plurals>
<string name="msg_credentials_saved_successfully">Облікові дані було успішно збережено</string> <string name="msg_credentials_saved_successfully">Облікові дані було успішно збережено</string>
<string name="msg_camera_permission_denied">Camera permission is needed to open camera.</string> <!-- TODO Add translation -->
<string name="msg_storage_permission_denied">Storage permission is needed to open Drawing.</string> <!-- TODO Add translation -->
<string name="msg_server">Server</string> <!-- TODO Translate --> <string name="msg_server">Server</string> <!-- TODO Translate -->
<string name="msg_add_new_server">Add New Server</string> <!-- TODO Translate --> <string name="msg_add_new_server">Add New Server</string> <!-- TODO Translate -->
<string name="msg_directory">Directory</string> <!-- TODO Translate --> <string name="msg_directory">Directory</string> <!-- TODO Translate -->
......
...@@ -174,6 +174,8 @@ ...@@ -174,6 +174,8 @@
<item quantity="other">%1$s 使用了 %2$s</item> <item quantity="other">%1$s 使用了 %2$s</item>
</plurals> </plurals>
<string name="msg_credentials_saved_successfully">凭证成功保存</string> <string name="msg_credentials_saved_successfully">凭证成功保存</string>
<string name="msg_camera_permission_denied">Camera permission is needed to open camera.</string> <!-- TODO Add translation -->
<string name="msg_storage_permission_denied">Storage permission is needed to open Drawing.</string> <!-- TODO Add translation -->
<string name="msg_server">Server</string> <!-- TODO Translate --> <string name="msg_server">Server</string> <!-- TODO Translate -->
<string name="msg_add_new_server">Add New Server</string> <!-- TODO Translate --> <string name="msg_add_new_server">Add New Server</string> <!-- TODO Translate -->
<string name="msg_directory">Directory</string> <!-- TODO Translate --> <string name="msg_directory">Directory</string> <!-- TODO Translate -->
......
...@@ -174,6 +174,8 @@ ...@@ -174,6 +174,8 @@
<item quantity="other">%1$s 使用了 %2$s</item> <item quantity="other">%1$s 使用了 %2$s</item>
</plurals> </plurals>
<string name="msg_credentials_saved_successfully">憑證保存成功</string> <string name="msg_credentials_saved_successfully">憑證保存成功</string>
<string name="msg_camera_permission_denied">Camera permission is needed to open camera.</string> <!-- TODO Add translation -->
<string name="msg_storage_permission_denied">Storage permission is needed to open Drawing.</string> <!-- TODO Add translation -->
<string name="msg_server">Server</string> <!-- TODO Translate --> <string name="msg_server">Server</string> <!-- TODO Translate -->
<string name="msg_add_new_server">Add New Server</string> <!-- TODO Translate --> <string name="msg_add_new_server">Add New Server</string> <!-- TODO Translate -->
<string name="msg_directory">Directory</string> <!-- TODO Translate --> <string name="msg_directory">Directory</string> <!-- TODO Translate -->
......
...@@ -190,6 +190,8 @@ https://github.com/RocketChat/java-code-styles/blob/master/CODING_STYLE.md#strin ...@@ -190,6 +190,8 @@ https://github.com/RocketChat/java-code-styles/blob/master/CODING_STYLE.md#strin
<item quantity="other">%1$s reacted with %2$s</item> <item quantity="other">%1$s reacted with %2$s</item>
</plurals> </plurals>
<string name="msg_credentials_saved_successfully">Credentials saved successfully</string> <string name="msg_credentials_saved_successfully">Credentials saved successfully</string>
<string name="msg_camera_permission_denied">Camera permission is needed to open camera.</string>
<string name="msg_storage_permission_denied">Storage permission is needed to open Drawing.</string>
<string name="msg_server">Server</string> <string name="msg_server">Server</string>
<string name="msg_add_new_server">Add New Server</string> <string name="msg_add_new_server">Add New Server</string>
<string name="msg_directory">Directory</string> <string name="msg_directory">Directory</string>
......
...@@ -56,7 +56,7 @@ ext { ...@@ -56,7 +56,7 @@ ext {
glide : '4.8.0', glide : '4.8.0',
glideTransformations : '4.0.0', glideTransformations : '4.0.0',
jitsi : '1.21.0', jitsi : '2.1.0',
// For testing // For testing
junit : '4.12', junit : '4.12',
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment