mirror of
https://github.com/SimpleMobileTools/Simple-Dialer.git
synced 2025-04-08 23:41:03 +02:00
Merge pull request #673 from fatihergin/feature/viewbinding-sdk-34-migration
Feature/viewbinding sdk 34 migration
This commit is contained in:
commit
9464b76036
@ -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"
|
||||||
|
@ -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)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -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)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -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)
|
||||||
|
@ -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())
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -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
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -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
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -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) {
|
||||||
|
@ -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)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -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)
|
||||||
|
@ -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)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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
|
||||||
}
|
}
|
||||||
|
@ -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() -> {
|
||||||
|
@ -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()
|
||||||
|
@ -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
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -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()
|
||||||
}
|
}
|
||||||
|
@ -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)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -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)
|
||||||
|
@ -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
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -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
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -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)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -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"
|
||||||
|
@ -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
|
||||||
|
@ -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
|
||||||
|
2
gradle/wrapper/gradle-wrapper.properties
vendored
2
gradle/wrapper/gradle-wrapper.properties
vendored
@ -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
|
||||||
|
Loading…
x
Reference in New Issue
Block a user