Merge pull request #673 from fatihergin/feature/viewbinding-sdk-34-migration

Feature/viewbinding sdk 34 migration
This commit is contained in:
Tibor Kaputa 2023-08-29 17:49:54 +02:00 committed by GitHub
commit 9464b76036
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
30 changed files with 1008 additions and 793 deletions

View File

@ -1,7 +1,6 @@
plugins { plugins {
id 'com.android.application' id 'com.android.application'
id 'kotlin-android' id 'kotlin-android'
id 'kotlin-android-extensions'
id 'org.jetbrains.kotlin.plugin.serialization' version "$kotlin_version" id 'org.jetbrains.kotlin.plugin.serialization' version "$kotlin_version"
} }
@ -12,12 +11,13 @@ if (keystorePropertiesFile.exists()) {
} }
android { android {
compileSdk 33 namespace "com.simplemobiletools.dialer"
compileSdk 34
defaultConfig { defaultConfig {
applicationId "com.simplemobiletools.dialer" applicationId "com.simplemobiletools.dialer"
minSdkVersion 23 minSdk 23
targetSdkVersion 33 targetSdk 34
versionCode 56 versionCode 56
versionName "5.18.0" versionName "5.18.0"
setProperty("archivesBaseName", "dialer") setProperty("archivesBaseName", "dialer")
@ -34,6 +34,11 @@ android {
} }
} }
buildFeatures {
buildConfig true
viewBinding true
}
buildTypes { buildTypes {
debug { debug {
applicationIdSuffix ".debug" applicationIdSuffix ".debug"
@ -47,6 +52,15 @@ android {
} }
} }
compileOptions {
sourceCompatibility JavaVersion.VERSION_17
targetCompatibility JavaVersion.VERSION_17
}
kotlinOptions {
jvmTarget = '17'
}
flavorDimensions = ["variants"] flavorDimensions = ["variants"]
productFlavors { productFlavors {
core {} core {}
@ -65,7 +79,7 @@ android {
} }
dependencies { dependencies {
implementation 'com.github.SimpleMobileTools:Simple-Commons:91763fe00f' implementation 'com.github.SimpleMobileTools:Simple-Commons:565200547d'
implementation 'com.github.tibbi:IndicatorFastScroll:4524cd0b61' implementation 'com.github.tibbi:IndicatorFastScroll:4524cd0b61'
implementation 'me.grantland:autofittextview:0.2.1' implementation 'me.grantland:autofittextview:0.2.1'
implementation "org.jetbrains.kotlinx:kotlinx-serialization-json:1.4.1" implementation "org.jetbrains.kotlinx:kotlinx-serialization-json:1.4.1"

View File

@ -26,13 +26,12 @@ import com.simplemobiletools.commons.extensions.*
import com.simplemobiletools.commons.helpers.* import com.simplemobiletools.commons.helpers.*
import com.simplemobiletools.commons.models.SimpleListItem import com.simplemobiletools.commons.models.SimpleListItem
import com.simplemobiletools.dialer.R import com.simplemobiletools.dialer.R
import com.simplemobiletools.dialer.databinding.ActivityCallBinding
import com.simplemobiletools.dialer.dialogs.DynamicBottomSheetChooserDialog import com.simplemobiletools.dialer.dialogs.DynamicBottomSheetChooserDialog
import com.simplemobiletools.dialer.extensions.* import com.simplemobiletools.dialer.extensions.*
import com.simplemobiletools.dialer.helpers.* import com.simplemobiletools.dialer.helpers.*
import com.simplemobiletools.dialer.models.AudioRoute import com.simplemobiletools.dialer.models.AudioRoute
import com.simplemobiletools.dialer.models.CallContact import com.simplemobiletools.dialer.models.CallContact
import kotlinx.android.synthetic.main.activity_call.*
import kotlinx.android.synthetic.main.dialpad.*
import kotlin.math.max import kotlin.math.max
import kotlin.math.min import kotlin.math.min
@ -45,6 +44,8 @@ class CallActivity : SimpleActivity() {
} }
} }
private val binding by viewBinding(ActivityCallBinding::inflate)
private var isSpeakerOn = false private var isSpeakerOn = false
private var isMicrophoneOff = false private var isMicrophoneOff = false
private var isCallEnded = false private var isCallEnded = false
@ -63,14 +64,14 @@ class CallActivity : SimpleActivity() {
override fun onCreate(savedInstanceState: Bundle?) { override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState) super.onCreate(savedInstanceState)
setContentView(R.layout.activity_call) setContentView(binding.root)
if (CallManager.getPhoneState() == NoCall) { if (CallManager.getPhoneState() == NoCall) {
finish() finish()
return return
} }
updateTextColors(call_holder) updateTextColors(binding.callHolder)
initButtons() initButtons()
audioManager.mode = AudioManager.MODE_IN_CALL audioManager.mode = AudioManager.MODE_IN_CALL
addLockScreenFlags() addLockScreenFlags()
@ -104,7 +105,7 @@ class CallActivity : SimpleActivity() {
} }
override fun onBackPressed() { override fun onBackPressed() {
if (dialpad_wrapper.isVisible()) { if (binding.dialpadWrapper.isVisible()) {
hideDialpad() hideDialpad()
return return
} else { } else {
@ -117,119 +118,121 @@ class CallActivity : SimpleActivity() {
} }
} }
private fun initButtons() { private fun initButtons() = binding.apply {
if (config.disableSwipeToAnswer) { if (config.disableSwipeToAnswer) {
call_draggable.beGone() callDraggable.beGone()
call_draggable_background.beGone() callDraggableBackground.beGone()
call_left_arrow.beGone() callLeftArrow.beGone()
call_right_arrow.beGone() callRightArrow.beGone()
call_decline.setOnClickListener { callDecline.setOnClickListener {
endCall() endCall()
} }
call_accept.setOnClickListener { callAccept.setOnClickListener {
acceptCall() acceptCall()
} }
} else { } else {
handleSwipe() handleSwipe()
} }
call_toggle_microphone.setOnClickListener { callToggleMicrophone.setOnClickListener {
toggleMicrophone() toggleMicrophone()
} }
call_toggle_speaker.setOnClickListener { callToggleSpeaker.setOnClickListener {
changeCallAudioRoute() changeCallAudioRoute()
} }
call_dialpad.setOnClickListener { callDialpad.setOnClickListener {
toggleDialpadVisibility() toggleDialpadVisibility()
} }
dialpad_close.setOnClickListener { dialpadClose.setOnClickListener {
hideDialpad() hideDialpad()
} }
call_toggle_hold.setOnClickListener { callToggleHold.setOnClickListener {
toggleHold() toggleHold()
} }
call_add.setOnClickListener { callAdd.setOnClickListener {
Intent(applicationContext, DialpadActivity::class.java).apply { Intent(applicationContext, DialpadActivity::class.java).apply {
addFlags(Intent.FLAG_ACTIVITY_NO_HISTORY) addFlags(Intent.FLAG_ACTIVITY_NO_HISTORY)
startActivity(this) startActivity(this)
} }
} }
call_swap.setOnClickListener { callSwap.setOnClickListener {
CallManager.swap() CallManager.swap()
} }
call_merge.setOnClickListener { callMerge.setOnClickListener {
CallManager.merge() CallManager.merge()
} }
call_manage.setOnClickListener { callManage.setOnClickListener {
startActivity(Intent(this, ConferenceActivity::class.java)) startActivity(Intent(this@CallActivity, ConferenceActivity::class.java))
} }
call_end.setOnClickListener { callEnd.setOnClickListener {
endCall() endCall()
} }
dialpad_0_holder.setOnClickListener { dialpadPressed('0') } dialpadInclude.apply {
dialpad_1_holder.setOnClickListener { dialpadPressed('1') } dialpad0Holder.setOnClickListener { dialpadPressed('0') }
dialpad_2_holder.setOnClickListener { dialpadPressed('2') } dialpad1Holder.setOnClickListener { dialpadPressed('1') }
dialpad_3_holder.setOnClickListener { dialpadPressed('3') } dialpad2Holder.setOnClickListener { dialpadPressed('2') }
dialpad_4_holder.setOnClickListener { dialpadPressed('4') } dialpad3Holder.setOnClickListener { dialpadPressed('3') }
dialpad_5_holder.setOnClickListener { dialpadPressed('5') } dialpad4Holder.setOnClickListener { dialpadPressed('4') }
dialpad_6_holder.setOnClickListener { dialpadPressed('6') } dialpad5Holder.setOnClickListener { dialpadPressed('5') }
dialpad_7_holder.setOnClickListener { dialpadPressed('7') } dialpad6Holder.setOnClickListener { dialpadPressed('6') }
dialpad_8_holder.setOnClickListener { dialpadPressed('8') } dialpad7Holder.setOnClickListener { dialpadPressed('7') }
dialpad_9_holder.setOnClickListener { dialpadPressed('9') } dialpad8Holder.setOnClickListener { dialpadPressed('8') }
dialpad9Holder.setOnClickListener { dialpadPressed('9') }
arrayOf( arrayOf(
dialpad_0_holder, dialpad0Holder,
dialpad_1_holder, dialpad1Holder,
dialpad_2_holder, dialpad2Holder,
dialpad_3_holder, dialpad3Holder,
dialpad_4_holder, dialpad4Holder,
dialpad_5_holder, dialpad5Holder,
dialpad_6_holder, dialpad6Holder,
dialpad_7_holder, dialpad7Holder,
dialpad_8_holder, dialpad8Holder,
dialpad_9_holder, dialpad9Holder,
dialpad_plus_holder, dialpadPlusHolder,
dialpad_asterisk_holder, dialpadAsteriskHolder,
dialpad_hashtag_holder dialpadHashtagHolder
).forEach { ).forEach {
it.background = ResourcesCompat.getDrawable(resources, R.drawable.pill_background, theme) it.background = ResourcesCompat.getDrawable(resources, R.drawable.pill_background, theme)
it.background?.alpha = LOWER_ALPHA_INT it.background?.alpha = LOWER_ALPHA_INT
}
dialpad0Holder.setOnLongClickListener { dialpadPressed('+'); true }
dialpadAsteriskHolder.setOnClickListener { dialpadPressed('*') }
dialpadHashtagHolder.setOnClickListener { dialpadPressed('#') }
} }
dialpad_0_holder.setOnLongClickListener { dialpadPressed('+'); true } dialpadWrapper.setBackgroundColor(getProperBackgroundColor())
dialpad_asterisk_holder.setOnClickListener { dialpadPressed('*') } arrayOf(dialpadClose, callSimImage).forEach {
dialpad_hashtag_holder.setOnClickListener { dialpadPressed('#') }
dialpad_wrapper.setBackgroundColor(getProperBackgroundColor())
arrayOf(dialpad_close, call_sim_image).forEach {
it.applyColorFilter(getProperTextColor()) it.applyColorFilter(getProperTextColor())
} }
val bgColor = getProperBackgroundColor() val bgColor = getProperBackgroundColor()
val inactiveColor = getInactiveButtonColor() val inactiveColor = getInactiveButtonColor()
arrayOf( arrayOf(
call_toggle_microphone, call_toggle_speaker, call_dialpad, callToggleMicrophone, callToggleSpeaker, callDialpad,
call_toggle_hold, call_add, call_swap, call_merge, call_manage callToggleHold, callAdd, callSwap, callMerge, callManage
).forEach { ).forEach {
it.applyColorFilter(bgColor.getContrastColor()) it.applyColorFilter(bgColor.getContrastColor())
it.background.applyColorFilter(inactiveColor) it.background.applyColorFilter(inactiveColor)
} }
arrayOf( arrayOf(
call_toggle_microphone, call_toggle_speaker, call_dialpad, callToggleMicrophone, callToggleSpeaker, callDialpad,
call_toggle_hold, call_add, call_swap, call_merge, call_manage callToggleHold, callAdd, callSwap, callMerge, callManage
).forEach { imageView -> ).forEach { imageView ->
imageView.setOnLongClickListener { imageView.setOnLongClickListener {
if (!imageView.contentDescription.isNullOrEmpty()) { if (!imageView.contentDescription.isNullOrEmpty()) {
@ -239,16 +242,16 @@ class CallActivity : SimpleActivity() {
} }
} }
call_sim_id.setTextColor(getProperTextColor().getContrastColor()) callSimId.setTextColor(getProperTextColor().getContrastColor())
dialpad_input.disableKeyboard() dialpadInput.disableKeyboard()
dialpad_wrapper.onGlobalLayout { dialpadWrapper.onGlobalLayout {
dialpadHeight = dialpad_wrapper.height.toFloat() dialpadHeight = dialpadWrapper.height.toFloat()
} }
} }
@SuppressLint("ClickableViewAccessibility") @SuppressLint("ClickableViewAccessibility")
private fun handleSwipe() { private fun handleSwipe() = binding.apply {
var minDragX = 0f var minDragX = 0f
var maxDragX = 0f var maxDragX = 0f
var initialDraggableX = 0f var initialDraggableX = 0f
@ -262,84 +265,85 @@ class CallActivity : SimpleActivity() {
var rightArrowTranslation = 0f var rightArrowTranslation = 0f
val isRtl = isRTLLayout val isRtl = isRTLLayout
call_accept.onGlobalLayout { callAccept.onGlobalLayout {
minDragX = if (isRtl) { minDragX = if (isRtl) {
call_accept.left.toFloat() callAccept.left.toFloat()
} else { } else {
call_decline.left.toFloat() callDecline.left.toFloat()
} }
maxDragX = if (isRtl) { maxDragX = if (isRtl) {
call_decline.left.toFloat() callDecline.left.toFloat()
} else { } else {
call_accept.left.toFloat() callAccept.left.toFloat()
} }
initialDraggableX = call_draggable.left.toFloat() initialDraggableX = callDraggable.left.toFloat()
initialLeftArrowX = call_left_arrow.x initialLeftArrowX = callLeftArrow.x
initialRightArrowX = call_right_arrow.x initialRightArrowX = callRightArrow.x
initialLeftArrowScaleX = call_left_arrow.scaleX initialLeftArrowScaleX = callLeftArrow.scaleX
initialLeftArrowScaleY = call_left_arrow.scaleY initialLeftArrowScaleY = callLeftArrow.scaleY
initialRightArrowScaleX = call_right_arrow.scaleX initialRightArrowScaleX = callRightArrow.scaleX
initialRightArrowScaleY = call_right_arrow.scaleY initialRightArrowScaleY = callRightArrow.scaleY
leftArrowTranslation = if (isRtl) { leftArrowTranslation = if (isRtl) {
call_accept.x callAccept.x
} else { } else {
-call_decline.x -callDecline.x
} }
rightArrowTranslation = if (isRtl) { rightArrowTranslation = if (isRtl) {
-call_accept.x -callAccept.x
} else { } else {
call_decline.x callDecline.x
} }
if (isRtl) { if (isRtl) {
call_left_arrow.setImageResource(R.drawable.ic_chevron_right_vector) callLeftArrow.setImageResource(R.drawable.ic_chevron_right_vector)
call_right_arrow.setImageResource(R.drawable.ic_chevron_left_vector) callRightArrow.setImageResource(R.drawable.ic_chevron_left_vector)
} }
call_left_arrow.applyColorFilter(getColor(R.color.md_red_400)) callLeftArrow.applyColorFilter(getColor(R.color.md_red_400))
call_right_arrow.applyColorFilter(getColor(R.color.md_green_400)) callRightArrow.applyColorFilter(getColor(R.color.md_green_400))
startArrowAnimation(call_left_arrow, initialLeftArrowX, initialLeftArrowScaleX, initialLeftArrowScaleY, leftArrowTranslation) startArrowAnimation(callLeftArrow, initialLeftArrowX, initialLeftArrowScaleX, initialLeftArrowScaleY, leftArrowTranslation)
startArrowAnimation(call_right_arrow, initialRightArrowX, initialRightArrowScaleX, initialRightArrowScaleY, rightArrowTranslation) startArrowAnimation(callRightArrow, initialRightArrowX, initialRightArrowScaleX, initialRightArrowScaleY, rightArrowTranslation)
} }
call_draggable.drawable.mutate().setTint(getProperTextColor()) callDraggable.drawable.mutate().setTint(getProperTextColor())
call_draggable_background.drawable.mutate().setTint(getProperTextColor()) callDraggableBackground.drawable.mutate().setTint(getProperTextColor())
var lock = false var lock = false
call_draggable.setOnTouchListener { _, event -> callDraggable.setOnTouchListener { _, event ->
when (event.action) { when (event.action) {
MotionEvent.ACTION_DOWN -> { MotionEvent.ACTION_DOWN -> {
dragDownX = event.x dragDownX = event.x
call_draggable_background.animate().alpha(0f) callDraggableBackground.animate().alpha(0f)
stopAnimation = true stopAnimation = true
call_left_arrow.animate().alpha(0f) callLeftArrow.animate().alpha(0f)
call_right_arrow.animate().alpha(0f) callRightArrow.animate().alpha(0f)
lock = false lock = false
} }
MotionEvent.ACTION_UP, MotionEvent.ACTION_CANCEL -> { MotionEvent.ACTION_UP, MotionEvent.ACTION_CANCEL -> {
dragDownX = 0f dragDownX = 0f
call_draggable.animate().x(initialDraggableX).withEndAction { callDraggable.animate().x(initialDraggableX).withEndAction {
call_draggable_background.animate().alpha(0.2f) callDraggableBackground.animate().alpha(0.2f)
} }
call_draggable.setImageDrawable(getDrawable(R.drawable.ic_phone_down_vector)) callDraggable.setImageDrawable(getDrawable(R.drawable.ic_phone_down_vector))
call_draggable.drawable.mutate().setTint(getProperTextColor()) callDraggable.drawable.mutate().setTint(getProperTextColor())
call_left_arrow.animate().alpha(1f) callLeftArrow.animate().alpha(1f)
call_right_arrow.animate().alpha(1f) callRightArrow.animate().alpha(1f)
stopAnimation = false stopAnimation = false
startArrowAnimation(call_left_arrow, initialLeftArrowX, initialLeftArrowScaleX, initialLeftArrowScaleY, leftArrowTranslation) startArrowAnimation(callLeftArrow, initialLeftArrowX, initialLeftArrowScaleX, initialLeftArrowScaleY, leftArrowTranslation)
startArrowAnimation(call_right_arrow, initialRightArrowX, initialRightArrowScaleX, initialRightArrowScaleY, rightArrowTranslation) startArrowAnimation(callRightArrow, initialRightArrowX, initialRightArrowScaleX, initialRightArrowScaleY, rightArrowTranslation)
} }
MotionEvent.ACTION_MOVE -> { MotionEvent.ACTION_MOVE -> {
call_draggable.x = min(maxDragX, max(minDragX, event.rawX - dragDownX)) callDraggable.x = min(maxDragX, max(minDragX, event.rawX - dragDownX))
when { when {
call_draggable.x >= maxDragX - 50f -> { callDraggable.x >= maxDragX - 50f -> {
if (!lock) { if (!lock) {
lock = true lock = true
call_draggable.performHapticFeedback() callDraggable.performHapticFeedback()
if (isRtl) { if (isRtl) {
endCall() endCall()
} else { } else {
@ -347,10 +351,11 @@ class CallActivity : SimpleActivity() {
} }
} }
} }
call_draggable.x <= minDragX + 50f -> {
callDraggable.x <= minDragX + 50f -> {
if (!lock) { if (!lock) {
lock = true lock = true
call_draggable.performHapticFeedback() callDraggable.performHapticFeedback()
if (isRtl) { if (isRtl) {
acceptCall() acceptCall()
} else { } else {
@ -358,23 +363,25 @@ class CallActivity : SimpleActivity() {
} }
} }
} }
call_draggable.x > initialDraggableX -> {
callDraggable.x > initialDraggableX -> {
lock = false lock = false
val drawableRes = if (isRtl) { val drawableRes = if (isRtl) {
R.drawable.ic_phone_down_red_vector R.drawable.ic_phone_down_red_vector
} else { } else {
R.drawable.ic_phone_green_vector R.drawable.ic_phone_green_vector
} }
call_draggable.setImageDrawable(getDrawable(drawableRes)) callDraggable.setImageDrawable(getDrawable(drawableRes))
} }
call_draggable.x <= initialDraggableX -> {
callDraggable.x <= initialDraggableX -> {
lock = false lock = false
val drawableRes = if (isRtl) { val drawableRes = if (isRtl) {
R.drawable.ic_phone_green_vector R.drawable.ic_phone_green_vector
} else { } else {
R.drawable.ic_phone_down_red_vector R.drawable.ic_phone_down_red_vector
} }
call_draggable.setImageDrawable(getDrawable(drawableRes)) callDraggable.setImageDrawable(getDrawable(drawableRes))
} }
} }
} }
@ -405,7 +412,7 @@ class CallActivity : SimpleActivity() {
private fun dialpadPressed(char: Char) { private fun dialpadPressed(char: Char) {
CallManager.keypad(char) CallManager.keypad(char)
dialpad_input.addCharacter(char) binding.dialpadInput.addCharacter(char)
} }
private fun changeCallAudioRoute() { private fun changeCallAudioRoute() {
@ -449,7 +456,7 @@ class CallActivity : SimpleActivity() {
isSpeakerOn = route == AudioRoute.SPEAKER isSpeakerOn = route == AudioRoute.SPEAKER
val supportedAudioRoutes = CallManager.getSupportedAudioRoutes() val supportedAudioRoutes = CallManager.getSupportedAudioRoutes()
call_toggle_speaker.apply { binding.callToggleSpeaker.apply {
val bluetoothConnected = supportedAudioRoutes.contains(AudioRoute.BLUETOOTH) val bluetoothConnected = supportedAudioRoutes.contains(AudioRoute.BLUETOOTH)
contentDescription = if (bluetoothConnected) { contentDescription = if (bluetoothConnected) {
getString(R.string.choose_audio_route) getString(R.string.choose_audio_route)
@ -463,7 +470,7 @@ class CallActivity : SimpleActivity() {
setImageResource(route.iconRes) setImageResource(route.iconRes)
} }
} }
toggleButtonColor(call_toggle_speaker, enabled = route != AudioRoute.EARPIECE && route != AudioRoute.WIRED_HEADSET) toggleButtonColor(binding.callToggleSpeaker, enabled = route != AudioRoute.EARPIECE && route != AudioRoute.WIRED_HEADSET)
createOrUpdateAudioRouteChooser(supportedAudioRoutes, create = false) createOrUpdateAudioRouteChooser(supportedAudioRoutes, create = false)
if (isSpeakerOn) { if (isSpeakerOn) {
@ -482,20 +489,20 @@ class CallActivity : SimpleActivity() {
} }
private fun updateMicrophoneButton() { private fun updateMicrophoneButton() {
toggleButtonColor(call_toggle_microphone, isMicrophoneOff) toggleButtonColor(binding.callToggleMicrophone, isMicrophoneOff)
call_toggle_microphone.contentDescription = getString(if (isMicrophoneOff) R.string.turn_microphone_on else R.string.turn_microphone_off) binding.callToggleMicrophone.contentDescription = getString(if (isMicrophoneOff) R.string.turn_microphone_on else R.string.turn_microphone_off)
} }
private fun toggleDialpadVisibility() { private fun toggleDialpadVisibility() {
if (dialpad_wrapper.isVisible()) hideDialpad() else showDialpad() if (binding.dialpadWrapper.isVisible()) hideDialpad() else showDialpad()
} }
private fun findVisibleViewsUnderDialpad(): Sequence<Pair<View, Float>> { private fun findVisibleViewsUnderDialpad(): Sequence<Pair<View, Float>> {
return ongoing_call_holder.children.filter { it.isVisible() }.map { view -> Pair(view, view.alpha) } return binding.ongoingCallHolder.children.filter { it.isVisible() }.map { view -> Pair(view, view.alpha) }
} }
private fun showDialpad() { private fun showDialpad() {
dialpad_wrapper.apply { binding.dialpadWrapper.apply {
translationY = dialpadHeight translationY = dialpadHeight
alpha = 0f alpha = 0f
animate() animate()
@ -518,8 +525,8 @@ class CallActivity : SimpleActivity() {
} }
private fun hideDialpad() { private fun hideDialpad() {
dialpad_wrapper.animate() binding.dialpadWrapper.animate()
.withEndAction { dialpad_wrapper.beGone() } .withEndAction { binding.dialpadWrapper.beGone() }
.setInterpolator(AccelerateDecelerateInterpolator()) .setInterpolator(AccelerateDecelerateInterpolator())
.setDuration(200L) .setDuration(200L)
.alpha(0f) .alpha(0f)
@ -536,9 +543,9 @@ class CallActivity : SimpleActivity() {
private fun toggleHold() { private fun toggleHold() {
val isOnHold = CallManager.toggleHold() val isOnHold = CallManager.toggleHold()
toggleButtonColor(call_toggle_hold, isOnHold) toggleButtonColor(binding.callToggleHold, isOnHold)
call_toggle_hold.contentDescription = getString(if (isOnHold) R.string.resume_call else R.string.hold_call) binding.callToggleHold.contentDescription = getString(if (isOnHold) R.string.resume_call else R.string.hold_call)
hold_status_label.beVisibleIf(isOnHold) binding.holdStatusLabel.beVisibleIf(isOnHold)
} }
private fun updateOtherPersonsInfo(avatar: Bitmap?) { private fun updateOtherPersonsInfo(avatar: Bitmap?) {
@ -546,21 +553,23 @@ class CallActivity : SimpleActivity() {
return return
} }
caller_name_label.text = if (callContact!!.name.isNotEmpty()) callContact!!.name else getString(R.string.unknown_caller) binding.apply {
if (callContact!!.number.isNotEmpty() && callContact!!.number != callContact!!.name) { callerNameLabel.text = if (callContact!!.name.isNotEmpty()) callContact!!.name else getString(R.string.unknown_caller)
caller_number.text = callContact!!.number if (callContact!!.number.isNotEmpty() && callContact!!.number != callContact!!.name) {
callerNumber.text = callContact!!.number
if (callContact!!.numberLabel.isNotEmpty()) { if (callContact!!.numberLabel.isNotEmpty()) {
caller_number.text = "${callContact!!.number} - ${callContact!!.numberLabel}" callerNumber.text = "${callContact!!.number} - ${callContact!!.numberLabel}"
}
} else {
callerNumber.beGone()
} }
} else {
caller_number.beGone()
}
if (avatar != null) { if (avatar != null) {
caller_avatar.setImageBitmap(avatar) callerAvatar.setImageBitmap(avatar)
} else { } else {
caller_avatar.setImageDrawable(null) callerAvatar.setImageDrawable(null)
}
} }
} }
@ -579,9 +588,11 @@ class CallActivity : SimpleActivity() {
if (accounts.size > 1) { if (accounts.size > 1) {
accounts.forEachIndexed { index, account -> accounts.forEachIndexed { index, account ->
if (account == CallManager.getPrimaryCall()?.details?.accountHandle) { if (account == CallManager.getPrimaryCall()?.details?.accountHandle) {
call_sim_id.text = "${index + 1}" binding.apply {
call_sim_id.beVisible() callSimId.text = "${index + 1}"
call_sim_image.beVisible() callSimId.beVisible()
callSimImage.beVisible()
}
val acceptDrawableId = when (index) { val acceptDrawableId = when (index) {
0 -> R.drawable.ic_phone_one_vector 0 -> R.drawable.ic_phone_one_vector
@ -592,7 +603,7 @@ class CallActivity : SimpleActivity() {
val rippleBg = resources.getDrawable(R.drawable.ic_call_accept, theme) as RippleDrawable val rippleBg = resources.getDrawable(R.drawable.ic_call_accept, theme) as RippleDrawable
val layerDrawable = rippleBg.findDrawableByLayerId(R.id.accept_call_background_holder) as LayerDrawable val layerDrawable = rippleBg.findDrawableByLayerId(R.id.accept_call_background_holder) as LayerDrawable
layerDrawable.setDrawableByLayerId(R.id.accept_call_icon, getDrawable(acceptDrawableId)) layerDrawable.setDrawableByLayerId(R.id.accept_call_icon, getDrawable(acceptDrawableId))
call_accept.setImageDrawable(rippleBg) binding.callAccept.setImageDrawable(rippleBg)
} }
} }
} }
@ -616,13 +627,15 @@ class CallActivity : SimpleActivity() {
else -> 0 else -> 0
} }
if (statusTextId != 0) { binding.apply {
call_status_label.text = getString(statusTextId) if (statusTextId != 0) {
} callStatusLabel.text = getString(statusTextId)
}
call_manage.beVisibleIf(call.hasCapability(Call.Details.CAPABILITY_MANAGE_CONFERENCE)) callManage.beVisibleIf(call.hasCapability(Call.Details.CAPABILITY_MANAGE_CONFERENCE))
setActionButtonEnabled(call_swap, state == Call.STATE_ACTIVE) setActionButtonEnabled(callSwap, state == Call.STATE_ACTIVE)
setActionButtonEnabled(call_merge, state == Call.STATE_ACTIVE) setActionButtonEnabled(callMerge, state == Call.STATE_ACTIVE)
}
} }
private fun updateState() { private fun updateState() {
@ -633,8 +646,8 @@ class CallActivity : SimpleActivity() {
val state = phoneState.call.getStateCompat() val state = phoneState.call.getStateCompat()
val isSingleCallActionsEnabled = (state == Call.STATE_ACTIVE || state == Call.STATE_DISCONNECTED val isSingleCallActionsEnabled = (state == Call.STATE_ACTIVE || state == Call.STATE_DISCONNECTED
|| state == Call.STATE_DISCONNECTING || state == Call.STATE_HOLDING) || state == Call.STATE_DISCONNECTING || state == Call.STATE_HOLDING)
setActionButtonEnabled(call_toggle_hold, isSingleCallActionsEnabled) setActionButtonEnabled(binding.callToggleHold, isSingleCallActionsEnabled)
setActionButtonEnabled(call_add, isSingleCallActionsEnabled) setActionButtonEnabled(binding.callAdd, isSingleCallActionsEnabled)
} else if (phoneState is TwoCalls) { } else if (phoneState is TwoCalls) {
updateCallState(phoneState.active) updateCallState(phoneState.active)
updateCallOnHoldState(phoneState.onHold) updateCallOnHoldState(phoneState.onHold)
@ -648,13 +661,15 @@ class CallActivity : SimpleActivity() {
if (hasCallOnHold) { if (hasCallOnHold) {
getCallContact(applicationContext, call) { contact -> getCallContact(applicationContext, call) { contact ->
runOnUiThread { runOnUiThread {
on_hold_caller_name.text = getContactNameOrNumber(contact) binding.onHoldCallerName.text = getContactNameOrNumber(contact)
} }
} }
} }
on_hold_status_holder.beVisibleIf(hasCallOnHold) binding.apply {
controls_single_call.beVisibleIf(!hasCallOnHold) onHoldStatusHolder.beVisibleIf(hasCallOnHold)
controls_two_calls.beVisibleIf(hasCallOnHold) controlsSingleCall.beVisibleIf(!hasCallOnHold)
controlsTwoCalls.beVisibleIf(hasCallOnHold)
}
} }
private fun updateCallContactInfo(call: Call?) { private fun updateCallContactInfo(call: Call?) {
@ -677,18 +692,18 @@ class CallActivity : SimpleActivity() {
private fun initOutgoingCallUI() { private fun initOutgoingCallUI() {
enableProximitySensor() enableProximitySensor()
incoming_call_holder.beGone() binding.incomingCallHolder.beGone()
ongoing_call_holder.beVisible() binding.ongoingCallHolder.beVisible()
} }
private fun callRinging() { private fun callRinging() {
incoming_call_holder.beVisible() binding.incomingCallHolder.beVisible()
} }
private fun callStarted() { private fun callStarted() {
enableProximitySensor() enableProximitySensor()
incoming_call_holder.beGone() binding.incomingCallHolder.beGone()
ongoing_call_holder.beVisible() binding.ongoingCallHolder.beVisible()
callDurationHandler.removeCallbacks(updateCallDurationTask) callDurationHandler.removeCallbacks(updateCallDurationTask)
callDurationHandler.post(updateCallDurationTask) callDurationHandler.post(updateCallDurationTask)
} }
@ -719,13 +734,13 @@ class CallActivity : SimpleActivity() {
isCallEnded = true isCallEnded = true
if (callDuration > 0) { if (callDuration > 0) {
runOnUiThread { runOnUiThread {
call_status_label.text = "${callDuration.getFormattedDuration()} (${getString(R.string.call_ended)})" binding.callStatusLabel.text = "${callDuration.getFormattedDuration()} (${getString(R.string.call_ended)})"
Handler().postDelayed({ Handler().postDelayed({
finishAndRemoveTask() finishAndRemoveTask()
}, 3000) }, 3000)
} }
} else { } else {
call_status_label.text = getString(R.string.call_ended) binding.callStatusLabel.text = getString(R.string.call_ended)
finish() finish()
} }
} }
@ -750,7 +765,7 @@ class CallActivity : SimpleActivity() {
override fun run() { override fun run() {
callDuration = CallManager.getPrimaryCall().getCallDuration() callDuration = CallManager.getPrimaryCall().getCallDuration()
if (!isCallEnded) { if (!isCallEnded) {
call_status_label.text = callDuration.getFormattedDuration() binding.callStatusLabel.text = callDuration.getFormattedDuration()
callDurationHandler.postDelayed(this, 1000) callDurationHandler.postDelayed(this, 1000)
} }
} }

View File

@ -1,25 +1,28 @@
package com.simplemobiletools.dialer.activities package com.simplemobiletools.dialer.activities
import android.os.Bundle import android.os.Bundle
import com.simplemobiletools.commons.extensions.viewBinding
import com.simplemobiletools.commons.helpers.NavigationIcon import com.simplemobiletools.commons.helpers.NavigationIcon
import com.simplemobiletools.dialer.R
import com.simplemobiletools.dialer.adapters.ConferenceCallsAdapter import com.simplemobiletools.dialer.adapters.ConferenceCallsAdapter
import com.simplemobiletools.dialer.databinding.ActivityConferenceBinding
import com.simplemobiletools.dialer.helpers.CallManager import com.simplemobiletools.dialer.helpers.CallManager
import kotlinx.android.synthetic.main.activity_conference.*
class ConferenceActivity : SimpleActivity() { class ConferenceActivity : SimpleActivity() {
private val binding by viewBinding(ActivityConferenceBinding::inflate)
override fun onCreate(savedInstanceState: Bundle?) { override fun onCreate(savedInstanceState: Bundle?) {
isMaterialActivity = true isMaterialActivity = true
super.onCreate(savedInstanceState) super.onCreate(savedInstanceState)
setContentView(R.layout.activity_conference) setContentView(binding.root)
updateMaterialActivityViews(conference_coordinator, conference_list, useTransparentNavigation = true, useTopSearchMenu = false) binding.apply {
setupMaterialScrollListener(conference_list, conference_toolbar) updateMaterialActivityViews(conferenceCoordinator, conferenceList, useTransparentNavigation = true, useTopSearchMenu = false)
conference_list.adapter = ConferenceCallsAdapter(this, conference_list, ArrayList(CallManager.getConferenceCalls())) {} setupMaterialScrollListener(conferenceList, conferenceToolbar)
conferenceList.adapter = ConferenceCallsAdapter(this@ConferenceActivity, conferenceList, ArrayList(CallManager.getConferenceCalls())) {}
}
} }
override fun onResume() { override fun onResume() {
super.onResume() super.onResume()
setupToolbar(conference_toolbar, NavigationIcon.Arrow) setupToolbar(binding.conferenceToolbar, NavigationIcon.Arrow)
} }
} }

View File

@ -26,17 +26,17 @@ import com.simplemobiletools.commons.helpers.*
import com.simplemobiletools.commons.models.contacts.Contact import com.simplemobiletools.commons.models.contacts.Contact
import com.simplemobiletools.dialer.R import com.simplemobiletools.dialer.R
import com.simplemobiletools.dialer.adapters.ContactsAdapter import com.simplemobiletools.dialer.adapters.ContactsAdapter
import com.simplemobiletools.dialer.databinding.ActivityDialpadBinding
import com.simplemobiletools.dialer.extensions.* import com.simplemobiletools.dialer.extensions.*
import com.simplemobiletools.dialer.helpers.DIALPAD_TONE_LENGTH_MS import com.simplemobiletools.dialer.helpers.DIALPAD_TONE_LENGTH_MS
import com.simplemobiletools.dialer.helpers.ToneGeneratorHelper import com.simplemobiletools.dialer.helpers.ToneGeneratorHelper
import com.simplemobiletools.dialer.models.SpeedDial import com.simplemobiletools.dialer.models.SpeedDial
import kotlinx.android.synthetic.main.activity_dialpad.*
import kotlinx.android.synthetic.main.activity_dialpad.dialpad_holder
import kotlinx.android.synthetic.main.dialpad.*
import java.util.* import java.util.*
import kotlin.math.roundToInt import kotlin.math.roundToInt
class DialpadActivity : SimpleActivity() { class DialpadActivity : SimpleActivity() {
private val binding by viewBinding(ActivityDialpadBinding::inflate)
private var allContacts = ArrayList<Contact>() private var allContacts = ArrayList<Contact>()
private var speedDialValues = ArrayList<SpeedDial>() private var speedDialValues = ArrayList<SpeedDial>()
private val russianCharsMap = HashMap<Char, Int>() private val russianCharsMap = HashMap<Char, Int>()
@ -49,48 +49,53 @@ class DialpadActivity : SimpleActivity() {
override fun onCreate(savedInstanceState: Bundle?) { override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState) super.onCreate(savedInstanceState)
setContentView(R.layout.activity_dialpad) setContentView(binding.root)
hasRussianLocale = Locale.getDefault().language == "ru" hasRussianLocale = Locale.getDefault().language == "ru"
updateMaterialActivityViews(dialpad_coordinator, dialpad_holder, useTransparentNavigation = true, useTopSearchMenu = false) binding.apply {
setupMaterialScrollListener(dialpad_list, dialpad_toolbar) updateMaterialActivityViews(dialpadCoordinator, dialpadHolder, useTransparentNavigation = true, useTopSearchMenu = false)
setupMaterialScrollListener(dialpadList, dialpadToolbar)
}
updateNavigationBarColor(getProperBackgroundColor()) updateNavigationBarColor(getProperBackgroundColor())
if (checkAppSideloading()) { if (checkAppSideloading()) {
return return
} }
if (config.hideDialpadNumbers) { binding.dialpadWrapper.apply {
dialpad_1_holder.isVisible = false if (config.hideDialpadNumbers) {
dialpad_2_holder.isVisible = false dialpad1Holder.isVisible = false
dialpad_3_holder.isVisible = false dialpad2Holder.isVisible = false
dialpad_4_holder.isVisible = false dialpad3Holder.isVisible = false
dialpad_5_holder.isVisible = false dialpad4Holder.isVisible = false
dialpad_6_holder.isVisible = false dialpad5Holder.isVisible = false
dialpad_7_holder.isVisible = false dialpad6Holder.isVisible = false
dialpad_8_holder.isVisible = false dialpad7Holder.isVisible = false
dialpad_9_holder.isVisible = false dialpad8Holder.isVisible = false
dialpad_plus_holder.isVisible = true dialpad9Holder.isVisible = false
dialpad_0_holder.visibility = View.INVISIBLE dialpadPlusHolder.isVisible = true
} dialpad0Holder.visibility = View.INVISIBLE
}
arrayOf( arrayOf(
dialpad_0_holder, dialpad0Holder,
dialpad_1_holder, dialpad1Holder,
dialpad_2_holder, dialpad2Holder,
dialpad_3_holder, dialpad3Holder,
dialpad_4_holder, dialpad4Holder,
dialpad_5_holder, dialpad5Holder,
dialpad_6_holder, dialpad6Holder,
dialpad_7_holder, dialpad7Holder,
dialpad_8_holder, dialpad8Holder,
dialpad_9_holder, dialpad9Holder,
dialpad_plus_holder, dialpadPlusHolder,
dialpad_asterisk_holder, dialpadAsteriskHolder,
dialpad_hashtag_holder dialpadHashtagHolder
).forEach { ).forEach {
it.background = ResourcesCompat.getDrawable(resources, R.drawable.pill_background, theme) it.background = ResourcesCompat.getDrawable(resources, R.drawable.pill_background, theme)
it.background?.alpha = LOWER_ALPHA_INT it.background?.alpha = LOWER_ALPHA_INT
}
} }
setupOptionsMenu() setupOptionsMenu()
@ -99,46 +104,50 @@ class DialpadActivity : SimpleActivity() {
toneGeneratorHelper = ToneGeneratorHelper(this, DIALPAD_TONE_LENGTH_MS) toneGeneratorHelper = ToneGeneratorHelper(this, DIALPAD_TONE_LENGTH_MS)
if (hasRussianLocale) { binding.dialpadWrapper.apply {
initRussianChars() if (hasRussianLocale) {
dialpad_2_letters.append("\nАБВГ") initRussianChars()
dialpad_3_letters.append("\nДЕЁЖЗ") dialpad2Letters.append("\nАБВГ")
dialpad_4_letters.append("\nИЙКЛ") dialpad3Letters.append("\nДЕЁЖЗ")
dialpad_5_letters.append("\nМНОП") dialpad4Letters.append("\nИЙКЛ")
dialpad_6_letters.append("\nРСТУ") dialpad5Letters.append("\nМНОП")
dialpad_7_letters.append("\nФХЦЧ") dialpad6Letters.append("\nРСТУ")
dialpad_8_letters.append("\nШЩЪЫ") dialpad7Letters.append("\nФХЦЧ")
dialpad_9_letters.append("\nЬЭЮЯ") dialpad8Letters.append("\nШЩЪЫ")
dialpad9Letters.append("\nЬЭЮЯ")
val fontSize = resources.getDimension(R.dimen.small_text_size) val fontSize = resources.getDimension(R.dimen.small_text_size)
arrayOf( arrayOf(
dialpad_2_letters, dialpad_3_letters, dialpad_4_letters, dialpad_5_letters, dialpad_6_letters, dialpad_7_letters, dialpad_8_letters, dialpad2Letters, dialpad3Letters, dialpad4Letters, dialpad5Letters, dialpad6Letters, dialpad7Letters, dialpad8Letters,
dialpad_9_letters dialpad9Letters
).forEach { ).forEach {
it.setTextSize(TypedValue.COMPLEX_UNIT_PX, fontSize) it.setTextSize(TypedValue.COMPLEX_UNIT_PX, fontSize)
}
} }
setupCharClick(dialpad1Holder, '1')
setupCharClick(dialpad2Holder, '2')
setupCharClick(dialpad3Holder, '3')
setupCharClick(dialpad4Holder, '4')
setupCharClick(dialpad5Holder, '5')
setupCharClick(dialpad6Holder, '6')
setupCharClick(dialpad7Holder, '7')
setupCharClick(dialpad8Holder, '8')
setupCharClick(dialpad9Holder, '9')
setupCharClick(dialpad0Holder, '0')
setupCharClick(dialpadPlusHolder, '+', longClickable = false)
setupCharClick(dialpadAsteriskHolder, '*', longClickable = false)
setupCharClick(dialpadHashtagHolder, '#', longClickable = false)
} }
setupCharClick(dialpad_1_holder, '1') binding.apply {
setupCharClick(dialpad_2_holder, '2') dialpadClearChar.setOnClickListener { clearChar(it) }
setupCharClick(dialpad_3_holder, '3') dialpadClearChar.setOnLongClickListener { clearInput(); true }
setupCharClick(dialpad_4_holder, '4') dialpadCallButton.setOnClickListener { initCall(dialpadInput.value, 0) }
setupCharClick(dialpad_5_holder, '5') dialpadInput.onTextChangeListener { dialpadValueChanged(it) }
setupCharClick(dialpad_6_holder, '6') dialpadInput.requestFocus()
setupCharClick(dialpad_7_holder, '7') dialpadInput.disableKeyboard()
setupCharClick(dialpad_8_holder, '8') }
setupCharClick(dialpad_9_holder, '9')
setupCharClick(dialpad_0_holder, '0')
setupCharClick(dialpad_plus_holder, '+', longClickable = false)
setupCharClick(dialpad_asterisk_holder, '*', longClickable = false)
setupCharClick(dialpad_hashtag_holder, '#', longClickable = false)
dialpad_clear_char.setOnClickListener { clearChar(it) }
dialpad_clear_char.setOnLongClickListener { clearInput(); true }
dialpad_call_button.setOnClickListener { initCall(dialpad_input.value, 0) }
dialpad_input.onTextChangeListener { dialpadValueChanged(it) }
dialpad_input.requestFocus()
dialpad_input.disableKeyboard()
ContactsHelper(this).getContacts(showOnlyContactsWithNumbers = true) { allContacts -> ContactsHelper(this).getContacts(showOnlyContactsWithNumbers = true) { allContacts ->
gotContacts(allContacts) gotContacts(allContacts)
@ -147,11 +156,13 @@ class DialpadActivity : SimpleActivity() {
val properPrimaryColor = getProperPrimaryColor() val properPrimaryColor = getProperPrimaryColor()
val callIconId = if (areMultipleSIMsAvailable()) { val callIconId = if (areMultipleSIMsAvailable()) {
val callIcon = resources.getColoredDrawableWithColor(R.drawable.ic_phone_two_vector, properPrimaryColor.getContrastColor()) val callIcon = resources.getColoredDrawableWithColor(R.drawable.ic_phone_two_vector, properPrimaryColor.getContrastColor())
dialpad_call_two_button.setImageDrawable(callIcon) binding.apply {
dialpad_call_two_button.background.applyColorFilter(properPrimaryColor) dialpadCallTwoButton.setImageDrawable(callIcon)
dialpad_call_two_button.beVisible() dialpadCallTwoButton.background.applyColorFilter(properPrimaryColor)
dialpad_call_two_button.setOnClickListener { dialpadCallTwoButton.beVisible()
initCall(dialpad_input.value, 1) dialpadCallTwoButton.setOnClickListener {
initCall(dialpadInput.value, 1)
}
} }
R.drawable.ic_phone_one_vector R.drawable.ic_phone_one_vector
@ -159,27 +170,29 @@ class DialpadActivity : SimpleActivity() {
R.drawable.ic_phone_vector R.drawable.ic_phone_vector
} }
val callIcon = resources.getColoredDrawableWithColor(callIconId, properPrimaryColor.getContrastColor()) binding.apply {
dialpad_call_button.setImageDrawable(callIcon) val callIcon = resources.getColoredDrawableWithColor(callIconId, properPrimaryColor.getContrastColor())
dialpad_call_button.background.applyColorFilter(properPrimaryColor) dialpadCallButton.setImageDrawable(callIcon)
dialpadCallButton.background.applyColorFilter(properPrimaryColor)
letter_fastscroller.textColor = getProperTextColor().getColorStateList() letterFastscroller.textColor = getProperTextColor().getColorStateList()
letter_fastscroller.pressedTextColor = properPrimaryColor letterFastscroller.pressedTextColor = properPrimaryColor
letter_fastscroller_thumb.setupWithFastScroller(letter_fastscroller) letterFastscrollerThumb.setupWithFastScroller(letterFastscroller)
letter_fastscroller_thumb.textColor = properPrimaryColor.getContrastColor() letterFastscrollerThumb.textColor = properPrimaryColor.getContrastColor()
letter_fastscroller_thumb.thumbColor = properPrimaryColor.getColorStateList() letterFastscrollerThumb.thumbColor = properPrimaryColor.getColorStateList()
}
} }
override fun onResume() { override fun onResume() {
super.onResume() super.onResume()
updateTextColors(dialpad_holder) updateTextColors(binding.dialpadHolder)
dialpad_clear_char.applyColorFilter(getProperTextColor()) binding.dialpadClearChar.applyColorFilter(getProperTextColor())
updateNavigationBarColor(getProperBackgroundColor()) updateNavigationBarColor(getProperBackgroundColor())
setupToolbar(dialpad_toolbar, NavigationIcon.Arrow) setupToolbar(binding.dialpadToolbar, NavigationIcon.Arrow)
} }
private fun setupOptionsMenu() { private fun setupOptionsMenu() {
dialpad_toolbar.setOnMenuItemClickListener { menuItem -> binding.dialpadToolbar.setOnMenuItemClickListener { menuItem ->
when (menuItem.itemId) { when (menuItem.itemId) {
R.id.add_number_to_contact -> addNumberToContact() R.id.add_number_to_contact -> addNumberToContact()
else -> return@setOnMenuItemClickListener false else -> return@setOnMenuItemClickListener false
@ -191,8 +204,8 @@ class DialpadActivity : SimpleActivity() {
private fun checkDialIntent(): Boolean { private fun checkDialIntent(): Boolean {
return if ((intent.action == Intent.ACTION_DIAL || intent.action == Intent.ACTION_VIEW) && intent.data != null && intent.dataString?.contains("tel:") == true) { return if ((intent.action == Intent.ACTION_DIAL || intent.action == Intent.ACTION_VIEW) && intent.data != null && intent.dataString?.contains("tel:") == true) {
val number = Uri.decode(intent.dataString).substringAfter("tel:") val number = Uri.decode(intent.dataString).substringAfter("tel:")
dialpad_input.setText(number) binding.dialpadInput.setText(number)
dialpad_input.setSelection(number.length) binding.dialpadInput.setSelection(number.length)
true true
} else { } else {
false false
@ -203,23 +216,23 @@ class DialpadActivity : SimpleActivity() {
Intent().apply { Intent().apply {
action = Intent.ACTION_INSERT_OR_EDIT action = Intent.ACTION_INSERT_OR_EDIT
type = "vnd.android.cursor.item/contact" type = "vnd.android.cursor.item/contact"
putExtra(KEY_PHONE, dialpad_input.value) putExtra(KEY_PHONE, binding.dialpadInput.value)
launchActivityIntent(this) launchActivityIntent(this)
} }
} }
private fun dialpadPressed(char: Char, view: View?) { private fun dialpadPressed(char: Char, view: View?) {
dialpad_input.addCharacter(char) binding.dialpadInput.addCharacter(char)
maybePerformDialpadHapticFeedback(view) maybePerformDialpadHapticFeedback(view)
} }
private fun clearChar(view: View) { private fun clearChar(view: View) {
dialpad_input.dispatchKeyEvent(dialpad_input.getKeyEvent(KeyEvent.KEYCODE_DEL)) binding.dialpadInput.dispatchKeyEvent(binding.dialpadInput.getKeyEvent(KeyEvent.KEYCODE_DEL))
maybePerformDialpadHapticFeedback(view) maybePerformDialpadHapticFeedback(view)
} }
private fun clearInput() { private fun clearInput() {
dialpad_input.setText("") binding.dialpadInput.setText("")
} }
private fun gotContacts(newContacts: ArrayList<Contact>) { private fun gotContacts(newContacts: ArrayList<Contact>) {
@ -232,7 +245,7 @@ class DialpadActivity : SimpleActivity() {
} }
runOnUiThread { runOnUiThread {
if (!checkDialIntent() && dialpad_input.value.isEmpty()) { if (!checkDialIntent() && binding.dialpadInput.value.isEmpty()) {
dialpadValueChanged("") dialpadValueChanged("")
} }
} }
@ -256,7 +269,7 @@ class DialpadActivity : SimpleActivity() {
return return
} }
(dialpad_list.adapter as? ContactsAdapter)?.finishActMode() (binding.dialpadList.adapter as? ContactsAdapter)?.finishActMode()
val filtered = allContacts.filter { val filtered = allContacts.filter {
var convertedName = PhoneNumberUtils.convertKeypadLettersToDigits(it.name.normalizeString()) var convertedName = PhoneNumberUtils.convertKeypadLettersToDigits(it.name.normalizeString())
@ -275,7 +288,7 @@ class DialpadActivity : SimpleActivity() {
!it.doesContainPhoneNumber(text) !it.doesContainPhoneNumber(text)
}).toMutableList() as ArrayList<Contact> }).toMutableList() as ArrayList<Contact>
letter_fastscroller.setupWithRecyclerView(dialpad_list, { position -> binding.letterFastscroller.setupWithRecyclerView(binding.dialpadList, { position ->
try { try {
val name = filtered[position].getNameToDisplay() val name = filtered[position].getNameToDisplay()
val character = if (name.isNotEmpty()) name.substring(0, 1) else "" val character = if (name.isNotEmpty()) name.substring(0, 1) else ""
@ -288,7 +301,7 @@ class DialpadActivity : SimpleActivity() {
ContactsAdapter( ContactsAdapter(
activity = this, activity = this,
contacts = filtered, contacts = filtered,
recyclerView = dialpad_list, recyclerView = binding.dialpadList,
highlightText = text highlightText = text
) { ) {
val contact = it as Contact val contact = it as Contact
@ -300,21 +313,21 @@ class DialpadActivity : SimpleActivity() {
startCallIntent(contact.getPrimaryNumber() ?: return@ContactsAdapter) startCallIntent(contact.getPrimaryNumber() ?: return@ContactsAdapter)
} }
}.apply { }.apply {
dialpad_list.adapter = this binding.dialpadList.adapter = this
} }
dialpad_placeholder.beVisibleIf(filtered.isEmpty()) binding.dialpadPlaceholder.beVisibleIf(filtered.isEmpty())
dialpad_list.beVisibleIf(filtered.isNotEmpty()) binding.dialpadList.beVisibleIf(filtered.isNotEmpty())
} }
override fun onActivityResult(requestCode: Int, resultCode: Int, resultData: Intent?) { override fun onActivityResult(requestCode: Int, resultCode: Int, resultData: Intent?) {
super.onActivityResult(requestCode, resultCode, resultData) super.onActivityResult(requestCode, resultCode, resultData)
if (requestCode == REQUEST_CODE_SET_DEFAULT_DIALER && isDefaultDialer()) { if (requestCode == REQUEST_CODE_SET_DEFAULT_DIALER && isDefaultDialer()) {
dialpadValueChanged(dialpad_input.value) dialpadValueChanged(binding.dialpadInput.value)
} }
} }
private fun initCall(number: String = dialpad_input.value, handleIndex: Int) { private fun initCall(number: String = binding.dialpadInput.value, handleIndex: Int) {
if (number.isNotEmpty()) { if (number.isNotEmpty()) {
if (handleIndex != -1 && areMultipleSIMsAvailable()) { if (handleIndex != -1 && areMultipleSIMsAvailable()) {
if (config.showCallConfirmation) { if (config.showCallConfirmation) {
@ -337,7 +350,7 @@ class DialpadActivity : SimpleActivity() {
} }
private fun speedDial(id: Int): Boolean { private fun speedDial(id: Int): Boolean {
if (dialpad_input.value.length == 1) { if (binding.dialpadInput.value.length == 1) {
val speedDial = speedDialValues.firstOrNull { it.id == id } val speedDial = speedDialValues.firstOrNull { it.id == id }
if (speedDial?.isValid() == true) { if (speedDial?.isValid() == true) {
initCall(speedDial.number, -1) initCall(speedDial.number, -1)

View File

@ -28,20 +28,21 @@ import com.simplemobiletools.commons.models.contacts.Contact
import com.simplemobiletools.dialer.BuildConfig import com.simplemobiletools.dialer.BuildConfig
import com.simplemobiletools.dialer.R import com.simplemobiletools.dialer.R
import com.simplemobiletools.dialer.adapters.ViewPagerAdapter import com.simplemobiletools.dialer.adapters.ViewPagerAdapter
import com.simplemobiletools.dialer.databinding.ActivityMainBinding
import com.simplemobiletools.dialer.dialogs.ChangeSortingDialog import com.simplemobiletools.dialer.dialogs.ChangeSortingDialog
import com.simplemobiletools.dialer.dialogs.FilterContactSourcesDialog import com.simplemobiletools.dialer.dialogs.FilterContactSourcesDialog
import com.simplemobiletools.dialer.extensions.config import com.simplemobiletools.dialer.extensions.config
import com.simplemobiletools.dialer.extensions.launchCreateNewContactIntent import com.simplemobiletools.dialer.extensions.launchCreateNewContactIntent
import com.simplemobiletools.dialer.fragments.ContactsFragment
import com.simplemobiletools.dialer.fragments.FavoritesFragment import com.simplemobiletools.dialer.fragments.FavoritesFragment
import com.simplemobiletools.dialer.fragments.MyViewPagerFragment import com.simplemobiletools.dialer.fragments.MyViewPagerFragment
import com.simplemobiletools.dialer.fragments.RecentsFragment
import com.simplemobiletools.dialer.helpers.* import com.simplemobiletools.dialer.helpers.*
import kotlinx.android.synthetic.main.activity_main.*
import kotlinx.android.synthetic.main.fragment_contacts.*
import kotlinx.android.synthetic.main.fragment_favorites.*
import kotlinx.android.synthetic.main.fragment_recents.*
import me.grantland.widget.AutofitHelper import me.grantland.widget.AutofitHelper
class MainActivity : SimpleActivity() { class MainActivity : SimpleActivity() {
private val binding by viewBinding(ActivityMainBinding::inflate)
private var launchedDialer = false private var launchedDialer = false
private var storedShowTabs = 0 private var storedShowTabs = 0
private var storedFontSize = 0 private var storedFontSize = 0
@ -51,11 +52,11 @@ class MainActivity : SimpleActivity() {
override fun onCreate(savedInstanceState: Bundle?) { override fun onCreate(savedInstanceState: Bundle?) {
isMaterialActivity = true isMaterialActivity = true
super.onCreate(savedInstanceState) super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main) setContentView(binding.root)
appLaunched(BuildConfig.APPLICATION_ID) appLaunched(BuildConfig.APPLICATION_ID)
setupOptionsMenu() setupOptionsMenu()
refreshMenuItems() refreshMenuItems()
updateMaterialActivityViews(main_coordinator, main_holder, useTransparentNavigation = false, useTopSearchMenu = true) updateMaterialActivityViews(binding.mainCoordinator, binding.mainHolder, useTransparentNavigation = false, useTopSearchMenu = true)
launchedDialer = savedInstanceState?.getBoolean(OPEN_DIAL_PAD_AT_LAUNCH) ?: false launchedDialer = savedInstanceState?.getBoolean(OPEN_DIAL_PAD_AT_LAUNCH) ?: false
@ -63,7 +64,7 @@ class MainActivity : SimpleActivity() {
checkContactPermissions() checkContactPermissions()
if (!config.wasOverlaySnackbarConfirmed && !Settings.canDrawOverlays(this)) { if (!config.wasOverlaySnackbarConfirmed && !Settings.canDrawOverlays(this)) {
val snackbar = Snackbar.make(main_holder, R.string.allow_displaying_over_other_apps, Snackbar.LENGTH_INDEFINITE).setAction(R.string.ok) { val snackbar = Snackbar.make(binding.mainHolder, R.string.allow_displaying_over_other_apps, Snackbar.LENGTH_INDEFINITE).setAction(R.string.ok) {
config.wasOverlaySnackbarConfirmed = true config.wasOverlaySnackbarConfirmed = true
startActivity(Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION)) startActivity(Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION))
} }
@ -102,9 +103,9 @@ class MainActivity : SimpleActivity() {
updateMenuColors() updateMenuColors()
val properPrimaryColor = getProperPrimaryColor() val properPrimaryColor = getProperPrimaryColor()
val dialpadIcon = resources.getColoredDrawableWithColor(R.drawable.ic_dialpad_vector, properPrimaryColor.getContrastColor()) val dialpadIcon = resources.getColoredDrawableWithColor(R.drawable.ic_dialpad_vector, properPrimaryColor.getContrastColor())
main_dialpad_button.setImageDrawable(dialpadIcon) binding.mainDialpadButton.setImageDrawable(dialpadIcon)
updateTextColors(main_holder) updateTextColors(binding.mainHolder)
setupTabColors() setupTabColors()
getAllFragments().forEach { getAllFragments().forEach {
@ -113,12 +114,12 @@ class MainActivity : SimpleActivity() {
val configStartNameWithSurname = config.startNameWithSurname val configStartNameWithSurname = config.startNameWithSurname
if (storedStartNameWithSurname != configStartNameWithSurname) { if (storedStartNameWithSurname != configStartNameWithSurname) {
contacts_fragment?.startNameWithSurnameChanged(configStartNameWithSurname) getContactsFragment()?.startNameWithSurnameChanged(configStartNameWithSurname)
favorites_fragment?.startNameWithSurnameChanged(configStartNameWithSurname) getFavoritesFragment()?.startNameWithSurnameChanged(configStartNameWithSurname)
storedStartNameWithSurname = config.startNameWithSurname storedStartNameWithSurname = config.startNameWithSurname
} }
if (!main_menu.isSearchOpen) { if (!binding.mainMenu.isSearchOpen) {
refreshItems(true) refreshItems(true)
} }
@ -131,7 +132,7 @@ class MainActivity : SimpleActivity() {
checkShortcuts() checkShortcuts()
Handler().postDelayed({ Handler().postDelayed({
recents_fragment?.refreshItems() getRecentsFragment()?.refreshItems()
}, 2000) }, 2000)
} }
@ -139,7 +140,7 @@ class MainActivity : SimpleActivity() {
super.onPause() super.onPause()
storedShowTabs = config.showTabs storedShowTabs = config.showTabs
storedStartNameWithSurname = config.startNameWithSurname storedStartNameWithSurname = config.startNameWithSurname
config.lastUsedViewPagerPage = view_pager.currentItem config.lastUsedViewPagerPage = binding.viewPager.currentItem
} }
override fun onActivityResult(requestCode: Int, resultCode: Int, resultData: Intent?) { override fun onActivityResult(requestCode: Int, resultCode: Int, resultData: Intent?) {
@ -165,8 +166,8 @@ class MainActivity : SimpleActivity() {
} }
override fun onBackPressed() { override fun onBackPressed() {
if (main_menu.isSearchOpen) { if (binding.mainMenu.isSearchOpen) {
main_menu.closeSearch() binding.mainMenu.closeSearch()
} else { } else {
super.onBackPressed() super.onBackPressed()
} }
@ -174,45 +175,47 @@ class MainActivity : SimpleActivity() {
private fun refreshMenuItems() { private fun refreshMenuItems() {
val currentFragment = getCurrentFragment() val currentFragment = getCurrentFragment()
main_menu.getToolbar().menu.apply { binding.mainMenu.getToolbar().menu.apply {
findItem(R.id.clear_call_history).isVisible = currentFragment == recents_fragment findItem(R.id.clear_call_history).isVisible = currentFragment == getRecentsFragment()
findItem(R.id.sort).isVisible = currentFragment != recents_fragment findItem(R.id.sort).isVisible = currentFragment != getRecentsFragment()
findItem(R.id.create_new_contact).isVisible = currentFragment == contacts_fragment findItem(R.id.create_new_contact).isVisible = currentFragment == getContactsFragment()
findItem(R.id.change_view_type).isVisible = currentFragment == favorites_fragment findItem(R.id.change_view_type).isVisible = currentFragment == getFavoritesFragment()
findItem(R.id.column_count).isVisible = currentFragment == favorites_fragment && config.viewType == VIEW_TYPE_GRID findItem(R.id.column_count).isVisible = currentFragment == getFavoritesFragment() && config.viewType == VIEW_TYPE_GRID
findItem(R.id.more_apps_from_us).isVisible = !resources.getBoolean(R.bool.hide_google_relations) findItem(R.id.more_apps_from_us).isVisible = !resources.getBoolean(R.bool.hide_google_relations)
} }
} }
private fun setupOptionsMenu() { private fun setupOptionsMenu() {
main_menu.getToolbar().inflateMenu(R.menu.menu) binding.mainMenu.apply {
main_menu.toggleHideOnScroll(false) getToolbar().inflateMenu(R.menu.menu)
main_menu.setupMenu() toggleHideOnScroll(false)
setupMenu()
main_menu.onSearchClosedListener = { onSearchClosedListener = {
getAllFragments().forEach { getAllFragments().forEach {
it?.onSearchQueryChanged("") it?.onSearchQueryChanged("")
}
} }
}
main_menu.onSearchTextChangedListener = { text -> onSearchTextChangedListener = { text ->
getCurrentFragment()?.onSearchQueryChanged(text) getCurrentFragment()?.onSearchQueryChanged(text)
} }
main_menu.getToolbar().setOnMenuItemClickListener { menuItem -> getToolbar().setOnMenuItemClickListener { menuItem ->
when (menuItem.itemId) { when (menuItem.itemId) {
R.id.clear_call_history -> clearCallHistory() R.id.clear_call_history -> clearCallHistory()
R.id.create_new_contact -> launchCreateNewContactIntent() R.id.create_new_contact -> launchCreateNewContactIntent()
R.id.sort -> showSortingDialog(showCustomSorting = getCurrentFragment() is FavoritesFragment) R.id.sort -> showSortingDialog(showCustomSorting = getCurrentFragment() is FavoritesFragment)
R.id.filter -> showFilterDialog() R.id.filter -> showFilterDialog()
R.id.more_apps_from_us -> launchMoreAppsFromUsIntent() R.id.more_apps_from_us -> launchMoreAppsFromUsIntent()
R.id.settings -> launchSettings() R.id.settings -> launchSettings()
R.id.change_view_type -> changeViewType() R.id.change_view_type -> changeViewType()
R.id.column_count -> changeColumnCount() R.id.column_count -> changeColumnCount()
R.id.about -> launchAbout() R.id.about -> launchAbout()
else -> return@setOnMenuItemClickListener false else -> return@setOnMenuItemClickListener false
}
return@setOnMenuItemClickListener true
} }
return@setOnMenuItemClickListener true
} }
} }
@ -227,7 +230,7 @@ class MainActivity : SimpleActivity() {
val newColumnCount = it as Int val newColumnCount = it as Int
if (currentColumnCount != newColumnCount) { if (currentColumnCount != newColumnCount) {
config.contactsGridColumnCount = newColumnCount config.contactsGridColumnCount = newColumnCount
favorites_fragment?.columnCountChanged() getFavoritesFragment()?.columnCountChanged()
} }
} }
} }
@ -235,13 +238,13 @@ class MainActivity : SimpleActivity() {
private fun changeViewType() { private fun changeViewType() {
ChangeViewTypeDialog(this) { ChangeViewTypeDialog(this) {
refreshMenuItems() refreshMenuItems()
favorites_fragment?.refreshItems() getFavoritesFragment()?.refreshItems()
} }
} }
private fun updateMenuColors() { private fun updateMenuColors() {
updateStatusbarColor(getProperBackgroundColor()) updateStatusbarColor(getProperBackgroundColor())
main_menu.updateColors() binding.mainMenu.updateColors()
} }
private fun checkContactPermissions() { private fun checkContactPermissions() {
@ -255,7 +258,7 @@ class MainActivity : SimpleActivity() {
ConfirmationDialog(this, confirmationText) { ConfirmationDialog(this, confirmationText) {
RecentsHelper(this).removeAllRecentCalls(this) { RecentsHelper(this).removeAllRecentCalls(this) {
runOnUiThread { runOnUiThread {
recents_fragment?.refreshItems() getRecentsFragment()?.refreshItems()
} }
} }
} }
@ -293,20 +296,20 @@ class MainActivity : SimpleActivity() {
} }
private fun setupTabColors() { private fun setupTabColors() {
val activeView = main_tabs_holder.getTabAt(view_pager.currentItem)?.customView val activeView = binding.mainTabsHolder.getTabAt(binding.viewPager.currentItem)?.customView
updateBottomTabItemColors(activeView, true, getSelectedTabDrawableIds()[view_pager.currentItem]) updateBottomTabItemColors(activeView, true, getSelectedTabDrawableIds()[binding.viewPager.currentItem])
getInactiveTabIndexes(view_pager.currentItem).forEach { index -> getInactiveTabIndexes(binding.viewPager.currentItem).forEach { index ->
val inactiveView = main_tabs_holder.getTabAt(index)?.customView val inactiveView = binding.mainTabsHolder.getTabAt(index)?.customView
updateBottomTabItemColors(inactiveView, false, getDeselectedTabDrawableIds()[index]) updateBottomTabItemColors(inactiveView, false, getDeselectedTabDrawableIds()[index])
} }
val bottomBarColor = getBottomNavigationBackgroundColor() val bottomBarColor = getBottomNavigationBackgroundColor()
main_tabs_holder.setBackgroundColor(bottomBarColor) binding.mainTabsHolder.setBackgroundColor(bottomBarColor)
updateNavigationBarColor(bottomBarColor) updateNavigationBarColor(bottomBarColor)
} }
private fun getInactiveTabIndexes(activeIndex: Int) = (0 until main_tabs_holder.tabCount).filter { it != activeIndex } private fun getInactiveTabIndexes(activeIndex: Int) = (0 until binding.mainTabsHolder.tabCount).filter { it != activeIndex }
private fun getSelectedTabDrawableIds(): List<Int> { private fun getSelectedTabDrawableIds(): List<Int> {
val showTabs = config.showTabs val showTabs = config.showTabs
@ -347,14 +350,14 @@ class MainActivity : SimpleActivity() {
} }
private fun initFragments() { private fun initFragments() {
view_pager.offscreenPageLimit = 2 binding.viewPager.offscreenPageLimit = 2
view_pager.addOnPageChangeListener(object : ViewPager.OnPageChangeListener { binding.viewPager.addOnPageChangeListener(object : ViewPager.OnPageChangeListener {
override fun onPageScrollStateChanged(state: Int) {} override fun onPageScrollStateChanged(state: Int) {}
override fun onPageScrolled(position: Int, positionOffset: Float, positionOffsetPixels: Int) {} override fun onPageScrolled(position: Int, positionOffset: Float, positionOffsetPixels: Int) {}
override fun onPageSelected(position: Int) { override fun onPageSelected(position: Int) {
main_tabs_holder.getTabAt(position)?.select() binding.mainTabsHolder.getTabAt(position)?.select()
getAllFragments().forEach { getAllFragments().forEach {
it?.finishActMode() it?.finishActMode()
} }
@ -363,29 +366,29 @@ class MainActivity : SimpleActivity() {
}) })
// selecting the proper tab sometimes glitches, add an extra selector to make sure we have it right // selecting the proper tab sometimes glitches, add an extra selector to make sure we have it right
main_tabs_holder.onGlobalLayout { binding.mainTabsHolder.onGlobalLayout {
Handler().postDelayed({ Handler().postDelayed({
var wantedTab = getDefaultTab() var wantedTab = getDefaultTab()
// open the Recents tab if we got here by clicking a missed call notification // open the Recents tab if we got here by clicking a missed call notification
if (intent.action == Intent.ACTION_VIEW && config.showTabs and TAB_CALL_HISTORY > 0) { if (intent.action == Intent.ACTION_VIEW && config.showTabs and TAB_CALL_HISTORY > 0) {
wantedTab = main_tabs_holder.tabCount - 1 wantedTab = binding.mainTabsHolder.tabCount - 1
ensureBackgroundThread { ensureBackgroundThread {
clearMissedCalls() clearMissedCalls()
} }
} }
main_tabs_holder.getTabAt(wantedTab)?.select() binding.mainTabsHolder.getTabAt(wantedTab)?.select()
refreshMenuItems() refreshMenuItems()
}, 100L) }, 100L)
} }
main_dialpad_button.setOnClickListener { binding.mainDialpadButton.setOnClickListener {
launchDialpad() launchDialpad()
} }
view_pager.onGlobalLayout { binding.viewPager.onGlobalLayout {
refreshMenuItems() refreshMenuItems()
} }
@ -396,31 +399,31 @@ class MainActivity : SimpleActivity() {
} }
private fun setupTabs() { private fun setupTabs() {
view_pager.adapter = null binding.viewPager.adapter = null
main_tabs_holder.removeAllTabs() binding.mainTabsHolder.removeAllTabs()
tabsList.forEachIndexed { index, value -> tabsList.forEachIndexed { index, value ->
if (config.showTabs and value != 0) { if (config.showTabs and value != 0) {
main_tabs_holder.newTab().setCustomView(R.layout.bottom_tablayout_item).apply { binding.mainTabsHolder.newTab().setCustomView(R.layout.bottom_tablayout_item).apply {
customView?.findViewById<ImageView>(R.id.tab_item_icon)?.setImageDrawable(getTabIcon(index)) customView?.findViewById<ImageView>(R.id.tab_item_icon)?.setImageDrawable(getTabIcon(index))
customView?.findViewById<TextView>(R.id.tab_item_label)?.text = getTabLabel(index) customView?.findViewById<TextView>(R.id.tab_item_label)?.text = getTabLabel(index)
AutofitHelper.create(customView?.findViewById(R.id.tab_item_label)) AutofitHelper.create(customView?.findViewById(R.id.tab_item_label))
main_tabs_holder.addTab(this) binding.mainTabsHolder.addTab(this)
} }
} }
} }
main_tabs_holder.onTabSelectionChanged( binding.mainTabsHolder.onTabSelectionChanged(
tabUnselectedAction = { tabUnselectedAction = {
updateBottomTabItemColors(it.customView, false, getDeselectedTabDrawableIds()[it.position]) updateBottomTabItemColors(it.customView, false, getDeselectedTabDrawableIds()[it.position])
}, },
tabSelectedAction = { tabSelectedAction = {
main_menu.closeSearch() binding.mainMenu.closeSearch()
view_pager.currentItem = it.position binding.viewPager.currentItem = it.position
updateBottomTabItemColors(it.customView, true, getSelectedTabDrawableIds()[it.position]) updateBottomTabItemColors(it.customView, true, getSelectedTabDrawableIds()[it.position])
} }
) )
main_tabs_holder.beGoneIf(main_tabs_holder.tabCount == 1) binding.mainTabsHolder.beGoneIf(binding.mainTabsHolder.tabCount == 1)
storedShowTabs = config.showTabs storedShowTabs = config.showTabs
storedStartNameWithSurname = config.startNameWithSurname storedStartNameWithSurname = config.startNameWithSurname
} }
@ -450,14 +453,16 @@ class MainActivity : SimpleActivity() {
return return
} }
if (view_pager.adapter == null) { binding.apply {
view_pager.adapter = ViewPagerAdapter(this) if (viewPager.adapter == null) {
view_pager.currentItem = if (openLastTab) config.lastUsedViewPagerPage else getDefaultTab() viewPager.adapter = ViewPagerAdapter(this@MainActivity)
view_pager.onGlobalLayout { viewPager.currentItem = if (openLastTab) config.lastUsedViewPagerPage else getDefaultTab()
viewPager.onGlobalLayout {
refreshFragments()
}
} else {
refreshFragments() refreshFragments()
} }
} else {
refreshFragments()
} }
} }
@ -468,36 +473,42 @@ class MainActivity : SimpleActivity() {
} }
fun refreshFragments() { fun refreshFragments() {
contacts_fragment?.refreshItems() getContactsFragment()?.refreshItems()
favorites_fragment?.refreshItems() getFavoritesFragment()?.refreshItems()
recents_fragment?.refreshItems() getRecentsFragment()?.refreshItems()
} }
private fun getAllFragments(): ArrayList<MyViewPagerFragment?> { private fun getAllFragments(): ArrayList<MyViewPagerFragment<*>?> {
val showTabs = config.showTabs val showTabs = config.showTabs
val fragments = arrayListOf<MyViewPagerFragment?>() val fragments = arrayListOf<MyViewPagerFragment<*>?>()
if (showTabs and TAB_CONTACTS > 0) { if (showTabs and TAB_CONTACTS > 0) {
fragments.add(contacts_fragment) fragments.add(getContactsFragment())
} }
if (showTabs and TAB_FAVORITES > 0) { if (showTabs and TAB_FAVORITES > 0) {
fragments.add(favorites_fragment) fragments.add(getFavoritesFragment())
} }
if (showTabs and TAB_CALL_HISTORY > 0) { if (showTabs and TAB_CALL_HISTORY > 0) {
fragments.add(recents_fragment) fragments.add(getRecentsFragment())
} }
return fragments return fragments
} }
private fun getCurrentFragment(): MyViewPagerFragment? = getAllFragments().getOrNull(view_pager.currentItem) private fun getCurrentFragment(): MyViewPagerFragment<*>? = getAllFragments().getOrNull(binding.viewPager.currentItem)
private fun getContactsFragment(): ContactsFragment? = findViewById(R.id.contacts_fragment)
private fun getFavoritesFragment(): FavoritesFragment? = findViewById(R.id.favorites_fragment)
private fun getRecentsFragment(): RecentsFragment? = findViewById(R.id.recents_fragment)
private fun getDefaultTab(): Int { private fun getDefaultTab(): Int {
val showTabsMask = config.showTabs val showTabsMask = config.showTabs
return when (config.defaultTab) { return when (config.defaultTab) {
TAB_LAST_USED -> if (config.lastUsedViewPagerPage < main_tabs_holder.tabCount) config.lastUsedViewPagerPage else 0 TAB_LAST_USED -> if (config.lastUsedViewPagerPage < binding.mainTabsHolder.tabCount) config.lastUsedViewPagerPage else 0
TAB_CONTACTS -> 0 TAB_CONTACTS -> 0
TAB_FAVORITES -> if (showTabsMask and TAB_CONTACTS > 0) 1 else 0 TAB_FAVORITES -> if (showTabsMask and TAB_CONTACTS > 0) 1 else 0
else -> { else -> {
@ -556,15 +567,15 @@ class MainActivity : SimpleActivity() {
private fun showSortingDialog(showCustomSorting: Boolean) { private fun showSortingDialog(showCustomSorting: Boolean) {
ChangeSortingDialog(this, showCustomSorting) { ChangeSortingDialog(this, showCustomSorting) {
favorites_fragment?.refreshItems { getFavoritesFragment()?.refreshItems {
if (main_menu.isSearchOpen) { if (binding.mainMenu.isSearchOpen) {
getCurrentFragment()?.onSearchQueryChanged(main_menu.getCurrentQuery()) getCurrentFragment()?.onSearchQueryChanged(binding.mainMenu.getCurrentQuery())
} }
} }
contacts_fragment?.refreshItems { getContactsFragment()?.refreshItems {
if (main_menu.isSearchOpen) { if (binding.mainMenu.isSearchOpen) {
getCurrentFragment()?.onSearchQueryChanged(main_menu.getCurrentQuery()) getCurrentFragment()?.onSearchQueryChanged(binding.mainMenu.getCurrentQuery())
} }
} }
} }
@ -572,21 +583,21 @@ class MainActivity : SimpleActivity() {
private fun showFilterDialog() { private fun showFilterDialog() {
FilterContactSourcesDialog(this) { FilterContactSourcesDialog(this) {
favorites_fragment?.refreshItems { getFavoritesFragment()?.refreshItems {
if (main_menu.isSearchOpen) { if (binding.mainMenu.isSearchOpen) {
getCurrentFragment()?.onSearchQueryChanged(main_menu.getCurrentQuery()) getCurrentFragment()?.onSearchQueryChanged(binding.mainMenu.getCurrentQuery())
} }
} }
contacts_fragment?.refreshItems { getContactsFragment()?.refreshItems {
if (main_menu.isSearchOpen) { if (binding.mainMenu.isSearchOpen) {
getCurrentFragment()?.onSearchQueryChanged(main_menu.getCurrentQuery()) getCurrentFragment()?.onSearchQueryChanged(binding.mainMenu.getCurrentQuery())
} }
} }
recents_fragment?.refreshItems { getRecentsFragment()?.refreshItems {
if (main_menu.isSearchOpen) { if (binding.mainMenu.isSearchOpen) {
getCurrentFragment()?.onSearchQueryChanged(main_menu.getCurrentQuery()) getCurrentFragment()?.onSearchQueryChanged(binding.mainMenu.getCurrentQuery())
} }
} }
} }

View File

@ -5,31 +5,36 @@ import com.google.gson.Gson
import com.simplemobiletools.commons.dialogs.RadioGroupDialog import com.simplemobiletools.commons.dialogs.RadioGroupDialog
import com.simplemobiletools.commons.extensions.getMyContactsCursor import com.simplemobiletools.commons.extensions.getMyContactsCursor
import com.simplemobiletools.commons.extensions.updateTextColors import com.simplemobiletools.commons.extensions.updateTextColors
import com.simplemobiletools.commons.extensions.viewBinding
import com.simplemobiletools.commons.helpers.ContactsHelper import com.simplemobiletools.commons.helpers.ContactsHelper
import com.simplemobiletools.commons.helpers.MyContactsContentProvider import com.simplemobiletools.commons.helpers.MyContactsContentProvider
import com.simplemobiletools.commons.helpers.NavigationIcon import com.simplemobiletools.commons.helpers.NavigationIcon
import com.simplemobiletools.commons.models.PhoneNumber import com.simplemobiletools.commons.models.PhoneNumber
import com.simplemobiletools.commons.models.RadioItem import com.simplemobiletools.commons.models.RadioItem
import com.simplemobiletools.commons.models.contacts.Contact import com.simplemobiletools.commons.models.contacts.Contact
import com.simplemobiletools.dialer.R
import com.simplemobiletools.dialer.adapters.SpeedDialAdapter import com.simplemobiletools.dialer.adapters.SpeedDialAdapter
import com.simplemobiletools.dialer.databinding.ActivityManageSpeedDialBinding
import com.simplemobiletools.dialer.dialogs.SelectContactDialog import com.simplemobiletools.dialer.dialogs.SelectContactDialog
import com.simplemobiletools.dialer.extensions.config import com.simplemobiletools.dialer.extensions.config
import com.simplemobiletools.dialer.interfaces.RemoveSpeedDialListener import com.simplemobiletools.dialer.interfaces.RemoveSpeedDialListener
import com.simplemobiletools.dialer.models.SpeedDial import com.simplemobiletools.dialer.models.SpeedDial
import kotlinx.android.synthetic.main.activity_manage_speed_dial.*
class ManageSpeedDialActivity : SimpleActivity(), RemoveSpeedDialListener { class ManageSpeedDialActivity : SimpleActivity(), RemoveSpeedDialListener {
private val binding by viewBinding(ActivityManageSpeedDialBinding::inflate)
private var allContacts = mutableListOf<Contact>() private var allContacts = mutableListOf<Contact>()
private var speedDialValues = mutableListOf<SpeedDial>() private var speedDialValues = mutableListOf<SpeedDial>()
override fun onCreate(savedInstanceState: Bundle?) { override fun onCreate(savedInstanceState: Bundle?) {
isMaterialActivity = true isMaterialActivity = true
super.onCreate(savedInstanceState) super.onCreate(savedInstanceState)
setContentView(R.layout.activity_manage_speed_dial) setContentView(binding.root)
updateMaterialActivityViews(manage_speed_dial_coordinator, manage_speed_dial_holder, useTransparentNavigation = true, useTopSearchMenu = false) binding.apply {
setupMaterialScrollListener(manage_speed_dial_scrollview, manage_speed_dial_toolbar) updateMaterialActivityViews(manageSpeedDialCoordinator, manageSpeedDialHolder, useTransparentNavigation = true, useTopSearchMenu = false)
setupMaterialScrollListener(manageSpeedDialScrollview, manageSpeedDialToolbar)
}
speedDialValues = config.getSpeedDialValues() speedDialValues = config.getSpeedDialValues()
updateAdapter() updateAdapter()
@ -43,12 +48,12 @@ class ManageSpeedDialActivity : SimpleActivity(), RemoveSpeedDialListener {
allContacts.sort() allContacts.sort()
} }
updateTextColors(manage_speed_dial_scrollview) updateTextColors(binding.manageSpeedDialScrollview)
} }
override fun onResume() { override fun onResume() {
super.onResume() super.onResume()
setupToolbar(manage_speed_dial_toolbar, NavigationIcon.Arrow) setupToolbar(binding.manageSpeedDialToolbar, NavigationIcon.Arrow)
} }
override fun onStop() { override fun onStop() {
@ -57,7 +62,7 @@ class ManageSpeedDialActivity : SimpleActivity(), RemoveSpeedDialListener {
} }
private fun updateAdapter() { private fun updateAdapter() {
SpeedDialAdapter(this, speedDialValues, this, speed_dial_list) { SpeedDialAdapter(this, speedDialValues, this, binding.speedDialList) {
val clickedContact = it as SpeedDial val clickedContact = it as SpeedDial
if (allContacts.isEmpty()) { if (allContacts.isEmpty()) {
return@SpeedDialAdapter return@SpeedDialAdapter
@ -88,7 +93,7 @@ class ManageSpeedDialActivity : SimpleActivity(), RemoveSpeedDialListener {
} }
}.apply { }.apply {
speed_dial_list.adapter = this binding.speedDialList.adapter = this
} }
} }

View File

@ -15,23 +15,24 @@ import com.simplemobiletools.commons.extensions.*
import com.simplemobiletools.commons.helpers.* import com.simplemobiletools.commons.helpers.*
import com.simplemobiletools.commons.models.RadioItem import com.simplemobiletools.commons.models.RadioItem
import com.simplemobiletools.dialer.R import com.simplemobiletools.dialer.R
import com.simplemobiletools.dialer.databinding.ActivitySettingsBinding
import com.simplemobiletools.dialer.dialogs.ExportCallHistoryDialog import com.simplemobiletools.dialer.dialogs.ExportCallHistoryDialog
import com.simplemobiletools.dialer.dialogs.ManageVisibleTabsDialog import com.simplemobiletools.dialer.dialogs.ManageVisibleTabsDialog
import com.simplemobiletools.dialer.extensions.config import com.simplemobiletools.dialer.extensions.config
import com.simplemobiletools.dialer.helpers.RecentsHelper import com.simplemobiletools.dialer.helpers.RecentsHelper
import com.simplemobiletools.dialer.models.RecentCall import com.simplemobiletools.dialer.models.RecentCall
import kotlinx.android.synthetic.main.activity_settings.*
import kotlinx.serialization.SerializationException import kotlinx.serialization.SerializationException
import kotlinx.serialization.decodeFromString
import kotlinx.serialization.encodeToString import kotlinx.serialization.encodeToString
import kotlinx.serialization.json.Json import kotlinx.serialization.json.Json
import java.util.* import java.util.*
import kotlin.system.exitProcess import kotlin.system.exitProcess
class SettingsActivity : SimpleActivity() { class SettingsActivity : SimpleActivity() {
companion object {
private const val CALL_HISTORY_FILE_TYPE = "application/json"
}
private val callHistoryFileType = "application/json" private val binding by viewBinding(ActivitySettingsBinding::inflate)
private val getContent = registerForActivityResult(ActivityResultContracts.GetContent()) { uri -> private val getContent = registerForActivityResult(ActivityResultContracts.GetContent()) { uri ->
if (uri != null) { if (uri != null) {
toast(R.string.importing) toast(R.string.importing)
@ -39,7 +40,7 @@ class SettingsActivity : SimpleActivity() {
} }
} }
private val saveDocument = registerForActivityResult(ActivityResultContracts.CreateDocument(callHistoryFileType)) { uri -> private val saveDocument = registerForActivityResult(ActivityResultContracts.CreateDocument(CALL_HISTORY_FILE_TYPE)) { uri ->
if (uri != null) { if (uri != null) {
toast(R.string.exporting) toast(R.string.exporting)
RecentsHelper(this).getRecentCalls(false, Int.MAX_VALUE) { recents -> RecentsHelper(this).getRecentCalls(false, Int.MAX_VALUE) { recents ->
@ -51,15 +52,17 @@ class SettingsActivity : SimpleActivity() {
override fun onCreate(savedInstanceState: Bundle?) { override fun onCreate(savedInstanceState: Bundle?) {
isMaterialActivity = true isMaterialActivity = true
super.onCreate(savedInstanceState) super.onCreate(savedInstanceState)
setContentView(R.layout.activity_settings) setContentView(binding.root)
updateMaterialActivityViews(settings_coordinator, settings_holder, useTransparentNavigation = true, useTopSearchMenu = false) binding.apply {
setupMaterialScrollListener(settings_nested_scrollview, settings_toolbar) updateMaterialActivityViews(settingsCoordinator, settingsHolder, useTransparentNavigation = true, useTopSearchMenu = false)
setupMaterialScrollListener(settingsNestedScrollview, settingsToolbar)
}
} }
override fun onResume() { override fun onResume() {
super.onResume() super.onResume()
setupToolbar(settings_toolbar, NavigationIcon.Arrow) setupToolbar(binding.settingsToolbar, NavigationIcon.Arrow)
setupPurchaseThankYou() setupPurchaseThankYou()
setupCustomizeColors() setupCustomizeColors()
@ -83,16 +86,18 @@ class SettingsActivity : SimpleActivity() {
setupAlwaysShowFullscreen() setupAlwaysShowFullscreen()
setupCallsExport() setupCallsExport()
setupCallsImport() setupCallsImport()
updateTextColors(settings_holder) updateTextColors(binding.settingsHolder)
arrayOf( binding.apply {
settings_color_customization_section_label, arrayOf(
settings_general_settings_label, settingsColorCustomizationSectionLabel,
settings_startup_label, settingsGeneralSettingsLabel,
settings_calls_label, settingsStartupLabel,
settings_migration_section_label settingsCallsLabel,
).forEach { settingsMigrationSectionLabel
it.setTextColor(getProperPrimaryColor()) ).forEach {
it.setTextColor(getProperPrimaryColor())
}
} }
} }
@ -102,55 +107,61 @@ class SettingsActivity : SimpleActivity() {
} }
private fun setupPurchaseThankYou() { private fun setupPurchaseThankYou() {
settings_purchase_thank_you_holder.beGoneIf(isOrWasThankYouInstalled()) binding.settingsPurchaseThankYouHolder.beGoneIf(isOrWasThankYouInstalled())
settings_purchase_thank_you_holder.setOnClickListener { binding.settingsPurchaseThankYouHolder.setOnClickListener {
launchPurchaseThankYouIntent() launchPurchaseThankYouIntent()
} }
} }
private fun setupCustomizeColors() { private fun setupCustomizeColors() {
settings_color_customization_label.text = getCustomizeColorsString() binding.settingsColorCustomizationLabel.text = getCustomizeColorsString()
settings_color_customization_holder.setOnClickListener { binding.settingsColorCustomizationHolder.setOnClickListener {
handleCustomizeColorsClick() handleCustomizeColorsClick()
} }
} }
private fun setupUseEnglish() { private fun setupUseEnglish() {
settings_use_english_holder.beVisibleIf((config.wasUseEnglishToggled || Locale.getDefault().language != "en") && !isTiramisuPlus()) binding.apply {
settings_use_english.isChecked = config.useEnglish settingsUseEnglishHolder.beVisibleIf((config.wasUseEnglishToggled || Locale.getDefault().language != "en") && !isTiramisuPlus())
settings_use_english_holder.setOnClickListener { settingsUseEnglish.isChecked = config.useEnglish
settings_use_english.toggle() settingsUseEnglishHolder.setOnClickListener {
config.useEnglish = settings_use_english.isChecked settingsUseEnglish.toggle()
exitProcess(0) config.useEnglish = settingsUseEnglish.isChecked
exitProcess(0)
}
} }
} }
private fun setupLanguage() { private fun setupLanguage() {
settings_language.text = Locale.getDefault().displayLanguage binding.apply {
settings_language_holder.beVisibleIf(isTiramisuPlus()) settingsLanguage.text = Locale.getDefault().displayLanguage
settings_language_holder.setOnClickListener { settingsLanguageHolder.beVisibleIf(isTiramisuPlus())
launchChangeAppLanguageIntent() settingsLanguageHolder.setOnClickListener {
launchChangeAppLanguageIntent()
}
} }
} }
// support for device-wise blocking came on Android 7, rely only on that // support for device-wise blocking came on Android 7, rely only on that
@TargetApi(Build.VERSION_CODES.N) @TargetApi(Build.VERSION_CODES.N)
private fun setupManageBlockedNumbers() { private fun setupManageBlockedNumbers() {
settings_manage_blocked_numbers_label.text = addLockedLabelIfNeeded(R.string.manage_blocked_numbers) binding.apply {
settings_manage_blocked_numbers_holder.beVisibleIf(isNougatPlus()) settingsManageBlockedNumbersLabel.text = addLockedLabelIfNeeded(R.string.manage_blocked_numbers)
settings_manage_blocked_numbers_holder.setOnClickListener { settingsManageBlockedNumbersHolder.beVisibleIf(isNougatPlus())
if (isOrWasThankYouInstalled()) { settingsManageBlockedNumbersHolder.setOnClickListener {
Intent(this, ManageBlockedNumbersActivity::class.java).apply { if (isOrWasThankYouInstalled()) {
startActivity(this) Intent(this@SettingsActivity, ManageBlockedNumbersActivity::class.java).apply {
startActivity(this)
}
} else {
FeatureLockedDialog(this@SettingsActivity) { }
} }
} else {
FeatureLockedDialog(this) { }
} }
} }
} }
private fun setupManageSpeedDial() { private fun setupManageSpeedDial() {
settings_manage_speed_dial_holder.setOnClickListener { binding.settingsManageSpeedDialHolder.setOnClickListener {
Intent(this, ManageSpeedDialActivity::class.java).apply { Intent(this, ManageSpeedDialActivity::class.java).apply {
startActivity(this) startActivity(this)
} }
@ -158,14 +169,14 @@ class SettingsActivity : SimpleActivity() {
} }
private fun setupChangeDateTimeFormat() { private fun setupChangeDateTimeFormat() {
settings_change_date_time_format_holder.setOnClickListener { binding.settingsChangeDateTimeFormatHolder.setOnClickListener {
ChangeDateTimeFormatDialog(this) {} ChangeDateTimeFormatDialog(this) {}
} }
} }
private fun setupFontSize() { private fun setupFontSize() {
settings_font_size.text = getFontSizeText() binding.settingsFontSize.text = getFontSizeText()
settings_font_size_holder.setOnClickListener { binding.settingsFontSizeHolder.setOnClickListener {
val items = arrayListOf( val items = arrayListOf(
RadioItem(FONT_SIZE_SMALL, getString(R.string.small)), RadioItem(FONT_SIZE_SMALL, getString(R.string.small)),
RadioItem(FONT_SIZE_MEDIUM, getString(R.string.medium)), RadioItem(FONT_SIZE_MEDIUM, getString(R.string.medium)),
@ -175,20 +186,20 @@ class SettingsActivity : SimpleActivity() {
RadioGroupDialog(this@SettingsActivity, items, config.fontSize) { RadioGroupDialog(this@SettingsActivity, items, config.fontSize) {
config.fontSize = it as Int config.fontSize = it as Int
settings_font_size.text = getFontSizeText() binding.settingsFontSize.text = getFontSizeText()
} }
} }
} }
private fun setupManageShownTabs() { private fun setupManageShownTabs() {
settings_manage_tabs_holder.setOnClickListener { binding.settingsManageTabsHolder.setOnClickListener {
ManageVisibleTabsDialog(this) ManageVisibleTabsDialog(this)
} }
} }
private fun setupDefaultTab() { private fun setupDefaultTab() {
settings_default_tab.text = getDefaultTabText() binding.settingsDefaultTab.text = getDefaultTabText()
settings_default_tab_holder.setOnClickListener { binding.settingsDefaultTabHolder.setOnClickListener {
val items = arrayListOf( val items = arrayListOf(
RadioItem(TAB_CONTACTS, getString(R.string.contacts_tab)), RadioItem(TAB_CONTACTS, getString(R.string.contacts_tab)),
RadioItem(TAB_FAVORITES, getString(R.string.favorites_tab)), RadioItem(TAB_FAVORITES, getString(R.string.favorites_tab)),
@ -198,7 +209,7 @@ class SettingsActivity : SimpleActivity() {
RadioGroupDialog(this@SettingsActivity, items, config.defaultTab) { RadioGroupDialog(this@SettingsActivity, items, config.defaultTab) {
config.defaultTab = it as Int config.defaultTab = it as Int
settings_default_tab.text = getDefaultTabText() binding.settingsDefaultTab.text = getDefaultTabText()
} }
} }
} }
@ -213,87 +224,107 @@ class SettingsActivity : SimpleActivity() {
) )
private fun setupDialPadOpen() { private fun setupDialPadOpen() {
settings_open_dialpad_at_launch.isChecked = config.openDialPadAtLaunch binding.apply {
settings_open_dialpad_at_launch_holder.setOnClickListener { settingsOpenDialpadAtLaunch.isChecked = config.openDialPadAtLaunch
settings_open_dialpad_at_launch.toggle() settingsOpenDialpadAtLaunchHolder.setOnClickListener {
config.openDialPadAtLaunch = settings_open_dialpad_at_launch.isChecked settingsOpenDialpadAtLaunch.toggle()
config.openDialPadAtLaunch = settingsOpenDialpadAtLaunch.isChecked
}
} }
} }
private fun setupGroupSubsequentCalls() { private fun setupGroupSubsequentCalls() {
settings_group_subsequent_calls.isChecked = config.groupSubsequentCalls binding.apply {
settings_group_subsequent_calls_holder.setOnClickListener { settingsGroupSubsequentCalls.isChecked = config.groupSubsequentCalls
settings_group_subsequent_calls.toggle() settingsGroupSubsequentCallsHolder.setOnClickListener {
config.groupSubsequentCalls = settings_group_subsequent_calls.isChecked settingsGroupSubsequentCalls.toggle()
config.groupSubsequentCalls = settingsGroupSubsequentCalls.isChecked
}
} }
} }
private fun setupStartNameWithSurname() { private fun setupStartNameWithSurname() {
settings_start_name_with_surname.isChecked = config.startNameWithSurname binding.apply {
settings_start_name_with_surname_holder.setOnClickListener { settingsStartNameWithSurname.isChecked = config.startNameWithSurname
settings_start_name_with_surname.toggle() settingsStartNameWithSurnameHolder.setOnClickListener {
config.startNameWithSurname = settings_start_name_with_surname.isChecked settingsStartNameWithSurname.toggle()
config.startNameWithSurname = settingsStartNameWithSurname.isChecked
}
} }
} }
private fun setupDialpadVibrations() { private fun setupDialpadVibrations() {
settings_dialpad_vibration.isChecked = config.dialpadVibration binding.apply {
settings_dialpad_vibration_holder.setOnClickListener { settingsDialpadVibration.isChecked = config.dialpadVibration
settings_dialpad_vibration.toggle() settingsDialpadVibrationHolder.setOnClickListener {
config.dialpadVibration = settings_dialpad_vibration.isChecked settingsDialpadVibration.toggle()
config.dialpadVibration = settingsDialpadVibration.isChecked
}
} }
} }
private fun setupDialpadNumbers() { private fun setupDialpadNumbers() {
settings_hide_dialpad_numbers.isChecked = config.hideDialpadNumbers binding.apply {
settings_hide_dialpad_numbers_holder.setOnClickListener { settingsHideDialpadNumbers.isChecked = config.hideDialpadNumbers
settings_hide_dialpad_numbers.toggle() settingsHideDialpadNumbersHolder.setOnClickListener {
config.hideDialpadNumbers = settings_hide_dialpad_numbers.isChecked settingsHideDialpadNumbers.toggle()
config.hideDialpadNumbers = settingsHideDialpadNumbers.isChecked
}
} }
} }
private fun setupDialpadBeeps() { private fun setupDialpadBeeps() {
settings_dialpad_beeps.isChecked = config.dialpadBeeps binding.apply {
settings_dialpad_beeps_holder.setOnClickListener { settingsDialpadBeeps.isChecked = config.dialpadBeeps
settings_dialpad_beeps.toggle() settingsDialpadBeepsHolder.setOnClickListener {
config.dialpadBeeps = settings_dialpad_beeps.isChecked settingsDialpadBeeps.toggle()
config.dialpadBeeps = settingsDialpadBeeps.isChecked
}
} }
} }
private fun setupShowCallConfirmation() { private fun setupShowCallConfirmation() {
settings_show_call_confirmation.isChecked = config.showCallConfirmation binding.apply {
settings_show_call_confirmation_holder.setOnClickListener { settingsShowCallConfirmation.isChecked = config.showCallConfirmation
settings_show_call_confirmation.toggle() settingsShowCallConfirmationHolder.setOnClickListener {
config.showCallConfirmation = settings_show_call_confirmation.isChecked settingsShowCallConfirmation.toggle()
config.showCallConfirmation = settingsShowCallConfirmation.isChecked
}
} }
} }
private fun setupDisableProximitySensor() { private fun setupDisableProximitySensor() {
settings_disable_proximity_sensor.isChecked = config.disableProximitySensor binding.apply {
settings_disable_proximity_sensor_holder.setOnClickListener { settingsDisableProximitySensor.isChecked = config.disableProximitySensor
settings_disable_proximity_sensor.toggle() settingsDisableProximitySensorHolder.setOnClickListener {
config.disableProximitySensor = settings_disable_proximity_sensor.isChecked settingsDisableProximitySensor.toggle()
config.disableProximitySensor = settingsDisableProximitySensor.isChecked
}
} }
} }
private fun setupDisableSwipeToAnswer() { private fun setupDisableSwipeToAnswer() {
settings_disable_swipe_to_answer.isChecked = config.disableSwipeToAnswer binding.apply {
settings_disable_swipe_to_answer_holder.setOnClickListener { settingsDisableSwipeToAnswer.isChecked = config.disableSwipeToAnswer
settings_disable_swipe_to_answer.toggle() settingsDisableSwipeToAnswerHolder.setOnClickListener {
config.disableSwipeToAnswer = settings_disable_swipe_to_answer.isChecked settingsDisableSwipeToAnswer.toggle()
config.disableSwipeToAnswer = settingsDisableSwipeToAnswer.isChecked
}
} }
} }
private fun setupAlwaysShowFullscreen() { private fun setupAlwaysShowFullscreen() {
settings_always_show_fullscreen.isChecked = config.alwaysShowFullscreen binding.apply {
settings_always_show_fullscreen_holder.setOnClickListener { settingsAlwaysShowFullscreen.isChecked = config.alwaysShowFullscreen
settings_always_show_fullscreen.toggle() settingsAlwaysShowFullscreenHolder.setOnClickListener {
config.alwaysShowFullscreen = settings_always_show_fullscreen.isChecked settingsAlwaysShowFullscreen.toggle()
config.alwaysShowFullscreen = settingsAlwaysShowFullscreen.isChecked
}
} }
} }
private fun setupCallsExport() { private fun setupCallsExport() {
settings_export_calls_holder.setOnClickListener { binding.settingsExportCallsHolder.setOnClickListener {
ExportCallHistoryDialog(this) { filename -> ExportCallHistoryDialog(this) { filename ->
saveDocument.launch(filename) saveDocument.launch(filename)
} }
@ -301,8 +332,8 @@ class SettingsActivity : SimpleActivity() {
} }
private fun setupCallsImport() { private fun setupCallsImport() {
settings_import_calls_holder.setOnClickListener { binding.settingsImportCallsHolder.setOnClickListener {
getContent.launch(callHistoryFileType) getContent.launch(CALL_HISTORY_FILE_TYPE)
} }
} }

View File

@ -11,9 +11,9 @@ import com.simplemobiletools.commons.helpers.SimpleContactsHelper
import com.simplemobiletools.commons.views.MyRecyclerView import com.simplemobiletools.commons.views.MyRecyclerView
import com.simplemobiletools.dialer.R import com.simplemobiletools.dialer.R
import com.simplemobiletools.dialer.activities.SimpleActivity import com.simplemobiletools.dialer.activities.SimpleActivity
import com.simplemobiletools.dialer.databinding.ItemConferenceCallBinding
import com.simplemobiletools.dialer.extensions.hasCapability import com.simplemobiletools.dialer.extensions.hasCapability
import com.simplemobiletools.dialer.helpers.getCallContact import com.simplemobiletools.dialer.helpers.getCallContact
import kotlinx.android.synthetic.main.item_conference_call.view.*
class ConferenceCallsAdapter( class ConferenceCallsAdapter(
activity: SimpleActivity, recyclerView: MyRecyclerView, val data: ArrayList<Call>, itemClick: (Any) -> Unit activity: SimpleActivity, recyclerView: MyRecyclerView, val data: ArrayList<Call>, itemClick: (Any) -> Unit
@ -39,55 +39,63 @@ class ConferenceCallsAdapter(
override fun prepareActionMode(menu: Menu) {} override fun prepareActionMode(menu: Menu) {}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int) = createViewHolder(R.layout.item_conference_call, parent) override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
return createViewHolder(ItemConferenceCallBinding.inflate(layoutInflater, parent, false).root)
}
override fun onBindViewHolder(holder: ViewHolder, position: Int) { override fun onBindViewHolder(holder: ViewHolder, position: Int) {
val call = data[position] val call = data[position]
holder.bindView(call, allowSingleClick = false, allowLongClick = false) { itemView, _ -> holder.bindView(call, allowSingleClick = false, allowLongClick = false) { itemView, _ ->
getCallContact(itemView.context, call) { callContact -> ItemConferenceCallBinding.bind(itemView).apply {
itemView.post { getCallContact(itemView.context, call) { callContact ->
itemView.item_conference_call_name.text = callContact.name.ifEmpty { itemView.context.getString(R.string.unknown_caller) } root.post {
SimpleContactsHelper(activity).loadContactImage( itemConferenceCallName.text = callContact.name.ifEmpty { itemView.context.getString(R.string.unknown_caller) }
callContact.photoUri, SimpleContactsHelper(activity).loadContactImage(
itemView.item_conference_call_image, callContact.photoUri,
callContact.name, itemConferenceCallImage,
activity.getDrawable(R.drawable.ic_person_vector) callContact.name,
) activity.getDrawable(R.drawable.ic_person_vector)
)
}
} }
}
val canSeparate = call.hasCapability(Call.Details.CAPABILITY_SEPARATE_FROM_CONFERENCE) val canSeparate = call.hasCapability(Call.Details.CAPABILITY_SEPARATE_FROM_CONFERENCE)
val canDisconnect = call.hasCapability(Call.Details.CAPABILITY_DISCONNECT_FROM_CONFERENCE) val canDisconnect = call.hasCapability(Call.Details.CAPABILITY_DISCONNECT_FROM_CONFERENCE)
itemView.item_conference_call_split.isEnabled = canSeparate itemConferenceCallSplit.isEnabled = canSeparate
itemView.item_conference_call_split.alpha = if (canSeparate) 1.0f else LOWER_ALPHA itemConferenceCallSplit.alpha = if (canSeparate) 1.0f else LOWER_ALPHA
itemView.item_conference_call_split.setOnClickListener { itemConferenceCallSplit.setOnClickListener {
call.splitFromConference() call.splitFromConference()
data.removeAt(position) data.removeAt(position)
notifyItemRemoved(position) notifyItemRemoved(position)
if (data.size == 1) { if (data.size == 1) {
activity.finish() activity.finish()
}
} }
}
itemView.item_conference_call_split.setOnLongClickListener { itemConferenceCallSplit.setOnLongClickListener {
if (!it.contentDescription.isNullOrEmpty()) { if (!it.contentDescription.isNullOrEmpty()) {
itemView.context.toast(it.contentDescription.toString()) root.context.toast(it.contentDescription.toString())
}
true
} }
true
} itemConferenceCallEnd.isEnabled = canDisconnect
itemView.item_conference_call_end.isEnabled = canDisconnect itemConferenceCallEnd.alpha = if (canDisconnect) 1.0f else LOWER_ALPHA
itemView.item_conference_call_end.alpha = if (canDisconnect) 1.0f else LOWER_ALPHA itemConferenceCallEnd.setOnClickListener {
itemView.item_conference_call_end.setOnClickListener { call.disconnect()
call.disconnect() data.removeAt(position)
data.removeAt(position) notifyItemRemoved(position)
notifyItemRemoved(position) if (data.size == 1) {
if (data.size == 1) { activity.finish()
activity.finish() }
} }
}
itemView.item_conference_call_end.setOnLongClickListener { itemConferenceCallEnd.setOnLongClickListener {
if (!it.contentDescription.isNullOrEmpty()) { if (!it.contentDescription.isNullOrEmpty()) {
itemView.context.toast(it.contentDescription.toString()) root.context.toast(it.contentDescription.toString())
}
true
} }
true
} }
} }
bindViewHolder(holder) bindViewHolder(holder)
@ -96,7 +104,9 @@ class ConferenceCallsAdapter(
override fun onViewRecycled(holder: ViewHolder) { override fun onViewRecycled(holder: ViewHolder) {
super.onViewRecycled(holder) super.onViewRecycled(holder)
if (!activity.isDestroyed && !activity.isFinishing) { if (!activity.isDestroyed && !activity.isFinishing) {
Glide.with(activity).clear(holder.itemView.item_conference_call_image) ItemConferenceCallBinding.bind(holder.itemView).apply {
Glide.with(activity).clear(itemConferenceCallImage)
}
} }
} }
} }

View File

@ -14,8 +14,11 @@ import androidx.constraintlayout.widget.ConstraintLayout
import androidx.recyclerview.widget.GridLayoutManager import androidx.recyclerview.widget.GridLayoutManager
import androidx.recyclerview.widget.ItemTouchHelper import androidx.recyclerview.widget.ItemTouchHelper
import androidx.recyclerview.widget.RecyclerView import androidx.recyclerview.widget.RecyclerView
import androidx.viewbinding.ViewBinding
import com.bumptech.glide.Glide import com.bumptech.glide.Glide
import com.simplemobiletools.commons.adapters.MyRecyclerViewAdapter import com.simplemobiletools.commons.adapters.MyRecyclerViewAdapter
import com.simplemobiletools.commons.databinding.ItemContactWithoutNumberBinding
import com.simplemobiletools.commons.databinding.ItemContactWithoutNumberGridBinding
import com.simplemobiletools.commons.dialogs.ConfirmationDialog import com.simplemobiletools.commons.dialogs.ConfirmationDialog
import com.simplemobiletools.commons.dialogs.FeatureLockedDialog import com.simplemobiletools.commons.dialogs.FeatureLockedDialog
import com.simplemobiletools.commons.extensions.* import com.simplemobiletools.commons.extensions.*
@ -128,11 +131,8 @@ class ContactsAdapter(
} }
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder { override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
val layout = when (viewType) { val binding = Binding.getByItemViewType(viewType).inflate(layoutInflater, parent, false)
VIEW_TYPE_GRID -> R.layout.item_contact_without_number_grid return createViewHolder(binding.root)
else -> R.layout.item_contact_without_number
}
return createViewHolder(layout, parent)
} }
override fun getItemViewType(position: Int): Int { override fun getItemViewType(position: Int): Int {
@ -142,7 +142,8 @@ class ContactsAdapter(
override fun onBindViewHolder(holder: ViewHolder, position: Int) { override fun onBindViewHolder(holder: ViewHolder, position: Int) {
val contact = contacts[position] val contact = contacts[position]
holder.bindView(contact, true, allowLongClick) { itemView, layoutPosition -> holder.bindView(contact, true, allowLongClick) { itemView, layoutPosition ->
setupView(itemView, contact, holder) val viewType = getItemViewType(position)
setupView(Binding.getByItemViewType(viewType).bind(itemView), contact, holder)
} }
bindViewHolder(holder) bindViewHolder(holder)
} }
@ -278,15 +279,17 @@ class ContactsAdapter(
override fun onViewRecycled(holder: ViewHolder) { override fun onViewRecycled(holder: ViewHolder) {
super.onViewRecycled(holder) super.onViewRecycled(holder)
if (!activity.isDestroyed && !activity.isFinishing) { if (!activity.isDestroyed && !activity.isFinishing) {
Glide.with(activity).clear(holder.itemView.findViewById<ImageView>(R.id.item_contact_image)) Binding.getByItemViewType(holder.itemViewType).bind(holder.itemView).apply {
Glide.with(activity).clear(itemContactImage)
}
} }
} }
private fun setupView(view: View, contact: Contact, holder: ViewHolder) { private fun setupView(binding: ItemViewBinding, contact: Contact, holder: ViewHolder) {
view.apply { binding.apply {
setupViewBackground(activity) root.setupViewBackground(activity)
findViewById<ConstraintLayout>(R.id.item_contact_frame).isSelected = selectedKeys.contains(contact.rawId) itemContactFrame.isSelected = selectedKeys.contains(contact.rawId)
findViewById<TextView>(R.id.item_contact_name).apply { itemContactName.apply {
setTextColor(textColor) setTextColor(textColor)
setTextSize(TypedValue.COMPLEX_UNIT_PX, fontSize) setTextSize(TypedValue.COMPLEX_UNIT_PX, fontSize)
@ -300,9 +303,8 @@ class ContactsAdapter(
} }
} }
val dragIcon = findViewById<ImageView>(R.id.drag_handle_icon)
if (enableDrag && textToHighlight.isEmpty()) { if (enableDrag && textToHighlight.isEmpty()) {
dragIcon.apply { dragHandleIcon.apply {
beVisibleIf(selectedKeys.isNotEmpty()) beVisibleIf(selectedKeys.isNotEmpty())
applyColorFilter(textColor) applyColorFilter(textColor)
setOnTouchListener { _, event -> setOnTouchListener { _, event ->
@ -313,14 +315,14 @@ class ContactsAdapter(
} }
} }
} else { } else {
dragIcon.apply { dragHandleIcon.apply {
beGone() beGone()
setOnTouchListener(null) setOnTouchListener(null)
} }
} }
if (!activity.isDestroyed) { if (!activity.isDestroyed) {
SimpleContactsHelper(context).loadContactImage(contact.photoUri, findViewById(R.id.item_contact_image), contact.getNameToDisplay()) SimpleContactsHelper(root.context).loadContactImage(contact.photoUri, itemContactImage, contact.getNameToDisplay())
} }
} }
} }
@ -369,4 +371,63 @@ class ContactsAdapter(
} }
} }
private sealed interface Binding {
companion object {
fun getByItemViewType(viewType: Int): Binding {
return when (viewType) {
VIEW_TYPE_GRID -> ItemContactGrid
else -> ItemContact
}
}
}
fun inflate(layoutInflater: LayoutInflater, viewGroup: ViewGroup, attachToRoot: Boolean): ItemViewBinding
fun bind(view: View): ItemViewBinding
data object ItemContactGrid : Binding {
override fun inflate(layoutInflater: LayoutInflater, viewGroup: ViewGroup, attachToRoot: Boolean): ItemViewBinding {
return ItemContactGridBindingAdapter(ItemContactWithoutNumberGridBinding.inflate(layoutInflater, viewGroup, attachToRoot))
}
override fun bind(view: View): ItemViewBinding {
return ItemContactGridBindingAdapter(ItemContactWithoutNumberGridBinding.bind(view))
}
}
data object ItemContact : Binding {
override fun inflate(layoutInflater: LayoutInflater, viewGroup: ViewGroup, attachToRoot: Boolean): ItemViewBinding {
return ItemContactBindingAdapter(ItemContactWithoutNumberBinding.inflate(layoutInflater, viewGroup, attachToRoot))
}
override fun bind(view: View): ItemViewBinding {
return ItemContactBindingAdapter(ItemContactWithoutNumberBinding.bind(view))
}
}
}
private interface ItemViewBinding : ViewBinding {
val itemContactName: TextView
val itemContactImage: ImageView
val itemContactFrame: ConstraintLayout
val dragHandleIcon: ImageView
}
private class ItemContactGridBindingAdapter(val binding: ItemContactWithoutNumberGridBinding) : ItemViewBinding {
override val itemContactName = binding.itemContactName
override val itemContactImage = binding.itemContactImage
override val itemContactFrame = binding.itemContactFrame
override val dragHandleIcon = binding.dragHandleIcon
override fun getRoot(): View = binding.root
}
private class ItemContactBindingAdapter(val binding: ItemContactWithoutNumberBinding) : ItemViewBinding {
override val itemContactName = binding.itemContactName
override val itemContactImage = binding.itemContactImage
override val itemContactFrame = binding.itemContactFrame
override val dragHandleIcon = binding.dragHandleIcon
override fun getRoot(): View = binding.root
}
} }

View File

@ -8,9 +8,8 @@ import com.simplemobiletools.commons.extensions.getProperPrimaryColor
import com.simplemobiletools.commons.extensions.getProperTextColor import com.simplemobiletools.commons.extensions.getProperTextColor
import com.simplemobiletools.commons.helpers.SMT_PRIVATE import com.simplemobiletools.commons.helpers.SMT_PRIVATE
import com.simplemobiletools.commons.models.contacts.ContactSource import com.simplemobiletools.commons.models.contacts.ContactSource
import com.simplemobiletools.dialer.R
import com.simplemobiletools.dialer.activities.SimpleActivity import com.simplemobiletools.dialer.activities.SimpleActivity
import kotlinx.android.synthetic.main.item_filter_contact_source.view.* import com.simplemobiletools.dialer.databinding.ItemFilterContactSourceBinding
class FilterContactSourcesAdapter( class FilterContactSourcesAdapter(
val activity: SimpleActivity, val activity: SimpleActivity,
@ -45,8 +44,8 @@ class FilterContactSourcesAdapter(
fun getSelectedContactSources() = contactSources.filter { selectedKeys.contains(it.hashCode()) } fun getSelectedContactSources() = contactSources.filter { selectedKeys.contains(it.hashCode()) }
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder { override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
val view = activity.layoutInflater.inflate(R.layout.item_filter_contact_source, parent, false) val binding = ItemFilterContactSourceBinding.inflate(activity.layoutInflater, parent, false)
return ViewHolder(view) return ViewHolder(binding.root)
} }
override fun onBindViewHolder(holder: ViewHolder, position: Int) { override fun onBindViewHolder(holder: ViewHolder, position: Int) {
@ -59,16 +58,16 @@ class FilterContactSourcesAdapter(
inner class ViewHolder(view: View) : RecyclerView.ViewHolder(view) { inner class ViewHolder(view: View) : RecyclerView.ViewHolder(view) {
fun bindView(contactSource: ContactSource): View { fun bindView(contactSource: ContactSource): View {
val isSelected = selectedKeys.contains(contactSource.hashCode()) val isSelected = selectedKeys.contains(contactSource.hashCode())
itemView.apply { ItemFilterContactSourceBinding.bind(itemView).apply {
filter_contact_source_checkbox.isChecked = isSelected filterContactSourceCheckbox.isChecked = isSelected
filter_contact_source_checkbox.setColors(activity.getProperTextColor(), activity.getProperPrimaryColor(), activity.getProperBackgroundColor()) filterContactSourceCheckbox.setColors(activity.getProperTextColor(), activity.getProperPrimaryColor(), activity.getProperBackgroundColor())
val countText = if (contactSource.count >= 0) " (${contactSource.count})" else "" val countText = if (contactSource.count >= 0) " (${contactSource.count})" else ""
val displayName = "${contactSource.publicName}$countText" val displayName = "${contactSource.publicName}$countText"
filter_contact_source_checkbox.text = displayName filterContactSourceCheckbox.text = displayName
filter_contact_source_holder.setOnClickListener { viewClicked(!isSelected, contactSource) } filterContactSourceHolder.setOnClickListener { viewClicked(!isSelected, contactSource) }
}
return itemView return root
}
} }
private fun viewClicked(select: Boolean, contactSource: ContactSource) { private fun viewClicked(select: Boolean, contactSource: ContactSource) {

View File

@ -19,12 +19,12 @@ import com.simplemobiletools.commons.views.MyRecyclerView
import com.simplemobiletools.dialer.R import com.simplemobiletools.dialer.R
import com.simplemobiletools.dialer.activities.MainActivity import com.simplemobiletools.dialer.activities.MainActivity
import com.simplemobiletools.dialer.activities.SimpleActivity import com.simplemobiletools.dialer.activities.SimpleActivity
import com.simplemobiletools.dialer.databinding.ItemRecentCallBinding
import com.simplemobiletools.dialer.dialogs.ShowGroupedCallsDialog import com.simplemobiletools.dialer.dialogs.ShowGroupedCallsDialog
import com.simplemobiletools.dialer.extensions.* import com.simplemobiletools.dialer.extensions.*
import com.simplemobiletools.dialer.helpers.RecentsHelper import com.simplemobiletools.dialer.helpers.RecentsHelper
import com.simplemobiletools.dialer.interfaces.RefreshItemsListener import com.simplemobiletools.dialer.interfaces.RefreshItemsListener
import com.simplemobiletools.dialer.models.RecentCall import com.simplemobiletools.dialer.models.RecentCall
import kotlinx.android.synthetic.main.item_recent_call.view.*
class RecentCallsAdapter( class RecentCallsAdapter(
activity: SimpleActivity, activity: SimpleActivity,
@ -103,7 +103,9 @@ class RecentCallsAdapter(
override fun onActionModeDestroyed() {} override fun onActionModeDestroyed() {}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int) = createViewHolder(R.layout.item_recent_call, parent) override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
return createViewHolder(ItemRecentCallBinding.inflate(layoutInflater, parent, false).root)
}
override fun onBindViewHolder(holder: ViewHolder, position: Int) { override fun onBindViewHolder(holder: ViewHolder, position: Int) {
val recentCall = recentCalls[position] val recentCall = recentCalls[position]
@ -112,7 +114,8 @@ class RecentCallsAdapter(
allowSingleClick = refreshItemsListener != null && !recentCall.isUnknownNumber, allowSingleClick = refreshItemsListener != null && !recentCall.isUnknownNumber,
allowLongClick = refreshItemsListener != null && !recentCall.isUnknownNumber allowLongClick = refreshItemsListener != null && !recentCall.isUnknownNumber
) { itemView, _ -> ) { itemView, _ ->
setupView(itemView, recentCall) val binding = ItemRecentCallBinding.bind(itemView)
setupView(binding, recentCall)
} }
bindViewHolder(holder) bindViewHolder(holder)
} }
@ -122,7 +125,9 @@ class RecentCallsAdapter(
override fun onViewRecycled(holder: ViewHolder) { override fun onViewRecycled(holder: ViewHolder) {
super.onViewRecycled(holder) super.onViewRecycled(holder)
if (!activity.isDestroyed && !activity.isFinishing) { if (!activity.isDestroyed && !activity.isFinishing) {
Glide.with(activity).clear(holder.itemView.item_recents_image) ItemRecentCallBinding.bind(holder.itemView).apply {
Glide.with(activity).clear(itemRecentsImage)
}
} }
} }
@ -277,10 +282,10 @@ class RecentCallsAdapter(
private fun getSelectedPhoneNumber() = getSelectedItems().firstOrNull()?.phoneNumber private fun getSelectedPhoneNumber() = getSelectedItems().firstOrNull()?.phoneNumber
private fun setupView(view: View, call: RecentCall) { private fun setupView(binding: ItemRecentCallBinding, call: RecentCall) {
view.apply { binding.apply {
val currentFontSize = fontSize val currentFontSize = fontSize
item_recents_holder.isSelected = selectedKeys.contains(call.id) itemRecentsHolder.isSelected = selectedKeys.contains(call.id)
val name = findContactByCall(call)?.getNameToDisplay() ?: call.name val name = findContactByCall(call)?.getNameToDisplay() ?: call.name
var nameToShow = SpannableString(name) var nameToShow = SpannableString(name)
if (call.specificType.isNotEmpty()) { if (call.specificType.isNotEmpty()) {
@ -300,37 +305,37 @@ class RecentCallsAdapter(
nameToShow = SpannableString(nameToShow.toString().highlightTextPart(textToHighlight, properPrimaryColor)) nameToShow = SpannableString(nameToShow.toString().highlightTextPart(textToHighlight, properPrimaryColor))
} }
item_recents_name.apply { itemRecentsName.apply {
text = nameToShow text = nameToShow
setTextColor(textColor) setTextColor(textColor)
setTextSize(TypedValue.COMPLEX_UNIT_PX, currentFontSize) setTextSize(TypedValue.COMPLEX_UNIT_PX, currentFontSize)
} }
item_recents_date_time.apply { itemRecentsDateTime.apply {
text = call.startTS.formatDateOrTime(context, refreshItemsListener != null, false) text = call.startTS.formatDateOrTime(context, refreshItemsListener != null, false)
setTextColor(if (call.type == Calls.MISSED_TYPE) redColor else textColor) setTextColor(if (call.type == Calls.MISSED_TYPE) redColor else textColor)
setTextSize(TypedValue.COMPLEX_UNIT_PX, currentFontSize * 0.8f) setTextSize(TypedValue.COMPLEX_UNIT_PX, currentFontSize * 0.8f)
} }
item_recents_duration.apply { itemRecentsDuration.apply {
text = call.duration.getFormattedDuration() text = call.duration.getFormattedDuration()
setTextColor(textColor) setTextColor(textColor)
beVisibleIf(call.type != Calls.MISSED_TYPE && call.type != Calls.REJECTED_TYPE && call.duration > 0) beVisibleIf(call.type != Calls.MISSED_TYPE && call.type != Calls.REJECTED_TYPE && call.duration > 0)
setTextSize(TypedValue.COMPLEX_UNIT_PX, currentFontSize * 0.8f) setTextSize(TypedValue.COMPLEX_UNIT_PX, currentFontSize * 0.8f)
if (!showOverflowMenu) { if (!showOverflowMenu) {
item_recents_duration.setPadding(0, 0, durationPadding, 0) itemRecentsDuration.setPadding(0, 0, durationPadding, 0)
} }
} }
item_recents_sim_image.beVisibleIf(areMultipleSIMsAvailable && call.simID != -1) itemRecentsSimImage.beVisibleIf(areMultipleSIMsAvailable && call.simID != -1)
item_recents_sim_id.beVisibleIf(areMultipleSIMsAvailable && call.simID != -1) itemRecentsSimId.beVisibleIf(areMultipleSIMsAvailable && call.simID != -1)
if (areMultipleSIMsAvailable && call.simID != -1) { if (areMultipleSIMsAvailable && call.simID != -1) {
item_recents_sim_image.applyColorFilter(textColor) itemRecentsSimImage.applyColorFilter(textColor)
item_recents_sim_id.setTextColor(textColor.getContrastColor()) itemRecentsSimId.setTextColor(textColor.getContrastColor())
item_recents_sim_id.text = call.simID.toString() itemRecentsSimId.text = call.simID.toString()
} }
SimpleContactsHelper(context).loadContactImage(call.photoUri, item_recents_image, call.name) SimpleContactsHelper(root.context).loadContactImage(call.photoUri, itemRecentsImage, call.name)
val drawable = when (call.type) { val drawable = when (call.type) {
Calls.OUTGOING_TYPE -> outgoingCallIcon Calls.OUTGOING_TYPE -> outgoingCallIcon
@ -338,15 +343,15 @@ class RecentCallsAdapter(
else -> incomingCallIcon else -> incomingCallIcon
} }
item_recents_type.setImageDrawable(drawable) itemRecentsType.setImageDrawable(drawable)
overflow_menu_icon.beVisibleIf(showOverflowMenu) overflowMenuIcon.beVisibleIf(showOverflowMenu)
overflow_menu_icon.drawable.apply { overflowMenuIcon.drawable.apply {
mutate() mutate()
setTint(activity.getProperTextColor()) setTint(activity.getProperTextColor())
} }
overflow_menu_icon.setOnClickListener { overflowMenuIcon.setOnClickListener {
showPopupMenu(overflow_menu_anchor, call) showPopupMenu(overflowMenuAnchor, call)
} }
} }
} }

View File

@ -1,15 +1,14 @@
package com.simplemobiletools.dialer.adapters package com.simplemobiletools.dialer.adapters
import android.view.Menu import android.view.Menu
import android.view.View
import android.view.ViewGroup import android.view.ViewGroup
import com.simplemobiletools.commons.adapters.MyRecyclerViewAdapter import com.simplemobiletools.commons.adapters.MyRecyclerViewAdapter
import com.simplemobiletools.commons.views.MyRecyclerView import com.simplemobiletools.commons.views.MyRecyclerView
import com.simplemobiletools.dialer.R import com.simplemobiletools.dialer.R
import com.simplemobiletools.dialer.activities.SimpleActivity import com.simplemobiletools.dialer.activities.SimpleActivity
import com.simplemobiletools.dialer.databinding.ItemSpeedDialBinding
import com.simplemobiletools.dialer.interfaces.RemoveSpeedDialListener import com.simplemobiletools.dialer.interfaces.RemoveSpeedDialListener
import com.simplemobiletools.dialer.models.SpeedDial import com.simplemobiletools.dialer.models.SpeedDial
import kotlinx.android.synthetic.main.item_speed_dial.view.speed_dial_label
class SpeedDialAdapter( class SpeedDialAdapter(
activity: SimpleActivity, var speedDialValues: List<SpeedDial>, private val removeListener: RemoveSpeedDialListener, activity: SimpleActivity, var speedDialValues: List<SpeedDial>, private val removeListener: RemoveSpeedDialListener,
@ -45,12 +44,15 @@ class SpeedDialAdapter(
override fun onActionModeDestroyed() {} override fun onActionModeDestroyed() {}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int) = createViewHolder(R.layout.item_speed_dial, parent) override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
return createViewHolder(ItemSpeedDialBinding.inflate(layoutInflater, parent, false).root)
}
override fun onBindViewHolder(holder: ViewHolder, position: Int) { override fun onBindViewHolder(holder: ViewHolder, position: Int) {
val speedDial = speedDialValues[position] val speedDial = speedDialValues[position]
holder.bindView(speedDial, true, true) { itemView, layoutPosition -> holder.bindView(speedDial, true, true) { itemView, layoutPosition ->
setupView(itemView, speedDial) val binding = ItemSpeedDialBinding.bind(itemView)
setupView(binding, speedDial)
} }
bindViewHolder(holder) bindViewHolder(holder)
} }
@ -65,12 +67,12 @@ class SpeedDialAdapter(
finishActMode() finishActMode()
} }
private fun setupView(view: View, speedDial: SpeedDial) { private fun setupView(binding: ItemSpeedDialBinding, speedDial: SpeedDial) {
view.apply { binding.apply {
var displayName = "${speedDial.id}. " var displayName = "${speedDial.id}. "
displayName += if (speedDial.isValid()) speedDial.displayName else "" displayName += if (speedDial.isValid()) speedDial.displayName else ""
speed_dial_label.apply { speedDialLabel.apply {
text = displayName text = displayName
isSelected = selectedKeys.contains(speedDial.hashCode()) isSelected = selectedKeys.contains(speedDial.hashCode())
setTextColor(textColor) setTextColor(textColor)

View File

@ -19,7 +19,7 @@ class ViewPagerAdapter(val activity: SimpleActivity) : PagerAdapter() {
val view = activity.layoutInflater.inflate(layout, container, false) val view = activity.layoutInflater.inflate(layout, container, false)
container.addView(view) container.addView(view)
(view as MyViewPagerFragment).apply { (view as MyViewPagerFragment<*>).apply {
setupFragment(activity) setupFragment(activity)
} }

View File

@ -4,22 +4,24 @@ import com.simplemobiletools.commons.activities.BaseSimpleActivity
import com.simplemobiletools.commons.extensions.beGoneIf import com.simplemobiletools.commons.extensions.beGoneIf
import com.simplemobiletools.commons.extensions.getAlertDialogBuilder import com.simplemobiletools.commons.extensions.getAlertDialogBuilder
import com.simplemobiletools.commons.extensions.setupDialogStuff import com.simplemobiletools.commons.extensions.setupDialogStuff
import com.simplemobiletools.commons.extensions.viewBinding
import com.simplemobiletools.commons.helpers.* import com.simplemobiletools.commons.helpers.*
import com.simplemobiletools.dialer.R import com.simplemobiletools.dialer.R
import com.simplemobiletools.dialer.databinding.DialogChangeSortingBinding
import com.simplemobiletools.dialer.extensions.config import com.simplemobiletools.dialer.extensions.config
import kotlinx.android.synthetic.main.dialog_change_sorting.view.*
class ChangeSortingDialog(val activity: BaseSimpleActivity, private val showCustomSorting: Boolean = false, private val callback: () -> Unit) { class ChangeSortingDialog(val activity: BaseSimpleActivity, private val showCustomSorting: Boolean = false, private val callback: () -> Unit) {
private val binding by activity.viewBinding(DialogChangeSortingBinding::inflate)
private var currSorting = 0 private var currSorting = 0
private var config = activity.config private var config = activity.config
private var view = activity.layoutInflater.inflate(R.layout.dialog_change_sorting, null)
init { init {
activity.getAlertDialogBuilder() activity.getAlertDialogBuilder()
.setPositiveButton(R.string.ok) { dialog, which -> dialogConfirmed() } .setPositiveButton(R.string.ok) { dialog, which -> dialogConfirmed() }
.setNegativeButton(R.string.cancel, null) .setNegativeButton(R.string.cancel, null)
.apply { .apply {
activity.setupDialogStuff(view, this, R.string.sort_by) activity.setupDialogStuff(binding.root, this, R.string.sort_by)
} }
currSorting = if (showCustomSorting && config.isCustomOrderSelected) { currSorting = if (showCustomSorting && config.isCustomOrderSelected) {
@ -33,43 +35,41 @@ class ChangeSortingDialog(val activity: BaseSimpleActivity, private val showCust
} }
private fun setupSortRadio() { private fun setupSortRadio() {
val sortingRadio = view.sorting_dialog_radio_sorting binding.apply {
sortingDialogRadioSorting.setOnCheckedChangeListener { group, checkedId ->
val isCustomSorting = checkedId == sortingDialogRadioCustom.id
sortingDialogRadioOrder.beGoneIf(isCustomSorting)
divider.beGoneIf(isCustomSorting)
}
sortingRadio.setOnCheckedChangeListener { group, checkedId -> val sortBtn = when {
val isCustomSorting = checkedId == sortingRadio.sorting_dialog_radio_custom.id currSorting and SORT_BY_FIRST_NAME != 0 -> sortingDialogRadioFirstName
view.sorting_dialog_radio_order.beGoneIf(isCustomSorting) currSorting and SORT_BY_MIDDLE_NAME != 0 -> sortingDialogRadioMiddleName
view.divider.beGoneIf(isCustomSorting) currSorting and SORT_BY_SURNAME != 0 -> sortingDialogRadioSurname
} currSorting and SORT_BY_FULL_NAME != 0 -> sortingDialogRadioFullName
currSorting and SORT_BY_CUSTOM != 0 -> sortingDialogRadioCustom
else -> sortingDialogRadioDateCreated
}
sortBtn.isChecked = true
val sortBtn = when { if (showCustomSorting) {
currSorting and SORT_BY_FIRST_NAME != 0 -> sortingRadio.sorting_dialog_radio_first_name sortingDialogRadioCustom.isChecked = config.isCustomOrderSelected
currSorting and SORT_BY_MIDDLE_NAME != 0 -> sortingRadio.sorting_dialog_radio_middle_name }
currSorting and SORT_BY_SURNAME != 0 -> sortingRadio.sorting_dialog_radio_surname sortingDialogRadioCustom.beGoneIf(!showCustomSorting)
currSorting and SORT_BY_FULL_NAME != 0 -> sortingRadio.sorting_dialog_radio_full_name
currSorting and SORT_BY_CUSTOM != 0 -> sortingRadio.sorting_dialog_radio_custom
else -> sortingRadio.sorting_dialog_radio_date_created
} }
sortBtn.isChecked = true
if (showCustomSorting) {
sortingRadio.sorting_dialog_radio_custom.isChecked = config.isCustomOrderSelected
}
view.sorting_dialog_radio_custom.beGoneIf(!showCustomSorting)
} }
private fun setupOrderRadio() { private fun setupOrderRadio() {
val orderRadio = view.sorting_dialog_radio_order var orderBtn = binding.sortingDialogRadioAscending
var orderBtn = orderRadio.sorting_dialog_radio_ascending
if (currSorting and SORT_DESCENDING != 0) { if (currSorting and SORT_DESCENDING != 0) {
orderBtn = orderRadio.sorting_dialog_radio_descending orderBtn = binding.sortingDialogRadioDescending
} }
orderBtn.isChecked = true orderBtn.isChecked = true
} }
private fun dialogConfirmed() { private fun dialogConfirmed() {
val sortingRadio = view.sorting_dialog_radio_sorting var sorting = when (binding.sortingDialogRadioSorting.checkedRadioButtonId) {
var sorting = when (sortingRadio.checkedRadioButtonId) {
R.id.sorting_dialog_radio_first_name -> SORT_BY_FIRST_NAME R.id.sorting_dialog_radio_first_name -> SORT_BY_FIRST_NAME
R.id.sorting_dialog_radio_middle_name -> SORT_BY_MIDDLE_NAME R.id.sorting_dialog_radio_middle_name -> SORT_BY_MIDDLE_NAME
R.id.sorting_dialog_radio_surname -> SORT_BY_SURNAME R.id.sorting_dialog_radio_surname -> SORT_BY_SURNAME
@ -78,7 +78,7 @@ class ChangeSortingDialog(val activity: BaseSimpleActivity, private val showCust
else -> SORT_BY_DATE_CREATED else -> SORT_BY_DATE_CREATED
} }
if (sorting != SORT_BY_CUSTOM && view.sorting_dialog_radio_order.checkedRadioButtonId == R.id.sorting_dialog_radio_descending) { if (sorting != SORT_BY_CUSTOM && binding.sortingDialogRadioOrder.checkedRadioButtonId == R.id.sorting_dialog_radio_descending) {
sorting = sorting or SORT_DESCENDING sorting = sorting or SORT_DESCENDING
} }

View File

@ -6,17 +6,17 @@ import androidx.fragment.app.FragmentManager
import com.simplemobiletools.commons.adapters.SimpleListItemAdapter import com.simplemobiletools.commons.adapters.SimpleListItemAdapter
import com.simplemobiletools.commons.fragments.BaseBottomSheetDialogFragment import com.simplemobiletools.commons.fragments.BaseBottomSheetDialogFragment
import com.simplemobiletools.commons.models.SimpleListItem import com.simplemobiletools.commons.models.SimpleListItem
import com.simplemobiletools.dialer.R import com.simplemobiletools.dialer.databinding.LayoutSimpleRecyclerViewBinding
import kotlinx.android.synthetic.main.layout_simple_recycler_view.*
// same as BottomSheetChooserDialog but with dynamic updates // same as BottomSheetChooserDialog but with dynamic updates
class DynamicBottomSheetChooserDialog : BaseBottomSheetDialogFragment() { class DynamicBottomSheetChooserDialog : BaseBottomSheetDialogFragment() {
private lateinit var binding: LayoutSimpleRecyclerViewBinding
var onItemClick: ((SimpleListItem) -> Unit)? = null var onItemClick: ((SimpleListItem) -> Unit)? = null
override fun setupContentView(parent: ViewGroup) { override fun setupContentView(parent: ViewGroup) {
val child = layoutInflater.inflate(R.layout.layout_simple_recycler_view, parent, false) binding = LayoutSimpleRecyclerViewBinding.inflate(layoutInflater, parent, false)
parent.addView(child) parent.addView(binding.root)
setupRecyclerView() setupRecyclerView()
} }
@ -27,13 +27,13 @@ class DynamicBottomSheetChooserDialog : BaseBottomSheetDialogFragment() {
} }
private fun getRecyclerViewAdapter(): SimpleListItemAdapter { private fun getRecyclerViewAdapter(): SimpleListItemAdapter {
var adapter = recycler_view.adapter as? SimpleListItemAdapter var adapter = binding.recyclerView.adapter as? SimpleListItemAdapter
if (adapter == null) { if (adapter == null) {
adapter = SimpleListItemAdapter(requireActivity()) { adapter = SimpleListItemAdapter(requireActivity()) {
onItemClick?.invoke(it) onItemClick?.invoke(it)
dismissAllowingStateLoss() dismissAllowingStateLoss()
} }
recycler_view.adapter = adapter binding.recyclerView.adapter = adapter
} }
return adapter return adapter
} }

View File

@ -1,24 +1,23 @@
package com.simplemobiletools.dialer.dialogs package com.simplemobiletools.dialer.dialogs
import android.view.ViewGroup
import androidx.appcompat.app.AlertDialog import androidx.appcompat.app.AlertDialog
import com.simplemobiletools.commons.extensions.* import com.simplemobiletools.commons.extensions.*
import com.simplemobiletools.dialer.R import com.simplemobiletools.dialer.R
import com.simplemobiletools.dialer.activities.SimpleActivity import com.simplemobiletools.dialer.activities.SimpleActivity
import kotlinx.android.synthetic.main.dialog_export_call_history.view.export_call_history_filename import com.simplemobiletools.dialer.databinding.DialogExportCallHistoryBinding
class ExportCallHistoryDialog(val activity: SimpleActivity, callback: (filename: String) -> Unit) { class ExportCallHistoryDialog(val activity: SimpleActivity, callback: (filename: String) -> Unit) {
init { init {
val view = (activity.layoutInflater.inflate(R.layout.dialog_export_call_history, null) as ViewGroup).apply { val binding = DialogExportCallHistoryBinding.inflate(activity.layoutInflater).apply {
export_call_history_filename.setText("call_history_${activity.getCurrentFormattedDateTime()}") exportCallHistoryFilename.setText("call_history_${activity.getCurrentFormattedDateTime()}")
} }
activity.getAlertDialogBuilder().setPositiveButton(R.string.ok, null).setNegativeButton(R.string.cancel, null).apply { activity.getAlertDialogBuilder().setPositiveButton(R.string.ok, null).setNegativeButton(R.string.cancel, null).apply {
activity.setupDialogStuff(view, this, R.string.export_call_history) { alertDialog -> activity.setupDialogStuff(binding.root, this, R.string.export_call_history) { alertDialog ->
alertDialog.getButton(AlertDialog.BUTTON_POSITIVE).setOnClickListener { alertDialog.getButton(AlertDialog.BUTTON_POSITIVE).setOnClickListener {
val filename = view.export_call_history_filename.value val filename = binding.exportCallHistoryFilename.value
when { when {
filename.isEmpty() -> activity.toast(R.string.empty_name) filename.isEmpty() -> activity.toast(R.string.empty_name)
filename.isAValidFilename() -> { filename.isAValidFilename() -> {

View File

@ -1,31 +1,30 @@
package com.simplemobiletools.dialer.dialogs package com.simplemobiletools.dialer.dialogs
import androidx.appcompat.app.AlertDialog import androidx.appcompat.app.AlertDialog
import com.simplemobiletools.commons.extensions.getAlertDialogBuilder import com.simplemobiletools.commons.extensions.*
import com.simplemobiletools.commons.extensions.getMyContactsCursor
import com.simplemobiletools.commons.extensions.setupDialogStuff
import com.simplemobiletools.commons.helpers.SMT_PRIVATE
import com.simplemobiletools.commons.extensions.getVisibleContactSources
import com.simplemobiletools.commons.helpers.ContactsHelper import com.simplemobiletools.commons.helpers.ContactsHelper
import com.simplemobiletools.commons.helpers.MyContactsContentProvider import com.simplemobiletools.commons.helpers.MyContactsContentProvider
import com.simplemobiletools.commons.models.contacts.* import com.simplemobiletools.commons.helpers.SMT_PRIVATE
import com.simplemobiletools.commons.models.contacts.Contact
import com.simplemobiletools.commons.models.contacts.ContactSource
import com.simplemobiletools.dialer.R import com.simplemobiletools.dialer.R
import com.simplemobiletools.dialer.activities.SimpleActivity import com.simplemobiletools.dialer.activities.SimpleActivity
import com.simplemobiletools.dialer.adapters.FilterContactSourcesAdapter import com.simplemobiletools.dialer.adapters.FilterContactSourcesAdapter
import com.simplemobiletools.dialer.databinding.DialogFilterContactSourcesBinding
import com.simplemobiletools.dialer.extensions.config import com.simplemobiletools.dialer.extensions.config
import kotlinx.android.synthetic.main.dialog_filter_contact_sources.view.*
class FilterContactSourcesDialog(val activity: SimpleActivity, private val callback: () -> Unit) { class FilterContactSourcesDialog(val activity: SimpleActivity, private val callback: () -> Unit) {
private val binding by activity.viewBinding(DialogFilterContactSourcesBinding::inflate)
private var dialog: AlertDialog? = null private var dialog: AlertDialog? = null
private val view = activity.layoutInflater.inflate(R.layout.dialog_filter_contact_sources, null)
private var contactSources = ArrayList<ContactSource>() private var contactSources = ArrayList<ContactSource>()
private var contacts = ArrayList<Contact>() private var contacts = ArrayList<Contact>()
private var isContactSourcesReady = false private var isContactSourcesReady = false
private var isContactsReady = false private var isContactsReady = false
init { init {
val contactHelper = ContactsHelper(activity) val contactHelper = ContactsHelper(activity)
contactHelper.getContactSources { contactSources -> contactHelper.getContactSources { contactSources ->
contactSources.mapTo(this@FilterContactSourcesDialog.contactSources) { it.copy() } contactSources.mapTo(this@FilterContactSourcesDialog.contactSources) { it.copy() }
isContactSourcesReady = true isContactSourcesReady = true
processDataIfReady() processDataIfReady()
@ -61,14 +60,14 @@ class FilterContactSourcesDialog(val activity: SimpleActivity, private val callb
activity.runOnUiThread { activity.runOnUiThread {
val selectedSources = activity.getVisibleContactSources() val selectedSources = activity.getVisibleContactSources()
view.filter_contact_sources_list.adapter = FilterContactSourcesAdapter(activity, contactSourcesWithCount, selectedSources) binding.filterContactSourcesList.adapter = FilterContactSourcesAdapter(activity, contactSourcesWithCount, selectedSources)
if (dialog == null) { if (dialog == null) {
activity.getAlertDialogBuilder() activity.getAlertDialogBuilder()
.setPositiveButton(R.string.ok) { dialogInterface, i -> confirmContactSources() } .setPositiveButton(R.string.ok) { dialogInterface, i -> confirmContactSources() }
.setNegativeButton(R.string.cancel, null) .setNegativeButton(R.string.cancel, null)
.apply { .apply {
activity.setupDialogStuff(view, this) { alertDialog -> activity.setupDialogStuff(binding.root, this) { alertDialog ->
dialog = alertDialog dialog = alertDialog
} }
} }
@ -77,7 +76,7 @@ class FilterContactSourcesDialog(val activity: SimpleActivity, private val callb
} }
private fun confirmContactSources() { private fun confirmContactSources() {
val selectedContactSources = (view.filter_contact_sources_list.adapter as FilterContactSourcesAdapter).getSelectedContactSources() val selectedContactSources = (binding.filterContactSourcesList.adapter as FilterContactSourcesAdapter).getSelectedContactSources()
val ignoredContactSources = contactSources.filter { !selectedContactSources.contains(it) }.map { val ignoredContactSources = contactSources.filter { !selectedContactSources.contains(it) }.map {
if (it.type == SMT_PRIVATE) SMT_PRIVATE else it.getFullIdentifier() if (it.type == SMT_PRIVATE) SMT_PRIVATE else it.getFullIdentifier()
}.toHashSet() }.toHashSet()

View File

@ -3,16 +3,18 @@ package com.simplemobiletools.dialer.dialogs
import com.simplemobiletools.commons.activities.BaseSimpleActivity import com.simplemobiletools.commons.activities.BaseSimpleActivity
import com.simplemobiletools.commons.extensions.getAlertDialogBuilder import com.simplemobiletools.commons.extensions.getAlertDialogBuilder
import com.simplemobiletools.commons.extensions.setupDialogStuff import com.simplemobiletools.commons.extensions.setupDialogStuff
import com.simplemobiletools.commons.extensions.viewBinding
import com.simplemobiletools.commons.helpers.TAB_CALL_HISTORY import com.simplemobiletools.commons.helpers.TAB_CALL_HISTORY
import com.simplemobiletools.commons.helpers.TAB_CONTACTS import com.simplemobiletools.commons.helpers.TAB_CONTACTS
import com.simplemobiletools.commons.helpers.TAB_FAVORITES import com.simplemobiletools.commons.helpers.TAB_FAVORITES
import com.simplemobiletools.commons.views.MyAppCompatCheckbox import com.simplemobiletools.commons.views.MyAppCompatCheckbox
import com.simplemobiletools.dialer.R import com.simplemobiletools.dialer.R
import com.simplemobiletools.dialer.databinding.DialogManageVisibleTabsBinding
import com.simplemobiletools.dialer.extensions.config import com.simplemobiletools.dialer.extensions.config
import com.simplemobiletools.dialer.helpers.ALL_TABS_MASK import com.simplemobiletools.dialer.helpers.ALL_TABS_MASK
class ManageVisibleTabsDialog(val activity: BaseSimpleActivity) { class ManageVisibleTabsDialog(val activity: BaseSimpleActivity) {
private var view = activity.layoutInflater.inflate(R.layout.dialog_manage_visible_tabs, null) private val binding by activity.viewBinding(DialogManageVisibleTabsBinding::inflate)
private val tabs = LinkedHashMap<Int, Int>() private val tabs = LinkedHashMap<Int, Int>()
init { init {
@ -24,21 +26,21 @@ class ManageVisibleTabsDialog(val activity: BaseSimpleActivity) {
val showTabs = activity.config.showTabs val showTabs = activity.config.showTabs
for ((key, value) in tabs) { for ((key, value) in tabs) {
view.findViewById<MyAppCompatCheckbox>(value).isChecked = showTabs and key != 0 binding.root.findViewById<MyAppCompatCheckbox>(value).isChecked = showTabs and key != 0
} }
activity.getAlertDialogBuilder() activity.getAlertDialogBuilder()
.setPositiveButton(R.string.ok) { dialog, which -> dialogConfirmed() } .setPositiveButton(R.string.ok) { dialog, which -> dialogConfirmed() }
.setNegativeButton(R.string.cancel, null) .setNegativeButton(R.string.cancel, null)
.apply { .apply {
activity.setupDialogStuff(view, this) activity.setupDialogStuff(binding.root, this)
} }
} }
private fun dialogConfirmed() { private fun dialogConfirmed() {
var result = 0 var result = 0
for ((key, value) in tabs) { for ((key, value) in tabs) {
if (view.findViewById<MyAppCompatCheckbox>(value).isChecked) { if (binding.root.findViewById<MyAppCompatCheckbox>(value).isChecked) {
result += key result += key
} }
} }

View File

@ -2,9 +2,7 @@ package com.simplemobiletools.dialer.dialogs
import android.graphics.Color import android.graphics.Color
import android.view.KeyEvent import android.view.KeyEvent
import android.view.View
import android.view.inputmethod.EditorInfo import android.view.inputmethod.EditorInfo
import android.widget.EditText
import android.widget.ImageView import android.widget.ImageView
import androidx.appcompat.app.AlertDialog import androidx.appcompat.app.AlertDialog
import com.reddit.indicatorfastscroll.FastScrollItemIndicator import com.reddit.indicatorfastscroll.FastScrollItemIndicator
@ -14,27 +12,25 @@ import com.simplemobiletools.commons.views.MySearchMenu
import com.simplemobiletools.dialer.R import com.simplemobiletools.dialer.R
import com.simplemobiletools.dialer.activities.SimpleActivity import com.simplemobiletools.dialer.activities.SimpleActivity
import com.simplemobiletools.dialer.adapters.ContactsAdapter import com.simplemobiletools.dialer.adapters.ContactsAdapter
import kotlinx.android.synthetic.main.dialog_select_contact.view.* import com.simplemobiletools.dialer.databinding.DialogSelectContactBinding
import java.util.Locale import java.util.Locale
class SelectContactDialog(val activity: SimpleActivity, val contacts: List<Contact>, val callback: (selectedContact: Contact) -> Unit) { class SelectContactDialog(val activity: SimpleActivity, val contacts: List<Contact>, val callback: (selectedContact: Contact) -> Unit) {
private val binding by activity.viewBinding(DialogSelectContactBinding::inflate)
private var dialog: AlertDialog? = null private var dialog: AlertDialog? = null
private var view = activity.layoutInflater.inflate(R.layout.dialog_select_contact, null)
private val searchView = view.contact_search_view
private val searchEditText = view.findViewById<EditText>(R.id.top_toolbar_search)
private val searchViewAppBarLayout = view.findViewById<View>(R.id.top_app_bar_layout)
init { init {
view.apply { binding.apply {
letter_fastscroller.textColor = context.getProperTextColor().getColorStateList() letterFastscroller.textColor = activity.getProperTextColor().getColorStateList()
letter_fastscroller_thumb.setupWithFastScroller(letter_fastscroller) letterFastscrollerThumb.setupWithFastScroller(letterFastscroller)
letter_fastscroller_thumb.textColor = context.getProperPrimaryColor().getContrastColor() letterFastscrollerThumb.textColor = activity.getProperPrimaryColor().getContrastColor()
letter_fastscroller_thumb.thumbColor = context.getProperPrimaryColor().getColorStateList() letterFastscrollerThumb.thumbColor = activity.getProperPrimaryColor().getColorStateList()
setupLetterFastScroller(contacts) setupLetterFastScroller(contacts)
configureSearchView() configureSearchView()
select_contact_list.adapter = ContactsAdapter(activity, contacts.toMutableList(), select_contact_list, allowLongClick = false) { selectContactList.adapter = ContactsAdapter(activity, contacts.toMutableList(), selectContactList, allowLongClick = false) {
callback(it as Contact) callback(it as Contact)
dialog?.dismiss() dialog?.dismiss()
} }
@ -49,14 +45,14 @@ class SelectContactDialog(val activity: SimpleActivity, val contacts: List<Conta
true true
} }
.apply { .apply {
activity.setupDialogStuff(view, this, R.string.choose_contact) { alertDialog -> activity.setupDialogStuff(binding.root, this, R.string.choose_contact) { alertDialog ->
dialog = alertDialog dialog = alertDialog
} }
} }
} }
private fun setupLetterFastScroller(contacts: List<Contact>) { private fun setupLetterFastScroller(contacts: List<Contact>) {
view.letter_fastscroller.setupWithRecyclerView(view.select_contact_list, { position -> binding.letterFastscroller.setupWithRecyclerView(binding.selectContactList, { position ->
try { try {
val name = contacts[position].getNameToDisplay() val name = contacts[position].getNameToDisplay()
val character = if (name.isNotEmpty()) name.substring(0, 1) else "" val character = if (name.isNotEmpty()) name.substring(0, 1) else ""
@ -67,9 +63,9 @@ class SelectContactDialog(val activity: SimpleActivity, val contacts: List<Conta
}) })
} }
private fun configureSearchView() = with(searchView) { private fun configureSearchView() = with(binding.contactSearchView) {
updateHintText(context.getString(R.string.search_contacts)) updateHintText(context.getString(R.string.search_contacts))
searchEditText.imeOptions = EditorInfo.IME_ACTION_DONE binding.topToolbarSearch.imeOptions = EditorInfo.IME_ACTION_DONE
toggleHideOnScroll(true) toggleHideOnScroll(true)
setupMenu() setupMenu()
@ -81,7 +77,7 @@ class SelectContactDialog(val activity: SimpleActivity, val contacts: List<Conta
getToolbar().beInvisible() getToolbar().beInvisible()
updateColors() updateColors()
setBackgroundColor(Color.TRANSPARENT) setBackgroundColor(Color.TRANSPARENT)
searchViewAppBarLayout.setBackgroundColor(Color.TRANSPARENT) binding.topAppBarLayout.setBackgroundColor(Color.TRANSPARENT)
} }
private fun MySearchMenu.setSearchViewListeners() { private fun MySearchMenu.setSearchViewListeners() {
@ -89,8 +85,8 @@ class SelectContactDialog(val activity: SimpleActivity, val contacts: List<Conta
updateSearchViewLeftIcon(R.drawable.ic_cross_vector) updateSearchViewLeftIcon(R.drawable.ic_cross_vector)
} }
onSearchClosedListener = { onSearchClosedListener = {
searchEditText.clearFocus() binding.topToolbarSearch.clearFocus()
activity.hideKeyboard(searchEditText) activity.hideKeyboard(binding.topToolbarSearch)
updateSearchViewLeftIcon(R.drawable.ic_search_vector) updateSearchViewLeftIcon(R.drawable.ic_search_vector)
} }
@ -99,14 +95,14 @@ class SelectContactDialog(val activity: SimpleActivity, val contacts: List<Conta
} }
} }
private fun updateSearchViewLeftIcon(iconResId: Int) = with(view.findViewById<ImageView>(R.id.top_toolbar_search_icon)) { private fun updateSearchViewLeftIcon(iconResId: Int) = with(binding.root.findViewById<ImageView>(R.id.top_toolbar_search_icon)) {
post { post {
setImageResource(iconResId) setImageResource(iconResId)
} }
} }
private fun filterContactListBySearchQuery(query: String) { private fun filterContactListBySearchQuery(query: String) {
val adapter = view.select_contact_list.adapter as? ContactsAdapter val adapter = binding.selectContactList.adapter as? ContactsAdapter
var contactsToShow = contacts var contactsToShow = contacts
if (query.isNotEmpty()) { if (query.isNotEmpty()) {
contactsToShow = contacts.filter { it.name.contains(query, true) } contactsToShow = contacts.filter { it.name.contains(query, true) }
@ -117,7 +113,7 @@ class SelectContactDialog(val activity: SimpleActivity, val contacts: List<Conta
adapter?.updateItems(contactsToShow) adapter?.updateItems(contactsToShow)
setupLetterFastScroller(contactsToShow) setupLetterFastScroller(contactsToShow)
view.select_contact_list.apply { binding.selectContactList.apply {
post { post {
scrollToPosition(0) scrollToPosition(0)
} }
@ -125,20 +121,20 @@ class SelectContactDialog(val activity: SimpleActivity, val contacts: List<Conta
} }
} }
private fun checkPlaceholderVisibility(contacts: List<Contact>) = with(view) { private fun checkPlaceholderVisibility(contacts: List<Contact>) = with(binding) {
contacts_empty_placeholder.beVisibleIf(contacts.isEmpty()) contactsEmptyPlaceholder.beVisibleIf(contacts.isEmpty())
if (contact_search_view.isSearchOpen) { if (contactSearchView.isSearchOpen) {
contacts_empty_placeholder.text = context.getString(R.string.no_items_found) contactsEmptyPlaceholder.text = activity.getString(R.string.no_items_found)
} }
letter_fastscroller.beVisibleIf(contacts_empty_placeholder.isGone()) letterFastscroller.beVisibleIf(contactsEmptyPlaceholder.isGone())
letter_fastscroller_thumb.beVisibleIf(contacts_empty_placeholder.isGone()) letterFastscrollerThumb.beVisibleIf(contactsEmptyPlaceholder.isGone())
} }
private fun backPressed() { private fun backPressed() {
if (searchView.isSearchOpen) { if (binding.contactSearchView.isSearchOpen) {
searchView.closeSearch() binding.contactSearchView.closeSearch()
} else { } else {
dialog?.dismiss() dialog?.dismiss()
} }

View File

@ -9,10 +9,11 @@ import androidx.appcompat.app.AlertDialog
import com.simplemobiletools.commons.activities.BaseSimpleActivity import com.simplemobiletools.commons.activities.BaseSimpleActivity
import com.simplemobiletools.commons.extensions.getAlertDialogBuilder import com.simplemobiletools.commons.extensions.getAlertDialogBuilder
import com.simplemobiletools.commons.extensions.setupDialogStuff import com.simplemobiletools.commons.extensions.setupDialogStuff
import com.simplemobiletools.commons.extensions.viewBinding
import com.simplemobiletools.dialer.R import com.simplemobiletools.dialer.R
import com.simplemobiletools.dialer.databinding.DialogSelectSimBinding
import com.simplemobiletools.dialer.extensions.config import com.simplemobiletools.dialer.extensions.config
import com.simplemobiletools.dialer.extensions.getAvailableSIMCardLabels import com.simplemobiletools.dialer.extensions.getAvailableSIMCardLabels
import kotlinx.android.synthetic.main.dialog_select_sim.view.*
@SuppressLint("MissingPermission") @SuppressLint("MissingPermission")
class SelectSIMDialog( class SelectSIMDialog(
@ -22,14 +23,11 @@ class SelectSIMDialog(
val callback: (handle: PhoneAccountHandle?) -> Unit val callback: (handle: PhoneAccountHandle?) -> Unit
) { ) {
private var dialog: AlertDialog? = null private var dialog: AlertDialog? = null
private val view = activity.layoutInflater.inflate(R.layout.dialog_select_sim, null) private val binding by activity.viewBinding(DialogSelectSimBinding::inflate)
init { init {
val radioGroup = view.select_sim_radio_group binding.selectSimRememberHolder.setOnClickListener {
view.apply { binding.selectSimRemember.toggle()
select_sim_remember_holder.setOnClickListener {
select_sim_remember.toggle()
}
} }
activity.getAvailableSIMCardLabels().forEachIndexed { index, SIMAccount -> activity.getAvailableSIMCardLabels().forEachIndexed { index, SIMAccount ->
@ -38,12 +36,12 @@ class SelectSIMDialog(
id = index id = index
setOnClickListener { selectedSIM(SIMAccount.handle) } setOnClickListener { selectedSIM(SIMAccount.handle) }
} }
radioGroup!!.addView(radioButton, RadioGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT)) binding.selectSimRadioGroup.addView(radioButton, RadioGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT))
} }
activity.getAlertDialogBuilder() activity.getAlertDialogBuilder()
.apply { .apply {
activity.setupDialogStuff(view, this) { alertDialog -> activity.setupDialogStuff(binding.root, this) { alertDialog ->
dialog = alertDialog dialog = alertDialog
} }
} }
@ -54,7 +52,7 @@ class SelectSIMDialog(
} }
private fun selectedSIM(handle: PhoneAccountHandle) { private fun selectedSIM(handle: PhoneAccountHandle) {
if (view.select_sim_remember.isChecked) { if (binding.selectSimRemember.isChecked) {
activity.config.saveCustomSIM(phoneNumber, handle) activity.config.saveCustomSIM(phoneNumber, handle)
} }

View File

@ -4,33 +4,31 @@ import androidx.appcompat.app.AlertDialog
import com.simplemobiletools.commons.activities.BaseSimpleActivity import com.simplemobiletools.commons.activities.BaseSimpleActivity
import com.simplemobiletools.commons.extensions.getAlertDialogBuilder import com.simplemobiletools.commons.extensions.getAlertDialogBuilder
import com.simplemobiletools.commons.extensions.setupDialogStuff import com.simplemobiletools.commons.extensions.setupDialogStuff
import com.simplemobiletools.dialer.R import com.simplemobiletools.commons.extensions.viewBinding
import com.simplemobiletools.dialer.activities.SimpleActivity import com.simplemobiletools.dialer.activities.SimpleActivity
import com.simplemobiletools.dialer.adapters.RecentCallsAdapter import com.simplemobiletools.dialer.adapters.RecentCallsAdapter
import com.simplemobiletools.dialer.databinding.DialogShowGroupedCallsBinding
import com.simplemobiletools.dialer.helpers.RecentsHelper import com.simplemobiletools.dialer.helpers.RecentsHelper
import com.simplemobiletools.dialer.models.RecentCall import com.simplemobiletools.dialer.models.RecentCall
import kotlinx.android.synthetic.main.dialog_show_grouped_calls.view.*
class ShowGroupedCallsDialog(val activity: BaseSimpleActivity, callIds: ArrayList<Int>) { class ShowGroupedCallsDialog(val activity: BaseSimpleActivity, callIds: ArrayList<Int>) {
private var dialog: AlertDialog? = null private var dialog: AlertDialog? = null
private var view = activity.layoutInflater.inflate(R.layout.dialog_show_grouped_calls, null) private val binding by activity.viewBinding(DialogShowGroupedCallsBinding::inflate)
init { init {
view.apply { RecentsHelper(activity).getRecentCalls(false) { allRecents ->
RecentsHelper(activity).getRecentCalls(false) { allRecents -> val recents = allRecents.filter { callIds.contains(it.id) }.toMutableList() as ArrayList<RecentCall>
val recents = allRecents.filter { callIds.contains(it.id) }.toMutableList() as ArrayList<RecentCall> activity.runOnUiThread {
activity.runOnUiThread { RecentCallsAdapter(activity as SimpleActivity, recents, binding.selectGroupedCallsList, null, false) {
RecentCallsAdapter(activity as SimpleActivity, recents, select_grouped_calls_list, null, false) { }.apply {
}.apply { binding.selectGroupedCallsList.adapter = this
select_grouped_calls_list.adapter = this
}
} }
} }
} }
activity.getAlertDialogBuilder() activity.getAlertDialogBuilder()
.apply { .apply {
activity.setupDialogStuff(view, this) { alertDialog -> activity.setupDialogStuff(binding.root, this) { alertDialog ->
dialog = alertDialog dialog = alertDialog
} }
} }

View File

@ -11,15 +11,24 @@ import com.simplemobiletools.dialer.R
import com.simplemobiletools.dialer.activities.MainActivity import com.simplemobiletools.dialer.activities.MainActivity
import com.simplemobiletools.dialer.activities.SimpleActivity import com.simplemobiletools.dialer.activities.SimpleActivity
import com.simplemobiletools.dialer.adapters.ContactsAdapter import com.simplemobiletools.dialer.adapters.ContactsAdapter
import com.simplemobiletools.dialer.databinding.FragmentContactsBinding
import com.simplemobiletools.dialer.databinding.FragmentLettersLayoutBinding
import com.simplemobiletools.dialer.extensions.launchCreateNewContactIntent import com.simplemobiletools.dialer.extensions.launchCreateNewContactIntent
import com.simplemobiletools.dialer.extensions.startContactDetailsIntent import com.simplemobiletools.dialer.extensions.startContactDetailsIntent
import com.simplemobiletools.dialer.interfaces.RefreshItemsListener import com.simplemobiletools.dialer.interfaces.RefreshItemsListener
import kotlinx.android.synthetic.main.fragment_letters_layout.view.*
import java.util.Locale import java.util.Locale
class ContactsFragment(context: Context, attributeSet: AttributeSet) : MyViewPagerFragment(context, attributeSet), RefreshItemsListener { class ContactsFragment(context: Context, attributeSet: AttributeSet) : MyViewPagerFragment<MyViewPagerFragment.LettersInnerBinding>(context, attributeSet),
RefreshItemsListener {
private lateinit var binding: FragmentLettersLayoutBinding
private var allContacts = ArrayList<Contact>() private var allContacts = ArrayList<Contact>()
override fun onFinishInflate() {
super.onFinishInflate()
binding = FragmentLettersLayoutBinding.bind(FragmentContactsBinding.bind(this).contactsFragment)
innerBinding = LettersInnerBinding(binding)
}
override fun setupFragment() { override fun setupFragment() {
val placeholderResId = if (context.hasPermission(PERMISSION_READ_CONTACTS)) { val placeholderResId = if (context.hasPermission(PERMISSION_READ_CONTACTS)) {
R.string.no_contacts_found R.string.no_contacts_found
@ -27,7 +36,7 @@ class ContactsFragment(context: Context, attributeSet: AttributeSet) : MyViewPag
R.string.could_not_access_contacts R.string.could_not_access_contacts
} }
fragment_placeholder.text = context.getString(placeholderResId) binding.fragmentPlaceholder.text = context.getString(placeholderResId)
val placeholderActionResId = if (context.hasPermission(PERMISSION_READ_CONTACTS)) { val placeholderActionResId = if (context.hasPermission(PERMISSION_READ_CONTACTS)) {
R.string.create_new_contact R.string.create_new_contact
@ -35,7 +44,7 @@ class ContactsFragment(context: Context, attributeSet: AttributeSet) : MyViewPag
R.string.request_access R.string.request_access
} }
fragment_placeholder_2.apply { binding.fragmentPlaceholder2.apply {
text = context.getString(placeholderActionResId) text = context.getString(placeholderActionResId)
underlineText() underlineText()
setOnClickListener { setOnClickListener {
@ -49,15 +58,17 @@ class ContactsFragment(context: Context, attributeSet: AttributeSet) : MyViewPag
} }
override fun setupColors(textColor: Int, primaryColor: Int, properPrimaryColor: Int) { override fun setupColors(textColor: Int, primaryColor: Int, properPrimaryColor: Int) {
(fragment_list?.adapter as? MyRecyclerViewAdapter)?.updateTextColor(textColor) binding.apply {
fragment_placeholder.setTextColor(textColor) (fragmentList?.adapter as? MyRecyclerViewAdapter)?.updateTextColor(textColor)
fragment_placeholder_2.setTextColor(properPrimaryColor) fragmentPlaceholder.setTextColor(textColor)
fragmentPlaceholder2.setTextColor(properPrimaryColor)
letter_fastscroller.textColor = textColor.getColorStateList() letterFastscroller.textColor = textColor.getColorStateList()
letter_fastscroller.pressedTextColor = properPrimaryColor letterFastscroller.pressedTextColor = properPrimaryColor
letter_fastscroller_thumb.setupWithFastScroller(letter_fastscroller) letterFastscrollerThumb.setupWithFastScroller(letterFastscroller)
letter_fastscroller_thumb.textColor = properPrimaryColor.getContrastColor() letterFastscrollerThumb.textColor = properPrimaryColor.getContrastColor()
letter_fastscroller_thumb.thumbColor = properPrimaryColor.getColorStateList() letterFastscrollerThumb.thumbColor = properPrimaryColor.getColorStateList()
}
} }
override fun refreshItems(callback: (() -> Unit)?) { override fun refreshItems(callback: (() -> Unit)?) {
@ -84,39 +95,42 @@ class ContactsFragment(context: Context, attributeSet: AttributeSet) : MyViewPag
private fun gotContacts(contacts: ArrayList<Contact>) { private fun gotContacts(contacts: ArrayList<Contact>) {
setupLetterFastScroller(contacts) setupLetterFastScroller(contacts)
if (contacts.isEmpty()) { if (contacts.isEmpty()) {
fragment_placeholder.beVisible() binding.apply {
fragment_placeholder_2.beVisible() fragmentPlaceholder.beVisible()
fragment_list.beGone() fragmentPlaceholder2.beVisible()
fragmentList.beGone()
}
} else { } else {
fragment_placeholder.beGone() binding.apply {
fragment_placeholder_2.beGone() fragmentPlaceholder.beGone()
fragment_list.beVisible() fragmentPlaceholder2.beGone()
fragmentList.beVisible()
}
val currAdapter = fragment_list.adapter if (binding.fragmentList.adapter == null) {
if (currAdapter == null) {
ContactsAdapter( ContactsAdapter(
activity = activity as SimpleActivity, activity = activity as SimpleActivity,
contacts = contacts, contacts = contacts,
recyclerView = fragment_list, recyclerView = binding.fragmentList,
refreshItemsListener = this refreshItemsListener = this
) { ) {
val contact = it as Contact val contact = it as Contact
activity?.startContactDetailsIntent(contact) activity?.startContactDetailsIntent(contact)
}.apply { }.apply {
fragment_list.adapter = this binding.fragmentList.adapter = this
} }
if (context.areSystemAnimationsEnabled) { if (context.areSystemAnimationsEnabled) {
fragment_list.scheduleLayoutAnimation() binding.fragmentList.scheduleLayoutAnimation()
} }
} else { } else {
(currAdapter as ContactsAdapter).updateItems(contacts) (binding.fragmentList.adapter as ContactsAdapter).updateItems(contacts)
} }
} }
} }
private fun setupLetterFastScroller(contacts: ArrayList<Contact>) { private fun setupLetterFastScroller(contacts: ArrayList<Contact>) {
letter_fastscroller.setupWithRecyclerView(fragment_list, { position -> binding.letterFastscroller.setupWithRecyclerView(binding.fragmentList, { position ->
try { try {
val name = contacts[position].getNameToDisplay() val name = contacts[position].getNameToDisplay()
val character = if (name.isNotEmpty()) name.substring(0, 1) else "" val character = if (name.isNotEmpty()) name.substring(0, 1) else ""
@ -128,8 +142,8 @@ class ContactsFragment(context: Context, attributeSet: AttributeSet) : MyViewPag
} }
override fun onSearchClosed() { override fun onSearchClosed() {
fragment_placeholder.beVisibleIf(allContacts.isEmpty()) binding.fragmentPlaceholder.beVisibleIf(allContacts.isEmpty())
(fragment_list.adapter as? ContactsAdapter)?.updateItems(allContacts) (binding.fragmentList.adapter as? ContactsAdapter)?.updateItems(allContacts)
setupLetterFastScroller(allContacts) setupLetterFastScroller(allContacts)
} }
@ -155,16 +169,16 @@ class ContactsFragment(context: Context, attributeSet: AttributeSet) : MyViewPag
!getProperText(nameToDisplay, shouldNormalize).startsWith(text, true) && !nameToDisplay.contains(text, true) !getProperText(nameToDisplay, shouldNormalize).startsWith(text, true) && !nameToDisplay.contains(text, true)
} }
fragment_placeholder.beVisibleIf(filtered.isEmpty()) binding.fragmentPlaceholder.beVisibleIf(filtered.isEmpty())
(fragment_list.adapter as? ContactsAdapter)?.updateItems(filtered, text) (binding.fragmentList.adapter as? ContactsAdapter)?.updateItems(filtered, text)
setupLetterFastScroller(filtered) setupLetterFastScroller(filtered)
} }
private fun requestReadContactsPermission() { private fun requestReadContactsPermission() {
activity?.handlePermission(PERMISSION_READ_CONTACTS) { activity?.handlePermission(PERMISSION_READ_CONTACTS) {
if (it) { if (it) {
fragment_placeholder.text = context.getString(R.string.no_contacts_found) binding.fragmentPlaceholder.text = context.getString(R.string.no_contacts_found)
fragment_placeholder_2.text = context.getString(R.string.create_new_contact) binding.fragmentPlaceholder2.text = context.getString(R.string.create_new_contact)
ContactsHelper(context).getContacts(showOnlyContactsWithNumbers = true) { contacts -> ContactsHelper(context).getContacts(showOnlyContactsWithNumbers = true) { contacts ->
activity?.runOnUiThread { activity?.runOnUiThread {
gotContacts(contacts) gotContacts(contacts)

View File

@ -14,15 +14,24 @@ import com.simplemobiletools.commons.views.MyLinearLayoutManager
import com.simplemobiletools.dialer.R import com.simplemobiletools.dialer.R
import com.simplemobiletools.dialer.activities.SimpleActivity import com.simplemobiletools.dialer.activities.SimpleActivity
import com.simplemobiletools.dialer.adapters.ContactsAdapter import com.simplemobiletools.dialer.adapters.ContactsAdapter
import com.simplemobiletools.dialer.databinding.FragmentFavoritesBinding
import com.simplemobiletools.dialer.databinding.FragmentLettersLayoutBinding
import com.simplemobiletools.dialer.extensions.config import com.simplemobiletools.dialer.extensions.config
import com.simplemobiletools.dialer.helpers.Converters import com.simplemobiletools.dialer.helpers.Converters
import com.simplemobiletools.dialer.interfaces.RefreshItemsListener import com.simplemobiletools.dialer.interfaces.RefreshItemsListener
import kotlinx.android.synthetic.main.fragment_letters_layout.view.*
import java.util.Locale import java.util.Locale
class FavoritesFragment(context: Context, attributeSet: AttributeSet) : MyViewPagerFragment(context, attributeSet), RefreshItemsListener { class FavoritesFragment(context: Context, attributeSet: AttributeSet) : MyViewPagerFragment<MyViewPagerFragment.LettersInnerBinding>(context, attributeSet),
RefreshItemsListener {
private lateinit var binding: FragmentLettersLayoutBinding
private var allContacts = ArrayList<Contact>() private var allContacts = ArrayList<Contact>()
override fun onFinishInflate() {
super.onFinishInflate()
binding = FragmentLettersLayoutBinding.bind(FragmentFavoritesBinding.bind(this).favoritesFragment)
innerBinding = LettersInnerBinding(binding)
}
override fun setupFragment() { override fun setupFragment() {
val placeholderResId = if (context.hasPermission(PERMISSION_READ_CONTACTS)) { val placeholderResId = if (context.hasPermission(PERMISSION_READ_CONTACTS)) {
R.string.no_contacts_found R.string.no_contacts_found
@ -30,19 +39,21 @@ class FavoritesFragment(context: Context, attributeSet: AttributeSet) : MyViewPa
R.string.could_not_access_contacts R.string.could_not_access_contacts
} }
fragment_placeholder.text = context.getString(placeholderResId) binding.fragmentPlaceholder.text = context.getString(placeholderResId)
fragment_placeholder_2.beGone() binding.fragmentPlaceholder2.beGone()
} }
override fun setupColors(textColor: Int, primaryColor: Int, properPrimaryColor: Int) { override fun setupColors(textColor: Int, primaryColor: Int, properPrimaryColor: Int) {
fragment_placeholder.setTextColor(textColor) binding.apply {
(fragment_list?.adapter as? MyRecyclerViewAdapter)?.updateTextColor(textColor) fragmentPlaceholder.setTextColor(textColor)
(fragmentList.adapter as? MyRecyclerViewAdapter)?.updateTextColor(textColor)
letter_fastscroller.textColor = textColor.getColorStateList() letterFastscroller.textColor = textColor.getColorStateList()
letter_fastscroller.pressedTextColor = properPrimaryColor letterFastscroller.pressedTextColor = properPrimaryColor
letter_fastscroller_thumb.setupWithFastScroller(letter_fastscroller) letterFastscrollerThumb.setupWithFastScroller(letterFastscroller)
letter_fastscroller_thumb.textColor = properPrimaryColor.getContrastColor() letterFastscrollerThumb.textColor = properPrimaryColor.getContrastColor()
letter_fastscroller_thumb.thumbColor = properPrimaryColor.getColorStateList() letterFastscrollerThumb.thumbColor = properPrimaryColor.getColorStateList()
}
} }
override fun refreshItems(callback: (() -> Unit)?) { override fun refreshItems(callback: (() -> Unit)?) {
@ -76,14 +87,16 @@ class FavoritesFragment(context: Context, attributeSet: AttributeSet) : MyViewPa
private fun gotContacts(contacts: ArrayList<Contact>) { private fun gotContacts(contacts: ArrayList<Contact>) {
setupLetterFastScroller(contacts) setupLetterFastScroller(contacts)
if (contacts.isEmpty()) { binding.apply {
fragment_placeholder.beVisible() if (contacts.isEmpty()) {
fragment_list.beGone() fragmentPlaceholder.beVisible()
} else { fragmentList.beGone()
fragment_placeholder.beGone() } else {
fragment_list.beVisible() fragmentPlaceholder.beGone()
fragmentList.beVisible()
updateListAdapter() updateListAdapter()
}
} }
} }
@ -91,12 +104,12 @@ class FavoritesFragment(context: Context, attributeSet: AttributeSet) : MyViewPa
val viewType = context.config.viewType val viewType = context.config.viewType
setViewType(viewType) setViewType(viewType)
val currAdapter = fragment_list.adapter as ContactsAdapter? val currAdapter = binding.fragmentList.adapter as ContactsAdapter?
if (currAdapter == null) { if (currAdapter == null) {
ContactsAdapter( ContactsAdapter(
activity = activity as SimpleActivity, activity = activity as SimpleActivity,
contacts = allContacts, contacts = allContacts,
recyclerView = fragment_list, recyclerView = binding.fragmentList,
refreshItemsListener = this, refreshItemsListener = this,
viewType = viewType, viewType = viewType,
showDeleteButton = false, showDeleteButton = false,
@ -114,10 +127,10 @@ class FavoritesFragment(context: Context, attributeSet: AttributeSet) : MyViewPa
} }
} }
}.apply { }.apply {
fragment_list.adapter = this binding.fragmentList.adapter = this
onDragEndListener = { onDragEndListener = {
val adapter = fragment_list?.adapter val adapter = binding.fragmentList.adapter
if (adapter is ContactsAdapter) { if (adapter is ContactsAdapter) {
val items = adapter.contacts val items = adapter.contacts
saveCustomOrderToPrefs(items) saveCustomOrderToPrefs(items)
@ -131,7 +144,7 @@ class FavoritesFragment(context: Context, attributeSet: AttributeSet) : MyViewPa
} }
if (context.areSystemAnimationsEnabled) { if (context.areSystemAnimationsEnabled) {
fragment_list.scheduleLayoutAnimation() binding.fragmentList.scheduleLayoutAnimation()
} }
} else { } else {
currAdapter.viewType = viewType currAdapter.viewType = viewType
@ -140,8 +153,8 @@ class FavoritesFragment(context: Context, attributeSet: AttributeSet) : MyViewPa
} }
fun columnCountChanged() { fun columnCountChanged() {
(fragment_list.layoutManager as MyGridLayoutManager).spanCount = context!!.config.contactsGridColumnCount (binding.fragmentList.layoutManager as MyGridLayoutManager).spanCount = context!!.config.contactsGridColumnCount
fragment_list?.adapter?.apply { binding.fragmentList.adapter?.apply {
notifyItemRangeChanged(0, allContacts.size) notifyItemRangeChanged(0, allContacts.size)
} }
} }
@ -169,7 +182,7 @@ class FavoritesFragment(context: Context, attributeSet: AttributeSet) : MyViewPa
} }
private fun setupLetterFastScroller(contacts: List<Contact>) { private fun setupLetterFastScroller(contacts: List<Contact>) {
letter_fastscroller.setupWithRecyclerView(fragment_list, { position -> binding.letterFastscroller.setupWithRecyclerView(binding.fragmentList, { position ->
try { try {
val name = contacts[position].getNameToDisplay() val name = contacts[position].getNameToDisplay()
val character = if (name.isNotEmpty()) name.substring(0, 1) else "" val character = if (name.isNotEmpty()) name.substring(0, 1) else ""
@ -181,8 +194,8 @@ class FavoritesFragment(context: Context, attributeSet: AttributeSet) : MyViewPa
} }
override fun onSearchClosed() { override fun onSearchClosed() {
fragment_placeholder.beVisibleIf(allContacts.isEmpty()) binding.fragmentPlaceholder.beVisibleIf(allContacts.isEmpty())
(fragment_list.adapter as? ContactsAdapter)?.updateItems(allContacts) (binding.fragmentList.adapter as? ContactsAdapter)?.updateItems(allContacts)
setupLetterFastScroller(allContacts) setupLetterFastScroller(allContacts)
} }
@ -193,8 +206,8 @@ class FavoritesFragment(context: Context, attributeSet: AttributeSet) : MyViewPa
it.name.startsWith(text, true) it.name.startsWith(text, true)
}.toMutableList() as ArrayList<Contact> }.toMutableList() as ArrayList<Contact>
fragment_placeholder.beVisibleIf(contacts.isEmpty()) binding.fragmentPlaceholder.beVisibleIf(contacts.isEmpty())
(fragment_list.adapter as? ContactsAdapter)?.updateItems(contacts, text) (binding.fragmentList.adapter as? ContactsAdapter)?.updateItems(contacts, text)
setupLetterFastScroller(contacts) setupLetterFastScroller(contacts)
} }
@ -202,12 +215,12 @@ class FavoritesFragment(context: Context, attributeSet: AttributeSet) : MyViewPa
val spanCount = context.config.contactsGridColumnCount val spanCount = context.config.contactsGridColumnCount
val layoutManager = if (viewType == VIEW_TYPE_GRID) { val layoutManager = if (viewType == VIEW_TYPE_GRID) {
letter_fastscroller.beGone() binding.letterFastscroller.beGone()
MyGridLayoutManager(context, spanCount) MyGridLayoutManager(context, spanCount)
} else { } else {
letter_fastscroller.beVisible() binding.letterFastscroller.beVisible()
MyLinearLayoutManager(context) MyLinearLayoutManager(context)
} }
fragment_list.layoutManager = layoutManager binding.fragmentList.layoutManager = layoutManager
} }
} }

View File

@ -9,18 +9,20 @@ import com.simplemobiletools.commons.extensions.getProperTextColor
import com.simplemobiletools.commons.extensions.getTextSize import com.simplemobiletools.commons.extensions.getTextSize
import com.simplemobiletools.commons.helpers.SORT_BY_FIRST_NAME import com.simplemobiletools.commons.helpers.SORT_BY_FIRST_NAME
import com.simplemobiletools.commons.helpers.SORT_BY_SURNAME import com.simplemobiletools.commons.helpers.SORT_BY_SURNAME
import com.simplemobiletools.commons.views.MyRecyclerView
import com.simplemobiletools.dialer.activities.MainActivity import com.simplemobiletools.dialer.activities.MainActivity
import com.simplemobiletools.dialer.activities.SimpleActivity import com.simplemobiletools.dialer.activities.SimpleActivity
import com.simplemobiletools.dialer.adapters.ContactsAdapter import com.simplemobiletools.dialer.adapters.ContactsAdapter
import com.simplemobiletools.dialer.adapters.RecentCallsAdapter import com.simplemobiletools.dialer.adapters.RecentCallsAdapter
import com.simplemobiletools.dialer.databinding.FragmentLettersLayoutBinding
import com.simplemobiletools.dialer.databinding.FragmentRecentsBinding
import com.simplemobiletools.dialer.extensions.config import com.simplemobiletools.dialer.extensions.config
import com.simplemobiletools.dialer.helpers.Config import com.simplemobiletools.dialer.helpers.Config
import kotlinx.android.synthetic.main.fragment_letters_layout.view.fragment_list
import kotlinx.android.synthetic.main.fragment_recents.view.recents_list
abstract class MyViewPagerFragment(context: Context, attributeSet: AttributeSet) : RelativeLayout(context, attributeSet) { abstract class MyViewPagerFragment<BINDING : MyViewPagerFragment.InnerBinding>(context: Context, attributeSet: AttributeSet) :
RelativeLayout(context, attributeSet) {
protected var activity: SimpleActivity? = null protected var activity: SimpleActivity? = null
protected lateinit var innerBinding: BINDING
private lateinit var config: Config private lateinit var config: Config
fun setupFragment(activity: SimpleActivity) { fun setupFragment(activity: SimpleActivity) {
@ -35,7 +37,7 @@ abstract class MyViewPagerFragment(context: Context, attributeSet: AttributeSet)
fun startNameWithSurnameChanged(startNameWithSurname: Boolean) { fun startNameWithSurnameChanged(startNameWithSurname: Boolean) {
if (this !is RecentsFragment) { if (this !is RecentsFragment) {
(fragment_list.adapter as? ContactsAdapter)?.apply { (innerBinding.fragmentList?.adapter as? ContactsAdapter)?.apply {
config.sorting = if (startNameWithSurname) SORT_BY_SURNAME else SORT_BY_FIRST_NAME config.sorting = if (startNameWithSurname) SORT_BY_SURNAME else SORT_BY_FIRST_NAME
(this@MyViewPagerFragment.activity!! as MainActivity).refreshFragments() (this@MyViewPagerFragment.activity!! as MainActivity).refreshFragments()
} }
@ -43,18 +45,18 @@ abstract class MyViewPagerFragment(context: Context, attributeSet: AttributeSet)
} }
fun finishActMode() { fun finishActMode() {
(fragment_list?.adapter as? MyRecyclerViewAdapter)?.finishActMode() (innerBinding.fragmentList?.adapter as? MyRecyclerViewAdapter)?.finishActMode()
(recents_list?.adapter as? MyRecyclerViewAdapter)?.finishActMode() (innerBinding.recentsList?.adapter as? MyRecyclerViewAdapter)?.finishActMode()
} }
fun fontSizeChanged() { fun fontSizeChanged() {
if (this is RecentsFragment) { if (this is RecentsFragment) {
(recents_list?.adapter as? RecentCallsAdapter)?.apply { (innerBinding.recentsList?.adapter as? RecentCallsAdapter)?.apply {
fontSize = activity.getTextSize() fontSize = activity.getTextSize()
notifyDataSetChanged() notifyDataSetChanged()
} }
} else { } else {
(fragment_list?.adapter as? ContactsAdapter)?.apply { (innerBinding.fragmentList?.adapter as? ContactsAdapter)?.apply {
fontSize = activity.getTextSize() fontSize = activity.getTextSize()
notifyDataSetChanged() notifyDataSetChanged()
} }
@ -68,4 +70,19 @@ abstract class MyViewPagerFragment(context: Context, attributeSet: AttributeSet)
abstract fun onSearchClosed() abstract fun onSearchClosed()
abstract fun onSearchQueryChanged(text: String) abstract fun onSearchQueryChanged(text: String)
interface InnerBinding {
val fragmentList: MyRecyclerView?
val recentsList: MyRecyclerView?
}
class LettersInnerBinding(val binding: FragmentLettersLayoutBinding) : InnerBinding {
override val fragmentList: MyRecyclerView = binding.fragmentList
override val recentsList = null
}
class RecentsInnerBinding(val binding: FragmentRecentsBinding) : InnerBinding {
override val fragmentList = null
override val recentsList = binding.recentsList
}
} }

View File

@ -13,19 +13,25 @@ import com.simplemobiletools.commons.views.MyRecyclerView
import com.simplemobiletools.dialer.R import com.simplemobiletools.dialer.R
import com.simplemobiletools.dialer.activities.SimpleActivity import com.simplemobiletools.dialer.activities.SimpleActivity
import com.simplemobiletools.dialer.adapters.RecentCallsAdapter import com.simplemobiletools.dialer.adapters.RecentCallsAdapter
import com.simplemobiletools.dialer.databinding.FragmentRecentsBinding
import com.simplemobiletools.dialer.extensions.config import com.simplemobiletools.dialer.extensions.config
import com.simplemobiletools.dialer.helpers.MIN_RECENTS_THRESHOLD import com.simplemobiletools.dialer.helpers.MIN_RECENTS_THRESHOLD
import com.simplemobiletools.dialer.helpers.RecentsHelper import com.simplemobiletools.dialer.helpers.RecentsHelper
import com.simplemobiletools.dialer.interfaces.RefreshItemsListener import com.simplemobiletools.dialer.interfaces.RefreshItemsListener
import com.simplemobiletools.dialer.models.RecentCall import com.simplemobiletools.dialer.models.RecentCall
import kotlinx.android.synthetic.main.fragment_recents.view.recents_list
import kotlinx.android.synthetic.main.fragment_recents.view.recents_placeholder
import kotlinx.android.synthetic.main.fragment_recents.view.recents_placeholder_2
class RecentsFragment(context: Context, attributeSet: AttributeSet) : MyViewPagerFragment(context, attributeSet), RefreshItemsListener { class RecentsFragment(context: Context, attributeSet: AttributeSet) : MyViewPagerFragment<MyViewPagerFragment.RecentsInnerBinding>(context, attributeSet),
RefreshItemsListener {
private lateinit var binding: FragmentRecentsBinding
private var allRecentCalls = listOf<RecentCall>() private var allRecentCalls = listOf<RecentCall>()
private var recentsAdapter: RecentCallsAdapter? = null private var recentsAdapter: RecentCallsAdapter? = null
override fun onFinishInflate() {
super.onFinishInflate()
binding = FragmentRecentsBinding.bind(this)
innerBinding = RecentsInnerBinding(binding)
}
override fun setupFragment() { override fun setupFragment() {
val placeholderResId = if (context.hasPermission(PERMISSION_READ_CALL_LOG)) { val placeholderResId = if (context.hasPermission(PERMISSION_READ_CALL_LOG)) {
R.string.no_previous_calls R.string.no_previous_calls
@ -33,8 +39,8 @@ class RecentsFragment(context: Context, attributeSet: AttributeSet) : MyViewPage
R.string.could_not_access_the_call_history R.string.could_not_access_the_call_history
} }
recents_placeholder.text = context.getString(placeholderResId) binding.recentsPlaceholder.text = context.getString(placeholderResId)
recents_placeholder_2.apply { binding.recentsPlaceholder2.apply {
underlineText() underlineText()
setOnClickListener { setOnClickListener {
requestCallLogPermission() requestCallLogPermission()
@ -43,8 +49,8 @@ class RecentsFragment(context: Context, attributeSet: AttributeSet) : MyViewPage
} }
override fun setupColors(textColor: Int, primaryColor: Int, properPrimaryColor: Int) { override fun setupColors(textColor: Int, primaryColor: Int, properPrimaryColor: Int) {
recents_placeholder.setTextColor(textColor) binding.recentsPlaceholder.setTextColor(textColor)
recents_placeholder_2.setTextColor(properPrimaryColor) binding.recentsPlaceholder2.setTextColor(properPrimaryColor)
recentsAdapter?.apply { recentsAdapter?.apply {
initDrawables() initDrawables()
@ -73,17 +79,20 @@ class RecentsFragment(context: Context, attributeSet: AttributeSet) : MyViewPage
private fun gotRecents(recents: List<RecentCall>) { private fun gotRecents(recents: List<RecentCall>) {
if (recents.isEmpty()) { if (recents.isEmpty()) {
recents_placeholder.beVisible() binding.apply {
recents_placeholder_2.beGoneIf(context.hasPermission(PERMISSION_READ_CALL_LOG)) recentsPlaceholder.beVisible()
recents_list.beGone() recentsPlaceholder2.beGoneIf(context.hasPermission(PERMISSION_READ_CALL_LOG))
recentsList.beGone()
}
} else { } else {
recents_placeholder.beGone() binding.apply {
recents_placeholder_2.beGone() recentsPlaceholder.beGone()
recents_list.beVisible() recentsPlaceholder2.beGone()
recentsList.beVisible()
}
val currAdapter = recents_list.adapter if (binding.recentsList.adapter == null) {
if (currAdapter == null) { recentsAdapter = RecentCallsAdapter(activity as SimpleActivity, recents.toMutableList(), binding.recentsList, this, true) {
recentsAdapter = RecentCallsAdapter(activity as SimpleActivity, recents.toMutableList(), recents_list, this, true) {
val recentCall = it as RecentCall val recentCall = it as RecentCall
if (context.config.showCallConfirmation) { if (context.config.showCallConfirmation) {
CallConfirmationDialog(activity as SimpleActivity, recentCall.name) { CallConfirmationDialog(activity as SimpleActivity, recentCall.name) {
@ -94,13 +103,13 @@ class RecentsFragment(context: Context, attributeSet: AttributeSet) : MyViewPage
} }
} }
recents_list.adapter = recentsAdapter binding.recentsList.adapter = recentsAdapter
if (context.areSystemAnimationsEnabled) { if (context.areSystemAnimationsEnabled) {
recents_list.scheduleLayoutAnimation() binding.recentsList.scheduleLayoutAnimation()
} }
recents_list.endlessScrollListener = object : MyRecyclerView.EndlessScrollListener { binding.recentsList.endlessScrollListener = object : MyRecyclerView.EndlessScrollListener {
override fun updateTop() {} override fun updateTop() {}
override fun updateBottom() { override fun updateBottom() {
@ -136,8 +145,8 @@ class RecentsFragment(context: Context, attributeSet: AttributeSet) : MyViewPage
private fun requestCallLogPermission() { private fun requestCallLogPermission() {
activity?.handlePermission(PERMISSION_READ_CALL_LOG) { activity?.handlePermission(PERMISSION_READ_CALL_LOG) {
if (it) { if (it) {
recents_placeholder.text = context.getString(R.string.no_previous_calls) binding.recentsPlaceholder.text = context.getString(R.string.no_previous_calls)
recents_placeholder_2.beGone() binding.recentsPlaceholder2.beGone()
val groupSubsequentCalls = context?.config?.groupSubsequentCalls ?: false val groupSubsequentCalls = context?.config?.groupSubsequentCalls ?: false
RecentsHelper(context).getRecentCalls(groupSubsequentCalls) { recents -> RecentsHelper(context).getRecentCalls(groupSubsequentCalls) { recents ->
@ -150,7 +159,7 @@ class RecentsFragment(context: Context, attributeSet: AttributeSet) : MyViewPage
} }
override fun onSearchClosed() { override fun onSearchClosed() {
recents_placeholder.beVisibleIf(allRecentCalls.isEmpty()) binding.recentsPlaceholder.beVisibleIf(allRecentCalls.isEmpty())
recentsAdapter?.updateItems(allRecentCalls) recentsAdapter?.updateItems(allRecentCalls)
} }
@ -161,7 +170,7 @@ class RecentsFragment(context: Context, attributeSet: AttributeSet) : MyViewPage
it.name.startsWith(text, true) it.name.startsWith(text, true)
}.toMutableList() as ArrayList<RecentCall> }.toMutableList() as ArrayList<RecentCall>
recents_placeholder.beVisibleIf(recentCalls.isEmpty()) binding.recentsPlaceholder.beVisibleIf(recentCalls.isEmpty())
recentsAdapter?.updateItems(recentCalls, text) recentsAdapter?.updateItems(recentCalls, text)
} }
} }

View File

@ -282,7 +282,7 @@
android:layout_width="@dimen/dialpad_button_size" android:layout_width="@dimen/dialpad_button_size"
android:layout_height="@dimen/dialpad_button_size" android:layout_height="@dimen/dialpad_button_size"
android:contentDescription="@string/end_call" android:contentDescription="@string/end_call"
android:src="@drawable/ic_call_decline" android:src="@drawable/ic_call_end"
app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent" app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent" app:layout_constraintStart_toStartOf="parent"
@ -318,7 +318,7 @@
android:clickable="false" android:clickable="false"
android:contentDescription="@string/decline_call" android:contentDescription="@string/decline_call"
android:padding="@dimen/medium_margin" android:padding="@dimen/medium_margin"
android:src="@drawable/ic_call_decline" android:src="@drawable/ic_call_end"
app:layout_constraintBottom_toBottomOf="@+id/call_draggable" app:layout_constraintBottom_toBottomOf="@+id/call_draggable"
app:layout_constraintEnd_toStartOf="@+id/call_draggable" app:layout_constraintEnd_toStartOf="@+id/call_draggable"
app:layout_constraintHorizontal_bias="0.5" app:layout_constraintHorizontal_bias="0.5"

View File

@ -1,13 +1,13 @@
// Top-level build file where you can add configuration options common to all sub-projects/modules. // Top-level build file where you can add configuration options common to all sub-projects/modules.
buildscript { buildscript {
ext.kotlin_version = '1.7.10' ext.kotlin_version = '1.9.0'
repositories { repositories {
google() google()
mavenCentral() mavenCentral()
} }
dependencies { dependencies {
classpath 'com.android.tools.build:gradle:7.3.1' classpath 'com.android.tools.build:gradle:8.1.0'
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
// NOTE: Do not place your application dependencies here; they belong // NOTE: Do not place your application dependencies here; they belong

View File

@ -6,7 +6,7 @@
# http://www.gradle.org/docs/current/userguide/build_environment.html # http://www.gradle.org/docs/current/userguide/build_environment.html
# Specifies the JVM arguments used for the daemon process. # Specifies the JVM arguments used for the daemon process.
# The setting is particularly useful for tweaking memory settings. # The setting is particularly useful for tweaking memory settings.
org.gradle.jvmargs=-Xmx1536m org.gradle.jvmargs=-Xmx4g
# When configured, Gradle will run in incubating parallel mode. # When configured, Gradle will run in incubating parallel mode.
# This option should only be used with decoupled projects. More details, visit # This option should only be used with decoupled projects. More details, visit
# http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects # http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects
@ -17,5 +17,6 @@ org.gradle.jvmargs=-Xmx1536m
android.useAndroidX=true android.useAndroidX=true
# Automatically convert third-party libraries to use AndroidX # Automatically convert third-party libraries to use AndroidX
android.enableJetifier=true android.enableJetifier=true
android.nonTransitiveRClass=false
# Kotlin code style for this project: "official" or "obsolete": # Kotlin code style for this project: "official" or "obsolete":
kotlin.code.style=official kotlin.code.style=official

View File

@ -3,4 +3,4 @@ distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists zipStorePath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-7.4-bin.zip distributionUrl=https\://services.gradle.org/distributions/gradle-8.2.1-bin.zip