Skip to content

Commit

Permalink
Remove SetupActivity, perform setup in MainActivity
Browse files Browse the repository at this point in the history
  • Loading branch information
moezbhatti committed May 9, 2018
1 parent ccad342 commit 1ce79ea
Show file tree
Hide file tree
Showing 49 changed files with 234 additions and 382 deletions.
5 changes: 5 additions & 0 deletions data/src/main/java/manager/PermissionManagerImpl.kt
Expand Up @@ -21,11 +21,16 @@ package manager
import android.Manifest
import android.content.Context
import android.content.pm.PackageManager
import android.provider.Telephony
import android.support.v4.content.ContextCompat
import javax.inject.Inject

class PermissionManagerImpl @Inject constructor(private val context: Context) : PermissionManager {

override fun isDefaultSms(): Boolean {
return Telephony.Sms.getDefaultSmsPackage(context) == context.packageName
}

override fun hasSmsAndContacts(): Boolean {
return hasSms() && hasContacts()
}
Expand Down
2 changes: 2 additions & 0 deletions domain/src/main/java/manager/PermissionManager.kt
Expand Up @@ -20,6 +20,8 @@ package manager

interface PermissionManager {

fun isDefaultSms(): Boolean

fun hasSmsAndContacts(): Boolean

fun hasSms(): Boolean
Expand Down
1 change: 0 additions & 1 deletion presentation/src/main/AndroidManifest.xml
Expand Up @@ -58,7 +58,6 @@
</intent-filter>
</activity>
<activity android:name="feature.settings.SettingsActivity" />
<activity android:name="feature.setup.SetupActivity" />
<activity android:name="feature.themepicker.ThemePickerActivity" />
<activity android:name="feature.plus.PlusActivity" />
<activity
Expand Down
8 changes: 0 additions & 8 deletions presentation/src/main/java/common/Navigator.kt
Expand Up @@ -50,8 +50,6 @@ import feature.settings.SettingsActivity
import feature.settings.SettingsViewModel
import feature.settings.about.AboutActivity
import feature.settings.about.AboutViewModel
import feature.setup.SetupActivity
import feature.setup.SetupViewModel
import feature.themepicker.ThemePickerActivity
import feature.themepicker.ThemePickerViewModel
import manager.NotificationManager
Expand All @@ -75,11 +73,6 @@ class Navigator @Inject constructor(private val context: Context, private val no
}
}

fun showSetupActivity() {
val intent = Intent(context, SetupActivity::class.java)
startActivity(intent)
}

fun showQksmsPlusActivity() {
val intent = Intent(context, PlusActivity::class.java)
startActivity(intent)
Expand Down Expand Up @@ -262,7 +255,6 @@ class Navigator @Inject constructor(private val context: Context, private val no
return when (modelClass) {
MainViewModel::class.java -> MainViewModel()
PlusViewModel::class.java -> PlusViewModel()
SetupViewModel::class.java -> SetupViewModel()
AboutViewModel::class.java -> AboutViewModel()
ComposeViewModel::class.java -> ComposeViewModel(intent)
ConversationInfoViewModel::class.java -> ConversationInfoViewModel(intent)
Expand Down
38 changes: 37 additions & 1 deletion presentation/src/main/java/feature/main/MainActivity.kt
Expand Up @@ -18,12 +18,14 @@
*/
package feature.main

import android.Manifest
import android.app.AlertDialog
import android.content.res.ColorStateList
import android.graphics.drawable.ColorDrawable
import android.graphics.drawable.StateListDrawable
import android.os.Bundle
import android.support.design.widget.Snackbar
import android.support.v4.app.ActivityCompat
import android.support.v7.app.ActionBarDrawerToggle
import android.support.v7.widget.LinearLayoutManager
import android.support.v7.widget.helper.ItemTouchHelper
Expand Down Expand Up @@ -63,6 +65,7 @@ class MainActivity : QkThemedActivity<MainViewModel>(), MainView {
@Inject lateinit var itemTouchCallback: ConversationItemTouchCallback

override val viewModelClass = MainViewModel::class
override val activityResumedIntent: Subject<Unit> = PublishSubject.create()
override val queryChangedIntent by lazy { toolbarSearch.textChanges() }
override val composeIntent by lazy { compose.clicks() }
override val drawerOpenIntent: Observable<Boolean> by lazy {
Expand All @@ -87,6 +90,7 @@ class MainActivity : QkThemedActivity<MainViewModel>(), MainView {
override val confirmDeleteIntent: Subject<Unit> = PublishSubject.create()
override val swipeConversationIntent by lazy { itemTouchCallback.swipes }
override val undoSwipeConversationIntent: Subject<Unit> = PublishSubject.create()
override val snackbarButtonIntent by lazy { snackbarButton.clicks() }
override val backPressedIntent: Subject<Unit> = PublishSubject.create()

private val toggle by lazy { ActionBarDrawerToggle(this, drawerLayout, toolbar, 0, 0) }
Expand Down Expand Up @@ -206,7 +210,6 @@ class MainActivity : QkThemedActivity<MainViewModel>(), MainView {
toolbar.menu.findItem(R.id.block)?.isVisible = selectedConversations != 0
toolbar.menu.findItem(R.id.delete)?.isVisible = selectedConversations != 0

syncing.setVisible(state.syncing is SyncRepository.SyncProgress.Running)
rateLayout.setVisible(state.showRating)

compose.setVisible(state.page is Inbox || state.page is Archived)
Expand Down Expand Up @@ -255,12 +258,45 @@ class MainActivity : QkThemedActivity<MainViewModel>(), MainView {

if (drawerLayout.isDrawerOpen(Gravity.START) && !state.drawerOpen) drawerLayout.closeDrawer(Gravity.START)
else if (!drawerLayout.isDrawerVisible(Gravity.START) && state.drawerOpen) drawerLayout.openDrawer(Gravity.START)

syncing.setVisible(state.syncing is SyncRepository.SyncProgress.Running)
snackbar.setVisible(state.syncing is SyncRepository.SyncProgress.Idle
&& !state.defaultSms || !state.smsPermission || !state.contactPermission)

when {
!state.smsPermission -> {
snackbarTitle.setText(R.string.main_permission_required)
snackbarMessage.setText(R.string.main_permission_sms)
snackbarButton.setText(R.string.main_permission_allow)
}

!state.defaultSms -> {
snackbarTitle.setText(R.string.main_default_sms_title)
snackbarMessage.setText(R.string.main_default_sms_message)
snackbarButton.setText(R.string.main_default_sms_change)
}

!state.contactPermission -> {
snackbarTitle.setText(R.string.main_permission_required)
snackbarMessage.setText(R.string.main_permission_contacts)
snackbarButton.setText(R.string.main_permission_allow)
}
}
}

override fun onResume() {
super.onResume()
activityResumedIntent.onNext(Unit)
}

override fun showBackButton(show: Boolean) {
toggle.onDrawerSlide(drawer, if (show) 1f else 0f)
}

override fun requestPermissions() {
ActivityCompat.requestPermissions(this, arrayOf(Manifest.permission.READ_CONTACTS, Manifest.permission.READ_SMS), 0)
}

override fun clearSearch() {
dismissKeyboard()
toolbarSearch.text = null
Expand Down
5 changes: 4 additions & 1 deletion presentation/src/main/java/feature/main/MainState.kt
Expand Up @@ -26,8 +26,11 @@ data class MainState(
val hasError: Boolean = false,
val page: MainPage = Inbox(),
val drawerOpen: Boolean = false,
val showRating: Boolean = false,
val syncing: SyncRepository.SyncProgress = SyncRepository.SyncProgress.Idle(),
val showRating: Boolean = false
val defaultSms: Boolean = false,
val smsPermission: Boolean = false,
val contactPermission: Boolean = false
)

sealed class MainPage
Expand Down
3 changes: 3 additions & 0 deletions presentation/src/main/java/feature/main/MainView.kt
Expand Up @@ -23,6 +23,7 @@ import io.reactivex.Observable

interface MainView : QkView<MainState> {

val activityResumedIntent: Observable<*>
val queryChangedIntent: Observable<CharSequence>
val composeIntent: Observable<Unit>
val drawerOpenIntent: Observable<Boolean>
Expand All @@ -35,8 +36,10 @@ interface MainView : QkView<MainState> {
val confirmDeleteIntent: Observable<Unit>
val swipeConversationIntent: Observable<Long>
val undoSwipeConversationIntent: Observable<Unit>
val snackbarButtonIntent: Observable<Unit>
val backPressedIntent: Observable<Unit>

fun requestPermissions()
fun clearSearch()
fun clearSelection()
fun showDeleteDialog()
Expand Down
60 changes: 45 additions & 15 deletions presentation/src/main/java/feature/main/MainViewModel.kt
Expand Up @@ -18,11 +18,7 @@
*/
package feature.main

import android.Manifest
import android.content.Context
import android.content.pm.PackageManager
import android.provider.Telephony
import android.support.v4.content.ContextCompat
import com.moez.QKSMS.R
import com.uber.autodispose.android.lifecycle.scope
import com.uber.autodispose.kotlin.autoDisposable
Expand All @@ -38,8 +34,10 @@ import interactor.MarkUnarchived
import interactor.MigratePreferences
import interactor.SyncMessages
import io.reactivex.Observable
import io.reactivex.rxkotlin.Observables
import io.reactivex.rxkotlin.plusAssign
import io.reactivex.rxkotlin.withLatestFrom
import manager.PermissionManager
import manager.RatingManager
import repository.MessageRepository
import repository.SyncRepository
Expand All @@ -60,6 +58,7 @@ class MainViewModel : QkViewModel<MainView, MainState>(MainState()) {
@Inject lateinit var markBlocked: MarkBlocked
@Inject lateinit var migratePreferences: MigratePreferences
@Inject lateinit var navigator: Navigator
@Inject lateinit var permissionManager: PermissionManager
@Inject lateinit var prefs: Preferences
@Inject lateinit var ratingManager: RatingManager
@Inject lateinit var syncMessages: SyncMessages
Expand Down Expand Up @@ -94,30 +93,50 @@ class MainViewModel : QkViewModel<MainView, MainState>(MainState()) {
// Migrate the preferences from 2.7.3
migratePreferences.execute(Unit)


// Show setup activity
val isNotDefaultSms = Telephony.Sms.getDefaultSmsPackage(context) != context.packageName
val hasSmsPermission = ContextCompat.checkSelfPermission(context, Manifest.permission.READ_SMS) == PackageManager.PERMISSION_GRANTED
val hasContactPermission = ContextCompat.checkSelfPermission(context, Manifest.permission.READ_CONTACTS) == PackageManager.PERMISSION_GRANTED
if (isNotDefaultSms || !hasSmsPermission || !hasContactPermission) {
navigator.showSetupActivity()
}

ratingManager.addSession()
markAllSeen.execute(Unit)
}

override fun bindView(view: MainView) {
super.bindView(view)

if (!permissionManager.hasSmsAndContacts()) {
view.requestPermissions()
}

// If the default SMS state or permission states change, update the ViewState
Observables.combineLatest(
view.activityResumedIntent.map { permissionManager.isDefaultSms() }.distinctUntilChanged(),
view.activityResumedIntent.map { permissionManager.hasSms() }.distinctUntilChanged(),
view.activityResumedIntent.map { permissionManager.hasContacts() }.distinctUntilChanged(),
{ defaultSms, smsPermission, contactPermission ->
newState { it.copy(defaultSms = defaultSms, smsPermission = smsPermission, contactPermission = contactPermission) }
})
.autoDisposable(view.scope())
.subscribe()

// If the SMS permission state changes from false to true, sync messages
view.activityResumedIntent
.map { permissionManager.hasSms() }
.distinctUntilChanged()
.skip(1)
.filter { hasSms -> hasSms }
.take(1)
.autoDisposable(view.scope())
.subscribe {
syncMessages.execute(Unit)
if (!permissionManager.isDefaultSms()) {
navigator.showDefaultSmsDialog()
}
}

view.queryChangedIntent
.debounce(200, TimeUnit.MILLISECONDS)
.map { query -> query.removeAccents() }
.withLatestFrom(state, { query, state ->
if (state.page is Inbox) {
val filteredConversations = if (query.isEmpty()) conversations
else conversations
.map { conversations -> conversations.filter { conversationFilter.filter(it, query) } }
else conversations.map { conversations -> conversations.filter { conversationFilter.filter(it, query) } }

val page = state.page.copy(showClearButton = query.isNotEmpty(), data = filteredConversations)
newState { it.copy(page = page) }
Expand Down Expand Up @@ -254,6 +273,17 @@ class MainViewModel : QkViewModel<MainView, MainState>(MainState()) {
.autoDisposable(view.scope())
.subscribe { threadId -> markUnarchived.execute(listOf(threadId)) }

view.snackbarButtonIntent
.withLatestFrom(state, { _, state ->
when {
!state.smsPermission -> view.requestPermissions()
!state.defaultSms -> navigator.showDefaultSmsDialog()
!state.contactPermission -> view.requestPermissions()
}
})
.autoDisposable(view.scope())
.subscribe()

view.backPressedIntent
.withLatestFrom(state, { _, state ->
when {
Expand Down
75 changes: 0 additions & 75 deletions presentation/src/main/java/feature/setup/SetupActivity.kt

This file was deleted.

21 changes: 0 additions & 21 deletions presentation/src/main/java/feature/setup/SetupState.kt

This file was deleted.

0 comments on commit 1ce79ea

Please sign in to comment.