Skip to content

Commit

Permalink
Revert "Implement ViewBinding"
Browse files Browse the repository at this point in the history
This reverts commit 37d8c45.

# Conflicts:
#	build.gradle
#	presentation/src/main/java/com/moez/QKSMS/common/widget/AvatarView.kt
#	presentation/src/main/java/com/moez/QKSMS/common/widget/TextInputDialog.kt
#	presentation/src/main/java/com/moez/QKSMS/feature/compose/ComposeActivity.kt
#	presentation/src/main/java/com/moez/QKSMS/feature/compose/MessagesAdapter.kt
#	presentation/src/main/java/com/moez/QKSMS/feature/conversationinfo/ConversationInfoController.kt
#	presentation/src/main/java/com/moez/QKSMS/feature/conversations/ConversationsAdapter.kt
#	presentation/src/main/java/com/moez/QKSMS/feature/main/MainActivity.kt
#	presentation/src/main/java/com/moez/QKSMS/feature/settings/SettingsController.kt
  • Loading branch information
moezbhatti committed Feb 7, 2021
1 parent 03606c0 commit 062adb7
Show file tree
Hide file tree
Showing 78 changed files with 1,208 additions and 1,217 deletions.
2 changes: 1 addition & 1 deletion build.gradle
Expand Up @@ -41,7 +41,7 @@ buildscript {
}

