Loading data/src/main/java/manager/PermissionManagerImpl.kt +4 −3 Original line number Diff line number Diff line Loading @@ -20,7 +20,7 @@ package manager import android.Manifest import android.content.Context import android.content.pm.PackageManager import android.content.pm.PackageManager.PERMISSION_GRANTED import android.provider.Telephony import android.support.v4.content.ContextCompat import javax.inject.Inject Loading @@ -35,9 +35,10 @@ class PermissionManagerImpl @Inject constructor(private val context: Context) : return hasSms() && hasContacts() } override fun hasSms(): Boolean = ContextCompat.checkSelfPermission(context, Manifest.permission.READ_SMS) == PackageManager.PERMISSION_GRANTED override fun hasSms(): Boolean = ContextCompat.checkSelfPermission(context, Manifest.permission.READ_SMS) == PERMISSION_GRANTED override fun hasContacts(): Boolean = ContextCompat.checkSelfPermission(context, Manifest.permission.READ_CONTACTS) == PackageManager.PERMISSION_GRANTED override fun hasContacts(): Boolean = ContextCompat.checkSelfPermission(context, Manifest.permission.READ_CONTACTS) == PERMISSION_GRANTED override fun hasStorage(): Boolean = ContextCompat.checkSelfPermission(context, Manifest.permission.WRITE_EXTERNAL_STORAGE) == PERMISSION_GRANTED } No newline at end of file domain/src/main/java/manager/PermissionManager.kt +2 −0 Original line number Diff line number Diff line Loading @@ -28,4 +28,6 @@ interface PermissionManager { fun hasContacts(): Boolean fun hasStorage(): Boolean } No newline at end of file presentation/build.gradle +0 −1 Original line number Diff line number Diff line Loading @@ -135,7 +135,6 @@ dependencies { implementation "com.f2prateek.rx.preferences2:rx-preferences:$rx_preferences_version" implementation "com.google.android:flexbox:0.3.1" implementation "com.jakewharton.timber:timber:$timber_version" implementation "com.mlsdev.rximagepicker:library:2.0.2" implementation "org.jetbrains.kotlin:kotlin-stdlib-jre7:$kotlin_version" implementation project(":android-smsmms") implementation project(':data') Loading presentation/src/main/AndroidManifest.xml +1 −0 Original line number Diff line number Diff line Loading @@ -10,6 +10,7 @@ <uses-permission android:name="android.permission.RECEIVE_SMS" /> <uses-permission android:name="android.permission.SEND_SMS" /> <uses-permission android:name="android.permission.WAKE_LOCK" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.WRITE_SMS" /> <application Loading presentation/src/main/java/feature/compose/ComposeActivity.kt +52 −0 Original line number Diff line number Diff line Loading @@ -18,11 +18,18 @@ */ package feature.compose import android.Manifest import android.app.Activity import android.arch.lifecycle.ViewModelProvider import android.arch.lifecycle.ViewModelProviders import android.content.ContentValues import android.content.Intent import android.content.res.ColorStateList import android.graphics.PorterDuff import android.net.Uri import android.os.Bundle import android.provider.MediaStore import android.support.v4.app.ActivityCompat import android.support.v7.widget.LinearLayoutManager import android.view.Menu import android.view.MenuItem Loading @@ -46,10 +53,18 @@ import io.reactivex.subjects.Subject import kotlinx.android.synthetic.main.compose_activity.* import model.Contact import model.Message import java.text.SimpleDateFormat import java.util.* import javax.inject.Inject class ComposeActivity : QkThemedActivity(), ComposeView { companion object { const val CAMERA_REQUEST_CODE = 0 const val GALLERY_REQUEST_CODE = 1 } @Inject lateinit var attachmentAdapter: AttachmentAdapter @Inject lateinit var chipsAdapter: ChipsAdapter @Inject lateinit var contactsAdapter: ContactAdapter Loading @@ -72,12 +87,15 @@ class ComposeActivity : QkThemedActivity(), ComposeView { override val attachIntent by lazy { attach.clicks() } override val cameraIntent by lazy { camera.clicks() } override val galleryIntent by lazy { gallery.clicks() } override val attachmentSelectedIntent: Subject<Uri> = PublishSubject.create() override val inputContentIntent by lazy { message.inputContentSelected } override val sendIntent by lazy { send.clicks() } override val backPressedIntent: Subject<Unit> = PublishSubject.create() private val viewModel by lazy { ViewModelProviders.of(this, viewModelFactory)[ComposeViewModel::class.java] } var cameraDestination: Uri? = null override fun onCreate(savedInstanceState: Bundle?) { AndroidInjection.inject(this) super.onCreate(savedInstanceState) Loading Loading @@ -224,6 +242,30 @@ class ComposeActivity : QkThemedActivity(), ComposeView { messageAdapter.clearSelection() } override fun requestStoragePermission() { ActivityCompat.requestPermissions(this, arrayOf(Manifest.permission.WRITE_EXTERNAL_STORAGE), 0) } override fun requestCamera() { cameraDestination = SimpleDateFormat("yyyyMMdd_HHmmss", Locale.getDefault()).format(Date()) .let { timestamp -> ContentValues().apply { put(MediaStore.Images.Media.TITLE, timestamp) } } .let { cv -> contentResolver.insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, cv) } val intent = Intent(MediaStore.ACTION_IMAGE_CAPTURE) .putExtra(MediaStore.EXTRA_OUTPUT, cameraDestination) startActivityForResult(intent, CAMERA_REQUEST_CODE) } override fun requestGallery() { val intent = Intent(Intent.ACTION_PICK) .putExtra(Intent.EXTRA_ALLOW_MULTIPLE, false) .addFlags(Intent.FLAG_GRANT_PERSISTABLE_URI_PERMISSION) .putExtra(Intent.EXTRA_LOCAL_ONLY, false) .addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION) .setType("image/*") startActivityForResult(intent, GALLERY_REQUEST_CODE) } override fun setDraft(draft: String) { message.setText(draft) } Loading @@ -249,6 +291,16 @@ class ComposeActivity : QkThemedActivity(), ComposeView { return super.getColoredMenuItems() + R.id.call } override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { if (resultCode == Activity.RESULT_OK) { when (requestCode) { CAMERA_REQUEST_CODE -> cameraDestination GALLERY_REQUEST_CODE -> data?.data else -> null }?.let(attachmentSelectedIntent::onNext) } } override fun onBackPressed() { backPressedIntent.onNext(Unit) } Loading Loading
data/src/main/java/manager/PermissionManagerImpl.kt +4 −3 Original line number Diff line number Diff line Loading @@ -20,7 +20,7 @@ package manager import android.Manifest import android.content.Context import android.content.pm.PackageManager import android.content.pm.PackageManager.PERMISSION_GRANTED import android.provider.Telephony import android.support.v4.content.ContextCompat import javax.inject.Inject Loading @@ -35,9 +35,10 @@ class PermissionManagerImpl @Inject constructor(private val context: Context) : return hasSms() && hasContacts() } override fun hasSms(): Boolean = ContextCompat.checkSelfPermission(context, Manifest.permission.READ_SMS) == PackageManager.PERMISSION_GRANTED override fun hasSms(): Boolean = ContextCompat.checkSelfPermission(context, Manifest.permission.READ_SMS) == PERMISSION_GRANTED override fun hasContacts(): Boolean = ContextCompat.checkSelfPermission(context, Manifest.permission.READ_CONTACTS) == PackageManager.PERMISSION_GRANTED override fun hasContacts(): Boolean = ContextCompat.checkSelfPermission(context, Manifest.permission.READ_CONTACTS) == PERMISSION_GRANTED override fun hasStorage(): Boolean = ContextCompat.checkSelfPermission(context, Manifest.permission.WRITE_EXTERNAL_STORAGE) == PERMISSION_GRANTED } No newline at end of file
domain/src/main/java/manager/PermissionManager.kt +2 −0 Original line number Diff line number Diff line Loading @@ -28,4 +28,6 @@ interface PermissionManager { fun hasContacts(): Boolean fun hasStorage(): Boolean } No newline at end of file
presentation/build.gradle +0 −1 Original line number Diff line number Diff line Loading @@ -135,7 +135,6 @@ dependencies { implementation "com.f2prateek.rx.preferences2:rx-preferences:$rx_preferences_version" implementation "com.google.android:flexbox:0.3.1" implementation "com.jakewharton.timber:timber:$timber_version" implementation "com.mlsdev.rximagepicker:library:2.0.2" implementation "org.jetbrains.kotlin:kotlin-stdlib-jre7:$kotlin_version" implementation project(":android-smsmms") implementation project(':data') Loading
presentation/src/main/AndroidManifest.xml +1 −0 Original line number Diff line number Diff line Loading @@ -10,6 +10,7 @@ <uses-permission android:name="android.permission.RECEIVE_SMS" /> <uses-permission android:name="android.permission.SEND_SMS" /> <uses-permission android:name="android.permission.WAKE_LOCK" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.WRITE_SMS" /> <application Loading
presentation/src/main/java/feature/compose/ComposeActivity.kt +52 −0 Original line number Diff line number Diff line Loading @@ -18,11 +18,18 @@ */ package feature.compose import android.Manifest import android.app.Activity import android.arch.lifecycle.ViewModelProvider import android.arch.lifecycle.ViewModelProviders import android.content.ContentValues import android.content.Intent import android.content.res.ColorStateList import android.graphics.PorterDuff import android.net.Uri import android.os.Bundle import android.provider.MediaStore import android.support.v4.app.ActivityCompat import android.support.v7.widget.LinearLayoutManager import android.view.Menu import android.view.MenuItem Loading @@ -46,10 +53,18 @@ import io.reactivex.subjects.Subject import kotlinx.android.synthetic.main.compose_activity.* import model.Contact import model.Message import java.text.SimpleDateFormat import java.util.* import javax.inject.Inject class ComposeActivity : QkThemedActivity(), ComposeView { companion object { const val CAMERA_REQUEST_CODE = 0 const val GALLERY_REQUEST_CODE = 1 } @Inject lateinit var attachmentAdapter: AttachmentAdapter @Inject lateinit var chipsAdapter: ChipsAdapter @Inject lateinit var contactsAdapter: ContactAdapter Loading @@ -72,12 +87,15 @@ class ComposeActivity : QkThemedActivity(), ComposeView { override val attachIntent by lazy { attach.clicks() } override val cameraIntent by lazy { camera.clicks() } override val galleryIntent by lazy { gallery.clicks() } override val attachmentSelectedIntent: Subject<Uri> = PublishSubject.create() override val inputContentIntent by lazy { message.inputContentSelected } override val sendIntent by lazy { send.clicks() } override val backPressedIntent: Subject<Unit> = PublishSubject.create() private val viewModel by lazy { ViewModelProviders.of(this, viewModelFactory)[ComposeViewModel::class.java] } var cameraDestination: Uri? = null override fun onCreate(savedInstanceState: Bundle?) { AndroidInjection.inject(this) super.onCreate(savedInstanceState) Loading Loading @@ -224,6 +242,30 @@ class ComposeActivity : QkThemedActivity(), ComposeView { messageAdapter.clearSelection() } override fun requestStoragePermission() { ActivityCompat.requestPermissions(this, arrayOf(Manifest.permission.WRITE_EXTERNAL_STORAGE), 0) } override fun requestCamera() { cameraDestination = SimpleDateFormat("yyyyMMdd_HHmmss", Locale.getDefault()).format(Date()) .let { timestamp -> ContentValues().apply { put(MediaStore.Images.Media.TITLE, timestamp) } } .let { cv -> contentResolver.insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, cv) } val intent = Intent(MediaStore.ACTION_IMAGE_CAPTURE) .putExtra(MediaStore.EXTRA_OUTPUT, cameraDestination) startActivityForResult(intent, CAMERA_REQUEST_CODE) } override fun requestGallery() { val intent = Intent(Intent.ACTION_PICK) .putExtra(Intent.EXTRA_ALLOW_MULTIPLE, false) .addFlags(Intent.FLAG_GRANT_PERSISTABLE_URI_PERMISSION) .putExtra(Intent.EXTRA_LOCAL_ONLY, false) .addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION) .setType("image/*") startActivityForResult(intent, GALLERY_REQUEST_CODE) } override fun setDraft(draft: String) { message.setText(draft) } Loading @@ -249,6 +291,16 @@ class ComposeActivity : QkThemedActivity(), ComposeView { return super.getColoredMenuItems() + R.id.call } override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { if (resultCode == Activity.RESULT_OK) { when (requestCode) { CAMERA_REQUEST_CODE -> cameraDestination GALLERY_REQUEST_CODE -> data?.data else -> null }?.let(attachmentSelectedIntent::onNext) } } override fun onBackPressed() { backPressedIntent.onNext(Unit) } Loading