Loading presentation/src/main/java/common/QkDialog.kt 0 → 100644 +50 −0 Original line number Diff line number Diff line package common import android.app.Activity import android.app.AlertDialog import android.content.Context import android.support.annotation.StringRes import android.support.v7.widget.LinearLayoutManager import android.support.v7.widget.RecyclerView import common.util.extensions.dpToPx import common.util.extensions.setPadding import injection.appComponent import javax.inject.Inject /** * Wrapper around AlertDialog which makes it easier to display lists that use our UI */ class QkDialog @Inject constructor(private val context: Context, val adapter: MenuItemAdapter) { var title: String? = null init { appComponent.inject(this) } fun show(activity: Activity) { val recyclerView = RecyclerView(context) recyclerView.layoutManager = LinearLayoutManager(context) recyclerView.adapter = adapter recyclerView.setPadding(top = 8.dpToPx(context), bottom = 8.dpToPx(context)) val dialog = AlertDialog.Builder(activity) .setTitle(title) .setView(recyclerView) .create() val clicks = adapter.menuItemClicks .subscribe { dialog.dismiss() } dialog.setOnDismissListener { clicks.dispose() } dialog.show() } fun setTitle(@StringRes title: Int) { this.title = context.getString(title) } } No newline at end of file presentation/src/main/java/feature/compose/ComposeActivity.kt +5 −16 Original line number Diff line number Diff line Loading @@ -35,6 +35,7 @@ import com.moez.QKSMS.R import com.uber.autodispose.android.lifecycle.scope import com.uber.autodispose.kotlin.autoDisposable import common.MenuItemAdapter import common.QkDialog import common.base.QkThemedActivity import common.util.extensions.autoScrollToStart import common.util.extensions.dpToPx Loading Loading @@ -66,7 +67,7 @@ class ComposeActivity : QkThemedActivity<ComposeViewModel>(), ComposeView { override val infoIntent: Subject<Unit> = PublishSubject.create() override val messageClickIntent: Subject<Message> by lazy { messageAdapter.clicks } override val messageLongClickIntent: Subject<Message> by lazy { messageAdapter.longClicks } override val menuItemIntent: Subject<Int> by lazy { menuItemAdapter.menuItemClicks } override val menuItemIntent: Subject<Int> by lazy { dialog.adapter.menuItemClicks } override val attachmentDeletedIntent: Subject<Uri> by lazy { attachmentAdapter.attachmentDeleted } override val textChangedIntent by lazy { message.textChanges() } override val attachIntent by lazy { attach.clicks() } Loading @@ -74,8 +75,8 @@ class ComposeActivity : QkThemedActivity<ComposeViewModel>(), ComposeView { @Inject lateinit var chipsAdapter: ChipsAdapter @Inject lateinit var contactsAdapter: ContactAdapter @Inject lateinit var dialog: QkDialog @Inject lateinit var messageAdapter: MessagesAdapter @Inject lateinit var menuItemAdapter: MenuItemAdapter @Inject lateinit var attachmentAdapter: AttachmentAdapter init { Loading Loading @@ -205,20 +206,8 @@ class ComposeActivity : QkThemedActivity<ComposeViewModel>(), ComposeView { } override fun showMenu(menuItems: List<common.MenuItem>) { val recyclerView = RecyclerView(this) recyclerView.layoutManager = LinearLayoutManager(this) recyclerView.adapter = menuItemAdapter recyclerView.setPadding(0, 8.dpToPx(this), 0, 8.dpToPx(this)) val dialog = AlertDialog.Builder(this) .setView(recyclerView) .create() .apply { show() } menuItemAdapter.data = menuItems menuItemAdapter.menuItemClicks .autoDisposable(scope()) .subscribe { dialog.dismiss() } dialog.adapter.data = menuItems dialog.show(this) } override fun onCreateOptionsMenu(menu: Menu?): Boolean { Loading presentation/src/main/java/feature/main/MainActivity.kt +8 −23 Original line number Diff line number Diff line Loading @@ -26,7 +26,6 @@ import android.os.Bundle import android.support.design.widget.Snackbar import android.support.v7.app.ActionBarDrawerToggle import android.support.v7.widget.LinearLayoutManager import android.support.v7.widget.RecyclerView import android.support.v7.widget.helper.ItemTouchHelper import android.view.Gravity import android.view.Menu Loading @@ -37,12 +36,11 @@ import com.jakewharton.rxbinding2.widget.textChanges import com.moez.QKSMS.R import com.uber.autodispose.android.lifecycle.scope import com.uber.autodispose.kotlin.autoDisposable import common.MenuItemAdapter import common.Navigator import common.QkDialog import common.base.QkThemedActivity import common.util.extensions.autoScrollToStart import common.util.extensions.dismissKeyboard import common.util.extensions.dpToPx import common.util.extensions.setBackgroundTint import common.util.extensions.setTint import common.util.extensions.setVisible Loading @@ -62,8 +60,8 @@ class MainActivity : QkThemedActivity<MainViewModel>(), MainView { @Inject lateinit var navigator: Navigator @Inject lateinit var conversationsAdapter: ConversationsAdapter @Inject lateinit var dialog: QkDialog @Inject lateinit var itemTouchCallback: ConversationItemTouchCallback @Inject lateinit var menuItemAdapter: MenuItemAdapter override val viewModelClass = MainViewModel::class override val queryChangedIntent by lazy { toolbarSearch.textChanges() } Loading @@ -85,7 +83,7 @@ class MainActivity : QkThemedActivity<MainViewModel>(), MainView { } override val conversationClickIntent by lazy { conversationsAdapter.clicks } override val conversationLongClickIntent by lazy { conversationsAdapter.longClicks } override val conversationMenuItemIntent by lazy { menuItemAdapter.menuItemClicks } override val conversationMenuItemIntent by lazy { dialog.adapter.menuItemClicks } override val confirmDeleteIntent: Subject<Unit> = PublishSubject.create() override val swipeConversationIntent by lazy { itemTouchCallback.swipes } override val undoSwipeConversationIntent: Subject<Unit> = PublishSubject.create() Loading @@ -96,7 +94,6 @@ class MainActivity : QkThemedActivity<MainViewModel>(), MainView { setAction(R.string.button_undo, { undoSwipeConversationIntent.onNext(Unit) }) } } private var conversationMenuDialog: AlertDialog? = null init { appComponent.inject(this) Loading Loading @@ -199,7 +196,6 @@ class MainActivity : QkThemedActivity<MainViewModel>(), MainView { if (recyclerView.adapter !== conversationsAdapter) recyclerView.adapter = conversationsAdapter conversationsAdapter.flowable = state.page.data itemTouchHelper.attachToRecyclerView(recyclerView) menuItemAdapter.data = state.page.menu empty.setText(when (state.page.showClearButton) { true -> R.string.inbox_search_empty_text false -> R.string.inbox_empty_text Loading @@ -212,7 +208,6 @@ class MainActivity : QkThemedActivity<MainViewModel>(), MainView { if (recyclerView.adapter !== conversationsAdapter) recyclerView.adapter = conversationsAdapter conversationsAdapter.flowable = state.page.data itemTouchHelper.attachToRecyclerView(null) menuItemAdapter.data = state.page.menu empty.setText(R.string.archived_empty_text) compose.setVisible(true) } Loading @@ -221,7 +216,6 @@ class MainActivity : QkThemedActivity<MainViewModel>(), MainView { if (!scheduled.isSelected) toolbarSearch.setText(R.string.title_scheduled) recyclerView.adapter = null itemTouchHelper.attachToRecyclerView(null) menuItemAdapter.data = ArrayList() empty.setText(R.string.scheduled_empty_text) compose.setVisible(false) } Loading @@ -241,20 +235,6 @@ 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) if (conversationMenuDialog?.isShowing == true && menuItemAdapter.data.isEmpty()) { conversationMenuDialog?.dismiss() conversationMenuDialog = null } else if (conversationMenuDialog?.isShowing != true && menuItemAdapter.data.isNotEmpty()) { val recyclerView = RecyclerView(this) recyclerView.layoutManager = LinearLayoutManager(this) recyclerView.adapter = menuItemAdapter recyclerView.setPadding(0, 8.dpToPx(this), 0, 8.dpToPx(this)) conversationMenuDialog = AlertDialog.Builder(this).setView(recyclerView).create().apply { setOnDismissListener { conversationMenuItemIntent.onNext(-1) } show() } } } override fun clearSearch() { Loading @@ -262,6 +242,11 @@ class MainActivity : QkThemedActivity<MainViewModel>(), MainView { toolbarSearch.text = null } override fun showDialog(menuItems: List<common.MenuItem>) { dialog.adapter.data = menuItems dialog.show(this) } override fun showDeleteDialog() { AlertDialog.Builder(this) .setTitle(R.string.dialog_delete_title) Loading presentation/src/main/java/feature/main/MainState.kt +1 −4 Original line number Diff line number Diff line Loading @@ -18,7 +18,6 @@ */ package feature.main import common.MenuItem import io.reactivex.Flowable import model.Conversation Loading @@ -33,12 +32,10 @@ sealed class MainPage data class Inbox( val showClearButton: Boolean = false, val data: Flowable<List<Conversation>>? = null, val menu: List<MenuItem> = ArrayList(), val showArchivedSnackbar: Boolean = false) : MainPage() data class Archived( val data: Flowable<List<Conversation>>? = null, val menu: List<MenuItem> = ArrayList()) : MainPage() val data: Flowable<List<Conversation>>? = null) : MainPage() data class Scheduled( val data: Any? = null) : MainPage() No newline at end of file presentation/src/main/java/feature/main/MainView.kt +2 −0 Original line number Diff line number Diff line Loading @@ -18,6 +18,7 @@ */ package feature.main import common.MenuItem import common.base.QkView import io.reactivex.Observable Loading @@ -36,6 +37,7 @@ interface MainView : QkView<MainState> { val undoSwipeConversationIntent: Observable<Unit> fun clearSearch() fun showDialog(menuItems: List<MenuItem>) fun showDeleteDialog() } Loading Loading
presentation/src/main/java/common/QkDialog.kt 0 → 100644 +50 −0 Original line number Diff line number Diff line package common import android.app.Activity import android.app.AlertDialog import android.content.Context import android.support.annotation.StringRes import android.support.v7.widget.LinearLayoutManager import android.support.v7.widget.RecyclerView import common.util.extensions.dpToPx import common.util.extensions.setPadding import injection.appComponent import javax.inject.Inject /** * Wrapper around AlertDialog which makes it easier to display lists that use our UI */ class QkDialog @Inject constructor(private val context: Context, val adapter: MenuItemAdapter) { var title: String? = null init { appComponent.inject(this) } fun show(activity: Activity) { val recyclerView = RecyclerView(context) recyclerView.layoutManager = LinearLayoutManager(context) recyclerView.adapter = adapter recyclerView.setPadding(top = 8.dpToPx(context), bottom = 8.dpToPx(context)) val dialog = AlertDialog.Builder(activity) .setTitle(title) .setView(recyclerView) .create() val clicks = adapter.menuItemClicks .subscribe { dialog.dismiss() } dialog.setOnDismissListener { clicks.dispose() } dialog.show() } fun setTitle(@StringRes title: Int) { this.title = context.getString(title) } } No newline at end of file
presentation/src/main/java/feature/compose/ComposeActivity.kt +5 −16 Original line number Diff line number Diff line Loading @@ -35,6 +35,7 @@ import com.moez.QKSMS.R import com.uber.autodispose.android.lifecycle.scope import com.uber.autodispose.kotlin.autoDisposable import common.MenuItemAdapter import common.QkDialog import common.base.QkThemedActivity import common.util.extensions.autoScrollToStart import common.util.extensions.dpToPx Loading Loading @@ -66,7 +67,7 @@ class ComposeActivity : QkThemedActivity<ComposeViewModel>(), ComposeView { override val infoIntent: Subject<Unit> = PublishSubject.create() override val messageClickIntent: Subject<Message> by lazy { messageAdapter.clicks } override val messageLongClickIntent: Subject<Message> by lazy { messageAdapter.longClicks } override val menuItemIntent: Subject<Int> by lazy { menuItemAdapter.menuItemClicks } override val menuItemIntent: Subject<Int> by lazy { dialog.adapter.menuItemClicks } override val attachmentDeletedIntent: Subject<Uri> by lazy { attachmentAdapter.attachmentDeleted } override val textChangedIntent by lazy { message.textChanges() } override val attachIntent by lazy { attach.clicks() } Loading @@ -74,8 +75,8 @@ class ComposeActivity : QkThemedActivity<ComposeViewModel>(), ComposeView { @Inject lateinit var chipsAdapter: ChipsAdapter @Inject lateinit var contactsAdapter: ContactAdapter @Inject lateinit var dialog: QkDialog @Inject lateinit var messageAdapter: MessagesAdapter @Inject lateinit var menuItemAdapter: MenuItemAdapter @Inject lateinit var attachmentAdapter: AttachmentAdapter init { Loading Loading @@ -205,20 +206,8 @@ class ComposeActivity : QkThemedActivity<ComposeViewModel>(), ComposeView { } override fun showMenu(menuItems: List<common.MenuItem>) { val recyclerView = RecyclerView(this) recyclerView.layoutManager = LinearLayoutManager(this) recyclerView.adapter = menuItemAdapter recyclerView.setPadding(0, 8.dpToPx(this), 0, 8.dpToPx(this)) val dialog = AlertDialog.Builder(this) .setView(recyclerView) .create() .apply { show() } menuItemAdapter.data = menuItems menuItemAdapter.menuItemClicks .autoDisposable(scope()) .subscribe { dialog.dismiss() } dialog.adapter.data = menuItems dialog.show(this) } override fun onCreateOptionsMenu(menu: Menu?): Boolean { Loading
presentation/src/main/java/feature/main/MainActivity.kt +8 −23 Original line number Diff line number Diff line Loading @@ -26,7 +26,6 @@ import android.os.Bundle import android.support.design.widget.Snackbar import android.support.v7.app.ActionBarDrawerToggle import android.support.v7.widget.LinearLayoutManager import android.support.v7.widget.RecyclerView import android.support.v7.widget.helper.ItemTouchHelper import android.view.Gravity import android.view.Menu Loading @@ -37,12 +36,11 @@ import com.jakewharton.rxbinding2.widget.textChanges import com.moez.QKSMS.R import com.uber.autodispose.android.lifecycle.scope import com.uber.autodispose.kotlin.autoDisposable import common.MenuItemAdapter import common.Navigator import common.QkDialog import common.base.QkThemedActivity import common.util.extensions.autoScrollToStart import common.util.extensions.dismissKeyboard import common.util.extensions.dpToPx import common.util.extensions.setBackgroundTint import common.util.extensions.setTint import common.util.extensions.setVisible Loading @@ -62,8 +60,8 @@ class MainActivity : QkThemedActivity<MainViewModel>(), MainView { @Inject lateinit var navigator: Navigator @Inject lateinit var conversationsAdapter: ConversationsAdapter @Inject lateinit var dialog: QkDialog @Inject lateinit var itemTouchCallback: ConversationItemTouchCallback @Inject lateinit var menuItemAdapter: MenuItemAdapter override val viewModelClass = MainViewModel::class override val queryChangedIntent by lazy { toolbarSearch.textChanges() } Loading @@ -85,7 +83,7 @@ class MainActivity : QkThemedActivity<MainViewModel>(), MainView { } override val conversationClickIntent by lazy { conversationsAdapter.clicks } override val conversationLongClickIntent by lazy { conversationsAdapter.longClicks } override val conversationMenuItemIntent by lazy { menuItemAdapter.menuItemClicks } override val conversationMenuItemIntent by lazy { dialog.adapter.menuItemClicks } override val confirmDeleteIntent: Subject<Unit> = PublishSubject.create() override val swipeConversationIntent by lazy { itemTouchCallback.swipes } override val undoSwipeConversationIntent: Subject<Unit> = PublishSubject.create() Loading @@ -96,7 +94,6 @@ class MainActivity : QkThemedActivity<MainViewModel>(), MainView { setAction(R.string.button_undo, { undoSwipeConversationIntent.onNext(Unit) }) } } private var conversationMenuDialog: AlertDialog? = null init { appComponent.inject(this) Loading Loading @@ -199,7 +196,6 @@ class MainActivity : QkThemedActivity<MainViewModel>(), MainView { if (recyclerView.adapter !== conversationsAdapter) recyclerView.adapter = conversationsAdapter conversationsAdapter.flowable = state.page.data itemTouchHelper.attachToRecyclerView(recyclerView) menuItemAdapter.data = state.page.menu empty.setText(when (state.page.showClearButton) { true -> R.string.inbox_search_empty_text false -> R.string.inbox_empty_text Loading @@ -212,7 +208,6 @@ class MainActivity : QkThemedActivity<MainViewModel>(), MainView { if (recyclerView.adapter !== conversationsAdapter) recyclerView.adapter = conversationsAdapter conversationsAdapter.flowable = state.page.data itemTouchHelper.attachToRecyclerView(null) menuItemAdapter.data = state.page.menu empty.setText(R.string.archived_empty_text) compose.setVisible(true) } Loading @@ -221,7 +216,6 @@ class MainActivity : QkThemedActivity<MainViewModel>(), MainView { if (!scheduled.isSelected) toolbarSearch.setText(R.string.title_scheduled) recyclerView.adapter = null itemTouchHelper.attachToRecyclerView(null) menuItemAdapter.data = ArrayList() empty.setText(R.string.scheduled_empty_text) compose.setVisible(false) } Loading @@ -241,20 +235,6 @@ 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) if (conversationMenuDialog?.isShowing == true && menuItemAdapter.data.isEmpty()) { conversationMenuDialog?.dismiss() conversationMenuDialog = null } else if (conversationMenuDialog?.isShowing != true && menuItemAdapter.data.isNotEmpty()) { val recyclerView = RecyclerView(this) recyclerView.layoutManager = LinearLayoutManager(this) recyclerView.adapter = menuItemAdapter recyclerView.setPadding(0, 8.dpToPx(this), 0, 8.dpToPx(this)) conversationMenuDialog = AlertDialog.Builder(this).setView(recyclerView).create().apply { setOnDismissListener { conversationMenuItemIntent.onNext(-1) } show() } } } override fun clearSearch() { Loading @@ -262,6 +242,11 @@ class MainActivity : QkThemedActivity<MainViewModel>(), MainView { toolbarSearch.text = null } override fun showDialog(menuItems: List<common.MenuItem>) { dialog.adapter.data = menuItems dialog.show(this) } override fun showDeleteDialog() { AlertDialog.Builder(this) .setTitle(R.string.dialog_delete_title) Loading
presentation/src/main/java/feature/main/MainState.kt +1 −4 Original line number Diff line number Diff line Loading @@ -18,7 +18,6 @@ */ package feature.main import common.MenuItem import io.reactivex.Flowable import model.Conversation Loading @@ -33,12 +32,10 @@ sealed class MainPage data class Inbox( val showClearButton: Boolean = false, val data: Flowable<List<Conversation>>? = null, val menu: List<MenuItem> = ArrayList(), val showArchivedSnackbar: Boolean = false) : MainPage() data class Archived( val data: Flowable<List<Conversation>>? = null, val menu: List<MenuItem> = ArrayList()) : MainPage() val data: Flowable<List<Conversation>>? = null) : MainPage() data class Scheduled( val data: Any? = null) : MainPage() No newline at end of file
presentation/src/main/java/feature/main/MainView.kt +2 −0 Original line number Diff line number Diff line Loading @@ -18,6 +18,7 @@ */ package feature.main import common.MenuItem import common.base.QkView import io.reactivex.Observable Loading @@ -36,6 +37,7 @@ interface MainView : QkView<MainState> { val undoSwipeConversationIntent: Observable<Unit> fun clearSearch() fun showDialog(menuItems: List<MenuItem>) fun showDeleteDialog() } Loading