Skip to content
This repository was archived by the owner on Jun 7, 2020. It is now read-only.

Commit d01a94f

Browse files
authored
Merge pull request #2198 from divyanshub024/fix-2197
[BUG] Check and Request camera permission before taking photos.
2 parents d9f8a83 + 0b35476 commit d01a94f

File tree

19 files changed

+135
-31
lines changed

19 files changed

+135
-31
lines changed

app/src/main/java/chat/rocket/android/chatroom/ui/ChatRoomFragment.kt

Lines changed: 61 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import android.content.ClipData
55
import android.content.ClipboardManager
66
import android.content.Context
77
import android.content.Intent
8+
import android.content.pm.PackageManager
89
import android.graphics.drawable.Drawable
910
import android.net.Uri
1011
import android.os.Bundle
@@ -61,9 +62,13 @@ import chat.rocket.android.emoji.EmojiPickerPopup
6162
import chat.rocket.android.emoji.EmojiReactionListener
6263
import chat.rocket.android.emoji.internal.isCustom
6364
import chat.rocket.android.helper.EndlessRecyclerViewScrollListener
64-
import chat.rocket.android.helper.ImageHelper
6565
import chat.rocket.android.helper.KeyboardHelper
6666
import chat.rocket.android.helper.MessageParser
67+
import chat.rocket.android.helper.AndroidPermissionsHelper
68+
import chat.rocket.android.helper.AndroidPermissionsHelper.getCameraPermission
69+
import chat.rocket.android.helper.AndroidPermissionsHelper.getWriteExternalStoragePermission
70+
import chat.rocket.android.helper.AndroidPermissionsHelper.hasCameraPermission
71+
import chat.rocket.android.helper.AndroidPermissionsHelper.hasWriteExternalStoragePermission
6772
import chat.rocket.android.util.extension.asObservable
6873
import chat.rocket.android.util.extension.createImageFile
6974
import chat.rocket.android.util.extensions.circularRevealOrUnreveal
@@ -81,6 +86,7 @@ import chat.rocket.common.model.RoomType
8186
import chat.rocket.common.model.roomTypeOf
8287
import chat.rocket.core.internal.realtime.socket.model.State
8388
import com.bumptech.glide.Glide
89+
import com.google.android.material.snackbar.Snackbar
8490
import dagger.android.support.AndroidSupportInjection
8591
import io.reactivex.Observable
8692
import io.reactivex.disposables.CompositeDisposable
@@ -904,8 +910,14 @@ class ChatRoomFragment : Fragment(), ChatRoomView, EmojiKeyboardListener, EmojiR
904910
button_add_reaction_or_show_keyboard.setOnClickListener { toggleKeyboard() }
905911

