Skip to content

Commit 48201c8

Browse files
authored
Merge pull request #17 from SimpleMobileTools/master
upd
2 parents 0585613 + 4807a94 commit 48201c8

File tree

80 files changed

+905
-526
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

80 files changed

+905
-526
lines changed

.gitignore

Lines changed: 0 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,6 @@
1-
# Temp files
2-
*~
3-
*.bak
4-
*.backup
5-
\#*
6-
.\#*
7-
*\#
8-
*.swp
9-
*.swap
10-
*.sav
11-
*.save
12-
*.autosav
13-
*.autosave
14-
151
*.iml
162
.gradle
173
/local.properties
18-
/gradle.properties
194
/.idea/
205
.DS_Store
216
/build

CHANGELOG.md

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,24 @@
11
Changelog
22
==========
33

4+
Version 5.1.0 *(2018-10-28)*
5+
----------------------------
6+
7+
* Added an option for toggling 24 hour time format
8+
* Added an option to show only contacts with phone numbers
9+
* Do not allow creating contacts under WhatsApp contact source
10+
* Try fixing the issue with disappearing contacts under some circumstances
11+
* Fix some bugs related to selecting contact photo from the device storage
12+
* Show the contact email at the list, if name and organization are empty
13+
* Properly sort groups containing UTF-8 characters at title
14+
* Use a different placeholder image for business contacts
15+
16+
Version 5.0.0 *(2018-10-15)*
17+
----------------------------
18+
19+
* Increased the minimal required Android OS version to 5
20+
* Try fixing the issue with disappearing fresh contacts
21+
422
Version 4.5.0 *(2018-09-28)*
523
----------------------------
624

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ This app is just one piece of a bigger series of apps. You can find the rest of
1515
<div style="display:flex;">
1616
<img alt="App image" src="fastlane/metadata/android/en-US/images/phoneScreenshots/app.png" width="30%">
1717
<img alt="App image" src="fastlane/metadata/android/en-US/images/phoneScreenshots/app_2.png" width="30%">
18-
<img alt="App image" src="fastlane/metadata/android/en-US/images/phoneScreenshots/app_3.png" width="30%">
18+
<img alt="App image" src="fastlane/metadata/android/en-US/images/phoneScreenshots/app_4.png" width="30%">
1919
</div>
2020

2121
License