dependencies {
classpath 'com.android.tools.build:gradle:3.6.3'
classpath 'com.android.tools.build:gradle:3.5.4'
classpath 'com.google.firebase:firebase-crashlytics-gradle:2.4.1'
classpath 'com.google.gms:google-services:4.2.0'
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
Expand Down
4 changes: 2 additions & 2 deletions gradle/wrapper/gradle-wrapper.properties
@@ -1,6 +1,6 @@
#Tue Mar 03 19:56:50 EST 2020
#Tue Dec 03 23:30:52 EST 2019
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-5.6.4-all.zip
distributionUrl=https\://services.gradle.org/distributions/gradle-5.4.1-all.zip
9 changes: 5 additions & 4 deletions presentation/build.gradle
Expand Up @@ -19,6 +19,7 @@
apply plugin: 'com.android.application'
apply plugin: 'realm-android' // Realm needs to be before Kotlin or the build will fail
apply plugin: 'kotlin-android'
apply plugin: 'kotlin-android-extensions'
apply plugin: 'kotlin-kapt'

android {
Expand Down Expand Up @@ -69,10 +70,6 @@ android {
noAnalytics { dimension "analytics" }
}

viewBinding {
enabled = true
}

if (System.getenv("CI") == "true") {
signingConfigs.release.storeFile = file("../keystore")
signingConfigs.release.storePassword = System.getenv("keystore_password")
Expand All @@ -81,6 +78,10 @@ android {
}
}

androidExtensions {
experimental = true
}

configurations {
noAnalyticsDebug
noAnalyticsRelease
Expand Down
45 changes: 24 additions & 21 deletions presentation/src/main/java/com/moez/QKSMS/common/MenuItemAdapter.kt
Expand Up @@ -20,40 +20,40 @@ package com.moez.QKSMS.common

import android.content.Context
import android.content.res.ColorStateList
import android.view.LayoutInflater
import android.view.ViewGroup
import androidx.annotation.ArrayRes
import androidx.recyclerview.widget.RecyclerView
import com.moez.QKSMS.R
import com.moez.QKSMS.common.base.QkAdapter
import com.moez.QKSMS.common.base.QkViewHolder
import com.moez.QKSMS.common.util.Colors
import com.moez.QKSMS.common.util.extensions.resolveThemeColor
import com.moez.QKSMS.common.util.extensions.setVisible
import com.moez.QKSMS.databinding.MenuListItemBinding
import io.reactivex.disposables.CompositeDisposable
import io.reactivex.subjects.PublishSubject
import io.reactivex.subjects.Subject
import kotlinx.android.synthetic.main.menu_list_item.*
import kotlinx.android.synthetic.main.menu_list_item.view.*
import javax.inject.Inject

data class MenuItem(val title: String, val actionId: Int)

class MenuItemAdapter @Inject constructor(
private val context: Context,
private val colors: Colors
) : QkAdapter<MenuItem, MenuListItemBinding>() {
class MenuItemAdapter @Inject constructor(private val context: Context, private val colors: Colors) : QkAdapter<MenuItem>() {

val menuItemClicks: Subject<Int> = PublishSubject.create()

private val disposables = CompositeDisposable()

var selectedItem: Int? = null
set(value) {
val old = data.map { it.actionId }.indexOfFirst { it == field }.takeIf { it != -1 }
val new = data.map { it.actionId }.indexOfFirst { it == value }.takeIf { it != -1 }
val old = data.map { it.actionId }.indexOfFirst { it == field }
val new = data.map { it.actionId }.indexOfFirst { it == value }

field = value

old?.let(::notifyItemChanged)
new?.let(::notifyItemChanged)
old.let { notifyItemChanged(it) }
new.let { notifyItemChanged(it) }
}

fun setData(@ArrayRes titles: Int, @ArrayRes values: Int = -1) {
Expand All @@ -63,28 +63,31 @@ class MenuItemAdapter @Inject constructor(
.mapIndexed { index, title -> MenuItem(title, valueInts?.getOrNull(index) ?: index) }
}

override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): QkViewHolder<MenuListItemBinding> {
return QkViewHolder(parent, MenuListItemBinding::inflate).apply {
val states = arrayOf(
intArrayOf(android.R.attr.state_activated),
intArrayOf(-android.R.attr.state_activated))
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): QkViewHolder {
val layoutInflater = LayoutInflater.from(parent.context)
val view = layoutInflater.inflate(R.layout.menu_list_item, parent, false)

val text = parent.context.resolveThemeColor(android.R.attr.textColorTertiary)
binding.check.imageTintList = ColorStateList(states, intArrayOf(colors.theme().theme, text))
val states = arrayOf(
intArrayOf(android.R.attr.state_activated),
intArrayOf(-android.R.attr.state_activated))

binding.root.setOnClickListener {
val text = parent.context.resolveThemeColor(android.R.attr.textColorTertiary)
view.check.imageTintList = ColorStateList(states, intArrayOf(colors.theme().theme, text))

return QkViewHolder(view).apply {
view.setOnClickListener {
val menuItem = getItem(adapterPosition)
menuItemClicks.onNext(menuItem.actionId)
}
}
}

override fun onBindViewHolder(holder: QkViewHolder<MenuListItemBinding>, position: Int) {
override fun onBindViewHolder(holder: QkViewHolder, position: Int) {
val menuItem = getItem(position)

holder.binding.title.text = menuItem.title
holder.binding.check.isActivated = (menuItem.actionId == selectedItem)
holder.binding.check.setVisible(selectedItem != null)
holder.title.text = menuItem.title
holder.check.isActivated = (menuItem.actionId == selectedItem)
holder.check.setVisible(selectedItem != null)
}

override fun onDetachedFromRecyclerView(recyclerView: RecyclerView) {
Expand Down
Expand Up @@ -20,15 +20,14 @@ package com.moez.QKSMS.common.base

import androidx.annotation.CallSuper
import androidx.recyclerview.widget.RecyclerView
import androidx.viewbinding.ViewBinding
import io.reactivex.Flowable
import io.reactivex.disposables.Disposable

/**
* Base RecyclerView.Adapter that provides some convenience when creating a new Adapter, such as
* data list handing and item animations
*/
abstract class FlowableAdapter<T, Binding: ViewBinding> : QkAdapter<T, Binding>() {
abstract class FlowableAdapter<T> : QkAdapter<T>() {

var flowable: Flowable<List<T>>? = null
set(value) {
Expand Down
Expand Up @@ -22,20 +22,14 @@ import android.annotation.SuppressLint
import android.os.Bundle
import android.view.Menu
import android.view.MenuItem
import android.view.View
import androidx.appcompat.app.AppCompatActivity
import androidx.appcompat.widget.Toolbar
import com.moez.QKSMS.R
import com.moez.QKSMS.common.widget.QkTextView
import io.reactivex.subjects.BehaviorSubject
import io.reactivex.subjects.Subject
import kotlinx.android.synthetic.main.toolbar.*

abstract class QkActivity : AppCompatActivity() {

val toolbar by lazy { findViewById<Toolbar>(R.id.toolbar)!! }

protected val menu: Subject<Menu> = BehaviorSubject.create()
protected val toolbarTitle by lazy { findViewById<QkTextView>(R.id.toolbarTitle) }

@SuppressLint("InlinedApi")
override fun onCreate(savedInstanceState: Bundle?) {
Expand All @@ -53,8 +47,8 @@ abstract class QkActivity : AppCompatActivity() {
}
}

override fun setContentView(view: View?) {
super.setContentView(view)
override fun setContentView(layoutResID: Int) {
super.setContentView(layoutResID)
setSupportActionBar(toolbar)
title = title // The title may have been set before layout inflation
}
Expand Down
Expand Up @@ -22,7 +22,6 @@ import android.view.View
import androidx.core.view.isVisible
import androidx.recyclerview.widget.DiffUtil
import androidx.recyclerview.widget.RecyclerView
import androidx.viewbinding.ViewBinding
import com.moez.QKSMS.common.util.extensions.setVisible
import io.reactivex.subjects.BehaviorSubject
import io.reactivex.subjects.Subject
Expand All @@ -31,7 +30,7 @@ import io.reactivex.subjects.Subject
* Base RecyclerView.Adapter that provides some convenience when creating a new Adapter, such as
* data list handing and item animations
*/
abstract class QkAdapter<T, Binding: ViewBinding> : RecyclerView.Adapter<QkViewHolder<Binding>>() {
abstract class QkAdapter<T> : RecyclerView.Adapter<QkViewHolder>() {

var data: List<T> = ArrayList()
set(value) {
Expand Down
Expand Up @@ -21,17 +21,15 @@ package com.moez.QKSMS.common.base
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.annotation.LayoutRes
import androidx.annotation.StringRes
import androidx.appcompat.app.AppCompatActivity
import androidx.appcompat.widget.Toolbar
import androidx.viewbinding.ViewBinding
import com.bluelinelabs.conductor.archlifecycle.LifecycleController
import com.moez.QKSMS.R
import com.moez.QKSMS.common.widget.QkTextView
import kotlinx.android.extensions.LayoutContainer
import kotlinx.android.synthetic.*
import kotlinx.android.synthetic.main.toolbar.view.*

abstract class QkController<ViewContract : QkViewContract<State>, State, Presenter : QkPresenter<ViewContract, State>, Binding : ViewBinding>(
private val bindingInflater: (LayoutInflater, ViewGroup, Boolean) -> Binding
) : LifecycleController() {
abstract class QkController<ViewContract : QkViewContract<State>, State, Presenter : QkPresenter<ViewContract, State>> : LifecycleController(), LayoutContainer {

abstract var presenter: Presenter

Expand All @@ -41,15 +39,16 @@ abstract class QkController<ViewContract : QkViewContract<State>, State, Present
protected val themedActivity: QkThemedActivity?
get() = activity as? QkThemedActivity

private val toolbar by lazy { view?.findViewById<Toolbar>(R.id.toolbar) }
private val toolbarTitle by lazy { view?.findViewById<QkTextView>(R.id.toolbarTitle) }
override var containerView: View? = null

lateinit var binding: Binding
@LayoutRes
var layoutRes: Int = 0

override fun onCreateView(inflater: LayoutInflater, container: ViewGroup): View {
binding = bindingInflater(inflater, container, false)
onViewCreated()
return binding.root
return inflater.inflate(layoutRes, container, false).also {
containerView = it
onViewCreated()
}
}

open fun onViewCreated() {
Expand All @@ -61,13 +60,18 @@ abstract class QkController<ViewContract : QkViewContract<State>, State, Present

fun setTitle(title: CharSequence?) {
activity?.title = title
toolbarTitle?.text = title
view?.toolbarTitle?.text = title
}

fun showBackButton(show: Boolean) {
appCompatActivity?.supportActionBar?.setDisplayHomeAsUpEnabled(show)
}

override fun onDestroyView(view: View) {
containerView = null
clearFindViewByIdCache()
}

override fun onDestroy() {
super.onDestroy()
presenter.onCleared()
Expand Down
Expand Up @@ -20,7 +20,6 @@ package com.moez.QKSMS.common.base

import android.view.View
import androidx.recyclerview.widget.RecyclerView
import androidx.viewbinding.ViewBinding
import com.moez.QKSMS.common.util.extensions.setVisible
import io.reactivex.subjects.BehaviorSubject
import io.reactivex.subjects.Subject
Expand All @@ -31,8 +30,7 @@ import io.realm.RealmRecyclerViewAdapter
import io.realm.RealmResults
import timber.log.Timber

abstract class QkRealmAdapter<T : RealmModel, Binding : ViewBinding>
: RealmRecyclerViewAdapter<T, QkViewHolder<Binding>>(null, true) {
abstract class QkRealmAdapter<T : RealmModel> : RealmRecyclerViewAdapter<T, QkViewHolder>(null, true) {

/**
* This view can be set, and the adapter will automatically control the visibility of this view
Expand Down
Expand Up @@ -44,6 +44,7 @@ import io.reactivex.android.schedulers.AndroidSchedulers
import io.reactivex.rxkotlin.Observables
import io.reactivex.subjects.BehaviorSubject
import io.reactivex.subjects.Subject
import kotlinx.android.synthetic.main.toolbar.*
import java.util.concurrent.TimeUnit
import javax.inject.Inject

Expand Down Expand Up @@ -133,7 +134,7 @@ abstract class QkThemedActivity : QkActivity() {

// Set the color for the overflow and navigation icon
val textSecondary = resolveThemeColor(android.R.attr.textColorSecondary)
toolbar.overflowIcon = toolbar.overflowIcon?.apply { setTint(textSecondary) }
toolbar?.overflowIcon = toolbar?.overflowIcon?.apply { setTint(textSecondary) }

// Update the colours of the menu items
Observables.combineLatest(menu, theme) { menu, theme ->
Expand Down
Expand Up @@ -18,16 +18,10 @@
*/
package com.moez.QKSMS.common.base

import android.view.LayoutInflater
import android.view.ViewGroup
import android.view.View
import androidx.recyclerview.widget.RecyclerView
import androidx.viewbinding.ViewBinding

class QkViewHolder<T : ViewBinding>(val binding: T) : RecyclerView.ViewHolder(binding.root) {

constructor(
parent: ViewGroup,
bindingInflator: (LayoutInflater, ViewGroup, Boolean) -> T
) : this(bindingInflator(LayoutInflater.from(parent.context), parent, false))
import kotlinx.android.extensions.LayoutContainer

class QkViewHolder(view: View) : RecyclerView.ViewHolder(view), LayoutContainer {
override val containerView: View = view
}
Expand Up @@ -20,10 +20,7 @@ package com.moez.QKSMS.common.util.extensions

import android.app.Activity
import android.content.Context
import android.view.LayoutInflater
import android.view.inputmethod.InputMethodManager
import androidx.appcompat.app.AppCompatActivity
import androidx.viewbinding.ViewBinding

fun Activity.dismissKeyboard() {
window.currentFocus?.let { focus ->
Expand All @@ -33,9 +30,3 @@ fun Activity.dismissKeyboard() {
focus.clearFocus()
}
}

inline fun <T : ViewBinding> AppCompatActivity.viewBinding(
crossinline bindingInflater: (LayoutInflater) -> T
): Lazy<T> = lazy(LazyThreadSafetyMode.NONE) {
bindingInflater(layoutInflater)
}
Expand Up @@ -23,7 +23,6 @@ import android.content.Context
import android.content.res.ColorStateList
import android.graphics.PorterDuff
import android.os.Build
import android.view.LayoutInflater
import android.view.MotionEvent
import android.view.View
import android.view.ViewGroup
Expand All @@ -32,7 +31,6 @@ import android.widget.EditText
import android.widget.ImageView
import android.widget.ProgressBar
import androidx.recyclerview.widget.RecyclerView
import androidx.viewbinding.ViewBinding
import androidx.viewpager.widget.ViewPager

var ViewGroup.animateLayoutChanges: Boolean
Expand Down Expand Up @@ -125,7 +123,3 @@ fun RecyclerView.scrapViews() {
recycledViewPool.clear()
adapter?.notifyDataSetChanged()
}

inline fun <T : ViewBinding> ViewGroup.viewBinding(crossinline bindingInflater: (LayoutInflater, ViewGroup) -> T): T {
return bindingInflater(LayoutInflater.from(context), this)
}

0 comments on commit 062adb7

Please sign in to comment.