906912
button_take_a_photo.setOnClickListener {
907-
dispatchTakePictureIntent()
908-
913+
// Check for camera permission
914+
context?.let {
915+
if(hasCameraPermission(it)) {
916+
dispatchTakePictureIntent()
917+
} else {
918+
getCameraPermission(this)
919+
}
920+
}
909921
handler.postDelayed({
910922
hideAttachmentOptions()
911923
}, 400)
@@ -923,11 +935,10 @@ class ChatRoomFragment : Fragment(), ChatRoomView, EmojiKeyboardListener, EmojiR
923935

924936
button_drawing.setOnClickListener {
925937
activity?.let { fragmentActivity ->
926-
if (!ImageHelper.canWriteToExternalStorage(fragmentActivity)) {
927-
ImageHelper.checkWritingPermission(fragmentActivity)
938+
if (!hasWriteExternalStoragePermission(fragmentActivity)) {
939+
getWriteExternalStoragePermission(this)
928940
} else {
929-
val intent = Intent(fragmentActivity, DrawingActivity::class.java)
930-
startActivityForResult(intent, REQUEST_CODE_FOR_DRAW)
941+
dispatchDrawingIntent()
931942
}
932943
}
933944

@@ -938,6 +949,11 @@ class ChatRoomFragment : Fragment(), ChatRoomView, EmojiKeyboardListener, EmojiR
938949
}
939950
}
940951

952+
private fun dispatchDrawingIntent() {
953+
val intent = Intent(activity, DrawingActivity::class.java)
954+
startActivityForResult(intent, REQUEST_CODE_FOR_DRAW)
955+
}
956+
941957
private fun dispatchTakePictureIntent() {
942958
Intent(MediaStore.ACTION_IMAGE_CAPTURE).also { takePictureIntent ->
943959
// Create the File where the photo should go
@@ -958,6 +974,44 @@ class ChatRoomFragment : Fragment(), ChatRoomView, EmojiKeyboardListener, EmojiR
958974
}
959975
}
960976

977+
override fun onRequestPermissionsResult(
978+
requestCode: Int,
979+
permissions: Array<out String>,
980+
grantResults: IntArray
981+
) {
982+
super.onRequestPermissionsResult(requestCode, permissions, grantResults)
983+
when(requestCode) {
984+
AndroidPermissionsHelper.CAMERA_CODE -> {
985+
if (grantResults.isNotEmpty() && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
986+
// permission was granted
987+
dispatchTakePictureIntent()
988+
} else {
989+
// permission denied
990+
Snackbar.make(
991+
root_layout,
992+
R.string.msg_camera_permission_denied,
993+
Snackbar.LENGTH_SHORT
994+
).show()
995+
}
996+
return
997+
}
998+
AndroidPermissionsHelper.WRITE_EXTERNAL_STORAGE_CODE -> {
999+
if (grantResults.isNotEmpty() && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
1000+
// permission was granted
1001+
dispatchDrawingIntent()
1002+
} else {
1003+
// permission denied
1004+
Snackbar.make(
1005+
root_layout,
1006+
R.string.msg_storage_permission_denied,
1007+
Snackbar.LENGTH_SHORT
1008+
).show()
1009+
}
1010+
return
1011+
}
1012+
}
1013+
}
1014+
9611015
private fun getDraftMessage() {
9621016
val unfinishedMessage = presenter.getDraftUnfinishedMessage()
9631017
if (unfinishedMessage.isNotNullNorEmpty()) {
Lines changed: 39 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,60 @@
11
package chat.rocket.android.helper
22

3+
import android.Manifest
34
import android.app.Activity
45
import android.content.Context
56
import android.content.pm.PackageManager
7+
import android.view.ContextThemeWrapper
68
import androidx.core.app.ActivityCompat
79
import androidx.core.content.ContextCompat
10+
import androidx.fragment.app.Fragment
811

912
object AndroidPermissionsHelper {
1013

1114
const val WRITE_EXTERNAL_STORAGE_CODE = 1
15+
const val CAMERA_CODE = 2
1216

13-
fun checkPermission(context: Context, permission: String): Boolean {
17+
private fun checkPermission(context: Context, permission: String): Boolean {
1418
return ContextCompat.checkSelfPermission(
1519
context,
1620
permission
1721
) == PackageManager.PERMISSION_GRANTED
1822
}
1923

20-
fun requestPermission(context: Activity, permission: String, requestCode: Int) {
24+
private fun requestPermission(context: Activity, permission: String, requestCode: Int) {
2125
ActivityCompat.requestPermissions(context, arrayOf(permission), requestCode)
2226
}
27+
28+
fun hasCameraPermission(context: Context): Boolean {
29+
return AndroidPermissionsHelper.checkPermission(context, Manifest.permission.CAMERA)
30+
}
31+
32+
fun getCameraPermission(fragment: Fragment) {
33+
fragment.requestPermissions(
34+
arrayOf(Manifest.permission.CAMERA),
35+
CAMERA_CODE
36+
)
37+
}
38+
39+
fun hasWriteExternalStoragePermission(context: Context): Boolean {
40+
return checkPermission(context, Manifest.permission.WRITE_EXTERNAL_STORAGE)
41+
}
42+
43+
fun getWriteExternalStoragePermission(fragment: Fragment) {
44+
fragment.requestPermissions(
45+
arrayOf(Manifest.permission.WRITE_EXTERNAL_STORAGE),
46+
WRITE_EXTERNAL_STORAGE_CODE
47+
)
48+
}
49+
50+
fun checkWritingPermission(context: Context) {
51+
if (context is ContextThemeWrapper) {
52+
val activity = if (context.baseContext is Activity) context.baseContext as Activity else context as Activity
53+
AndroidPermissionsHelper.requestPermission(
54+
activity,
55+
Manifest.permission.WRITE_EXTERNAL_STORAGE,
56+
AndroidPermissionsHelper.WRITE_EXTERNAL_STORAGE_CODE
57+
)
58+
}
59+
}
2360
}

app/src/main/java/chat/rocket/android/helper/ImageHelper.kt

Lines changed: 3 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,12 @@
11
package chat.rocket.android.helper
22

3-
import android.Manifest
4-
import android.app.Activity
53
import android.content.Context
64
import android.graphics.Color
75
import android.graphics.Typeface
86
import android.media.MediaScannerConnection
97
import android.os.Environment
108
import android.text.TextUtils
119
import android.util.TypedValue
12-
import android.view.ContextThemeWrapper
1310
import android.view.ViewGroup
1411
import android.widget.ImageView
1512
import android.widget.TextView
@@ -18,6 +15,8 @@ import androidx.appcompat.widget.Toolbar
1815
import androidx.core.net.toUri
1916
import androidx.core.view.setPadding
2017
import chat.rocket.android.R
18+
import chat.rocket.android.helper.AndroidPermissionsHelper.checkWritingPermission
19+
import chat.rocket.android.helper.AndroidPermissionsHelper.hasWriteExternalStoragePermission
2120
import com.facebook.binaryresource.FileBinaryResource
2221
import com.facebook.cache.common.CacheKey
2322
import com.facebook.imageformat.ImageFormatChecker
@@ -117,7 +116,7 @@ object ImageHelper {
117116
}
118117

119118
private fun saveImage(context: Context): Boolean {
120-
if (!canWriteToExternalStorage(context)) {
119+
if (!hasWriteExternalStoragePermission(context)) {
121120
checkWritingPermission(context)
122121
return false
123122
}
@@ -152,22 +151,4 @@ object ImageHelper {
152151
}
153152
return true
154153
}
155-
156-
fun canWriteToExternalStorage(context: Context): Boolean {
157-
return AndroidPermissionsHelper.checkPermission(
158-
context,
159-
Manifest.permission.WRITE_EXTERNAL_STORAGE
160-
)
161-
}
162-
163-
fun checkWritingPermission(context: Context) {
164-
if (context is ContextThemeWrapper) {
165-
val activity = if (context.baseContext is Activity) context.baseContext as Activity else context as Activity
166-
AndroidPermissionsHelper.requestPermission(
167-
activity,
168-
Manifest.permission.WRITE_EXTERNAL_STORAGE,
169-
AndroidPermissionsHelper.WRITE_EXTERNAL_STORAGE_CODE
170-
)
171-
}
172-
}
173154
}

app/src/main/res/values-ar/strings.xml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -182,6 +182,8 @@
182182
<item quantity="two">%1$s reacted with %2$s</item>
183183
</plurals>
184184
<string name="msg_credentials_saved_successfully">Credentials saved successfully</string> <!-- TODO Translate -->
185+
<string name="msg_camera_permission_denied">Camera permission is needed to open camera.</string> <!-- TODO Add translation -->
186+
<string name="msg_storage_permission_denied">Storage permission is needed to open Drawing.</string> <!-- TODO Add translation -->
185187
<string name="msg_server">Server</string> <!-- TODO Translate -->
186188
<string name="msg_add_new_server">Add New Server</string> <!-- TODO Translate -->
187189

app/src/main/res/values-de/strings.xml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -173,6 +173,8 @@
173173
<item quantity="other">%1$s reagierte mit %2$s</item>
174174
</plurals>
175175
<string name="msg_credentials_saved_successfully">Login-Daten erfolgreich gespeichert</string>
176+
<string name="msg_camera_permission_denied">Camera permission is needed to open camera.</string> <!-- TODO Add translation -->
177+
<string name="msg_storage_permission_denied">Storage permission is needed to open Drawing.</string> <!-- TODO Add translation -->
176178
<string name="msg_server">Server</string> <!-- TODO Translate -->
177179
<string name="msg_add_new_server">Add New Server</string> <!-- TODO Translate -->
178180

app/src/main/res/values-es/strings.xml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -192,6 +192,8 @@
192192
<item quantity="other">%1$s reacted with %2$s</item> <!-- TODO - Add proper translation -->
193193
</plurals>
194194
<string name="msg_credentials_saved_successfully">Credenciales guardadas con éxito</string>
195+
<string name="msg_camera_permission_denied">Camera permission is needed to open camera.</string> <!-- TODO Add translation -->
196+
<string name="msg_storage_permission_denied">Storage permission is needed to open Drawing.</string> <!-- TODO Add translation -->
195197

196198
<!-- Preferences messages -->
197199
<string name="msg_analytics_tracking">Analytics tracking</string> <!-- TODO Add translation -->

app/src/main/res/values-fa/strings.xml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -177,6 +177,8 @@
177177
<item quantity="other">%1$s reacted with %2$s</item>
178178
</plurals> <!-- TODO Add translation -->
179179
<string name="msg_credentials_saved_successfully">اختیارها با موفقیت ذخیره شد</string>
180+
<string name="msg_camera_permission_denied">Camera permission is needed to open camera.</string> <!-- TODO Add translation -->
181+
<string name="msg_storage_permission_denied">Storage permission is needed to open Drawing.</string> <!-- TODO Add translation -->
180182
<string name="msg_server">Server</string> <!-- TODO Translate -->
181183
<string name="msg_add_new_server">Add New Server</string> <!-- TODO Translate -->
182184

app/src/main/res/values-fr/strings.xml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -181,6 +181,8 @@
181181
<item quantity="other">%1$s a réagi avec %2$s</item>
182182
</plurals>
183183
<string name="msg_credentials_saved_successfully">Certificats sauvegardés</string>
184+
<string name="msg_camera_permission_denied">Camera permission is needed to open camera.</string> <!-- TODO Add translation -->
185+
<string name="msg_storage_permission_denied">Storage permission is needed to open Drawing.</string> <!-- TODO Add translation -->
184186
<string name="msg_server">Server</string> <!-- TODO Translate -->
185187
<string name="msg_add_new_server">Add New Server</string> <!-- TODO Translate -->
186188

app/src/main/res/values-hi-rIN/strings.xml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -167,6 +167,8 @@
167167
<string name="msg_continue_with_wordpress"><b>WordPress</b> के साथ जारी रखें</string>
168168
<string name="msg_two_factor_authentication">दो तरीकों से प्रमाणीकरण</string>
169169
<string name="msg__your_2fa_code">आपका 2FA कोड क्या है?</string>
170+
<string name="msg_camera_permission_denied">Camera permission is needed to open camera.</string> <!-- TODO Add translation -->
171+
<string name="msg_storage_permission_denied">Storage permission is needed to open Drawing.</string> <!-- TODO Add translation -->
170172

171173
<!-- Create channel messages -->
172174
<string name="msg_private_channel">प्राइवेट</string>

app/src/main/res/values-it/strings.xml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -174,6 +174,8 @@
174174
<item quantity="other">%1$s ha reagito con %2$s</item>
175175
</plurals>
176176
<string name="msg_credentials_saved_successfully">Credenziali salvate con successo</string>
177+
<string name="msg_camera_permission_denied">Camera permission is needed to open camera.</string> <!-- TODO Add translation -->
178+
<string name="msg_storage_permission_denied">Storage permission is needed to open Drawing.</string> <!-- TODO Add translation -->
177179
<string name="msg_server">Server</string> <!-- TODO Translate -->
178180
<string name="msg_add_new_server">Add New Server</string> <!-- TODO Translate -->
179181

0 commit comments

Comments
 (0)