app/build.gradle

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -8,10 +8,10 @@ android {
88

99
defaultConfig {
1010
applicationId "com.simplemobiletools.contacts"
11-
minSdkVersion 16
11+
minSdkVersion 21
1212
targetSdkVersion 28
13-
versionCode 32
14-
versionName "4.5.0"
13+
versionCode 34
14+
versionName "5.1.0"
1515
setProperty("archivesBaseName", "contacts")
1616
}
1717

@@ -41,11 +41,11 @@ android {
4141
}
4242

4343
dependencies {
44-
implementation 'com.simplemobiletools:commons:4.8.0'
44+
implementation 'com.simplemobiletools:commons:5.2.11'
4545
implementation 'joda-time:joda-time:2.9.9'
4646
implementation 'com.facebook.stetho:stetho:1.5.0'
47-
implementation 'com.android.support.constraint:constraint-layout:1.1.3'
48-
compile 'com.googlecode.ez-vcard:ez-vcard:0.10.4'
47+
implementation 'androidx.constraintlayout:constraintlayout:2.0.0-alpha2'
48+
implementation 'com.googlecode.ez-vcard:ez-vcard:0.10.4'
4949
}
5050

5151
Properties props = new Properties()

app/src/main/AndroidManifest.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -194,7 +194,7 @@
194194
android:parentActivityName=".activities.MainActivity"/>
195195

196196
<provider
197-
android:name="android.support.v4.content.FileProvider"
197+
android:name="androidx.core.content.FileProvider"
198198
android:authorities="${applicationId}.provider"
199199
android:exported="false"
200200
android:grantUriPermissions="true">

app/src/main/kotlin/com/simplemobiletools/contacts/activities/DialpadActivity.kt

Lines changed: 2 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,16 @@
11
package com.simplemobiletools.contacts.activities
22

3-
import android.annotation.TargetApi
43
import android.content.Intent
54
import android.graphics.Color
6-
import android.os.Build
75
import android.os.Bundle
8-
import android.text.InputType
96
import android.view.KeyEvent
107
import android.view.Menu
118
import android.view.MenuItem
129
import android.view.View
1310
import com.simplemobiletools.commons.extensions.*
14-
import com.simplemobiletools.commons.helpers.isLollipopPlus
1511
import com.simplemobiletools.contacts.R
1612
import com.simplemobiletools.contacts.adapters.ContactsAdapter
1713
import com.simplemobiletools.contacts.dialogs.CallConfirmationDialog
18-
import com.simplemobiletools.contacts.extensions.afterTextChanged
1914
import com.simplemobiletools.contacts.extensions.callContact
2015
import com.simplemobiletools.contacts.extensions.config
2116
import com.simplemobiletools.contacts.extensions.startCallIntent
@@ -47,7 +42,7 @@ class DialpadActivity : SimpleActivity() {
4742
dialpad_clear_char.setOnClickListener { clearChar(it) }
4843
dialpad_clear_char.setOnLongClickListener { clearInput(); true }
4944
dialpad_call_button.setOnClickListener { initCall() }
50-
dialpad_input.afterTextChanged { dialpadValueChanged(it) }
45+
dialpad_input.onTextChangeListener { dialpadValueChanged(it) }
5146
ContactsHelper(this).getContacts { gotContacts(it) }
5247
disableKeyboardPopping()
5348

@@ -120,13 +115,8 @@ class DialpadActivity : SimpleActivity() {
120115
else -> KeyEvent.KEYCODE_POUND
121116
}
122117

123-
@TargetApi(Build.VERSION_CODES.LOLLIPOP)
124118
private fun disableKeyboardPopping() {
125-
if (isLollipopPlus()) {
126-
dialpad_input.showSoftInputOnFocus = false
127-
} else {
128-
dialpad_input.inputType = InputType.TYPE_NULL
129-
}
119+
dialpad_input.showSoftInputOnFocus = false
130120
}
131121

132122
private fun gotContacts(newContacts: ArrayList<Contact>) {

app/src/main/kotlin/com/simplemobiletools/contacts/activities/EditContactActivity.kt

Lines changed: 19 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import android.app.DatePickerDialog
55
import android.content.ClipData
66
import android.content.ContentValues
77
import android.content.Intent
8+
import android.graphics.Bitmap
89
import android.graphics.drawable.ColorDrawable
910
import android.net.Uri
1011
import android.os.Bundle
@@ -114,7 +115,7 @@ class EditContactActivity : ContactActivity() {
114115
super.onActivityResult(requestCode, resultCode, resultData)
115116
if (resultCode == RESULT_OK) {
116117
when (requestCode) {
117-
INTENT_TAKE_PHOTO, INTENT_CHOOSE_PHOTO -> startCropPhotoIntent(lastPhotoIntentUri)
118+
INTENT_TAKE_PHOTO, INTENT_CHOOSE_PHOTO -> startCropPhotoIntent(lastPhotoIntentUri, resultData?.data)
118119
INTENT_CROP_PHOTO -> updateContactPhoto(lastPhotoIntentUri.toString(), contact_photo)
119120
}
120121
}
@@ -260,15 +261,28 @@ class EditContactActivity : ContactActivity() {
260261
}
261262
}
262263

263-
private fun startCropPhotoIntent(uri: Uri?) {
264-
if (uri == null) {
264+
private fun startCropPhotoIntent(primaryUri: Uri?, backupUri: Uri?) {
265+
if (primaryUri == null) {
265266
toast(R.string.unknown_error_occurred)
266267
return
267268
}
268269

270+
var imageUri = primaryUri
271+
var bitmap = MediaStore.Images.Media.getBitmap(contentResolver, primaryUri)
272+
if (bitmap == null) {
273+
imageUri = backupUri
274+
bitmap = MediaStore.Images.Media.getBitmap(contentResolver, backupUri) ?: return
275+
276+
// we might have received an URI which we have no permission to send further, so just copy the received image in a new uri (for example from Google Photos)
277+
val newFile = getCachePhoto()
278+
val fos = newFile.outputStream()
279+
bitmap.compress(Bitmap.CompressFormat.JPEG, 100, fos)
280+
imageUri = getCachePhotoUri(newFile)
281+
}
282+
269283
lastPhotoIntentUri = getCachePhotoUri()
270284
Intent("com.android.camera.action.CROP").apply {
271-
setDataAndType(uri, "image/*")
285+
setDataAndType(imageUri, "image/*")
272286
putExtra(MediaStore.EXTRA_OUTPUT, lastPhotoIntentUri)
273287
putExtra("outputX", 720)
274288
putExtra("outputY", 720)
@@ -277,7 +291,7 @@ class EditContactActivity : ContactActivity() {
277291
putExtra("crop", "true")
278292
putExtra("scale", "true")
279293
putExtra("scaleUpIfNeeded", "true")
280-
clipData = ClipData("Attachment", arrayOf("text/uri-list"), ClipData.Item(lastPhotoIntentUri))
294+
clipData = ClipData("Attachment", arrayOf("text/primaryUri-list"), ClipData.Item(lastPhotoIntentUri))
281295
addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION or Intent.FLAG_GRANT_WRITE_URI_PERMISSION)
282296
if (resolveActivity(packageManager) != null) {
283297
startActivityForResult(this, INTENT_CROP_PHOTO)

app/src/main/kotlin/com/simplemobiletools/contacts/activities/MainActivity.kt

Lines changed: 13 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -9,11 +9,11 @@ import android.graphics.drawable.Drawable
99
import android.net.Uri
1010
import android.os.Bundle
1111
import android.os.Handler
12-
import android.support.v4.view.MenuItemCompat
13-
import android.support.v4.view.ViewPager
14-
import android.support.v7.widget.SearchView
1512
import android.view.Menu
1613
import android.view.MenuItem
14+
import androidx.appcompat.widget.SearchView
15+
import androidx.core.view.MenuItemCompat
16+
import androidx.viewpager.widget.ViewPager
1717
import com.simplemobiletools.commons.dialogs.FilePickerDialog
1818
import com.simplemobiletools.commons.extensions.*
1919
import com.simplemobiletools.commons.helpers.*
@@ -27,7 +27,6 @@ import com.simplemobiletools.contacts.dialogs.ExportContactsDialog
2727
import com.simplemobiletools.contacts.dialogs.FilterContactSourcesDialog
2828
import com.simplemobiletools.contacts.dialogs.ImportContactsDialog
2929
import com.simplemobiletools.contacts.extensions.config
30-
import com.simplemobiletools.contacts.extensions.dbHelper
3130
import com.simplemobiletools.contacts.extensions.getTempFile
3231
import com.simplemobiletools.contacts.fragments.MyViewPagerFragment
3332
import com.simplemobiletools.contacts.helpers.*
@@ -63,9 +62,6 @@ class MainActivity : SimpleActivity(), RefreshContactsListener {
6362
appLaunched(BuildConfig.APPLICATION_ID)
6463
setupTabColors()
6564

66-
// just get a reference to the database to make sure it is created properly
67-
dbHelper
68-
6965
handlePermission(PERMISSION_READ_CALL_LOG) {
7066
if (it) {
7167
handlePermission(PERMISSION_WRITE_CALL_LOG) {
@@ -308,10 +304,10 @@ class MainActivity : SimpleActivity(), RefreshContactsListener {
308304
}
309305
}
310306

311-
private fun getInactiveTabIndexes(activeIndex: Int) = arrayListOf(0, 1, 2, 3).filter { it != activeIndex }
307+
private fun getInactiveTabIndexes(activeIndex: Int) = (0 until tabsList.size).filter { it != activeIndex }
312308

313309
private fun initFragments() {
314-
viewpager.offscreenPageLimit = 3
310+
viewpager.offscreenPageLimit = tabsList.size - 1
315311
viewpager.addOnPageChangeListener(object : ViewPager.OnPageChangeListener {
316312
override fun onPageScrollStateChanged(state: Int) {
317313
if (isSearchOpen) {
@@ -320,8 +316,7 @@ class MainActivity : SimpleActivity(), RefreshContactsListener {
320316
}
321317
}
322318

323-
override fun onPageScrolled(position: Int, positionOffset: Float, positionOffsetPixels: Int) {
324-
}
319+
override fun onPageScrolled(position: Int, positionOffset: Float, positionOffsetPixels: Int) {}
325320

326321
override fun onPageSelected(position: Int) {
327322
main_tabs_holder.getTabAt(position)?.select()
@@ -373,7 +368,7 @@ class MainActivity : SimpleActivity(), RefreshContactsListener {
373368
}, 100L)
374369
}
375370

376-
main_tabs_holder.beVisibleIf(skippedTabs < 3)
371+
main_tabs_holder.beVisibleIf(skippedTabs < tabsList.size - 1)
377372

378373
main_dialpad_button.setOnClickListener {
379374
val intent = Intent(applicationContext, DialpadActivity::class.java)
@@ -401,7 +396,7 @@ class MainActivity : SimpleActivity(), RefreshContactsListener {
401396
fun showFilterDialog() {
402397
FilterContactSourcesDialog(this) {
403398
contacts_fragment?.forceListRedraw = true
404-
refreshContacts(CONTACTS_TAB_MASK)
399+
refreshContacts(CONTACTS_TAB_MASK or FAVORITES_TAB_MASK)
405400
}
406401
}
407402

@@ -484,7 +479,7 @@ class MainActivity : SimpleActivity(), RefreshContactsListener {
484479
}
485480

486481
private fun launchAbout() {
487-
val licenses = LICENSE_MULTISELECT or LICENSE_JODA or LICENSE_GLIDE or LICENSE_GSON or LICENSE_STETHO
482+
val licenses = LICENSE_JODA or LICENSE_GLIDE or LICENSE_GSON or LICENSE_STETHO
488483

489484
val faqItems = arrayListOf(
490485
FAQItem(R.string.faq_1_title, R.string.faq_1_text),
@@ -495,9 +490,10 @@ class MainActivity : SimpleActivity(), RefreshContactsListener {
495490
}
496491

497492
override fun refreshContacts(refreshTabsMask: Int) {
498-
if (isActivityDestroyed() || isGettingContacts) {
493+
if (isDestroyed || isGettingContacts) {
499494
return
500495
}
496+
501497
isGettingContacts = true
502498

503499
if (viewpager.adapter == null) {
@@ -507,7 +503,7 @@ class MainActivity : SimpleActivity(), RefreshContactsListener {
507503

508504
ContactsHelper(this).getContacts {
509505
isGettingContacts = false
510-
if (isActivityDestroyed()) {
506+
if (isDestroyed) {
511507
return@getContacts
512508
}
513509

@@ -551,6 +547,7 @@ class MainActivity : SimpleActivity(), RefreshContactsListener {
551547
add(Release(29, R.string.release_29))
552548
add(Release(31, R.string.release_31))
553549
add(Release(32, R.string.release_32))
550+
add(Release(34, R.string.release_34))
554551
checkWhatsNew(this, BuildConfig.VERSION_CODE)
555552
}
556553
}

app/src/main/kotlin/com/simplemobiletools/contacts/activities/SelectContactActivity.kt

Lines changed: 31 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,7 @@ import android.os.Bundle
66
import android.provider.ContactsContract
77
import android.view.Menu
88
import android.view.MenuItem
9-
import com.simplemobiletools.commons.extensions.baseConfig
10-
import com.simplemobiletools.commons.extensions.isActivityDestroyed
11-
import com.simplemobiletools.commons.extensions.toast
9+
import com.simplemobiletools.commons.extensions.*
1210
import com.simplemobiletools.commons.helpers.PERMISSION_READ_CONTACTS
1311
import com.simplemobiletools.commons.helpers.PERMISSION_WRITE_CONTACTS
1412
import com.simplemobiletools.contacts.R
@@ -21,14 +19,15 @@ import com.simplemobiletools.contacts.extensions.getVisibleContactSources
2119
import com.simplemobiletools.contacts.helpers.ContactsHelper
2220
import com.simplemobiletools.contacts.helpers.SMT_PRIVATE
2321
import com.simplemobiletools.contacts.models.Contact
24-
import kotlinx.android.synthetic.main.layout_select_contact.*
22+
import kotlinx.android.synthetic.main.activity_select_contact.*
2523

2624
class SelectContactActivity : SimpleActivity() {
2725
private var specialMimeType: String? = null
2826

2927
override fun onCreate(savedInstanceState: Bundle?) {
3028
super.onCreate(savedInstanceState)
31-
setContentView(R.layout.layout_select_contact)
29+
setContentView(R.layout.activity_select_contact)
30+
setupPlaceholders()
3231

3332
handlePermission(PERMISSION_READ_CONTACTS) {
3433
if (it) {
@@ -80,7 +79,7 @@ class SelectContactActivity : SimpleActivity() {
8079

8180
private fun initContacts() {
8281
ContactsHelper(this).getContacts {
83-
if (isActivityDestroyed()) {
82+
if (isDestroyed) {
8483
return@getContacts
8584
}
8685

@@ -105,8 +104,11 @@ class SelectContactActivity : SimpleActivity() {
105104
contacts.sort()
106105

107106
runOnUiThread {
108-
select_contact_list.adapter = SelectContactsAdapter(this, contacts, ArrayList(), false) {
107+
updatePlaceholderVisibility(contacts)
108+
SelectContactsAdapter(this, contacts, ArrayList(), false, select_contact_list) {
109109
confirmSelection(it)
110+
}.apply {
111+
select_contact_list.adapter = this
110112
}
111113

112114
select_contact_fastscroller.allowBubbleDisplay = baseConfig.showInfoBubble
@@ -132,9 +134,29 @@ class SelectContactActivity : SimpleActivity() {
132134
val contactId = ContactsHelper(this).getContactMimeTypeId(contact.id.toString(), specialMimeType!!)
133135
Uri.withAppendedPath(ContactsContract.Data.CONTENT_URI, contactId)
134136
}
135-
else -> {
136-
getContactPublicUri(contact)
137+
else -> getContactPublicUri(contact)
138+
}
139+
}
140+
141+
private fun setupPlaceholders() {
142+
select_contact_placeholder.setTextColor(config.textColor)
143+
select_contact_placeholder_2.setTextColor(getAdjustedPrimaryColor())
144+
select_contact_placeholder_2.underlineText()
145+
select_contact_placeholder_2.setOnClickListener {
146+
FilterContactSourcesDialog(this) {
147+
initContacts()
137148
}
138149
}
139150
}
151+
152+
private fun updatePlaceholderVisibility(contacts: ArrayList<Contact>) {
153+
select_contact_list.beVisibleIf(contacts.isNotEmpty())
154+
select_contact_placeholder_2.beVisibleIf(contacts.isEmpty())
155+
select_contact_placeholder.beVisibleIf(contacts.isEmpty())
156+
select_contact_placeholder.setText(when (specialMimeType) {
157+
ContactsContract.CommonDataKinds.Email.CONTENT_ITEM_TYPE -> R.string.no_contacts_with_emails
158+
ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE -> R.string.no_contacts_with_phone_numbers
159+
else -> R.string.no_contacts_found
160+
})
161+
}
140162
}

0 commit comments

Comments
 (0)