From e39b11209e0ecd3f01d896a45d82da3ac17a9d3f Mon Sep 17 00:00:00 2001 From: tibbi Date: Mon, 5 Nov 2018 13:51:13 +0100 Subject: [PATCH 001/134] removing Stetho --- app/build.gradle | 1 - .../main/kotlin/com/simplemobiletools/contacts/pro/App.kt | 5 ----- .../contacts/pro/activities/MainActivity.kt | 2 +- 3 files changed, 1 insertion(+), 7 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 93de4f18..62994063 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -43,7 +43,6 @@ android { dependencies { implementation 'com.simplemobiletools:commons:5.3.11' implementation 'joda-time:joda-time:2.9.9' - implementation 'com.facebook.stetho:stetho:1.5.0' implementation 'androidx.constraintlayout:constraintlayout:2.0.0-alpha2' implementation 'com.googlecode.ez-vcard:ez-vcard:0.10.4' } diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/App.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/App.kt index ceb01a13..f29a0cb8 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/App.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/App.kt @@ -1,16 +1,11 @@ package com.simplemobiletools.contacts.pro import android.app.Application -import com.facebook.stetho.Stetho import com.simplemobiletools.commons.extensions.checkUseEnglish class App : Application() { override fun onCreate() { super.onCreate() - if (BuildConfig.DEBUG) { - Stetho.initializeWithDefaults(this) - } - checkUseEnglish() } } diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/MainActivity.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/MainActivity.kt index f8eefe7d..a05aefc0 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/MainActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/MainActivity.kt @@ -478,7 +478,7 @@ class MainActivity : SimpleActivity(), RefreshContactsListener { } private fun launchAbout() { - val licenses = LICENSE_JODA or LICENSE_GLIDE or LICENSE_GSON or LICENSE_STETHO + val licenses = LICENSE_JODA or LICENSE_GLIDE or LICENSE_GSON val faqItems = arrayListOf( FAQItem(R.string.faq_1_title, R.string.faq_1_text), From 58e954a3f973b1a91694e0fa2009030d4e0a3995 Mon Sep 17 00:00:00 2001 From: tibbi Date: Mon, 5 Nov 2018 18:25:36 +0100 Subject: [PATCH 002/134] create a Room database for local contacts --- app/build.gradle | 5 ++ .../pro/databases/ContactsDatabase.kt | 61 +++++++++++++++++++ .../contacts/pro/extensions/Context.kt | 4 ++ .../contacts/pro/helpers/Constants.kt | 3 + .../contacts/pro/interfaces/ContactsDao.kt | 22 +++++++ .../contacts/pro/models/LocalContact.kt | 33 ++++++++++ .../contacts/pro/objects/MyExecutor.kt | 7 +++ 7 files changed, 135 insertions(+) create mode 100644 app/src/main/kotlin/com/simplemobiletools/contacts/pro/databases/ContactsDatabase.kt create mode 100644 app/src/main/kotlin/com/simplemobiletools/contacts/pro/interfaces/ContactsDao.kt create mode 100644 app/src/main/kotlin/com/simplemobiletools/contacts/pro/models/LocalContact.kt create mode 100644 app/src/main/kotlin/com/simplemobiletools/contacts/pro/objects/MyExecutor.kt diff --git a/app/build.gradle b/app/build.gradle index 62994063..bbc59b7b 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -1,6 +1,7 @@ apply plugin: 'com.android.application' apply plugin: 'kotlin-android' apply plugin: 'kotlin-android-extensions' +apply plugin: 'kotlin-kapt' android { compileSdkVersion 28 @@ -45,6 +46,10 @@ dependencies { implementation 'joda-time:joda-time:2.9.9' implementation 'androidx.constraintlayout:constraintlayout:2.0.0-alpha2' implementation 'com.googlecode.ez-vcard:ez-vcard:0.10.4' + + kapt "androidx.room:room-compiler:2.0.0" + implementation "androidx.room:room-runtime:2.0.0" + annotationProcessor "androidx.room:room-compiler:2.0.0" } Properties props = new Properties() diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/databases/ContactsDatabase.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/databases/ContactsDatabase.kt new file mode 100644 index 00000000..94b02b27 --- /dev/null +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/databases/ContactsDatabase.kt @@ -0,0 +1,61 @@ +package com.simplemobiletools.contacts.pro.databases + +import android.content.Context +import androidx.room.Database +import androidx.room.Room +import androidx.room.RoomDatabase +import androidx.sqlite.db.SupportSQLiteDatabase +import com.simplemobiletools.contacts.pro.helpers.getEmptyLocalContact +import com.simplemobiletools.contacts.pro.interfaces.ContactsDao +import com.simplemobiletools.contacts.pro.models.LocalContact +import com.simplemobiletools.contacts.pro.objects.MyExecutor +import java.util.concurrent.Executors + +@Database(entities = [(LocalContact::class)], version = 1) +abstract class ContactsDatabase : RoomDatabase() { + + abstract fun ContactsDao(): ContactsDao + + companion object { + private val FIRST_CONTACT_ID = 1000000L + + private var db: ContactsDatabase? = null + + fun getInstance(context: Context): ContactsDatabase { + if (db == null) { + synchronized(ContactsDatabase::class) { + if (db == null) { + db = Room.databaseBuilder(context.applicationContext, ContactsDatabase::class.java, "local_contacts.db") + .setQueryExecutor(MyExecutor.myExecutor) + .addCallback(object : Callback() { + override fun onCreate(db: SupportSQLiteDatabase) { + super.onCreate(db) + increaseAutoIncrementId() + } + }) + .build() + db!!.openHelper.setWriteAheadLoggingEnabled(true) + } + } + } + return db!! + } + + fun destroyInstance() { + db = null + } + + // start autoincrement ID from FIRST_CONTACT_ID to avoid conflicts + // Room doesn't seem to have a built in way for it, so just create a contact and delete it + private fun increaseAutoIncrementId() { + Executors.newSingleThreadExecutor().execute { + val emptyContact = getEmptyLocalContact() + emptyContact.id = FIRST_CONTACT_ID + db!!.ContactsDao().apply { + insertOrUpdate(emptyContact) + deleteContactIds(FIRST_CONTACT_ID.toString()) + } + } + } + } +} diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/extensions/Context.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/extensions/Context.kt index 0726550a..58d45128 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/extensions/Context.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/extensions/Context.kt @@ -15,7 +15,9 @@ import com.simplemobiletools.contacts.pro.BuildConfig import com.simplemobiletools.contacts.pro.R import com.simplemobiletools.contacts.pro.activities.EditContactActivity import com.simplemobiletools.contacts.pro.activities.ViewContactActivity +import com.simplemobiletools.contacts.pro.databases.ContactsDatabase import com.simplemobiletools.contacts.pro.helpers.* +import com.simplemobiletools.contacts.pro.interfaces.ContactsDao import com.simplemobiletools.contacts.pro.models.Contact import java.io.File @@ -23,6 +25,8 @@ val Context.config: Config get() = Config.newInstance(applicationContext) val Context.dbHelper: DBHelper get() = DBHelper.newInstance(applicationContext) +val Context.contactsDB: ContactsDao get() = ContactsDatabase.getInstance(applicationContext).ContactsDao() + fun Context.viewContact(contact: Contact) { Intent(applicationContext, ViewContactActivity::class.java).apply { putExtra(CONTACT_ID, contact.id) diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/helpers/Constants.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/helpers/Constants.kt index 9073d347..ea38a550 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/helpers/Constants.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/helpers/Constants.kt @@ -1,6 +1,7 @@ package com.simplemobiletools.contacts.pro.helpers import android.provider.ContactsContract.CommonDataKinds +import com.simplemobiletools.contacts.pro.models.LocalContact // shared prefs const val SHOW_CONTACT_THUMBNAILS = "show_contact_thumbnails" @@ -119,3 +120,5 @@ val localAccountTypes = arrayListOf("vnd.sec.contact.phone", const val TELEGRAM_PACKAGE = "org.telegram.messenger" const val SIGNAL_PACKAGE = "org.thoughtcrime.securesms" const val WHATSAPP_PACKAGE = "com.whatsapp" + +fun getEmptyLocalContact() = LocalContact(0, "", "", "", "", "", "", null, "", "", "", false, "", "", "", "", "", "", "") diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/interfaces/ContactsDao.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/interfaces/ContactsDao.kt new file mode 100644 index 00000000..484f072b --- /dev/null +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/interfaces/ContactsDao.kt @@ -0,0 +1,22 @@ +package com.simplemobiletools.contacts.pro.interfaces + +import androidx.room.Dao +import androidx.room.Insert +import androidx.room.OnConflictStrategy +import androidx.room.Query +import com.simplemobiletools.contacts.pro.models.LocalContact + +@Dao +interface ContactsDao { + @Query("SELECT * FROM contacts") + fun getContacts(): List + + @Query("SELECT * FROM contacts WHERE id = :id") + fun getContactWithId(id: Long): LocalContact + + @Insert(onConflict = OnConflictStrategy.REPLACE) + fun insertOrUpdate(contact: LocalContact) + + @Query("DELETE FROM contacts WHERE id IN (:ids)") + fun deleteContactIds(ids: String) +} diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/models/LocalContact.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/models/LocalContact.kt new file mode 100644 index 00000000..4cd51fa5 --- /dev/null +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/models/LocalContact.kt @@ -0,0 +1,33 @@ +package com.simplemobiletools.contacts.pro.models + +import androidx.room.ColumnInfo +import androidx.room.Entity +import androidx.room.Index +import androidx.room.PrimaryKey + +@Entity(tableName = "contacts", indices = [(Index(value = ["id"], unique = true))]) +data class LocalContact( + @PrimaryKey(autoGenerate = true) var id: Long?, + @ColumnInfo(name = "prefix") var prefix: String, + @ColumnInfo(name = "first_name") var firstName: String, + @ColumnInfo(name = "middle_name") var middleName: String, + @ColumnInfo(name = "surname") var surname: String, + @ColumnInfo(name = "suffix") var suffix: String, + @ColumnInfo(name = "nickname") var nickname: String, + @ColumnInfo(name = "photo", typeAffinity = ColumnInfo.BLOB) var photo: ByteArray?, + @ColumnInfo(name = "phone_numbers") var phoneNumbers: String, + @ColumnInfo(name = "emails") var emails: String, + @ColumnInfo(name = "events") var events: String, + @ColumnInfo(name = "starred") var starred: Boolean, + @ColumnInfo(name = "addresses") var addresses: String, + @ColumnInfo(name = "notes") var notes: String, + @ColumnInfo(name = "groups") var groups: String, + @ColumnInfo(name = "company") var company: String, + @ColumnInfo(name = "job_position") var jobPosition: String, + @ColumnInfo(name = "websites") var websites: String, + @ColumnInfo(name = "ims") var ims: String) { + + companion object { + private const val serialVersionUID = -655314977575622L + } +} diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/objects/MyExecutor.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/objects/MyExecutor.kt new file mode 100644 index 00000000..5f32bfd0 --- /dev/null +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/objects/MyExecutor.kt @@ -0,0 +1,7 @@ +package com.simplemobiletools.contacts.pro.objects + +import java.util.concurrent.Executors + +object MyExecutor { + val myExecutor = Executors.newSingleThreadExecutor() +} From 7b32bd9e10351288f57e65e9d72e63f65f730175 Mon Sep 17 00:00:00 2001 From: tibbi Date: Mon, 5 Nov 2018 18:37:00 +0100 Subject: [PATCH 003/134] emptying the old databases onUpgrade functions --- .../contacts/pro/helpers/DBHelper.kt | 31 +------------------ 1 file changed, 1 insertion(+), 30 deletions(-) diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/helpers/DBHelper.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/helpers/DBHelper.kt index 645c1a61..0fd47f7c 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/helpers/DBHelper.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/helpers/DBHelper.kt @@ -77,36 +77,7 @@ class DBHelper private constructor(val context: Context) : SQLiteOpenHelper(cont createGroupsTable(db) } - override fun onUpgrade(db: SQLiteDatabase, oldVersion: Int, newVersion: Int) { - if (oldVersion == 1) { - db.execSQL("ALTER TABLE $CONTACTS_TABLE_NAME ADD COLUMN $COL_ADDRESSES TEXT DEFAULT ''") - db.execSQL("ALTER TABLE $CONTACTS_TABLE_NAME ADD COLUMN $COL_NOTES TEXT DEFAULT ''") - } - - if (oldVersion < 3) { - createGroupsTable(db) - db.execSQL("ALTER TABLE $CONTACTS_TABLE_NAME ADD COLUMN $COL_GROUPS TEXT DEFAULT ''") - } - - if (oldVersion < 4) { - db.execSQL("ALTER TABLE $CONTACTS_TABLE_NAME ADD COLUMN $COL_PREFIX TEXT DEFAULT ''") - db.execSQL("ALTER TABLE $CONTACTS_TABLE_NAME ADD COLUMN $COL_SUFFIX TEXT DEFAULT ''") - db.execSQL("ALTER TABLE $CONTACTS_TABLE_NAME ADD COLUMN $COL_COMPANY TEXT DEFAULT ''") - db.execSQL("ALTER TABLE $CONTACTS_TABLE_NAME ADD COLUMN $COL_JOB_POSITION TEXT DEFAULT ''") - } - - if (oldVersion < 5) { - db.execSQL("ALTER TABLE $CONTACTS_TABLE_NAME ADD COLUMN $COL_WEBSITES TEXT DEFAULT ''") - } - - if (oldVersion < 6) { - db.execSQL("ALTER TABLE $CONTACTS_TABLE_NAME ADD COLUMN $COL_NICKNAME TEXT DEFAULT ''") - } - - if (oldVersion < 7) { - db.execSQL("ALTER TABLE $CONTACTS_TABLE_NAME ADD COLUMN $COL_IMS TEXT DEFAULT ''") - } - } + override fun onUpgrade(db: SQLiteDatabase, oldVersion: Int, newVersion: Int) {} private fun createGroupsTable(db: SQLiteDatabase) { db.execSQL("CREATE TABLE $GROUPS_TABLE_NAME ($COL_ID INTEGER PRIMARY KEY AUTOINCREMENT, $COL_TITLE TEXT)") From 644a6a2e0014c1d0f0a6c1fa0f462f79ee117e9d Mon Sep 17 00:00:00 2001 From: tibbi Date: Mon, 5 Nov 2018 20:24:49 +0100 Subject: [PATCH 004/134] handle converting local contacts to the generic contacts --- .../pro/databases/ContactsDatabase.kt | 5 +- .../contacts/pro/helpers/Constants.kt | 2 +- .../contacts/pro/helpers/ContactsHelper.kt | 4 +- .../contacts/pro/helpers/Converters.kt | 59 +++++++++++++++++++ .../pro/helpers/LocalContactsHelper.kt | 37 ++++++++++++ .../contacts/pro/models/LocalContact.kt | 18 +++--- 6 files changed, 111 insertions(+), 14 deletions(-) create mode 100644 app/src/main/kotlin/com/simplemobiletools/contacts/pro/helpers/Converters.kt create mode 100644 app/src/main/kotlin/com/simplemobiletools/contacts/pro/helpers/LocalContactsHelper.kt diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/databases/ContactsDatabase.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/databases/ContactsDatabase.kt index 94b02b27..b14e92f7 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/databases/ContactsDatabase.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/databases/ContactsDatabase.kt @@ -4,7 +4,9 @@ import android.content.Context import androidx.room.Database import androidx.room.Room import androidx.room.RoomDatabase +import androidx.room.TypeConverters import androidx.sqlite.db.SupportSQLiteDatabase +import com.simplemobiletools.contacts.pro.helpers.Converters import com.simplemobiletools.contacts.pro.helpers.getEmptyLocalContact import com.simplemobiletools.contacts.pro.interfaces.ContactsDao import com.simplemobiletools.contacts.pro.models.LocalContact @@ -12,12 +14,13 @@ import com.simplemobiletools.contacts.pro.objects.MyExecutor import java.util.concurrent.Executors @Database(entities = [(LocalContact::class)], version = 1) +@TypeConverters(Converters::class) abstract class ContactsDatabase : RoomDatabase() { abstract fun ContactsDao(): ContactsDao companion object { - private val FIRST_CONTACT_ID = 1000000L + private const val FIRST_CONTACT_ID = 1000000 private var db: ContactsDatabase? = null diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/helpers/Constants.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/helpers/Constants.kt index ea38a550..b1e4bc2a 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/helpers/Constants.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/helpers/Constants.kt @@ -121,4 +121,4 @@ const val TELEGRAM_PACKAGE = "org.telegram.messenger" const val SIGNAL_PACKAGE = "org.thoughtcrime.securesms" const val WHATSAPP_PACKAGE = "com.whatsapp" -fun getEmptyLocalContact() = LocalContact(0, "", "", "", "", "", "", null, "", "", "", false, "", "", "", "", "", "", "") +fun getEmptyLocalContact() = LocalContact(0, "", "", "", "", "", "", null, ArrayList(), ArrayList(), ArrayList(), 0, ArrayList(), "", ArrayList(), "", "", ArrayList(), ArrayList()) diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/helpers/ContactsHelper.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/helpers/ContactsHelper.kt index 57447ffc..d7aa0615 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/helpers/ContactsHelper.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/helpers/ContactsHelper.kt @@ -1213,7 +1213,7 @@ class ContactsHelper(val activity: Activity) { fun insertContact(contact: Contact): Boolean { if (contact.source == SMT_PRIVATE) { - return insertLocalContact(contact) + return LocalContactsHelper(activity).insertContact(contact) } try { @@ -1398,8 +1398,6 @@ class ContactsHelper(val activity: Activity) { } } - private fun insertLocalContact(contact: Contact) = activity.dbHelper.insertContact(contact) - private fun addFullSizePhoto(contactId: Long, fullSizePhotoData: ByteArray) { val baseUri = ContentUris.withAppendedId(ContactsContract.RawContacts.CONTENT_URI, contactId) val displayPhotoUri = Uri.withAppendedPath(baseUri, ContactsContract.RawContacts.DisplayPhoto.CONTENT_DIRECTORY) diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/helpers/Converters.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/helpers/Converters.kt new file mode 100644 index 00000000..599c17f4 --- /dev/null +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/helpers/Converters.kt @@ -0,0 +1,59 @@ +package com.simplemobiletools.contacts.pro.helpers + +import androidx.room.TypeConverter +import com.google.gson.Gson +import com.google.gson.reflect.TypeToken +import com.simplemobiletools.contacts.pro.models.* + +class Converters { + private val gson = Gson() + private val stringType = object : TypeToken>() {}.type + private val numberType = object : TypeToken>() {}.type + private val emailType = object : TypeToken>() {}.type + private val addressType = object : TypeToken>() {}.type + private val eventType = object : TypeToken>() {}.type + private val groupType = object : TypeToken>() {}.type + private val imType = object : TypeToken>() {}.type + + @TypeConverter + fun jsonToStringList(value: String) = gson.fromJson>(value, stringType) + + @TypeConverter + fun stringListToJson(list: ArrayList) = gson.toJson(list) + + @TypeConverter + fun jsonToPhoneNumberList(value: String) = gson.fromJson>(value, numberType) + + @TypeConverter + fun phoneNumberListToJson(list: ArrayList) = gson.toJson(list) + + @TypeConverter + fun jsonToEmailList(value: String) = gson.fromJson>(value, emailType) + + @TypeConverter + fun emailListToJson(list: ArrayList) = gson.toJson(list) + + @TypeConverter + fun jsonToAddressList(value: String) = gson.fromJson>(value, addressType) + + @TypeConverter + fun addressListToJson(list: ArrayList
) = gson.toJson(list) + + @TypeConverter + fun jsonToEventList(value: String) = gson.fromJson>(value, eventType) + + @TypeConverter + fun eventListToJson(list: ArrayList) = gson.toJson(list) + + @TypeConverter + fun jsonToGroupList(value: String) = gson.fromJson>(value, groupType) + + @TypeConverter + fun groupListToJson(list: ArrayList) = gson.toJson(list) + + @TypeConverter + fun jsonToIMsList(value: String) = gson.fromJson>(value, imType) + + @TypeConverter + fun IMsListToJson(list: ArrayList) = gson.toJson(list) +} diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/helpers/LocalContactsHelper.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/helpers/LocalContactsHelper.kt new file mode 100644 index 00000000..93c0e1f5 --- /dev/null +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/helpers/LocalContactsHelper.kt @@ -0,0 +1,37 @@ +package com.simplemobiletools.contacts.pro.helpers + +import android.app.Activity +import com.simplemobiletools.contacts.pro.extensions.contactsDB +import com.simplemobiletools.contacts.pro.models.Contact +import com.simplemobiletools.contacts.pro.models.LocalContact + +class LocalContactsHelper(val activity: Activity) { + fun insertContact(contact: Contact): Boolean { + val localContact = convertContactToLocalContact(contact) + activity.contactsDB.insertOrUpdate(localContact) + return true + } + + private fun convertContactToLocalContact(contact: Contact): LocalContact { + return getEmptyLocalContact().apply { + id = if (contact.id == 0) null else contact.id + prefix = contact.prefix + firstName = contact.firstName + middleName = contact.middleName + surname = contact.surname + suffix = contact.suffix + nickname = contact.nickname + phoneNumbers = contact.phoneNumbers + emails = contact.emails + events = contact.events + starred = contact.starred + addresses = contact.addresses + notes = contact.notes + groups = contact.groups + company = contact.organization.company + jobPosition = contact.organization.jobPosition + websites = contact.websites + ims = contact.IMs + } + } +} diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/models/LocalContact.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/models/LocalContact.kt index 4cd51fa5..52b2a47e 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/models/LocalContact.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/models/LocalContact.kt @@ -7,7 +7,7 @@ import androidx.room.PrimaryKey @Entity(tableName = "contacts", indices = [(Index(value = ["id"], unique = true))]) data class LocalContact( - @PrimaryKey(autoGenerate = true) var id: Long?, + @PrimaryKey(autoGenerate = true) var id: Int?, @ColumnInfo(name = "prefix") var prefix: String, @ColumnInfo(name = "first_name") var firstName: String, @ColumnInfo(name = "middle_name") var middleName: String, @@ -15,17 +15,17 @@ data class LocalContact( @ColumnInfo(name = "suffix") var suffix: String, @ColumnInfo(name = "nickname") var nickname: String, @ColumnInfo(name = "photo", typeAffinity = ColumnInfo.BLOB) var photo: ByteArray?, - @ColumnInfo(name = "phone_numbers") var phoneNumbers: String, - @ColumnInfo(name = "emails") var emails: String, - @ColumnInfo(name = "events") var events: String, - @ColumnInfo(name = "starred") var starred: Boolean, - @ColumnInfo(name = "addresses") var addresses: String, + @ColumnInfo(name = "phone_numbers") var phoneNumbers: ArrayList, + @ColumnInfo(name = "emails") var emails: ArrayList, + @ColumnInfo(name = "events") var events: ArrayList, + @ColumnInfo(name = "starred") var starred: Int, + @ColumnInfo(name = "addresses") var addresses: ArrayList
, @ColumnInfo(name = "notes") var notes: String, - @ColumnInfo(name = "groups") var groups: String, + @ColumnInfo(name = "groups") var groups: ArrayList, @ColumnInfo(name = "company") var company: String, @ColumnInfo(name = "job_position") var jobPosition: String, - @ColumnInfo(name = "websites") var websites: String, - @ColumnInfo(name = "ims") var ims: String) { + @ColumnInfo(name = "websites") var websites: ArrayList, + @ColumnInfo(name = "ims") var ims: ArrayList) { companion object { private const val serialVersionUID = -655314977575622L From f7c1f0ab107c3188b42eba724b99d00f818a5521 Mon Sep 17 00:00:00 2001 From: tibbi Date: Mon, 5 Nov 2018 21:31:30 +0100 Subject: [PATCH 005/134] handle retrieving local contacts from the database --- .../pro/activities/EditContactActivity.kt | 4 +- .../contacts/pro/extensions/Context.kt | 8 ++++ .../contacts/pro/helpers/ContactsHelper.kt | 4 +- .../pro/helpers/LocalContactsHelper.kt | 44 ++++++++++++++++++- .../contacts/pro/interfaces/ContactsDao.kt | 2 +- .../contacts/pro/models/Contact.kt | 4 +- .../contacts/pro/models/LocalContact.kt | 7 +-- 7 files changed, 58 insertions(+), 15 deletions(-) diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/EditContactActivity.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/EditContactActivity.kt index 51fc4760..e441ed4f 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/EditContactActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/EditContactActivity.kt @@ -561,9 +561,7 @@ class EditContactActivity : ContactActivity() { private fun setupNewContact() { supportActionBar?.title = resources.getString(R.string.new_contact) originalContactSource = if (hasContactPermissions()) config.lastUsedContactSource else SMT_PRIVATE - val organization = Organization("", "") - contact = Contact(0, "", "", "", "", "", "", "", ArrayList(), ArrayList(), ArrayList(), ArrayList(), originalContactSource, 0, 0, "", - null, "", ArrayList(), organization, ArrayList(), ArrayList(), ArrayList()) + contact = getEmptyContact() contact_source.text = getPublicContactSource(contact!!.source) } diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/extensions/Context.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/extensions/Context.kt index 58d45128..6ac38d33 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/extensions/Context.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/extensions/Context.kt @@ -19,6 +19,7 @@ import com.simplemobiletools.contacts.pro.databases.ContactsDatabase import com.simplemobiletools.contacts.pro.helpers.* import com.simplemobiletools.contacts.pro.interfaces.ContactsDao import com.simplemobiletools.contacts.pro.models.Contact +import com.simplemobiletools.contacts.pro.models.Organization import java.io.File val Context.config: Config get() = Config.newInstance(applicationContext) @@ -27,6 +28,13 @@ val Context.dbHelper: DBHelper get() = DBHelper.newInstance(applicationContext) val Context.contactsDB: ContactsDao get() = ContactsDatabase.getInstance(applicationContext).ContactsDao() +fun Context.getEmptyContact(): Contact { + val originalContactSource = if (hasContactPermissions()) config.lastUsedContactSource else SMT_PRIVATE + val organization = Organization("", "") + return Contact(0, "", "", "", "", "", "", "", ArrayList(), ArrayList(), ArrayList(), ArrayList(), originalContactSource, 0, 0, "", + null, "", ArrayList(), organization, ArrayList(), ArrayList(), ArrayList()) +} + fun Context.viewContact(contact: Contact) { Intent(applicationContext, ViewContactActivity::class.java).apply { putExtra(CONTACT_ID, contact.id) diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/helpers/ContactsHelper.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/helpers/ContactsHelper.kt index d7aa0615..87612c6d 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/helpers/ContactsHelper.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/helpers/ContactsHelper.kt @@ -37,7 +37,7 @@ class ContactsHelper(val activity: Activity) { getDeviceContacts(contacts) if (displayContactSources.contains(SMT_PRIVATE)) { - activity.dbHelper.getContacts(activity).forEach { + LocalContactsHelper(activity).getAllContacts().forEach { contacts.put(it.id, it) } } @@ -754,7 +754,7 @@ class ContactsHelper(val activity: Activity) { if (id == 0) { return null } else if (isLocalPrivate) { - return activity.dbHelper.getContactWithId(activity, id) + return LocalContactsHelper(activity).getContactWithId(id) } val selection = "${ContactsContract.Data.MIMETYPE} = ? AND ${ContactsContract.Data.RAW_CONTACT_ID} = ?" diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/helpers/LocalContactsHelper.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/helpers/LocalContactsHelper.kt index 93c0e1f5..a103584f 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/helpers/LocalContactsHelper.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/helpers/LocalContactsHelper.kt @@ -1,17 +1,59 @@ package com.simplemobiletools.contacts.pro.helpers import android.app.Activity +import com.simplemobiletools.contacts.pro.extensions.applyRegexFiltering +import com.simplemobiletools.contacts.pro.extensions.config import com.simplemobiletools.contacts.pro.extensions.contactsDB +import com.simplemobiletools.contacts.pro.extensions.getEmptyContact import com.simplemobiletools.contacts.pro.models.Contact import com.simplemobiletools.contacts.pro.models.LocalContact +import com.simplemobiletools.contacts.pro.models.Organization +import com.simplemobiletools.contacts.pro.models.PhoneNumber class LocalContactsHelper(val activity: Activity) { + fun getAllContacts() = activity.contactsDB.getContacts().map { convertLocalContactToContact(it) }.toMutableList() as ArrayList + + fun getContactWithId(id: Int) = convertLocalContactToContact(activity.contactsDB.getContactWithId(id)) + fun insertContact(contact: Contact): Boolean { val localContact = convertContactToLocalContact(contact) activity.contactsDB.insertOrUpdate(localContact) return true } + private fun convertLocalContactToContact(localContact: LocalContact): Contact { + val filterDuplicates = activity.config.filterDuplicates + val filteredPhoneNumbers = ArrayList() + if (filterDuplicates) { + localContact.phoneNumbers.mapTo(filteredPhoneNumbers) { PhoneNumber(it.value.applyRegexFiltering(), 0, "") } + } + + return activity.getEmptyContact().apply { + id = localContact.id!! + prefix = localContact.prefix + firstName = localContact.firstName + middleName = localContact.middleName + surname = localContact.surname + suffix = localContact.suffix + nickname = localContact.nickname + photoUri = "" + phoneNumbers = localContact.phoneNumbers + emails = localContact.emails + addresses = localContact.addresses + events = localContact.events + source = SMT_PRIVATE + starred = localContact.starred + contactId = localContact.id!! + thumbnailUri = "" + notes = localContact.notes + groups = localContact.groups + organization = Organization(localContact.company, localContact.jobPosition) + websites = localContact.websites + cleanPhoneNumbers = filteredPhoneNumbers + IMs = localContact.IMs + } + } + private fun convertContactToLocalContact(contact: Contact): LocalContact { return getEmptyLocalContact().apply { id = if (contact.id == 0) null else contact.id @@ -31,7 +73,7 @@ class LocalContactsHelper(val activity: Activity) { company = contact.organization.company jobPosition = contact.organization.jobPosition websites = contact.websites - ims = contact.IMs + IMs = contact.IMs } } } diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/interfaces/ContactsDao.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/interfaces/ContactsDao.kt index 484f072b..d8befe8d 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/interfaces/ContactsDao.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/interfaces/ContactsDao.kt @@ -12,7 +12,7 @@ interface ContactsDao { fun getContacts(): List @Query("SELECT * FROM contacts WHERE id = :id") - fun getContactWithId(id: Long): LocalContact + fun getContactWithId(id: Int): LocalContact @Insert(onConflict = OnConflictStrategy.REPLACE) fun insertOrUpdate(contact: LocalContact) diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/models/Contact.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/models/Contact.kt index adad262d..a9e5bb92 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/models/Contact.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/models/Contact.kt @@ -7,9 +7,9 @@ import com.simplemobiletools.commons.helpers.SORT_BY_MIDDLE_NAME import com.simplemobiletools.commons.helpers.SORT_DESCENDING import com.simplemobiletools.contacts.pro.extensions.applyRegexFiltering -data class Contact(val id: Int, var prefix: String, var firstName: String, var middleName: String, var surname: String, var suffix: String, var nickname: String, +data class Contact(var id: Int, var prefix: String, var firstName: String, var middleName: String, var surname: String, var suffix: String, var nickname: String, var photoUri: String, var phoneNumbers: ArrayList, var emails: ArrayList, var addresses: ArrayList
, - var events: ArrayList, var source: String, var starred: Int, val contactId: Int, val thumbnailUri: String, var photo: Bitmap?, var notes: String, + var events: ArrayList, var source: String, var starred: Int, var contactId: Int, var thumbnailUri: String, var photo: Bitmap?, var notes: String, var groups: ArrayList, var organization: Organization, var websites: ArrayList, var cleanPhoneNumbers: ArrayList, var IMs: ArrayList) : Comparable { diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/models/LocalContact.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/models/LocalContact.kt index 52b2a47e..75164cd5 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/models/LocalContact.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/models/LocalContact.kt @@ -25,9 +25,4 @@ data class LocalContact( @ColumnInfo(name = "company") var company: String, @ColumnInfo(name = "job_position") var jobPosition: String, @ColumnInfo(name = "websites") var websites: ArrayList, - @ColumnInfo(name = "ims") var ims: ArrayList) { - - companion object { - private const val serialVersionUID = -655314977575622L - } -} + @ColumnInfo(name = "ims") var IMs: ArrayList) From 6b687a1890b5e0ce600cddb3e40ce2fd8277f9f2 Mon Sep 17 00:00:00 2001 From: tibbi Date: Mon, 5 Nov 2018 22:22:27 +0100 Subject: [PATCH 006/134] add handling for local contact photo storing/retrieving --- .../pro/helpers/LocalContactsHelper.kt | 36 ++++++++++++++++--- 1 file changed, 32 insertions(+), 4 deletions(-) diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/helpers/LocalContactsHelper.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/helpers/LocalContactsHelper.kt index a103584f..1f05a698 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/helpers/LocalContactsHelper.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/helpers/LocalContactsHelper.kt @@ -1,10 +1,11 @@ package com.simplemobiletools.contacts.pro.helpers import android.app.Activity -import com.simplemobiletools.contacts.pro.extensions.applyRegexFiltering -import com.simplemobiletools.contacts.pro.extensions.config -import com.simplemobiletools.contacts.pro.extensions.contactsDB -import com.simplemobiletools.contacts.pro.extensions.getEmptyContact +import android.graphics.Bitmap +import android.graphics.BitmapFactory +import android.net.Uri +import android.provider.MediaStore +import com.simplemobiletools.contacts.pro.extensions.* import com.simplemobiletools.contacts.pro.models.Contact import com.simplemobiletools.contacts.pro.models.LocalContact import com.simplemobiletools.contacts.pro.models.Organization @@ -21,6 +22,21 @@ class LocalContactsHelper(val activity: Activity) { return true } + private fun getPhotoByteArray(uri: String): ByteArray { + if (uri.isEmpty()) { + return ByteArray(0) + } + + val photoUri = Uri.parse(uri) + val bitmap = MediaStore.Images.Media.getBitmap(activity.contentResolver, photoUri) + + val thumbnailSize = activity.getPhotoThumbnailSize() + val scaledPhoto = Bitmap.createScaledBitmap(bitmap, thumbnailSize * 2, thumbnailSize * 2, false) + val scaledSizePhotoData = scaledPhoto.getByteArray() + scaledPhoto.recycle() + return scaledSizePhotoData + } + private fun convertLocalContactToContact(localContact: LocalContact): Contact { val filterDuplicates = activity.config.filterDuplicates val filteredPhoneNumbers = ArrayList() @@ -28,6 +44,16 @@ class LocalContactsHelper(val activity: Activity) { localContact.phoneNumbers.mapTo(filteredPhoneNumbers) { PhoneNumber(it.value.applyRegexFiltering(), 0, "") } } + val contactPhoto = if (localContact.photo == null) { + null + } else { + try { + BitmapFactory.decodeByteArray(localContact.photo, 0, localContact.photo!!.size) + } catch (e: OutOfMemoryError) { + null + } + } + return activity.getEmptyContact().apply { id = localContact.id!! prefix = localContact.prefix @@ -45,6 +71,7 @@ class LocalContactsHelper(val activity: Activity) { starred = localContact.starred contactId = localContact.id!! thumbnailUri = "" + photo = contactPhoto notes = localContact.notes groups = localContact.groups organization = Organization(localContact.company, localContact.jobPosition) @@ -63,6 +90,7 @@ class LocalContactsHelper(val activity: Activity) { surname = contact.surname suffix = contact.suffix nickname = contact.nickname + photo = getPhotoByteArray(contact.photoUri) phoneNumbers = contact.phoneNumbers emails = contact.emails events = contact.events From ba108340b195191df308aaee69b7ae255ffbe157 Mon Sep 17 00:00:00 2001 From: tibbi Date: Mon, 5 Nov 2018 22:35:34 +0100 Subject: [PATCH 007/134] fix some threading issues at Edit and View screens --- .../pro/activities/EditContactActivity.kt | 22 +++++++++++----- .../pro/activities/ViewContactActivity.kt | 25 ++++++++++++------- 2 files changed, 32 insertions(+), 15 deletions(-) diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/EditContactActivity.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/EditContactActivity.kt index e441ed4f..1ddb3d2c 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/EditContactActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/EditContactActivity.kt @@ -140,20 +140,30 @@ class EditContactActivity : ContactActivity() { } if (contactId != 0) { - contact = ContactsHelper(this).getContactWithId(contactId, intent.getBooleanExtra(IS_PRIVATE, false)) - if (contact == null) { - toast(R.string.unknown_error_occurred) - finish() - return - } + Thread { + contact = ContactsHelper(this).getContactWithId(contactId, intent.getBooleanExtra(IS_PRIVATE, false)) + if (contact == null) { + toast(R.string.unknown_error_occurred) + finish() + } else { + runOnUiThread { + gotContact() + } + } + }.start() + } else { + gotContact() } + } + private fun gotContact() { if (contact == null) { setupNewContact() } else { setupEditContact() } + val action = intent.action if ((contact!!.id == 0 && intent.extras != null && intent.extras.containsKey(KEY_PHONE) && action == Intent.ACTION_INSERT) || action == ADD_NEW_CONTACT_NUMBER) { val phone = intent.extras.get(KEY_PHONE) if (phone != null) { diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/ViewContactActivity.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/ViewContactActivity.kt index 386aaa2d..c75b96f8 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/ViewContactActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/ViewContactActivity.kt @@ -98,21 +98,28 @@ class ViewContactActivity : ContactActivity() { } if (contactId != 0 && !wasLookupKeyUsed) { - contact = ContactsHelper(this).getContactWithId(contactId, intent.getBooleanExtra(IS_PRIVATE, false)) + Thread { + contact = ContactsHelper(this).getContactWithId(contactId, intent.getBooleanExtra(IS_PRIVATE, false)) + if (contact == null) { + toast(R.string.unknown_error_occurred) + finish() + } else { + runOnUiThread { + gotContact() + } + } + }.start() + } else { if (contact == null) { - toast(R.string.unknown_error_occurred) finish() - return + } else { + gotContact() } } + } - if (contact == null) { - finish() - return - } - + private fun gotContact() { setupViewContact() - contact_send_sms.beVisibleIf(contact!!.phoneNumbers.isNotEmpty()) contact_start_call.beVisibleIf(contact!!.phoneNumbers.isNotEmpty()) contact_send_email.beVisibleIf(contact!!.emails.isNotEmpty()) From 79e46c43d5d80baa06f9d82ca7e7644cbda5ff55 Mon Sep 17 00:00:00 2001 From: tibbi Date: Mon, 5 Nov 2018 22:48:19 +0100 Subject: [PATCH 008/134] fix some LocalContact related warnings --- .../simplemobiletools/contacts/pro/models/LocalContact.kt | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/models/LocalContact.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/models/LocalContact.kt index 75164cd5..011fa534 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/models/LocalContact.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/models/LocalContact.kt @@ -25,4 +25,9 @@ data class LocalContact( @ColumnInfo(name = "company") var company: String, @ColumnInfo(name = "job_position") var jobPosition: String, @ColumnInfo(name = "websites") var websites: ArrayList, - @ColumnInfo(name = "ims") var IMs: ArrayList) + @ColumnInfo(name = "ims") var IMs: ArrayList) { + + override fun equals(other: Any?) = this.id == (other as? LocalContact?)?.id + + override fun hashCode() = id ?: 0 +} From 23c5ab829789ec08b28a3f1f775899c7b197221a Mon Sep 17 00:00:00 2001 From: tibbi Date: Mon, 5 Nov 2018 22:49:20 +0100 Subject: [PATCH 009/134] add support for updating local contacts --- .../simplemobiletools/contacts/pro/helpers/ContactsHelper.kt | 4 ++-- .../contacts/pro/helpers/LocalContactsHelper.kt | 5 ++--- .../simplemobiletools/contacts/pro/interfaces/ContactsDao.kt | 2 +- 3 files changed, 5 insertions(+), 6 deletions(-) diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/helpers/ContactsHelper.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/helpers/ContactsHelper.kt index 87612c6d..20a9e2a9 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/helpers/ContactsHelper.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/helpers/ContactsHelper.kt @@ -902,7 +902,7 @@ class ContactsHelper(val activity: Activity) { fun updateContact(contact: Contact, photoUpdateStatus: Int): Boolean { activity.toast(R.string.updating) if (contact.source == SMT_PRIVATE) { - return activity.dbHelper.updateContact(contact) + return LocalContactsHelper(activity).insertOrUpdateContact(contact) } try { @@ -1213,7 +1213,7 @@ class ContactsHelper(val activity: Activity) { fun insertContact(contact: Contact): Boolean { if (contact.source == SMT_PRIVATE) { - return LocalContactsHelper(activity).insertContact(contact) + return LocalContactsHelper(activity).insertOrUpdateContact(contact) } try { diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/helpers/LocalContactsHelper.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/helpers/LocalContactsHelper.kt index 1f05a698..0a158106 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/helpers/LocalContactsHelper.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/helpers/LocalContactsHelper.kt @@ -16,10 +16,9 @@ class LocalContactsHelper(val activity: Activity) { fun getContactWithId(id: Int) = convertLocalContactToContact(activity.contactsDB.getContactWithId(id)) - fun insertContact(contact: Contact): Boolean { + fun insertOrUpdateContact(contact: Contact): Boolean { val localContact = convertContactToLocalContact(contact) - activity.contactsDB.insertOrUpdate(localContact) - return true + return activity.contactsDB.insertOrUpdate(localContact) > 0 } private fun getPhotoByteArray(uri: String): ByteArray { diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/interfaces/ContactsDao.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/interfaces/ContactsDao.kt index d8befe8d..2e26861e 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/interfaces/ContactsDao.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/interfaces/ContactsDao.kt @@ -15,7 +15,7 @@ interface ContactsDao { fun getContactWithId(id: Int): LocalContact @Insert(onConflict = OnConflictStrategy.REPLACE) - fun insertOrUpdate(contact: LocalContact) + fun insertOrUpdate(contact: LocalContact): Long @Query("DELETE FROM contacts WHERE id IN (:ids)") fun deleteContactIds(ids: String) From e2a5381a74d20445e5a08195f9c30d691754dacc Mon Sep 17 00:00:00 2001 From: tibbi Date: Mon, 5 Nov 2018 22:51:55 +0100 Subject: [PATCH 010/134] removing some redundant Sqlite DBHelper functions --- .../contacts/pro/helpers/DBHelper.kt | 58 ------------------- 1 file changed, 58 deletions(-) diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/helpers/DBHelper.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/helpers/DBHelper.kt index 0fd47f7c..5b454ddd 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/helpers/DBHelper.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/helpers/DBHelper.kt @@ -86,19 +86,6 @@ class DBHelper private constructor(val context: Context) : SQLiteOpenHelper(cont db.execSQL("REPLACE INTO sqlite_sequence (name, seq) VALUES ('$GROUPS_TABLE_NAME', $FIRST_GROUP_ID)") } - fun insertContact(contact: Contact): Boolean { - val contactValues = fillContactValues(contact) - val id = mDb.insert(CONTACTS_TABLE_NAME, null, contactValues).toInt() - return id != -1 - } - - fun updateContact(contact: Contact): Boolean { - val contactValues = fillContactValues(contact) - val selection = "$COL_ID = ?" - val selectionArgs = arrayOf(contact.id.toString()) - return mDb.update(CONTACTS_TABLE_NAME, contactValues, selection, selectionArgs) == 1 - } - fun deleteContact(id: Int) = deleteContacts(arrayOf(id.toString())) fun deleteContacts(ids: Array) { @@ -111,45 +98,6 @@ class DBHelper private constructor(val context: Context) : SQLiteOpenHelper(cont mDb.delete(CONTACTS_TABLE_NAME, selection, null) } - private fun fillContactValues(contact: Contact): ContentValues { - return ContentValues().apply { - put(COL_PREFIX, contact.prefix) - put(COL_FIRST_NAME, contact.firstName) - put(COL_MIDDLE_NAME, contact.middleName) - put(COL_SURNAME, contact.surname) - put(COL_SUFFIX, contact.suffix) - put(COL_NICKNAME, contact.nickname) - put(COL_PHONE_NUMBERS, gson.toJson(contact.phoneNumbers)) - put(COL_EMAILS, gson.toJson(contact.emails)) - put(COL_ADDRESSES, gson.toJson(contact.addresses)) - put(COL_IMS, gson.toJson(contact.IMs)) - put(COL_EVENTS, gson.toJson(contact.events)) - put(COL_STARRED, contact.starred) - put(COL_NOTES, contact.notes) - put(COL_GROUPS, gson.toJson(contact.groups.map { it.id })) - put(COL_COMPANY, contact.organization.company) - put(COL_JOB_POSITION, contact.organization.jobPosition) - put(COL_WEBSITES, gson.toJson(contact.websites)) - - if (contact.photoUri.isNotEmpty()) { - put(COL_PHOTO, getPhotoByteArray(contact.photoUri)) - } else if (contact.photo == null) { - putNull(COL_PHOTO) - } - } - } - - private fun getPhotoByteArray(uri: String): ByteArray { - val photoUri = Uri.parse(uri) - val bitmap = MediaStore.Images.Media.getBitmap(context.contentResolver, photoUri) - - val thumbnailSize = context.getPhotoThumbnailSize() - val scaledPhoto = Bitmap.createScaledBitmap(bitmap, thumbnailSize * 2, thumbnailSize * 2, false) - val scaledSizePhotoData = scaledPhoto.getByteArray() - scaledPhoto.recycle() - return scaledSizePhotoData - } - fun toggleFavorites(ids: Array, addToFavorites: Boolean) { val contactValues = ContentValues() contactValues.put(COL_STARRED, if (addToFavorites) 1 else 0) @@ -331,10 +279,4 @@ class DBHelper private constructor(val context: Context) : SQLiteOpenHelper(cont } return contacts } - - fun getContactWithId(activity: Activity, id: Int): Contact? { - val selection = "$COL_ID = ?" - val selectionArgs = arrayOf(id.toString()) - return getContacts(activity, selection, selectionArgs).firstOrNull() - } } From 9634199605b945b75cf717959ecf4b660017564a Mon Sep 17 00:00:00 2001 From: tibbi Date: Mon, 5 Nov 2018 23:41:28 +0100 Subject: [PATCH 011/134] handle local contact Starred toggling --- .../contacts/pro/helpers/ContactsHelper.kt | 24 +++++++++++-------- .../contacts/pro/helpers/DBHelper.kt | 14 ----------- .../pro/helpers/LocalContactsHelper.kt | 7 ++++++ .../contacts/pro/interfaces/ContactsDao.kt | 3 +++ 4 files changed, 24 insertions(+), 24 deletions(-) diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/helpers/ContactsHelper.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/helpers/ContactsHelper.kt index 20a9e2a9..575c8137 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/helpers/ContactsHelper.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/helpers/ContactsHelper.kt @@ -1446,17 +1446,21 @@ class ContactsHelper(val activity: Activity) { } fun addFavorites(contacts: ArrayList) { - toggleLocalFavorites(contacts, true) - if (activity.hasContactPermissions()) { - toggleFavorites(contacts, true) - } + Thread { + toggleLocalFavorites(contacts, true) + if (activity.hasContactPermissions()) { + toggleFavorites(contacts, true) + } + }.start() } fun removeFavorites(contacts: ArrayList) { - toggleLocalFavorites(contacts, false) - if (activity.hasContactPermissions()) { - toggleFavorites(contacts, false) - } + Thread { + toggleLocalFavorites(contacts, false) + if (activity.hasContactPermissions()) { + toggleFavorites(contacts, false) + } + }.start() } private fun toggleFavorites(contacts: ArrayList, addToFavorites: Boolean) { @@ -1481,8 +1485,8 @@ class ContactsHelper(val activity: Activity) { } private fun toggleLocalFavorites(contacts: ArrayList, addToFavorites: Boolean) { - val localContacts = contacts.filter { it.source == SMT_PRIVATE }.map { it.id.toString() }.toTypedArray() - activity.dbHelper.toggleFavorites(localContacts, addToFavorites) + val localContacts = contacts.filter { it.source == SMT_PRIVATE }.map { it.id }.toTypedArray() + LocalContactsHelper(activity).toggleFavorites(localContacts, addToFavorites) } fun deleteContact(contact: Contact) { diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/helpers/DBHelper.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/helpers/DBHelper.kt index 5b454ddd..ed12f089 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/helpers/DBHelper.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/helpers/DBHelper.kt @@ -5,10 +5,7 @@ import android.content.ContentValues import android.content.Context import android.database.sqlite.SQLiteDatabase import android.database.sqlite.SQLiteOpenHelper -import android.graphics.Bitmap import android.graphics.BitmapFactory -import android.net.Uri -import android.provider.MediaStore import android.text.TextUtils import com.google.gson.Gson import com.google.gson.reflect.TypeToken @@ -18,8 +15,6 @@ import com.simplemobiletools.commons.extensions.getLongValue import com.simplemobiletools.commons.extensions.getStringValue import com.simplemobiletools.contacts.pro.extensions.applyRegexFiltering import com.simplemobiletools.contacts.pro.extensions.config -import com.simplemobiletools.contacts.pro.extensions.getByteArray -import com.simplemobiletools.contacts.pro.extensions.getPhotoThumbnailSize import com.simplemobiletools.contacts.pro.models.* class DBHelper private constructor(val context: Context) : SQLiteOpenHelper(context, DB_NAME, null, DB_VERSION) { @@ -98,15 +93,6 @@ class DBHelper private constructor(val context: Context) : SQLiteOpenHelper(cont mDb.delete(CONTACTS_TABLE_NAME, selection, null) } - fun toggleFavorites(ids: Array, addToFavorites: Boolean) { - val contactValues = ContentValues() - contactValues.put(COL_STARRED, if (addToFavorites) 1 else 0) - - val args = TextUtils.join(", ", ids) - val selection = "$COL_ID IN ($args)" - mDb.update(CONTACTS_TABLE_NAME, contactValues, selection, null) - } - fun insertGroup(group: Group): Group? { val contactValues = fillGroupValues(group) val id = mDb.insert(GROUPS_TABLE_NAME, null, contactValues) diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/helpers/LocalContactsHelper.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/helpers/LocalContactsHelper.kt index 0a158106..cbec2b6a 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/helpers/LocalContactsHelper.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/helpers/LocalContactsHelper.kt @@ -21,6 +21,13 @@ class LocalContactsHelper(val activity: Activity) { return activity.contactsDB.insertOrUpdate(localContact) > 0 } + fun toggleFavorites(ids: Array, addToFavorites: Boolean) { + val isStarred = if (addToFavorites) 1 else 0 + ids.forEach { + activity.contactsDB.updateStarred(isStarred, it) + } + } + private fun getPhotoByteArray(uri: String): ByteArray { if (uri.isEmpty()) { return ByteArray(0) diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/interfaces/ContactsDao.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/interfaces/ContactsDao.kt index 2e26861e..10686132 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/interfaces/ContactsDao.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/interfaces/ContactsDao.kt @@ -14,6 +14,9 @@ interface ContactsDao { @Query("SELECT * FROM contacts WHERE id = :id") fun getContactWithId(id: Int): LocalContact + @Query("UPDATE contacts SET starred = :isStarred WHERE id = :id") + fun updateStarred(isStarred: Int, id: Int) + @Insert(onConflict = OnConflictStrategy.REPLACE) fun insertOrUpdate(contact: LocalContact): Long From 17e10c7016ccef0bd98a74d327afdda7ef3d96be Mon Sep 17 00:00:00 2001 From: tibbi Date: Tue, 6 Nov 2018 09:53:49 +0100 Subject: [PATCH 012/134] handle local contact deleting --- .../pro/activities/ViewContactActivity.kt | 12 ++++- .../contacts/pro/adapters/ContactsAdapter.kt | 5 +- .../pro/databases/ContactsDatabase.kt | 2 +- .../contacts/pro/helpers/ContactsHelper.kt | 52 +++++++++---------- .../contacts/pro/helpers/DBHelper.kt | 12 ----- .../pro/helpers/LocalContactsHelper.kt | 12 ++++- .../contacts/pro/interfaces/ContactsDao.kt | 6 +-- 7 files changed, 55 insertions(+), 46 deletions(-) diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/ViewContactActivity.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/ViewContactActivity.kt index c75b96f8..f008fbb6 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/ViewContactActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/ViewContactActivity.kt @@ -25,6 +25,7 @@ import kotlinx.android.synthetic.main.item_website.view.* class ViewContactActivity : ContactActivity() { private var isViewIntent = false + private var wasEditLaunched = false private var showFields = 0 override fun onCreate(savedInstanceState: Bundle?) { @@ -64,7 +65,7 @@ class ViewContactActivity : ContactActivity() { } when (item.itemId) { - R.id.edit -> editContact(contact!!) + R.id.edit -> editContact() R.id.share -> shareContact() R.id.open_with -> openWith() R.id.delete -> deleteContact() @@ -101,7 +102,9 @@ class ViewContactActivity : ContactActivity() { Thread { contact = ContactsHelper(this).getContactWithId(contactId, intent.getBooleanExtra(IS_PRIVATE, false)) if (contact == null) { - toast(R.string.unknown_error_occurred) + if (!wasEditLaunched) { + toast(R.string.unknown_error_occurred) + } finish() } else { runOnUiThread { @@ -170,6 +173,11 @@ class ViewContactActivity : ContactActivity() { setupContactSource() } + private fun editContact() { + wasEditLaunched = true + editContact(contact!!) + } + private fun openWith() { Intent().apply { action = ContactsContract.QuickContact.ACTION_QUICK_CONTACT diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/adapters/ContactsAdapter.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/adapters/ContactsAdapter.kt index 5a4baf46..90a10f1a 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/adapters/ContactsAdapter.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/adapters/ContactsAdapter.kt @@ -158,7 +158,10 @@ class ContactsAdapter(activity: SimpleActivity, var contactItems: ArrayList) { - Thread { - val localContacts = contacts.filter { it.source == SMT_PRIVATE }.map { it.id.toString() }.toTypedArray() - activity.dbHelper.deleteContacts(localContacts) + val localContacts = contacts.filter { it.source == SMT_PRIVATE }.map { it.id }.toTypedArray() + LocalContactsHelper(activity).deleteContactIds(localContacts) - try { - val operations = ArrayList() - val selection = "${ContactsContract.RawContacts._ID} = ?" - contacts.filter { it.source != SMT_PRIVATE }.forEach { - ContentProviderOperation.newDelete(ContactsContract.RawContacts.CONTENT_URI).apply { - val selectionArgs = arrayOf(it.id.toString()) - withSelection(selection, selectionArgs) - operations.add(build()) - } - - if (operations.size % BATCH_SIZE == 0) { - activity.contentResolver.applyBatch(ContactsContract.AUTHORITY, operations) - operations.clear() - } + try { + val operations = ArrayList() + val selection = "${ContactsContract.RawContacts._ID} = ?" + contacts.filter { it.source != SMT_PRIVATE }.forEach { + ContentProviderOperation.newDelete(ContactsContract.RawContacts.CONTENT_URI).apply { + val selectionArgs = arrayOf(it.id.toString()) + withSelection(selection, selectionArgs) + operations.add(build()) } - if (activity.hasPermission(PERMISSION_WRITE_CONTACTS)) { + if (operations.size % BATCH_SIZE == 0) { activity.contentResolver.applyBatch(ContactsContract.AUTHORITY, operations) + operations.clear() } - } catch (e: Exception) { - activity.showErrorToast(e) } - }.start() + + if (activity.hasPermission(PERMISSION_WRITE_CONTACTS)) { + activity.contentResolver.applyBatch(ContactsContract.AUTHORITY, operations) + } + } catch (e: Exception) { + activity.showErrorToast(e) + } } @SuppressLint("MissingPermission") diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/helpers/DBHelper.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/helpers/DBHelper.kt index ed12f089..f7be8358 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/helpers/DBHelper.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/helpers/DBHelper.kt @@ -81,18 +81,6 @@ class DBHelper private constructor(val context: Context) : SQLiteOpenHelper(cont db.execSQL("REPLACE INTO sqlite_sequence (name, seq) VALUES ('$GROUPS_TABLE_NAME', $FIRST_GROUP_ID)") } - fun deleteContact(id: Int) = deleteContacts(arrayOf(id.toString())) - - fun deleteContacts(ids: Array) { - if (ids.isEmpty()) { - return - } - - val args = TextUtils.join(", ", ids) - val selection = "$CONTACTS_TABLE_NAME.$COL_ID IN ($args)" - mDb.delete(CONTACTS_TABLE_NAME, selection, null) - } - fun insertGroup(group: Group): Group? { val contactValues = fillGroupValues(group) val id = mDb.insert(GROUPS_TABLE_NAME, null, contactValues) diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/helpers/LocalContactsHelper.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/helpers/LocalContactsHelper.kt index cbec2b6a..f9fc990d 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/helpers/LocalContactsHelper.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/helpers/LocalContactsHelper.kt @@ -21,6 +21,12 @@ class LocalContactsHelper(val activity: Activity) { return activity.contactsDB.insertOrUpdate(localContact) > 0 } + fun deleteContactIds(ids: Array) { + ids.forEach { + activity.contactsDB.deleteContactId(it) + } + } + fun toggleFavorites(ids: Array, addToFavorites: Boolean) { val isStarred = if (addToFavorites) 1 else 0 ids.forEach { @@ -43,7 +49,11 @@ class LocalContactsHelper(val activity: Activity) { return scaledSizePhotoData } - private fun convertLocalContactToContact(localContact: LocalContact): Contact { + private fun convertLocalContactToContact(localContact: LocalContact?): Contact? { + if (localContact == null) { + return null + } + val filterDuplicates = activity.config.filterDuplicates val filteredPhoneNumbers = ArrayList() if (filterDuplicates) { diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/interfaces/ContactsDao.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/interfaces/ContactsDao.kt index 10686132..373df2d3 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/interfaces/ContactsDao.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/interfaces/ContactsDao.kt @@ -12,7 +12,7 @@ interface ContactsDao { fun getContacts(): List @Query("SELECT * FROM contacts WHERE id = :id") - fun getContactWithId(id: Int): LocalContact + fun getContactWithId(id: Int): LocalContact? @Query("UPDATE contacts SET starred = :isStarred WHERE id = :id") fun updateStarred(isStarred: Int, id: Int) @@ -20,6 +20,6 @@ interface ContactsDao { @Insert(onConflict = OnConflictStrategy.REPLACE) fun insertOrUpdate(contact: LocalContact): Long - @Query("DELETE FROM contacts WHERE id IN (:ids)") - fun deleteContactIds(ids: String) + @Query("DELETE FROM contacts WHERE id = :id") + fun deleteContactId(id: Int) } From 02a7d761965e14aca0be0de3d31ccef132638d34 Mon Sep 17 00:00:00 2001 From: tibbi Date: Tue, 6 Nov 2018 10:28:41 +0100 Subject: [PATCH 013/134] destroy ContactsDatabase on app exit --- .../simplemobiletools/contacts/pro/activities/MainActivity.kt | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/MainActivity.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/MainActivity.kt index a05aefc0..e2f72172 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/MainActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/MainActivity.kt @@ -22,6 +22,7 @@ import com.simplemobiletools.commons.models.Release import com.simplemobiletools.contacts.pro.BuildConfig import com.simplemobiletools.contacts.pro.R import com.simplemobiletools.contacts.pro.adapters.ViewPagerAdapter +import com.simplemobiletools.contacts.pro.databases.ContactsDatabase import com.simplemobiletools.contacts.pro.dialogs.ChangeSortingDialog import com.simplemobiletools.contacts.pro.dialogs.ExportContactsDialog import com.simplemobiletools.contacts.pro.dialogs.FilterContactSourcesDialog @@ -173,6 +174,9 @@ class MainActivity : SimpleActivity(), RefreshContactsListener { override fun onDestroy() { super.onDestroy() config.lastUsedViewPagerPage = viewpager.currentItem + if (!isChangingConfigurations) { + ContactsDatabase.destroyInstance() + } } override fun onCreateOptionsMenu(menu: Menu): Boolean { From 93cf31b2f2f35deaf21133dc804bb26cbf35384c Mon Sep 17 00:00:00 2001 From: tibbi Date: Tue, 6 Nov 2018 20:12:11 +0100 Subject: [PATCH 014/134] add support for local groups --- .../pro/activities/EditContactActivity.kt | 2 +- .../pro/activities/GroupContactsActivity.kt | 6 +- .../pro/activities/ViewContactActivity.kt | 34 ++++++---- .../contacts/pro/adapters/ContactsAdapter.kt | 19 ++++-- .../contacts/pro/adapters/GroupsAdapter.kt | 12 ++-- .../pro/databases/ContactsDatabase.kt | 21 ++++-- .../pro/dialogs/CreateNewGroupDialog.kt | 14 ++-- .../pro/dialogs/SelectGroupsDialog.kt | 13 +++- .../contacts/pro/extensions/Context.kt | 3 + .../pro/fragments/MyViewPagerFragment.kt | 68 ++++++++++--------- .../contacts/pro/helpers/Constants.kt | 2 +- .../contacts/pro/helpers/ContactsHelper.kt | 24 +++++-- .../contacts/pro/helpers/DBHelper.kt | 28 +------- .../contacts/pro/helpers/VcfImporter.kt | 13 ++-- .../contacts/pro/interfaces/GroupsDao.kt | 19 ++++++ .../contacts/pro/models/Group.kt | 15 ++-- 16 files changed, 170 insertions(+), 123 deletions(-) create mode 100644 app/src/main/kotlin/com/simplemobiletools/contacts/pro/interfaces/GroupsDao.kt diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/EditContactActivity.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/EditContactActivity.kt index 1ddb3d2c..abf4376c 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/EditContactActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/EditContactActivity.kt @@ -540,7 +540,7 @@ class EditContactActivity : ContactActivity() { applyColorFilter(getAdjustedPrimaryColor()) background.applyColorFilter(config.textColor) setOnClickListener { - removeGroup(group.id) + removeGroup(group.id!!) } } } diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/GroupContactsActivity.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/GroupContactsActivity.kt index 0e33c5c5..5a1a056c 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/GroupContactsActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/GroupContactsActivity.kt @@ -70,8 +70,8 @@ class GroupContactsActivity : SimpleActivity(), RemoveFromGroupListener, Refresh private fun fabClicked() { SelectContactsDialog(this, allContacts, groupContacts) { addedContacts, removedContacts -> Thread { - addContactsToGroup(addedContacts, group.id) - removeContactsFromGroup(removedContacts, group.id) + addContactsToGroup(addedContacts, group.id!!) + removeContactsFromGroup(removedContacts, group.id!!) refreshContacts() }.start() } @@ -129,7 +129,7 @@ class GroupContactsActivity : SimpleActivity(), RemoveFromGroupListener, Refresh override fun removeFromGroup(contacts: ArrayList) { Thread { - removeContactsFromGroup(contacts, group.id) + removeContactsFromGroup(contacts, group.id!!) if (groupContacts.size == 0) { refreshContacts() } diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/ViewContactActivity.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/ViewContactActivity.kt index f008fbb6..3d1329ba 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/ViewContactActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/ViewContactActivity.kt @@ -40,14 +40,18 @@ class ViewContactActivity : ContactActivity() { if (isViewIntent) { handlePermission(PERMISSION_READ_CONTACTS) { if (it) { - initContact() + Thread { + initContact() + }.start() } else { toast(R.string.no_contacts_permission) finish() } } } else { - initContact() + Thread { + initContact() + }.start() } } @@ -99,24 +103,24 @@ class ViewContactActivity : ContactActivity() { } if (contactId != 0 && !wasLookupKeyUsed) { - Thread { - contact = ContactsHelper(this).getContactWithId(contactId, intent.getBooleanExtra(IS_PRIVATE, false)) - if (contact == null) { - if (!wasEditLaunched) { - toast(R.string.unknown_error_occurred) - } - finish() - } else { - runOnUiThread { - gotContact() - } + contact = ContactsHelper(this).getContactWithId(contactId, intent.getBooleanExtra(IS_PRIVATE, false)) + if (contact == null) { + if (!wasEditLaunched) { + toast(R.string.unknown_error_occurred) } - }.start() + finish() + } else { + runOnUiThread { + gotContact() + } + } } else { if (contact == null) { finish() } else { - gotContact() + runOnUiThread { + gotContact() + } } } } diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/adapters/ContactsAdapter.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/adapters/ContactsAdapter.kt index 90a10f1a..925652c5 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/adapters/ContactsAdapter.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/adapters/ContactsAdapter.kt @@ -34,6 +34,7 @@ class ContactsAdapter(activity: SimpleActivity, var contactItems: ArrayList Unit) : MyRecyclerViewAdapter(activity, recyclerView, fastScroller, itemClick) { + private val NEW_GROUP_ID = -1 private lateinit var contactDrawable: Drawable private lateinit var businessContactDrawable: Drawable @@ -198,19 +199,23 @@ class ContactsAdapter(activity: SimpleActivity, var contactItems: ArrayList() - ContactsHelper(activity).getStoredGroups().forEach { - items.add(RadioItem(it.id.toInt(), it.title)) + ContactsHelper(activity).getStoredGroups { + it.forEach { + items.add(RadioItem(it.id!!.toInt(), it.title)) + items.add(RadioItem(NEW_GROUP_ID, activity.getString(R.string.create_new_group))) + } + showGroupsPicker(items) } - items.add(RadioItem(NEW_GROUP_ID, activity.getString(R.string.create_new_group))) + } - RadioGroupDialog(activity, items, 0) { + private fun showGroupsPicker(radioItems: ArrayList) { + val selectedContacts = getSelectedItems() + RadioGroupDialog(activity, radioItems, 0) { if (it as Int == NEW_GROUP_ID) { CreateNewGroupDialog(activity) { Thread { - activity.addContactsToGroup(selectedContacts, it.id) + activity.addContactsToGroup(selectedContacts, it.id!!.toLong()) refreshListener?.refreshContacts(GROUPS_TAB_MASK) }.start() finishActMode() diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/adapters/GroupsAdapter.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/adapters/GroupsAdapter.kt index f700168c..c2e78641 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/adapters/GroupsAdapter.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/adapters/GroupsAdapter.kt @@ -59,7 +59,7 @@ class GroupsAdapter(activity: SimpleActivity, var groups: ArrayList, val override fun getItemSelectionKey(position: Int) = groups.getOrNull(position)?.id?.toInt() - override fun getItemKeyPosition(key: Int) = groups.indexOfFirst { it.id.toInt() == key } + override fun getItemKeyPosition(key: Int) = groups.indexOfFirst { it.id!!.toInt() == key } override fun onCreateViewHolder(parent: ViewGroup, viewType: Int) = createViewHolder(R.layout.item_group, parent) @@ -73,7 +73,7 @@ class GroupsAdapter(activity: SimpleActivity, var groups: ArrayList, val override fun getItemCount() = groups.size - private fun getItemWithKey(key: Int): Group? = groups.firstOrNull { it.id.toInt() == key } + private fun getItemWithKey(key: Int): Group? = groups.firstOrNull { it.id!!.toInt() == key } fun updateItems(newItems: ArrayList) { groups = newItems @@ -101,13 +101,13 @@ class GroupsAdapter(activity: SimpleActivity, var groups: ArrayList, val return } - val groupsToRemove = groups.filter { selectedKeys.contains(it.id.toInt()) } as ArrayList + val groupsToRemove = groups.filter { selectedKeys.contains(it.id!!.toInt()) } as ArrayList val positions = getSelectedItemPositions() groupsToRemove.forEach { if (it.isPrivateSecretGroup()) { - activity.dbHelper.deleteGroup(it.id) + activity.dbHelper.deleteGroup(it.id!!) } else { - ContactsHelper(activity).deleteGroup(it.id) + ContactsHelper(activity).deleteGroup(it.id!!) } } groups.removeAll(groupsToRemove) @@ -122,7 +122,7 @@ class GroupsAdapter(activity: SimpleActivity, var groups: ArrayList, val private fun setupView(view: View, group: Group) { view.apply { - group_frame?.isSelected = selectedKeys.contains(group.id.toInt()) + group_frame?.isSelected = selectedKeys.contains(group.id!!.toInt()) group_name.apply { setTextColor(textColor) text = String.format(activity.getString(R.string.groups_placeholder), group.title, group.contactsCount.toString()) diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/databases/ContactsDatabase.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/databases/ContactsDatabase.kt index 42e0c102..295a0bd7 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/databases/ContactsDatabase.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/databases/ContactsDatabase.kt @@ -7,18 +7,23 @@ import androidx.room.RoomDatabase import androidx.room.TypeConverters import androidx.sqlite.db.SupportSQLiteDatabase import com.simplemobiletools.contacts.pro.helpers.Converters +import com.simplemobiletools.contacts.pro.helpers.FIRST_GROUP_ID import com.simplemobiletools.contacts.pro.helpers.getEmptyLocalContact import com.simplemobiletools.contacts.pro.interfaces.ContactsDao +import com.simplemobiletools.contacts.pro.interfaces.GroupsDao +import com.simplemobiletools.contacts.pro.models.Group import com.simplemobiletools.contacts.pro.models.LocalContact import com.simplemobiletools.contacts.pro.objects.MyExecutor import java.util.concurrent.Executors -@Database(entities = [(LocalContact::class)], version = 1) +@Database(entities = [LocalContact::class, Group::class], version = 1) @TypeConverters(Converters::class) abstract class ContactsDatabase : RoomDatabase() { abstract fun ContactsDao(): ContactsDao + abstract fun GroupsDao(): GroupsDao + companion object { private const val FIRST_CONTACT_ID = 1000000 @@ -33,7 +38,7 @@ abstract class ContactsDatabase : RoomDatabase() { .addCallback(object : Callback() { override fun onCreate(db: SupportSQLiteDatabase) { super.onCreate(db) - increaseAutoIncrementId() + increaseAutoIncrementIds() } }) .build() @@ -48,9 +53,9 @@ abstract class ContactsDatabase : RoomDatabase() { db = null } - // start autoincrement ID from FIRST_CONTACT_ID to avoid conflicts - // Room doesn't seem to have a built in way for it, so just create a contact and delete it - private fun increaseAutoIncrementId() { + // start autoincrement ID from FIRST_CONTACT_ID/FIRST_GROUP_ID to avoid conflicts + // Room doesn't seem to have a built in way for it, so just create a contact/group and delete it + private fun increaseAutoIncrementIds() { Executors.newSingleThreadExecutor().execute { val emptyContact = getEmptyLocalContact() emptyContact.id = FIRST_CONTACT_ID @@ -58,6 +63,12 @@ abstract class ContactsDatabase : RoomDatabase() { insertOrUpdate(emptyContact) deleteContactId(FIRST_CONTACT_ID) } + + val emptyGroup = Group(FIRST_GROUP_ID, "") + db!!.GroupsDao().apply { + insertOrUpdate(emptyGroup) + deleteGroupId(FIRST_GROUP_ID) + } } } } diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/dialogs/CreateNewGroupDialog.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/dialogs/CreateNewGroupDialog.kt index f4eb3dbb..a0e0e9e8 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/dialogs/CreateNewGroupDialog.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/dialogs/CreateNewGroupDialog.kt @@ -65,10 +65,14 @@ class CreateNewGroupDialog(val activity: BaseSimpleActivity, val callback: (newG } private fun createGroupUnder(name: String, contactSource: ContactSource, dialog: AlertDialog) { - val newGroup = ContactsHelper(activity).createNewGroup(name, contactSource.name, contactSource.type) - if (newGroup != null) { - callback(newGroup) - } - dialog.dismiss() + Thread { + val newGroup = ContactsHelper(activity).createNewGroup(name, contactSource.name, contactSource.type) + activity.runOnUiThread { + if (newGroup != null) { + callback(newGroup) + } + dialog.dismiss() + } + }.start() } } diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/dialogs/SelectGroupsDialog.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/dialogs/SelectGroupsDialog.kt index 78a35542..25e97f5b 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/dialogs/SelectGroupsDialog.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/dialogs/SelectGroupsDialog.kt @@ -17,11 +17,20 @@ import java.util.* class SelectGroupsDialog(val activity: SimpleActivity, val selectedGroups: ArrayList, val callback: (newGroups: ArrayList) -> Unit) { private val view = activity.layoutInflater.inflate(R.layout.dialog_select_groups, null) as ViewGroup private val checkboxes = ArrayList() - private val groups = ContactsHelper(activity).getStoredGroups() + private var groups = ArrayList() private val config = activity.config - private val dialog: AlertDialog? + private var dialog: AlertDialog? = null init { + ContactsHelper(activity).getStoredGroups { + groups = it + activity.runOnUiThread { + initDialog() + } + } + } + + private fun initDialog() { groups.sortedBy { it.title }.forEach { addGroupCheckbox(it) } diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/extensions/Context.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/extensions/Context.kt index 6ac38d33..50ad82d7 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/extensions/Context.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/extensions/Context.kt @@ -18,6 +18,7 @@ import com.simplemobiletools.contacts.pro.activities.ViewContactActivity import com.simplemobiletools.contacts.pro.databases.ContactsDatabase import com.simplemobiletools.contacts.pro.helpers.* import com.simplemobiletools.contacts.pro.interfaces.ContactsDao +import com.simplemobiletools.contacts.pro.interfaces.GroupsDao import com.simplemobiletools.contacts.pro.models.Contact import com.simplemobiletools.contacts.pro.models.Organization import java.io.File @@ -28,6 +29,8 @@ val Context.dbHelper: DBHelper get() = DBHelper.newInstance(applicationContext) val Context.contactsDB: ContactsDao get() = ContactsDatabase.getInstance(applicationContext).ContactsDao() +val Context.groupsDB: GroupsDao get() = ContactsDatabase.getInstance(applicationContext).GroupsDao() + fun Context.getEmptyContact(): Contact { val originalContactSource = if (hasContactPermissions()) config.lastUsedContactSource else SMT_PRIVATE val organization = Organization("", "") diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/fragments/MyViewPagerFragment.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/fragments/MyViewPagerFragment.kt index c35c676d..00f97747 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/fragments/MyViewPagerFragment.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/fragments/MyViewPagerFragment.kt @@ -145,42 +145,44 @@ abstract class MyViewPagerFragment(context: Context, attributeSet: AttributeSet) } private fun setupGroupsAdapter(contacts: ArrayList) { - var storedGroups = ContactsHelper(activity!!).getStoredGroups() - contacts.forEach { - it.groups.forEach { - val group = it - val storedGroup = storedGroups.firstOrNull { it.id == group.id } - storedGroup?.addContact() - } - } - - storedGroups = storedGroups.asSequence().sortedWith(compareBy { it.title.normalizeString() }).toMutableList() as ArrayList - - fragment_placeholder_2.beVisibleIf(storedGroups.isEmpty()) - fragment_placeholder.beVisibleIf(storedGroups.isEmpty()) - fragment_list.beVisibleIf(storedGroups.isNotEmpty()) - - val currAdapter = fragment_list.adapter - if (currAdapter == null) { - GroupsAdapter(activity as SimpleActivity, storedGroups, activity, fragment_list, fragment_fastscroller) { - Intent(activity, GroupContactsActivity::class.java).apply { - putExtra(GROUP, it as Group) - activity!!.startActivity(this) + ContactsHelper(activity!!).getStoredGroups { + var storedGroups = it + contacts.forEach { + it.groups.forEach { + val group = it + val storedGroup = storedGroups.firstOrNull { it.id == group.id } + storedGroup?.addContact() } - }.apply { - addVerticalDividers(true) - fragment_list.adapter = this } - fragment_fastscroller.setScrollToY(0) - fragment_fastscroller.setViews(fragment_list) { - val item = (fragment_list.adapter as GroupsAdapter).groups.getOrNull(it) - fragment_fastscroller.updateBubbleText(item?.getBubbleText() ?: "") - } - } else { - (currAdapter as GroupsAdapter).apply { - showContactThumbnails = activity.config.showContactThumbnails - updateItems(storedGroups) + storedGroups = storedGroups.asSequence().sortedWith(compareBy { it.title.normalizeString() }).toMutableList() as ArrayList + + fragment_placeholder_2.beVisibleIf(storedGroups.isEmpty()) + fragment_placeholder.beVisibleIf(storedGroups.isEmpty()) + fragment_list.beVisibleIf(storedGroups.isNotEmpty()) + + val currAdapter = fragment_list.adapter + if (currAdapter == null) { + GroupsAdapter(activity as SimpleActivity, storedGroups, activity, fragment_list, fragment_fastscroller) { + Intent(activity, GroupContactsActivity::class.java).apply { + putExtra(GROUP, it as Group) + activity!!.startActivity(this) + } + }.apply { + addVerticalDividers(true) + fragment_list.adapter = this + } + + fragment_fastscroller.setScrollToY(0) + fragment_fastscroller.setViews(fragment_list) { + val item = (fragment_list.adapter as GroupsAdapter).groups.getOrNull(it) + fragment_fastscroller.updateBubbleText(item?.getBubbleText() ?: "") + } + } else { + (currAdapter as GroupsAdapter).apply { + showContactThumbnails = activity.config.showContactThumbnails + updateItems(storedGroups) + } } } } diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/helpers/Constants.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/helpers/Constants.kt index b1e4bc2a..71166b20 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/helpers/Constants.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/helpers/Constants.kt @@ -22,7 +22,7 @@ const val CONTACT_ID = "contact_id" const val SMT_PRIVATE = "smt_private" // used at the contact source of local contacts hidden from other apps const val IS_PRIVATE = "is_private" const val GROUP = "group" -const val FIRST_GROUP_ID = 10000 +const val FIRST_GROUP_ID = 10000L const val PHONE_NUMBER_PATTERN = "[^0-9#*+]" const val IS_FROM_SIMPLE_CONTACTS = "is_from_simple_contacts" const val ADD_NEW_CONTACT_NUMBER = "add_new_contact_number" diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/helpers/ContactsHelper.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/helpers/ContactsHelper.kt index 8cc9e353..a3c8a6f8 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/helpers/ContactsHelper.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/helpers/ContactsHelper.kt @@ -75,7 +75,7 @@ class ContactsHelper(val activity: Activity) { } // groups are obtained with contactID, not rawID, so assign them to proper contacts like this - val groups = getContactGroups(getStoredGroups()) + val groups = getContactGroups(getStoredGroupsSync()) val size = groups.size() for (i in 0 until size) { val key = groups.keyAt(i) @@ -648,9 +648,18 @@ class ContactsHelper(val activity: Activity) { return args.toTypedArray() } - fun getStoredGroups(): ArrayList { + fun getStoredGroups(callback: (ArrayList) -> Unit) { + Thread { + val groups = getStoredGroupsSync() + activity.runOnUiThread { + callback(groups) + } + }.start() + } + + fun getStoredGroupsSync(): ArrayList { val groups = getDeviceStoredGroups() - groups.addAll(activity.dbHelper.getGroups()) + groups.addAll(activity.groupsDB.getGroups()) return groups } @@ -696,7 +705,10 @@ class ContactsHelper(val activity: Activity) { fun createNewGroup(title: String, accountName: String, accountType: String): Group? { if (accountType == SMT_PRIVATE) { - return activity.dbHelper.insertGroup(Group(0, title)) + val newGroup = Group(null, title) + val id = activity.groupsDB.insertOrUpdate(newGroup) + newGroup.id = id + return newGroup } val operations = ArrayList() @@ -769,7 +781,7 @@ class ContactsHelper(val activity: Activity) { } private fun parseContactCursor(selection: String, selectionArgs: Array): Contact? { - val storedGroups = getStoredGroups() + val storedGroups = getStoredGroupsSync() val uri = ContactsContract.Data.CONTENT_URI val projection = getContactProjection() var cursor: Cursor? = null @@ -1089,7 +1101,7 @@ class ContactsHelper(val activity: Activity) { } // delete groups - val relevantGroupIDs = getStoredGroups().map { it.id } + val relevantGroupIDs = getStoredGroupsSync().map { it.id } if (relevantGroupIDs.isNotEmpty()) { val IDsString = TextUtils.join(",", relevantGroupIDs) ContentProviderOperation.newDelete(ContactsContract.Data.CONTENT_URI).apply { diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/helpers/DBHelper.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/helpers/DBHelper.kt index f7be8358..f80d0b79 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/helpers/DBHelper.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/helpers/DBHelper.kt @@ -11,7 +11,6 @@ import com.google.gson.Gson import com.google.gson.reflect.TypeToken import com.simplemobiletools.commons.extensions.getBlobValue import com.simplemobiletools.commons.extensions.getIntValue -import com.simplemobiletools.commons.extensions.getLongValue import com.simplemobiletools.commons.extensions.getStringValue import com.simplemobiletools.contacts.pro.extensions.applyRegexFiltering import com.simplemobiletools.contacts.pro.extensions.config @@ -81,16 +80,6 @@ class DBHelper private constructor(val context: Context) : SQLiteOpenHelper(cont db.execSQL("REPLACE INTO sqlite_sequence (name, seq) VALUES ('$GROUPS_TABLE_NAME', $FIRST_GROUP_ID)") } - fun insertGroup(group: Group): Group? { - val contactValues = fillGroupValues(group) - val id = mDb.insert(GROUPS_TABLE_NAME, null, contactValues) - return if (id == -1L) { - null - } else { - Group(id, group.title) - } - } - fun renameGroup(group: Group): Boolean { val contactValues = fillGroupValues(group) val selection = "$COL_ID = ?" @@ -106,21 +95,6 @@ class DBHelper private constructor(val context: Context) : SQLiteOpenHelper(cont mDb.delete(GROUPS_TABLE_NAME, selection, null) } - fun getGroups(): ArrayList { - val groups = ArrayList() - val projection = arrayOf(COL_ID, COL_TITLE) - val cursor = mDb.query(GROUPS_TABLE_NAME, projection, null, null, null, null, null) - cursor.use { - while (cursor.moveToNext()) { - val id = cursor.getLongValue(COL_ID) - val title = cursor.getStringValue(COL_TITLE) - val group = Group(id, title) - groups.add(group) - } - } - return groups - } - private fun fillGroupValues(group: Group): ContentValues { return ContentValues().apply { put(COL_TITLE, group.title) @@ -157,7 +131,7 @@ class DBHelper private constructor(val context: Context) : SQLiteOpenHelper(cont } fun getContacts(activity: Activity, selection: String? = null, selectionArgs: Array? = null): ArrayList { - val storedGroups = ContactsHelper(activity).getStoredGroups() + val storedGroups = ContactsHelper(activity).getStoredGroupsSync() val filterDuplicates = activity.config.filterDuplicates val contacts = ArrayList() val projection = arrayOf(COL_ID, COL_PREFIX, COL_FIRST_NAME, COL_MIDDLE_NAME, COL_SURNAME, COL_SUFFIX, COL_NICKNAME, COL_PHONE_NUMBERS, diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/helpers/VcfImporter.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/helpers/VcfImporter.kt index 9102abdb..d62a0098 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/helpers/VcfImporter.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/helpers/VcfImporter.kt @@ -6,9 +6,9 @@ import android.provider.ContactsContract.CommonDataKinds import android.widget.Toast import com.simplemobiletools.commons.extensions.showErrorToast import com.simplemobiletools.contacts.pro.activities.SimpleActivity -import com.simplemobiletools.contacts.pro.extensions.dbHelper import com.simplemobiletools.contacts.pro.extensions.getCachePhoto import com.simplemobiletools.contacts.pro.extensions.getCachePhotoUri +import com.simplemobiletools.contacts.pro.extensions.groupsDB import com.simplemobiletools.contacts.pro.helpers.VcfImporter.ImportResult.* import com.simplemobiletools.contacts.pro.models.* import ezvcard.Ezvcard @@ -170,7 +170,7 @@ class VcfImporter(val activity: SimpleActivity) { val groupNames = ezContact.categories.values if (groupNames != null) { - val storedGroups = ContactsHelper(activity).getStoredGroups() + val storedGroups = ContactsHelper(activity).getStoredGroupsSync() groupNames.forEach { val groupName = it @@ -179,11 +179,10 @@ class VcfImporter(val activity: SimpleActivity) { if (storedGroup != null) { groups.add(storedGroup) } else { - val newContactGroup = activity.dbHelper.insertGroup(Group(0, groupName)) - - if (newContactGroup != null) { - groups.add(newContactGroup) - } + val newGroup = Group(null, groupName) + val id = activity.groupsDB.insertOrUpdate(newGroup) + newGroup.id = id + groups.add(newGroup) } } } diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/interfaces/GroupsDao.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/interfaces/GroupsDao.kt new file mode 100644 index 00000000..8991a6f0 --- /dev/null +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/interfaces/GroupsDao.kt @@ -0,0 +1,19 @@ +package com.simplemobiletools.contacts.pro.interfaces + +import androidx.room.Dao +import androidx.room.Insert +import androidx.room.OnConflictStrategy +import androidx.room.Query +import com.simplemobiletools.contacts.pro.models.Group + +@Dao +interface GroupsDao { + @Query("SELECT * FROM groups") + fun getGroups(): List + + @Insert(onConflict = OnConflictStrategy.REPLACE) + fun insertOrUpdate(group: Group): Long + + @Query("DELETE FROM groups WHERE id = :id") + fun deleteGroupId(id: Long) +} diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/models/Group.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/models/Group.kt index c36635bf..9628e664 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/models/Group.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/models/Group.kt @@ -1,16 +1,21 @@ package com.simplemobiletools.contacts.pro.models +import androidx.room.ColumnInfo +import androidx.room.Entity +import androidx.room.Index +import androidx.room.PrimaryKey import com.simplemobiletools.contacts.pro.helpers.FIRST_GROUP_ID import java.io.Serializable -data class Group(var id: Long, var title: String, var contactsCount: Int = 0) : Serializable { - companion object { - private const val serialVersionUID = -1384515348451345L - } +@Entity(tableName = "groups", indices = [(Index(value = ["id"], unique = true))]) +data class Group( + @PrimaryKey(autoGenerate = true) var id: Long?, + @ColumnInfo(name = "title") var title: String, + @ColumnInfo(name = "contacts_count") var contactsCount: Int = 0) : Serializable { fun addContact() = contactsCount++ fun getBubbleText() = title - fun isPrivateSecretGroup() = id >= FIRST_GROUP_ID + fun isPrivateSecretGroup() = id ?: 0 >= FIRST_GROUP_ID } From ddfebfdb1fd1cc06f6c2d77ad01df54d50e152ca Mon Sep 17 00:00:00 2001 From: tibbi Date: Tue, 6 Nov 2018 20:14:59 +0100 Subject: [PATCH 015/134] allow renaming local groups --- .../contacts/pro/dialogs/RenameGroupDialog.kt | 20 +++++++++++-------- .../contacts/pro/helpers/DBHelper.kt | 13 ------------ 2 files changed, 12 insertions(+), 21 deletions(-) diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/dialogs/RenameGroupDialog.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/dialogs/RenameGroupDialog.kt index ea9180fb..835bc5e5 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/dialogs/RenameGroupDialog.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/dialogs/RenameGroupDialog.kt @@ -4,7 +4,7 @@ import androidx.appcompat.app.AlertDialog import com.simplemobiletools.commons.activities.BaseSimpleActivity import com.simplemobiletools.commons.extensions.* import com.simplemobiletools.contacts.pro.R -import com.simplemobiletools.contacts.pro.extensions.dbHelper +import com.simplemobiletools.contacts.pro.extensions.groupsDB import com.simplemobiletools.contacts.pro.helpers.ContactsHelper import com.simplemobiletools.contacts.pro.models.Group import kotlinx.android.synthetic.main.dialog_rename_group.view.* @@ -35,13 +35,17 @@ class RenameGroupDialog(val activity: BaseSimpleActivity, val group: Group, val } group.title = newTitle - if (group.isPrivateSecretGroup()) { - activity.dbHelper.renameGroup(group) - } else { - ContactsHelper(activity).renameGroup(group) - } - callback() - dismiss() + Thread { + if (group.isPrivateSecretGroup()) { + activity.groupsDB.insertOrUpdate(group) + } else { + ContactsHelper(activity).renameGroup(group) + } + activity.runOnUiThread { + callback() + dismiss() + } + }.start() } } } diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/helpers/DBHelper.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/helpers/DBHelper.kt index f80d0b79..bfd27e66 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/helpers/DBHelper.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/helpers/DBHelper.kt @@ -80,13 +80,6 @@ class DBHelper private constructor(val context: Context) : SQLiteOpenHelper(cont db.execSQL("REPLACE INTO sqlite_sequence (name, seq) VALUES ('$GROUPS_TABLE_NAME', $FIRST_GROUP_ID)") } - fun renameGroup(group: Group): Boolean { - val contactValues = fillGroupValues(group) - val selection = "$COL_ID = ?" - val selectionArgs = arrayOf(group.id.toString()) - return mDb.update(GROUPS_TABLE_NAME, contactValues, selection, selectionArgs) == 1 - } - fun deleteGroup(id: Long) = deleteGroups(arrayOf(id.toString())) private fun deleteGroups(ids: Array) { @@ -95,12 +88,6 @@ class DBHelper private constructor(val context: Context) : SQLiteOpenHelper(cont mDb.delete(GROUPS_TABLE_NAME, selection, null) } - private fun fillGroupValues(group: Group): ContentValues { - return ContentValues().apply { - put(COL_TITLE, group.title) - } - } - fun addContactsToGroup(contacts: ArrayList, groupId: Long) { contacts.forEach { val currentGroupIds = it.groups.map { it.id } as ArrayList From 96c623c1ce43c60bb80a1927b645e023460721a6 Mon Sep 17 00:00:00 2001 From: kniddl <10777535+kniddl@users.noreply.github.com> Date: Tue, 6 Nov 2018 20:27:30 +0100 Subject: [PATCH 016/134] Updated German strings --- app/src/main/res/values-de/strings.xml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index aa9e30e1..6dbca51b 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -19,9 +19,9 @@ Zu einem existierenden Kontakt hinzufügen - No contacts found - No contacts with emails have been found - No contacts with phone numbers have been found + Keine Kontakte gefunden + Keine Kontakte mit E-Mailadressen gefunden + Keine Kontakte mit Telefonnummern gefunden Neuer Kontakt Kontakt bearbeiten @@ -62,7 +62,7 @@ Favoriten Anrufliste Bestätigungsdialog zeigen, bevor ein Anruf durchgeführt wird - Show only contacts with phone numbers + Nur Kontakte mit Telefonnummern anzeigen E-Mail From 2408cabd8140f31c2adf39ef1d6b6da45b2e8fa4 Mon Sep 17 00:00:00 2001 From: tibbi Date: Tue, 6 Nov 2018 20:46:26 +0100 Subject: [PATCH 017/134] handle local group deleting --- .../contacts/pro/adapters/GroupsAdapter.kt | 20 +++++++++++-------- .../contacts/pro/helpers/DBHelper.kt | 9 --------- 2 files changed, 12 insertions(+), 17 deletions(-) diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/adapters/GroupsAdapter.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/adapters/GroupsAdapter.kt index c2e78641..1d6f76d6 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/adapters/GroupsAdapter.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/adapters/GroupsAdapter.kt @@ -13,7 +13,7 @@ import com.simplemobiletools.contacts.pro.R import com.simplemobiletools.contacts.pro.activities.SimpleActivity import com.simplemobiletools.contacts.pro.dialogs.RenameGroupDialog import com.simplemobiletools.contacts.pro.extensions.config -import com.simplemobiletools.contacts.pro.extensions.dbHelper +import com.simplemobiletools.contacts.pro.extensions.groupsDB import com.simplemobiletools.contacts.pro.helpers.ContactsHelper import com.simplemobiletools.contacts.pro.helpers.GROUPS_TAB_MASK import com.simplemobiletools.contacts.pro.interfaces.RefreshContactsListener @@ -92,7 +92,9 @@ class GroupsAdapter(activity: SimpleActivity, var groups: ArrayList, val private fun askConfirmDelete() { ConfirmationDialog(activity) { - deleteGroups() + Thread { + deleteGroups() + }.start() } } @@ -105,18 +107,20 @@ class GroupsAdapter(activity: SimpleActivity, var groups: ArrayList, val val positions = getSelectedItemPositions() groupsToRemove.forEach { if (it.isPrivateSecretGroup()) { - activity.dbHelper.deleteGroup(it.id!!) + activity.groupsDB.deleteGroupId(it.id!!) } else { ContactsHelper(activity).deleteGroup(it.id!!) } } groups.removeAll(groupsToRemove) - if (groups.isEmpty()) { - refreshListener?.refreshContacts(GROUPS_TAB_MASK) - finishActMode() - } else { - removeSelectedItems(positions) + activity.runOnUiThread { + if (groups.isEmpty()) { + refreshListener?.refreshContacts(GROUPS_TAB_MASK) + finishActMode() + } else { + removeSelectedItems(positions) + } } } diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/helpers/DBHelper.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/helpers/DBHelper.kt index bfd27e66..8925e303 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/helpers/DBHelper.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/helpers/DBHelper.kt @@ -6,7 +6,6 @@ import android.content.Context import android.database.sqlite.SQLiteDatabase import android.database.sqlite.SQLiteOpenHelper import android.graphics.BitmapFactory -import android.text.TextUtils import com.google.gson.Gson import com.google.gson.reflect.TypeToken import com.simplemobiletools.commons.extensions.getBlobValue @@ -80,14 +79,6 @@ class DBHelper private constructor(val context: Context) : SQLiteOpenHelper(cont db.execSQL("REPLACE INTO sqlite_sequence (name, seq) VALUES ('$GROUPS_TABLE_NAME', $FIRST_GROUP_ID)") } - fun deleteGroup(id: Long) = deleteGroups(arrayOf(id.toString())) - - private fun deleteGroups(ids: Array) { - val args = TextUtils.join(", ", ids) - val selection = "$GROUPS_TABLE_NAME.$COL_ID IN ($args)" - mDb.delete(GROUPS_TABLE_NAME, selection, null) - } - fun addContactsToGroup(contacts: ArrayList, groupId: Long) { contacts.forEach { val currentGroupIds = it.groups.map { it.id } as ArrayList From 2f1be0c404be9574418298a7ad6af7db77f7b8a8 Mon Sep 17 00:00:00 2001 From: tibbi Date: Tue, 6 Nov 2018 21:00:42 +0100 Subject: [PATCH 018/134] removing the helper QuotedPrintable class, it is no longer needed --- .../contacts/pro/helpers/QuotedPrintable.kt | 64 ------------------- 1 file changed, 64 deletions(-) delete mode 100644 app/src/main/kotlin/com/simplemobiletools/contacts/pro/helpers/QuotedPrintable.kt diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/helpers/QuotedPrintable.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/helpers/QuotedPrintable.kt deleted file mode 100644 index e39bf43b..00000000 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/helpers/QuotedPrintable.kt +++ /dev/null @@ -1,64 +0,0 @@ -package com.simplemobiletools.contacts.pro.helpers - -import java.io.ByteArrayOutputStream -import java.net.URLEncoder - -// https://alvinalexander.com/java/jwarehouse/android/core/java/com/google/android/mms/pdu/QuotedPrintable.java.shtml -object QuotedPrintable { - private const val ESCAPE_CHAR: Byte = '='.toByte() - fun decode(value: String?): String { - val bytes = value?.toByteArray() - if (bytes == null || bytes.isEmpty()) { - return "" - } - - val buffer = ByteArrayOutputStream() - var i = 0 - while (i < bytes.size) { - val b = bytes[i].toInt() - if (b == ESCAPE_CHAR.toInt()) { - try { - if ('\r' == bytes[i + 1].toChar() && '\n' == bytes[i + 2].toChar()) { - i += 3 - continue - } - - val u = Character.digit(bytes[++i].toChar(), 16) - val l = Character.digit(bytes[++i].toChar(), 16) - if (u == -1 || l == -1) { - return "" - } - - buffer.write(((u shl 4) + l).toChar().toInt()) - } catch (e: ArrayIndexOutOfBoundsException) { - return "" - } - - } else { - buffer.write(b) - } - i++ - } - return String(buffer.toByteArray()) - } - - fun encode(value: String): String { - val result = StringBuilder() - value.forEach { - if (it == ' ') { - result.append(' ') - } else { - val urlEncoded = urlEncode(it.toString()) - if (urlEncoded == it.toString()) { - val hex = String.format("%04x", it.toInt()).trimStart('0').toUpperCase() - result.append("=$hex") - } else { - result.append(urlEncoded) - } - } - } - return result.toString() - } - - fun urlEncode(value: String) = URLEncoder.encode(value, "UTF-8").replace("+", " ").replace('%', '=') -} From 971bcbf29ffd23b1a8f5a92ff19ffd600c528892 Mon Sep 17 00:00:00 2001 From: tibbi Date: Tue, 6 Nov 2018 21:34:46 +0100 Subject: [PATCH 019/134] handle contact adding/removing from groups --- .../pro/databases/ContactsDatabase.kt | 3 +- .../contacts/pro/extensions/Activity.kt | 16 +- .../contacts/pro/extensions/Context.kt | 7 +- .../contacts/pro/helpers/Constants.kt | 3 +- .../contacts/pro/helpers/Converters.kt | 14 +- .../contacts/pro/helpers/DBHelper.kt | 208 ------------------ .../pro/helpers/LocalContactsHelper.kt | 32 ++- .../contacts/pro/models/LocalContact.kt | 2 +- 8 files changed, 49 insertions(+), 236 deletions(-) delete mode 100644 app/src/main/kotlin/com/simplemobiletools/contacts/pro/helpers/DBHelper.kt diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/databases/ContactsDatabase.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/databases/ContactsDatabase.kt index 295a0bd7..98c74343 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/databases/ContactsDatabase.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/databases/ContactsDatabase.kt @@ -7,6 +7,7 @@ import androidx.room.RoomDatabase import androidx.room.TypeConverters import androidx.sqlite.db.SupportSQLiteDatabase import com.simplemobiletools.contacts.pro.helpers.Converters +import com.simplemobiletools.contacts.pro.helpers.FIRST_CONTACT_ID import com.simplemobiletools.contacts.pro.helpers.FIRST_GROUP_ID import com.simplemobiletools.contacts.pro.helpers.getEmptyLocalContact import com.simplemobiletools.contacts.pro.interfaces.ContactsDao @@ -25,8 +26,6 @@ abstract class ContactsDatabase : RoomDatabase() { abstract fun GroupsDao(): GroupsDao companion object { - private const val FIRST_CONTACT_ID = 1000000 - private var db: ContactsDatabase? = null fun getInstance(context: Context): ContactsDatabase { diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/extensions/Activity.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/extensions/Activity.kt index 8fddb344..0b4d439d 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/extensions/Activity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/extensions/Activity.kt @@ -171,26 +171,26 @@ fun BaseSimpleActivity.getTempFile(): File? { } fun BaseSimpleActivity.addContactsToGroup(contacts: ArrayList, groupId: Long) { - val publicContacts = contacts.filter { it.source != SMT_PRIVATE } - val privateContacts = contacts.filter { it.source == SMT_PRIVATE } + val publicContacts = contacts.filter { it.source != SMT_PRIVATE }.toMutableList() as ArrayList + val privateContacts = contacts.filter { it.source == SMT_PRIVATE }.toMutableList() as ArrayList if (publicContacts.isNotEmpty()) { - ContactsHelper(this).addContactsToGroup(contacts, groupId) + ContactsHelper(this).addContactsToGroup(publicContacts, groupId) } if (privateContacts.isNotEmpty()) { - dbHelper.addContactsToGroup(contacts, groupId) + LocalContactsHelper(this).addContactsToGroup(privateContacts, groupId) } } fun BaseSimpleActivity.removeContactsFromGroup(contacts: ArrayList, groupId: Long) { - val publicContacts = contacts.filter { it.source != SMT_PRIVATE } - val privateContacts = contacts.filter { it.source == SMT_PRIVATE } + val publicContacts = contacts.filter { it.source != SMT_PRIVATE }.toMutableList() as ArrayList + val privateContacts = contacts.filter { it.source == SMT_PRIVATE }.toMutableList() as ArrayList if (publicContacts.isNotEmpty() && hasContactPermissions()) { - ContactsHelper(this).removeContactsFromGroup(contacts, groupId) + ContactsHelper(this).removeContactsFromGroup(publicContacts, groupId) } if (privateContacts.isNotEmpty()) { - dbHelper.removeContactsFromGroup(contacts, groupId) + LocalContactsHelper(this).removeContactsFromGroup(privateContacts, groupId) } } diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/extensions/Context.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/extensions/Context.kt index 50ad82d7..38691b30 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/extensions/Context.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/extensions/Context.kt @@ -16,7 +16,10 @@ import com.simplemobiletools.contacts.pro.R import com.simplemobiletools.contacts.pro.activities.EditContactActivity import com.simplemobiletools.contacts.pro.activities.ViewContactActivity import com.simplemobiletools.contacts.pro.databases.ContactsDatabase -import com.simplemobiletools.contacts.pro.helpers.* +import com.simplemobiletools.contacts.pro.helpers.CONTACT_ID +import com.simplemobiletools.contacts.pro.helpers.Config +import com.simplemobiletools.contacts.pro.helpers.IS_PRIVATE +import com.simplemobiletools.contacts.pro.helpers.SMT_PRIVATE import com.simplemobiletools.contacts.pro.interfaces.ContactsDao import com.simplemobiletools.contacts.pro.interfaces.GroupsDao import com.simplemobiletools.contacts.pro.models.Contact @@ -25,8 +28,6 @@ import java.io.File val Context.config: Config get() = Config.newInstance(applicationContext) -val Context.dbHelper: DBHelper get() = DBHelper.newInstance(applicationContext) - val Context.contactsDB: ContactsDao get() = ContactsDatabase.getInstance(applicationContext).ContactsDao() val Context.groupsDB: GroupsDao get() = ContactsDatabase.getInstance(applicationContext).GroupsDao() diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/helpers/Constants.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/helpers/Constants.kt index 71166b20..9e7fec57 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/helpers/Constants.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/helpers/Constants.kt @@ -22,10 +22,11 @@ const val CONTACT_ID = "contact_id" const val SMT_PRIVATE = "smt_private" // used at the contact source of local contacts hidden from other apps const val IS_PRIVATE = "is_private" const val GROUP = "group" -const val FIRST_GROUP_ID = 10000L const val PHONE_NUMBER_PATTERN = "[^0-9#*+]" const val IS_FROM_SIMPLE_CONTACTS = "is_from_simple_contacts" const val ADD_NEW_CONTACT_NUMBER = "add_new_contact_number" +const val FIRST_CONTACT_ID = 1000000 +const val FIRST_GROUP_ID = 10000L // extras used at third party intents const val KEY_PHONE = "phone" diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/helpers/Converters.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/helpers/Converters.kt index 599c17f4..63205ad6 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/helpers/Converters.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/helpers/Converters.kt @@ -7,12 +7,12 @@ import com.simplemobiletools.contacts.pro.models.* class Converters { private val gson = Gson() + private val longType = object : TypeToken>() {}.type private val stringType = object : TypeToken>() {}.type private val numberType = object : TypeToken>() {}.type private val emailType = object : TypeToken>() {}.type private val addressType = object : TypeToken>() {}.type private val eventType = object : TypeToken>() {}.type - private val groupType = object : TypeToken>() {}.type private val imType = object : TypeToken>() {}.type @TypeConverter @@ -21,6 +21,12 @@ class Converters { @TypeConverter fun stringListToJson(list: ArrayList) = gson.toJson(list) + @TypeConverter + fun jsonToLongList(value: String) = gson.fromJson>(value, longType) + + @TypeConverter + fun longListToJson(list: ArrayList) = gson.toJson(list) + @TypeConverter fun jsonToPhoneNumberList(value: String) = gson.fromJson>(value, numberType) @@ -45,12 +51,6 @@ class Converters { @TypeConverter fun eventListToJson(list: ArrayList) = gson.toJson(list) - @TypeConverter - fun jsonToGroupList(value: String) = gson.fromJson>(value, groupType) - - @TypeConverter - fun groupListToJson(list: ArrayList) = gson.toJson(list) - @TypeConverter fun jsonToIMsList(value: String) = gson.fromJson>(value, imType) diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/helpers/DBHelper.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/helpers/DBHelper.kt deleted file mode 100644 index 8925e303..00000000 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/helpers/DBHelper.kt +++ /dev/null @@ -1,208 +0,0 @@ -package com.simplemobiletools.contacts.pro.helpers - -import android.app.Activity -import android.content.ContentValues -import android.content.Context -import android.database.sqlite.SQLiteDatabase -import android.database.sqlite.SQLiteOpenHelper -import android.graphics.BitmapFactory -import com.google.gson.Gson -import com.google.gson.reflect.TypeToken -import com.simplemobiletools.commons.extensions.getBlobValue -import com.simplemobiletools.commons.extensions.getIntValue -import com.simplemobiletools.commons.extensions.getStringValue -import com.simplemobiletools.contacts.pro.extensions.applyRegexFiltering -import com.simplemobiletools.contacts.pro.extensions.config -import com.simplemobiletools.contacts.pro.models.* - -class DBHelper private constructor(val context: Context) : SQLiteOpenHelper(context, DB_NAME, null, DB_VERSION) { - private val CONTACTS_TABLE_NAME = "contacts" - private val COL_ID = "id" - private val COL_PREFIX = "prefix" - private val COL_FIRST_NAME = "first_name" - private val COL_MIDDLE_NAME = "middle_name" - private val COL_SURNAME = "surname" - private val COL_SUFFIX = "suffix" - private val COL_NICKNAME = "nickname" - private val COL_PHOTO = "photo" - private val COL_PHONE_NUMBERS = "phone_numbers" - private val COL_EMAILS = "emails" - private val COL_EVENTS = "events" - private val COL_STARRED = "starred" - private val COL_ADDRESSES = "addresses" - private val COL_IMS = "ims" - private val COL_NOTES = "notes" - private val COL_COMPANY = "company" - private val COL_JOB_POSITION = "job_position" - private val COL_GROUPS = "groups" - private val COL_WEBSITES = "websites" - - private val GROUPS_TABLE_NAME = "groups" - private val COL_TITLE = "title" - - private val FIRST_CONTACT_ID = 1000000 - - private val mDb = writableDatabase - - companion object { - const val DB_NAME = "contacts.db" - private const val DB_VERSION = 7 - private var dbInstance: DBHelper? = null - var gson = Gson() - - fun newInstance(context: Context): DBHelper { - if (dbInstance == null) - dbInstance = DBHelper(context) - - return dbInstance!! - } - } - - override fun onCreate(db: SQLiteDatabase) { - db.execSQL("CREATE TABLE $CONTACTS_TABLE_NAME ($COL_ID INTEGER PRIMARY KEY AUTOINCREMENT, $COL_FIRST_NAME TEXT, $COL_MIDDLE_NAME TEXT, " + - "$COL_SURNAME TEXT, $COL_PHOTO BLOB, $COL_PHONE_NUMBERS TEXT, $COL_EMAILS TEXT, $COL_EVENTS TEXT, $COL_STARRED INTEGER, " + - "$COL_ADDRESSES TEXT, $COL_NOTES TEXT, $COL_GROUPS TEXT, $COL_PREFIX TEXT, $COL_SUFFIX TEXT, $COL_COMPANY TEXT, $COL_JOB_POSITION TEXT," + - "$COL_WEBSITES TEXT, $COL_NICKNAME TEXT, $COL_IMS TEXT)") - - // start autoincrement ID from FIRST_CONTACT_ID to avoid conflicts - db.execSQL("REPLACE INTO sqlite_sequence (name, seq) VALUES ('$CONTACTS_TABLE_NAME', $FIRST_CONTACT_ID)") - - createGroupsTable(db) - } - - override fun onUpgrade(db: SQLiteDatabase, oldVersion: Int, newVersion: Int) {} - - private fun createGroupsTable(db: SQLiteDatabase) { - db.execSQL("CREATE TABLE $GROUPS_TABLE_NAME ($COL_ID INTEGER PRIMARY KEY AUTOINCREMENT, $COL_TITLE TEXT)") - - // start autoincrement ID from FIRST_GROUP_ID to avoid conflicts - db.execSQL("REPLACE INTO sqlite_sequence (name, seq) VALUES ('$GROUPS_TABLE_NAME', $FIRST_GROUP_ID)") - } - - fun addContactsToGroup(contacts: ArrayList, groupId: Long) { - contacts.forEach { - val currentGroupIds = it.groups.map { it.id } as ArrayList - currentGroupIds.add(groupId) - updateContactGroups(it, currentGroupIds) - } - } - - fun removeContactsFromGroup(contacts: ArrayList, groupId: Long) { - contacts.forEach { - val currentGroupIds = it.groups.map { it.id } as ArrayList - currentGroupIds.remove(groupId) - updateContactGroups(it, currentGroupIds) - } - } - - private fun updateContactGroups(contact: Contact, groupIds: ArrayList) { - val contactValues = fillContactGroupValues(groupIds) - val selection = "$COL_ID = ?" - val selectionArgs = arrayOf(contact.id.toString()) - mDb.update(CONTACTS_TABLE_NAME, contactValues, selection, selectionArgs) - } - - private fun fillContactGroupValues(groupIds: ArrayList): ContentValues { - return ContentValues().apply { - put(COL_GROUPS, gson.toJson(groupIds)) - } - } - - fun getContacts(activity: Activity, selection: String? = null, selectionArgs: Array? = null): ArrayList { - val storedGroups = ContactsHelper(activity).getStoredGroupsSync() - val filterDuplicates = activity.config.filterDuplicates - val contacts = ArrayList() - val projection = arrayOf(COL_ID, COL_PREFIX, COL_FIRST_NAME, COL_MIDDLE_NAME, COL_SURNAME, COL_SUFFIX, COL_NICKNAME, COL_PHONE_NUMBERS, - COL_EMAILS, COL_EVENTS, COL_STARRED, COL_PHOTO, COL_ADDRESSES, COL_IMS, COL_NOTES, COL_GROUPS, COL_COMPANY, COL_JOB_POSITION, COL_WEBSITES) - - val phoneNumbersToken = object : TypeToken>() {}.type - val emailsToken = object : TypeToken>() {}.type - val addressesToken = object : TypeToken>() {}.type - val IMsToken = object : TypeToken>() {}.type - val eventsToken = object : TypeToken>() {}.type - val groupIdsToken = object : TypeToken>() {}.type - val websitesToken = object : TypeToken>() {}.type - - val cursor = mDb.query(CONTACTS_TABLE_NAME, projection, selection, selectionArgs, null, null, null) - cursor.use { - while (cursor.moveToNext()) { - val id = cursor.getIntValue(COL_ID) - val prefix = cursor.getStringValue(COL_PREFIX) - val firstName = cursor.getStringValue(COL_FIRST_NAME) - val middleName = cursor.getStringValue(COL_MIDDLE_NAME) - val surname = cursor.getStringValue(COL_SURNAME) - val suffix = cursor.getStringValue(COL_SUFFIX) - val nickname = cursor.getStringValue(COL_NICKNAME) - - val phoneNumbersJson = cursor.getStringValue(COL_PHONE_NUMBERS) - val phoneNumbers = if (phoneNumbersJson == "[]") ArrayList() else gson.fromJson>(phoneNumbersJson, phoneNumbersToken) - ?: ArrayList(1) - - // labels can be null at upgrading from older app versions, when the label wasn't available at all yet - phoneNumbers.filter { it.label == null }.forEach { - it.label = "" - } - - val emailsJson = cursor.getStringValue(COL_EMAILS) - val emails = if (emailsJson == "[]") ArrayList() else gson.fromJson>(emailsJson, emailsToken) - ?: ArrayList(1) - - emails.filter { it.label == null }.forEach { - it.label = "" - } - - val addressesJson = cursor.getStringValue(COL_ADDRESSES) - val addresses = if (addressesJson == "[]") ArrayList() else gson.fromJson>(addressesJson, addressesToken) - ?: ArrayList(1) - - addresses.filter { it.label == null }.forEach { - it.label = "" - } - - val IMsJson = cursor.getStringValue(COL_IMS) - val IMs = if (IMsJson == "[]") ArrayList() else gson.fromJson>(IMsJson, IMsToken) ?: ArrayList(1) - - val eventsJson = cursor.getStringValue(COL_EVENTS) - val events = if (eventsJson == "[]") ArrayList() else gson.fromJson>(eventsJson, eventsToken) - ?: ArrayList(1) - - val photoByteArray = cursor.getBlobValue(COL_PHOTO) ?: null - val photo = if (photoByteArray?.isNotEmpty() == true) { - try { - BitmapFactory.decodeByteArray(photoByteArray, 0, photoByteArray.size) - } catch (e: OutOfMemoryError) { - null - } - } else { - null - } - - val notes = cursor.getStringValue(COL_NOTES) - val starred = cursor.getIntValue(COL_STARRED) - - val groupIdsJson = cursor.getStringValue(COL_GROUPS) - val groupIds = if (groupIdsJson == "[]") ArrayList() else gson.fromJson>(groupIdsJson, groupIdsToken) - ?: ArrayList(1) - val groups = storedGroups.filter { groupIds.contains(it.id) } as ArrayList - - val company = cursor.getStringValue(COL_COMPANY) - val jobPosition = cursor.getStringValue(COL_JOB_POSITION) - val organization = Organization(company, jobPosition) - - val websitesJson = cursor.getStringValue(COL_WEBSITES) - val websites = if (websitesJson == "[]") ArrayList() else gson.fromJson>(websitesJson, websitesToken) - ?: ArrayList(1) - - val cleanPhoneNumbers = ArrayList() - if (filterDuplicates) { - phoneNumbers.mapTo(cleanPhoneNumbers) { PhoneNumber(it.value.applyRegexFiltering(), 0, "") } - } - - val contact = Contact(id, prefix, firstName, middleName, surname, suffix, nickname, "", phoneNumbers, emails, addresses, - events, SMT_PRIVATE, starred, id, "", photo, notes, groups, organization, websites, cleanPhoneNumbers, IMs) - contacts.add(contact) - } - } - return contacts - } -} diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/helpers/LocalContactsHelper.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/helpers/LocalContactsHelper.kt index f9fc990d..d8e52fc3 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/helpers/LocalContactsHelper.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/helpers/LocalContactsHelper.kt @@ -6,10 +6,7 @@ import android.graphics.BitmapFactory import android.net.Uri import android.provider.MediaStore import com.simplemobiletools.contacts.pro.extensions.* -import com.simplemobiletools.contacts.pro.models.Contact -import com.simplemobiletools.contacts.pro.models.LocalContact -import com.simplemobiletools.contacts.pro.models.Organization -import com.simplemobiletools.contacts.pro.models.PhoneNumber +import com.simplemobiletools.contacts.pro.models.* class LocalContactsHelper(val activity: Activity) { fun getAllContacts() = activity.contactsDB.getContacts().map { convertLocalContactToContact(it) }.toMutableList() as ArrayList @@ -21,6 +18,27 @@ class LocalContactsHelper(val activity: Activity) { return activity.contactsDB.insertOrUpdate(localContact) > 0 } + fun addContactsToGroup(contacts: ArrayList, groupId: Long) { + contacts.forEach { + val localContact = convertContactToLocalContact(it) + val newGroups = localContact.groups + newGroups.add(groupId) + newGroups.distinct() + localContact.groups = newGroups + activity.contactsDB.insertOrUpdate(localContact) + } + } + + fun removeContactsFromGroup(contacts: ArrayList, groupId: Long) { + contacts.forEach { + val localContact = convertContactToLocalContact(it) + val newGroups = localContact.groups + newGroups.remove(groupId) + localContact.groups = newGroups + activity.contactsDB.insertOrUpdate(localContact) + } + } + fun deleteContactIds(ids: Array) { ids.forEach { activity.contactsDB.deleteContactId(it) @@ -70,6 +88,8 @@ class LocalContactsHelper(val activity: Activity) { } } + val storedGroups = ContactsHelper(activity).getStoredGroupsSync() + return activity.getEmptyContact().apply { id = localContact.id!! prefix = localContact.prefix @@ -89,7 +109,7 @@ class LocalContactsHelper(val activity: Activity) { thumbnailUri = "" photo = contactPhoto notes = localContact.notes - groups = localContact.groups + groups = storedGroups.filter { localContact.groups.contains(it.id) } as ArrayList organization = Organization(localContact.company, localContact.jobPosition) websites = localContact.websites cleanPhoneNumbers = filteredPhoneNumbers @@ -113,7 +133,7 @@ class LocalContactsHelper(val activity: Activity) { starred = contact.starred addresses = contact.addresses notes = contact.notes - groups = contact.groups + groups = contact.groups.map { it.id }.toMutableList() as ArrayList company = contact.organization.company jobPosition = contact.organization.jobPosition websites = contact.websites diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/models/LocalContact.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/models/LocalContact.kt index 011fa534..9ff65b9d 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/models/LocalContact.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/models/LocalContact.kt @@ -21,7 +21,7 @@ data class LocalContact( @ColumnInfo(name = "starred") var starred: Int, @ColumnInfo(name = "addresses") var addresses: ArrayList
, @ColumnInfo(name = "notes") var notes: String, - @ColumnInfo(name = "groups") var groups: ArrayList, + @ColumnInfo(name = "groups") var groups: ArrayList, @ColumnInfo(name = "company") var company: String, @ColumnInfo(name = "job_position") var jobPosition: String, @ColumnInfo(name = "websites") var websites: ArrayList, From 1422ae1d9dad58e6caf1a14f2e9d51da371876e3 Mon Sep 17 00:00:00 2001 From: tibbi Date: Tue, 6 Nov 2018 21:36:26 +0100 Subject: [PATCH 020/134] fix a glitch at group selecting dialog --- .../simplemobiletools/contacts/pro/adapters/ContactsAdapter.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/adapters/ContactsAdapter.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/adapters/ContactsAdapter.kt index 925652c5..3ab8b592 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/adapters/ContactsAdapter.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/adapters/ContactsAdapter.kt @@ -203,8 +203,8 @@ class ContactsAdapter(activity: SimpleActivity, var contactItems: ArrayList Date: Tue, 6 Nov 2018 21:48:05 +0100 Subject: [PATCH 021/134] show empty list placeholder at Group activity when appropriate --- .../contacts/pro/activities/GroupContactsActivity.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/GroupContactsActivity.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/GroupContactsActivity.kt index 5a1a056c..848ea9b1 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/GroupContactsActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/GroupContactsActivity.kt @@ -130,7 +130,7 @@ class GroupContactsActivity : SimpleActivity(), RemoveFromGroupListener, Refresh override fun removeFromGroup(contacts: ArrayList) { Thread { removeContactsFromGroup(contacts, group.id!!) - if (groupContacts.size == 0) { + if (groupContacts.size == contacts.size) { refreshContacts() } }.start() From f14d197830fb5a46a9512dcb638dca9c3ce487bf Mon Sep 17 00:00:00 2001 From: tibbi Date: Tue, 6 Nov 2018 22:28:17 +0100 Subject: [PATCH 022/134] refresh the way release apks are signed --- .gitignore | 7 ++++--- app/build.gradle | 32 +++++++++++--------------------- keystore.properties_sample | 4 ++++ signing.properties_sample | 3 --- 4 files changed, 19 insertions(+), 27 deletions(-) create mode 100644 keystore.properties_sample delete mode 100644 signing.properties_sample diff --git a/.gitignore b/.gitignore index 32512494..660f31f5 100644 --- a/.gitignore +++ b/.gitignore @@ -1,10 +1,11 @@ *.iml +*.aab .gradle /local.properties +/gradle.properties /.idea/ .DS_Store /build /captures -release.keystore -signing.properties -/library/build +keystore.jks +keystore.properties diff --git a/app/build.gradle b/app/build.gradle index bbc59b7b..665a9fe9 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -3,6 +3,10 @@ apply plugin: 'kotlin-android' apply plugin: 'kotlin-android-extensions' apply plugin: 'kotlin-kapt' +def keystorePropertiesFile = rootProject.file("keystore.properties") +def keystoreProperties = new Properties() +keystoreProperties.load(new FileInputStream(keystorePropertiesFile)) + android { compileSdkVersion 28 buildToolsVersion "28.0.3" @@ -17,7 +21,12 @@ android { } signingConfigs { - release + release { + keyAlias keystoreProperties['keyAlias'] + keyPassword keystoreProperties['keyPassword'] + storeFile file(keystoreProperties['storeFile']) + storePassword keystoreProperties['storePassword'] + } } buildTypes { @@ -42,7 +51,7 @@ android { } dependencies { - implementation 'com.simplemobiletools:commons:5.3.11' + implementation 'com.simplemobiletools:commons:5.3.12' implementation 'joda-time:joda-time:2.9.9' implementation 'androidx.constraintlayout:constraintlayout:2.0.0-alpha2' implementation 'com.googlecode.ez-vcard:ez-vcard:0.10.4' @@ -51,22 +60,3 @@ dependencies { implementation "androidx.room:room-runtime:2.0.0" annotationProcessor "androidx.room:room-compiler:2.0.0" } - -Properties props = new Properties() -def propFile = new File('signing.properties') -if (propFile.canRead()) { - props.load(new FileInputStream(propFile)) - - if (props != null && props.containsKey('STORE_FILE') && props.containsKey('KEY_ALIAS') && props.containsKey('PASSWORD')) { - android.signingConfigs.release.storeFile = file(props['STORE_FILE']) - android.signingConfigs.release.storePassword = props['PASSWORD'] - android.signingConfigs.release.keyAlias = props['KEY_ALIAS'] - android.signingConfigs.release.keyPassword = props['PASSWORD'] - } else { - println 'signing.properties found but some entries are missing' - android.buildTypes.release.signingConfig = null - } -} else { - println 'signing.properties not found' - android.buildTypes.release.signingConfig = null -} diff --git a/keystore.properties_sample b/keystore.properties_sample new file mode 100644 index 00000000..569edd73 --- /dev/null +++ b/keystore.properties_sample @@ -0,0 +1,4 @@ +storePassword=123456 +keyPassword=abcdef +keyAlias=myAlias +storeFile=../keystore.jks diff --git a/signing.properties_sample b/signing.properties_sample deleted file mode 100644 index cf8e2396..00000000 --- a/signing.properties_sample +++ /dev/null @@ -1,3 +0,0 @@ -STORE_FILE=/path/to/your.keystore -KEY_ALIAS=projectkeyalias -PASSWORD=yourpass From 3e66723350fbca3984f83f3442139b3347b42bf0 Mon Sep 17 00:00:00 2001 From: tibbi Date: Tue, 6 Nov 2018 22:31:27 +0100 Subject: [PATCH 023/134] adding some missing strings in the basque strings file --- app/src/main/res/values-eu/strings.xml | 22 ++++++++++++++++++++-- 1 file changed, 20 insertions(+), 2 deletions(-) diff --git a/app/src/main/res/values-eu/strings.xml b/app/src/main/res/values-eu/strings.xml index fab37fca..a1d9b4d0 100644 --- a/app/src/main/res/values-eu/strings.xml +++ b/app/src/main/res/values-eu/strings.xml @@ -2,8 +2,8 @@ Kontaktu sinpleak Kontaktuak Helbidea - Txertatzen... - Eguneratzen... + Txertatzen… + Eguneratzen… Telefono memoria Telefono memoria (beste aplikazioentzat ikustezina) Enpresa @@ -15,6 +15,13 @@ Bidali emaila taldeari %s deitu Eskatu beharrezko baimenak + Create new contact + Add to an existing contact + + + No contacts found + No contacts with emails have been found + No contacts with phone numbers have been found Kontaktu berria Editatu taldea @@ -23,6 +30,7 @@ Izena Erdiko izena Abizena + Nickname Talderik ez @@ -43,6 +51,7 @@ Abizenaren arabera sailkatu Erakutsi telefono zenbakiak pantaila nagusian + Show contact thumbnails Kontaktu sakatzean Kontaktua deitu Ikusi kontaktu detaileak @@ -53,6 +62,7 @@ Gogokoak Azken deiak Erakutsi egiaztatze mezua dei bat hasi baino lehen + Show only contacts with phone numbers Emaila @@ -66,6 +76,7 @@ Nagusia Laneko faxa Etxeko faxa + Pager Ez da telefono zenbakirik aurkitu @@ -88,8 +99,14 @@ Esportatu kontaktuak Inportatu .vcf fitxategiko kontaktuak Esportatu kontaktua .vcf fitxategi batera + Target contact source + Include contact sources Fitxategi izena (.vcf gabe) + + Dialpad + Add number to contact + Hautatu erakusteko eremuak Aurrizkia @@ -103,6 +120,7 @@ Webguneak Taldeak Kontaktu jatorria + Instant messaging (IM) Aldatu ditzaket kontaktuetan ikusgarri dauden eremuak? From d26cb6953e9e4890ec5bf33e9fc792420c6c5362 Mon Sep 17 00:00:00 2001 From: tibbi Date: Tue, 6 Nov 2018 22:36:05 +0100 Subject: [PATCH 024/134] update version to 6.0.0 --- app/build.gradle | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 665a9fe9..14440151 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -15,8 +15,8 @@ android { applicationId "com.simplemobiletools.contacts.pro" minSdkVersion 21 targetSdkVersion 28 - versionCode 35 - versionName "5.1.1" + versionCode 36 + versionName "6.0.0" setProperty("archivesBaseName", "contacts") } From 7b32daa52f1c7da70b940d7e72cd401753f80f46 Mon Sep 17 00:00:00 2001 From: tibbi Date: Tue, 6 Nov 2018 22:36:11 +0100 Subject: [PATCH 025/134] updating changelog --- CHANGELOG.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index d7902ed2..fb341dd8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,11 @@ Changelog ========== +Version 6.0.0 *(2018-11-06)* +---------------------------- + + * Initial Pro version + Version 5.1.1 *(2018-11-05)* ---------------------------- From 2acb57bd841642da2f46a81e729a582a063319d0 Mon Sep 17 00:00:00 2001 From: tibbi Date: Tue, 6 Nov 2018 22:53:48 +0100 Subject: [PATCH 026/134] correcting a date in the changelog --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index fb341dd8..7ac4d2c4 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,7 +9,7 @@ Version 6.0.0 *(2018-11-06)* Version 5.1.1 *(2018-11-05)* ---------------------------- - * This version of the app is no longer maintained. Please upgrade to the Pro version. It is free till Nov 13 2018. You can find the Upgrade button at the top of the app Settings. + * This version of the app is no longer maintained. Please upgrade to the Pro version. It is free till Nov 14 2018. You can find the Upgrade button at the top of the app Settings. Version 5.1.0 *(2018-10-28)* ---------------------------- From bf9b0b00642ca96a2b3b361366d859ef6b360513 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9rgio=20Marques?= Date: Sat, 17 Nov 2018 15:28:38 +0000 Subject: [PATCH 027/134] Update strings.xml --- app/src/main/res/values-pt/strings.xml | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/app/src/main/res/values-pt/strings.xml b/app/src/main/res/values-pt/strings.xml index 8d3ee2c4..60f1d6cc 100644 --- a/app/src/main/res/values-pt/strings.xml +++ b/app/src/main/res/values-pt/strings.xml @@ -19,9 +19,9 @@ Adicionar a contacto existente - No contacts found - No contacts with emails have been found - No contacts with phone numbers have been found + Não existem contactos + Não existem contactos com endereço de e-mail + Não existem contactos com número de telefone Novo contacto Editar contacto @@ -33,7 +33,7 @@ Alcunha - Não há grupos + Não existem grupos Criar um novo grupo Remover do grupo Este grupo está vazio @@ -62,7 +62,7 @@ Favoritos Chamadas recentes Mostrar diálogo para confirmar a chamada - Show only contacts with phone numbers + Mostrar apenas contactos com número de telefone E-mail From 0a14414ba0900c061117c0e5a10ff132d45d65a1 Mon Sep 17 00:00:00 2001 From: tibbi Date: Mon, 19 Nov 2018 16:50:24 +0100 Subject: [PATCH 028/134] updating Commons to 5.4.7 --- app/build.gradle | 4 ++-- build.gradle | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 14440151..d70f8bcb 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -51,8 +51,8 @@ android { } dependencies { - implementation 'com.simplemobiletools:commons:5.3.12' - implementation 'joda-time:joda-time:2.9.9' + implementation 'com.simplemobiletools:commons:5.4.7' + implementation 'joda-time:joda-time:2.10.1' implementation 'androidx.constraintlayout:constraintlayout:2.0.0-alpha2' implementation 'com.googlecode.ez-vcard:ez-vcard:0.10.4' diff --git a/build.gradle b/build.gradle index 4ddb226d..85c5b5af 100644 --- a/build.gradle +++ b/build.gradle @@ -1,7 +1,7 @@ // Top-level build file where you can add configuration options common to all sub-projects/modules. buildscript { - ext.kotlin_version = '1.3.0' + ext.kotlin_version = '1.3.10' repositories { google() From e3b0caa577ff8b7f7acef0cbd7911b92e50a5b44 Mon Sep 17 00:00:00 2001 From: tibbi Date: Mon, 19 Nov 2018 16:53:45 +0100 Subject: [PATCH 029/134] do not try updating contact photo if the given activity is destroyed --- .../contacts/pro/activities/ContactActivity.kt | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/ContactActivity.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/ContactActivity.kt index b5973df4..66a45a4f 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/ContactActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/ContactActivity.kt @@ -45,6 +45,10 @@ abstract class ContactActivity : SimpleActivity() { .diskCacheStrategy(DiskCacheStrategy.RESOURCE) .centerCrop() + if (isDestroyed) { + return + } + Glide.with(this) .load(bitmap ?: path) .transition(DrawableTransitionOptions.withCrossFade()) From e976c72cd921452e8b2a1aaa915fd88ba7ca3941 Mon Sep 17 00:00:00 2001 From: tibbi Date: Mon, 19 Nov 2018 16:54:34 +0100 Subject: [PATCH 030/134] do not use writeAheadLogging and custom executor at the Room database --- .../contacts/pro/databases/ContactsDatabase.kt | 3 --- .../simplemobiletools/contacts/pro/objects/MyExecutor.kt | 7 ------- 2 files changed, 10 deletions(-) delete mode 100644 app/src/main/kotlin/com/simplemobiletools/contacts/pro/objects/MyExecutor.kt diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/databases/ContactsDatabase.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/databases/ContactsDatabase.kt index 98c74343..530b1cde 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/databases/ContactsDatabase.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/databases/ContactsDatabase.kt @@ -14,7 +14,6 @@ import com.simplemobiletools.contacts.pro.interfaces.ContactsDao import com.simplemobiletools.contacts.pro.interfaces.GroupsDao import com.simplemobiletools.contacts.pro.models.Group import com.simplemobiletools.contacts.pro.models.LocalContact -import com.simplemobiletools.contacts.pro.objects.MyExecutor import java.util.concurrent.Executors @Database(entities = [LocalContact::class, Group::class], version = 1) @@ -33,7 +32,6 @@ abstract class ContactsDatabase : RoomDatabase() { synchronized(ContactsDatabase::class) { if (db == null) { db = Room.databaseBuilder(context.applicationContext, ContactsDatabase::class.java, "local_contacts.db") - .setQueryExecutor(MyExecutor.myExecutor) .addCallback(object : Callback() { override fun onCreate(db: SupportSQLiteDatabase) { super.onCreate(db) @@ -41,7 +39,6 @@ abstract class ContactsDatabase : RoomDatabase() { } }) .build() - db!!.openHelper.setWriteAheadLoggingEnabled(true) } } } diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/objects/MyExecutor.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/objects/MyExecutor.kt deleted file mode 100644 index 5f32bfd0..00000000 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/objects/MyExecutor.kt +++ /dev/null @@ -1,7 +0,0 @@ -package com.simplemobiletools.contacts.pro.objects - -import java.util.concurrent.Executors - -object MyExecutor { - val myExecutor = Executors.newSingleThreadExecutor() -} From e8c2f1db91e24eae742c9752951826a76be46345 Mon Sep 17 00:00:00 2001 From: tibbi Date: Mon, 19 Nov 2018 20:57:17 +0100 Subject: [PATCH 031/134] fix #294, add an option to hide the dialpad on the main screen --- .../contacts/pro/activities/MainActivity.kt | 10 +++++--- .../pro/activities/SettingsActivity.kt | 12 +++++++++- .../contacts/pro/helpers/Config.kt | 4 ++++ .../contacts/pro/helpers/Constants.kt | 1 + app/src/main/res/layout/activity_settings.xml | 24 +++++++++++++++++++ app/src/main/res/values-az/strings.xml | 1 + app/src/main/res/values-de/strings.xml | 1 + app/src/main/res/values-el/strings.xml | 1 + app/src/main/res/values-eu/strings.xml | 1 + app/src/main/res/values-fr/strings.xml | 1 + app/src/main/res/values-hr/strings.xml | 1 + app/src/main/res/values-it/strings.xml | 1 + app/src/main/res/values-ja/strings.xml | 1 + app/src/main/res/values-ko-rKR/strings.xml | 1 + app/src/main/res/values-lt/strings.xml | 1 + app/src/main/res/values-pt/strings.xml | 1 + app/src/main/res/values-ru/strings.xml | 1 + app/src/main/res/values-sk/strings.xml | 1 + app/src/main/res/values-sv/strings.xml | 1 + app/src/main/res/values-tr/strings.xml | 1 + app/src/main/res/values-zh-rTW/strings.xml | 1 + app/src/main/res/values/strings.xml | 1 + 22 files changed, 64 insertions(+), 4 deletions(-) diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/MainActivity.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/MainActivity.kt index e2f72172..842029ee 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/MainActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/MainActivity.kt @@ -159,11 +159,15 @@ class MainActivity : SimpleActivity(), RefreshContactsListener { } } } - isFirstResume = false val dialpadIcon = resources.getColoredDrawableWithColor(R.drawable.ic_dialpad, if (isBlackAndWhiteTheme()) Color.BLACK else Color.WHITE) - main_dialpad_button.setImageDrawable(dialpadIcon) - main_dialpad_button.background.applyColorFilter(getAdjustedPrimaryColor()) + main_dialpad_button.apply { + setImageDrawable(dialpadIcon) + background.applyColorFilter(getAdjustedPrimaryColor()) + beVisibleIf(config.showDialpadButton) + } + + isFirstResume = false } override fun onPause() { diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/SettingsActivity.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/SettingsActivity.kt index 0950612b..47b2f1d1 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/SettingsActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/SettingsActivity.kt @@ -2,7 +2,8 @@ package com.simplemobiletools.contacts.pro.activities import android.os.Bundle import com.simplemobiletools.commons.dialogs.RadioGroupDialog -import com.simplemobiletools.commons.extensions.* +import com.simplemobiletools.commons.extensions.beVisibleIf +import com.simplemobiletools.commons.extensions.updateTextColors import com.simplemobiletools.commons.models.RadioItem import com.simplemobiletools.contacts.pro.R import com.simplemobiletools.contacts.pro.dialogs.ManageVisibleFieldsDialog @@ -35,6 +36,7 @@ class SettingsActivity : SimpleActivity() { setupUse24HourTimeFormat() setupFilterDuplicates() setupShowCallConfirmation() + setupShowDialpadButton() setupOnContactClick() updateTextColors(settings_holder) } @@ -123,6 +125,14 @@ class SettingsActivity : SimpleActivity() { } } + private fun setupShowDialpadButton() { + settings_show_dialpad_button.isChecked = config.showDialpadButton + settings_show_dialpad_button_holder.setOnClickListener { + settings_show_dialpad_button.toggle() + config.showDialpadButton = settings_show_dialpad_button.isChecked + } + } + private fun setupOnContactClick() { settings_on_contact_click.text = getOnContactClickText() settings_on_contact_click_holder.setOnClickListener { diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/helpers/Config.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/helpers/Config.kt index bd1fbcd3..483ac685 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/helpers/Config.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/helpers/Config.kt @@ -60,4 +60,8 @@ class Config(context: Context) : BaseConfig(context) { var showCallConfirmation: Boolean get() = prefs.getBoolean(SHOW_CALL_CONFIRMATION, false) set(showCallConfirmation) = prefs.edit().putBoolean(SHOW_CALL_CONFIRMATION, showCallConfirmation).apply() + + var showDialpadButton: Boolean + get() = prefs.getBoolean(SHOW_DIALPAD_BUTTON, true) + set(showDialpadButton) = prefs.edit().putBoolean(SHOW_DIALPAD_BUTTON, showDialpadButton).apply() } diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/helpers/Constants.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/helpers/Constants.kt index 9e7fec57..e3b294e7 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/helpers/Constants.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/helpers/Constants.kt @@ -17,6 +17,7 @@ const val SHOW_CONTACT_FIELDS = "show_contact_fields" const val SHOW_TABS = "show_tabs" const val FILTER_DUPLICATES = "filter_duplicates" const val SHOW_CALL_CONFIRMATION = "show_call_confirmation" +const val SHOW_DIALPAD_BUTTON = "show_dialpad_button" const val CONTACT_ID = "contact_id" const val SMT_PRIVATE = "smt_private" // used at the contact source of local contacts hidden from other apps diff --git a/app/src/main/res/layout/activity_settings.xml b/app/src/main/res/layout/activity_settings.xml index 167eb122..60c430c4 100644 --- a/app/src/main/res/layout/activity_settings.xml +++ b/app/src/main/res/layout/activity_settings.xml @@ -294,6 +294,30 @@ + + + + + + Ada soyaddan başla Telefon nömrələrini əsas ekranda göstər Kontakt görüntülərini göstər + Show a dialpad button on the main screen Kontakta toxunduqda Kontakta zəng et Kontakt detallarına bax diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index 6dbca51b..f653cc24 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -52,6 +52,7 @@ Namen mit Nachnamen beginnen Telefonnummern im Hauptmenü zeigen Vorschaubilder der Kontakte zeigen + Show a dialpad button on the main screen Beim Klicken auf den Kontakt Kontakt anrufen Kontaktdetails anzeigen diff --git a/app/src/main/res/values-el/strings.xml b/app/src/main/res/values-el/strings.xml index 618c88fb..e6ec479a 100644 --- a/app/src/main/res/values-el/strings.xml +++ b/app/src/main/res/values-el/strings.xml @@ -52,6 +52,7 @@ Εμφάνιση πρώτα το επώνυμο Εμφάνιση τηλεφωνικών αριθμών στην κύρια οθόνη Εμφάνιση μικρογραφιών επαφής + Show a dialpad button on the main screen Στην επιλογή επαφής Κλήση επαφής Εμφάνιση λεπτομερειών επαφής diff --git a/app/src/main/res/values-eu/strings.xml b/app/src/main/res/values-eu/strings.xml index a1d9b4d0..4322fe92 100644 --- a/app/src/main/res/values-eu/strings.xml +++ b/app/src/main/res/values-eu/strings.xml @@ -52,6 +52,7 @@ Abizenaren arabera sailkatu Erakutsi telefono zenbakiak pantaila nagusian Show contact thumbnails + Show a dialpad button on the main screen Kontaktu sakatzean Kontaktua deitu Ikusi kontaktu detaileak diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml index d51d9d93..76284263 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -52,6 +52,7 @@ Trier les contacts par nom de famille Afficher les numéros de téléphone Afficher les vignettes des contacts + Show a dialpad button on the main screen Sur appui du contact Appeler le contact Voir les détails du contact diff --git a/app/src/main/res/values-hr/strings.xml b/app/src/main/res/values-hr/strings.xml index 19d24c52..201ff756 100644 --- a/app/src/main/res/values-hr/strings.xml +++ b/app/src/main/res/values-hr/strings.xml @@ -52,6 +52,7 @@ Započnite imena s prezimenima Prikaži telefonske brojeve na glavnom zaslonu Prikaži sličice kontakata + Show a dialpad button on the main screen Prilikom dodira kontakta Nazovi kontakt Prikaži pojedinosti o kontaktu diff --git a/app/src/main/res/values-it/strings.xml b/app/src/main/res/values-it/strings.xml index dd4efaa4..50ac868d 100644 --- a/app/src/main/res/values-it/strings.xml +++ b/app/src/main/res/values-it/strings.xml @@ -52,6 +52,7 @@ Prima il nome poi il cognome Mostra i numeri di telefono nella schermata principale Mostra le anteprime dei contatti + Show a dialpad button on the main screen Al click sul contatto Chiama contatto Visualizza i dettagli del contatto diff --git a/app/src/main/res/values-ja/strings.xml b/app/src/main/res/values-ja/strings.xml index d22b12f6..726b78a4 100644 --- a/app/src/main/res/values-ja/strings.xml +++ b/app/src/main/res/values-ja/strings.xml @@ -52,6 +52,7 @@ 姓を先に表示 メイン画面に電話番号を表示 連絡先のサムネイルを表示 + Show a dialpad button on the main screen 連絡先をタップ 連絡先に発信 連絡先の詳細を表示 diff --git a/app/src/main/res/values-ko-rKR/strings.xml b/app/src/main/res/values-ko-rKR/strings.xml index 12228256..076c20dd 100644 --- a/app/src/main/res/values-ko-rKR/strings.xml +++ b/app/src/main/res/values-ko-rKR/strings.xml @@ -52,6 +52,7 @@ 성을 먼저 표시 메인 스크린에 전화번호 표시 Show contact thumbnails + Show a dialpad button on the main screen On contact click Call contact View contact details diff --git a/app/src/main/res/values-lt/strings.xml b/app/src/main/res/values-lt/strings.xml index e29dad0f..42fe0bc1 100644 --- a/app/src/main/res/values-lt/strings.xml +++ b/app/src/main/res/values-lt/strings.xml @@ -52,6 +52,7 @@ Pavardė rodoma pirma Rodyti telefono numerius pagrindiniame programos ekrane Rodyti kontaktų miniatiūras + Show a dialpad button on the main screen Ant kontakto paspaudimo Skambinti kontaktui Žiūrėti kontakto detales diff --git a/app/src/main/res/values-pt/strings.xml b/app/src/main/res/values-pt/strings.xml index 60f1d6cc..d7418f79 100644 --- a/app/src/main/res/values-pt/strings.xml +++ b/app/src/main/res/values-pt/strings.xml @@ -52,6 +52,7 @@ Ordenar por apelido Mostrar número de telefone no ecrã principal Mostrar miniatura do contacto + Show a dialpad button on the main screen Ao tocar no contacto Ligar Ver detalhes diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index 6d5c8629..23911999 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -52,6 +52,7 @@ Показывать сначала фамилию Показывать номера телефонов на главном экране Показывать фото контакта + Show a dialpad button on the main screen При нажатии на контакт Позвонить контакту Просмотреть подробности о контакте diff --git a/app/src/main/res/values-sk/strings.xml b/app/src/main/res/values-sk/strings.xml index 77d6cfe2..5c2dc3b0 100644 --- a/app/src/main/res/values-sk/strings.xml +++ b/app/src/main/res/values-sk/strings.xml @@ -52,6 +52,7 @@ Začať meno priezviskom Zobraziť telefónne čísla na hlavnej obrazovke Zobraziť obrázky kontaktov + Zobraziť tlačidlo pre číselník na hlavnej obrazovke Po kliknutí na kontakt Zavolať kontakt Zobraziť údaje kontaktu diff --git a/app/src/main/res/values-sv/strings.xml b/app/src/main/res/values-sv/strings.xml index 53652727..96b0555b 100644 --- a/app/src/main/res/values-sv/strings.xml +++ b/app/src/main/res/values-sv/strings.xml @@ -52,6 +52,7 @@ Visa efternamn först Visa telefonnummer i huvudvyn Visa kontaktminiatyrer + Show a dialpad button on the main screen Vid kontakttryckning Ring kontakt Visa kontaktuppgifter diff --git a/app/src/main/res/values-tr/strings.xml b/app/src/main/res/values-tr/strings.xml index f94da90e..55f7f257 100644 --- a/app/src/main/res/values-tr/strings.xml +++ b/app/src/main/res/values-tr/strings.xml @@ -52,6 +52,7 @@ Soyadı ile başla Ana ekranda telefon numaralarını göster Kişi küçük resimlerini göster + Show a dialpad button on the main screen Kişi tıklandığında Kişiyi ara Kişi bilgilerini göster diff --git a/app/src/main/res/values-zh-rTW/strings.xml b/app/src/main/res/values-zh-rTW/strings.xml index 3f730034..cce3c4e9 100644 --- a/app/src/main/res/values-zh-rTW/strings.xml +++ b/app/src/main/res/values-zh-rTW/strings.xml @@ -52,6 +52,7 @@ 姓氏在前 主畫面顯示電話號碼 顯示聯絡人縮圖 + Show a dialpad button on the main screen 點擊聯絡人 打電話給聯絡人 顯示聯絡人資料 diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 8bf9c12c..43c25176 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -52,6 +52,7 @@ Start name with surname Show phone numbers on the main screen Show contact thumbnails + Show a dialpad button on the main screen On contact click Call contact View contact details From b6ef90272ac7bed6c6940e3c98ab575c2dace3ea Mon Sep 17 00:00:00 2001 From: tibbi Date: Mon, 19 Nov 2018 22:13:29 +0100 Subject: [PATCH 032/134] adding a Dialer screen --- app/src/main/AndroidManifest.xml | 5 +++++ .../contacts/pro/activities/DialerActivity.kt | 18 ++++++++++++++++++ app/src/main/res/layout/activity_dialer.xml | 10 ++++++++++ app/src/main/res/values-az/strings.xml | 4 ++++ app/src/main/res/values-de/strings.xml | 4 ++++ app/src/main/res/values-el/strings.xml | 4 ++++ app/src/main/res/values-eu/strings.xml | 4 ++++ app/src/main/res/values-fr/strings.xml | 4 ++++ app/src/main/res/values-hr/strings.xml | 4 ++++ app/src/main/res/values-it/strings.xml | 4 ++++ app/src/main/res/values-ja/strings.xml | 4 ++++ app/src/main/res/values-ko-rKR/strings.xml | 4 ++++ app/src/main/res/values-lt/strings.xml | 4 ++++ app/src/main/res/values-pt/strings.xml | 4 ++++ app/src/main/res/values-ru/strings.xml | 4 ++++ app/src/main/res/values-sk/strings.xml | 4 ++++ app/src/main/res/values-sv/strings.xml | 4 ++++ app/src/main/res/values-tr/strings.xml | 4 ++++ app/src/main/res/values-zh-rTW/strings.xml | 4 ++++ app/src/main/res/values/strings.xml | 4 ++++ 20 files changed, 101 insertions(+) create mode 100644 app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/DialerActivity.kt create mode 100644 app/src/main/res/layout/activity_dialer.xml diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 81d50163..1ad87600 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -193,6 +193,11 @@ android:label="@string/dialpad" android:parentActivityName=".activities.MainActivity"/> + + + + + diff --git a/app/src/main/res/values-az/strings.xml b/app/src/main/res/values-az/strings.xml index e66bf38b..80614fe6 100644 --- a/app/src/main/res/values-az/strings.xml +++ b/app/src/main/res/values-az/strings.xml @@ -108,6 +108,10 @@ Dialpad Add number to contact + + Dialer + Calling… + Göstərmək üçün sahəni seç Ön şəkilçi diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index f653cc24..d8d0db55 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -108,6 +108,10 @@ Wählfeld Nummer zu Kontakt hinzufügen + + Dialer + Calling… + Sichtbare Felder auswählen Titel diff --git a/app/src/main/res/values-el/strings.xml b/app/src/main/res/values-el/strings.xml index e6ec479a..d6aa3ab9 100644 --- a/app/src/main/res/values-el/strings.xml +++ b/app/src/main/res/values-el/strings.xml @@ -108,6 +108,10 @@ Πληκτρολόγιο Προσθήκη αριθμού σε επαφή + + Dialer + Calling… + Επιλογή εμφάνισης πεδίων Πρόθεμα diff --git a/app/src/main/res/values-eu/strings.xml b/app/src/main/res/values-eu/strings.xml index 4322fe92..8adfb60f 100644 --- a/app/src/main/res/values-eu/strings.xml +++ b/app/src/main/res/values-eu/strings.xml @@ -108,6 +108,10 @@ Dialpad Add number to contact + + Dialer + Calling… + Hautatu erakusteko eremuak Aurrizkia diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml index 76284263..00346d2d 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -108,6 +108,10 @@ Dialpad Ajouter un numéro au contact + + Dialer + Calling… + Sélectionner les champs à afficher Préfixe diff --git a/app/src/main/res/values-hr/strings.xml b/app/src/main/res/values-hr/strings.xml index 201ff756..13f3e0a1 100644 --- a/app/src/main/res/values-hr/strings.xml +++ b/app/src/main/res/values-hr/strings.xml @@ -108,6 +108,10 @@ Dialpad Add number to contact + + Dialer + Calling… + Odaberi polja za prikaz Prefiks diff --git a/app/src/main/res/values-it/strings.xml b/app/src/main/res/values-it/strings.xml index 50ac868d..c535d666 100644 --- a/app/src/main/res/values-it/strings.xml +++ b/app/src/main/res/values-it/strings.xml @@ -108,6 +108,10 @@ Tastiera Aggiungi numero ai contatti + + Dialer + Calling… + Seleziona i campi da mostrare Prefisso diff --git a/app/src/main/res/values-ja/strings.xml b/app/src/main/res/values-ja/strings.xml index 726b78a4..8db8eeae 100644 --- a/app/src/main/res/values-ja/strings.xml +++ b/app/src/main/res/values-ja/strings.xml @@ -108,6 +108,10 @@ ダイヤルパッド 連絡先に番号を追加 + + Dialer + Calling… + 表示する項目を選択 敬称(名前の前) diff --git a/app/src/main/res/values-ko-rKR/strings.xml b/app/src/main/res/values-ko-rKR/strings.xml index 076c20dd..d5460512 100644 --- a/app/src/main/res/values-ko-rKR/strings.xml +++ b/app/src/main/res/values-ko-rKR/strings.xml @@ -108,6 +108,10 @@ Dialpad Add number to contact + + Dialer + Calling… + Select fields to show Prefix diff --git a/app/src/main/res/values-lt/strings.xml b/app/src/main/res/values-lt/strings.xml index 42fe0bc1..a0980150 100644 --- a/app/src/main/res/values-lt/strings.xml +++ b/app/src/main/res/values-lt/strings.xml @@ -108,6 +108,10 @@ Dialpad Add number to contact + + Dialer + Calling… + Pasirinkti rodomus laukelius Priešdėlis diff --git a/app/src/main/res/values-pt/strings.xml b/app/src/main/res/values-pt/strings.xml index d7418f79..0345cf9a 100644 --- a/app/src/main/res/values-pt/strings.xml +++ b/app/src/main/res/values-pt/strings.xml @@ -108,6 +108,10 @@ Teclado Adicionar número a um contacto + + Dialer + Calling… + Selecione os campos a mostrar Prefixo diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index 23911999..3787e635 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -108,6 +108,10 @@ Набор номера Добавить номер к контакту + + Dialer + Calling… + Выберите отображаемые поля Префикс diff --git a/app/src/main/res/values-sk/strings.xml b/app/src/main/res/values-sk/strings.xml index 5c2dc3b0..64a8e3a5 100644 --- a/app/src/main/res/values-sk/strings.xml +++ b/app/src/main/res/values-sk/strings.xml @@ -108,6 +108,10 @@ Číselník Pridať číslo kontaktu + + Telefón + Vytáčanie… + Zvoľte polia na zobrazenie Titul pred menom diff --git a/app/src/main/res/values-sv/strings.xml b/app/src/main/res/values-sv/strings.xml index 96b0555b..132cac2e 100644 --- a/app/src/main/res/values-sv/strings.xml +++ b/app/src/main/res/values-sv/strings.xml @@ -108,6 +108,10 @@ Knappsats Lägg till nummer i kontakt + + Dialer + Calling… + Välj vilka fält som ska visas Prefix diff --git a/app/src/main/res/values-tr/strings.xml b/app/src/main/res/values-tr/strings.xml index 55f7f257..04c969ce 100644 --- a/app/src/main/res/values-tr/strings.xml +++ b/app/src/main/res/values-tr/strings.xml @@ -108,6 +108,10 @@ Tuş takımı Kişiye numara ekle + + Dialer + Calling… + Görüntülenecek alanları seç Önek diff --git a/app/src/main/res/values-zh-rTW/strings.xml b/app/src/main/res/values-zh-rTW/strings.xml index cce3c4e9..7704645c 100644 --- a/app/src/main/res/values-zh-rTW/strings.xml +++ b/app/src/main/res/values-zh-rTW/strings.xml @@ -108,6 +108,10 @@ 撥號畫面 添加號碼至通訊錄 + + Dialer + Calling… + 選擇要顯示的欄位 前缀 diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 43c25176..ef18ea34 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -108,6 +108,10 @@ Dialpad Add number to contact + + Dialer + Calling… + Select fields to show Prefix From 5c78872c4ee4a70f15f3bc986d3a3928b06fd9bf Mon Sep 17 00:00:00 2001 From: tibbi Date: Mon, 19 Nov 2018 22:58:30 +0100 Subject: [PATCH 033/134] sort contacts directly after fetching, while still on a background thread --- .../contacts/pro/activities/GroupContactsActivity.kt | 5 ----- .../contacts/pro/activities/InsertOrEditContactActivity.kt | 4 ---- .../contacts/pro/activities/SelectContactActivity.kt | 4 ---- .../contacts/pro/dialogs/SelectContactsDialog.kt | 7 +------ .../contacts/pro/fragments/MyViewPagerFragment.kt | 6 ------ .../contacts/pro/helpers/ContactsHelper.kt | 4 ++++ 6 files changed, 5 insertions(+), 25 deletions(-) diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/GroupContactsActivity.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/GroupContactsActivity.kt index 848ea9b1..ab35f298 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/GroupContactsActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/GroupContactsActivity.kt @@ -86,11 +86,6 @@ class GroupContactsActivity : SimpleActivity(), RemoveFromGroupListener, Refresh group_contacts_placeholder_2.beVisibleIf(groupContacts.isEmpty()) group_contacts_placeholder.beVisibleIf(groupContacts.isEmpty()) group_contacts_list.beVisibleIf(groupContacts.isNotEmpty()) - - Contact.sorting = config.sorting - Contact.startWithSurname = config.startNameWithSurname - groupContacts.sort() - updateContacts(groupContacts) } } diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/InsertOrEditContactActivity.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/InsertOrEditContactActivity.kt index b2303819..1b0f8da8 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/InsertOrEditContactActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/InsertOrEditContactActivity.kt @@ -58,10 +58,6 @@ class InsertOrEditContactActivity : SimpleActivity() { } private fun gotContacts(contacts: ArrayList) { - Contact.sorting = config.sorting - Contact.startWithSurname = config.startNameWithSurname - contacts.sort() - ContactsAdapter(this, contacts, null, LOCATION_INSERT_OR_EDIT, null, existing_contact_list, existing_contact_fastscroller) { Intent(applicationContext, EditContactActivity::class.java).apply { data = getContactPublicUri(it as Contact) diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/SelectContactActivity.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/SelectContactActivity.kt index d31c6462..a09d7f86 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/SelectContactActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/SelectContactActivity.kt @@ -99,10 +99,6 @@ class SelectContactActivity : SimpleActivity() { val contactSources = getVisibleContactSources() contacts = contacts.filter { contactSources.contains(it.source) } as ArrayList - Contact.sorting = config.sorting - Contact.startWithSurname = config.startNameWithSurname - contacts.sort() - runOnUiThread { updatePlaceholderVisibility(contacts) SelectContactsAdapter(this, contacts, ArrayList(), false, select_contact_list) { diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/dialogs/SelectContactsDialog.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/dialogs/SelectContactsDialog.kt index b01bfacd..16872932 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/dialogs/SelectContactsDialog.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/dialogs/SelectContactsDialog.kt @@ -6,12 +6,11 @@ import com.simplemobiletools.commons.extensions.setupDialogStuff import com.simplemobiletools.contacts.pro.R import com.simplemobiletools.contacts.pro.activities.SimpleActivity import com.simplemobiletools.contacts.pro.adapters.SelectContactsAdapter -import com.simplemobiletools.contacts.pro.extensions.config import com.simplemobiletools.contacts.pro.extensions.getVisibleContactSources import com.simplemobiletools.contacts.pro.models.Contact import kotlinx.android.synthetic.main.layout_select_contact.view.* -class SelectContactsDialog(val activity: SimpleActivity, initialContacts: ArrayList, val selectContacts: ArrayList? = null, +class SelectContactsDialog(val activity: SimpleActivity, initialContacts: ArrayList, selectContacts: ArrayList? = null, val callback: (addedContacts: ArrayList, removedContacts: ArrayList) -> Unit) { private var view = activity.layoutInflater.inflate(R.layout.layout_select_contact, null) private var initiallySelectedContacts = ArrayList() @@ -27,10 +26,6 @@ class SelectContactsDialog(val activity: SimpleActivity, initialContacts: ArrayL initiallySelectedContacts = selectContacts } - Contact.sorting = activity.config.sorting - Contact.startWithSurname = activity.config.startNameWithSurname - allContacts.sort() - activity.runOnUiThread { view.apply { select_contact_list.adapter = SelectContactsAdapter(activity, allContacts, initiallySelectedContacts, true, select_contact_list) diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/fragments/MyViewPagerFragment.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/fragments/MyViewPagerFragment.kt index 00f97747..8699bb06 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/fragments/MyViewPagerFragment.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/fragments/MyViewPagerFragment.kt @@ -108,9 +108,6 @@ abstract class MyViewPagerFragment(context: Context, attributeSet: AttributeSet) config.lastUsedContactSource = grouped?.key ?: "" } - Contact.sorting = config.sorting - Contact.startWithSurname = config.startNameWithSurname - contacts.sort() allContacts = contacts val filtered = when { @@ -253,9 +250,6 @@ abstract class MyViewPagerFragment(context: Context, attributeSet: AttributeSet) it.websites.any { it.contains(text, true) } } as ArrayList - Contact.sorting = config.sorting - Contact.startWithSurname = config.startNameWithSurname - filtered.sort() filtered.sortBy { !getProperText(it.getNameToDisplay(), shouldNormalize).startsWith(text, true) } if (filtered.isEmpty() && this@MyViewPagerFragment is FavoritesFragment) { diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/helpers/ContactsHelper.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/helpers/ContactsHelper.kt index a3c8a6f8..5b4595f4 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/helpers/ContactsHelper.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/helpers/ContactsHelper.kt @@ -82,6 +82,10 @@ class ContactsHelper(val activity: Activity) { resultContacts.firstOrNull { it.contactId == key }?.groups = groups.valueAt(i) } + Contact.sorting = activity.config.sorting + Contact.startWithSurname = activity.config.startNameWithSurname + resultContacts.sort() + activity.runOnUiThread { callback(resultContacts) } From b95a8aec99f610ff81361687c9ff669bac252fba Mon Sep 17 00:00:00 2001 From: tibbi Date: Mon, 19 Nov 2018 22:59:47 +0100 Subject: [PATCH 034/134] handle the Dial intent at the dialpad activity --- app/src/main/AndroidManifest.xml | 10 +++++++++- .../contacts/pro/activities/DialpadActivity.kt | 13 ++++++++++--- 2 files changed, 19 insertions(+), 4 deletions(-) diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 1ad87600..aee92e80 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -191,7 +191,15 @@ + android:parentActivityName=".activities.MainActivity"> + + + + + + + + ) { contacts = newContacts - Contact.sorting = config.sorting - Contact.startWithSurname = config.startNameWithSurname - contacts.sort() + checkDialIntent() } private fun dialpadValueChanged(text: String) { From 945c5c8e9a39e31a71c5c0a9149bd8aa95f7d20a Mon Sep 17 00:00:00 2001 From: tibbi Date: Tue, 20 Nov 2018 10:49:21 +0100 Subject: [PATCH 035/134] adding some Dialer call related things that might be needed soon --- app/src/main/AndroidManifest.xml | 10 ++++++++++ .../contacts/pro/activities/DialpadActivity.kt | 1 + .../pro/helpers/MyConnectionService.kt | 10 ++++++++++ .../pro/helpers/MyPhoneStateListener.kt | 18 ++++++++++++++++++ 4 files changed, 39 insertions(+) create mode 100644 app/src/main/kotlin/com/simplemobiletools/contacts/pro/helpers/MyConnectionService.kt create mode 100644 app/src/main/kotlin/com/simplemobiletools/contacts/pro/helpers/MyPhoneStateListener.kt diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index aee92e80..6a0934d2 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -6,6 +6,7 @@ android:installLocation="auto"> + @@ -216,6 +217,15 @@ android:resource="@xml/provider_paths"/> + + + + + + () + override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_dialpad) diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/helpers/MyConnectionService.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/helpers/MyConnectionService.kt new file mode 100644 index 00000000..466b2a9f --- /dev/null +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/helpers/MyConnectionService.kt @@ -0,0 +1,10 @@ +package com.simplemobiletools.contacts.pro.helpers + +import android.annotation.TargetApi +import android.os.Build +import android.telecom.ConnectionService + +@TargetApi(Build.VERSION_CODES.M) +class MyConnectionService : ConnectionService() { + +} diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/helpers/MyPhoneStateListener.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/helpers/MyPhoneStateListener.kt new file mode 100644 index 00000000..cd8bbb1d --- /dev/null +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/helpers/MyPhoneStateListener.kt @@ -0,0 +1,18 @@ +package com.simplemobiletools.contacts.pro.helpers + +import android.telephony.PhoneStateListener +import android.telephony.TelephonyManager + +class MyPhoneStateListener : PhoneStateListener() { + override fun onCallStateChanged(state: Int, phoneNumber: String?) { + super.onCallStateChanged(state, phoneNumber) + when (state) { + TelephonyManager.CALL_STATE_IDLE -> { + } + TelephonyManager.CALL_STATE_RINGING -> { + } + TelephonyManager.CALL_STATE_OFFHOOK -> { + } + } + } +} From cb629354c476dd777d57954b277cb5082d5f26bf Mon Sep 17 00:00:00 2001 From: tibbi Date: Tue, 20 Nov 2018 11:33:57 +0100 Subject: [PATCH 036/134] add a helper function for getting the called contact at the Dialer --- app/src/main/AndroidManifest.xml | 10 +++++++- .../contacts/pro/activities/DialerActivity.kt | 10 ++++++++ .../contacts/pro/helpers/ContactsHelper.kt | 25 +++++++++++++++++++ .../pro/helpers/LocalContactsHelper.kt | 9 +++++++ .../contacts/pro/models/LocalContact.kt | 2 +- 5 files changed, 54 insertions(+), 2 deletions(-) diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 6a0934d2..bbf6914a 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -205,7 +205,15 @@ + android:parentActivityName=".activities.MainActivity"> + + + + + + + + Unit) { + Thread { + val uri = CommonDataKinds.Phone.CONTENT_URI + val projection = arrayOf(ContactsContract.Data.RAW_CONTACT_ID) + val selection = "${CommonDataKinds.Phone.NUMBER} = ?" + val selectionArgs = arrayOf(number) + + var cursor: Cursor? = null + try { + cursor = activity.contentResolver.query(uri, projection, selection, selectionArgs, null) + if (cursor?.moveToFirst() == true) { + val id = cursor.getIntValue(ContactsContract.Data.RAW_CONTACT_ID) + callback(getContactWithId(id, false)) + return@Thread + } + } catch (e: Exception) { + activity.showErrorToast(e) + } finally { + cursor?.close() + } + + callback(LocalContactsHelper(activity).getContactWithNumber(number)) + }.start() + } + private fun getContentResolverAccounts(): HashSet { val uri = ContactsContract.Data.CONTENT_URI val projection = arrayOf( diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/helpers/LocalContactsHelper.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/helpers/LocalContactsHelper.kt index d8e52fc3..a15396c2 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/helpers/LocalContactsHelper.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/helpers/LocalContactsHelper.kt @@ -13,6 +13,15 @@ class LocalContactsHelper(val activity: Activity) { fun getContactWithId(id: Int) = convertLocalContactToContact(activity.contactsDB.getContactWithId(id)) + fun getContactWithNumber(number: String): Contact? { + activity.contactsDB.getContacts().forEach { + if (it.phoneNumbers.map { it.value }.contains(number)) { + return convertLocalContactToContact(it) + } + } + return null + } + fun insertOrUpdateContact(contact: Contact): Boolean { val localContact = convertContactToLocalContact(contact) return activity.contactsDB.insertOrUpdate(localContact) > 0 diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/models/LocalContact.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/models/LocalContact.kt index 9ff65b9d..a2947246 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/models/LocalContact.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/models/LocalContact.kt @@ -27,7 +27,7 @@ data class LocalContact( @ColumnInfo(name = "websites") var websites: ArrayList, @ColumnInfo(name = "ims") var IMs: ArrayList) { - override fun equals(other: Any?) = this.id == (other as? LocalContact?)?.id + override fun equals(other: Any?) = id == (other as? LocalContact?)?.id override fun hashCode() = id ?: 0 } From 099d7b6644a39dcf4852a94a5276a6aa4d04d99c Mon Sep 17 00:00:00 2001 From: tibbi Date: Tue, 20 Nov 2018 12:04:08 +0100 Subject: [PATCH 037/134] show the callee name or number on the Dialer screen --- .../contacts/pro/activities/DialerActivity.kt | 20 +++++++- app/src/main/res/layout/activity_dialer.xml | 46 +++++++++++++++++-- app/src/main/res/values/dimens.xml | 2 + 3 files changed, 63 insertions(+), 5 deletions(-) diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/DialerActivity.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/DialerActivity.kt index f9a54c63..b33a1d07 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/DialerActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/DialerActivity.kt @@ -3,20 +3,26 @@ package com.simplemobiletools.contacts.pro.activities import android.content.Intent import android.net.Uri import android.os.Bundle +import com.simplemobiletools.commons.extensions.beGone import com.simplemobiletools.commons.extensions.updateTextColors import com.simplemobiletools.contacts.pro.R import com.simplemobiletools.contacts.pro.helpers.ContactsHelper +import com.simplemobiletools.contacts.pro.models.Contact import kotlinx.android.synthetic.main.activity_dialer.* class DialerActivity : SimpleActivity() { + private var number = "" + override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_dialer) if (intent.action == Intent.ACTION_CALL && intent.data != null && intent.dataString?.contains("tel:") == true) { - val number = Uri.decode(intent.dataString).substringAfter("tel:") + number = Uri.decode(intent.dataString).substringAfter("tel:") ContactsHelper(this).getContactWithNumber(number) { - + runOnUiThread { + updateCallee(it) + } } } } @@ -25,4 +31,14 @@ class DialerActivity : SimpleActivity() { super.onResume() updateTextColors(dialer_holder) } + + private fun updateCallee(contact: Contact?) { + if (contact != null) { + callee_big_name_number.text = contact.getNameToDisplay() + callee_number.text = number + } else { + callee_big_name_number.text = number + callee_number.beGone() + } + } } diff --git a/app/src/main/res/layout/activity_dialer.xml b/app/src/main/res/layout/activity_dialer.xml index 5f860524..4920eb40 100644 --- a/app/src/main/res/layout/activity_dialer.xml +++ b/app/src/main/res/layout/activity_dialer.xml @@ -1,10 +1,50 @@ + android:layout_height="match_parent"> + + + + + + diff --git a/app/src/main/res/values/dimens.xml b/app/src/main/res/values/dimens.xml index b0496177..2756e68c 100644 --- a/app/src/main/res/values/dimens.xml +++ b/app/src/main/res/values/dimens.xml @@ -7,5 +7,7 @@ 56dp 68dp 60dp + 150dp + 34sp From d6e87692050f7019fb60a92c4411aeeaead72d56 Mon Sep 17 00:00:00 2001 From: tibbi Date: Tue, 20 Nov 2018 13:34:22 +0100 Subject: [PATCH 038/134] adding a hangup button to the dialer --- .../contacts/pro/activities/DialerActivity.kt | 2 ++ app/src/main/res/drawable-hdpi/ic_phone_down.png | Bin 0 -> 408 bytes app/src/main/res/drawable-xhdpi/ic_phone_down.png | Bin 0 -> 507 bytes .../main/res/drawable-xxhdpi/ic_phone_down.png | Bin 0 -> 722 bytes .../main/res/drawable-xxxhdpi/ic_phone_down.png | Bin 0 -> 929 bytes .../main/res/drawable/circle_red_background.xml | 9 +++++++++ app/src/main/res/layout/activity_dialer.xml | 13 +++++++++++++ app/src/main/res/values/dimens.xml | 4 +++- 8 files changed, 27 insertions(+), 1 deletion(-) create mode 100755 app/src/main/res/drawable-hdpi/ic_phone_down.png create mode 100644 app/src/main/res/drawable-xhdpi/ic_phone_down.png create mode 100644 app/src/main/res/drawable-xxhdpi/ic_phone_down.png create mode 100644 app/src/main/res/drawable-xxxhdpi/ic_phone_down.png create mode 100644 app/src/main/res/drawable/circle_red_background.xml diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/DialerActivity.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/DialerActivity.kt index b33a1d07..6f1b0907 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/DialerActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/DialerActivity.kt @@ -25,6 +25,8 @@ class DialerActivity : SimpleActivity() { } } } + + dialer_hangup_button.setOnClickListener { finish() } } override fun onResume() { diff --git a/app/src/main/res/drawable-hdpi/ic_phone_down.png b/app/src/main/res/drawable-hdpi/ic_phone_down.png new file mode 100755 index 0000000000000000000000000000000000000000..945478257cc507ae7c654a4af1ab5f86566386d0 GIT binary patch literal 408 zcmV;J0cZY+P)^Fzaxao=4y83r_YKooGwEuZw;Fc*1DdLd6cO7cve=O+7)HSZZqj5YQ6#jJ0P zEk@7z>}1{##v0?h`G~LxV~@d&u=&?wn_*3{)hNlTVx2H+Pmw!OlIx1>X-0%rLGGPO zl%(QiL8_JAwCozxbKAlABbvGf?aETwX(0F5(HMfNhXbi*Wb$%bF2)F4vPEWRAeH5I zz(=(hk-86A>O$nx(6*!!`#{B#wnijLk|as;pZE!kP7M$e(Cw%I0000>oh8k~%rPkPEm$jCfX@Wtz_{W>Bi&}G&?{zm%Ui0N>J~u+G4EJf2!UF~?W{;`5Yp#y(yze>p zxYCvG@{IR=tB&S+nre??hPp5EaJg2t%d$XMAGQ4^O&gpi5l>x>m)(_;Vt002ovPDHLkV1mAW_!9sC literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xxhdpi/ic_phone_down.png b/app/src/main/res/drawable-xxhdpi/ic_phone_down.png new file mode 100644 index 0000000000000000000000000000000000000000..79f71efe3de874cb5adb5c41fcb68b1e1ab3646e GIT binary patch literal 722 zcmV;@0xkWCP)#OSA#U}FeEP(#4ly7~!yqSnLPnuvJn3Wuqj(H;nx_>< z#xqVcI10^F_ba}P`%S5~RPMRdRMq5+bg%6EN(t&3gaYB#yd1D^7szhviL z!y;F@x?GKPwO(_J6D>1F=V*q`MqB1Yw|GshbpN?Rm&lfuj`E{48P7S}9Bm^@+M4Su z&&f#hy`!{@t!J6HqpZQZaYlIsDlP^u7!?h(z;9G+jGrxtE!oBYRCJ90?Gl@EoD3BoBjdPO zM+=ujRm9+mSi|j9RgBvr!U0rWj03`}RT+CV{9Bc=f5T5z8T%>RB3C;^p4maJZViL{ zDmT+2&rFw_Uk!=~bNnfLUuqe7rlt2}?@x1L4Ric1JGJ(R0x(~V?EG#{Y+!m;wNK2C z0x{nwS+%CeI$73!a=NxrK-xOZuhQ|$=B;(LU!tL~C3$&p6*{$g}!K32Eah z4f)QvNMmFJwL7$ql5<=Gt&!2Ngj$UgqD@o{sHg(q_=MZQHhO+qP}nc28s5 zwkug}rTprBRsA&|?dzLcTIy_Dhr7sKUh%Dg<|xZ-gM8-|ce~ILw$nwcsJ*neiz~cq zyqXy6Jy+UQyQm#Bx25yFYKXKA^{Vr2rCAgr4Q=H*KPi!EC4P3Dtu&0npsizkV76?V z?LEh89r;TeC;CK*Tw3T;$7>V$#ZtESlKJw*JTKYaQu(r^E;UR(8s^d*FF7l?&m8$| zmisIpxnNx{S)>pw@{%=$X6qKA(?;Tk8}#b(yk z#qv67seuMs=x8~etz%QWI>9v__mLhZOT#ZVj!e+S+iGTpFWg`c?IR%_?Cu6%n4xCg z(K*tjsT(bn)EF-~(VFT-O4PH46FqOdq!zeQlSqf1jgZ82?>bAj$RORE8#OW0W>G$SB~J9R$HjE{ukZ7{K zBClxfp)~U>nW#i{ysKm6A=?;{R-Pp|pvsBnI6U%}<{nX1)0fPXMxp__MxL{aNonO- zGSOlcdtLJ=06O`&(md-#^*Ox4MCV5VaY2$i$rH_YU=$b!nx7y~qD0ed8U@IvrdiSy z>qN~sT8aM}p=%THz=%000000000000001bFP#adKc+^00000NkvXXu0mjf Dqf4f{ literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable/circle_red_background.xml b/app/src/main/res/drawable/circle_red_background.xml new file mode 100644 index 00000000..4371db18 --- /dev/null +++ b/app/src/main/res/drawable/circle_red_background.xml @@ -0,0 +1,9 @@ + + + + + + diff --git a/app/src/main/res/layout/activity_dialer.xml b/app/src/main/res/layout/activity_dialer.xml index 4920eb40..e035d95b 100644 --- a/app/src/main/res/layout/activity_dialer.xml +++ b/app/src/main/res/layout/activity_dialer.xml @@ -47,4 +47,17 @@ app:layout_constraintTop_toBottomOf="@+id/callee_big_name_number" tools:text="123 456 789"/> + + diff --git a/app/src/main/res/values/dimens.xml b/app/src/main/res/values/dimens.xml index 2756e68c..06eb1258 100644 --- a/app/src/main/res/values/dimens.xml +++ b/app/src/main/res/values/dimens.xml @@ -7,7 +7,9 @@ 56dp 68dp 60dp - 150dp + 70dp + 140dp + 40dp 34sp From b7e91e3b54d9694f284542d7342dfc85f6614e61 Mon Sep 17 00:00:00 2001 From: tibbi Date: Tue, 20 Nov 2018 14:19:49 +0100 Subject: [PATCH 039/134] turn off the Dialer screen if device is put to the ear --- app/src/main/AndroidManifest.xml | 1 + .../contacts/pro/activities/DialerActivity.kt | 57 ++++++++++++++++++- 2 files changed, 55 insertions(+), 3 deletions(-) diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index bbf6914a..2a7f34b5 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -14,6 +14,7 @@ + = -SENSOR_SENSITIVITY && event.values[0] <= SENSOR_SENSITIVITY) { + turnOffScreen() + } else { + turnOnScreen() + } + } + } + + private fun turnOffScreen() { + if (proximityWakeLock?.isHeld == false) { + proximityWakeLock!!.acquire() + } + } + + private fun turnOnScreen() { + if (proximityWakeLock?.isHeld == true) { + proximityWakeLock!!.release(PowerManager.RELEASE_FLAG_WAIT_FOR_NO_PROXIMITY) + } + } } From bba7a957baf58140893af99a318353a08e687387 Mon Sep 17 00:00:00 2001 From: tibbi Date: Tue, 20 Nov 2018 14:28:17 +0100 Subject: [PATCH 040/134] lets finish the Dialer activity if the number isnt provided in a supported format --- .../contacts/pro/activities/DialerActivity.kt | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/DialerActivity.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/DialerActivity.kt index ceba2076..198a39b9 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/DialerActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/DialerActivity.kt @@ -10,6 +10,7 @@ import android.net.Uri import android.os.Bundle import android.os.PowerManager import com.simplemobiletools.commons.extensions.beGone +import com.simplemobiletools.commons.extensions.toast import com.simplemobiletools.commons.extensions.updateTextColors import com.simplemobiletools.contacts.pro.R import com.simplemobiletools.contacts.pro.helpers.ContactsHelper @@ -36,6 +37,9 @@ class DialerActivity : SimpleActivity(), SensorEventListener { updateCallee(it) } } + } else { + toast(R.string.unknown_error_occurred) + finish() } } From ed4bb7d013da13e9a7280343a1562ee96994679c Mon Sep 17 00:00:00 2001 From: tibbi Date: Tue, 20 Nov 2018 17:21:09 +0100 Subject: [PATCH 041/134] changing the placeholder at empty Recent Calls tab --- .../contacts/pro/fragments/MyViewPagerFragment.kt | 1 + app/src/main/res/values-az/strings.xml | 1 + app/src/main/res/values-de/strings.xml | 1 + app/src/main/res/values-el/strings.xml | 1 + app/src/main/res/values-eu/strings.xml | 1 + app/src/main/res/values-fr/strings.xml | 1 + app/src/main/res/values-hr/strings.xml | 1 + app/src/main/res/values-it/strings.xml | 1 + app/src/main/res/values-ja/strings.xml | 1 + app/src/main/res/values-ko-rKR/strings.xml | 1 + app/src/main/res/values-lt/strings.xml | 1 + app/src/main/res/values-pt/strings.xml | 1 + app/src/main/res/values-ru/strings.xml | 1 + app/src/main/res/values-sk/strings.xml | 1 + app/src/main/res/values-sv/strings.xml | 1 + app/src/main/res/values-tr/strings.xml | 1 + app/src/main/res/values-zh-rTW/strings.xml | 1 + app/src/main/res/values/strings.xml | 1 + 18 files changed, 18 insertions(+) diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/fragments/MyViewPagerFragment.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/fragments/MyViewPagerFragment.kt index 8699bb06..6421f519 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/fragments/MyViewPagerFragment.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/fragments/MyViewPagerFragment.kt @@ -61,6 +61,7 @@ abstract class MyViewPagerFragment(context: Context, attributeSet: AttributeSet) } this is RecentsFragment -> { fragment_fab.beGone() + fragment_placeholder.text = activity.getString(R.string.no_recent_calls_found) fragment_placeholder_2.text = activity.getString(R.string.request_the_required_permissions) } } diff --git a/app/src/main/res/values-az/strings.xml b/app/src/main/res/values-az/strings.xml index 80614fe6..1d27d83b 100644 --- a/app/src/main/res/values-az/strings.xml +++ b/app/src/main/res/values-az/strings.xml @@ -22,6 +22,7 @@ No contacts found No contacts with emails have been found No contacts with phone numbers have been found + No recent calls found Yeni kontakt Redaktə et diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index d8d0db55..f6ffaba7 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -22,6 +22,7 @@ Keine Kontakte gefunden Keine Kontakte mit E-Mailadressen gefunden Keine Kontakte mit Telefonnummern gefunden + No recent calls found Neuer Kontakt Kontakt bearbeiten diff --git a/app/src/main/res/values-el/strings.xml b/app/src/main/res/values-el/strings.xml index d6aa3ab9..f9d413a0 100644 --- a/app/src/main/res/values-el/strings.xml +++ b/app/src/main/res/values-el/strings.xml @@ -22,6 +22,7 @@ No contacts found No contacts with emails have been found No contacts with phone numbers have been found + No recent calls found Νέα επαφή Επεξεργασία επαφής diff --git a/app/src/main/res/values-eu/strings.xml b/app/src/main/res/values-eu/strings.xml index 8adfb60f..85c5989c 100644 --- a/app/src/main/res/values-eu/strings.xml +++ b/app/src/main/res/values-eu/strings.xml @@ -22,6 +22,7 @@ No contacts found No contacts with emails have been found No contacts with phone numbers have been found + No recent calls found Kontaktu berria Editatu taldea diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml index 00346d2d..087f2daa 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -22,6 +22,7 @@ No contacts found No contacts with emails have been found No contacts with phone numbers have been found + No recent calls found Nouveau contact Modifier contact diff --git a/app/src/main/res/values-hr/strings.xml b/app/src/main/res/values-hr/strings.xml index 13f3e0a1..2f0ff891 100644 --- a/app/src/main/res/values-hr/strings.xml +++ b/app/src/main/res/values-hr/strings.xml @@ -22,6 +22,7 @@ No contacts found No contacts with emails have been found No contacts with phone numbers have been found + No recent calls found Novi kontakt Uredi kontakt diff --git a/app/src/main/res/values-it/strings.xml b/app/src/main/res/values-it/strings.xml index c535d666..3c0f806c 100644 --- a/app/src/main/res/values-it/strings.xml +++ b/app/src/main/res/values-it/strings.xml @@ -22,6 +22,7 @@ Nessun contatto trovato Nessun contatto trovato con un\'email Nessun contatto trovato con un numero di telefono + No recent calls found Nuovo contatto Modifica contatto diff --git a/app/src/main/res/values-ja/strings.xml b/app/src/main/res/values-ja/strings.xml index 8db8eeae..91655c43 100644 --- a/app/src/main/res/values-ja/strings.xml +++ b/app/src/main/res/values-ja/strings.xml @@ -22,6 +22,7 @@ 連絡先が見つかりません メールアドレスが登録された連絡先が見つかりません 電話番号が登録された連絡先が見つかりません + No recent calls found 新しい連絡先 連絡先を編集 diff --git a/app/src/main/res/values-ko-rKR/strings.xml b/app/src/main/res/values-ko-rKR/strings.xml index d5460512..a361e143 100644 --- a/app/src/main/res/values-ko-rKR/strings.xml +++ b/app/src/main/res/values-ko-rKR/strings.xml @@ -22,6 +22,7 @@ No contacts found No contacts with emails have been found No contacts with phone numbers have been found + No recent calls found 새로운 연락처 연락처 수정 diff --git a/app/src/main/res/values-lt/strings.xml b/app/src/main/res/values-lt/strings.xml index a0980150..bfaa436a 100644 --- a/app/src/main/res/values-lt/strings.xml +++ b/app/src/main/res/values-lt/strings.xml @@ -22,6 +22,7 @@ No contacts found No contacts with emails have been found No contacts with phone numbers have been found + No recent calls found Naujas kontaktas Redaguoti kontaktą diff --git a/app/src/main/res/values-pt/strings.xml b/app/src/main/res/values-pt/strings.xml index 0345cf9a..f541237c 100644 --- a/app/src/main/res/values-pt/strings.xml +++ b/app/src/main/res/values-pt/strings.xml @@ -22,6 +22,7 @@ Não existem contactos Não existem contactos com endereço de e-mail Não existem contactos com número de telefone + No recent calls found Novo contacto Editar contacto diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index 3787e635..9d8ff4d2 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -22,6 +22,7 @@ Контакты не найдены Контакты с адресами электронной почты не найдены Контакты с номерами телефонов не найдены + No recent calls found Новый контакт Редактировать контакт diff --git a/app/src/main/res/values-sk/strings.xml b/app/src/main/res/values-sk/strings.xml index 64a8e3a5..212ef231 100644 --- a/app/src/main/res/values-sk/strings.xml +++ b/app/src/main/res/values-sk/strings.xml @@ -22,6 +22,7 @@ Nenašli sa žiadne kontakty Nenašli sa žiadne kontakty s emailami Nenašli sa žiadne kontakty s telefónnymi číslami + Nenašli sa žiadne posledné hovory Nový kontakt Upraviť kontakt diff --git a/app/src/main/res/values-sv/strings.xml b/app/src/main/res/values-sv/strings.xml index 132cac2e..2ce100b4 100644 --- a/app/src/main/res/values-sv/strings.xml +++ b/app/src/main/res/values-sv/strings.xml @@ -22,6 +22,7 @@ Inga kontakter hittades Inga kontakter med e-postadresser hittades Inga kontakter med telefonnummer hittades + No recent calls found Ny kontakt Redigera kontakt diff --git a/app/src/main/res/values-tr/strings.xml b/app/src/main/res/values-tr/strings.xml index 04c969ce..87b43ed8 100644 --- a/app/src/main/res/values-tr/strings.xml +++ b/app/src/main/res/values-tr/strings.xml @@ -22,6 +22,7 @@ Kişi bulunamadı E-posta ile hiç bağlantı bulunamadı Telefon numaralarını içeren kişi bulunamadı + No recent calls found Yeni kişi Kişiyi düzenle diff --git a/app/src/main/res/values-zh-rTW/strings.xml b/app/src/main/res/values-zh-rTW/strings.xml index 7704645c..a23a8f37 100644 --- a/app/src/main/res/values-zh-rTW/strings.xml +++ b/app/src/main/res/values-zh-rTW/strings.xml @@ -22,6 +22,7 @@ No contacts found No contacts with emails have been found No contacts with phone numbers have been found + No recent calls found 新聯絡人 編輯聯絡人 diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index ef18ea34..fed5e3ff 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -22,6 +22,7 @@ No contacts found No contacts with emails have been found No contacts with phone numbers have been found + No recent calls found New contact Edit contact From ed42e1af608517a29af956e4a73e30068ff29eae Mon Sep 17 00:00:00 2001 From: tibbi Date: Tue, 20 Nov 2018 17:35:47 +0100 Subject: [PATCH 042/134] adding an intent filter to allow Simple Contacts be set as a default phone app --- app/src/main/AndroidManifest.xml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 2a7f34b5..4dc063e2 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -201,6 +201,12 @@ + + + + + + Date: Tue, 20 Nov 2018 17:36:13 +0100 Subject: [PATCH 043/134] adding 2 more calling related permissions --- app/src/main/AndroidManifest.xml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 4dc063e2..a83950c3 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -15,6 +15,8 @@ + + Date: Tue, 20 Nov 2018 17:03:14 +0000 Subject: [PATCH 044/134] Update italian translation --- app/src/main/res/values-it/strings.xml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/app/src/main/res/values-it/strings.xml b/app/src/main/res/values-it/strings.xml index 3c0f806c..a8409429 100644 --- a/app/src/main/res/values-it/strings.xml +++ b/app/src/main/res/values-it/strings.xml @@ -53,7 +53,7 @@ Prima il nome poi il cognome Mostra i numeri di telefono nella schermata principale Mostra le anteprime dei contatti - Show a dialpad button on the main screen + Mostra il pulante per la tastiera nello schermo principale Al click sul contatto Chiama contatto Visualizza i dettagli del contatto @@ -110,8 +110,8 @@ Aggiungi numero ai contatti - Dialer - Calling… + Compositore + Chiamata in corso… Seleziona i campi da mostrare From c9d39b2e03ba2ed40f32b6fd6b086e8efd5c0687 Mon Sep 17 00:00:00 2001 From: Emanuele Petriglia Date: Tue, 20 Nov 2018 17:07:24 +0000 Subject: [PATCH 045/134] Update italian translation --- app/src/main/res/values-it/strings.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/src/main/res/values-it/strings.xml b/app/src/main/res/values-it/strings.xml index 3c0f806c..328ab208 100644 --- a/app/src/main/res/values-it/strings.xml +++ b/app/src/main/res/values-it/strings.xml @@ -5,7 +5,7 @@ Inserimento in corso… Aggiornamento in corso… Memoria del telefono - Memoria del telfono (non visibile alle altre applicazioni) + Memoria del telefono (non visibile alle altre applicazioni) Compagnia Posizione lavorativa Sito web @@ -22,7 +22,7 @@ Nessun contatto trovato Nessun contatto trovato con un\'email Nessun contatto trovato con un numero di telefono - No recent calls found + Nessuna chiamata recente trovata Nuovo contatto Modifica contatto From f5c645026f6c55249f9bfb52b2403f7aeda1fab1 Mon Sep 17 00:00:00 2001 From: tibbi Date: Tue, 20 Nov 2018 21:46:04 +0100 Subject: [PATCH 046/134] adding a few incoming call related things --- app/src/main/AndroidManifest.xml | 11 ++-- .../contacts/pro/activities/DialerActivity.kt | 42 ++++++++++++- .../contacts/pro/extensions/Int.kt | 13 ++++ .../contacts/pro/helpers/Constants.kt | 6 ++ .../pro/helpers/MyConnectionService.kt | 10 ---- .../contacts/pro/models/GsmCall.kt | 13 ++++ .../contacts/pro/objects/CallManager.kt | 29 +++++++++ .../contacts/pro/services/MyCallService.kt | 59 +++++++++++++++++++ .../res/drawable/circle_green_background.xml | 9 +++ app/src/main/res/layout/activity_dialer.xml | 29 +++++++++ app/src/main/res/values-az/strings.xml | 1 + app/src/main/res/values-de/strings.xml | 1 + app/src/main/res/values-el/strings.xml | 1 + app/src/main/res/values-eu/strings.xml | 1 + app/src/main/res/values-fr/strings.xml | 1 + app/src/main/res/values-hr/strings.xml | 1 + app/src/main/res/values-it/strings.xml | 1 + app/src/main/res/values-ja/strings.xml | 1 + app/src/main/res/values-ko-rKR/strings.xml | 1 + app/src/main/res/values-lt/strings.xml | 1 + app/src/main/res/values-pt/strings.xml | 1 + app/src/main/res/values-ru/strings.xml | 1 + app/src/main/res/values-sk/strings.xml | 3 +- app/src/main/res/values-sv/strings.xml | 1 + app/src/main/res/values-tr/strings.xml | 1 + app/src/main/res/values-zh-rTW/strings.xml | 1 + app/src/main/res/values/strings.xml | 1 + 27 files changed, 223 insertions(+), 17 deletions(-) create mode 100644 app/src/main/kotlin/com/simplemobiletools/contacts/pro/extensions/Int.kt delete mode 100644 app/src/main/kotlin/com/simplemobiletools/contacts/pro/helpers/MyConnectionService.kt create mode 100644 app/src/main/kotlin/com/simplemobiletools/contacts/pro/models/GsmCall.kt create mode 100644 app/src/main/kotlin/com/simplemobiletools/contacts/pro/objects/CallManager.kt create mode 100644 app/src/main/kotlin/com/simplemobiletools/contacts/pro/services/MyCallService.kt create mode 100644 app/src/main/res/drawable/circle_green_background.xml diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index a83950c3..433eca19 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -235,11 +235,14 @@ + android:name=".services.MyCallService" + android:permission="android.permission.BIND_INCALL_SERVICE"> + + - + diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/DialerActivity.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/DialerActivity.kt index 198a39b9..918d60c0 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/DialerActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/DialerActivity.kt @@ -1,7 +1,9 @@ package com.simplemobiletools.contacts.pro.activities +import android.content.BroadcastReceiver import android.content.Context import android.content.Intent +import android.content.IntentFilter import android.hardware.Sensor import android.hardware.SensorEvent import android.hardware.SensorEventListener @@ -9,17 +11,23 @@ import android.hardware.SensorManager import android.net.Uri import android.os.Bundle import android.os.PowerManager +import androidx.localbroadcastmanager.content.LocalBroadcastManager import com.simplemobiletools.commons.extensions.beGone +import com.simplemobiletools.commons.extensions.beVisibleIf import com.simplemobiletools.commons.extensions.toast import com.simplemobiletools.commons.extensions.updateTextColors import com.simplemobiletools.contacts.pro.R -import com.simplemobiletools.contacts.pro.helpers.ContactsHelper +import com.simplemobiletools.contacts.pro.helpers.* import com.simplemobiletools.contacts.pro.models.Contact +import com.simplemobiletools.contacts.pro.models.GsmCall +import com.simplemobiletools.contacts.pro.objects.CallManager import kotlinx.android.synthetic.main.activity_dialer.* +// incoming call handling inspired by https://github.com/mbarrben/android_dialer_replacement class DialerActivity : SimpleActivity(), SensorEventListener { private val SENSOR_SENSITIVITY = 4 private var number = "" + private var isIncomingCall = false private var sensorManager: SensorManager? = null private var proximity: Sensor? = null private var proximityWakeLock: PowerManager.WakeLock? = null @@ -27,16 +35,22 @@ class DialerActivity : SimpleActivity(), SensorEventListener { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_dialer) - dialer_hangup_button.setOnClickListener { finish() } initProximityWakeLock() + LocalBroadcastManager.getInstance(applicationContext).registerReceiver(messageReceiver, IntentFilter(DIALER_INTENT_FILTER)) if (intent.action == Intent.ACTION_CALL && intent.data != null && intent.dataString?.contains("tel:") == true) { number = Uri.decode(intent.dataString).substringAfter("tel:") + initViews() ContactsHelper(this).getContactWithNumber(number) { runOnUiThread { updateCallee(it) } } + } else if (intent.action == INCOMING_CALL && intent.extras?.containsKey(CALLER_NUMBER) == true && intent.extras?.containsKey(CALL_STATUS) == true) { + isIncomingCall = true + number = intent.getStringExtra(CALLER_NUMBER) + initViews() + updateUI(intent.getSerializableExtra(CALL_STATUS) as GsmCall.Status) } else { toast(R.string.unknown_error_occurred) finish() @@ -54,6 +68,14 @@ class DialerActivity : SimpleActivity(), SensorEventListener { sensorManager!!.unregisterListener(this) } + private val messageReceiver = object : BroadcastReceiver() { + override fun onReceive(context: Context, intent: Intent) { + if (intent.extras?.containsKey(CALL_STATUS) == true) { + updateUI(intent.getSerializableExtra(CALL_STATUS) as GsmCall.Status) + } + } + } + private fun initProximityWakeLock() { sensorManager = getSystemService(Context.SENSOR_SERVICE) as SensorManager proximity = sensorManager!!.getDefaultSensor(Sensor.TYPE_PROXIMITY) @@ -65,6 +87,22 @@ class DialerActivity : SimpleActivity(), SensorEventListener { } } + private fun initViews() { + dialer_hangup_button.setOnClickListener { CallManager.declineCall() } + dialer_incoming_accept.setOnClickListener { CallManager.acceptCall() } + dialer_incoming_decline.setOnClickListener { CallManager.declineCall() } + + dialer_hangup_button.beVisibleIf(!isIncomingCall) + dialer_incoming_decline.beVisibleIf(isIncomingCall) + dialer_incoming_accept.beVisibleIf(isIncomingCall) + + calling_label.setText(if (isIncomingCall) R.string.incoming_call else R.string.calling) + } + + private fun updateUI(status: GsmCall.Status) { + + } + private fun updateCallee(contact: Contact?) { if (contact != null) { callee_big_name_number.text = contact.getNameToDisplay() diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/extensions/Int.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/extensions/Int.kt new file mode 100644 index 00000000..a150ed86 --- /dev/null +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/extensions/Int.kt @@ -0,0 +1,13 @@ +package com.simplemobiletools.contacts.pro.extensions + +import android.telecom.Call +import com.simplemobiletools.contacts.pro.models.GsmCall + +fun Int.toGsmCallStatus() = when (this) { + Call.STATE_ACTIVE -> GsmCall.Status.ACTIVE + Call.STATE_RINGING -> GsmCall.Status.RINGING + Call.STATE_CONNECTING -> GsmCall.Status.CONNECTING + Call.STATE_DIALING -> GsmCall.Status.DIALING + Call.STATE_DISCONNECTED -> GsmCall.Status.DISCONNECTED + else -> GsmCall.Status.UNKNOWN +} diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/helpers/Constants.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/helpers/Constants.kt index e3b294e7..7f51f50a 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/helpers/Constants.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/helpers/Constants.kt @@ -33,6 +33,12 @@ const val FIRST_GROUP_ID = 10000L const val KEY_PHONE = "phone" const val KEY_NAME = "name" +// Dialer +const val INCOMING_CALL = "incoming_call" +const val CALLER_NUMBER = "caller_number" +const val CALL_STATUS = "call_status" +const val DIALER_INTENT_FILTER = "dialer_intent_filter" + const val LOCATION_CONTACTS_TAB = 0 const val LOCATION_FAVORITES_TAB = 1 const val LOCATION_RECENTS_TAB = 2 diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/helpers/MyConnectionService.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/helpers/MyConnectionService.kt deleted file mode 100644 index 466b2a9f..00000000 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/helpers/MyConnectionService.kt +++ /dev/null @@ -1,10 +0,0 @@ -package com.simplemobiletools.contacts.pro.helpers - -import android.annotation.TargetApi -import android.os.Build -import android.telecom.ConnectionService - -@TargetApi(Build.VERSION_CODES.M) -class MyConnectionService : ConnectionService() { - -} diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/models/GsmCall.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/models/GsmCall.kt new file mode 100644 index 00000000..db23b0e0 --- /dev/null +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/models/GsmCall.kt @@ -0,0 +1,13 @@ +package com.simplemobiletools.contacts.pro.models + +data class GsmCall(val status: GsmCall.Status) { + + enum class Status { + CONNECTING, + DIALING, + RINGING, + ACTIVE, + DISCONNECTED, + UNKNOWN + } +} diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/objects/CallManager.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/objects/CallManager.kt new file mode 100644 index 00000000..d6f095f7 --- /dev/null +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/objects/CallManager.kt @@ -0,0 +1,29 @@ +package com.simplemobiletools.contacts.pro.objects + +import android.annotation.TargetApi +import android.os.Build +import android.telecom.Call + +@TargetApi(Build.VERSION_CODES.M) +object CallManager { + private var currentCall: Call? = null + + fun updateCall(call: Call?) { + currentCall = call + } + + fun declineCall() { + currentCall?.apply { + when (state) { + Call.STATE_RINGING -> reject(false, "") + else -> disconnect() + } + } + } + + fun acceptCall() { + currentCall?.apply { + answer(details.videoState) + } + } +} diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/services/MyCallService.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/services/MyCallService.kt new file mode 100644 index 00000000..2c2da69a --- /dev/null +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/services/MyCallService.kt @@ -0,0 +1,59 @@ +package com.simplemobiletools.contacts.pro.services + +import android.annotation.TargetApi +import android.content.Intent +import android.os.Build +import android.telecom.Call +import android.telecom.InCallService +import androidx.localbroadcastmanager.content.LocalBroadcastManager +import com.simplemobiletools.contacts.pro.activities.DialerActivity +import com.simplemobiletools.contacts.pro.extensions.toGsmCallStatus +import com.simplemobiletools.contacts.pro.helpers.CALLER_NUMBER +import com.simplemobiletools.contacts.pro.helpers.CALL_STATUS +import com.simplemobiletools.contacts.pro.helpers.DIALER_INTENT_FILTER +import com.simplemobiletools.contacts.pro.helpers.INCOMING_CALL +import com.simplemobiletools.contacts.pro.objects.CallManager + +@TargetApi(Build.VERSION_CODES.M) +class MyCallService : InCallService() { + + override fun onCallAdded(call: Call) { + super.onCallAdded(call) + call.registerCallback(callCallback) + + val handle = call.details.handle.toString() + val callerNumber = if (handle.contains("tel:")) { + handle.substringAfter("tel:") + } else { + handle + } + + Intent(this, DialerActivity::class.java).apply { + action = INCOMING_CALL + putExtra(CALL_STATUS, call.state.toGsmCallStatus()) + putExtra(CALLER_NUMBER, callerNumber) + startActivity(this) + } + CallManager.updateCall(call) + } + + override fun onCallRemoved(call: Call) { + super.onCallRemoved(call) + call.unregisterCallback(callCallback) + CallManager.updateCall(null) + } + + private val callCallback = object : Call.Callback() { + override fun onStateChanged(call: Call, state: Int) { + CallManager.updateCall(call) + sendCallToActivity(call) + } + } + + private fun sendCallToActivity(call: Call) { + Intent(DIALER_INTENT_FILTER).apply { + putExtra(CALL_STATUS, call.state.toGsmCallStatus()) + LocalBroadcastManager.getInstance(applicationContext).sendBroadcast(this) + } + } +} diff --git a/app/src/main/res/drawable/circle_green_background.xml b/app/src/main/res/drawable/circle_green_background.xml new file mode 100644 index 00000000..03bb39d3 --- /dev/null +++ b/app/src/main/res/drawable/circle_green_background.xml @@ -0,0 +1,9 @@ + + + + + + diff --git a/app/src/main/res/layout/activity_dialer.xml b/app/src/main/res/layout/activity_dialer.xml index e035d95b..1d17779a 100644 --- a/app/src/main/res/layout/activity_dialer.xml +++ b/app/src/main/res/layout/activity_dialer.xml @@ -56,8 +56,37 @@ android:elevation="@dimen/medium_margin" android:padding="@dimen/activity_margin" android:src="@drawable/ic_phone_down" + android:visibility="gone" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent"/> + + + + diff --git a/app/src/main/res/values-az/strings.xml b/app/src/main/res/values-az/strings.xml index 1d27d83b..7958fd38 100644 --- a/app/src/main/res/values-az/strings.xml +++ b/app/src/main/res/values-az/strings.xml @@ -112,6 +112,7 @@ Dialer Calling… + Incoming call from… Göstərmək üçün sahəni seç diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index f6ffaba7..08869b0c 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -112,6 +112,7 @@ Dialer Calling… + Incoming call from… Sichtbare Felder auswählen diff --git a/app/src/main/res/values-el/strings.xml b/app/src/main/res/values-el/strings.xml index f9d413a0..d99f3629 100644 --- a/app/src/main/res/values-el/strings.xml +++ b/app/src/main/res/values-el/strings.xml @@ -112,6 +112,7 @@ Dialer Calling… + Incoming call from… Επιλογή εμφάνισης πεδίων diff --git a/app/src/main/res/values-eu/strings.xml b/app/src/main/res/values-eu/strings.xml index 85c5989c..49da5f48 100644 --- a/app/src/main/res/values-eu/strings.xml +++ b/app/src/main/res/values-eu/strings.xml @@ -112,6 +112,7 @@ Dialer Calling… + Incoming call from… Hautatu erakusteko eremuak diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml index 087f2daa..dbdee9fe 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -112,6 +112,7 @@ Dialer Calling… + Incoming call from… Sélectionner les champs à afficher diff --git a/app/src/main/res/values-hr/strings.xml b/app/src/main/res/values-hr/strings.xml index 2f0ff891..96a71cdf 100644 --- a/app/src/main/res/values-hr/strings.xml +++ b/app/src/main/res/values-hr/strings.xml @@ -112,6 +112,7 @@ Dialer Calling… + Incoming call from… Odaberi polja za prikaz diff --git a/app/src/main/res/values-it/strings.xml b/app/src/main/res/values-it/strings.xml index 76da5916..98ee80f9 100644 --- a/app/src/main/res/values-it/strings.xml +++ b/app/src/main/res/values-it/strings.xml @@ -112,6 +112,7 @@ Compositore Chiamata in corso… + Incoming call from… Seleziona i campi da mostrare diff --git a/app/src/main/res/values-ja/strings.xml b/app/src/main/res/values-ja/strings.xml index 91655c43..9a321697 100644 --- a/app/src/main/res/values-ja/strings.xml +++ b/app/src/main/res/values-ja/strings.xml @@ -112,6 +112,7 @@ Dialer Calling… + Incoming call from… 表示する項目を選択 diff --git a/app/src/main/res/values-ko-rKR/strings.xml b/app/src/main/res/values-ko-rKR/strings.xml index a361e143..c34cba44 100644 --- a/app/src/main/res/values-ko-rKR/strings.xml +++ b/app/src/main/res/values-ko-rKR/strings.xml @@ -112,6 +112,7 @@ Dialer Calling… + Incoming call from… Select fields to show diff --git a/app/src/main/res/values-lt/strings.xml b/app/src/main/res/values-lt/strings.xml index bfaa436a..907d262e 100644 --- a/app/src/main/res/values-lt/strings.xml +++ b/app/src/main/res/values-lt/strings.xml @@ -112,6 +112,7 @@ Dialer Calling… + Incoming call from… Pasirinkti rodomus laukelius diff --git a/app/src/main/res/values-pt/strings.xml b/app/src/main/res/values-pt/strings.xml index f541237c..c01cfded 100644 --- a/app/src/main/res/values-pt/strings.xml +++ b/app/src/main/res/values-pt/strings.xml @@ -112,6 +112,7 @@ Dialer Calling… + Incoming call from… Selecione os campos a mostrar diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index 9d8ff4d2..b673b8a9 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -112,6 +112,7 @@ Dialer Calling… + Incoming call from… Выберите отображаемые поля diff --git a/app/src/main/res/values-sk/strings.xml b/app/src/main/res/values-sk/strings.xml index 212ef231..bc15ab4a 100644 --- a/app/src/main/res/values-sk/strings.xml +++ b/app/src/main/res/values-sk/strings.xml @@ -111,7 +111,8 @@ Telefón - Vytáčanie… + Vytáča sa… + Prichádzajúci hovor od… Zvoľte polia na zobrazenie diff --git a/app/src/main/res/values-sv/strings.xml b/app/src/main/res/values-sv/strings.xml index 2ce100b4..6851d4f6 100644 --- a/app/src/main/res/values-sv/strings.xml +++ b/app/src/main/res/values-sv/strings.xml @@ -112,6 +112,7 @@ Dialer Calling… + Incoming call from… Välj vilka fält som ska visas diff --git a/app/src/main/res/values-tr/strings.xml b/app/src/main/res/values-tr/strings.xml index 87b43ed8..32ca04e4 100644 --- a/app/src/main/res/values-tr/strings.xml +++ b/app/src/main/res/values-tr/strings.xml @@ -112,6 +112,7 @@ Dialer Calling… + Incoming call from… Görüntülenecek alanları seç diff --git a/app/src/main/res/values-zh-rTW/strings.xml b/app/src/main/res/values-zh-rTW/strings.xml index a23a8f37..08af0c67 100644 --- a/app/src/main/res/values-zh-rTW/strings.xml +++ b/app/src/main/res/values-zh-rTW/strings.xml @@ -112,6 +112,7 @@ Dialer Calling… + Incoming call from… 選擇要顯示的欄位 diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index fed5e3ff..fa3ff8e6 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -112,6 +112,7 @@ Dialer Calling… + Incoming call from… Select fields to show From 0b75543fdace6e2492b8663b741382ce9a543559 Mon Sep 17 00:00:00 2001 From: tibbi Date: Tue, 20 Nov 2018 22:50:42 +0100 Subject: [PATCH 047/134] adding a couple additional call screen related improvements --- .../contacts/pro/activities/DialerActivity.kt | 69 ++++++++++++++----- app/src/main/res/layout/activity_dialer.xml | 10 +-- 2 files changed, 55 insertions(+), 24 deletions(-) diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/DialerActivity.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/DialerActivity.kt index 918d60c0..3f13d618 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/DialerActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/DialerActivity.kt @@ -12,10 +12,7 @@ import android.net.Uri import android.os.Bundle import android.os.PowerManager import androidx.localbroadcastmanager.content.LocalBroadcastManager -import com.simplemobiletools.commons.extensions.beGone -import com.simplemobiletools.commons.extensions.beVisibleIf -import com.simplemobiletools.commons.extensions.toast -import com.simplemobiletools.commons.extensions.updateTextColors +import com.simplemobiletools.commons.extensions.* import com.simplemobiletools.contacts.pro.R import com.simplemobiletools.contacts.pro.helpers.* import com.simplemobiletools.contacts.pro.models.Contact @@ -26,6 +23,8 @@ import kotlinx.android.synthetic.main.activity_dialer.* // incoming call handling inspired by https://github.com/mbarrben/android_dialer_replacement class DialerActivity : SimpleActivity(), SensorEventListener { private val SENSOR_SENSITIVITY = 4 + private val DISCONNECT_DELAY = 3000L + private var number = "" private var isIncomingCall = false private var sensorManager: SensorManager? = null @@ -41,16 +40,13 @@ class DialerActivity : SimpleActivity(), SensorEventListener { if (intent.action == Intent.ACTION_CALL && intent.data != null && intent.dataString?.contains("tel:") == true) { number = Uri.decode(intent.dataString).substringAfter("tel:") initViews() - ContactsHelper(this).getContactWithNumber(number) { - runOnUiThread { - updateCallee(it) - } - } + tryFillingOtherEndsName() } else if (intent.action == INCOMING_CALL && intent.extras?.containsKey(CALLER_NUMBER) == true && intent.extras?.containsKey(CALL_STATUS) == true) { isIncomingCall = true number = intent.getStringExtra(CALLER_NUMBER) initViews() updateUI(intent.getSerializableExtra(CALL_STATUS) as GsmCall.Status) + tryFillingOtherEndsName() } else { toast(R.string.unknown_error_occurred) finish() @@ -88,28 +84,63 @@ class DialerActivity : SimpleActivity(), SensorEventListener { } private fun initViews() { - dialer_hangup_button.setOnClickListener { CallManager.declineCall() } - dialer_incoming_accept.setOnClickListener { CallManager.acceptCall() } - dialer_incoming_decline.setOnClickListener { CallManager.declineCall() } + dialer_hangup_button.setOnClickListener { + CallManager.declineCall() + finish() + } + + dialer_incoming_accept.setOnClickListener { + CallManager.acceptCall() + } + + dialer_incoming_decline.setOnClickListener { + CallManager.declineCall() + finish() + } dialer_hangup_button.beVisibleIf(!isIncomingCall) dialer_incoming_decline.beVisibleIf(isIncomingCall) dialer_incoming_accept.beVisibleIf(isIncomingCall) - calling_label.setText(if (isIncomingCall) R.string.incoming_call else R.string.calling) + dialer_label.setText(if (isIncomingCall) R.string.incoming_call else R.string.calling) + } + + private fun tryFillingOtherEndsName() { + ContactsHelper(this).getContactWithNumber(number) { + runOnUiThread { + updateOtherParticipant(it) + } + } } private fun updateUI(status: GsmCall.Status) { - + when (status) { + GsmCall.Status.ACTIVE -> statusActive() + GsmCall.Status.DISCONNECTED -> statusDisconnected() + } } - private fun updateCallee(contact: Contact?) { + private fun statusActive() { + dialer_label.text = "" + dialer_hangup_button.beVisible() + dialer_incoming_accept.beGone() + dialer_incoming_decline.beGone() + } + + private fun statusDisconnected() { + dialer_hangup_button.beGone() + dialer_hangup_button.postDelayed({ + finish() + }, DISCONNECT_DELAY) + } + + private fun updateOtherParticipant(contact: Contact?) { if (contact != null) { - callee_big_name_number.text = contact.getNameToDisplay() - callee_number.text = number + dialer_big_name_number.text = contact.getNameToDisplay() + dialer_number.text = number } else { - callee_big_name_number.text = number - callee_number.beGone() + dialer_big_name_number.text = number + dialer_number.beGone() } } diff --git a/app/src/main/res/layout/activity_dialer.xml b/app/src/main/res/layout/activity_dialer.xml index 1d17779a..f4d4c3e3 100644 --- a/app/src/main/res/layout/activity_dialer.xml +++ b/app/src/main/res/layout/activity_dialer.xml @@ -8,7 +8,7 @@ android:layout_height="match_parent"> Date: Tue, 20 Nov 2018 23:31:50 +0100 Subject: [PATCH 048/134] make use of the system string normalizing instead of custom regex --- .../pro/activities/EditContactActivity.kt | 4 ++-- .../contacts/pro/extensions/Context.kt | 2 +- .../contacts/pro/extensions/String.kt | 4 ++-- .../contacts/pro/fragments/RecentsFragment.kt | 6 ++--- .../contacts/pro/helpers/Constants.kt | 1 - .../contacts/pro/helpers/ContactsHelper.kt | 24 +++++++------------ .../pro/helpers/LocalContactsHelper.kt | 17 +++++++------ .../contacts/pro/helpers/VcfImporter.kt | 6 ++--- .../contacts/pro/models/Contact.kt | 23 +++++------------- .../contacts/pro/models/PhoneNumber.kt | 2 +- 10 files changed, 35 insertions(+), 54 deletions(-) diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/EditContactActivity.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/EditContactActivity.kt index abf4376c..5ce6b5c1 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/EditContactActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/EditContactActivity.kt @@ -168,7 +168,7 @@ class EditContactActivity : ContactActivity() { val phone = intent.extras.get(KEY_PHONE) if (phone != null) { val phoneNumber = phone.toString() - contact!!.phoneNumbers.add(PhoneNumber(phoneNumber, DEFAULT_PHONE_NUMBER_TYPE, "")) + contact!!.phoneNumbers.add(PhoneNumber(phoneNumber, DEFAULT_PHONE_NUMBER_TYPE, "", phoneNumber.normalizeNumber())) if (phoneNumber.isNotEmpty() && action == ADD_NEW_CONTACT_NUMBER) { highlightLastPhoneNumber = true } @@ -883,7 +883,7 @@ class EditContactActivity : ContactActivity() { val numberLabel = if (numberType == CommonDataKinds.Phone.TYPE_CUSTOM) numberHolder.contact_number_type.value else "" if (number.isNotEmpty()) { - phoneNumbers.add(PhoneNumber(number, numberType, numberLabel)) + phoneNumbers.add(PhoneNumber(number, numberType, numberLabel, number.normalizeNumber())) } } return phoneNumbers diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/extensions/Context.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/extensions/Context.kt index 38691b30..cf675e63 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/extensions/Context.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/extensions/Context.kt @@ -36,7 +36,7 @@ fun Context.getEmptyContact(): Contact { val originalContactSource = if (hasContactPermissions()) config.lastUsedContactSource else SMT_PRIVATE val organization = Organization("", "") return Contact(0, "", "", "", "", "", "", "", ArrayList(), ArrayList(), ArrayList(), ArrayList(), originalContactSource, 0, 0, "", - null, "", ArrayList(), organization, ArrayList(), ArrayList(), ArrayList()) + null, "", ArrayList(), organization, ArrayList(), ArrayList()) } fun Context.viewContact(contact: Contact) { diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/extensions/String.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/extensions/String.kt index b35d3b9a..beda894f 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/extensions/String.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/extensions/String.kt @@ -1,8 +1,8 @@ package com.simplemobiletools.contacts.pro.extensions +import android.telephony.PhoneNumberUtils import android.widget.TextView import com.simplemobiletools.commons.helpers.getDateFormats -import com.simplemobiletools.contacts.pro.helpers.PHONE_NUMBER_PATTERN import org.joda.time.DateTime import org.joda.time.format.DateTimeFormat import java.text.DateFormat @@ -34,4 +34,4 @@ fun String.getDateTimeFromDateString(viewToUpdate: TextView? = null): DateTime { return date } -fun String.applyRegexFiltering() = replace(PHONE_NUMBER_PATTERN.toRegex(), "") +fun String.normalizeNumber() = PhoneNumberUtils.normalizeNumber(this) diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/fragments/RecentsFragment.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/fragments/RecentsFragment.kt index 12678e9f..814df2fa 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/fragments/RecentsFragment.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/fragments/RecentsFragment.kt @@ -9,8 +9,8 @@ import com.simplemobiletools.commons.helpers.PERMISSION_READ_CALL_LOG import com.simplemobiletools.commons.helpers.PERMISSION_WRITE_CALL_LOG import com.simplemobiletools.contacts.pro.activities.EditContactActivity import com.simplemobiletools.contacts.pro.adapters.RecentCallsAdapter -import com.simplemobiletools.contacts.pro.extensions.applyRegexFiltering import com.simplemobiletools.contacts.pro.extensions.contactClicked +import com.simplemobiletools.contacts.pro.extensions.normalizeNumber import com.simplemobiletools.contacts.pro.helpers.IS_FROM_SIMPLE_CONTACTS import com.simplemobiletools.contacts.pro.helpers.KEY_PHONE import com.simplemobiletools.contacts.pro.helpers.RECENTS_TAB_MASK @@ -43,10 +43,10 @@ class RecentsFragment(context: Context, attributeSet: AttributeSet) : MyViewPage val currAdapter = fragment_list.adapter if (currAdapter == null) { RecentCallsAdapter(activity!!, recentCalls, activity, fragment_list, fragment_fastscroller) { - val recentCall = (it as RecentCall).number.applyRegexFiltering() + val recentCall = (it as RecentCall).number.normalizeNumber() var selectedContact: Contact? = null for (contact in allContacts) { - if (contact.phoneNumbers.any { it.value.applyRegexFiltering() == recentCall }) { + if (contact.phoneNumbers.any { it.normalizedNumber == recentCall }) { selectedContact = contact break } diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/helpers/Constants.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/helpers/Constants.kt index 7f51f50a..fbe43487 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/helpers/Constants.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/helpers/Constants.kt @@ -23,7 +23,6 @@ const val CONTACT_ID = "contact_id" const val SMT_PRIVATE = "smt_private" // used at the contact source of local contacts hidden from other apps const val IS_PRIVATE = "is_private" const val GROUP = "group" -const val PHONE_NUMBER_PATTERN = "[^0-9#*+]" const val IS_FROM_SIMPLE_CONTACTS = "is_from_simple_contacts" const val ADD_NEW_CONTACT_NUMBER = "add_new_contact_number" const val FIRST_CONTACT_ID = 1000000 diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/helpers/ContactsHelper.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/helpers/ContactsHelper.kt index aec129c8..d84acd23 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/helpers/ContactsHelper.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/helpers/ContactsHelper.kt @@ -96,8 +96,8 @@ class ContactsHelper(val activity: Activity) { Thread { val uri = CommonDataKinds.Phone.CONTENT_URI val projection = arrayOf(ContactsContract.Data.RAW_CONTACT_ID) - val selection = "${CommonDataKinds.Phone.NUMBER} = ?" - val selectionArgs = arrayOf(number) + val selection = "${CommonDataKinds.Phone.NORMALIZED_NUMBER} = ?" + val selectionArgs = arrayOf(number.normalizeNumber()) var cursor: Cursor? = null try { @@ -180,10 +180,9 @@ class ContactsHelper(val activity: Activity) { val groups = ArrayList() val organization = Organization("", "") val websites = ArrayList() - val cleanNumbers = ArrayList() val ims = ArrayList() val contact = Contact(id, prefix, firstName, middleName, surname, suffix, nickname, photoUri, numbers, emails, addresses, - events, accountName, starred, contactId, thumbnailUri, null, notes, groups, organization, websites, cleanNumbers, ims) + events, accountName, starred, contactId, thumbnailUri, null, notes, groups, organization, websites, ims) contacts.put(id, contact) } while (cursor.moveToNext()) @@ -194,7 +193,6 @@ class ContactsHelper(val activity: Activity) { cursor?.close() } - val filterDuplicates = activity.config.filterDuplicates val phoneNumbers = getPhoneNumbers(null) var size = phoneNumbers.size() for (i in 0 until size) { @@ -202,13 +200,6 @@ class ContactsHelper(val activity: Activity) { if (contacts[key] != null) { val numbers = phoneNumbers.valueAt(i) contacts[key].phoneNumbers = numbers - - if (filterDuplicates) { - // remove all spaces, dashes etc from numbers for easier comparing, used only at list views - numbers.forEach { - numbers.mapTo(contacts[key].cleanPhoneNumbers) { PhoneNumber(it.value.applyRegexFiltering(), 0, "") } - } - } } } @@ -275,6 +266,7 @@ class ContactsHelper(val activity: Activity) { val projection = arrayOf( ContactsContract.Data.RAW_CONTACT_ID, CommonDataKinds.Phone.NUMBER, + CommonDataKinds.Phone.NORMALIZED_NUMBER, CommonDataKinds.Phone.TYPE, CommonDataKinds.Phone.LABEL ) @@ -289,6 +281,7 @@ class ContactsHelper(val activity: Activity) { do { val id = cursor.getIntValue(ContactsContract.Data.RAW_CONTACT_ID) val number = cursor.getStringValue(CommonDataKinds.Phone.NUMBER) ?: continue + val normalizedNumber = cursor.getStringValue(CommonDataKinds.Phone.NORMALIZED_NUMBER) ?: "" val type = cursor.getIntValue(CommonDataKinds.Phone.TYPE) val label = cursor.getStringValue(CommonDataKinds.Phone.LABEL) ?: "" @@ -296,7 +289,7 @@ class ContactsHelper(val activity: Activity) { phoneNumbers.put(id, ArrayList()) } - val phoneNumber = PhoneNumber(number, type, label) + val phoneNumber = PhoneNumber(number, type, label, normalizedNumber) phoneNumbers[id].add(phoneNumber) } while (cursor.moveToNext()) } @@ -837,10 +830,9 @@ class ContactsHelper(val activity: Activity) { val thumbnailUri = cursor.getStringValue(CommonDataKinds.StructuredName.PHOTO_THUMBNAIL_URI) ?: "" val organization = getOrganizations(id)[id] ?: Organization("", "") val websites = getWebsites(id)[id] ?: ArrayList() - val cleanNumbers = ArrayList() val ims = getIMs(id)[id] ?: ArrayList() return Contact(id, prefix, firstName, middleName, surname, suffix, nickname, photoUri, number, emails, addresses, events, - accountName, starred, contactId, thumbnailUri, null, notes, groups, organization, websites, cleanNumbers, ims) + accountName, starred, contactId, thumbnailUri, null, notes, groups, organization, websites, ims) } } finally { cursor?.close() @@ -990,6 +982,7 @@ class ContactsHelper(val activity: Activity) { withValue(ContactsContract.Data.RAW_CONTACT_ID, contact.id) withValue(ContactsContract.Data.MIMETYPE, CommonDataKinds.Phone.CONTENT_ITEM_TYPE) withValue(CommonDataKinds.Phone.NUMBER, it.value) + withValue(CommonDataKinds.Phone.NORMALIZED_NUMBER, it.normalizedNumber) withValue(CommonDataKinds.Phone.TYPE, it.type) withValue(CommonDataKinds.Phone.LABEL, it.label) operations.add(build()) @@ -1292,6 +1285,7 @@ class ContactsHelper(val activity: Activity) { withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, 0) withValue(ContactsContract.Data.MIMETYPE, CommonDataKinds.Phone.CONTENT_ITEM_TYPE) withValue(CommonDataKinds.Phone.NUMBER, it.value) + withValue(CommonDataKinds.Phone.NORMALIZED_NUMBER, it.normalizedNumber) withValue(CommonDataKinds.Phone.TYPE, it.type) withValue(CommonDataKinds.Phone.LABEL, it.label) operations.add(build()) diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/helpers/LocalContactsHelper.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/helpers/LocalContactsHelper.kt index a15396c2..438f8eee 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/helpers/LocalContactsHelper.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/helpers/LocalContactsHelper.kt @@ -5,8 +5,14 @@ import android.graphics.Bitmap import android.graphics.BitmapFactory import android.net.Uri import android.provider.MediaStore -import com.simplemobiletools.contacts.pro.extensions.* -import com.simplemobiletools.contacts.pro.models.* +import com.simplemobiletools.contacts.pro.extensions.contactsDB +import com.simplemobiletools.contacts.pro.extensions.getByteArray +import com.simplemobiletools.contacts.pro.extensions.getEmptyContact +import com.simplemobiletools.contacts.pro.extensions.getPhotoThumbnailSize +import com.simplemobiletools.contacts.pro.models.Contact +import com.simplemobiletools.contacts.pro.models.Group +import com.simplemobiletools.contacts.pro.models.LocalContact +import com.simplemobiletools.contacts.pro.models.Organization class LocalContactsHelper(val activity: Activity) { fun getAllContacts() = activity.contactsDB.getContacts().map { convertLocalContactToContact(it) }.toMutableList() as ArrayList @@ -81,12 +87,6 @@ class LocalContactsHelper(val activity: Activity) { return null } - val filterDuplicates = activity.config.filterDuplicates - val filteredPhoneNumbers = ArrayList() - if (filterDuplicates) { - localContact.phoneNumbers.mapTo(filteredPhoneNumbers) { PhoneNumber(it.value.applyRegexFiltering(), 0, "") } - } - val contactPhoto = if (localContact.photo == null) { null } else { @@ -121,7 +121,6 @@ class LocalContactsHelper(val activity: Activity) { groups = storedGroups.filter { localContact.groups.contains(it.id) } as ArrayList organization = Organization(localContact.company, localContact.jobPosition) websites = localContact.websites - cleanPhoneNumbers = filteredPhoneNumbers IMs = localContact.IMs } } diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/helpers/VcfImporter.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/helpers/VcfImporter.kt index d62a0098..fe08741a 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/helpers/VcfImporter.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/helpers/VcfImporter.kt @@ -9,6 +9,7 @@ import com.simplemobiletools.contacts.pro.activities.SimpleActivity import com.simplemobiletools.contacts.pro.extensions.getCachePhoto import com.simplemobiletools.contacts.pro.extensions.getCachePhotoUri import com.simplemobiletools.contacts.pro.extensions.groupsDB +import com.simplemobiletools.contacts.pro.extensions.normalizeNumber import com.simplemobiletools.contacts.pro.helpers.VcfImporter.ImportResult.* import com.simplemobiletools.contacts.pro.models.* import ezvcard.Ezvcard @@ -59,7 +60,7 @@ class VcfImporter(val activity: SimpleActivity) { "" } - phoneNumbers.add(PhoneNumber(number, type, label)) + phoneNumbers.add(PhoneNumber(number, type, label, number.normalizeNumber())) } val emails = ArrayList() @@ -112,7 +113,6 @@ class VcfImporter(val activity: SimpleActivity) { val photoData = ezContact.photos.firstOrNull()?.data val photo = null val thumbnailUri = savePhoto(photoData) - val cleanPhoneNumbers = ArrayList() val IMs = ArrayList() ezContact.impps.forEach { @@ -136,7 +136,7 @@ class VcfImporter(val activity: SimpleActivity) { } val contact = Contact(0, prefix, firstName, middleName, surname, suffix, nickname, photoUri, phoneNumbers, emails, addresses, events, - targetContactSource, starred, contactId, thumbnailUri, photo, notes, groups, organization, websites, cleanPhoneNumbers, IMs) + targetContactSource, starred, contactId, thumbnailUri, photo, notes, groups, organization, websites, IMs) // if there is no N and ORG fields at the given contact, only FN, treat it as an organization if (contact.getNameToDisplay().isEmpty() && contact.organization.isEmpty() && ezContact.formattedName.value.isNotEmpty()) { diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/models/Contact.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/models/Contact.kt index a9e5bb92..750ccce0 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/models/Contact.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/models/Contact.kt @@ -5,13 +5,12 @@ import com.simplemobiletools.commons.extensions.normalizeString import com.simplemobiletools.commons.helpers.SORT_BY_FIRST_NAME import com.simplemobiletools.commons.helpers.SORT_BY_MIDDLE_NAME import com.simplemobiletools.commons.helpers.SORT_DESCENDING -import com.simplemobiletools.contacts.pro.extensions.applyRegexFiltering +import com.simplemobiletools.contacts.pro.extensions.normalizeNumber data class Contact(var id: Int, var prefix: String, var firstName: String, var middleName: String, var surname: String, var suffix: String, var nickname: String, var photoUri: String, var phoneNumbers: ArrayList, var emails: ArrayList, var addresses: ArrayList
, var events: ArrayList, var source: String, var starred: Int, var contactId: Int, var thumbnailUri: String, var photo: Bitmap?, var notes: String, - var groups: ArrayList, var organization: Organization, var websites: ArrayList, var cleanPhoneNumbers: ArrayList, - var IMs: ArrayList) : + var groups: ArrayList, var organization: Organization, var websites: ArrayList, var IMs: ArrayList) : Comparable { companion object { var sorting = 0 @@ -126,21 +125,11 @@ data class Contact(var id: Int, var prefix: String, var firstName: String, var m fun isABusinessContact() = prefix.isEmpty() && firstName.isEmpty() && middleName.isEmpty() && surname.isEmpty() && suffix.isEmpty() && organization.isNotEmpty() - // do a more advanced phone number check here, compare numbers and and search query with dashes, spaces and everything but numbers removed fun doesContainPhoneNumber(text: String): Boolean { - if (text.isNotEmpty()) { - if (phoneNumbers.any { it.value.contains(text) } || cleanPhoneNumbers.any { it.value.contains(text) }) { - return true - } + return if (text.isNotEmpty()) { + phoneNumbers.any { it.value.contains(text) || it.normalizedNumber?.contains(text.normalizeNumber()) == true || it.value.normalizeNumber().contains(text.normalizeNumber()) } + } else { + false } - - val filteredNumber = text.applyRegexFiltering() - if (filteredNumber.isNotEmpty()) { - if (phoneNumbers.any { it.value.contains(filteredNumber) } || cleanPhoneNumbers.any { it.value.contains(filteredNumber) }) { - return true - } - } - - return false } } diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/models/PhoneNumber.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/models/PhoneNumber.kt index b95127aa..3c0850c3 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/models/PhoneNumber.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/models/PhoneNumber.kt @@ -1,3 +1,3 @@ package com.simplemobiletools.contacts.pro.models -data class PhoneNumber(var value: String, var type: Int, var label: String) +data class PhoneNumber(var value: String, var type: Int, var label: String, var normalizedNumber: String?) From 62d0bf37016836ec7a718757b2b7787092c5266a Mon Sep 17 00:00:00 2001 From: tibbi Date: Wed, 21 Nov 2018 11:33:02 +0100 Subject: [PATCH 049/134] show a timer at established calls --- .../contacts/pro/activities/DialerActivity.kt | 25 +++++++++++++++++++ app/src/main/res/layout/activity_dialer.xml | 15 +++++++++++ 2 files changed, 40 insertions(+) diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/DialerActivity.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/DialerActivity.kt index 3f13d618..f351b8e8 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/DialerActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/DialerActivity.kt @@ -10,6 +10,7 @@ import android.hardware.SensorEventListener import android.hardware.SensorManager import android.net.Uri import android.os.Bundle +import android.os.Handler import android.os.PowerManager import androidx.localbroadcastmanager.content.LocalBroadcastManager import com.simplemobiletools.commons.extensions.* @@ -27,9 +28,12 @@ class DialerActivity : SimpleActivity(), SensorEventListener { private var number = "" private var isIncomingCall = false + private var isCallActive = false + private var callDuration = 0 private var sensorManager: SensorManager? = null private var proximity: Sensor? = null private var proximityWakeLock: PowerManager.WakeLock? = null + private var timerHandler = Handler() override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) @@ -64,6 +68,11 @@ class DialerActivity : SimpleActivity(), SensorEventListener { sensorManager!!.unregisterListener(this) } + override fun onDestroy() { + super.onDestroy() + timerHandler.removeCallbacksAndMessages(null) + } + private val messageReceiver = object : BroadcastReceiver() { override fun onReceive(context: Context, intent: Intent) { if (intent.extras?.containsKey(CALL_STATUS) == true) { @@ -121,13 +130,29 @@ class DialerActivity : SimpleActivity(), SensorEventListener { } private fun statusActive() { + isCallActive = true + dialer_call_duration.beVisible() + updateCallDuration() + dialer_label.text = "" dialer_hangup_button.beVisible() dialer_incoming_accept.beGone() dialer_incoming_decline.beGone() } + private fun updateCallDuration() { + dialer_call_duration.text = callDuration.getFormattedDuration() + timerHandler.postDelayed({ + if (isCallActive) { + callDuration++ + updateCallDuration() + } + }, 1000) + } + private fun statusDisconnected() { + isCallActive = false + timerHandler.removeCallbacksAndMessages(null) dialer_hangup_button.beGone() dialer_hangup_button.postDelayed({ finish() diff --git a/app/src/main/res/layout/activity_dialer.xml b/app/src/main/res/layout/activity_dialer.xml index f4d4c3e3..163e4d1d 100644 --- a/app/src/main/res/layout/activity_dialer.xml +++ b/app/src/main/res/layout/activity_dialer.xml @@ -47,6 +47,21 @@ app:layout_constraintTop_toBottomOf="@+id/dialer_big_name_number" tools:text="123 456 789"/> + + Date: Wed, 21 Nov 2018 11:33:13 +0100 Subject: [PATCH 050/134] do not show the actionbar Back button at the dialer --- app/src/main/AndroidManifest.xml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 433eca19..dad2cfa9 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -213,8 +213,7 @@ + android:label="@string/dialer"> From 44b6d1fc5a6617f67108b136d8672f057c9d4222 Mon Sep 17 00:00:00 2001 From: tibbi Date: Wed, 21 Nov 2018 12:12:00 +0100 Subject: [PATCH 051/134] properly handle the Show Recent Calls intent --- app/src/main/AndroidManifest.xml | 9 ++++++++ .../contacts/pro/activities/MainActivity.kt | 22 ++++++++++++++++++- 2 files changed, 30 insertions(+), 1 deletion(-) diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index dad2cfa9..f5e0e61e 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -57,6 +57,15 @@ + + + + + + + + + ().apply { add(Release(10, R.string.release_10)) From e96463ad82f21e9dbcbbf1db3e2a367cdd63daac Mon Sep 17 00:00:00 2001 From: tibbi Date: Wed, 21 Nov 2018 12:23:20 +0100 Subject: [PATCH 052/134] if the other party hangs up before establishing, close screen immediately --- .../contacts/pro/activities/DialerActivity.kt | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/DialerActivity.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/DialerActivity.kt index f351b8e8..61333e69 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/DialerActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/DialerActivity.kt @@ -151,12 +151,16 @@ class DialerActivity : SimpleActivity(), SensorEventListener { } private fun statusDisconnected() { - isCallActive = false timerHandler.removeCallbacksAndMessages(null) dialer_hangup_button.beGone() - dialer_hangup_button.postDelayed({ + if (isCallActive) { + dialer_hangup_button.postDelayed({ + finish() + }, DISCONNECT_DELAY) + } else { finish() - }, DISCONNECT_DELAY) + } + isCallActive = false } private fun updateOtherParticipant(contact: Contact?) { From 957d525c1a6e96873298b6db152e0b6f86b854b1 Mon Sep 17 00:00:00 2001 From: tibbi Date: Wed, 21 Nov 2018 16:21:10 +0100 Subject: [PATCH 053/134] adding an initial implementation of the ongoing call notification --- app/src/main/AndroidManifest.xml | 5 ++ .../contacts/pro/activities/DialerActivity.kt | 39 +++++++---- .../pro/services/DialerCallService.kt | 68 +++++++++++++++++++ 3 files changed, 99 insertions(+), 13 deletions(-) create mode 100644 app/src/main/kotlin/com/simplemobiletools/contacts/pro/services/DialerCallService.kt diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index f5e0e61e..86d2f354 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -17,6 +17,7 @@ + + + Date: Wed, 21 Nov 2018 16:35:05 +0100 Subject: [PATCH 054/134] removing the redundant GsmCall model class --- .../contacts/pro/activities/DialerActivity.kt | 12 ++++++------ .../contacts/pro/extensions/Int.kt | 13 ------------- .../contacts/pro/models/GsmCall.kt | 13 ------------- .../contacts/pro/services/MyCallService.kt | 5 ++--- 4 files changed, 8 insertions(+), 35 deletions(-) delete mode 100644 app/src/main/kotlin/com/simplemobiletools/contacts/pro/extensions/Int.kt delete mode 100644 app/src/main/kotlin/com/simplemobiletools/contacts/pro/models/GsmCall.kt diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/DialerActivity.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/DialerActivity.kt index 226f4c96..f3fca781 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/DialerActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/DialerActivity.kt @@ -12,12 +12,12 @@ import android.net.Uri import android.os.Bundle import android.os.Handler import android.os.PowerManager +import android.telecom.Call import androidx.localbroadcastmanager.content.LocalBroadcastManager import com.simplemobiletools.commons.extensions.* import com.simplemobiletools.contacts.pro.R import com.simplemobiletools.contacts.pro.helpers.* import com.simplemobiletools.contacts.pro.models.Contact -import com.simplemobiletools.contacts.pro.models.GsmCall import com.simplemobiletools.contacts.pro.objects.CallManager import com.simplemobiletools.contacts.pro.services.DialerCallService import kotlinx.android.synthetic.main.activity_dialer.* @@ -51,7 +51,7 @@ class DialerActivity : SimpleActivity(), SensorEventListener { isIncomingCall = true number = intent.getStringExtra(CALLER_NUMBER) initViews() - updateUI(intent.getSerializableExtra(CALL_STATUS) as GsmCall.Status) + updateUI(intent.getIntExtra(CALL_STATUS, 0)) tryFillingOtherEndsName() startNotificationService() } else { @@ -79,7 +79,7 @@ class DialerActivity : SimpleActivity(), SensorEventListener { private val messageReceiver = object : BroadcastReceiver() { override fun onReceive(context: Context, intent: Intent) { if (intent.extras?.containsKey(CALL_STATUS) == true) { - updateUI(intent.getSerializableExtra(CALL_STATUS) as GsmCall.Status) + updateUI(intent.getIntExtra(CALL_STATUS, 0)) } } } @@ -134,10 +134,10 @@ class DialerActivity : SimpleActivity(), SensorEventListener { } } - private fun updateUI(status: GsmCall.Status) { + private fun updateUI(status: Int) { when (status) { - GsmCall.Status.ACTIVE -> statusActive() - GsmCall.Status.DISCONNECTED -> statusDisconnected() + Call.STATE_ACTIVE -> statusActive() + Call.STATE_DISCONNECTED -> statusDisconnected() } } diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/extensions/Int.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/extensions/Int.kt deleted file mode 100644 index a150ed86..00000000 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/extensions/Int.kt +++ /dev/null @@ -1,13 +0,0 @@ -package com.simplemobiletools.contacts.pro.extensions - -import android.telecom.Call -import com.simplemobiletools.contacts.pro.models.GsmCall - -fun Int.toGsmCallStatus() = when (this) { - Call.STATE_ACTIVE -> GsmCall.Status.ACTIVE - Call.STATE_RINGING -> GsmCall.Status.RINGING - Call.STATE_CONNECTING -> GsmCall.Status.CONNECTING - Call.STATE_DIALING -> GsmCall.Status.DIALING - Call.STATE_DISCONNECTED -> GsmCall.Status.DISCONNECTED - else -> GsmCall.Status.UNKNOWN -} diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/models/GsmCall.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/models/GsmCall.kt deleted file mode 100644 index db23b0e0..00000000 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/models/GsmCall.kt +++ /dev/null @@ -1,13 +0,0 @@ -package com.simplemobiletools.contacts.pro.models - -data class GsmCall(val status: GsmCall.Status) { - - enum class Status { - CONNECTING, - DIALING, - RINGING, - ACTIVE, - DISCONNECTED, - UNKNOWN - } -} diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/services/MyCallService.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/services/MyCallService.kt index 2c2da69a..71fa844d 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/services/MyCallService.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/services/MyCallService.kt @@ -7,7 +7,6 @@ import android.telecom.Call import android.telecom.InCallService import androidx.localbroadcastmanager.content.LocalBroadcastManager import com.simplemobiletools.contacts.pro.activities.DialerActivity -import com.simplemobiletools.contacts.pro.extensions.toGsmCallStatus import com.simplemobiletools.contacts.pro.helpers.CALLER_NUMBER import com.simplemobiletools.contacts.pro.helpers.CALL_STATUS import com.simplemobiletools.contacts.pro.helpers.DIALER_INTENT_FILTER @@ -30,7 +29,7 @@ class MyCallService : InCallService() { Intent(this, DialerActivity::class.java).apply { action = INCOMING_CALL - putExtra(CALL_STATUS, call.state.toGsmCallStatus()) + putExtra(CALL_STATUS, call.state) putExtra(CALLER_NUMBER, callerNumber) startActivity(this) } @@ -52,7 +51,7 @@ class MyCallService : InCallService() { private fun sendCallToActivity(call: Call) { Intent(DIALER_INTENT_FILTER).apply { - putExtra(CALL_STATUS, call.state.toGsmCallStatus()) + putExtra(CALL_STATUS, call.state) LocalBroadcastManager.getInstance(applicationContext).sendBroadcast(this) } } From a392759ae0ac80de0311df62bd9b18e64328dde4 Mon Sep 17 00:00:00 2001 From: tibbi Date: Wed, 21 Nov 2018 17:54:08 +0100 Subject: [PATCH 055/134] adding a few more call notification related improvements --- .../contacts/pro/activities/DialerActivity.kt | 34 ++++++++++++------- .../contacts/pro/helpers/Constants.kt | 3 +- .../pro/services/DialerCallService.kt | 31 +++++++++++++---- .../contacts/pro/services/MyCallService.kt | 4 +-- app/src/main/res/values-az/strings.xml | 2 ++ app/src/main/res/values-de/strings.xml | 2 ++ app/src/main/res/values-el/strings.xml | 2 ++ app/src/main/res/values-eu/strings.xml | 2 ++ app/src/main/res/values-fr/strings.xml | 2 ++ app/src/main/res/values-hr/strings.xml | 2 ++ app/src/main/res/values-it/strings.xml | 2 ++ app/src/main/res/values-ja/strings.xml | 2 ++ app/src/main/res/values-ko-rKR/strings.xml | 2 ++ app/src/main/res/values-lt/strings.xml | 2 ++ app/src/main/res/values-pt/strings.xml | 2 ++ app/src/main/res/values-ru/strings.xml | 2 ++ app/src/main/res/values-sk/strings.xml | 2 ++ app/src/main/res/values-sv/strings.xml | 2 ++ app/src/main/res/values-tr/strings.xml | 2 ++ app/src/main/res/values-zh-rTW/strings.xml | 2 ++ app/src/main/res/values/strings.xml | 2 ++ 21 files changed, 83 insertions(+), 23 deletions(-) diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/DialerActivity.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/DialerActivity.kt index f3fca781..c6d87d69 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/DialerActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/DialerActivity.kt @@ -27,7 +27,8 @@ class DialerActivity : SimpleActivity(), SensorEventListener { private val SENSOR_SENSITIVITY = 4 private val DISCONNECT_DELAY = 3000L - private var number = "" + private var callNumber = "" + private var callStatus = Call.STATE_NEW private var isIncomingCall = false private var isCallActive = false private var callDuration = 0 @@ -43,17 +44,15 @@ class DialerActivity : SimpleActivity(), SensorEventListener { LocalBroadcastManager.getInstance(applicationContext).registerReceiver(messageReceiver, IntentFilter(DIALER_INTENT_FILTER)) if (intent.action == Intent.ACTION_CALL && intent.data != null && intent.dataString?.contains("tel:") == true) { - number = Uri.decode(intent.dataString).substringAfter("tel:") + callNumber = Uri.decode(intent.dataString).substringAfter("tel:") initViews() tryFillingOtherEndsName() - startNotificationService() - } else if (intent.action == INCOMING_CALL && intent.extras?.containsKey(CALLER_NUMBER) == true && intent.extras?.containsKey(CALL_STATUS) == true) { + } else if (intent.action == INCOMING_CALL && intent.extras?.containsKey(CALL_NUMBER) == true && intent.extras?.containsKey(CALL_STATUS) == true) { isIncomingCall = true - number = intent.getStringExtra(CALLER_NUMBER) + callNumber = intent.getStringExtra(CALL_NUMBER) initViews() - updateUI(intent.getIntExtra(CALL_STATUS, 0)) + updateUI(intent.getIntExtra(CALL_STATUS, Call.STATE_NEW)) tryFillingOtherEndsName() - startNotificationService() } else { toast(R.string.unknown_error_occurred) finish() @@ -69,6 +68,9 @@ class DialerActivity : SimpleActivity(), SensorEventListener { override fun onPause() { super.onPause() sensorManager!!.unregisterListener(this) + if (!isCallActive && callStatus != Call.STATE_DISCONNECTED) { + startNotificationService() + } } override fun onDestroy() { @@ -79,7 +81,7 @@ class DialerActivity : SimpleActivity(), SensorEventListener { private val messageReceiver = object : BroadcastReceiver() { override fun onReceive(context: Context, intent: Intent) { if (intent.extras?.containsKey(CALL_STATUS) == true) { - updateUI(intent.getIntExtra(CALL_STATUS, 0)) + updateUI(intent.getIntExtra(CALL_STATUS, Call.STATE_NEW)) } } } @@ -109,7 +111,9 @@ class DialerActivity : SimpleActivity(), SensorEventListener { private fun startNotificationService() { Intent(this, DialerCallService::class.java).apply { - putExtra(CALLER_NUMBER, number) + putExtra(CALL_NUMBER, callNumber) + putExtra(CALL_STATUS, callStatus) + putExtra(IS_INCOMING_CALL, isIncomingCall) startService(this) } } @@ -121,13 +125,14 @@ class DialerActivity : SimpleActivity(), SensorEventListener { } private fun hangUp() { + callStatus = Call.STATE_DISCONNECTED stopNotificationService() CallManager.declineCall() finish() } private fun tryFillingOtherEndsName() { - ContactsHelper(this).getContactWithNumber(number) { + ContactsHelper(this).getContactWithNumber(callNumber) { runOnUiThread { updateOtherParticipant(it) } @@ -135,6 +140,7 @@ class DialerActivity : SimpleActivity(), SensorEventListener { } private fun updateUI(status: Int) { + callStatus = status when (status) { Call.STATE_ACTIVE -> statusActive() Call.STATE_DISCONNECTED -> statusDisconnected() @@ -142,11 +148,12 @@ class DialerActivity : SimpleActivity(), SensorEventListener { } private fun statusActive() { + startNotificationService() isCallActive = true dialer_call_duration.beVisible() updateCallDuration() - dialer_label.text = "" + dialer_label.setText(R.string.ongoing_call) dialer_hangup_button.beVisible() dialer_incoming_accept.beGone() dialer_incoming_decline.beGone() @@ -166,6 +173,7 @@ class DialerActivity : SimpleActivity(), SensorEventListener { stopNotificationService() timerHandler.removeCallbacksAndMessages(null) dialer_hangup_button.beGone() + dialer_label.setText(R.string.disconnected) if (isCallActive) { dialer_hangup_button.postDelayed({ finish() @@ -179,9 +187,9 @@ class DialerActivity : SimpleActivity(), SensorEventListener { private fun updateOtherParticipant(contact: Contact?) { if (contact != null) { dialer_big_name_number.text = contact.getNameToDisplay() - dialer_number.text = number + dialer_number.text = callNumber } else { - dialer_big_name_number.text = number + dialer_big_name_number.text = callNumber dialer_number.beGone() } } diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/helpers/Constants.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/helpers/Constants.kt index fbe43487..10ce4d3e 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/helpers/Constants.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/helpers/Constants.kt @@ -34,8 +34,9 @@ const val KEY_NAME = "name" // Dialer const val INCOMING_CALL = "incoming_call" -const val CALLER_NUMBER = "caller_number" +const val CALL_NUMBER = "call_number" const val CALL_STATUS = "call_status" +const val IS_INCOMING_CALL = "is_incoming_call" const val DIALER_INTENT_FILTER = "dialer_intent_filter" const val LOCATION_CONTACTS_TAB = 0 diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/services/DialerCallService.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/services/DialerCallService.kt index 1db8a797..d9ebd241 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/services/DialerCallService.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/services/DialerCallService.kt @@ -8,21 +8,29 @@ import android.app.Service import android.content.Context import android.content.Intent import android.os.Build +import android.telecom.Call import androidx.core.app.NotificationCompat import com.simplemobiletools.commons.helpers.isOreoPlus import com.simplemobiletools.contacts.pro.R import com.simplemobiletools.contacts.pro.activities.DialerActivity -import com.simplemobiletools.contacts.pro.helpers.CALLER_NUMBER +import com.simplemobiletools.contacts.pro.helpers.CALL_NUMBER +import com.simplemobiletools.contacts.pro.helpers.CALL_STATUS +import com.simplemobiletools.contacts.pro.helpers.IS_INCOMING_CALL class DialerCallService : Service() { private val CALL_NOTIFICATION_ID = 1 - private var number = "" + private var callNumber = "" + private var callStatus = Call.STATE_NEW + private var isIncomingCall = false override fun onBind(intent: Intent?) = null override fun onStartCommand(intent: Intent, flags: Int, startId: Int): Int { super.onStartCommand(intent, flags, startId) - number = intent.getStringExtra(CALLER_NUMBER) + callNumber = intent.getStringExtra(CALL_NUMBER) + callStatus = intent.getIntExtra(CALL_STATUS, Call.STATE_NEW) + isIncomingCall = intent.getBooleanExtra(IS_INCOMING_CALL, false) + setupNotification() return START_STICKY } @@ -38,7 +46,7 @@ class DialerCallService : Service() { if (isOreoPlus()) { val notificationManager = getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager val name = resources.getString(R.string.app_name) - val importance = NotificationManager.IMPORTANCE_HIGH + val importance = NotificationManager.IMPORTANCE_DEFAULT NotificationChannel(channelId, name, importance).apply { enableLights(false) enableVibration(false) @@ -47,14 +55,15 @@ class DialerCallService : Service() { } val notification = NotificationCompat.Builder(applicationContext, channelId) - .setSmallIcon(R.drawable.ic_person) - .setContentTitle(number) - .setContentText(getString(R.string.calling)) + .setSmallIcon(R.drawable.ic_phone) + .setContentTitle(callNumber) + .setContentText(getCallStatusString()) .setContentIntent(getLaunchDialerIntent()) .setVisibility(NotificationCompat.VISIBILITY_PUBLIC) .setPriority(NotificationCompat.PRIORITY_MAX) .setOngoing(true) .setChannelId(channelId) + .setUsesChronometer(callStatus == Call.STATE_ACTIVE) startForeground(CALL_NOTIFICATION_ID, notification.build()) } @@ -65,4 +74,12 @@ class DialerCallService : Service() { intent.addCategory(Intent.CATEGORY_LAUNCHER) return PendingIntent.getActivity(this, 0, intent, 0) } + + private fun getCallStatusString(): String { + return when (callStatus) { + Call.STATE_NEW -> applicationContext.getString(if (isIncomingCall) R.string.incoming_call else R.string.calling) + Call.STATE_ACTIVE -> applicationContext.getString(R.string.ongoing_call) + else -> "" + } + } } diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/services/MyCallService.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/services/MyCallService.kt index 71fa844d..dc94f9bc 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/services/MyCallService.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/services/MyCallService.kt @@ -7,7 +7,7 @@ import android.telecom.Call import android.telecom.InCallService import androidx.localbroadcastmanager.content.LocalBroadcastManager import com.simplemobiletools.contacts.pro.activities.DialerActivity -import com.simplemobiletools.contacts.pro.helpers.CALLER_NUMBER +import com.simplemobiletools.contacts.pro.helpers.CALL_NUMBER import com.simplemobiletools.contacts.pro.helpers.CALL_STATUS import com.simplemobiletools.contacts.pro.helpers.DIALER_INTENT_FILTER import com.simplemobiletools.contacts.pro.helpers.INCOMING_CALL @@ -30,7 +30,7 @@ class MyCallService : InCallService() { Intent(this, DialerActivity::class.java).apply { action = INCOMING_CALL putExtra(CALL_STATUS, call.state) - putExtra(CALLER_NUMBER, callerNumber) + putExtra(CALL_NUMBER, callerNumber) startActivity(this) } CallManager.updateCall(call) diff --git a/app/src/main/res/values-az/strings.xml b/app/src/main/res/values-az/strings.xml index 7958fd38..9b1557ed 100644 --- a/app/src/main/res/values-az/strings.xml +++ b/app/src/main/res/values-az/strings.xml @@ -113,6 +113,8 @@ Dialer Calling… Incoming call from… + Ongoing call + Disconnected Göstərmək üçün sahəni seç diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index 08869b0c..edd90782 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -113,6 +113,8 @@ Dialer Calling… Incoming call from… + Ongoing call + Disconnected Sichtbare Felder auswählen diff --git a/app/src/main/res/values-el/strings.xml b/app/src/main/res/values-el/strings.xml index d99f3629..24a7ff7e 100644 --- a/app/src/main/res/values-el/strings.xml +++ b/app/src/main/res/values-el/strings.xml @@ -113,6 +113,8 @@ Dialer Calling… Incoming call from… + Ongoing call + Disconnected Επιλογή εμφάνισης πεδίων diff --git a/app/src/main/res/values-eu/strings.xml b/app/src/main/res/values-eu/strings.xml index 49da5f48..37c847db 100644 --- a/app/src/main/res/values-eu/strings.xml +++ b/app/src/main/res/values-eu/strings.xml @@ -113,6 +113,8 @@ Dialer Calling… Incoming call from… + Ongoing call + Disconnected Hautatu erakusteko eremuak diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml index dbdee9fe..916bcfd2 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -113,6 +113,8 @@ Dialer Calling… Incoming call from… + Ongoing call + Disconnected Sélectionner les champs à afficher diff --git a/app/src/main/res/values-hr/strings.xml b/app/src/main/res/values-hr/strings.xml index 96a71cdf..e3a68ed6 100644 --- a/app/src/main/res/values-hr/strings.xml +++ b/app/src/main/res/values-hr/strings.xml @@ -113,6 +113,8 @@ Dialer Calling… Incoming call from… + Ongoing call + Disconnected Odaberi polja za prikaz diff --git a/app/src/main/res/values-it/strings.xml b/app/src/main/res/values-it/strings.xml index 98ee80f9..f5538f56 100644 --- a/app/src/main/res/values-it/strings.xml +++ b/app/src/main/res/values-it/strings.xml @@ -113,6 +113,8 @@ Compositore Chiamata in corso… Incoming call from… + Ongoing call + Disconnected Seleziona i campi da mostrare diff --git a/app/src/main/res/values-ja/strings.xml b/app/src/main/res/values-ja/strings.xml index 9a321697..f744c070 100644 --- a/app/src/main/res/values-ja/strings.xml +++ b/app/src/main/res/values-ja/strings.xml @@ -113,6 +113,8 @@ Dialer Calling… Incoming call from… + Ongoing call + Disconnected 表示する項目を選択 diff --git a/app/src/main/res/values-ko-rKR/strings.xml b/app/src/main/res/values-ko-rKR/strings.xml index c34cba44..4b92dc52 100644 --- a/app/src/main/res/values-ko-rKR/strings.xml +++ b/app/src/main/res/values-ko-rKR/strings.xml @@ -113,6 +113,8 @@ Dialer Calling… Incoming call from… + Ongoing call + Disconnected Select fields to show diff --git a/app/src/main/res/values-lt/strings.xml b/app/src/main/res/values-lt/strings.xml index 907d262e..ffa82445 100644 --- a/app/src/main/res/values-lt/strings.xml +++ b/app/src/main/res/values-lt/strings.xml @@ -113,6 +113,8 @@ Dialer Calling… Incoming call from… + Ongoing call + Disconnected Pasirinkti rodomus laukelius diff --git a/app/src/main/res/values-pt/strings.xml b/app/src/main/res/values-pt/strings.xml index c01cfded..6955b055 100644 --- a/app/src/main/res/values-pt/strings.xml +++ b/app/src/main/res/values-pt/strings.xml @@ -113,6 +113,8 @@ Dialer Calling… Incoming call from… + Ongoing call + Disconnected Selecione os campos a mostrar diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index b673b8a9..58ed2acb 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -113,6 +113,8 @@ Dialer Calling… Incoming call from… + Ongoing call + Disconnected Выберите отображаемые поля diff --git a/app/src/main/res/values-sk/strings.xml b/app/src/main/res/values-sk/strings.xml index bc15ab4a..3b5d5d52 100644 --- a/app/src/main/res/values-sk/strings.xml +++ b/app/src/main/res/values-sk/strings.xml @@ -113,6 +113,8 @@ Telefón Vytáča sa… Prichádzajúci hovor od… + Prebiehajúci hovor + Ukončený hovor Zvoľte polia na zobrazenie diff --git a/app/src/main/res/values-sv/strings.xml b/app/src/main/res/values-sv/strings.xml index 6851d4f6..584a565c 100644 --- a/app/src/main/res/values-sv/strings.xml +++ b/app/src/main/res/values-sv/strings.xml @@ -113,6 +113,8 @@ Dialer Calling… Incoming call from… + Ongoing call + Disconnected Välj vilka fält som ska visas diff --git a/app/src/main/res/values-tr/strings.xml b/app/src/main/res/values-tr/strings.xml index 32ca04e4..f592c335 100644 --- a/app/src/main/res/values-tr/strings.xml +++ b/app/src/main/res/values-tr/strings.xml @@ -113,6 +113,8 @@ Dialer Calling… Incoming call from… + Ongoing call + Disconnected Görüntülenecek alanları seç diff --git a/app/src/main/res/values-zh-rTW/strings.xml b/app/src/main/res/values-zh-rTW/strings.xml index 08af0c67..aef6a641 100644 --- a/app/src/main/res/values-zh-rTW/strings.xml +++ b/app/src/main/res/values-zh-rTW/strings.xml @@ -113,6 +113,8 @@ Dialer Calling… Incoming call from… + Ongoing call + Disconnected 選擇要顯示的欄位 diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index fa3ff8e6..0782d38f 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -113,6 +113,8 @@ Dialer Calling… Incoming call from… + Ongoing call + Disconnected Select fields to show From fd228b85a62ab2eca7806cd935a3118cd25569b1 Mon Sep 17 00:00:00 2001 From: tibbi Date: Wed, 21 Nov 2018 18:26:40 +0100 Subject: [PATCH 056/134] reducing the ongoing call notification importance to avoid playing the audio --- .../contacts/pro/services/DialerCallService.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/services/DialerCallService.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/services/DialerCallService.kt index d9ebd241..ba074a8e 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/services/DialerCallService.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/services/DialerCallService.kt @@ -46,7 +46,7 @@ class DialerCallService : Service() { if (isOreoPlus()) { val notificationManager = getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager val name = resources.getString(R.string.app_name) - val importance = NotificationManager.IMPORTANCE_DEFAULT + val importance = NotificationManager.IMPORTANCE_LOW NotificationChannel(channelId, name, importance).apply { enableLights(false) enableVibration(false) From 69e3a55a182908bbfee7042eb33140c3de9a4ddb Mon Sep 17 00:00:00 2001 From: tibbi Date: Wed, 21 Nov 2018 18:44:40 +0100 Subject: [PATCH 057/134] improving the Dialer screen resuming at pressing the notification --- app/src/main/AndroidManifest.xml | 3 ++- .../contacts/pro/activities/DialerActivity.kt | 13 +++++++++++-- .../contacts/pro/helpers/Constants.kt | 1 + .../contacts/pro/services/DialerCallService.kt | 10 +++++++--- 4 files changed, 21 insertions(+), 6 deletions(-) diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 86d2f354..dd31393e 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -223,7 +223,8 @@ + android:label="@string/dialer" + android:launchMode="singleTask"> diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/DialerActivity.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/DialerActivity.kt index c6d87d69..58be6f6a 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/DialerActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/DialerActivity.kt @@ -43,16 +43,25 @@ class DialerActivity : SimpleActivity(), SensorEventListener { initProximityWakeLock() LocalBroadcastManager.getInstance(applicationContext).registerReceiver(messageReceiver, IntentFilter(DIALER_INTENT_FILTER)) - if (intent.action == Intent.ACTION_CALL && intent.data != null && intent.dataString?.contains("tel:") == true) { + val action = intent.action + val extras = intent.extras + if (action == Intent.ACTION_CALL && intent.data != null && intent.dataString?.contains("tel:") == true) { callNumber = Uri.decode(intent.dataString).substringAfter("tel:") initViews() tryFillingOtherEndsName() - } else if (intent.action == INCOMING_CALL && intent.extras?.containsKey(CALL_NUMBER) == true && intent.extras?.containsKey(CALL_STATUS) == true) { + } else if (action == INCOMING_CALL && extras?.containsKey(CALL_NUMBER) == true && extras.containsKey(CALL_STATUS)) { isIncomingCall = true callNumber = intent.getStringExtra(CALL_NUMBER) initViews() updateUI(intent.getIntExtra(CALL_STATUS, Call.STATE_NEW)) tryFillingOtherEndsName() + } else if (action == RESUME_DIALER && extras?.containsKey(CALL_NUMBER) == true && extras.containsKey(CALL_STATUS) && extras.containsKey(IS_INCOMING_CALL)) { + callNumber = intent.getStringExtra(CALL_NUMBER) + callStatus = intent.getIntExtra(CALL_STATUS, Call.STATE_NEW) + isIncomingCall = intent.getBooleanExtra(IS_INCOMING_CALL, false) + initViews() + updateUI(callStatus) + tryFillingOtherEndsName() } else { toast(R.string.unknown_error_occurred) finish() diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/helpers/Constants.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/helpers/Constants.kt index 10ce4d3e..dabcc7ed 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/helpers/Constants.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/helpers/Constants.kt @@ -34,6 +34,7 @@ const val KEY_NAME = "name" // Dialer const val INCOMING_CALL = "incoming_call" +const val RESUME_DIALER = "resume_dialer" const val CALL_NUMBER = "call_number" const val CALL_STATUS = "call_status" const val IS_INCOMING_CALL = "is_incoming_call" diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/services/DialerCallService.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/services/DialerCallService.kt index ba074a8e..066aa75b 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/services/DialerCallService.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/services/DialerCallService.kt @@ -16,6 +16,7 @@ import com.simplemobiletools.contacts.pro.activities.DialerActivity import com.simplemobiletools.contacts.pro.helpers.CALL_NUMBER import com.simplemobiletools.contacts.pro.helpers.CALL_STATUS import com.simplemobiletools.contacts.pro.helpers.IS_INCOMING_CALL +import com.simplemobiletools.contacts.pro.helpers.RESUME_DIALER class DialerCallService : Service() { private val CALL_NOTIFICATION_ID = 1 @@ -69,9 +70,12 @@ class DialerCallService : Service() { } private fun getLaunchDialerIntent(): PendingIntent { - val intent = Intent(this, DialerActivity::class.java) - intent.action = Intent.ACTION_MAIN - intent.addCategory(Intent.CATEGORY_LAUNCHER) + val intent = Intent(this, DialerActivity::class.java).apply { + action = RESUME_DIALER + putExtra(CALL_NUMBER, callNumber) + putExtra(CALL_STATUS, callStatus) + putExtra(IS_INCOMING_CALL, isIncomingCall) + } return PendingIntent.getActivity(this, 0, intent, 0) } From 6cc0c6ea151d64ad3a0680f1d735619ecea469b9 Mon Sep 17 00:00:00 2001 From: tibbi Date: Wed, 21 Nov 2018 18:47:20 +0100 Subject: [PATCH 058/134] improve the way contacts are searched by phone numbers --- .../simplemobiletools/contacts/pro/helpers/ContactsHelper.kt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/helpers/ContactsHelper.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/helpers/ContactsHelper.kt index d84acd23..1ab00f31 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/helpers/ContactsHelper.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/helpers/ContactsHelper.kt @@ -96,8 +96,8 @@ class ContactsHelper(val activity: Activity) { Thread { val uri = CommonDataKinds.Phone.CONTENT_URI val projection = arrayOf(ContactsContract.Data.RAW_CONTACT_ID) - val selection = "${CommonDataKinds.Phone.NORMALIZED_NUMBER} = ?" - val selectionArgs = arrayOf(number.normalizeNumber()) + val selection = "${CommonDataKinds.Phone.NUMBER} = ? OR ${CommonDataKinds.Phone.NORMALIZED_NUMBER} = ?" + val selectionArgs = arrayOf(number, number.normalizeNumber()) var cursor: Cursor? = null try { From 52c569f58bd1f3f655778c7e231a556005b9d0d3 Mon Sep 17 00:00:00 2001 From: tibbi Date: Wed, 21 Nov 2018 18:53:54 +0100 Subject: [PATCH 059/134] update the current pending intent at pressing the notification --- .../contacts/pro/services/DialerCallService.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/services/DialerCallService.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/services/DialerCallService.kt index 066aa75b..fcd7ef0d 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/services/DialerCallService.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/services/DialerCallService.kt @@ -76,7 +76,7 @@ class DialerCallService : Service() { putExtra(CALL_STATUS, callStatus) putExtra(IS_INCOMING_CALL, isIncomingCall) } - return PendingIntent.getActivity(this, 0, intent, 0) + return PendingIntent.getActivity(this, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT) } private fun getCallStatusString(): String { From 8be55a4be1390a6866fa8a15274c07f062f07e91 Mon Sep 17 00:00:00 2001 From: tibbi Date: Wed, 21 Nov 2018 19:06:34 +0100 Subject: [PATCH 060/134] if the user presses Back at the dialer without an established call, hang it up --- .../contacts/pro/activities/DialerActivity.kt | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/DialerActivity.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/DialerActivity.kt index 58be6f6a..f2117be6 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/DialerActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/DialerActivity.kt @@ -95,6 +95,13 @@ class DialerActivity : SimpleActivity(), SensorEventListener { } } + override fun onBackPressed() { + super.onBackPressed() + if (!isCallActive) { + hangUp() + } + } + private fun initProximityWakeLock() { sensorManager = getSystemService(Context.SENSOR_SERVICE) as SensorManager proximity = sensorManager!!.getDefaultSensor(Sensor.TYPE_PROXIMITY) From 758799b87c84f1fb6a46b3601203a33df87e2a4b Mon Sep 17 00:00:00 2001 From: tibbi Date: Wed, 21 Nov 2018 19:54:25 +0100 Subject: [PATCH 061/134] hang up on Back press only at outgoing calls --- .../simplemobiletools/contacts/pro/activities/DialerActivity.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/DialerActivity.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/DialerActivity.kt index f2117be6..a4159f9b 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/DialerActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/DialerActivity.kt @@ -97,7 +97,7 @@ class DialerActivity : SimpleActivity(), SensorEventListener { override fun onBackPressed() { super.onBackPressed() - if (!isCallActive) { + if (!isCallActive && !isIncomingCall) { hangUp() } } From 8ecfae906e9ee0170a239aa0ee24fa88e6be6d1a Mon Sep 17 00:00:00 2001 From: tibbi Date: Wed, 21 Nov 2018 19:58:00 +0100 Subject: [PATCH 062/134] adding some initial outgoing call related things --- app/src/main/AndroidManifest.xml | 12 +++++++++++- .../contacts/pro/activities/DialerActivity.kt | 11 +++++++++++ .../{MyCallService.kt => MyIncomingCallService.kt} | 2 +- .../contacts/pro/services/MyOutgoingCallService.kt | 10 ++++++++++ 4 files changed, 33 insertions(+), 2 deletions(-) rename app/src/main/kotlin/com/simplemobiletools/contacts/pro/services/{MyCallService.kt => MyIncomingCallService.kt} (97%) create mode 100644 app/src/main/kotlin/com/simplemobiletools/contacts/pro/services/MyOutgoingCallService.kt diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index dd31393e..565198d5 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -245,7 +245,7 @@ + + + + + + + diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/DialerActivity.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/DialerActivity.kt index a4159f9b..4133c8c7 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/DialerActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/DialerActivity.kt @@ -1,5 +1,6 @@ package com.simplemobiletools.contacts.pro.activities +import android.annotation.SuppressLint import android.content.BroadcastReceiver import android.content.Context import android.content.Intent @@ -13,6 +14,7 @@ import android.os.Bundle import android.os.Handler import android.os.PowerManager import android.telecom.Call +import android.telecom.TelecomManager import androidx.localbroadcastmanager.content.LocalBroadcastManager import com.simplemobiletools.commons.extensions.* import com.simplemobiletools.contacts.pro.R @@ -49,6 +51,7 @@ class DialerActivity : SimpleActivity(), SensorEventListener { callNumber = Uri.decode(intent.dataString).substringAfter("tel:") initViews() tryFillingOtherEndsName() + initOutgoingCall() } else if (action == INCOMING_CALL && extras?.containsKey(CALL_NUMBER) == true && extras.containsKey(CALL_STATUS)) { isIncomingCall = true callNumber = intent.getStringExtra(CALL_NUMBER) @@ -125,6 +128,13 @@ class DialerActivity : SimpleActivity(), SensorEventListener { dialer_label.setText(if (isIncomingCall) R.string.incoming_call else R.string.calling) } + private fun initOutgoingCall() { + val telecomManager = getSystemService(Context.TELECOM_SERVICE) as TelecomManager + val uri = Uri.fromParts("tel:", callNumber, null) + val extras = Bundle() + telecomManager.placeCall(uri, extras) + } + private fun startNotificationService() { Intent(this, DialerCallService::class.java).apply { putExtra(CALL_NUMBER, callNumber) @@ -222,6 +232,7 @@ class DialerActivity : SimpleActivity(), SensorEventListener { } } + @SuppressLint("WakelockTimeout") private fun turnOffScreen() { if (proximityWakeLock?.isHeld == false) { proximityWakeLock!!.acquire() diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/services/MyCallService.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/services/MyIncomingCallService.kt similarity index 97% rename from app/src/main/kotlin/com/simplemobiletools/contacts/pro/services/MyCallService.kt rename to app/src/main/kotlin/com/simplemobiletools/contacts/pro/services/MyIncomingCallService.kt index dc94f9bc..43fc6a3b 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/services/MyCallService.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/services/MyIncomingCallService.kt @@ -14,7 +14,7 @@ import com.simplemobiletools.contacts.pro.helpers.INCOMING_CALL import com.simplemobiletools.contacts.pro.objects.CallManager @TargetApi(Build.VERSION_CODES.M) -class MyCallService : InCallService() { +class MyIncomingCallService : InCallService() { override fun onCallAdded(call: Call) { super.onCallAdded(call) diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/services/MyOutgoingCallService.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/services/MyOutgoingCallService.kt new file mode 100644 index 00000000..ffa42441 --- /dev/null +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/services/MyOutgoingCallService.kt @@ -0,0 +1,10 @@ +package com.simplemobiletools.contacts.pro.services + +import android.annotation.TargetApi +import android.os.Build +import android.telecom.ConnectionService + +@TargetApi(Build.VERSION_CODES.M) +class MyOutgoingCallService : ConnectionService() { + +} From 405b052ac9038a448dc709cfb67e03fb8f0174b3 Mon Sep 17 00:00:00 2001 From: ScratchBuild Date: Thu, 22 Nov 2018 17:32:37 +0900 Subject: [PATCH 063/134] Update Japanese translation --- app/src/main/res/values-ja/strings.xml | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/app/src/main/res/values-ja/strings.xml b/app/src/main/res/values-ja/strings.xml index f744c070..fca8d1a0 100644 --- a/app/src/main/res/values-ja/strings.xml +++ b/app/src/main/res/values-ja/strings.xml @@ -22,7 +22,7 @@ 連絡先が見つかりません メールアドレスが登録された連絡先が見つかりません 電話番号が登録された連絡先が見つかりません - No recent calls found + 通話履歴はありません 新しい連絡先 連絡先を編集 @@ -53,7 +53,7 @@ 姓を先に表示 メイン画面に電話番号を表示 連絡先のサムネイルを表示 - Show a dialpad button on the main screen + メイン画面にダイヤルパッドを表示 連絡先をタップ 連絡先に発信 連絡先の詳細を表示 @@ -62,7 +62,7 @@ 表示するタブを管理 連絡先 お気に入り - Recent calls + 通話履歴 発信する前に確認ダイアログを表示する 電話番号が登録された連絡先のみ表示する @@ -110,11 +110,11 @@ 連絡先に番号を追加 - Dialer - Calling… - Incoming call from… - Ongoing call - Disconnected + 電話 + 発信中… + 着信中… + 通話中 + 切断されました 表示する項目を選択 From 58798e20cab6a0c786d2a770426bc20b18469c7f Mon Sep 17 00:00:00 2001 From: Emanuele Petriglia Date: Thu, 22 Nov 2018 14:42:34 +0000 Subject: [PATCH 064/134] Update italian translation --- app/src/main/res/values-it/strings.xml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/app/src/main/res/values-it/strings.xml b/app/src/main/res/values-it/strings.xml index f5538f56..9a329387 100644 --- a/app/src/main/res/values-it/strings.xml +++ b/app/src/main/res/values-it/strings.xml @@ -112,9 +112,9 @@ Compositore Chiamata in corso… - Incoming call from… - Ongoing call - Disconnected + Chiamata in arrivo da… + Chiamata in corso + Disconnesso Seleziona i campi da mostrare From 0ec5b4b58b6d1e739c71f19fe1b0f3a2ca19a3a3 Mon Sep 17 00:00:00 2001 From: tibbi Date: Thu, 22 Nov 2018 23:18:36 +0100 Subject: [PATCH 065/134] show a heads up notification at incoming call, not the fullscreen dialer --- app/src/main/AndroidManifest.xml | 16 +++++++-- .../contacts/pro/helpers/MyConnection.kt | 33 +++++++++++++++++++ .../pro/services/DialerCallService.kt | 2 +- .../pro/services/MyIncomingCallService.kt | 15 ++++++--- .../pro/services/MyOutgoingCallService.kt | 12 +++++-- 5 files changed, 68 insertions(+), 10 deletions(-) create mode 100644 app/src/main/kotlin/com/simplemobiletools/contacts/pro/helpers/MyConnection.kt diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 565198d5..ce1530a6 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -18,6 +18,7 @@ + + + + + + @@ -260,9 +273,8 @@ android:name=".services.MyOutgoingCallService" android:exported="true" android:permission="android.permission.BIND_TELECOM_CONNECTION_SERVICE"> - - + diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/helpers/MyConnection.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/helpers/MyConnection.kt new file mode 100644 index 00000000..0c584146 --- /dev/null +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/helpers/MyConnection.kt @@ -0,0 +1,33 @@ +package com.simplemobiletools.contacts.pro.helpers + +import android.annotation.TargetApi +import android.content.Context +import android.os.Build +import android.telecom.Connection +import android.telecom.DisconnectCause + +@TargetApi(Build.VERSION_CODES.M) +class MyConnection(val context: Context) : Connection() { + override fun onAnswer() { + super.onAnswer() + setActive() + } + + override fun onReject() { + super.onReject() + setDisconnected(DisconnectCause(DisconnectCause.LOCAL)) + destroy() + } + + override fun onAbort() { + super.onAbort() + setDisconnected(DisconnectCause(DisconnectCause.REMOTE)) + destroy() + } + + override fun onDisconnect() { + super.onDisconnect() + setDisconnected(DisconnectCause(DisconnectCause.CANCELED)) + destroy() + } +} diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/services/DialerCallService.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/services/DialerCallService.kt index fcd7ef0d..c0324594 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/services/DialerCallService.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/services/DialerCallService.kt @@ -47,7 +47,7 @@ class DialerCallService : Service() { if (isOreoPlus()) { val notificationManager = getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager val name = resources.getString(R.string.app_name) - val importance = NotificationManager.IMPORTANCE_LOW + val importance = NotificationManager.IMPORTANCE_HIGH NotificationChannel(channelId, name, importance).apply { enableLights(false) enableVibration(false) diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/services/MyIncomingCallService.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/services/MyIncomingCallService.kt index 43fc6a3b..0c6f6bd8 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/services/MyIncomingCallService.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/services/MyIncomingCallService.kt @@ -6,11 +6,10 @@ import android.os.Build import android.telecom.Call import android.telecom.InCallService import androidx.localbroadcastmanager.content.LocalBroadcastManager -import com.simplemobiletools.contacts.pro.activities.DialerActivity import com.simplemobiletools.contacts.pro.helpers.CALL_NUMBER import com.simplemobiletools.contacts.pro.helpers.CALL_STATUS import com.simplemobiletools.contacts.pro.helpers.DIALER_INTENT_FILTER -import com.simplemobiletools.contacts.pro.helpers.INCOMING_CALL +import com.simplemobiletools.contacts.pro.helpers.IS_INCOMING_CALL import com.simplemobiletools.contacts.pro.objects.CallManager @TargetApi(Build.VERSION_CODES.M) @@ -27,12 +26,13 @@ class MyIncomingCallService : InCallService() { handle } - Intent(this, DialerActivity::class.java).apply { - action = INCOMING_CALL + Intent(this, DialerCallService::class.java).apply { putExtra(CALL_STATUS, call.state) putExtra(CALL_NUMBER, callerNumber) - startActivity(this) + putExtra(IS_INCOMING_CALL, true) + startService(this) } + CallManager.updateCall(call) } @@ -46,6 +46,11 @@ class MyIncomingCallService : InCallService() { override fun onStateChanged(call: Call, state: Int) { CallManager.updateCall(call) sendCallToActivity(call) + if (state == Call.STATE_DISCONNECTED) { + Intent(applicationContext, DialerCallService::class.java).apply { + stopService(this) + } + } } } diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/services/MyOutgoingCallService.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/services/MyOutgoingCallService.kt index ffa42441..9e8427fa 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/services/MyOutgoingCallService.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/services/MyOutgoingCallService.kt @@ -1,10 +1,18 @@ package com.simplemobiletools.contacts.pro.services import android.annotation.TargetApi +import android.net.Uri import android.os.Build -import android.telecom.ConnectionService +import android.telecom.* +import com.simplemobiletools.contacts.pro.helpers.MyConnection @TargetApi(Build.VERSION_CODES.M) class MyOutgoingCallService : ConnectionService() { - + override fun onCreateIncomingConnection(connectionManagerPhoneAccount: PhoneAccountHandle, request: ConnectionRequest): Connection { + val connection = MyConnection(applicationContext) + val phoneNumber = request.extras.get(TelecomManager.EXTRA_INCOMING_CALL_ADDRESS) as Uri + connection.setAddress(phoneNumber, TelecomManager.PRESENTATION_ALLOWED) + connection.setRinging() + return connection + } } From 007cc40ac6135eeae46b7e20c1c44308c5815de2 Mon Sep 17 00:00:00 2001 From: tibbi Date: Thu, 22 Nov 2018 23:41:30 +0100 Subject: [PATCH 066/134] tweak the text on the dialer notification --- .../contacts/pro/services/DialerCallService.kt | 11 +++++++---- app/src/main/res/values-az/strings.xml | 3 ++- app/src/main/res/values-de/strings.xml | 3 ++- app/src/main/res/values-el/strings.xml | 3 ++- app/src/main/res/values-eu/strings.xml | 3 ++- app/src/main/res/values-fr/strings.xml | 3 ++- app/src/main/res/values-hr/strings.xml | 3 ++- app/src/main/res/values-it/strings.xml | 3 ++- app/src/main/res/values-ja/strings.xml | 3 ++- app/src/main/res/values-ko-rKR/strings.xml | 3 ++- app/src/main/res/values-lt/strings.xml | 3 ++- app/src/main/res/values-pt/strings.xml | 3 ++- app/src/main/res/values-ru/strings.xml | 3 ++- app/src/main/res/values-sk/strings.xml | 3 ++- app/src/main/res/values-sv/strings.xml | 3 ++- app/src/main/res/values-tr/strings.xml | 3 ++- app/src/main/res/values-zh-rTW/strings.xml | 3 ++- app/src/main/res/values/strings.xml | 3 ++- 18 files changed, 41 insertions(+), 21 deletions(-) diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/services/DialerCallService.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/services/DialerCallService.kt index c0324594..d7a7db23 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/services/DialerCallService.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/services/DialerCallService.kt @@ -80,10 +80,13 @@ class DialerCallService : Service() { } private fun getCallStatusString(): String { - return when (callStatus) { - Call.STATE_NEW -> applicationContext.getString(if (isIncomingCall) R.string.incoming_call else R.string.calling) - Call.STATE_ACTIVE -> applicationContext.getString(R.string.ongoing_call) - else -> "" + val id = when (callStatus) { + Call.STATE_DIALING -> R.string.calling + Call.STATE_RINGING -> R.string.incoming_call + Call.STATE_ACTIVE -> R.string.ongoing_call + else -> if (isIncomingCall) R.string.incoming_call else R.string.calling } + + return applicationContext.getString(id) } } diff --git a/app/src/main/res/values-az/strings.xml b/app/src/main/res/values-az/strings.xml index 9b1557ed..092598a7 100644 --- a/app/src/main/res/values-az/strings.xml +++ b/app/src/main/res/values-az/strings.xml @@ -112,7 +112,8 @@ Dialer Calling… - Incoming call from… + Incoming call + Incoming call from… Ongoing call Disconnected diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index edd90782..609ac314 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -112,7 +112,8 @@ Dialer Calling… - Incoming call from… + Incoming call + Incoming call from… Ongoing call Disconnected diff --git a/app/src/main/res/values-el/strings.xml b/app/src/main/res/values-el/strings.xml index 24a7ff7e..0fa31b59 100644 --- a/app/src/main/res/values-el/strings.xml +++ b/app/src/main/res/values-el/strings.xml @@ -112,7 +112,8 @@ Dialer Calling… - Incoming call from… + Incoming call + Incoming call from… Ongoing call Disconnected diff --git a/app/src/main/res/values-eu/strings.xml b/app/src/main/res/values-eu/strings.xml index 37c847db..2d8fe559 100644 --- a/app/src/main/res/values-eu/strings.xml +++ b/app/src/main/res/values-eu/strings.xml @@ -112,7 +112,8 @@ Dialer Calling… - Incoming call from… + Incoming call + Incoming call from… Ongoing call Disconnected diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml index 916bcfd2..e73cf146 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -112,7 +112,8 @@ Dialer Calling… - Incoming call from… + Incoming call + Incoming call from… Ongoing call Disconnected diff --git a/app/src/main/res/values-hr/strings.xml b/app/src/main/res/values-hr/strings.xml index e3a68ed6..33793d0f 100644 --- a/app/src/main/res/values-hr/strings.xml +++ b/app/src/main/res/values-hr/strings.xml @@ -112,7 +112,8 @@ Dialer Calling… - Incoming call from… + Incoming call + Incoming call from… Ongoing call Disconnected diff --git a/app/src/main/res/values-it/strings.xml b/app/src/main/res/values-it/strings.xml index 9a329387..72fe3b8e 100644 --- a/app/src/main/res/values-it/strings.xml +++ b/app/src/main/res/values-it/strings.xml @@ -112,7 +112,8 @@ Compositore Chiamata in corso… - Chiamata in arrivo da… + Incoming call + Chiamata in arrivo da… Chiamata in corso Disconnesso diff --git a/app/src/main/res/values-ja/strings.xml b/app/src/main/res/values-ja/strings.xml index fca8d1a0..569feadc 100644 --- a/app/src/main/res/values-ja/strings.xml +++ b/app/src/main/res/values-ja/strings.xml @@ -112,7 +112,8 @@ 電話 発信中… - 着信中… + Incoming call + 着信中… 通話中 切断されました diff --git a/app/src/main/res/values-ko-rKR/strings.xml b/app/src/main/res/values-ko-rKR/strings.xml index 4b92dc52..b3358004 100644 --- a/app/src/main/res/values-ko-rKR/strings.xml +++ b/app/src/main/res/values-ko-rKR/strings.xml @@ -112,7 +112,8 @@ Dialer Calling… - Incoming call from… + Incoming call + Incoming call from… Ongoing call Disconnected diff --git a/app/src/main/res/values-lt/strings.xml b/app/src/main/res/values-lt/strings.xml index ffa82445..4e0bf374 100644 --- a/app/src/main/res/values-lt/strings.xml +++ b/app/src/main/res/values-lt/strings.xml @@ -112,7 +112,8 @@ Dialer Calling… - Incoming call from… + Incoming call + Incoming call from… Ongoing call Disconnected diff --git a/app/src/main/res/values-pt/strings.xml b/app/src/main/res/values-pt/strings.xml index 6955b055..8ab1755d 100644 --- a/app/src/main/res/values-pt/strings.xml +++ b/app/src/main/res/values-pt/strings.xml @@ -112,7 +112,8 @@ Dialer Calling… - Incoming call from… + Incoming call + Incoming call from… Ongoing call Disconnected diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index 58ed2acb..03858e08 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -112,7 +112,8 @@ Dialer Calling… - Incoming call from… + Incoming call + Incoming call from… Ongoing call Disconnected diff --git a/app/src/main/res/values-sk/strings.xml b/app/src/main/res/values-sk/strings.xml index 3b5d5d52..573b5fce 100644 --- a/app/src/main/res/values-sk/strings.xml +++ b/app/src/main/res/values-sk/strings.xml @@ -112,7 +112,8 @@ Telefón Vytáča sa… - Prichádzajúci hovor od… + Prichádzajúci hovor + Prichádzajúci hovor od… Prebiehajúci hovor Ukončený hovor diff --git a/app/src/main/res/values-sv/strings.xml b/app/src/main/res/values-sv/strings.xml index 584a565c..c3812c87 100644 --- a/app/src/main/res/values-sv/strings.xml +++ b/app/src/main/res/values-sv/strings.xml @@ -112,7 +112,8 @@ Dialer Calling… - Incoming call from… + Incoming call + Incoming call from… Ongoing call Disconnected diff --git a/app/src/main/res/values-tr/strings.xml b/app/src/main/res/values-tr/strings.xml index f592c335..98b4545c 100644 --- a/app/src/main/res/values-tr/strings.xml +++ b/app/src/main/res/values-tr/strings.xml @@ -112,7 +112,8 @@ Dialer Calling… - Incoming call from… + Incoming call + Incoming call from… Ongoing call Disconnected diff --git a/app/src/main/res/values-zh-rTW/strings.xml b/app/src/main/res/values-zh-rTW/strings.xml index aef6a641..b82025d5 100644 --- a/app/src/main/res/values-zh-rTW/strings.xml +++ b/app/src/main/res/values-zh-rTW/strings.xml @@ -112,7 +112,8 @@ Dialer Calling… - Incoming call from… + Incoming call + Incoming call from… Ongoing call Disconnected diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 0782d38f..688609fb 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -112,7 +112,8 @@ Dialer Calling… - Incoming call from… + Incoming call + Incoming call from… Ongoing call Disconnected From c09a9bb818251721b79465855a15ffaa9cc3ed65 Mon Sep 17 00:00:00 2001 From: tibbi Date: Thu, 22 Nov 2018 23:42:39 +0100 Subject: [PATCH 067/134] removing the currently not needed PhoneStateListener --- .../pro/helpers/MyPhoneStateListener.kt | 18 ------------------ 1 file changed, 18 deletions(-) delete mode 100644 app/src/main/kotlin/com/simplemobiletools/contacts/pro/helpers/MyPhoneStateListener.kt diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/helpers/MyPhoneStateListener.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/helpers/MyPhoneStateListener.kt deleted file mode 100644 index cd8bbb1d..00000000 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/helpers/MyPhoneStateListener.kt +++ /dev/null @@ -1,18 +0,0 @@ -package com.simplemobiletools.contacts.pro.helpers - -import android.telephony.PhoneStateListener -import android.telephony.TelephonyManager - -class MyPhoneStateListener : PhoneStateListener() { - override fun onCallStateChanged(state: Int, phoneNumber: String?) { - super.onCallStateChanged(state, phoneNumber) - when (state) { - TelephonyManager.CALL_STATE_IDLE -> { - } - TelephonyManager.CALL_STATE_RINGING -> { - } - TelephonyManager.CALL_STATE_OFFHOOK -> { - } - } - } -} From 8a29a5911328de24a8883aeb1366796195abb106 Mon Sep 17 00:00:00 2001 From: tibbi Date: Fri, 23 Nov 2018 10:43:50 +0100 Subject: [PATCH 068/134] adding some new strings for declining/answering incoming calls --- app/src/main/res/values-az/strings.xml | 2 ++ app/src/main/res/values-de/strings.xml | 2 ++ app/src/main/res/values-el/strings.xml | 2 ++ app/src/main/res/values-eu/strings.xml | 2 ++ app/src/main/res/values-fr/strings.xml | 2 ++ app/src/main/res/values-hr/strings.xml | 2 ++ app/src/main/res/values-it/strings.xml | 2 ++ app/src/main/res/values-ja/strings.xml | 2 ++ app/src/main/res/values-ko-rKR/strings.xml | 2 ++ app/src/main/res/values-lt/strings.xml | 2 ++ app/src/main/res/values-pt/strings.xml | 2 ++ app/src/main/res/values-ru/strings.xml | 2 ++ app/src/main/res/values-sk/strings.xml | 2 ++ app/src/main/res/values-sv/strings.xml | 2 ++ app/src/main/res/values-tr/strings.xml | 2 ++ app/src/main/res/values-zh-rTW/strings.xml | 2 ++ app/src/main/res/values/strings.xml | 2 ++ 17 files changed, 34 insertions(+) diff --git a/app/src/main/res/values-az/strings.xml b/app/src/main/res/values-az/strings.xml index 092598a7..5ca969a7 100644 --- a/app/src/main/res/values-az/strings.xml +++ b/app/src/main/res/values-az/strings.xml @@ -116,6 +116,8 @@ Incoming call from… Ongoing call Disconnected + Decline + Answer Göstərmək üçün sahəni seç diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index 609ac314..a580dcf2 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -116,6 +116,8 @@ Incoming call from… Ongoing call Disconnected + Decline + Answer Sichtbare Felder auswählen diff --git a/app/src/main/res/values-el/strings.xml b/app/src/main/res/values-el/strings.xml index 0fa31b59..ff3c487e 100644 --- a/app/src/main/res/values-el/strings.xml +++ b/app/src/main/res/values-el/strings.xml @@ -116,6 +116,8 @@ Incoming call from… Ongoing call Disconnected + Decline + Answer Επιλογή εμφάνισης πεδίων diff --git a/app/src/main/res/values-eu/strings.xml b/app/src/main/res/values-eu/strings.xml index 2d8fe559..a026a0b7 100644 --- a/app/src/main/res/values-eu/strings.xml +++ b/app/src/main/res/values-eu/strings.xml @@ -116,6 +116,8 @@ Incoming call from… Ongoing call Disconnected + Decline + Answer Hautatu erakusteko eremuak diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml index e73cf146..84b51d57 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -116,6 +116,8 @@ Incoming call from… Ongoing call Disconnected + Decline + Answer Sélectionner les champs à afficher diff --git a/app/src/main/res/values-hr/strings.xml b/app/src/main/res/values-hr/strings.xml index 33793d0f..55a0d486 100644 --- a/app/src/main/res/values-hr/strings.xml +++ b/app/src/main/res/values-hr/strings.xml @@ -116,6 +116,8 @@ Incoming call from… Ongoing call Disconnected + Decline + Answer Odaberi polja za prikaz diff --git a/app/src/main/res/values-it/strings.xml b/app/src/main/res/values-it/strings.xml index 72fe3b8e..c998474a 100644 --- a/app/src/main/res/values-it/strings.xml +++ b/app/src/main/res/values-it/strings.xml @@ -116,6 +116,8 @@ Chiamata in arrivo da… Chiamata in corso Disconnesso + Decline + Answer Seleziona i campi da mostrare diff --git a/app/src/main/res/values-ja/strings.xml b/app/src/main/res/values-ja/strings.xml index 569feadc..41857363 100644 --- a/app/src/main/res/values-ja/strings.xml +++ b/app/src/main/res/values-ja/strings.xml @@ -116,6 +116,8 @@ 着信中… 通話中 切断されました + Decline + Answer 表示する項目を選択 diff --git a/app/src/main/res/values-ko-rKR/strings.xml b/app/src/main/res/values-ko-rKR/strings.xml index b3358004..e2ef5362 100644 --- a/app/src/main/res/values-ko-rKR/strings.xml +++ b/app/src/main/res/values-ko-rKR/strings.xml @@ -116,6 +116,8 @@ Incoming call from… Ongoing call Disconnected + Decline + Answer Select fields to show diff --git a/app/src/main/res/values-lt/strings.xml b/app/src/main/res/values-lt/strings.xml index 4e0bf374..ccc4dcb4 100644 --- a/app/src/main/res/values-lt/strings.xml +++ b/app/src/main/res/values-lt/strings.xml @@ -116,6 +116,8 @@ Incoming call from… Ongoing call Disconnected + Decline + Answer Pasirinkti rodomus laukelius diff --git a/app/src/main/res/values-pt/strings.xml b/app/src/main/res/values-pt/strings.xml index 8ab1755d..f6cf427b 100644 --- a/app/src/main/res/values-pt/strings.xml +++ b/app/src/main/res/values-pt/strings.xml @@ -116,6 +116,8 @@ Incoming call from… Ongoing call Disconnected + Decline + Answer Selecione os campos a mostrar diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index 03858e08..00358377 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -116,6 +116,8 @@ Incoming call from… Ongoing call Disconnected + Decline + Answer Выберите отображаемые поля diff --git a/app/src/main/res/values-sk/strings.xml b/app/src/main/res/values-sk/strings.xml index 573b5fce..4e8563bf 100644 --- a/app/src/main/res/values-sk/strings.xml +++ b/app/src/main/res/values-sk/strings.xml @@ -116,6 +116,8 @@ Prichádzajúci hovor od… Prebiehajúci hovor Ukončený hovor + Odmietnuť + Prijať Zvoľte polia na zobrazenie diff --git a/app/src/main/res/values-sv/strings.xml b/app/src/main/res/values-sv/strings.xml index c3812c87..7c58fa17 100644 --- a/app/src/main/res/values-sv/strings.xml +++ b/app/src/main/res/values-sv/strings.xml @@ -116,6 +116,8 @@ Incoming call from… Ongoing call Disconnected + Decline + Answer Välj vilka fält som ska visas diff --git a/app/src/main/res/values-tr/strings.xml b/app/src/main/res/values-tr/strings.xml index 98b4545c..7f45af41 100644 --- a/app/src/main/res/values-tr/strings.xml +++ b/app/src/main/res/values-tr/strings.xml @@ -116,6 +116,8 @@ Incoming call from… Ongoing call Disconnected + Decline + Answer Görüntülenecek alanları seç diff --git a/app/src/main/res/values-zh-rTW/strings.xml b/app/src/main/res/values-zh-rTW/strings.xml index b82025d5..02964406 100644 --- a/app/src/main/res/values-zh-rTW/strings.xml +++ b/app/src/main/res/values-zh-rTW/strings.xml @@ -116,6 +116,8 @@ Incoming call from… Ongoing call Disconnected + Decline + Answer 選擇要顯示的欄位 diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 688609fb..89f22d7a 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -116,6 +116,8 @@ Incoming call from… Ongoing call Disconnected + Decline + Answer Select fields to show From 1cdf538ac3add1be796f1cd51fc751aff55ac064 Mon Sep 17 00:00:00 2001 From: tibbi Date: Fri, 23 Nov 2018 12:41:28 +0100 Subject: [PATCH 069/134] adding decline/answer action buttons to the incoming call notification --- .../contacts/pro/activities/DialerActivity.kt | 14 ++++-- .../contacts/pro/helpers/Constants.kt | 2 + .../contacts/pro/helpers/MyConnection.kt | 2 +- .../contacts/pro/objects/CallManager.kt | 2 +- .../pro/services/DialerCallService.kt | 49 ++++++++++++++----- 5 files changed, 53 insertions(+), 16 deletions(-) diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/DialerActivity.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/DialerActivity.kt index 4133c8c7..a17fd818 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/DialerActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/DialerActivity.kt @@ -1,6 +1,7 @@ package com.simplemobiletools.contacts.pro.activities import android.annotation.SuppressLint +import android.annotation.TargetApi import android.content.BroadcastReceiver import android.content.Context import android.content.Intent @@ -10,6 +11,7 @@ import android.hardware.SensorEvent import android.hardware.SensorEventListener import android.hardware.SensorManager import android.net.Uri +import android.os.Build import android.os.Bundle import android.os.Handler import android.os.PowerManager @@ -25,6 +27,7 @@ import com.simplemobiletools.contacts.pro.services.DialerCallService import kotlinx.android.synthetic.main.activity_dialer.* // incoming call handling inspired by https://github.com/mbarrben/android_dialer_replacement +@TargetApi(Build.VERSION_CODES.M) class DialerActivity : SimpleActivity(), SensorEventListener { private val SENSOR_SENSITIVITY = 4 private val DISCONNECT_DELAY = 3000L @@ -47,7 +50,12 @@ class DialerActivity : SimpleActivity(), SensorEventListener { val action = intent.action val extras = intent.extras - if (action == Intent.ACTION_CALL && intent.data != null && intent.dataString?.contains("tel:") == true) { + if (extras?.getBoolean(ANSWER_CALL, false) == true) { + callNumber = intent.getStringExtra(CALL_NUMBER) + initViews() + CallManager.answerCall() + tryFillingOtherEndsName() + } else if (action == Intent.ACTION_CALL && intent.data != null && intent.dataString?.contains("tel:") == true) { callNumber = Uri.decode(intent.dataString).substringAfter("tel:") initViews() tryFillingOtherEndsName() @@ -118,14 +126,14 @@ class DialerActivity : SimpleActivity(), SensorEventListener { private fun initViews() { dialer_hangup_button.setOnClickListener { hangUp() } - dialer_incoming_accept.setOnClickListener { CallManager.acceptCall() } + dialer_incoming_accept.setOnClickListener { CallManager.answerCall() } dialer_incoming_decline.setOnClickListener { hangUp() } dialer_hangup_button.beVisibleIf(!isIncomingCall) dialer_incoming_decline.beVisibleIf(isIncomingCall) dialer_incoming_accept.beVisibleIf(isIncomingCall) - dialer_label.setText(if (isIncomingCall) R.string.incoming_call else R.string.calling) + dialer_label.setText(if (isIncomingCall) R.string.incoming_call_from else R.string.calling) } private fun initOutgoingCall() { diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/helpers/Constants.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/helpers/Constants.kt index dabcc7ed..596a33c1 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/helpers/Constants.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/helpers/Constants.kt @@ -39,6 +39,8 @@ const val CALL_NUMBER = "call_number" const val CALL_STATUS = "call_status" const val IS_INCOMING_CALL = "is_incoming_call" const val DIALER_INTENT_FILTER = "dialer_intent_filter" +const val DECLINE_CALL = "decline_call" +const val ANSWER_CALL = "answer_call" const val LOCATION_CONTACTS_TAB = 0 const val LOCATION_FAVORITES_TAB = 1 diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/helpers/MyConnection.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/helpers/MyConnection.kt index 0c584146..419ece65 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/helpers/MyConnection.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/helpers/MyConnection.kt @@ -15,7 +15,7 @@ class MyConnection(val context: Context) : Connection() { override fun onReject() { super.onReject() - setDisconnected(DisconnectCause(DisconnectCause.LOCAL)) + setDisconnected(DisconnectCause(DisconnectCause.REJECTED)) destroy() } diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/objects/CallManager.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/objects/CallManager.kt index d6f095f7..bfb7b9cb 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/objects/CallManager.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/objects/CallManager.kt @@ -21,7 +21,7 @@ object CallManager { } } - fun acceptCall() { + fun answerCall() { currentCall?.apply { answer(details.videoState) } diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/services/DialerCallService.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/services/DialerCallService.kt index d7a7db23..37352125 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/services/DialerCallService.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/services/DialerCallService.kt @@ -13,13 +13,15 @@ import androidx.core.app.NotificationCompat import com.simplemobiletools.commons.helpers.isOreoPlus import com.simplemobiletools.contacts.pro.R import com.simplemobiletools.contacts.pro.activities.DialerActivity -import com.simplemobiletools.contacts.pro.helpers.CALL_NUMBER -import com.simplemobiletools.contacts.pro.helpers.CALL_STATUS -import com.simplemobiletools.contacts.pro.helpers.IS_INCOMING_CALL -import com.simplemobiletools.contacts.pro.helpers.RESUME_DIALER +import com.simplemobiletools.contacts.pro.helpers.* +import com.simplemobiletools.contacts.pro.objects.CallManager class DialerCallService : Service() { private val CALL_NOTIFICATION_ID = 1 + private val LAUNCH_DIALER_INTENT_ID = 1 + private val DISMISS_CALL_INTENT_ID = 2 + private val ANSWER_CALL_INTENT_ID = 3 + private var callNumber = "" private var callStatus = Call.STATE_NEW private var isIncomingCall = false @@ -28,11 +30,16 @@ class DialerCallService : Service() { override fun onStartCommand(intent: Intent, flags: Int, startId: Int): Int { super.onStartCommand(intent, flags, startId) - callNumber = intent.getStringExtra(CALL_NUMBER) - callStatus = intent.getIntExtra(CALL_STATUS, Call.STATE_NEW) - isIncomingCall = intent.getBooleanExtra(IS_INCOMING_CALL, false) - - setupNotification() + if (intent.getBooleanExtra(DECLINE_CALL, false)) { + CallManager.declineCall() + stopForeground(true) + stopSelf() + } else { + callNumber = intent.getStringExtra(CALL_NUMBER) + callStatus = intent.getIntExtra(CALL_STATUS, Call.STATE_NEW) + isIncomingCall = intent.getBooleanExtra(IS_INCOMING_CALL, false) + setupNotification() + } return START_STICKY } @@ -47,7 +54,7 @@ class DialerCallService : Service() { if (isOreoPlus()) { val notificationManager = getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager val name = resources.getString(R.string.app_name) - val importance = NotificationManager.IMPORTANCE_HIGH + val importance = if (callStatus == Call.STATE_RINGING) NotificationManager.IMPORTANCE_HIGH else NotificationManager.IMPORTANCE_DEFAULT NotificationChannel(channelId, name, importance).apply { enableLights(false) enableVibration(false) @@ -65,6 +72,8 @@ class DialerCallService : Service() { .setOngoing(true) .setChannelId(channelId) .setUsesChronometer(callStatus == Call.STATE_ACTIVE) + .addAction(0, getString(R.string.decline_call), getDeclineCallIntent()) + .addAction(0, getString(R.string.answer_call), getAnswerCallIntent()) startForeground(CALL_NOTIFICATION_ID, notification.build()) } @@ -76,7 +85,25 @@ class DialerCallService : Service() { putExtra(CALL_STATUS, callStatus) putExtra(IS_INCOMING_CALL, isIncomingCall) } - return PendingIntent.getActivity(this, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT) + return PendingIntent.getActivity(this, LAUNCH_DIALER_INTENT_ID, intent, PendingIntent.FLAG_UPDATE_CURRENT) + } + + private fun getDeclineCallIntent(): PendingIntent { + Intent(this, DialerCallService::class.java).apply { + putExtra(DECLINE_CALL, true) + return PendingIntent.getService(this@DialerCallService, DISMISS_CALL_INTENT_ID, this, PendingIntent.FLAG_UPDATE_CURRENT) + } + } + + private fun getAnswerCallIntent(): PendingIntent { + val intent = Intent(this, DialerActivity::class.java).apply { + action = RESUME_DIALER + putExtra(CALL_NUMBER, callNumber) + putExtra(CALL_STATUS, callStatus) + putExtra(IS_INCOMING_CALL, isIncomingCall) + putExtra(ANSWER_CALL, true) + } + return PendingIntent.getActivity(this, ANSWER_CALL_INTENT_ID, intent, PendingIntent.FLAG_UPDATE_CURRENT) } private fun getCallStatusString(): String { From c5971abe6a5b5a6fb7f886179f337e9b61c3d01e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?K=C3=A9vin=20Minions?= <6994275+KevinMinions@users.noreply.github.com> Date: Fri, 23 Nov 2018 12:59:46 +0100 Subject: [PATCH 070/134] Update strings.xml --- app/src/main/res/values-fr/strings.xml | 98 +++++++++++++------------- 1 file changed, 49 insertions(+), 49 deletions(-) diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml index 84b51d57..5517cd3b 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -2,27 +2,27 @@ Simple Contacts Contacts Adresse - Ajout… - Mise à jour… + Ajout en cours + Actualisation en cours Stockage du téléphone - Stockage du téléphone (non visible par d\'autres applis) - Société + Stockage du téléphone (non visible par d\'autres applications) + Entreprise Poste - Site web + Site Internet Envoyer un SMS aux contacts - Envoyer un e-mail aux contacts + Envoyer un courriel aux contacts Envoyer un SMS au groupe - Envoyer un e-mail au groupe - Call %s - Demander les autorisations requises + Envoyer un courriel au groupe + Appeler %s + Demander les autorisations nécessaires Créer un nouveau contact Ajouter à un contact existant - No contacts found - No contacts with emails have been found - No contacts with phone numbers have been found - No recent calls found + Aucun contact n\'a été trouvé + Aucun contact avec une adresse de courriel n\'a été trouvé + Aucun contact avec un numéro de téléphone n\'a été trouvé + Aucun appel récent n\'a été trouvé Nouveau contact Modifier contact @@ -34,15 +34,15 @@ Surnom - Pas de groupe + Aucun groupe Créer un nouveau groupe - Enlever du groupe + Supprimer du groupe Ce groupe est vide - Ajout contacts - Il n\'y a pas de groupes de contacts sur l\'appareil + Ajouter des contacts + Aucun groupe de contacts sur l\'appareil Créer un groupe Ajouter à un groupe - Créer un groupe pris en compte + Créer un groupe dans le compte Prendre une photo @@ -53,21 +53,21 @@ Trier les contacts par nom de famille Afficher les numéros de téléphone Afficher les vignettes des contacts - Show a dialpad button on the main screen - Sur appui du contact + Afficher un bouton \"Clavier téléphonique\" sur l\'écran principal + Lors d\'un appui sur un contact Appeler le contact - Voir les détails du contact + Afficher les détails du contact Configurer l\'affichage des champs des contacts Essayez de filtrer les contacts en double Gérer les onglets affichés Contacts - Favorites + Favoris Appels récents - Afficher une boîte de dialogue de confirmation d\'appel avant de lancer un appel - Show only contacts with phone numbers + Afficher une demande de confirmation avant de démarrer un appel + Afficher uniquement les contacts avec un numéro de téléphone - E-mail + Adresse de courriel Maison Travail Autre @@ -86,11 +86,11 @@ Anniversaire - Vous n\'ayez pas encore ajouté de contact favori. + Aucun contact favori n\'a été trouvé Ajouter des favoris Ajouter aux favoris - Retirer des favoris - Vous devez être sur l\'écran Modifier pour modifier un contact + Supprimer des favoris + Vous devez être sur l\'écran \"Modifier\" pour modifier un contact Rechercher des contacts @@ -101,54 +101,54 @@ Exporter des contacts Importer des contacts depuis un fichier .vcf Exporter des contacts vers un fichier .vcf - Source du contact cible - Inclure les sources du contact + Compte pour le du contact destinataire + Ajouter le compte pour le contact Nom du fichier (sans .vcf) - Dialpad + Clavier téléphonique Ajouter un numéro au contact - Dialer - Calling… - Incoming call - Incoming call from… - Ongoing call - Disconnected - Decline - Answer + Numéroteur + Appel en cours… + Appel entrant + Appel entrant de… + Appel en cours + Interrompu + Refuser + Répondre Sélectionner les champs à afficher Préfixe Suffixe Numéros de téléphone - E-mails + Adresse de courriels Adresses Évènements (naissances, anniversaires) Notes Organisation - Sites web + Sites Internet Groupe - Source du contact + Compte pour le contact Messagerie instantanée (MI) - Je veux changer quelles champs sont visibles. Est-ce que je peux ? - Oui, tout ce que vous avez à faire c\'est d\'aller dans Paramètres -> Configurer l\'affichage des champs de contact. Ici vous pouvez sélectionner quelles champs vous voulez afficher. Certains sont désactivés par défaut, ainsi vous pourrez y trouver des nouveaux champs. + Je veux modifier les champs affichés sur les fiches de mes contacts. Puis-je le faire ? + Oui, tout ce que vous avez à faire c\'est d\'aller dans \"Paramètres\" -> \"Configurer l\'affichage des champs de contact\". Sélectionnez les champs à afficher. Certains champs sont désactivés par défaut. - Une appli de contacts pour gérer vos contacts sans pubs. + Une application répertoire pour gérer vos contacts sans publicité. - Une appli simple pour créer et gérer vos contacts depuis n\'importe quelle source. Les contacts peuvent être stockés sur votre appareil mais aussi synchronisés via Google ou d\'autres comptes. Vous pouvez afficher vos contacts favoris dans une liste séparée. + Un outil simple pour créer et gérer vos contacts depuis n\'importe quelle source. Les contacts peuvent être stockés sur votre appareil mais aussi synchronisés via votre compte Google ou d\'autres comptes. Vous pouvez afficher vos contacts favoris dans une liste séparée. - Vous pouvez l\'utiliser pour gérer les e-mail et événements de vos contacts. Elle permet de trier/filter via de multiples paramètres, et même afficher le surnom en premier. + Vous pouvez l\'utiliser pour gérer les adresses de courriels et les événements de vos contacts. Cet outil permet de trier/filtrer à l\'aide de multiples paramètres, par exemple : afficher le surnom en premier. - Aucune publicité ni de permission inutile. Elle est entièrement open source et vous permet de personnaliser les couleurs. + L\'application ne contient ni publicité, ni autorisation inutile. Elle est totalement opensource et est également fournie avec des couleurs personnalisables. - Cette application fait parti d\'un groupe d\'applications. Vous pouvez trouver le reste des applis sur https://www.simplemobiletools.com + Cette application fait partie d\'une plus grande suite. Vous pouvez trouver les autres applications sur https://www.simplemobiletools.com Compositore Chiamata in corso… - Incoming call + Chiamata in arrivo Chiamata in arrivo da… Chiamata in corso Disconnesso - Decline - Answer + Rifiuta + Rispondi Seleziona i campi da mostrare From 772a28eb9eaef6085a35f4d01983756a2a37a2f4 Mon Sep 17 00:00:00 2001 From: tibbi Date: Mon, 26 Nov 2018 10:54:52 +0100 Subject: [PATCH 072/134] disable default notification sounds for incoming calls --- .../contacts/pro/services/DialerCallService.kt | 2 ++ 1 file changed, 2 insertions(+) diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/services/DialerCallService.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/services/DialerCallService.kt index 37352125..ed37d17e 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/services/DialerCallService.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/services/DialerCallService.kt @@ -58,6 +58,7 @@ class DialerCallService : Service() { NotificationChannel(channelId, name, importance).apply { enableLights(false) enableVibration(false) + setSound(null, null) notificationManager.createNotificationChannel(this) } } @@ -71,6 +72,7 @@ class DialerCallService : Service() { .setPriority(NotificationCompat.PRIORITY_MAX) .setOngoing(true) .setChannelId(channelId) + .setSound(null) .setUsesChronometer(callStatus == Call.STATE_ACTIVE) .addAction(0, getString(R.string.decline_call), getDeclineCallIntent()) .addAction(0, getString(R.string.answer_call), getAnswerCallIntent()) From 7cdefe43d529487eea4644401a385992c3a0c1a2 Mon Sep 17 00:00:00 2001 From: tibbi Date: Mon, 26 Nov 2018 12:25:00 +0100 Subject: [PATCH 073/134] refresh the incoming call notification every few secs to keep it visible --- .../contacts/pro/services/DialerCallService.kt | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/services/DialerCallService.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/services/DialerCallService.kt index ed37d17e..9be869cd 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/services/DialerCallService.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/services/DialerCallService.kt @@ -8,6 +8,7 @@ import android.app.Service import android.content.Context import android.content.Intent import android.os.Build +import android.os.Handler import android.telecom.Call import androidx.core.app.NotificationCompat import com.simplemobiletools.commons.helpers.isOreoPlus @@ -17,6 +18,7 @@ import com.simplemobiletools.contacts.pro.helpers.* import com.simplemobiletools.contacts.pro.objects.CallManager class DialerCallService : Service() { + private val REFRESH_REMINDER_PERIOD = 3000L private val CALL_NOTIFICATION_ID = 1 private val LAUNCH_DIALER_INTENT_ID = 1 private val DISMISS_CALL_INTENT_ID = 2 @@ -25,6 +27,7 @@ class DialerCallService : Service() { private var callNumber = "" private var callStatus = Call.STATE_NEW private var isIncomingCall = false + private var reminderRefreshHandler = Handler() override fun onBind(intent: Intent?) = null @@ -46,6 +49,7 @@ class DialerCallService : Service() { override fun onDestroy() { super.onDestroy() stopForeground(true) + reminderRefreshHandler.removeCallbacksAndMessages(null) } @TargetApi(Build.VERSION_CODES.O) @@ -78,6 +82,12 @@ class DialerCallService : Service() { .addAction(0, getString(R.string.answer_call), getAnswerCallIntent()) startForeground(CALL_NOTIFICATION_ID, notification.build()) + + reminderRefreshHandler.postDelayed({ + if (callStatus == Call.STATE_RINGING) { + setupNotification() + } + }, REFRESH_REMINDER_PERIOD) } private fun getLaunchDialerIntent(): PendingIntent { From 012442a057493caeda8ca1e82e8d6ffacbaee383 Mon Sep 17 00:00:00 2001 From: tibbi Date: Tue, 27 Nov 2018 12:19:05 +0100 Subject: [PATCH 074/134] redesigning the Incoming Call notification, add colored icons --- .../pro/services/DialerCallService.kt | 24 ++++++-- app/src/main/res/drawable/ripple.xml | 11 ++++ .../res/layout/incoming_call_notification.xml | 55 +++++++++++++++++++ app/src/main/res/values/colors.xml | 2 +- 4 files changed, 87 insertions(+), 5 deletions(-) create mode 100644 app/src/main/res/drawable/ripple.xml create mode 100644 app/src/main/res/layout/incoming_call_notification.xml diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/services/DialerCallService.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/services/DialerCallService.kt index 9be869cd..1a28aca6 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/services/DialerCallService.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/services/DialerCallService.kt @@ -10,7 +10,10 @@ import android.content.Intent import android.os.Build import android.os.Handler import android.telecom.Call +import android.widget.RemoteViews import androidx.core.app.NotificationCompat +import com.simplemobiletools.commons.extensions.getColoredBitmap +import com.simplemobiletools.commons.extensions.setText import com.simplemobiletools.commons.helpers.isOreoPlus import com.simplemobiletools.contacts.pro.R import com.simplemobiletools.contacts.pro.activities.DialerActivity @@ -67,19 +70,32 @@ class DialerCallService : Service() { } } + val notificationLayout = RemoteViews(packageName, R.layout.incoming_call_notification).apply { + setText(R.id.incoming_call_caller, callNumber) + setText(R.id.incoming_call_status, getCallStatusString()) + + val resources = applicationContext.resources + setImageViewBitmap(R.id.call_decline, resources.getColoredBitmap(R.drawable.ic_phone_down, resources.getColor(R.color.theme_dark_red_primary_color))) + setImageViewBitmap(R.id.call_answer, resources.getColoredBitmap(R.drawable.ic_phone, resources.getColor(R.color.md_green_700))) + + setOnClickPendingIntent(R.id.call_decline, getDeclineCallIntent()) + setOnClickPendingIntent(R.id.call_answer, getAnswerCallIntent()) + } + val notification = NotificationCompat.Builder(applicationContext, channelId) .setSmallIcon(R.drawable.ic_phone) - .setContentTitle(callNumber) - .setContentText(getCallStatusString()) .setContentIntent(getLaunchDialerIntent()) .setVisibility(NotificationCompat.VISIBILITY_PUBLIC) .setPriority(NotificationCompat.PRIORITY_MAX) + .setCustomContentView(notificationLayout) + .setCustomHeadsUpContentView(notificationLayout) + .setCustomBigContentView(notificationLayout) .setOngoing(true) + .setCategory(NotificationCompat.CATEGORY_CALL) .setChannelId(channelId) .setSound(null) + .setOnlyAlertOnce(true) .setUsesChronometer(callStatus == Call.STATE_ACTIVE) - .addAction(0, getString(R.string.decline_call), getDeclineCallIntent()) - .addAction(0, getString(R.string.answer_call), getAnswerCallIntent()) startForeground(CALL_NOTIFICATION_ID, notification.build()) diff --git a/app/src/main/res/drawable/ripple.xml b/app/src/main/res/drawable/ripple.xml new file mode 100644 index 00000000..4538babe --- /dev/null +++ b/app/src/main/res/drawable/ripple.xml @@ -0,0 +1,11 @@ + + + + + + + + + diff --git a/app/src/main/res/layout/incoming_call_notification.xml b/app/src/main/res/layout/incoming_call_notification.xml new file mode 100644 index 00000000..ece53f06 --- /dev/null +++ b/app/src/main/res/layout/incoming_call_notification.xml @@ -0,0 +1,55 @@ + + + + + + + + + + + + + + + diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml index d781ec5f..b8d2ac37 100644 --- a/app/src/main/res/values/colors.xml +++ b/app/src/main/res/values/colors.xml @@ -1,4 +1,4 @@ - + #55000000 From 9e015c3888c4d4924e6b308609e8ca54dd74d320 Mon Sep 17 00:00:00 2001 From: tibbi Date: Tue, 27 Nov 2018 14:43:17 +0100 Subject: [PATCH 075/134] decode the incoming call number before displaying --- .../contacts/pro/services/MyIncomingCallService.kt | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/services/MyIncomingCallService.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/services/MyIncomingCallService.kt index 0c6f6bd8..efc70b50 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/services/MyIncomingCallService.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/services/MyIncomingCallService.kt @@ -14,12 +14,11 @@ import com.simplemobiletools.contacts.pro.objects.CallManager @TargetApi(Build.VERSION_CODES.M) class MyIncomingCallService : InCallService() { - override fun onCallAdded(call: Call) { super.onCallAdded(call) call.registerCallback(callCallback) - val handle = call.details.handle.toString() + val handle = Uri.decode(call.details.handle.toString()) val callerNumber = if (handle.contains("tel:")) { handle.substringAfter("tel:") } else { From 48a7eb3c72145120ff8ae1d60243616e01b9aee9 Mon Sep 17 00:00:00 2001 From: tibbi Date: Tue, 27 Nov 2018 15:00:19 +0100 Subject: [PATCH 076/134] disable the alert_only_once flag at incoming call notifications --- .../contacts/pro/services/DialerCallService.kt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/services/DialerCallService.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/services/DialerCallService.kt index 1a28aca6..f7c2337e 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/services/DialerCallService.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/services/DialerCallService.kt @@ -57,7 +57,7 @@ class DialerCallService : Service() { @TargetApi(Build.VERSION_CODES.O) private fun setupNotification() { - val channelId = "simple_contacts_channel" + val channelId = "incoming_call" if (isOreoPlus()) { val notificationManager = getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager val name = resources.getString(R.string.app_name) @@ -94,7 +94,7 @@ class DialerCallService : Service() { .setCategory(NotificationCompat.CATEGORY_CALL) .setChannelId(channelId) .setSound(null) - .setOnlyAlertOnce(true) + .setOnlyAlertOnce(false) .setUsesChronometer(callStatus == Call.STATE_ACTIVE) startForeground(CALL_NOTIFICATION_ID, notification.build()) From ce6f6e7049bfc622ea019c72888d92b39360feec Mon Sep 17 00:00:00 2001 From: tibbi Date: Tue, 27 Nov 2018 15:02:06 +0100 Subject: [PATCH 077/134] show the Answer call button only while ringing --- .../contacts/pro/services/DialerCallService.kt | 2 ++ 1 file changed, 2 insertions(+) diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/services/DialerCallService.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/services/DialerCallService.kt index f7c2337e..c0699002 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/services/DialerCallService.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/services/DialerCallService.kt @@ -78,6 +78,8 @@ class DialerCallService : Service() { setImageViewBitmap(R.id.call_decline, resources.getColoredBitmap(R.drawable.ic_phone_down, resources.getColor(R.color.theme_dark_red_primary_color))) setImageViewBitmap(R.id.call_answer, resources.getColoredBitmap(R.drawable.ic_phone, resources.getColor(R.color.md_green_700))) + setVisibleIf(R.id.call_answer, callStatus == Call.STATE_RINGING) + setOnClickPendingIntent(R.id.call_decline, getDeclineCallIntent()) setOnClickPendingIntent(R.id.call_answer, getAnswerCallIntent()) } From 5868128d57927b2236958ac40fe3cb913973526f Mon Sep 17 00:00:00 2001 From: fricyo <30796677+fricyo@users.noreply.github.com> Date: Wed, 28 Nov 2018 18:10:23 +0800 Subject: [PATCH 078/134] Update Translation --- app/src/main/res/values-zh-rTW/strings.xml | 28 +++++++++++----------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/app/src/main/res/values-zh-rTW/strings.xml b/app/src/main/res/values-zh-rTW/strings.xml index 02964406..566b5c1d 100644 --- a/app/src/main/res/values-zh-rTW/strings.xml +++ b/app/src/main/res/values-zh-rTW/strings.xml @@ -19,10 +19,10 @@ 添加至已存在的聯絡人 - No contacts found - No contacts with emails have been found - No contacts with phone numbers have been found - No recent calls found + 未發現聯絡人 + 未發現含有電子信箱的聯絡人 + 未發現含有電話號碼的聯絡人 + 未發現通話紀錄 新聯絡人 編輯聯絡人 @@ -53,7 +53,7 @@ 姓氏在前 主畫面顯示電話號碼 顯示聯絡人縮圖 - Show a dialpad button on the main screen + 在主畫面顯示撥號按鈕 點擊聯絡人 打電話給聯絡人 顯示聯絡人資料 @@ -64,7 +64,7 @@ 我的最愛 通話紀錄 開始通話前顯示通話確認框 - Show only contacts with phone numbers + 只顯示含有電話話碼的聯絡人 電子信箱 @@ -110,14 +110,14 @@ 添加號碼至通訊錄 - Dialer - Calling… - Incoming call - Incoming call from… - Ongoing call - Disconnected - Decline - Answer + 撥號器 + 撥號中… + 來電 + 通話來自於… + 持續通話 + 未接電話 + 掛斷電話 + 回撥 選擇要顯示的欄位 From 63bd1e65ddb51b4783ab51af6c13012a29a79718 Mon Sep 17 00:00:00 2001 From: tibbi Date: Wed, 28 Nov 2018 11:34:56 +0100 Subject: [PATCH 079/134] removing some probably not needed lines from MyIncomingCallService at the manifest --- app/src/main/AndroidManifest.xml | 11 ----------- 1 file changed, 11 deletions(-) diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index ce1530a6..b1953893 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -247,23 +247,12 @@ - - - - From 568254cede7cd5c478a92c5037aa97256817a216 Mon Sep 17 00:00:00 2001 From: tibbi Date: Wed, 28 Nov 2018 11:37:30 +0100 Subject: [PATCH 080/134] correcting the scheme at outgoing calls --- .../contacts/pro/activities/DialerActivity.kt | 3 ++- .../contacts/pro/services/DialerCallService.kt | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/DialerActivity.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/DialerActivity.kt index a17fd818..15fb5765 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/DialerActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/DialerActivity.kt @@ -16,6 +16,7 @@ import android.os.Bundle import android.os.Handler import android.os.PowerManager import android.telecom.Call +import android.telecom.PhoneAccount import android.telecom.TelecomManager import androidx.localbroadcastmanager.content.LocalBroadcastManager import com.simplemobiletools.commons.extensions.* @@ -138,7 +139,7 @@ class DialerActivity : SimpleActivity(), SensorEventListener { private fun initOutgoingCall() { val telecomManager = getSystemService(Context.TELECOM_SERVICE) as TelecomManager - val uri = Uri.fromParts("tel:", callNumber, null) + val uri = Uri.fromParts(PhoneAccount.SCHEME_TEL, callNumber, null) val extras = Bundle() telecomManager.placeCall(uri, extras) } diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/services/DialerCallService.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/services/DialerCallService.kt index c0699002..f766d148 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/services/DialerCallService.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/services/DialerCallService.kt @@ -14,6 +14,7 @@ import android.widget.RemoteViews import androidx.core.app.NotificationCompat import com.simplemobiletools.commons.extensions.getColoredBitmap import com.simplemobiletools.commons.extensions.setText +import com.simplemobiletools.commons.extensions.setVisibleIf import com.simplemobiletools.commons.helpers.isOreoPlus import com.simplemobiletools.contacts.pro.R import com.simplemobiletools.contacts.pro.activities.DialerActivity @@ -40,7 +41,7 @@ class DialerCallService : Service() { CallManager.declineCall() stopForeground(true) stopSelf() - } else { + } else if (intent.getBooleanExtra(IS_INCOMING_CALL, false)) { callNumber = intent.getStringExtra(CALL_NUMBER) callStatus = intent.getIntExtra(CALL_STATUS, Call.STATE_NEW) isIncomingCall = intent.getBooleanExtra(IS_INCOMING_CALL, false) From 0a831c5e87a25c03b3bec8fccf04a05880a2c528 Mon Sep 17 00:00:00 2001 From: tibbi Date: Wed, 28 Nov 2018 12:17:29 +0100 Subject: [PATCH 081/134] updating changelog, removed Recents tab from the old free version --- CHANGELOG.md | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 7ac4d2c4..1ddd9c8f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,10 +6,16 @@ Version 6.0.0 *(2018-11-06)* * Initial Pro version +Version 5.1.2 *(2018-11-28)* +---------------------------- + + * Had to remove the Recents tab due to the latest Googles' permissions policy. The Pro app will be updated with a Recents tab and a mandatory Dialer soon. + * This version of the app is no longer maintained, please upgrade to the Pro version. You can find the Upgrade button at the top of the app Settings. + Version 5.1.1 *(2018-11-05)* ---------------------------- - * This version of the app is no longer maintained. Please upgrade to the Pro version. It is free till Nov 14 2018. You can find the Upgrade button at the top of the app Settings. + * Added some stability and translation improvements Version 5.1.0 *(2018-10-28)* ---------------------------- From bf981e103358b3bea6d0a5e63b786b09ca4a4b7e Mon Sep 17 00:00:00 2001 From: tibbi Date: Wed, 28 Nov 2018 13:46:40 +0100 Subject: [PATCH 082/134] update the notification immediately at accepting an incoming call --- .../pro/services/DialerCallService.kt | 27 ++++++++++++------- 1 file changed, 17 insertions(+), 10 deletions(-) diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/services/DialerCallService.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/services/DialerCallService.kt index f766d148..13d82173 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/services/DialerCallService.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/services/DialerCallService.kt @@ -37,15 +37,22 @@ class DialerCallService : Service() { override fun onStartCommand(intent: Intent, flags: Int, startId: Int): Int { super.onStartCommand(intent, flags, startId) - if (intent.getBooleanExtra(DECLINE_CALL, false)) { - CallManager.declineCall() - stopForeground(true) - stopSelf() - } else if (intent.getBooleanExtra(IS_INCOMING_CALL, false)) { - callNumber = intent.getStringExtra(CALL_NUMBER) - callStatus = intent.getIntExtra(CALL_STATUS, Call.STATE_NEW) - isIncomingCall = intent.getBooleanExtra(IS_INCOMING_CALL, false) - setupNotification() + when { + intent.getBooleanExtra(DECLINE_CALL, false) -> { + CallManager.declineCall() + stopForeground(true) + stopSelf() + } + intent.getBooleanExtra(IS_INCOMING_CALL, false) -> { + callNumber = intent.getStringExtra(CALL_NUMBER) + callStatus = intent.getIntExtra(CALL_STATUS, Call.STATE_NEW) + isIncomingCall = intent.getBooleanExtra(IS_INCOMING_CALL, false) + setupNotification() + } + intent.extras?.containsKey(CALL_STATUS) == true -> { + callStatus = intent.getIntExtra(CALL_STATUS, Call.STATE_NEW) + setupNotification() + } } return START_STICKY } @@ -58,7 +65,7 @@ class DialerCallService : Service() { @TargetApi(Build.VERSION_CODES.O) private fun setupNotification() { - val channelId = "incoming_call" + val channelId = "call_channel" if (isOreoPlus()) { val notificationManager = getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager val name = resources.getString(R.string.app_name) From 4800ac3573e6be8b9f2cc18b5d802c0c8a2e0117 Mon Sep 17 00:00:00 2001 From: tibbi Date: Wed, 28 Nov 2018 14:01:37 +0100 Subject: [PATCH 083/134] adding some outgoing call related things --- .../contacts/pro/activities/DialerActivity.kt | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-) diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/DialerActivity.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/DialerActivity.kt index 15fb5765..ffe521f3 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/DialerActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/DialerActivity.kt @@ -137,11 +137,22 @@ class DialerActivity : SimpleActivity(), SensorEventListener { dialer_label.setText(if (isIncomingCall) R.string.incoming_call_from else R.string.calling) } + @SuppressLint("MissingPermission") private fun initOutgoingCall() { - val telecomManager = getSystemService(Context.TELECOM_SERVICE) as TelecomManager - val uri = Uri.fromParts(PhoneAccount.SCHEME_TEL, callNumber, null) - val extras = Bundle() - telecomManager.placeCall(uri, extras) + try { + val telecomManager = getSystemService(Context.TELECOM_SERVICE) as TelecomManager + val uri = Uri.fromParts(PhoneAccount.SCHEME_TEL, callNumber, null) + Bundle().apply { + putParcelable(TelecomManager.EXTRA_PHONE_ACCOUNT_HANDLE, telecomManager.getDefaultOutgoingPhoneAccount(PhoneAccount.SCHEME_TEL)) + putBoolean(TelecomManager.EXTRA_START_CALL_WITH_VIDEO_STATE, false) + putBoolean(TelecomManager.EXTRA_START_CALL_WITH_SPEAKERPHONE, false) + telecomManager.placeCall(uri, this) + } + callStatus = Call.STATE_DIALING + } catch (e: Exception) { + showErrorToast(e) + finish() + } } private fun startNotificationService() { From 35a5d62b9923e103b6eb97439d55b3ebd24a184a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9rgio=20Marques?= Date: Wed, 28 Nov 2018 13:42:29 +0000 Subject: [PATCH 084/134] Update strings.xml --- app/src/main/res/values-pt/strings.xml | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/app/src/main/res/values-pt/strings.xml b/app/src/main/res/values-pt/strings.xml index f6cf427b..e9a87323 100644 --- a/app/src/main/res/values-pt/strings.xml +++ b/app/src/main/res/values-pt/strings.xml @@ -22,7 +22,7 @@ Não existem contactos Não existem contactos com endereço de e-mail Não existem contactos com número de telefone - No recent calls found + Não existem chamadas recentes Novo contacto Editar contacto @@ -53,11 +53,11 @@ Ordenar por apelido Mostrar número de telefone no ecrã principal Mostrar miniatura do contacto - Show a dialpad button on the main screen + Mostrar botão Marcador no ecrã principal Ao tocar no contacto Ligar Ver detalhes - Gerir campos a exibir + Gerir campos a mostrar Tentar filtrar contactos duplicados Gerir separadores a exibir Contactos @@ -106,18 +106,18 @@ Nome do ficheiro (sem .vcf) - Teclado + Marcador Adicionar número a um contacto - Dialer - Calling… - Incoming call - Incoming call from… - Ongoing call - Disconnected - Decline - Answer + Marcador + A chamar… + Chamada recebida + Chamada recebida de… + Chamada efetuada + Desligada + Recusar + Atender Selecione os campos a mostrar From 8b3c08970c56c6b33e33d7fc2ec7cd530a25172e Mon Sep 17 00:00:00 2001 From: tibbi Date: Wed, 28 Nov 2018 15:19:51 +0100 Subject: [PATCH 085/134] show an incoming call screen over the lockscreen, if the screen is off --- app/src/main/AndroidManifest.xml | 3 +- .../contacts/pro/activities/DialerActivity.kt | 6 ++++ .../pro/services/MyIncomingCallService.kt | 32 +++++++++++++------ 3 files changed, 31 insertions(+), 10 deletions(-) diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index b1953893..c6b76294 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -225,7 +225,8 @@ + android:launchMode="singleTask" + android:showOnLockScreen="true"> diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/DialerActivity.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/DialerActivity.kt index ffe521f3..718781ba 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/DialerActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/DialerActivity.kt @@ -18,6 +18,7 @@ import android.os.PowerManager import android.telecom.Call import android.telecom.PhoneAccount import android.telecom.TelecomManager +import android.view.WindowManager import androidx.localbroadcastmanager.content.LocalBroadcastManager import com.simplemobiletools.commons.extensions.* import com.simplemobiletools.contacts.pro.R @@ -48,6 +49,11 @@ class DialerActivity : SimpleActivity(), SensorEventListener { setContentView(R.layout.activity_dialer) initProximityWakeLock() LocalBroadcastManager.getInstance(applicationContext).registerReceiver(messageReceiver, IntentFilter(DIALER_INTENT_FILTER)) + window.apply { + addFlags(WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED) + addFlags(WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON) + addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON) + } val action = intent.action val extras = intent.extras diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/services/MyIncomingCallService.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/services/MyIncomingCallService.kt index efc70b50..15652cb4 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/services/MyIncomingCallService.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/services/MyIncomingCallService.kt @@ -1,15 +1,17 @@ package com.simplemobiletools.contacts.pro.services import android.annotation.TargetApi +import android.app.KeyguardManager +import android.content.Context import android.content.Intent +import android.net.Uri import android.os.Build +import android.os.Bundle import android.telecom.Call import android.telecom.InCallService import androidx.localbroadcastmanager.content.LocalBroadcastManager -import com.simplemobiletools.contacts.pro.helpers.CALL_NUMBER -import com.simplemobiletools.contacts.pro.helpers.CALL_STATUS -import com.simplemobiletools.contacts.pro.helpers.DIALER_INTENT_FILTER -import com.simplemobiletools.contacts.pro.helpers.IS_INCOMING_CALL +import com.simplemobiletools.contacts.pro.activities.DialerActivity +import com.simplemobiletools.contacts.pro.helpers.* import com.simplemobiletools.contacts.pro.objects.CallManager @TargetApi(Build.VERSION_CODES.M) @@ -25,11 +27,23 @@ class MyIncomingCallService : InCallService() { handle } - Intent(this, DialerCallService::class.java).apply { - putExtra(CALL_STATUS, call.state) - putExtra(CALL_NUMBER, callerNumber) - putExtra(IS_INCOMING_CALL, true) - startService(this) + val keyguardManager = getSystemService(Context.KEYGUARD_SERVICE) as KeyguardManager + if (keyguardManager.isKeyguardLocked) { + Intent(this, DialerActivity::class.java).apply { + action = RESUME_DIALER + flags = flags or Intent.FLAG_ACTIVITY_NEW_TASK + putExtra(CALL_NUMBER, callerNumber) + putExtra(CALL_STATUS, call.state) + putExtra(IS_INCOMING_CALL, true) + startActivity(this) + } + } else { + Intent(this, DialerCallService::class.java).apply { + putExtra(CALL_STATUS, call.state) + putExtra(CALL_NUMBER, callerNumber) + putExtra(IS_INCOMING_CALL, true) + startService(this) + } } CallManager.updateCall(call) From bb19021c4923f5b9af882e45f5ba5ba35f888cda Mon Sep 17 00:00:00 2001 From: tibbi Date: Wed, 28 Nov 2018 15:29:11 +0100 Subject: [PATCH 086/134] adding some blocked number related strings --- app/src/main/res/values-az/strings.xml | 5 +++++ app/src/main/res/values-de/strings.xml | 5 +++++ app/src/main/res/values-el/strings.xml | 5 +++++ app/src/main/res/values-eu/strings.xml | 5 +++++ app/src/main/res/values-fr/strings.xml | 5 +++++ app/src/main/res/values-hr/strings.xml | 5 +++++ app/src/main/res/values-it/strings.xml | 5 +++++ app/src/main/res/values-ja/strings.xml | 5 +++++ app/src/main/res/values-ko-rKR/strings.xml | 5 +++++ app/src/main/res/values-lt/strings.xml | 5 +++++ app/src/main/res/values-pt/strings.xml | 5 +++++ app/src/main/res/values-ru/strings.xml | 5 +++++ app/src/main/res/values-sk/strings.xml | 5 +++++ app/src/main/res/values-sv/strings.xml | 5 +++++ app/src/main/res/values-tr/strings.xml | 5 +++++ app/src/main/res/values-zh-rTW/strings.xml | 5 +++++ app/src/main/res/values/strings.xml | 5 +++++ 17 files changed, 85 insertions(+) diff --git a/app/src/main/res/values-az/strings.xml b/app/src/main/res/values-az/strings.xml index 5ca969a7..995194d0 100644 --- a/app/src/main/res/values-az/strings.xml +++ b/app/src/main/res/values-az/strings.xml @@ -134,6 +134,11 @@ Kontakt kökü Instant messaging (IM) + + Manage blocked numbers + You are not blocking anyone + Add a blocked number + I want to change what fields are visible at contacts. Can I do it? Yes, all you have to do is go in Settings -> Manage shown contact fields. There you can select what fields should be visible. Some of them are even disabled by default, so you might find some new ones there. diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index a580dcf2..1136f003 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -134,6 +134,11 @@ Kontaktquelle Instant messaging (IM) + + Manage blocked numbers + You are not blocking anyone + Add a blocked number + Ich möchte die sichtbaren Kontaktfelder ändern. Kann ich das machen? Ja, alles, was Sie tun müssen ist folgendes: Gehen Sie zu Einstellungen -> Bearbeite sichtbare Kontaktfelder. Hier können die sichtbaren Felder ausgewählt werden. Einige sind standardmäßig deaktiviert, weshalb hier neue gefunden werden können. diff --git a/app/src/main/res/values-el/strings.xml b/app/src/main/res/values-el/strings.xml index ff3c487e..28b0493f 100644 --- a/app/src/main/res/values-el/strings.xml +++ b/app/src/main/res/values-el/strings.xml @@ -134,6 +134,11 @@ Προέλευση επαφής Αμεσο μήνυμα (IM) + + Manage blocked numbers + You are not blocking anyone + Add a blocked number + Θέλω να αλλάξω τα πεδία που θα είναι ορατά στις επαφές. Μπορώ να το κάνω? Ναι, το μόνο που έχετε να κάνετε είναι να μεταβείτε στις Ρυθμίσεις -> Διαχείριση εμφανιζόμενων πεδίων επαφής. Εκεί μπορείτε να επιλέξετε ποια πεδία θα πρέπει να είναι ορατά. Κάποια από αυτά είναι ακόμη και απενεργοποιημένα από προεπιλογή, επομένως ίσως βρείτε κάποια νέα εκεί. diff --git a/app/src/main/res/values-eu/strings.xml b/app/src/main/res/values-eu/strings.xml index a026a0b7..d2aa156e 100644 --- a/app/src/main/res/values-eu/strings.xml +++ b/app/src/main/res/values-eu/strings.xml @@ -134,6 +134,11 @@ Kontaktu jatorria Instant messaging (IM) + + Manage blocked numbers + You are not blocking anyone + Add a blocked number + Aldatu ditzaket kontaktuetan ikusgarri dauden eremuak? Bai, joan hona: Ezarpenak -> Kudeatu erakutsitako kontaktu eremuan. Hor hautatu dezakezu zein eremu nahi duzun ikusgarri izatea. Batzuk desaktibatuta daude era lehenetsian, berri batzuk aurkitu ditzakezu. diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml index 5517cd3b..3bc0ea35 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -134,6 +134,11 @@ Compte pour le contact Messagerie instantanée (MI) + + Manage blocked numbers + You are not blocking anyone + Add a blocked number + Je veux modifier les champs affichés sur les fiches de mes contacts. Puis-je le faire ? Oui, tout ce que vous avez à faire c\'est d\'aller dans \"Paramètres\" -> \"Configurer l\'affichage des champs de contact\". Sélectionnez les champs à afficher. Certains champs sont désactivés par défaut. diff --git a/app/src/main/res/values-hr/strings.xml b/app/src/main/res/values-hr/strings.xml index 55a0d486..c399b497 100644 --- a/app/src/main/res/values-hr/strings.xml +++ b/app/src/main/res/values-hr/strings.xml @@ -134,6 +134,11 @@ Izvori kontakata Brzo slanje poruka (IM) + + Manage blocked numbers + You are not blocking anyone + Add a blocked number + Želim promijeniti polja koja su vidljiva na kontaktima. Mogu li to napraviti? Da, sve što morate učiniti je otići u Postavke -> Upravljanje poljima za prikaz. Tamo možete odabrati polja koja bi trebala biti vidljiva. Neka od njih su čak i onemogućena prema zadanim postavkama, tako da možete pronaći neke nove. diff --git a/app/src/main/res/values-it/strings.xml b/app/src/main/res/values-it/strings.xml index 78891145..050c555e 100644 --- a/app/src/main/res/values-it/strings.xml +++ b/app/src/main/res/values-it/strings.xml @@ -134,6 +134,11 @@ Provenienza del contatto Messaggistica istantanea (IM) + + Manage blocked numbers + You are not blocking anyone + Add a blocked number + Voglio cambiare i campi visibili ai contatti. Come posso fare? Puoi farlo andando in Impostazioni -> Gestisci i campi mostrati. Qui puoi selezionare i campi che saranno visibili. Alcuni sono anche disabilitati in maniera predefinita, quindi potresti trovare qualche nuovo campo. diff --git a/app/src/main/res/values-ja/strings.xml b/app/src/main/res/values-ja/strings.xml index 41857363..3a483aa4 100644 --- a/app/src/main/res/values-ja/strings.xml +++ b/app/src/main/res/values-ja/strings.xml @@ -134,6 +134,11 @@ インポート元 Instant messaging (IM) + + Manage blocked numbers + You are not blocking anyone + Add a blocked number + 連絡先に表示される項目(フィールド)を変更することはできますか? 可能です。[設定] -> [連絡先に表示するフィールドを管理] から、表示されるフィールドを選択することができます。これらの中にはデフォルトで無効になっているものもあるので、あなたは新しいものを見つけるかもしれません。 diff --git a/app/src/main/res/values-ko-rKR/strings.xml b/app/src/main/res/values-ko-rKR/strings.xml index e2ef5362..a6ccabbf 100644 --- a/app/src/main/res/values-ko-rKR/strings.xml +++ b/app/src/main/res/values-ko-rKR/strings.xml @@ -134,6 +134,11 @@ Contact source Instant messaging (IM) + + Manage blocked numbers + You are not blocking anyone + Add a blocked number + I want to change what fields are visible at contacts. Can I do it? Yes, all you have to do is go in Settings -> Manage shown contact fields. There you can select what fields should be visible. Some of them are even disabled by default, so you might find some new ones there. diff --git a/app/src/main/res/values-lt/strings.xml b/app/src/main/res/values-lt/strings.xml index ccc4dcb4..b899039a 100644 --- a/app/src/main/res/values-lt/strings.xml +++ b/app/src/main/res/values-lt/strings.xml @@ -134,6 +134,11 @@ Kontakto šaltinis Instant messaging (IM) + + Manage blocked numbers + You are not blocking anyone + Add a blocked number + Noriu pakeisti, kokie laukai yra matomi kontaktuose. Ar galiu tai padaryti? Taip, viskas, ką jums reikia padaryti, tai eiti į Nustatymai -> Tvarkyti rodomus kontaktų laukus. Čia galite pasirinkti, kurie laukai turėtų būti matomi. Kai kurie iš jų netgi yra išjungiami pagal numatytuosius nustatymus, todėl ten galite rasti naujų. diff --git a/app/src/main/res/values-pt/strings.xml b/app/src/main/res/values-pt/strings.xml index f6cf427b..a472a14f 100644 --- a/app/src/main/res/values-pt/strings.xml +++ b/app/src/main/res/values-pt/strings.xml @@ -134,6 +134,11 @@ Origem do contacto Mensagem instantânea (IM) + + Manage blocked numbers + You are not blocking anyone + Add a blocked number + I want to change what fields are visible at contacts. Can I do it? Yes, all you have to do is go in Settings -> Manage shown contact fields. There you can select what fields should be visible. Some of them are even disabled by default, so you might find some new ones there. diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index 00358377..fa54e7b8 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -134,6 +134,11 @@ Источник контакта Мессенджеры (IM) + + Manage blocked numbers + You are not blocking anyone + Add a blocked number + Я хочу изменить поля, отображаемые у контактов. Могу ли я это сделать? Да, всё, что вам нужно сделать, это зайти в \"Настройки\" -> \"Управление отображаемыми полями контактов\". Там вы сможете выбрать, какие поля должны быть видимы. Некоторые из них даже отключены по умолчанию, так что вы можете найти некоторые новые. diff --git a/app/src/main/res/values-sk/strings.xml b/app/src/main/res/values-sk/strings.xml index 4e8563bf..e8f5a884 100644 --- a/app/src/main/res/values-sk/strings.xml +++ b/app/src/main/res/values-sk/strings.xml @@ -134,6 +134,11 @@ Zdroje kontaktov Rýchle správy (IM) + + Spravovať blokované čísla + Neblokujete nikoho + Pridať blokované číslo + Chcem upraviť viditeľné polia kontaktov. Dá sa to? Áno, stačí ísť do Nastavenia -> Spravovať zobrazené polia kontaktov. Tam si viete zvoliť, ktoré polia majú byť viditeľné. Niektoré sú v predvolenom stave vypnuté, čiže tam môžete objaviť aj nové. diff --git a/app/src/main/res/values-sv/strings.xml b/app/src/main/res/values-sv/strings.xml index 7c58fa17..10aa4d33 100644 --- a/app/src/main/res/values-sv/strings.xml +++ b/app/src/main/res/values-sv/strings.xml @@ -134,6 +134,11 @@ Kontaktkälla Snabbmeddelanden (IM) + + Manage blocked numbers + You are not blocking anyone + Add a blocked number + I want to change what fields are visible at contacts. Can I do it? Yes, all you have to do is go in Settings -> Manage shown contact fields. There you can select what fields should be visible. Some of them are even disabled by default, so you might find some new ones there. diff --git a/app/src/main/res/values-tr/strings.xml b/app/src/main/res/values-tr/strings.xml index 7f45af41..668cfe43 100644 --- a/app/src/main/res/values-tr/strings.xml +++ b/app/src/main/res/values-tr/strings.xml @@ -134,6 +134,11 @@ Kişi kaynağı Anlık mesajlaşma (IM) + + Manage blocked numbers + You are not blocking anyone + Add a blocked number + Rehberde görüntülenecek alanları değiştirmek istiyorum. Bunu yapabilir miyim? Evet, tek yapmanız gereken Ayarlar -> Görüntülenecek kişi alanlarını yönet\'e gitmek. Orada hangi alanların görüntüleneceğini seçebilirsiniz. Bazıları varsayılan olarak devre dışı bile olsa, orada bazı yenilerini bulabilirsiniz. diff --git a/app/src/main/res/values-zh-rTW/strings.xml b/app/src/main/res/values-zh-rTW/strings.xml index 566b5c1d..1cd8bdd2 100644 --- a/app/src/main/res/values-zh-rTW/strings.xml +++ b/app/src/main/res/values-zh-rTW/strings.xml @@ -134,6 +134,11 @@ 聯絡人來源 即時通訊 (IM) + + Manage blocked numbers + You are not blocking anyone + Add a blocked number + 我想要更改在通訊錄會看到哪些欄位。我能這麼做嗎? 可以,你要做的是到[設定] -> [管理顯示的聯絡人欄位]。在那裡,你可以選擇應該看到什麼欄位。其中有些甚至預設是關閉的,所以你可能會在那裡發現一些新的。 diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 89f22d7a..e5ea598e 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -134,6 +134,11 @@ Contact source Instant messaging (IM) + + Manage blocked numbers + You are not blocking anyone + Add a blocked number + I want to change what fields are visible at contacts. Can I do it? Yes, all you have to do is go in Settings -> Manage shown contact fields. There you can select what fields should be visible. Some of them are even disabled by default, so you might find some new ones there. From f96f2bca222454f8790857f9bec30654d9e05768 Mon Sep 17 00:00:00 2001 From: tibbi Date: Wed, 28 Nov 2018 20:52:09 +0100 Subject: [PATCH 087/134] adding some animating dots like Calling... on the caller screen --- .../contacts/pro/activities/DialerActivity.kt | 41 +++++++++++++++---- app/src/main/res/layout/activity_dialer.xml | 13 +++++- app/src/main/res/values-az/strings.xml | 2 +- app/src/main/res/values-de/strings.xml | 2 +- app/src/main/res/values-el/strings.xml | 2 +- app/src/main/res/values-eu/strings.xml | 2 +- app/src/main/res/values-fr/strings.xml | 2 +- app/src/main/res/values-hr/strings.xml | 2 +- app/src/main/res/values-it/strings.xml | 2 +- app/src/main/res/values-ja/strings.xml | 2 +- app/src/main/res/values-ko-rKR/strings.xml | 2 +- app/src/main/res/values-lt/strings.xml | 2 +- app/src/main/res/values-pt/strings.xml | 2 +- app/src/main/res/values-ru/strings.xml | 2 +- app/src/main/res/values-sk/strings.xml | 2 +- app/src/main/res/values-sv/strings.xml | 2 +- app/src/main/res/values-tr/strings.xml | 2 +- app/src/main/res/values-zh-rTW/strings.xml | 2 +- app/src/main/res/values/strings.xml | 2 +- 19 files changed, 61 insertions(+), 27 deletions(-) diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/DialerActivity.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/DialerActivity.kt index 718781ba..e93389b5 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/DialerActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/DialerActivity.kt @@ -25,6 +25,7 @@ import com.simplemobiletools.contacts.pro.R import com.simplemobiletools.contacts.pro.helpers.* import com.simplemobiletools.contacts.pro.models.Contact import com.simplemobiletools.contacts.pro.objects.CallManager +import com.simplemobiletools.contacts.pro.overloads.times import com.simplemobiletools.contacts.pro.services.DialerCallService import kotlinx.android.synthetic.main.activity_dialer.* @@ -33,16 +34,19 @@ import kotlinx.android.synthetic.main.activity_dialer.* class DialerActivity : SimpleActivity(), SensorEventListener { private val SENSOR_SENSITIVITY = 4 private val DISCONNECT_DELAY = 3000L + private val CALLING_DOT_ANIMATION_DELAY = 500L private var callNumber = "" private var callStatus = Call.STATE_NEW private var isIncomingCall = false private var isCallActive = false private var callDuration = 0 + private var callingDotsCnt = 0 private var sensorManager: SensorManager? = null private var proximity: Sensor? = null private var proximityWakeLock: PowerManager.WakeLock? = null private var timerHandler = Handler() + private var callingDotsHandler = Handler() override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) @@ -59,27 +63,27 @@ class DialerActivity : SimpleActivity(), SensorEventListener { val extras = intent.extras if (extras?.getBoolean(ANSWER_CALL, false) == true) { callNumber = intent.getStringExtra(CALL_NUMBER) - initViews() CallManager.answerCall() - tryFillingOtherEndsName() + tryFillingOtherParticipantsName() + initViews() } else if (action == Intent.ACTION_CALL && intent.data != null && intent.dataString?.contains("tel:") == true) { callNumber = Uri.decode(intent.dataString).substringAfter("tel:") - initViews() - tryFillingOtherEndsName() + tryFillingOtherParticipantsName() initOutgoingCall() + initViews() } else if (action == INCOMING_CALL && extras?.containsKey(CALL_NUMBER) == true && extras.containsKey(CALL_STATUS)) { isIncomingCall = true callNumber = intent.getStringExtra(CALL_NUMBER) initViews() updateUI(intent.getIntExtra(CALL_STATUS, Call.STATE_NEW)) - tryFillingOtherEndsName() + tryFillingOtherParticipantsName() } else if (action == RESUME_DIALER && extras?.containsKey(CALL_NUMBER) == true && extras.containsKey(CALL_STATUS) && extras.containsKey(IS_INCOMING_CALL)) { callNumber = intent.getStringExtra(CALL_NUMBER) callStatus = intent.getIntExtra(CALL_STATUS, Call.STATE_NEW) isIncomingCall = intent.getBooleanExtra(IS_INCOMING_CALL, false) - initViews() updateUI(callStatus) - tryFillingOtherEndsName() + tryFillingOtherParticipantsName() + initViews() } else { toast(R.string.unknown_error_occurred) finish() @@ -103,6 +107,7 @@ class DialerActivity : SimpleActivity(), SensorEventListener { override fun onDestroy() { super.onDestroy() timerHandler.removeCallbacksAndMessages(null) + callingDotsHandler.removeCallbacksAndMessages(null) } private val messageReceiver = object : BroadcastReceiver() { @@ -120,6 +125,17 @@ class DialerActivity : SimpleActivity(), SensorEventListener { } } + // animate the dots after Calling... from 0 to 3 + private fun handleDotsAnimation() { + callingDotsHandler.postDelayed({ + if (callStatus == Call.STATE_DIALING) { + callingDotsCnt = ++callingDotsCnt % 4 + dialer_label_dots.text = ".".times(callingDotsCnt) + handleDotsAnimation() + } + }, CALLING_DOT_ANIMATION_DELAY) + } + private fun initProximityWakeLock() { sensorManager = getSystemService(Context.SENSOR_SERVICE) as SensorManager proximity = sensorManager!!.getDefaultSensor(Sensor.TYPE_PROXIMITY) @@ -141,6 +157,9 @@ class DialerActivity : SimpleActivity(), SensorEventListener { dialer_incoming_accept.beVisibleIf(isIncomingCall) dialer_label.setText(if (isIncomingCall) R.string.incoming_call_from else R.string.calling) + if (!isIncomingCall) { + handleDotsAnimation() + } } @SuppressLint("MissingPermission") @@ -183,7 +202,7 @@ class DialerActivity : SimpleActivity(), SensorEventListener { finish() } - private fun tryFillingOtherEndsName() { + private fun tryFillingOtherParticipantsName() { ContactsHelper(this).getContactWithNumber(callNumber) { runOnUiThread { updateOtherParticipant(it) @@ -200,6 +219,8 @@ class DialerActivity : SimpleActivity(), SensorEventListener { } private fun statusActive() { + callingDotsHandler.removeCallbacksAndMessages(null) + dialer_label_dots.beGone() startNotificationService() isCallActive = true dialer_call_duration.beVisible() @@ -222,8 +243,10 @@ class DialerActivity : SimpleActivity(), SensorEventListener { } private fun statusDisconnected() { - stopNotificationService() + callingDotsHandler.removeCallbacksAndMessages(null) timerHandler.removeCallbacksAndMessages(null) + dialer_label_dots.beGone() + stopNotificationService() dialer_hangup_button.beGone() dialer_label.setText(R.string.disconnected) if (isCallActive) { diff --git a/app/src/main/res/layout/activity_dialer.xml b/app/src/main/res/layout/activity_dialer.xml index 163e4d1d..3fbf37e2 100644 --- a/app/src/main/res/layout/activity_dialer.xml +++ b/app/src/main/res/layout/activity_dialer.xml @@ -9,7 +9,7 @@ + + Dialer - Calling… + Calling Incoming call Incoming call from… Ongoing call diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index 1136f003..fc739f15 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -111,7 +111,7 @@ Dialer - Calling… + Calling Incoming call Incoming call from… Ongoing call diff --git a/app/src/main/res/values-el/strings.xml b/app/src/main/res/values-el/strings.xml index 28b0493f..32a09788 100644 --- a/app/src/main/res/values-el/strings.xml +++ b/app/src/main/res/values-el/strings.xml @@ -111,7 +111,7 @@ Dialer - Calling… + Calling Incoming call Incoming call from… Ongoing call diff --git a/app/src/main/res/values-eu/strings.xml b/app/src/main/res/values-eu/strings.xml index d2aa156e..54c1509e 100644 --- a/app/src/main/res/values-eu/strings.xml +++ b/app/src/main/res/values-eu/strings.xml @@ -111,7 +111,7 @@ Dialer - Calling… + Calling Incoming call Incoming call from… Ongoing call diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml index 3bc0ea35..ec36df93 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -111,7 +111,7 @@ Numéroteur - Appel en cours… + Appel en cours Appel entrant Appel entrant de… Appel en cours diff --git a/app/src/main/res/values-hr/strings.xml b/app/src/main/res/values-hr/strings.xml index c399b497..d58121ed 100644 --- a/app/src/main/res/values-hr/strings.xml +++ b/app/src/main/res/values-hr/strings.xml @@ -111,7 +111,7 @@ Dialer - Calling… + Calling Incoming call Incoming call from… Ongoing call diff --git a/app/src/main/res/values-it/strings.xml b/app/src/main/res/values-it/strings.xml index 050c555e..39c3744a 100644 --- a/app/src/main/res/values-it/strings.xml +++ b/app/src/main/res/values-it/strings.xml @@ -111,7 +111,7 @@ Compositore - Chiamata in corso… + Chiamata in corso Chiamata in arrivo Chiamata in arrivo da… Chiamata in corso diff --git a/app/src/main/res/values-ja/strings.xml b/app/src/main/res/values-ja/strings.xml index 3a483aa4..2b373afe 100644 --- a/app/src/main/res/values-ja/strings.xml +++ b/app/src/main/res/values-ja/strings.xml @@ -111,7 +111,7 @@ 電話 - 発信中… + 発信中 Incoming call 着信中… 通話中 diff --git a/app/src/main/res/values-ko-rKR/strings.xml b/app/src/main/res/values-ko-rKR/strings.xml index a6ccabbf..b28f64d1 100644 --- a/app/src/main/res/values-ko-rKR/strings.xml +++ b/app/src/main/res/values-ko-rKR/strings.xml @@ -111,7 +111,7 @@ Dialer - Calling… + Calling Incoming call Incoming call from… Ongoing call diff --git a/app/src/main/res/values-lt/strings.xml b/app/src/main/res/values-lt/strings.xml index b899039a..4832acc5 100644 --- a/app/src/main/res/values-lt/strings.xml +++ b/app/src/main/res/values-lt/strings.xml @@ -111,7 +111,7 @@ Dialer - Calling… + Calling Incoming call Incoming call from… Ongoing call diff --git a/app/src/main/res/values-pt/strings.xml b/app/src/main/res/values-pt/strings.xml index b447dbf5..715ded7b 100644 --- a/app/src/main/res/values-pt/strings.xml +++ b/app/src/main/res/values-pt/strings.xml @@ -111,7 +111,7 @@ Marcador - A chamar… + A chamar Chamada recebida Chamada recebida de… Chamada efetuada diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index fa54e7b8..23dbd7d1 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -111,7 +111,7 @@ Dialer - Calling… + Calling Incoming call Incoming call from… Ongoing call diff --git a/app/src/main/res/values-sk/strings.xml b/app/src/main/res/values-sk/strings.xml index e8f5a884..993b9302 100644 --- a/app/src/main/res/values-sk/strings.xml +++ b/app/src/main/res/values-sk/strings.xml @@ -111,7 +111,7 @@ Telefón - Vytáča sa… + Vytáča sa Prichádzajúci hovor Prichádzajúci hovor od… Prebiehajúci hovor diff --git a/app/src/main/res/values-sv/strings.xml b/app/src/main/res/values-sv/strings.xml index 10aa4d33..282f5518 100644 --- a/app/src/main/res/values-sv/strings.xml +++ b/app/src/main/res/values-sv/strings.xml @@ -111,7 +111,7 @@ Dialer - Calling… + Calling Incoming call Incoming call from… Ongoing call diff --git a/app/src/main/res/values-tr/strings.xml b/app/src/main/res/values-tr/strings.xml index 668cfe43..f1c49df0 100644 --- a/app/src/main/res/values-tr/strings.xml +++ b/app/src/main/res/values-tr/strings.xml @@ -111,7 +111,7 @@ Dialer - Calling… + Calling Incoming call Incoming call from… Ongoing call diff --git a/app/src/main/res/values-zh-rTW/strings.xml b/app/src/main/res/values-zh-rTW/strings.xml index 1cd8bdd2..2421d03f 100644 --- a/app/src/main/res/values-zh-rTW/strings.xml +++ b/app/src/main/res/values-zh-rTW/strings.xml @@ -111,7 +111,7 @@ 撥號器 - 撥號中… + 撥號中 來電 通話來自於… 持續通話 diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index e5ea598e..039a360b 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -111,7 +111,7 @@ Dialer - Calling… + Calling Incoming call Incoming call from… Ongoing call From 7c0661983d95003d4ce2294050803cd4a37d16ac Mon Sep 17 00:00:00 2001 From: tibbi Date: Wed, 28 Nov 2018 21:52:38 +0100 Subject: [PATCH 088/134] moving some Activity extension responsibilities to Context --- app/build.gradle | 2 +- .../contacts/pro/extensions/Activity.kt | 101 --------- .../contacts/pro/extensions/Context.kt | 104 ++++++++- .../contacts/pro/helpers/ContactsHelper.kt | 199 +++++++++--------- .../pro/helpers/LocalContactsHelper.kt | 28 +-- 5 files changed, 215 insertions(+), 219 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index d70f8bcb..481b78b3 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -51,7 +51,7 @@ android { } dependencies { - implementation 'com.simplemobiletools:commons:5.4.7' + implementation 'com.simplemobiletools:commons:5.5.0' implementation 'joda-time:joda-time:2.10.1' implementation 'androidx.constraintlayout:constraintlayout:2.0.0-alpha2' implementation 'com.googlecode.ez-vcard:ez-vcard:0.10.4' diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/extensions/Activity.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/extensions/Activity.kt index 0b4d439d..cda4b77a 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/extensions/Activity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/extensions/Activity.kt @@ -1,9 +1,7 @@ package com.simplemobiletools.contacts.pro.extensions -import android.app.Activity import android.content.Intent import android.net.Uri -import android.provider.ContactsContract import com.simplemobiletools.commons.activities.BaseSimpleActivity import com.simplemobiletools.commons.dialogs.RadioGroupDialog import com.simplemobiletools.commons.extensions.sharePathIntent @@ -17,8 +15,6 @@ import com.simplemobiletools.contacts.pro.activities.SimpleActivity import com.simplemobiletools.contacts.pro.dialogs.CallConfirmationDialog import com.simplemobiletools.contacts.pro.helpers.* import com.simplemobiletools.contacts.pro.models.Contact -import com.simplemobiletools.contacts.pro.models.ContactSource -import java.io.File fun SimpleActivity.startCallIntent(recipient: String) { handlePermission(PERMISSION_CALL_PHONE) { @@ -93,13 +89,6 @@ fun SimpleActivity.showContactSourcePicker(currentSource: String, callback: (new } } -fun SimpleActivity.getPublicContactSource(source: String): String { - return when (source) { - config.localAccountName -> getString(R.string.phone_storage) - SMT_PRIVATE -> getString(R.string.phone_storage_hidden) - else -> source - } -} fun BaseSimpleActivity.shareContacts(contacts: ArrayList) { val file = getTempFile() @@ -117,96 +106,6 @@ fun BaseSimpleActivity.shareContacts(contacts: ArrayList) { } } -fun BaseSimpleActivity.sendSMSToContacts(contacts: ArrayList) { - val numbers = StringBuilder() - contacts.forEach { - val number = it.phoneNumbers.firstOrNull { it.type == ContactsContract.CommonDataKinds.Phone.TYPE_MOBILE } - ?: it.phoneNumbers.firstOrNull() - if (number != null) { - numbers.append("${number.value};") - } - - val uriString = "smsto:${numbers.toString().trimEnd(';')}" - Intent(Intent.ACTION_SENDTO, Uri.parse(uriString)).apply { - if (resolveActivity(packageManager) != null) { - startActivity(this) - } else { - toast(R.string.no_app_found) - } - } - } -} - -fun BaseSimpleActivity.sendEmailToContacts(contacts: ArrayList) { - val emails = ArrayList() - contacts.forEach { - it.emails.forEach { - if (it.value.isNotEmpty()) { - emails.add(it.value) - } - } - } - - Intent(Intent.ACTION_SEND_MULTIPLE).apply { - type = "message/rfc822" - putExtra(Intent.EXTRA_EMAIL, emails.toTypedArray()) - if (resolveActivity(packageManager) != null) { - startActivity(this) - } else { - toast(R.string.no_app_found) - } - } -} - -fun BaseSimpleActivity.getTempFile(): File? { - val folder = File(cacheDir, "contacts") - if (!folder.exists()) { - if (!folder.mkdir()) { - toast(R.string.unknown_error_occurred) - return null - } - } - - return File(folder, "contacts.vcf") -} - -fun BaseSimpleActivity.addContactsToGroup(contacts: ArrayList, groupId: Long) { - val publicContacts = contacts.filter { it.source != SMT_PRIVATE }.toMutableList() as ArrayList - val privateContacts = contacts.filter { it.source == SMT_PRIVATE }.toMutableList() as ArrayList - if (publicContacts.isNotEmpty()) { - ContactsHelper(this).addContactsToGroup(publicContacts, groupId) - } - - if (privateContacts.isNotEmpty()) { - LocalContactsHelper(this).addContactsToGroup(privateContacts, groupId) - } -} - -fun BaseSimpleActivity.removeContactsFromGroup(contacts: ArrayList, groupId: Long) { - val publicContacts = contacts.filter { it.source != SMT_PRIVATE }.toMutableList() as ArrayList - val privateContacts = contacts.filter { it.source == SMT_PRIVATE }.toMutableList() as ArrayList - if (publicContacts.isNotEmpty() && hasContactPermissions()) { - ContactsHelper(this).removeContactsFromGroup(publicContacts, groupId) - } - - if (privateContacts.isNotEmpty()) { - LocalContactsHelper(this).removeContactsFromGroup(privateContacts, groupId) - } -} - -fun BaseSimpleActivity.getContactPublicUri(contact: Contact): Uri { - val lookupKey = ContactsHelper(this).getContactLookupKey(contact.id.toString()) - return Uri.withAppendedPath(ContactsContract.Contacts.CONTENT_LOOKUP_URI, lookupKey) -} - -fun Activity.getVisibleContactSources(): ArrayList { - val sources = ContactsHelper(this).getDeviceContactSources() - sources.add(ContactSource(getString(R.string.phone_storage_hidden), SMT_PRIVATE)) - val sourceNames = ArrayList(sources).map { if (it.type == SMT_PRIVATE) SMT_PRIVATE else it.name }.toMutableList() as ArrayList - sourceNames.removeAll(config.ignoredContactSources) - return sourceNames -} - fun SimpleActivity.contactClicked(contact: Contact) { when (config.onContactClick) { ON_CLICK_CALL_CONTACT -> callContact(contact) diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/extensions/Context.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/extensions/Context.kt index cf675e63..0f221c25 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/extensions/Context.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/extensions/Context.kt @@ -16,13 +16,11 @@ import com.simplemobiletools.contacts.pro.R import com.simplemobiletools.contacts.pro.activities.EditContactActivity import com.simplemobiletools.contacts.pro.activities.ViewContactActivity import com.simplemobiletools.contacts.pro.databases.ContactsDatabase -import com.simplemobiletools.contacts.pro.helpers.CONTACT_ID -import com.simplemobiletools.contacts.pro.helpers.Config -import com.simplemobiletools.contacts.pro.helpers.IS_PRIVATE -import com.simplemobiletools.contacts.pro.helpers.SMT_PRIVATE +import com.simplemobiletools.contacts.pro.helpers.* import com.simplemobiletools.contacts.pro.interfaces.ContactsDao import com.simplemobiletools.contacts.pro.interfaces.GroupsDao import com.simplemobiletools.contacts.pro.models.Contact +import com.simplemobiletools.contacts.pro.models.ContactSource import com.simplemobiletools.contacts.pro.models.Organization import java.io.File @@ -184,3 +182,101 @@ fun Context.getPhotoThumbnailSize(): Int { } fun Context.hasContactPermissions() = hasPermission(PERMISSION_READ_CONTACTS) && hasPermission(PERMISSION_WRITE_CONTACTS) + +fun Context.getPublicContactSource(source: String): String { + return when (source) { + config.localAccountName -> getString(R.string.phone_storage) + SMT_PRIVATE -> getString(R.string.phone_storage_hidden) + else -> source + } +} + +fun Context.sendSMSToContacts(contacts: ArrayList) { + val numbers = StringBuilder() + contacts.forEach { + val number = it.phoneNumbers.firstOrNull { it.type == ContactsContract.CommonDataKinds.Phone.TYPE_MOBILE } + ?: it.phoneNumbers.firstOrNull() + if (number != null) { + numbers.append("${number.value};") + } + + val uriString = "smsto:${numbers.toString().trimEnd(';')}" + Intent(Intent.ACTION_SENDTO, Uri.parse(uriString)).apply { + if (resolveActivity(packageManager) != null) { + startActivity(this) + } else { + toast(R.string.no_app_found) + } + } + } +} + +fun Context.sendEmailToContacts(contacts: ArrayList) { + val emails = ArrayList() + contacts.forEach { + it.emails.forEach { + if (it.value.isNotEmpty()) { + emails.add(it.value) + } + } + } + + Intent(Intent.ACTION_SEND_MULTIPLE).apply { + type = "message/rfc822" + putExtra(Intent.EXTRA_EMAIL, emails.toTypedArray()) + if (resolveActivity(packageManager) != null) { + startActivity(this) + } else { + toast(R.string.no_app_found) + } + } +} + +fun Context.getTempFile(): File? { + val folder = File(cacheDir, "contacts") + if (!folder.exists()) { + if (!folder.mkdir()) { + toast(R.string.unknown_error_occurred) + return null + } + } + + return File(folder, "contacts.vcf") +} + +fun Context.addContactsToGroup(contacts: ArrayList, groupId: Long) { + val publicContacts = contacts.filter { it.source != SMT_PRIVATE }.toMutableList() as ArrayList + val privateContacts = contacts.filter { it.source == SMT_PRIVATE }.toMutableList() as ArrayList + if (publicContacts.isNotEmpty()) { + ContactsHelper(this).addContactsToGroup(publicContacts, groupId) + } + + if (privateContacts.isNotEmpty()) { + LocalContactsHelper(this).addContactsToGroup(privateContacts, groupId) + } +} + +fun Context.removeContactsFromGroup(contacts: ArrayList, groupId: Long) { + val publicContacts = contacts.filter { it.source != SMT_PRIVATE }.toMutableList() as ArrayList + val privateContacts = contacts.filter { it.source == SMT_PRIVATE }.toMutableList() as ArrayList + if (publicContacts.isNotEmpty() && hasContactPermissions()) { + ContactsHelper(this).removeContactsFromGroup(publicContacts, groupId) + } + + if (privateContacts.isNotEmpty()) { + LocalContactsHelper(this).removeContactsFromGroup(privateContacts, groupId) + } +} + +fun Context.getContactPublicUri(contact: Contact): Uri { + val lookupKey = ContactsHelper(this).getContactLookupKey(contact.id.toString()) + return Uri.withAppendedPath(ContactsContract.Contacts.CONTENT_LOOKUP_URI, lookupKey) +} + +fun Context.getVisibleContactSources(): ArrayList { + val sources = ContactsHelper(this).getDeviceContactSources() + sources.add(ContactSource(getString(R.string.phone_storage_hidden), SMT_PRIVATE)) + val sourceNames = ArrayList(sources).map { if (it.type == SMT_PRIVATE) SMT_PRIVATE else it.name }.toMutableList() as ArrayList + sourceNames.removeAll(config.ignoredContactSources) + return sourceNames +} diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/helpers/ContactsHelper.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/helpers/ContactsHelper.kt index 1ab00f31..ac2312a9 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/helpers/ContactsHelper.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/helpers/ContactsHelper.kt @@ -3,11 +3,12 @@ package com.simplemobiletools.contacts.pro.helpers import android.accounts.Account import android.accounts.AccountManager import android.annotation.SuppressLint -import android.app.Activity import android.content.* import android.database.Cursor import android.graphics.Bitmap import android.net.Uri +import android.os.Handler +import android.os.Looper import android.provider.CallLog import android.provider.ContactsContract import android.provider.ContactsContract.CommonDataKinds @@ -26,24 +27,24 @@ import java.text.SimpleDateFormat import java.util.* import kotlin.collections.ArrayList -class ContactsHelper(val activity: Activity) { +class ContactsHelper(val context: Context) { private val BATCH_SIZE = 100 private var displayContactSources = ArrayList() fun getContacts(callback: (ArrayList) -> Unit) { Thread { val contacts = SparseArray() - displayContactSources = activity.getVisibleContactSources() + displayContactSources = context.getVisibleContactSources() getDeviceContacts(contacts) if (displayContactSources.contains(SMT_PRIVATE)) { - LocalContactsHelper(activity).getAllContacts().forEach { + LocalContactsHelper(context).getAllContacts().forEach { contacts.put(it.id, it) } } val contactsSize = contacts.size() - val showOnlyContactsWithNumbers = activity.config.showOnlyContactsWithNumbers + val showOnlyContactsWithNumbers = context.config.showOnlyContactsWithNumbers var tempContacts = ArrayList(contactsSize) val resultContacts = ArrayList(contactsSize) @@ -57,7 +58,7 @@ class ContactsHelper(val activity: Activity) { contacts.valueAt(it) } - if (activity.config.filterDuplicates) { + if (context.config.filterDuplicates) { tempContacts = tempContacts.distinctBy { it.getHashToCompare() } as ArrayList @@ -82,11 +83,11 @@ class ContactsHelper(val activity: Activity) { resultContacts.firstOrNull { it.contactId == key }?.groups = groups.valueAt(i) } - Contact.sorting = activity.config.sorting - Contact.startWithSurname = activity.config.startNameWithSurname + Contact.sorting = context.config.sorting + Contact.startWithSurname = context.config.startNameWithSurname resultContacts.sort() - activity.runOnUiThread { + Handler(Looper.getMainLooper()).post { callback(resultContacts) } }.start() @@ -101,19 +102,19 @@ class ContactsHelper(val activity: Activity) { var cursor: Cursor? = null try { - cursor = activity.contentResolver.query(uri, projection, selection, selectionArgs, null) + cursor = context.contentResolver.query(uri, projection, selection, selectionArgs, null) if (cursor?.moveToFirst() == true) { val id = cursor.getIntValue(ContactsContract.Data.RAW_CONTACT_ID) callback(getContactWithId(id, false)) return@Thread } } catch (e: Exception) { - activity.showErrorToast(e) + context.showErrorToast(e) } finally { cursor?.close() } - callback(LocalContactsHelper(activity).getContactWithNumber(number)) + callback(LocalContactsHelper(context).getContactWithNumber(number)) }.start() } @@ -127,7 +128,7 @@ class ContactsHelper(val activity: Activity) { val sources = HashSet() var cursor: Cursor? = null try { - cursor = activity.contentResolver.query(uri, projection, null, null, null) + cursor = context.contentResolver.query(uri, projection, null, null, null) if (cursor?.moveToFirst() == true) { do { val name = cursor.getStringValue(ContactsContract.RawContacts.ACCOUNT_NAME) ?: "" @@ -145,7 +146,7 @@ class ContactsHelper(val activity: Activity) { } private fun getDeviceContacts(contacts: SparseArray) { - if (!activity.hasContactPermissions()) { + if (!context.hasContactPermissions()) { return } @@ -157,7 +158,7 @@ class ContactsHelper(val activity: Activity) { var cursor: Cursor? = null try { - cursor = activity.contentResolver.query(uri, projection, selection, selectionArgs, sortOrder) + cursor = context.contentResolver.query(uri, projection, selection, selectionArgs, sortOrder) if (cursor?.moveToFirst() == true) { do { val id = cursor.getIntValue(ContactsContract.Data.RAW_CONTACT_ID) @@ -188,7 +189,7 @@ class ContactsHelper(val activity: Activity) { } while (cursor.moveToNext()) } } catch (e: Exception) { - activity.showErrorToast(e) + context.showErrorToast(e) } finally { cursor?.close() } @@ -276,7 +277,7 @@ class ContactsHelper(val activity: Activity) { var cursor: Cursor? = null try { - cursor = activity.contentResolver.query(uri, projection, selection, selectionArgs, null) + cursor = context.contentResolver.query(uri, projection, selection, selectionArgs, null) if (cursor?.moveToFirst() == true) { do { val id = cursor.getIntValue(ContactsContract.Data.RAW_CONTACT_ID) @@ -294,7 +295,7 @@ class ContactsHelper(val activity: Activity) { } while (cursor.moveToNext()) } } catch (e: Exception) { - activity.showErrorToast(e) + context.showErrorToast(e) } finally { cursor?.close() } @@ -315,7 +316,7 @@ class ContactsHelper(val activity: Activity) { var cursor: Cursor? = null try { - cursor = activity.contentResolver.query(uri, projection, selection, selectionArgs, null) + cursor = context.contentResolver.query(uri, projection, selection, selectionArgs, null) if (cursor?.moveToFirst() == true) { do { val id = cursor.getIntValue(ContactsContract.Data.RAW_CONTACT_ID) @@ -324,7 +325,7 @@ class ContactsHelper(val activity: Activity) { } while (cursor.moveToNext()) } } catch (e: Exception) { - activity.showErrorToast(e) + context.showErrorToast(e) } finally { cursor?.close() } @@ -347,7 +348,7 @@ class ContactsHelper(val activity: Activity) { var cursor: Cursor? = null try { - cursor = activity.contentResolver.query(uri, projection, selection, selectionArgs, null) + cursor = context.contentResolver.query(uri, projection, selection, selectionArgs, null) if (cursor?.moveToFirst() == true) { do { val id = cursor.getIntValue(ContactsContract.Data.RAW_CONTACT_ID) @@ -363,7 +364,7 @@ class ContactsHelper(val activity: Activity) { } while (cursor.moveToNext()) } } catch (e: Exception) { - activity.showErrorToast(e) + context.showErrorToast(e) } finally { cursor?.close() } @@ -386,7 +387,7 @@ class ContactsHelper(val activity: Activity) { var cursor: Cursor? = null try { - cursor = activity.contentResolver.query(uri, projection, selection, selectionArgs, null) + cursor = context.contentResolver.query(uri, projection, selection, selectionArgs, null) if (cursor?.moveToFirst() == true) { do { val id = cursor.getIntValue(ContactsContract.Data.RAW_CONTACT_ID) @@ -402,7 +403,7 @@ class ContactsHelper(val activity: Activity) { } while (cursor.moveToNext()) } } catch (e: Exception) { - activity.showErrorToast(e) + context.showErrorToast(e) } finally { cursor?.close() } @@ -425,7 +426,7 @@ class ContactsHelper(val activity: Activity) { var cursor: Cursor? = null try { - cursor = activity.contentResolver.query(uri, projection, selection, selectionArgs, null) + cursor = context.contentResolver.query(uri, projection, selection, selectionArgs, null) if (cursor?.moveToFirst() == true) { do { val id = cursor.getIntValue(ContactsContract.Data.RAW_CONTACT_ID) @@ -441,7 +442,7 @@ class ContactsHelper(val activity: Activity) { } while (cursor.moveToNext()) } } catch (e: Exception) { - activity.showErrorToast(e) + context.showErrorToast(e) } finally { cursor?.close() } @@ -463,7 +464,7 @@ class ContactsHelper(val activity: Activity) { var cursor: Cursor? = null try { - cursor = activity.contentResolver.query(uri, projection, selection, selectionArgs, null) + cursor = context.contentResolver.query(uri, projection, selection, selectionArgs, null) if (cursor?.moveToFirst() == true) { do { val id = cursor.getIntValue(ContactsContract.Data.RAW_CONTACT_ID) @@ -478,7 +479,7 @@ class ContactsHelper(val activity: Activity) { } while (cursor.moveToNext()) } } catch (e: Exception) { - activity.showErrorToast(e) + context.showErrorToast(e) } finally { cursor?.close() } @@ -499,7 +500,7 @@ class ContactsHelper(val activity: Activity) { var cursor: Cursor? = null try { - cursor = activity.contentResolver.query(uri, projection, selection, selectionArgs, null) + cursor = context.contentResolver.query(uri, projection, selection, selectionArgs, null) if (cursor?.moveToFirst() == true) { do { val id = cursor.getIntValue(ContactsContract.Data.RAW_CONTACT_ID) @@ -508,7 +509,7 @@ class ContactsHelper(val activity: Activity) { } while (cursor.moveToNext()) } } catch (e: Exception) { - activity.showErrorToast(e) + context.showErrorToast(e) } finally { cursor?.close() } @@ -530,7 +531,7 @@ class ContactsHelper(val activity: Activity) { var cursor: Cursor? = null try { - cursor = activity.contentResolver.query(uri, projection, selection, selectionArgs, null) + cursor = context.contentResolver.query(uri, projection, selection, selectionArgs, null) if (cursor?.moveToFirst() == true) { do { val id = cursor.getIntValue(ContactsContract.Data.RAW_CONTACT_ID) @@ -545,7 +546,7 @@ class ContactsHelper(val activity: Activity) { } while (cursor.moveToNext()) } } catch (e: Exception) { - activity.showErrorToast(e) + context.showErrorToast(e) } finally { cursor?.close() } @@ -566,7 +567,7 @@ class ContactsHelper(val activity: Activity) { var cursor: Cursor? = null try { - cursor = activity.contentResolver.query(uri, projection, selection, selectionArgs, null) + cursor = context.contentResolver.query(uri, projection, selection, selectionArgs, null) if (cursor?.moveToFirst() == true) { do { val id = cursor.getIntValue(ContactsContract.Data.RAW_CONTACT_ID) @@ -580,7 +581,7 @@ class ContactsHelper(val activity: Activity) { } while (cursor.moveToNext()) } } catch (e: Exception) { - activity.showErrorToast(e) + context.showErrorToast(e) } finally { cursor?.close() } @@ -590,7 +591,7 @@ class ContactsHelper(val activity: Activity) { private fun getContactGroups(storedGroups: ArrayList, contactId: Int? = null): SparseArray> { val groups = SparseArray>() - if (!activity.hasContactPermissions()) { + if (!context.hasContactPermissions()) { return groups } @@ -605,7 +606,7 @@ class ContactsHelper(val activity: Activity) { var cursor: Cursor? = null try { - cursor = activity.contentResolver.query(uri, projection, selection, selectionArgs, null) + cursor = context.contentResolver.query(uri, projection, selection, selectionArgs, null) if (cursor?.moveToFirst() == true) { do { val id = cursor.getIntValue(ContactsContract.Data.CONTACT_ID) @@ -620,7 +621,7 @@ class ContactsHelper(val activity: Activity) { } while (cursor.moveToNext()) } } catch (e: Exception) { - activity.showErrorToast(e) + context.showErrorToast(e) } finally { cursor?.close() } @@ -673,7 +674,7 @@ class ContactsHelper(val activity: Activity) { fun getStoredGroups(callback: (ArrayList) -> Unit) { Thread { val groups = getStoredGroupsSync() - activity.runOnUiThread { + Handler(Looper.getMainLooper()).post { callback(groups) } }.start() @@ -681,13 +682,13 @@ class ContactsHelper(val activity: Activity) { fun getStoredGroupsSync(): ArrayList { val groups = getDeviceStoredGroups() - groups.addAll(activity.groupsDB.getGroups()) + groups.addAll(context.groupsDB.getGroups()) return groups } fun getDeviceStoredGroups(): ArrayList { val groups = ArrayList() - if (!activity.hasContactPermissions()) { + if (!context.hasContactPermissions()) { return groups } @@ -703,7 +704,7 @@ class ContactsHelper(val activity: Activity) { var cursor: Cursor? = null try { - cursor = activity.contentResolver.query(uri, projection, selection, selectionArgs, null) + cursor = context.contentResolver.query(uri, projection, selection, selectionArgs, null) if (cursor?.moveToFirst() == true) { do { val id = cursor.getLongValue(ContactsContract.Groups._ID) @@ -718,7 +719,7 @@ class ContactsHelper(val activity: Activity) { } while (cursor.moveToNext()) } } catch (e: Exception) { - activity.showErrorToast(e) + context.showErrorToast(e) } finally { cursor?.close() } @@ -728,7 +729,7 @@ class ContactsHelper(val activity: Activity) { fun createNewGroup(title: String, accountName: String, accountType: String): Group? { if (accountType == SMT_PRIVATE) { val newGroup = Group(null, title) - val id = activity.groupsDB.insertOrUpdate(newGroup) + val id = context.groupsDB.insertOrUpdate(newGroup) newGroup.id = id return newGroup } @@ -743,11 +744,11 @@ class ContactsHelper(val activity: Activity) { } try { - val results = activity.contentResolver.applyBatch(ContactsContract.AUTHORITY, operations) + val results = context.contentResolver.applyBatch(ContactsContract.AUTHORITY, operations) val rawId = ContentUris.parseId(results[0].uri) return Group(rawId, title) } catch (e: Exception) { - activity.showErrorToast(e) + context.showErrorToast(e) } return null } @@ -763,9 +764,9 @@ class ContactsHelper(val activity: Activity) { } try { - activity.contentResolver.applyBatch(ContactsContract.AUTHORITY, operations) + context.contentResolver.applyBatch(ContactsContract.AUTHORITY, operations) } catch (e: Exception) { - activity.showErrorToast(e) + context.showErrorToast(e) } } @@ -778,9 +779,9 @@ class ContactsHelper(val activity: Activity) { operations.add(ContentProviderOperation.newDelete(uri).build()) try { - activity.contentResolver.applyBatch(ContactsContract.AUTHORITY, operations) + context.contentResolver.applyBatch(ContactsContract.AUTHORITY, operations) } catch (e: Exception) { - activity.showErrorToast(e) + context.showErrorToast(e) } } @@ -788,7 +789,7 @@ class ContactsHelper(val activity: Activity) { if (id == 0) { return null } else if (isLocalPrivate) { - return LocalContactsHelper(activity).getContactWithId(id) + return LocalContactsHelper(context).getContactWithId(id) } val selection = "${ContactsContract.Data.MIMETYPE} = ? AND ${ContactsContract.Data.RAW_CONTACT_ID} = ?" @@ -808,7 +809,7 @@ class ContactsHelper(val activity: Activity) { val projection = getContactProjection() var cursor: Cursor? = null try { - cursor = activity.contentResolver.query(uri, projection, selection, selectionArgs, null) + cursor = context.contentResolver.query(uri, projection, selection, selectionArgs, null) if (cursor?.moveToFirst() == true) { val id = cursor.getIntValue(ContactsContract.Data.RAW_CONTACT_ID) val prefix = cursor.getStringValue(CommonDataKinds.StructuredName.PREFIX) ?: "" @@ -849,22 +850,22 @@ class ContactsHelper(val activity: Activity) { private fun getContactSourcesSync(): ArrayList { val sources = getDeviceContactSources() - sources.add(ContactSource(activity.getString(R.string.phone_storage_hidden), SMT_PRIVATE)) + sources.add(ContactSource(context.getString(R.string.phone_storage_hidden), SMT_PRIVATE)) return ArrayList(sources) } fun getDeviceContactSources(): LinkedHashSet { val sources = LinkedHashSet() - if (!activity.hasContactPermissions()) { + if (!context.hasContactPermissions()) { return sources } - val accounts = AccountManager.get(activity).accounts + val accounts = AccountManager.get(context).accounts accounts.forEach { if (ContentResolver.getIsSyncable(it, ContactsContract.AUTHORITY) == 1) { val contactSource = ContactSource(it.name, it.type) if (it.type == TELEGRAM_PACKAGE) { - contactSource.name += " (${activity.getString(R.string.telegram)})" + contactSource.name += " (${context.getString(R.string.telegram)})" } sources.add(contactSource) } @@ -875,7 +876,7 @@ class ContactsHelper(val activity: Activity) { } sources.addAll(contentResolverAccounts) - if (sources.isEmpty() && activity.config.localAccountName.isEmpty() && activity.config.localAccountType.isEmpty()) { + if (sources.isEmpty() && context.config.localAccountName.isEmpty() && context.config.localAccountType.isEmpty()) { sources.add(ContactSource("", "")) } @@ -899,7 +900,7 @@ class ContactsHelper(val activity: Activity) { ) private fun getSortString(): String { - val sorting = activity.config.sorting + val sorting = context.config.sorting var sort = when { sorting and SORT_BY_FIRST_NAME != 0 -> "${CommonDataKinds.StructuredName.GIVEN_NAME} COLLATE NOCASE" sorting and SORT_BY_MIDDLE_NAME != 0 -> "${CommonDataKinds.StructuredName.MIDDLE_NAME} COLLATE NOCASE" @@ -921,7 +922,7 @@ class ContactsHelper(val activity: Activity) { val selectionArgs = arrayOf(CommonDataKinds.StructuredName.CONTENT_ITEM_TYPE, id.toString()) var cursor: Cursor? = null try { - cursor = activity.contentResolver.query(uri, projection, selection, selectionArgs, null) + cursor = context.contentResolver.query(uri, projection, selection, selectionArgs, null) if (cursor?.moveToFirst() == true) { return cursor.getIntValue(ContactsContract.Data.CONTACT_ID) } @@ -933,9 +934,9 @@ class ContactsHelper(val activity: Activity) { } fun updateContact(contact: Contact, photoUpdateStatus: Int): Boolean { - activity.toast(R.string.updating) + context.toast(R.string.updating) if (contact.source == SMT_PRIVATE) { - return LocalContactsHelper(activity).insertOrUpdateContact(contact) + return LocalContactsHelper(context).insertOrUpdateContact(contact) } try { @@ -1149,9 +1150,9 @@ class ContactsHelper(val activity: Activity) { val uri = Uri.withAppendedPath(ContactsContract.Contacts.CONTENT_URI, contact.contactId.toString()) val contentValues = ContentValues(1) contentValues.put(ContactsContract.Contacts.STARRED, contact.starred) - activity.contentResolver.update(uri, contentValues, null, null) + context.contentResolver.update(uri, contentValues, null, null) } catch (e: Exception) { - activity.showErrorToast(e) + context.showErrorToast(e) } // photo @@ -1160,10 +1161,10 @@ class ContactsHelper(val activity: Activity) { PHOTO_REMOVED -> removePhoto(contact, operations) } - activity.contentResolver.applyBatch(ContactsContract.AUTHORITY, operations) + context.contentResolver.applyBatch(ContactsContract.AUTHORITY, operations) return true } catch (e: Exception) { - activity.showErrorToast(e) + context.showErrorToast(e) return false } } @@ -1171,9 +1172,9 @@ class ContactsHelper(val activity: Activity) { private fun addPhoto(contact: Contact, operations: ArrayList): ArrayList { if (contact.photoUri.isNotEmpty()) { val photoUri = Uri.parse(contact.photoUri) - val bitmap = MediaStore.Images.Media.getBitmap(activity.contentResolver, photoUri) + val bitmap = MediaStore.Images.Media.getBitmap(context.contentResolver, photoUri) - val thumbnailSize = activity.getPhotoThumbnailSize() + val thumbnailSize = context.getPhotoThumbnailSize() val scaledPhoto = Bitmap.createScaledBitmap(bitmap, thumbnailSize, thumbnailSize, false) val scaledSizePhotoData = scaledPhoto.getByteArray() scaledPhoto.recycle() @@ -1215,15 +1216,15 @@ class ContactsHelper(val activity: Activity) { } if (operations.size % BATCH_SIZE == 0) { - activity.contentResolver.applyBatch(ContactsContract.AUTHORITY, operations) + context.contentResolver.applyBatch(ContactsContract.AUTHORITY, operations) operations.clear() } } try { - activity.contentResolver.applyBatch(ContactsContract.AUTHORITY, operations) + context.contentResolver.applyBatch(ContactsContract.AUTHORITY, operations) } catch (e: Exception) { - activity.showErrorToast(e) + context.showErrorToast(e) } } @@ -1238,16 +1239,16 @@ class ContactsHelper(val activity: Activity) { } if (operations.size % BATCH_SIZE == 0) { - activity.contentResolver.applyBatch(ContactsContract.AUTHORITY, operations) + context.contentResolver.applyBatch(ContactsContract.AUTHORITY, operations) operations.clear() } } - activity.contentResolver.applyBatch(ContactsContract.AUTHORITY, operations) + context.contentResolver.applyBatch(ContactsContract.AUTHORITY, operations) } fun insertContact(contact: Contact): Boolean { if (contact.source == SMT_PRIVATE) { - return LocalContactsHelper(activity).insertOrUpdateContact(contact) + return LocalContactsHelper(context).insertOrUpdateContact(contact) } try { @@ -1386,9 +1387,9 @@ class ContactsHelper(val activity: Activity) { var scaledSizePhotoData: ByteArray? if (contact.photoUri.isNotEmpty()) { val photoUri = Uri.parse(contact.photoUri) - val bitmap = MediaStore.Images.Media.getBitmap(activity.contentResolver, photoUri) + val bitmap = MediaStore.Images.Media.getBitmap(context.contentResolver, photoUri) - val thumbnailSize = activity.getPhotoThumbnailSize() + val thumbnailSize = context.getPhotoThumbnailSize() val scaledPhoto = Bitmap.createScaledBitmap(bitmap, thumbnailSize, thumbnailSize, false) scaledSizePhotoData = scaledPhoto.getByteArray() @@ -1406,7 +1407,7 @@ class ContactsHelper(val activity: Activity) { val results: Array try { - results = activity.contentResolver.applyBatch(ContactsContract.AUTHORITY, operations) + results = context.contentResolver.applyBatch(ContactsContract.AUTHORITY, operations) } finally { scaledSizePhotoData = null } @@ -1423,12 +1424,12 @@ class ContactsHelper(val activity: Activity) { val uri = Uri.withAppendedPath(ContactsContract.Contacts.CONTENT_URI, userId.toString()) val contentValues = ContentValues(1) contentValues.put(ContactsContract.Contacts.STARRED, contact.starred) - activity.contentResolver.update(uri, contentValues, null, null) + context.contentResolver.update(uri, contentValues, null, null) } return true } catch (e: Exception) { - activity.showErrorToast(e) + context.showErrorToast(e) return false } } @@ -1436,7 +1437,7 @@ class ContactsHelper(val activity: Activity) { private fun addFullSizePhoto(contactId: Long, fullSizePhotoData: ByteArray) { val baseUri = ContentUris.withAppendedId(ContactsContract.RawContacts.CONTENT_URI, contactId) val displayPhotoUri = Uri.withAppendedPath(baseUri, ContactsContract.RawContacts.DisplayPhoto.CONTENT_DIRECTORY) - val fileDescriptor = activity.contentResolver.openAssetFileDescriptor(displayPhotoUri, "rw") + val fileDescriptor = context.contentResolver.openAssetFileDescriptor(displayPhotoUri, "rw") val photoStream = fileDescriptor.createOutputStream() photoStream.write(fullSizePhotoData) photoStream.close() @@ -1450,7 +1451,7 @@ class ContactsHelper(val activity: Activity) { val selectionArgs = arrayOf(CommonDataKinds.StructuredName.CONTENT_ITEM_TYPE, contactId) var cursor: Cursor? = null try { - cursor = activity.contentResolver.query(uri, projection, selection, selectionArgs, null) + cursor = context.contentResolver.query(uri, projection, selection, selectionArgs, null) if (cursor?.moveToFirst() == true) { val id = cursor.getIntValue(ContactsContract.Data.CONTACT_ID) val lookupKey = cursor.getStringValue(ContactsContract.Data.LOOKUP_KEY) @@ -1470,7 +1471,7 @@ class ContactsHelper(val activity: Activity) { var cursor: Cursor? = null try { - cursor = activity.contentResolver.query(uri, projection, selection, selectionArgs, null) + cursor = context.contentResolver.query(uri, projection, selection, selectionArgs, null) if (cursor?.moveToFirst() == true) { return cursor.getStringValue(ContactsContract.Data._ID) } @@ -1483,7 +1484,7 @@ class ContactsHelper(val activity: Activity) { fun addFavorites(contacts: ArrayList) { Thread { toggleLocalFavorites(contacts, true) - if (activity.hasContactPermissions()) { + if (context.hasContactPermissions()) { toggleFavorites(contacts, true) } }.start() @@ -1492,7 +1493,7 @@ class ContactsHelper(val activity: Activity) { fun removeFavorites(contacts: ArrayList) { Thread { toggleLocalFavorites(contacts, false) - if (activity.hasContactPermissions()) { + if (context.hasContactPermissions()) { toggleFavorites(contacts, false) } }.start() @@ -1509,25 +1510,25 @@ class ContactsHelper(val activity: Activity) { } if (operations.size % BATCH_SIZE == 0) { - activity.contentResolver.applyBatch(ContactsContract.AUTHORITY, operations) + context.contentResolver.applyBatch(ContactsContract.AUTHORITY, operations) operations.clear() } } - activity.contentResolver.applyBatch(ContactsContract.AUTHORITY, operations) + context.contentResolver.applyBatch(ContactsContract.AUTHORITY, operations) } catch (e: Exception) { - activity.showErrorToast(e) + context.showErrorToast(e) } } private fun toggleLocalFavorites(contacts: ArrayList, addToFavorites: Boolean) { val localContacts = contacts.filter { it.source == SMT_PRIVATE }.map { it.id }.toTypedArray() - LocalContactsHelper(activity).toggleFavorites(localContacts, addToFavorites) + LocalContactsHelper(context).toggleFavorites(localContacts, addToFavorites) } fun deleteContact(contact: Contact) { Thread { if (contact.source == SMT_PRIVATE) { - activity.contactsDB.deleteContactId(contact.id) + context.contactsDB.deleteContactId(contact.id) } else { deleteContacts(arrayListOf(contact)) } @@ -1536,7 +1537,7 @@ class ContactsHelper(val activity: Activity) { fun deleteContacts(contacts: ArrayList) { val localContacts = contacts.filter { it.source == SMT_PRIVATE }.map { it.id }.toTypedArray() - LocalContactsHelper(activity).deleteContactIds(localContacts) + LocalContactsHelper(context).deleteContactIds(localContacts) try { val operations = ArrayList() @@ -1549,16 +1550,16 @@ class ContactsHelper(val activity: Activity) { } if (operations.size % BATCH_SIZE == 0) { - activity.contentResolver.applyBatch(ContactsContract.AUTHORITY, operations) + context.contentResolver.applyBatch(ContactsContract.AUTHORITY, operations) operations.clear() } } - if (activity.hasPermission(PERMISSION_WRITE_CONTACTS)) { - activity.contentResolver.applyBatch(ContactsContract.AUTHORITY, operations) + if (context.hasPermission(PERMISSION_WRITE_CONTACTS)) { + context.contentResolver.applyBatch(ContactsContract.AUTHORITY, operations) } } catch (e: Exception) { - activity.showErrorToast(e) + context.showErrorToast(e) } } @@ -1566,7 +1567,7 @@ class ContactsHelper(val activity: Activity) { fun getRecents(callback: (ArrayList) -> Unit) { Thread { val calls = ArrayList() - if (!activity.hasPermission(PERMISSION_WRITE_CALL_LOG) || !activity.hasPermission(PERMISSION_READ_CALL_LOG)) { + if (!context.hasPermission(PERMISSION_WRITE_CALL_LOG) || !context.hasPermission(PERMISSION_READ_CALL_LOG)) { callback(calls) return@Thread } @@ -1584,13 +1585,13 @@ class ContactsHelper(val activity: Activity) { val currentYear = SimpleDateFormat("yyyy", Locale.getDefault()).format(currentDate) val todayDate = SimpleDateFormat("dd MMM yyyy", Locale.getDefault()).format(currentDate) val yesterdayDate = SimpleDateFormat("dd MMM yyyy", Locale.getDefault()).format(Date(System.currentTimeMillis() - DAY_SECONDS * 1000)) - val yesterday = activity.getString(R.string.yesterday) - val timeFormat = if (activity.config.use24HourFormat) "HH:mm" else "h:mm a" + val yesterday = context.getString(R.string.yesterday) + val timeFormat = if (context.config.use24HourFormat) "HH:mm" else "h:mm a" var prevNumber = "" var cursor: Cursor? = null try { - cursor = activity.contentResolver.query(uri, projection, null, null, sorting) + cursor = context.contentResolver.query(uri, projection, null, null, sorting) if (cursor?.moveToFirst() == true) { do { val id = cursor.getIntValue(CallLog.Calls._ID) @@ -1634,14 +1635,14 @@ class ContactsHelper(val activity: Activity) { } if (operations.size % BATCH_SIZE == 0) { - activity.contentResolver.applyBatch(CallLog.AUTHORITY, operations) + context.contentResolver.applyBatch(CallLog.AUTHORITY, operations) operations.clear() } } - activity.contentResolver.applyBatch(CallLog.AUTHORITY, operations) + context.contentResolver.applyBatch(CallLog.AUTHORITY, operations) } catch (e: Exception) { - activity.showErrorToast(e) + context.showErrorToast(e) } }.start() } diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/helpers/LocalContactsHelper.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/helpers/LocalContactsHelper.kt index 438f8eee..f1f4caa5 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/helpers/LocalContactsHelper.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/helpers/LocalContactsHelper.kt @@ -1,6 +1,6 @@ package com.simplemobiletools.contacts.pro.helpers -import android.app.Activity +import android.content.Context import android.graphics.Bitmap import android.graphics.BitmapFactory import android.net.Uri @@ -14,13 +14,13 @@ import com.simplemobiletools.contacts.pro.models.Group import com.simplemobiletools.contacts.pro.models.LocalContact import com.simplemobiletools.contacts.pro.models.Organization -class LocalContactsHelper(val activity: Activity) { - fun getAllContacts() = activity.contactsDB.getContacts().map { convertLocalContactToContact(it) }.toMutableList() as ArrayList +class LocalContactsHelper(val context: Context) { + fun getAllContacts() = context.contactsDB.getContacts().map { convertLocalContactToContact(it) }.toMutableList() as ArrayList - fun getContactWithId(id: Int) = convertLocalContactToContact(activity.contactsDB.getContactWithId(id)) + fun getContactWithId(id: Int) = convertLocalContactToContact(context.contactsDB.getContactWithId(id)) fun getContactWithNumber(number: String): Contact? { - activity.contactsDB.getContacts().forEach { + context.contactsDB.getContacts().forEach { if (it.phoneNumbers.map { it.value }.contains(number)) { return convertLocalContactToContact(it) } @@ -30,7 +30,7 @@ class LocalContactsHelper(val activity: Activity) { fun insertOrUpdateContact(contact: Contact): Boolean { val localContact = convertContactToLocalContact(contact) - return activity.contactsDB.insertOrUpdate(localContact) > 0 + return context.contactsDB.insertOrUpdate(localContact) > 0 } fun addContactsToGroup(contacts: ArrayList, groupId: Long) { @@ -40,7 +40,7 @@ class LocalContactsHelper(val activity: Activity) { newGroups.add(groupId) newGroups.distinct() localContact.groups = newGroups - activity.contactsDB.insertOrUpdate(localContact) + context.contactsDB.insertOrUpdate(localContact) } } @@ -50,20 +50,20 @@ class LocalContactsHelper(val activity: Activity) { val newGroups = localContact.groups newGroups.remove(groupId) localContact.groups = newGroups - activity.contactsDB.insertOrUpdate(localContact) + context.contactsDB.insertOrUpdate(localContact) } } fun deleteContactIds(ids: Array) { ids.forEach { - activity.contactsDB.deleteContactId(it) + context.contactsDB.deleteContactId(it) } } fun toggleFavorites(ids: Array, addToFavorites: Boolean) { val isStarred = if (addToFavorites) 1 else 0 ids.forEach { - activity.contactsDB.updateStarred(isStarred, it) + context.contactsDB.updateStarred(isStarred, it) } } @@ -73,9 +73,9 @@ class LocalContactsHelper(val activity: Activity) { } val photoUri = Uri.parse(uri) - val bitmap = MediaStore.Images.Media.getBitmap(activity.contentResolver, photoUri) + val bitmap = MediaStore.Images.Media.getBitmap(context.contentResolver, photoUri) - val thumbnailSize = activity.getPhotoThumbnailSize() + val thumbnailSize = context.getPhotoThumbnailSize() val scaledPhoto = Bitmap.createScaledBitmap(bitmap, thumbnailSize * 2, thumbnailSize * 2, false) val scaledSizePhotoData = scaledPhoto.getByteArray() scaledPhoto.recycle() @@ -97,9 +97,9 @@ class LocalContactsHelper(val activity: Activity) { } } - val storedGroups = ContactsHelper(activity).getStoredGroupsSync() + val storedGroups = ContactsHelper(context).getStoredGroupsSync() - return activity.getEmptyContact().apply { + return context.getEmptyContact().apply { id = localContact.id!! prefix = localContact.prefix firstName = localContact.firstName From 75ff0e610150660cb59cd34548d60f15be194cf8 Mon Sep 17 00:00:00 2001 From: tibbi Date: Thu, 29 Nov 2018 10:08:05 +0100 Subject: [PATCH 089/134] show the other participants name at the calling notification, if available --- .../contacts/pro/services/DialerCallService.kt | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/services/DialerCallService.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/services/DialerCallService.kt index 13d82173..916e00a3 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/services/DialerCallService.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/services/DialerCallService.kt @@ -31,6 +31,7 @@ class DialerCallService : Service() { private var callNumber = "" private var callStatus = Call.STATE_NEW private var isIncomingCall = false + private var otherParticipantName: String? = null private var reminderRefreshHandler = Handler() override fun onBind(intent: Intent?) = null @@ -47,11 +48,12 @@ class DialerCallService : Service() { callNumber = intent.getStringExtra(CALL_NUMBER) callStatus = intent.getIntExtra(CALL_STATUS, Call.STATE_NEW) isIncomingCall = intent.getBooleanExtra(IS_INCOMING_CALL, false) - setupNotification() + getOtherParticipantsName() } intent.extras?.containsKey(CALL_STATUS) == true -> { callStatus = intent.getIntExtra(CALL_STATUS, Call.STATE_NEW) - setupNotification() + callNumber = intent.getStringExtra(CALL_NUMBER) + getOtherParticipantsName() } } return START_STICKY @@ -63,6 +65,13 @@ class DialerCallService : Service() { reminderRefreshHandler.removeCallbacksAndMessages(null) } + private fun getOtherParticipantsName() { + ContactsHelper(this).getContactWithNumber(callNumber) { + otherParticipantName = it?.getNameToDisplay() ?: callNumber + setupNotification() + } + } + @TargetApi(Build.VERSION_CODES.O) private fun setupNotification() { val channelId = "call_channel" @@ -79,7 +88,7 @@ class DialerCallService : Service() { } val notificationLayout = RemoteViews(packageName, R.layout.incoming_call_notification).apply { - setText(R.id.incoming_call_caller, callNumber) + setText(R.id.incoming_call_caller, otherParticipantName!!) setText(R.id.incoming_call_status, getCallStatusString()) val resources = applicationContext.resources From 6fad2733af48a4effb0a34e499de8e4114b2cd03 Mon Sep 17 00:00:00 2001 From: tibbi Date: Thu, 29 Nov 2018 10:39:04 +0100 Subject: [PATCH 090/134] handle Simple Contacts not being the default app for phone calls --- .../contacts/pro/activities/DialerActivity.kt | 23 +++++++++++++++++-- 1 file changed, 21 insertions(+), 2 deletions(-) diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/DialerActivity.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/DialerActivity.kt index e93389b5..31620deb 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/DialerActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/DialerActivity.kt @@ -32,6 +32,7 @@ import kotlinx.android.synthetic.main.activity_dialer.* // incoming call handling inspired by https://github.com/mbarrben/android_dialer_replacement @TargetApi(Build.VERSION_CODES.M) class DialerActivity : SimpleActivity(), SensorEventListener { + private val REQUEST_CODE_SET_DEFAULT_DIALER = 1 private val SENSOR_SENSITIVITY = 4 private val DISCONNECT_DELAY = 3000L private val CALLING_DOT_ANIMATION_DELAY = 500L @@ -175,8 +176,26 @@ class DialerActivity : SimpleActivity(), SensorEventListener { } callStatus = Call.STATE_DIALING } catch (e: Exception) { - showErrorToast(e) - finish() + // only default Phone apps can initiate outgoing calls. So if we got here and Simple Contacts isnt the default phone app, ask the user to set so + if (e is SecurityException) { + val intent = Intent(TelecomManager.ACTION_CHANGE_DEFAULT_DIALER).putExtra(TelecomManager.EXTRA_CHANGE_DEFAULT_DIALER_PACKAGE_NAME, packageName) + startActivityForResult(intent, REQUEST_CODE_SET_DEFAULT_DIALER) + } else { + showErrorToast(e) + finish() + } + } + } + + override fun onActivityResult(requestCode: Int, resultCode: Int, resultData: Intent?) { + super.onActivityResult(requestCode, resultCode, resultData) + if (requestCode == REQUEST_CODE_SET_DEFAULT_DIALER) { + val telecomManager = getSystemService(Context.TELECOM_SERVICE) as TelecomManager + if (telecomManager.defaultDialerPackage != packageName) { + finish() + } else { + initOutgoingCall() + } } } From 1b9028ba6c36aaeb322aa08ae7c7796cff0ffc24 Mon Sep 17 00:00:00 2001 From: tibbi Date: Thu, 29 Nov 2018 10:57:04 +0100 Subject: [PATCH 091/134] tweaking some outgoing call notification handling --- .../contacts/pro/services/DialerCallService.kt | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/services/DialerCallService.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/services/DialerCallService.kt index 916e00a3..12c95806 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/services/DialerCallService.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/services/DialerCallService.kt @@ -44,17 +44,12 @@ class DialerCallService : Service() { stopForeground(true) stopSelf() } - intent.getBooleanExtra(IS_INCOMING_CALL, false) -> { + intent.extras?.containsKey(CALL_STATUS) == true -> { callNumber = intent.getStringExtra(CALL_NUMBER) callStatus = intent.getIntExtra(CALL_STATUS, Call.STATE_NEW) isIncomingCall = intent.getBooleanExtra(IS_INCOMING_CALL, false) getOtherParticipantsName() } - intent.extras?.containsKey(CALL_STATUS) == true -> { - callStatus = intent.getIntExtra(CALL_STATUS, Call.STATE_NEW) - callNumber = intent.getStringExtra(CALL_NUMBER) - getOtherParticipantsName() - } } return START_STICKY } From 420a5230625e421f8721fc63919f9b427818be74 Mon Sep 17 00:00:00 2001 From: tibbi Date: Thu, 29 Nov 2018 15:32:53 +0100 Subject: [PATCH 092/134] remove everything related to the custom Dialer, let the system handle it --- app/src/main/AndroidManifest.xml | 30 +- .../contacts/pro/activities/DialerActivity.kt | 284 ++---------------- .../contacts/pro/helpers/Constants.kt | 10 - .../contacts/pro/helpers/ContactsHelper.kt | 25 -- .../pro/helpers/LocalContactsHelper.kt | 9 - .../contacts/pro/helpers/MyConnection.kt | 33 -- .../contacts/pro/objects/CallManager.kt | 29 -- .../pro/services/DialerCallService.kt | 161 ---------- .../pro/services/MyIncomingCallService.kt | 76 ----- .../pro/services/MyOutgoingCallService.kt | 18 -- .../main/res/drawable-hdpi/ic_phone_down.png | Bin 408 -> 0 bytes .../main/res/drawable-xhdpi/ic_phone_down.png | Bin 507 -> 0 bytes .../res/drawable-xxhdpi/ic_phone_down.png | Bin 722 -> 0 bytes .../res/drawable-xxxhdpi/ic_phone_down.png | Bin 929 -> 0 bytes .../res/drawable/circle_green_background.xml | 9 - .../res/drawable/circle_red_background.xml | 9 - app/src/main/res/drawable/ripple.xml | 11 - app/src/main/res/layout/activity_dialer.xml | 118 -------- .../res/layout/incoming_call_notification.xml | 55 ---- app/src/main/res/values/colors.xml | 4 - app/src/main/res/values/dimens.xml | 3 - 21 files changed, 20 insertions(+), 864 deletions(-) delete mode 100644 app/src/main/kotlin/com/simplemobiletools/contacts/pro/helpers/MyConnection.kt delete mode 100644 app/src/main/kotlin/com/simplemobiletools/contacts/pro/objects/CallManager.kt delete mode 100644 app/src/main/kotlin/com/simplemobiletools/contacts/pro/services/DialerCallService.kt delete mode 100644 app/src/main/kotlin/com/simplemobiletools/contacts/pro/services/MyIncomingCallService.kt delete mode 100644 app/src/main/kotlin/com/simplemobiletools/contacts/pro/services/MyOutgoingCallService.kt delete mode 100755 app/src/main/res/drawable-hdpi/ic_phone_down.png delete mode 100644 app/src/main/res/drawable-xhdpi/ic_phone_down.png delete mode 100644 app/src/main/res/drawable-xxhdpi/ic_phone_down.png delete mode 100644 app/src/main/res/drawable-xxxhdpi/ic_phone_down.png delete mode 100644 app/src/main/res/drawable/circle_green_background.xml delete mode 100644 app/src/main/res/drawable/circle_red_background.xml delete mode 100644 app/src/main/res/drawable/ripple.xml delete mode 100644 app/src/main/res/layout/activity_dialer.xml delete mode 100644 app/src/main/res/layout/incoming_call_notification.xml delete mode 100644 app/src/main/res/values/colors.xml diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index c6b76294..2076d5b8 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -224,9 +224,7 @@ + android:label="@string/dialer"> @@ -246,32 +244,6 @@ android:resource="@xml/provider_paths"/> - - - - - - - - - - - - - - - - - statusActive() - Call.STATE_DISCONNECTED -> statusDisconnected() - } - } - - private fun statusActive() { - callingDotsHandler.removeCallbacksAndMessages(null) - dialer_label_dots.beGone() - startNotificationService() - isCallActive = true - dialer_call_duration.beVisible() - updateCallDuration() - - dialer_label.setText(R.string.ongoing_call) - dialer_hangup_button.beVisible() - dialer_incoming_accept.beGone() - dialer_incoming_decline.beGone() - } - - private fun updateCallDuration() { - dialer_call_duration.text = callDuration.getFormattedDuration() - timerHandler.postDelayed({ - if (isCallActive) { - callDuration++ - updateCallDuration() - } - }, 1000) - } - - private fun statusDisconnected() { - callingDotsHandler.removeCallbacksAndMessages(null) - timerHandler.removeCallbacksAndMessages(null) - dialer_label_dots.beGone() - stopNotificationService() - dialer_hangup_button.beGone() - dialer_label.setText(R.string.disconnected) - if (isCallActive) { - dialer_hangup_button.postDelayed({ - finish() - }, DISCONNECT_DELAY) - } else { - finish() - } - isCallActive = false - } - - private fun updateOtherParticipant(contact: Contact?) { - if (contact != null) { - dialer_big_name_number.text = contact.getNameToDisplay() - dialer_number.text = callNumber - } else { - dialer_big_name_number.text = callNumber - dialer_number.beGone() - } - } - - override fun onAccuracyChanged(sensor: Sensor?, accuracy: Int) {} - - override fun onSensorChanged(event: SensorEvent) { - if (event.sensor.type == Sensor.TYPE_PROXIMITY) { - if (event.values[0] >= -SENSOR_SENSITIVITY && event.values[0] <= SENSOR_SENSITIVITY) { - turnOffScreen() - } else { - turnOnScreen() - } - } - } - - @SuppressLint("WakelockTimeout") - private fun turnOffScreen() { - if (proximityWakeLock?.isHeld == false) { - proximityWakeLock!!.acquire() - } - } - - private fun turnOnScreen() { - if (proximityWakeLock?.isHeld == true) { - proximityWakeLock!!.release(PowerManager.RELEASE_FLAG_WAIT_FOR_NO_PROXIMITY) - } - } } diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/helpers/Constants.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/helpers/Constants.kt index 596a33c1..458256b1 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/helpers/Constants.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/helpers/Constants.kt @@ -32,16 +32,6 @@ const val FIRST_GROUP_ID = 10000L const val KEY_PHONE = "phone" const val KEY_NAME = "name" -// Dialer -const val INCOMING_CALL = "incoming_call" -const val RESUME_DIALER = "resume_dialer" -const val CALL_NUMBER = "call_number" -const val CALL_STATUS = "call_status" -const val IS_INCOMING_CALL = "is_incoming_call" -const val DIALER_INTENT_FILTER = "dialer_intent_filter" -const val DECLINE_CALL = "decline_call" -const val ANSWER_CALL = "answer_call" - const val LOCATION_CONTACTS_TAB = 0 const val LOCATION_FAVORITES_TAB = 1 const val LOCATION_RECENTS_TAB = 2 diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/helpers/ContactsHelper.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/helpers/ContactsHelper.kt index ac2312a9..9aa917ba 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/helpers/ContactsHelper.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/helpers/ContactsHelper.kt @@ -93,31 +93,6 @@ class ContactsHelper(val context: Context) { }.start() } - fun getContactWithNumber(number: String, callback: (contact: Contact?) -> Unit) { - Thread { - val uri = CommonDataKinds.Phone.CONTENT_URI - val projection = arrayOf(ContactsContract.Data.RAW_CONTACT_ID) - val selection = "${CommonDataKinds.Phone.NUMBER} = ? OR ${CommonDataKinds.Phone.NORMALIZED_NUMBER} = ?" - val selectionArgs = arrayOf(number, number.normalizeNumber()) - - var cursor: Cursor? = null - try { - cursor = context.contentResolver.query(uri, projection, selection, selectionArgs, null) - if (cursor?.moveToFirst() == true) { - val id = cursor.getIntValue(ContactsContract.Data.RAW_CONTACT_ID) - callback(getContactWithId(id, false)) - return@Thread - } - } catch (e: Exception) { - context.showErrorToast(e) - } finally { - cursor?.close() - } - - callback(LocalContactsHelper(context).getContactWithNumber(number)) - }.start() - } - private fun getContentResolverAccounts(): HashSet { val uri = ContactsContract.Data.CONTENT_URI val projection = arrayOf( diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/helpers/LocalContactsHelper.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/helpers/LocalContactsHelper.kt index f1f4caa5..54045fa3 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/helpers/LocalContactsHelper.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/helpers/LocalContactsHelper.kt @@ -19,15 +19,6 @@ class LocalContactsHelper(val context: Context) { fun getContactWithId(id: Int) = convertLocalContactToContact(context.contactsDB.getContactWithId(id)) - fun getContactWithNumber(number: String): Contact? { - context.contactsDB.getContacts().forEach { - if (it.phoneNumbers.map { it.value }.contains(number)) { - return convertLocalContactToContact(it) - } - } - return null - } - fun insertOrUpdateContact(contact: Contact): Boolean { val localContact = convertContactToLocalContact(contact) return context.contactsDB.insertOrUpdate(localContact) > 0 diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/helpers/MyConnection.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/helpers/MyConnection.kt deleted file mode 100644 index 419ece65..00000000 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/helpers/MyConnection.kt +++ /dev/null @@ -1,33 +0,0 @@ -package com.simplemobiletools.contacts.pro.helpers - -import android.annotation.TargetApi -import android.content.Context -import android.os.Build -import android.telecom.Connection -import android.telecom.DisconnectCause - -@TargetApi(Build.VERSION_CODES.M) -class MyConnection(val context: Context) : Connection() { - override fun onAnswer() { - super.onAnswer() - setActive() - } - - override fun onReject() { - super.onReject() - setDisconnected(DisconnectCause(DisconnectCause.REJECTED)) - destroy() - } - - override fun onAbort() { - super.onAbort() - setDisconnected(DisconnectCause(DisconnectCause.REMOTE)) - destroy() - } - - override fun onDisconnect() { - super.onDisconnect() - setDisconnected(DisconnectCause(DisconnectCause.CANCELED)) - destroy() - } -} diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/objects/CallManager.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/objects/CallManager.kt deleted file mode 100644 index bfb7b9cb..00000000 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/objects/CallManager.kt +++ /dev/null @@ -1,29 +0,0 @@ -package com.simplemobiletools.contacts.pro.objects - -import android.annotation.TargetApi -import android.os.Build -import android.telecom.Call - -@TargetApi(Build.VERSION_CODES.M) -object CallManager { - private var currentCall: Call? = null - - fun updateCall(call: Call?) { - currentCall = call - } - - fun declineCall() { - currentCall?.apply { - when (state) { - Call.STATE_RINGING -> reject(false, "") - else -> disconnect() - } - } - } - - fun answerCall() { - currentCall?.apply { - answer(details.videoState) - } - } -} diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/services/DialerCallService.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/services/DialerCallService.kt deleted file mode 100644 index 12c95806..00000000 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/services/DialerCallService.kt +++ /dev/null @@ -1,161 +0,0 @@ -package com.simplemobiletools.contacts.pro.services - -import android.annotation.TargetApi -import android.app.NotificationChannel -import android.app.NotificationManager -import android.app.PendingIntent -import android.app.Service -import android.content.Context -import android.content.Intent -import android.os.Build -import android.os.Handler -import android.telecom.Call -import android.widget.RemoteViews -import androidx.core.app.NotificationCompat -import com.simplemobiletools.commons.extensions.getColoredBitmap -import com.simplemobiletools.commons.extensions.setText -import com.simplemobiletools.commons.extensions.setVisibleIf -import com.simplemobiletools.commons.helpers.isOreoPlus -import com.simplemobiletools.contacts.pro.R -import com.simplemobiletools.contacts.pro.activities.DialerActivity -import com.simplemobiletools.contacts.pro.helpers.* -import com.simplemobiletools.contacts.pro.objects.CallManager - -class DialerCallService : Service() { - private val REFRESH_REMINDER_PERIOD = 3000L - private val CALL_NOTIFICATION_ID = 1 - private val LAUNCH_DIALER_INTENT_ID = 1 - private val DISMISS_CALL_INTENT_ID = 2 - private val ANSWER_CALL_INTENT_ID = 3 - - private var callNumber = "" - private var callStatus = Call.STATE_NEW - private var isIncomingCall = false - private var otherParticipantName: String? = null - private var reminderRefreshHandler = Handler() - - override fun onBind(intent: Intent?) = null - - override fun onStartCommand(intent: Intent, flags: Int, startId: Int): Int { - super.onStartCommand(intent, flags, startId) - when { - intent.getBooleanExtra(DECLINE_CALL, false) -> { - CallManager.declineCall() - stopForeground(true) - stopSelf() - } - intent.extras?.containsKey(CALL_STATUS) == true -> { - callNumber = intent.getStringExtra(CALL_NUMBER) - callStatus = intent.getIntExtra(CALL_STATUS, Call.STATE_NEW) - isIncomingCall = intent.getBooleanExtra(IS_INCOMING_CALL, false) - getOtherParticipantsName() - } - } - return START_STICKY - } - - override fun onDestroy() { - super.onDestroy() - stopForeground(true) - reminderRefreshHandler.removeCallbacksAndMessages(null) - } - - private fun getOtherParticipantsName() { - ContactsHelper(this).getContactWithNumber(callNumber) { - otherParticipantName = it?.getNameToDisplay() ?: callNumber - setupNotification() - } - } - - @TargetApi(Build.VERSION_CODES.O) - private fun setupNotification() { - val channelId = "call_channel" - if (isOreoPlus()) { - val notificationManager = getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager - val name = resources.getString(R.string.app_name) - val importance = if (callStatus == Call.STATE_RINGING) NotificationManager.IMPORTANCE_HIGH else NotificationManager.IMPORTANCE_DEFAULT - NotificationChannel(channelId, name, importance).apply { - enableLights(false) - enableVibration(false) - setSound(null, null) - notificationManager.createNotificationChannel(this) - } - } - - val notificationLayout = RemoteViews(packageName, R.layout.incoming_call_notification).apply { - setText(R.id.incoming_call_caller, otherParticipantName!!) - setText(R.id.incoming_call_status, getCallStatusString()) - - val resources = applicationContext.resources - setImageViewBitmap(R.id.call_decline, resources.getColoredBitmap(R.drawable.ic_phone_down, resources.getColor(R.color.theme_dark_red_primary_color))) - setImageViewBitmap(R.id.call_answer, resources.getColoredBitmap(R.drawable.ic_phone, resources.getColor(R.color.md_green_700))) - - setVisibleIf(R.id.call_answer, callStatus == Call.STATE_RINGING) - - setOnClickPendingIntent(R.id.call_decline, getDeclineCallIntent()) - setOnClickPendingIntent(R.id.call_answer, getAnswerCallIntent()) - } - - val notification = NotificationCompat.Builder(applicationContext, channelId) - .setSmallIcon(R.drawable.ic_phone) - .setContentIntent(getLaunchDialerIntent()) - .setVisibility(NotificationCompat.VISIBILITY_PUBLIC) - .setPriority(NotificationCompat.PRIORITY_MAX) - .setCustomContentView(notificationLayout) - .setCustomHeadsUpContentView(notificationLayout) - .setCustomBigContentView(notificationLayout) - .setOngoing(true) - .setCategory(NotificationCompat.CATEGORY_CALL) - .setChannelId(channelId) - .setSound(null) - .setOnlyAlertOnce(false) - .setUsesChronometer(callStatus == Call.STATE_ACTIVE) - - startForeground(CALL_NOTIFICATION_ID, notification.build()) - - reminderRefreshHandler.postDelayed({ - if (callStatus == Call.STATE_RINGING) { - setupNotification() - } - }, REFRESH_REMINDER_PERIOD) - } - - private fun getLaunchDialerIntent(): PendingIntent { - val intent = Intent(this, DialerActivity::class.java).apply { - action = RESUME_DIALER - putExtra(CALL_NUMBER, callNumber) - putExtra(CALL_STATUS, callStatus) - putExtra(IS_INCOMING_CALL, isIncomingCall) - } - return PendingIntent.getActivity(this, LAUNCH_DIALER_INTENT_ID, intent, PendingIntent.FLAG_UPDATE_CURRENT) - } - - private fun getDeclineCallIntent(): PendingIntent { - Intent(this, DialerCallService::class.java).apply { - putExtra(DECLINE_CALL, true) - return PendingIntent.getService(this@DialerCallService, DISMISS_CALL_INTENT_ID, this, PendingIntent.FLAG_UPDATE_CURRENT) - } - } - - private fun getAnswerCallIntent(): PendingIntent { - val intent = Intent(this, DialerActivity::class.java).apply { - action = RESUME_DIALER - putExtra(CALL_NUMBER, callNumber) - putExtra(CALL_STATUS, callStatus) - putExtra(IS_INCOMING_CALL, isIncomingCall) - putExtra(ANSWER_CALL, true) - } - return PendingIntent.getActivity(this, ANSWER_CALL_INTENT_ID, intent, PendingIntent.FLAG_UPDATE_CURRENT) - } - - private fun getCallStatusString(): String { - val id = when (callStatus) { - Call.STATE_DIALING -> R.string.calling - Call.STATE_RINGING -> R.string.incoming_call - Call.STATE_ACTIVE -> R.string.ongoing_call - else -> if (isIncomingCall) R.string.incoming_call else R.string.calling - } - - return applicationContext.getString(id) - } -} diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/services/MyIncomingCallService.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/services/MyIncomingCallService.kt deleted file mode 100644 index 15652cb4..00000000 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/services/MyIncomingCallService.kt +++ /dev/null @@ -1,76 +0,0 @@ -package com.simplemobiletools.contacts.pro.services - -import android.annotation.TargetApi -import android.app.KeyguardManager -import android.content.Context -import android.content.Intent -import android.net.Uri -import android.os.Build -import android.os.Bundle -import android.telecom.Call -import android.telecom.InCallService -import androidx.localbroadcastmanager.content.LocalBroadcastManager -import com.simplemobiletools.contacts.pro.activities.DialerActivity -import com.simplemobiletools.contacts.pro.helpers.* -import com.simplemobiletools.contacts.pro.objects.CallManager - -@TargetApi(Build.VERSION_CODES.M) -class MyIncomingCallService : InCallService() { - override fun onCallAdded(call: Call) { - super.onCallAdded(call) - call.registerCallback(callCallback) - - val handle = Uri.decode(call.details.handle.toString()) - val callerNumber = if (handle.contains("tel:")) { - handle.substringAfter("tel:") - } else { - handle - } - - val keyguardManager = getSystemService(Context.KEYGUARD_SERVICE) as KeyguardManager - if (keyguardManager.isKeyguardLocked) { - Intent(this, DialerActivity::class.java).apply { - action = RESUME_DIALER - flags = flags or Intent.FLAG_ACTIVITY_NEW_TASK - putExtra(CALL_NUMBER, callerNumber) - putExtra(CALL_STATUS, call.state) - putExtra(IS_INCOMING_CALL, true) - startActivity(this) - } - } else { - Intent(this, DialerCallService::class.java).apply { - putExtra(CALL_STATUS, call.state) - putExtra(CALL_NUMBER, callerNumber) - putExtra(IS_INCOMING_CALL, true) - startService(this) - } - } - - CallManager.updateCall(call) - } - - override fun onCallRemoved(call: Call) { - super.onCallRemoved(call) - call.unregisterCallback(callCallback) - CallManager.updateCall(null) - } - - private val callCallback = object : Call.Callback() { - override fun onStateChanged(call: Call, state: Int) { - CallManager.updateCall(call) - sendCallToActivity(call) - if (state == Call.STATE_DISCONNECTED) { - Intent(applicationContext, DialerCallService::class.java).apply { - stopService(this) - } - } - } - } - - private fun sendCallToActivity(call: Call) { - Intent(DIALER_INTENT_FILTER).apply { - putExtra(CALL_STATUS, call.state) - LocalBroadcastManager.getInstance(applicationContext).sendBroadcast(this) - } - } -} diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/services/MyOutgoingCallService.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/services/MyOutgoingCallService.kt deleted file mode 100644 index 9e8427fa..00000000 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/services/MyOutgoingCallService.kt +++ /dev/null @@ -1,18 +0,0 @@ -package com.simplemobiletools.contacts.pro.services - -import android.annotation.TargetApi -import android.net.Uri -import android.os.Build -import android.telecom.* -import com.simplemobiletools.contacts.pro.helpers.MyConnection - -@TargetApi(Build.VERSION_CODES.M) -class MyOutgoingCallService : ConnectionService() { - override fun onCreateIncomingConnection(connectionManagerPhoneAccount: PhoneAccountHandle, request: ConnectionRequest): Connection { - val connection = MyConnection(applicationContext) - val phoneNumber = request.extras.get(TelecomManager.EXTRA_INCOMING_CALL_ADDRESS) as Uri - connection.setAddress(phoneNumber, TelecomManager.PRESENTATION_ALLOWED) - connection.setRinging() - return connection - } -} diff --git a/app/src/main/res/drawable-hdpi/ic_phone_down.png b/app/src/main/res/drawable-hdpi/ic_phone_down.png deleted file mode 100755 index 945478257cc507ae7c654a4af1ab5f86566386d0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 408 zcmV;J0cZY+P)^Fzaxao=4y83r_YKooGwEuZw;Fc*1DdLd6cO7cve=O+7)HSZZqj5YQ6#jJ0P zEk@7z>}1{##v0?h`G~LxV~@d&u=&?wn_*3{)hNlTVx2H+Pmw!OlIx1>X-0%rLGGPO zl%(QiL8_JAwCozxbKAlABbvGf?aETwX(0F5(HMfNhXbi*Wb$%bF2)F4vPEWRAeH5I zz(=(hk-86A>O$nx(6*!!`#{B#wnijLk|as;pZE!kP7M$e(Cw%I0000>oh8k~%rPkPEm$jCfX@Wtz_{W>Bi&}G&?{zm%Ui0N>J~u+G4EJf2!UF~?W{;`5Yp#y(yze>p zxYCvG@{IR=tB&S+nre??hPp5EaJg2t%d$XMAGQ4^O&gpi5l>x>m)(_;Vt002ovPDHLkV1mAW_!9sC diff --git a/app/src/main/res/drawable-xxhdpi/ic_phone_down.png b/app/src/main/res/drawable-xxhdpi/ic_phone_down.png deleted file mode 100644 index 79f71efe3de874cb5adb5c41fcb68b1e1ab3646e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 722 zcmV;@0xkWCP)#OSA#U}FeEP(#4ly7~!yqSnLPnuvJn3Wuqj(H;nx_>< z#xqVcI10^F_ba}P`%S5~RPMRdRMq5+bg%6EN(t&3gaYB#yd1D^7szhviL z!y;F@x?GKPwO(_J6D>1F=V*q`MqB1Yw|GshbpN?Rm&lfuj`E{48P7S}9Bm^@+M4Su z&&f#hy`!{@t!J6HqpZQZaYlIsDlP^u7!?h(z;9G+jGrxtE!oBYRCJ90?Gl@EoD3BoBjdPO zM+=ujRm9+mSi|j9RgBvr!U0rWj03`}RT+CV{9Bc=f5T5z8T%>RB3C;^p4maJZViL{ zDmT+2&rFw_Uk!=~bNnfLUuqe7rlt2}?@x1L4Ric1JGJ(R0x(~V?EG#{Y+!m;wNK2C z0x{nwS+%CeI$73!a=NxrK-xOZuhQ|$=B;(LU!tL~C3$&p6*{$g}!K32Eah z4f)QvNMmFJwL7$ql5<=Gt&!2Ngj$UgqD@o{sHg(q_=MZQHhO+qP}nc28s5 zwkug}rTprBRsA&|?dzLcTIy_Dhr7sKUh%Dg<|xZ-gM8-|ce~ILw$nwcsJ*neiz~cq zyqXy6Jy+UQyQm#Bx25yFYKXKA^{Vr2rCAgr4Q=H*KPi!EC4P3Dtu&0npsizkV76?V z?LEh89r;TeC;CK*Tw3T;$7>V$#ZtESlKJw*JTKYaQu(r^E;UR(8s^d*FF7l?&m8$| zmisIpxnNx{S)>pw@{%=$X6qKA(?;Tk8}#b(yk z#qv67seuMs=x8~etz%QWI>9v__mLhZOT#ZVj!e+S+iGTpFWg`c?IR%_?Cu6%n4xCg z(K*tjsT(bn)EF-~(VFT-O4PH46FqOdq!zeQlSqf1jgZ82?>bAj$RORE8#OW0W>G$SB~J9R$HjE{ukZ7{K zBClxfp)~U>nW#i{ysKm6A=?;{R-Pp|pvsBnI6U%}<{nX1)0fPXMxp__MxL{aNonO- zGSOlcdtLJ=06O`&(md-#^*Ox4MCV5VaY2$i$rH_YU=$b!nx7y~qD0ed8U@IvrdiSy z>qN~sT8aM}p=%THz=%000000000000001bFP#adKc+^00000NkvXXu0mjf Dqf4f{ diff --git a/app/src/main/res/drawable/circle_green_background.xml b/app/src/main/res/drawable/circle_green_background.xml deleted file mode 100644 index 03bb39d3..00000000 --- a/app/src/main/res/drawable/circle_green_background.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - diff --git a/app/src/main/res/drawable/circle_red_background.xml b/app/src/main/res/drawable/circle_red_background.xml deleted file mode 100644 index 4371db18..00000000 --- a/app/src/main/res/drawable/circle_red_background.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - diff --git a/app/src/main/res/drawable/ripple.xml b/app/src/main/res/drawable/ripple.xml deleted file mode 100644 index 4538babe..00000000 --- a/app/src/main/res/drawable/ripple.xml +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - diff --git a/app/src/main/res/layout/activity_dialer.xml b/app/src/main/res/layout/activity_dialer.xml deleted file mode 100644 index 3fbf37e2..00000000 --- a/app/src/main/res/layout/activity_dialer.xml +++ /dev/null @@ -1,118 +0,0 @@ - - - - - - - - - - - - - - - - - - - - diff --git a/app/src/main/res/layout/incoming_call_notification.xml b/app/src/main/res/layout/incoming_call_notification.xml deleted file mode 100644 index ece53f06..00000000 --- a/app/src/main/res/layout/incoming_call_notification.xml +++ /dev/null @@ -1,55 +0,0 @@ - - - - - - - - - - - - - - - diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml deleted file mode 100644 index b8d2ac37..00000000 --- a/app/src/main/res/values/colors.xml +++ /dev/null @@ -1,4 +0,0 @@ - - - #55000000 - diff --git a/app/src/main/res/values/dimens.xml b/app/src/main/res/values/dimens.xml index 06eb1258..e5a33be5 100644 --- a/app/src/main/res/values/dimens.xml +++ b/app/src/main/res/values/dimens.xml @@ -7,9 +7,6 @@ 56dp 68dp 60dp - 70dp - 140dp - 40dp 34sp From 25c9c0d59833a963ec3e6555b32a6fbca6c719f9 Mon Sep 17 00:00:00 2001 From: tibbi Date: Thu, 29 Nov 2018 15:55:14 +0100 Subject: [PATCH 093/134] make sure the Dialer is a transparent activity --- app/src/main/AndroidManifest.xml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 2076d5b8..fc11ce08 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -224,7 +224,8 @@ + android:label="@string/dialer" + android:theme="@style/Theme.Transparent"> From 02198f572efb3735007a09c3a6761d02791b7be1 Mon Sep 17 00:00:00 2001 From: tibbi Date: Thu, 29 Nov 2018 16:44:53 +0100 Subject: [PATCH 094/134] add a button for setting the app as the default Phone app at the Recents --- .../contacts/pro/fragments/RecentsFragment.kt | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-) diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/fragments/RecentsFragment.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/fragments/RecentsFragment.kt index 814df2fa..9a6c7dad 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/fragments/RecentsFragment.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/fragments/RecentsFragment.kt @@ -1,12 +1,16 @@ package com.simplemobiletools.contacts.pro.fragments +import android.annotation.TargetApi import android.content.Context import android.content.Intent +import android.os.Build +import android.telecom.TelecomManager import android.util.AttributeSet import com.simplemobiletools.commons.extensions.beVisibleIf import com.simplemobiletools.commons.extensions.hasPermission import com.simplemobiletools.commons.helpers.PERMISSION_READ_CALL_LOG import com.simplemobiletools.commons.helpers.PERMISSION_WRITE_CALL_LOG +import com.simplemobiletools.commons.helpers.isMarshmallowPlus import com.simplemobiletools.contacts.pro.activities.EditContactActivity import com.simplemobiletools.contacts.pro.adapters.RecentCallsAdapter import com.simplemobiletools.contacts.pro.extensions.contactClicked @@ -21,13 +25,20 @@ import kotlinx.android.synthetic.main.fragment_layout.view.* class RecentsFragment(context: Context, attributeSet: AttributeSet) : MyViewPagerFragment(context, attributeSet) { override fun fabClicked() {} + @TargetApi(Build.VERSION_CODES.M) override fun placeholderClicked() { - activity!!.handlePermission(PERMISSION_WRITE_CALL_LOG) { - if (it) { - activity!!.handlePermission(PERMISSION_READ_CALL_LOG) { - activity?.refreshContacts(RECENTS_TAB_MASK) + val telecomManager = context.getSystemService(Context.TELECOM_SERVICE) as TelecomManager + if (!isMarshmallowPlus() || (isMarshmallowPlus() && telecomManager.defaultDialerPackage == context.packageName)) { + activity!!.handlePermission(PERMISSION_WRITE_CALL_LOG) { + if (it) { + activity!!.handlePermission(PERMISSION_READ_CALL_LOG) { + activity?.refreshContacts(RECENTS_TAB_MASK) + } } } + } else { + val intent = Intent(TelecomManager.ACTION_CHANGE_DEFAULT_DIALER).putExtra(TelecomManager.EXTRA_CHANGE_DEFAULT_DIALER_PACKAGE_NAME, context.packageName) + context.startActivity(intent) } } From ff0a08862c6c9badfd6e380dd7ad456fa913b56e Mon Sep 17 00:00:00 2001 From: tibbi Date: Thu, 29 Nov 2018 19:19:22 +0100 Subject: [PATCH 095/134] adding a context extension for referencing the telecomManager --- .../contacts/pro/activities/DialerActivity.kt | 5 +---- .../com/simplemobiletools/contacts/pro/extensions/Context.kt | 3 +++ .../contacts/pro/fragments/RecentsFragment.kt | 4 ++-- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/DialerActivity.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/DialerActivity.kt index 108e3092..9e23396e 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/DialerActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/DialerActivity.kt @@ -2,7 +2,6 @@ package com.simplemobiletools.contacts.pro.activities import android.annotation.SuppressLint import android.annotation.TargetApi -import android.content.Context import android.content.Intent import android.net.Uri import android.os.Build @@ -12,6 +11,7 @@ import android.telecom.TelecomManager import com.simplemobiletools.commons.extensions.showErrorToast import com.simplemobiletools.commons.extensions.toast import com.simplemobiletools.contacts.pro.R +import com.simplemobiletools.contacts.pro.extensions.telecomManager @TargetApi(Build.VERSION_CODES.M) class DialerActivity : SimpleActivity() { @@ -25,7 +25,6 @@ class DialerActivity : SimpleActivity() { callNumber = intent.data // make sure Simple Contacts is the default Phone app before initiating an outgoing call - val telecomManager = getSystemService(Context.TELECOM_SERVICE) as TelecomManager if (telecomManager.defaultDialerPackage != packageName) { val intent = Intent(TelecomManager.ACTION_CHANGE_DEFAULT_DIALER).putExtra(TelecomManager.EXTRA_CHANGE_DEFAULT_DIALER_PACKAGE_NAME, packageName) startActivityForResult(intent, REQUEST_CODE_SET_DEFAULT_DIALER) @@ -41,7 +40,6 @@ class DialerActivity : SimpleActivity() { @SuppressLint("MissingPermission") private fun initOutgoingCall() { try { - val telecomManager = getSystemService(Context.TELECOM_SERVICE) as TelecomManager Bundle().apply { putParcelable(TelecomManager.EXTRA_PHONE_ACCOUNT_HANDLE, telecomManager.getDefaultOutgoingPhoneAccount(PhoneAccount.SCHEME_TEL)) putBoolean(TelecomManager.EXTRA_START_CALL_WITH_VIDEO_STATE, false) @@ -58,7 +56,6 @@ class DialerActivity : SimpleActivity() { override fun onActivityResult(requestCode: Int, resultCode: Int, resultData: Intent?) { super.onActivityResult(requestCode, resultCode, resultData) if (requestCode == REQUEST_CODE_SET_DEFAULT_DIALER) { - val telecomManager = getSystemService(Context.TELECOM_SERVICE) as TelecomManager if (telecomManager.defaultDialerPackage != packageName) { finish() } else { diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/extensions/Context.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/extensions/Context.kt index 0f221c25..0926d25d 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/extensions/Context.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/extensions/Context.kt @@ -5,6 +5,7 @@ import android.content.Intent import android.database.Cursor import android.net.Uri import android.provider.ContactsContract +import android.telecom.TelecomManager import androidx.core.content.FileProvider import com.simplemobiletools.commons.extensions.getIntValue import com.simplemobiletools.commons.extensions.hasPermission @@ -30,6 +31,8 @@ val Context.contactsDB: ContactsDao get() = ContactsDatabase.getInstance(applica val Context.groupsDB: GroupsDao get() = ContactsDatabase.getInstance(applicationContext).GroupsDao() +val Context.telecomManager: TelecomManager get() = getSystemService(Context.TELECOM_SERVICE) as TelecomManager + fun Context.getEmptyContact(): Contact { val originalContactSource = if (hasContactPermissions()) config.lastUsedContactSource else SMT_PRIVATE val organization = Organization("", "") diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/fragments/RecentsFragment.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/fragments/RecentsFragment.kt index 9a6c7dad..9be66792 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/fragments/RecentsFragment.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/fragments/RecentsFragment.kt @@ -15,6 +15,7 @@ import com.simplemobiletools.contacts.pro.activities.EditContactActivity import com.simplemobiletools.contacts.pro.adapters.RecentCallsAdapter import com.simplemobiletools.contacts.pro.extensions.contactClicked import com.simplemobiletools.contacts.pro.extensions.normalizeNumber +import com.simplemobiletools.contacts.pro.extensions.telecomManager import com.simplemobiletools.contacts.pro.helpers.IS_FROM_SIMPLE_CONTACTS import com.simplemobiletools.contacts.pro.helpers.KEY_PHONE import com.simplemobiletools.contacts.pro.helpers.RECENTS_TAB_MASK @@ -27,8 +28,7 @@ class RecentsFragment(context: Context, attributeSet: AttributeSet) : MyViewPage @TargetApi(Build.VERSION_CODES.M) override fun placeholderClicked() { - val telecomManager = context.getSystemService(Context.TELECOM_SERVICE) as TelecomManager - if (!isMarshmallowPlus() || (isMarshmallowPlus() && telecomManager.defaultDialerPackage == context.packageName)) { + if (!isMarshmallowPlus() || (isMarshmallowPlus() && context.telecomManager.defaultDialerPackage == context.packageName)) { activity!!.handlePermission(PERMISSION_WRITE_CALL_LOG) { if (it) { activity!!.handlePermission(PERMISSION_READ_CALL_LOG) { From b069d2c4b1fffbb0eac5ca6fd48fa6feb0e6a15c Mon Sep 17 00:00:00 2001 From: tibbi Date: Thu, 29 Nov 2018 20:45:13 +0100 Subject: [PATCH 096/134] handle ahandle a new way of creating new contacts from numbers --- .../pro/activities/EditContactActivity.kt | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/EditContactActivity.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/EditContactActivity.kt index 5ce6b5c1..b5bc3492 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/EditContactActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/EditContactActivity.kt @@ -164,7 +164,7 @@ class EditContactActivity : ContactActivity() { } val action = intent.action - if ((contact!!.id == 0 && intent.extras != null && intent.extras.containsKey(KEY_PHONE) && action == Intent.ACTION_INSERT) || action == ADD_NEW_CONTACT_NUMBER) { + if ((contact!!.id == 0 && intent.extras != null && action == Intent.ACTION_INSERT) || action == ADD_NEW_CONTACT_NUMBER) { val phone = intent.extras.get(KEY_PHONE) if (phone != null) { val phoneNumber = phone.toString() @@ -172,6 +172,20 @@ class EditContactActivity : ContactActivity() { if (phoneNumber.isNotEmpty() && action == ADD_NEW_CONTACT_NUMBER) { highlightLastPhoneNumber = true } + } else { + // sample contact number from Google Contacts: + // data: [data1=+123 456 789 mimetype=vnd.android.cursor.item/phone_v2 _id=-1 data2=0] + val data = intent.extras.get("data") + if (data != null) { + val contentValues = (data as? ArrayList)?.firstOrNull() as? ContentValues + if (contentValues != null && contentValues.containsKey("data1")) { + val phoneNumber = contentValues.getAsString("data1") + contact!!.phoneNumbers.add(PhoneNumber(phoneNumber, DEFAULT_PHONE_NUMBER_TYPE, "", phoneNumber.normalizeNumber())) + if (phoneNumber.isNotEmpty() && action == ADD_NEW_CONTACT_NUMBER) { + highlightLastPhoneNumber = true + } + } + } } val firstName = intent.extras.get(KEY_NAME) From 8fbfa684cdd83d7fbf74bbcfd380217be949878a Mon Sep 17 00:00:00 2001 From: tibbi Date: Thu, 29 Nov 2018 21:10:53 +0100 Subject: [PATCH 097/134] fix #318, handle some new cases of adding numbers to contacts --- .../pro/activities/EditContactActivity.kt | 25 ++++--------------- .../activities/InsertOrEditContactActivity.kt | 4 +-- .../contacts/pro/activities/SimpleActivity.kt | 20 +++++++++++++++ 3 files changed, 27 insertions(+), 22 deletions(-) diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/EditContactActivity.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/EditContactActivity.kt index b5bc3492..df213ace 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/EditContactActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/EditContactActivity.kt @@ -164,36 +164,21 @@ class EditContactActivity : ContactActivity() { } val action = intent.action - if ((contact!!.id == 0 && intent.extras != null && action == Intent.ACTION_INSERT) || action == ADD_NEW_CONTACT_NUMBER) { - val phone = intent.extras.get(KEY_PHONE) - if (phone != null) { - val phoneNumber = phone.toString() + if (((contact!!.id == 0 && action == Intent.ACTION_INSERT) || action == ADD_NEW_CONTACT_NUMBER) && intent.extras != null) { + val phoneNumber = getPhoneNumberFromIntent(intent) + if (phoneNumber != null) { contact!!.phoneNumbers.add(PhoneNumber(phoneNumber, DEFAULT_PHONE_NUMBER_TYPE, "", phoneNumber.normalizeNumber())) if (phoneNumber.isNotEmpty() && action == ADD_NEW_CONTACT_NUMBER) { highlightLastPhoneNumber = true } - } else { - // sample contact number from Google Contacts: - // data: [data1=+123 456 789 mimetype=vnd.android.cursor.item/phone_v2 _id=-1 data2=0] - val data = intent.extras.get("data") - if (data != null) { - val contentValues = (data as? ArrayList)?.firstOrNull() as? ContentValues - if (contentValues != null && contentValues.containsKey("data1")) { - val phoneNumber = contentValues.getAsString("data1") - contact!!.phoneNumbers.add(PhoneNumber(phoneNumber, DEFAULT_PHONE_NUMBER_TYPE, "", phoneNumber.normalizeNumber())) - if (phoneNumber.isNotEmpty() && action == ADD_NEW_CONTACT_NUMBER) { - highlightLastPhoneNumber = true - } - } - } } - val firstName = intent.extras.get(KEY_NAME) + val firstName = intent.extras!!.get(KEY_NAME) if (firstName != null) { contact!!.firstName = firstName.toString() } - val data = intent.extras.getParcelableArrayList("data") + val data = intent.extras!!.getParcelableArrayList("data") if (data != null) { parseIntentData(data) } diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/InsertOrEditContactActivity.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/InsertOrEditContactActivity.kt index 1b0f8da8..1fbcf274 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/InsertOrEditContactActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/InsertOrEditContactActivity.kt @@ -45,7 +45,7 @@ class InsertOrEditContactActivity : SimpleActivity() { Intent().apply { action = Intent.ACTION_INSERT data = ContactsContract.Contacts.CONTENT_URI - putExtra(KEY_PHONE, intent.getStringExtra(KEY_PHONE)) + putExtra(KEY_PHONE, getPhoneNumberFromIntent(intent)) if (resolveActivity(packageManager) != null) { startActivityForResult(this, START_INSERT_ACTIVITY) } else { @@ -62,7 +62,7 @@ class InsertOrEditContactActivity : SimpleActivity() { Intent(applicationContext, EditContactActivity::class.java).apply { data = getContactPublicUri(it as Contact) action = ADD_NEW_CONTACT_NUMBER - putExtra(KEY_PHONE, intent.getStringExtra(KEY_PHONE)) + putExtra(KEY_PHONE, getPhoneNumberFromIntent(intent)) startActivityForResult(this, START_EDIT_ACTIVITY) } }.apply { diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/SimpleActivity.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/SimpleActivity.kt index cff6e0a3..26858bb3 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/SimpleActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/SimpleActivity.kt @@ -1,7 +1,10 @@ package com.simplemobiletools.contacts.pro.activities +import android.content.ContentValues +import android.content.Intent import com.simplemobiletools.commons.activities.BaseSimpleActivity import com.simplemobiletools.contacts.pro.R +import com.simplemobiletools.contacts.pro.helpers.KEY_PHONE open class SimpleActivity : BaseSimpleActivity() { override fun getAppIconIDs() = arrayListOf( @@ -27,4 +30,21 @@ open class SimpleActivity : BaseSimpleActivity() { ) override fun getAppLauncherName() = getString(R.string.app_launcher_name) + + protected fun getPhoneNumberFromIntent(intent: Intent): String? { + if (intent.extras?.containsKey(KEY_PHONE) == true) { + return intent.getStringExtra(KEY_PHONE) + } else if (intent.extras?.containsKey("data") == true) { + // sample contact number from Google Contacts: + // data: [data1=+123 456 789 mimetype=vnd.android.cursor.item/phone_v2 _id=-1 data2=0] + val data = intent.extras!!.get("data") + if (data != null) { + val contentValues = (data as? ArrayList)?.firstOrNull() as? ContentValues + if (contentValues != null && contentValues.containsKey("data1")) { + return contentValues.getAsString("data1") + } + } + } + return null + } } From 0c1da53df62ff0b31f5c6add353168d1612d320d Mon Sep 17 00:00:00 2001 From: tibbi Date: Thu, 29 Nov 2018 21:30:51 +0100 Subject: [PATCH 098/134] fix #312, make birthday parsing more robust --- .../contacts/pro/helpers/VcfImporter.kt | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/helpers/VcfImporter.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/helpers/VcfImporter.kt index fe08741a..290327c1 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/helpers/VcfImporter.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/helpers/VcfImporter.kt @@ -14,8 +14,6 @@ import com.simplemobiletools.contacts.pro.helpers.VcfImporter.ImportResult.* import com.simplemobiletools.contacts.pro.models.* import ezvcard.Ezvcard import ezvcard.VCard -import org.joda.time.DateTime -import org.joda.time.format.DateTimeFormat import java.io.File import java.io.FileOutputStream import java.net.URLDecoder @@ -26,8 +24,6 @@ class VcfImporter(val activity: SimpleActivity) { IMPORT_FAIL, IMPORT_OK, IMPORT_PARTIAL } - private val PATTERN = "EEE MMM dd HH:mm:ss 'GMT'ZZ YYYY" - private var contactsImported = 0 private var contactsFailed = 0 @@ -160,8 +156,10 @@ class VcfImporter(val activity: SimpleActivity) { } private fun formatDateToDayCode(date: Date): String { - val dateTime = DateTime.parse(date.toString(), DateTimeFormat.forPattern(PATTERN)) - return dateTime.toString("yyyy-MM-dd") + val year = 1900 + date.year + val month = String.format("%02d", date.month + 1) + val day = String.format("%02d", date.date) + return "$year-$month-$day" } private fun getContactGroups(ezContact: VCard): ArrayList { From e302309fe9f07b0b502320cfb5e247788877d280 Mon Sep 17 00:00:00 2001 From: tibbi Date: Thu, 29 Nov 2018 21:53:50 +0100 Subject: [PATCH 099/134] fix #304, fix exporting contacts on SD cards --- .../com/simplemobiletools/contacts/pro/helpers/VcfExporter.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/helpers/VcfExporter.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/helpers/VcfExporter.kt index 485010a8..0fc41e3b 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/helpers/VcfExporter.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/helpers/VcfExporter.kt @@ -152,7 +152,7 @@ class VcfExporter { contactsExported++ } - Ezvcard.write(cards).go(file) + Ezvcard.write(cards).go(it) } catch (e: Exception) { activity.showErrorToast(e) } From 2cff407b96b21a69fad5f26b64e047b7ac65d824 Mon Sep 17 00:00:00 2001 From: tibbi Date: Thu, 29 Nov 2018 22:47:37 +0100 Subject: [PATCH 100/134] properly show locally stored contact names at the Recents tab --- .../contacts/pro/activities/MainActivity.kt | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/MainActivity.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/MainActivity.kt index 6a6487e5..affe0508 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/MainActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/MainActivity.kt @@ -540,6 +540,15 @@ class MainActivity : SimpleActivity(), RefreshContactsListener { if (refreshTabsMask and RECENTS_TAB_MASK != 0) { ContactsHelper(this).getRecents { + val localContacts = LocalContactsHelper(applicationContext).getAllContacts() + it.filter { it.name == null }.forEach { + val namelessCall = it + val localContact = localContacts.firstOrNull { it.doesContainPhoneNumber(namelessCall.number) } + if (localContact != null) { + it.name = localContact.getNameToDisplay() + } + } + runOnUiThread { recents_fragment?.updateRecentCalls(it) } From 1e6f001b020553d7f8cecba6544135f3a40a0ff1 Mon Sep 17 00:00:00 2001 From: tibbi Date: Thu, 29 Nov 2018 23:54:34 +0100 Subject: [PATCH 101/134] fix #293, allow copying all fields from the View contact to clipboard with long press --- .../pro/activities/ViewContactActivity.kt | 35 +++++++++++++++---- .../main/res/layout/activity_view_contact.xml | 10 ++++++ app/src/main/res/layout/item_view_group.xml | 3 +- 3 files changed, 40 insertions(+), 8 deletions(-) diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/ViewContactActivity.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/ViewContactActivity.kt index 3d1329ba..78c2536b 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/ViewContactActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/ViewContactActivity.kt @@ -6,6 +6,7 @@ import android.os.Bundle import android.provider.ContactsContract import android.view.Menu import android.view.MenuItem +import android.view.View import android.view.WindowManager import android.widget.RelativeLayout import com.simplemobiletools.commons.extensions.* @@ -210,21 +211,27 @@ class ViewContactActivity : ContactActivity() { contact!!.apply { contact_prefix.text = prefix contact_prefix.beVisibleIf(prefix.isNotEmpty() && showFields and SHOW_PREFIX_FIELD != 0) + contact_prefix.copyOnLongClick(prefix) contact_first_name.text = firstName contact_first_name.beVisibleIf(firstName.isNotEmpty() && showFields and SHOW_FIRST_NAME_FIELD != 0) + contact_first_name.copyOnLongClick(firstName) contact_middle_name.text = middleName contact_middle_name.beVisibleIf(middleName.isNotEmpty() && showFields and SHOW_MIDDLE_NAME_FIELD != 0) + contact_middle_name.copyOnLongClick(middleName) contact_surname.text = surname contact_surname.beVisibleIf(surname.isNotEmpty() && showFields and SHOW_SURNAME_FIELD != 0) + contact_surname.copyOnLongClick(surname) contact_suffix.text = suffix contact_suffix.beVisibleIf(suffix.isNotEmpty() && showFields and SHOW_SUFFIX_FIELD != 0) + contact_suffix.copyOnLongClick(suffix) contact_nickname.text = nickname contact_nickname.beVisibleIf(nickname.isNotEmpty() && showFields and SHOW_NICKNAME_FIELD != 0) + contact_nickname.copyOnLongClick(nickname) if (contact_prefix.isGone() && contact_first_name.isGone() && contact_middle_name.isGone() && contact_surname.isGone() && contact_suffix.isGone() && contact_nickname.isGone()) { @@ -244,6 +251,7 @@ class ViewContactActivity : ContactActivity() { contact_numbers_holder.addView(this) contact_number.text = phoneNumber.value contact_number_type.text = getPhoneNumberTypeText(phoneNumber.type, phoneNumber.label) + copyOnLongClick(phoneNumber.value) setOnClickListener { if (config.showCallConfirmation) { @@ -254,12 +262,6 @@ class ViewContactActivity : ContactActivity() { startCallIntent(phoneNumber.value) } } - - setOnLongClickListener { - copyToClipboard(phoneNumber.value) - toast(R.string.value_copied_to_clipboard) - true - } } } contact_numbers_image.beVisible() @@ -280,6 +282,7 @@ class ViewContactActivity : ContactActivity() { contact_emails_holder.addView(this) contact_email.text = email.value contact_email_type.text = getEmailTypeText(email.type, email.label) + copyOnLongClick(email.value) setOnClickListener { sendEmailIntent(email.value) @@ -304,6 +307,7 @@ class ViewContactActivity : ContactActivity() { contact_addresses_holder.addView(this) contact_address.text = address.value contact_address_type.text = getAddressTypeText(address.type, address.label) + copyOnLongClick(address.value) setOnClickListener { sendAddressIntent(address.value) @@ -328,6 +332,7 @@ class ViewContactActivity : ContactActivity() { contact_ims_holder.addView(this) contact_im.text = IM.value contact_im_type.text = getIMTypeText(IM.type, IM.label) + copyOnLongClick(IM.value) } } contact_ims_image.beVisible() @@ -349,6 +354,7 @@ class ViewContactActivity : ContactActivity() { it.value.getDateTimeFromDateString(contact_event) contact_event_type.setText(getEventTextId(it.type)) contact_event_remove.beGone() + copyOnLongClick(it.value) } } contact_events_image.beVisible() @@ -365,6 +371,7 @@ class ViewContactActivity : ContactActivity() { contact_notes.text = notes contact_notes_image.beVisible() contact_notes.beVisible() + contact_notes.copyOnLongClick(notes) } else { contact_notes_image.beGone() contact_notes.beGone() @@ -379,6 +386,8 @@ class ViewContactActivity : ContactActivity() { contact_organization_image.beGoneIf(organization.isEmpty()) contact_organization_company.beGoneIf(organization.company.isEmpty()) contact_organization_job_position.beGoneIf(organization.jobPosition.isEmpty()) + contact_organization_company.copyOnLongClick(contact_organization_company.value) + contact_organization_job_position.copyOnLongClick(contact_organization_job_position.value) if (organization.company.isEmpty() && organization.jobPosition.isNotEmpty()) { (contact_organization_image.layoutParams as RelativeLayout.LayoutParams).addRule(RelativeLayout.ALIGN_TOP, contact_organization_job_position.id) @@ -399,6 +408,7 @@ class ViewContactActivity : ContactActivity() { layoutInflater.inflate(R.layout.item_website, contact_websites_holder, false).apply { contact_websites_holder.addView(this) contact_website.text = url + copyOnLongClick(url) setOnClickListener { openWebsiteIntent(url) @@ -422,6 +432,7 @@ class ViewContactActivity : ContactActivity() { val group = it contact_groups_holder.addView(this) contact_group.text = group.title + copyOnLongClick(group.title) } } contact_groups_image.beVisible() @@ -434,9 +445,11 @@ class ViewContactActivity : ContactActivity() { private fun setupContactSource() { if (showFields and SHOW_CONTACT_SOURCE_FIELD != 0) { - contact_source.text = getPublicContactSource(contact!!.source) + val contactSourceValue = getPublicContactSource(contact!!.source) + contact_source.text = contactSourceValue contact_source_image.beVisible() contact_source.beVisible() + contact_source.copyOnLongClick(contactSourceValue) } else { contact_source_image.beGone() contact_source.beGone() @@ -444,4 +457,12 @@ class ViewContactActivity : ContactActivity() { } private fun getStarDrawable(on: Boolean) = resources.getDrawable(if (on) R.drawable.ic_star_on_big else R.drawable.ic_star_off_big) + + private fun View.copyOnLongClick(value: String) { + setOnLongClickListener { + copyToClipboard(value) + toast(R.string.value_copied_to_clipboard) + true + } + } } diff --git a/app/src/main/res/layout/activity_view_contact.xml b/app/src/main/res/layout/activity_view_contact.xml index ec4ec89c..61e9b23c 100644 --- a/app/src/main/res/layout/activity_view_contact.xml +++ b/app/src/main/res/layout/activity_view_contact.xml @@ -98,6 +98,7 @@ android:layout_below="@+id/contact_photo" android:layout_centerVertical="true" android:layout_toRightOf="@+id/contact_name_image" + android:background="?attr/selectableItemBackground" android:lines="1" android:maxLines="1" android:paddingLeft="@dimen/small_margin" @@ -113,6 +114,7 @@ android:layout_below="@+id/contact_prefix" android:layout_centerVertical="true" android:layout_toRightOf="@+id/contact_name_image" + android:background="?attr/selectableItemBackground" android:lines="1" android:maxLines="1" android:paddingLeft="@dimen/small_margin" @@ -128,6 +130,7 @@ android:layout_below="@+id/contact_first_name" android:layout_centerVertical="true" android:layout_toRightOf="@+id/contact_name_image" + android:background="?attr/selectableItemBackground" android:lines="1" android:maxLines="1" android:paddingLeft="@dimen/small_margin" @@ -143,6 +146,7 @@ android:layout_below="@+id/contact_middle_name" android:layout_centerVertical="true" android:layout_toRightOf="@+id/contact_name_image" + android:background="?attr/selectableItemBackground" android:lines="1" android:maxLines="1" android:paddingLeft="@dimen/small_margin" @@ -158,6 +162,7 @@ android:layout_below="@+id/contact_surname" android:layout_centerVertical="true" android:layout_toRightOf="@+id/contact_name_image" + android:background="?attr/selectableItemBackground" android:lines="1" android:maxLines="1" android:paddingLeft="@dimen/small_margin" @@ -173,6 +178,7 @@ android:layout_below="@+id/contact_suffix" android:layout_centerVertical="true" android:layout_toRightOf="@+id/contact_name_image" + android:background="?attr/selectableItemBackground" android:lines="1" android:maxLines="1" android:paddingLeft="@dimen/small_margin" @@ -298,6 +304,7 @@ android:layout_below="@+id/contact_events_holder" android:layout_centerVertical="true" android:layout_toRightOf="@+id/contact_notes_image" + android:background="?attr/selectableItemBackground" android:lineSpacingExtra="@dimen/medium_margin" android:paddingLeft="@dimen/small_margin" android:paddingTop="@dimen/normal_margin" @@ -322,6 +329,7 @@ android:layout_below="@+id/contact_notes" android:layout_centerVertical="true" android:layout_toRightOf="@+id/contact_organization_image" + android:background="?attr/selectableItemBackground" android:lineSpacingExtra="@dimen/medium_margin" android:paddingLeft="@dimen/small_margin" android:paddingTop="@dimen/normal_margin" @@ -335,6 +343,7 @@ android:layout_below="@+id/contact_organization_company" android:layout_centerVertical="true" android:layout_toRightOf="@+id/contact_organization_image" + android:background="?attr/selectableItemBackground" android:lineSpacingExtra="@dimen/medium_margin" android:paddingLeft="@dimen/small_margin" android:paddingTop="@dimen/normal_margin" @@ -398,6 +407,7 @@ android:layout_below="@+id/contact_groups_holder" android:layout_centerVertical="true" android:layout_toRightOf="@+id/contact_name_image" + android:background="?attr/selectableItemBackground" android:lines="1" android:maxLines="1" android:paddingLeft="@dimen/small_margin" diff --git a/app/src/main/res/layout/item_view_group.xml b/app/src/main/res/layout/item_view_group.xml index 8aed14d6..12959127 100644 --- a/app/src/main/res/layout/item_view_group.xml +++ b/app/src/main/res/layout/item_view_group.xml @@ -5,10 +5,11 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_centerVertical="true" + android:background="?attr/selectableItemBackground" android:ellipsize="end" android:lines="1" android:maxLines="1" - android:paddingBottom="@dimen/normal_margin" android:paddingTop="@dimen/normal_margin" + android:paddingBottom="@dimen/normal_margin" android:singleLine="true" android:textSize="@dimen/bigger_text_size"/> From 0e45addad51ff329291922c92e5df2242a453d3f Mon Sep 17 00:00:00 2001 From: ScratchBuild Date: Fri, 30 Nov 2018 15:37:11 +0900 Subject: [PATCH 102/134] Update Japanese translation --- app/src/main/res/values-ja/strings.xml | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/app/src/main/res/values-ja/strings.xml b/app/src/main/res/values-ja/strings.xml index 2b373afe..cb7d54aa 100644 --- a/app/src/main/res/values-ja/strings.xml +++ b/app/src/main/res/values-ja/strings.xml @@ -112,12 +112,12 @@ 電話 発信中 - Incoming call + 着信中 着信中… 通話中 切断されました - Decline - Answer + 拒否 + 応答 表示する項目を選択 @@ -135,9 +135,9 @@ Instant messaging (IM) - Manage blocked numbers - You are not blocking anyone - Add a blocked number + ブロックした番号を管理 + まだ誰もブロックしていません + ブロックする番号を追加 連絡先に表示される項目(フィールド)を変更することはできますか? From 267a4c01c61b7dc0556266ec6fc100aca6c8768b Mon Sep 17 00:00:00 2001 From: tibbi Date: Fri, 30 Nov 2018 10:42:08 +0100 Subject: [PATCH 103/134] adding a settings button for managing blocked numbers --- .../pro/activities/SettingsActivity.kt | 13 +++++++++++ app/src/main/res/layout/activity_settings.xml | 22 +++++++++++++++++++ 2 files changed, 35 insertions(+) diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/SettingsActivity.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/SettingsActivity.kt index 47b2f1d1..9cf87f0f 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/SettingsActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/SettingsActivity.kt @@ -1,14 +1,18 @@ package com.simplemobiletools.contacts.pro.activities +import android.annotation.TargetApi +import android.os.Build import android.os.Bundle import com.simplemobiletools.commons.dialogs.RadioGroupDialog import com.simplemobiletools.commons.extensions.beVisibleIf import com.simplemobiletools.commons.extensions.updateTextColors +import com.simplemobiletools.commons.helpers.isNougatPlus import com.simplemobiletools.commons.models.RadioItem import com.simplemobiletools.contacts.pro.R import com.simplemobiletools.contacts.pro.dialogs.ManageVisibleFieldsDialog import com.simplemobiletools.contacts.pro.dialogs.ManageVisibleTabsDialog import com.simplemobiletools.contacts.pro.extensions.config +import com.simplemobiletools.contacts.pro.extensions.telecomManager import com.simplemobiletools.contacts.pro.helpers.ON_CLICK_CALL_CONTACT import com.simplemobiletools.contacts.pro.helpers.ON_CLICK_EDIT_CONTACT import com.simplemobiletools.contacts.pro.helpers.ON_CLICK_VIEW_CONTACT @@ -27,6 +31,7 @@ class SettingsActivity : SimpleActivity() { setupCustomizeColors() setupManageShownContactFields() setupManageShownTabs() + setupManageBlockedNumbers() setupUseEnglish() setupShowInfoBubble() setupShowContactThumbnails() @@ -59,6 +64,14 @@ class SettingsActivity : SimpleActivity() { } } + @TargetApi(Build.VERSION_CODES.N) + private fun setupManageBlockedNumbers() { + settings_manage_blocked_numbers.beVisibleIf(isNougatPlus()) + settings_manage_blocked_numbers.setOnClickListener { + startActivity(telecomManager.createManageBlockedNumbersIntent()) + } + } + private fun setupUseEnglish() { settings_use_english_holder.beVisibleIf(config.wasUseEnglishToggled || Locale.getDefault().language != "en") settings_use_english.isChecked = config.useEnglish diff --git a/app/src/main/res/layout/activity_settings.xml b/app/src/main/res/layout/activity_settings.xml index 60c430c4..9950dfd3 100644 --- a/app/src/main/res/layout/activity_settings.xml +++ b/app/src/main/res/layout/activity_settings.xml @@ -78,6 +78,28 @@ + + + + + + Date: Fri, 30 Nov 2018 10:43:00 +0100 Subject: [PATCH 104/134] updating app links to Pro --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index b7f75f1a..628bd7d1 100644 --- a/README.md +++ b/README.md @@ -9,8 +9,8 @@ Contains no ads or unnecessary permissions. It is fully opensource, provides cus This app is just one piece of a bigger series of apps. You can find the rest of them at http://www.simplemobiletools.com -Get it on Google Play -Get it on F-Droid +Get it on Google Play +Get it on F-Droid
App image From a77323b160a7aee6377b9447e21b9fdfcd9870f5 Mon Sep 17 00:00:00 2001 From: tibbi Date: Fri, 30 Nov 2018 10:53:46 +0100 Subject: [PATCH 105/134] fixing the number blocker settings button --- .../contacts/pro/activities/SettingsActivity.kt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/SettingsActivity.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/SettingsActivity.kt index 9cf87f0f..145b79b6 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/SettingsActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/SettingsActivity.kt @@ -66,8 +66,8 @@ class SettingsActivity : SimpleActivity() { @TargetApi(Build.VERSION_CODES.N) private fun setupManageBlockedNumbers() { - settings_manage_blocked_numbers.beVisibleIf(isNougatPlus()) - settings_manage_blocked_numbers.setOnClickListener { + settings_manage_blocked_numbers_holder.beVisibleIf(isNougatPlus()) + settings_manage_blocked_numbers_holder.setOnClickListener { startActivity(telecomManager.createManageBlockedNumbersIntent()) } } From 665b5b32a9277305f4919a44684d5c5928301391 Mon Sep 17 00:00:00 2001 From: tibbi Date: Fri, 30 Nov 2018 10:59:28 +0100 Subject: [PATCH 106/134] adding some number blocking related strings --- app/src/main/res/values-az/strings.xml | 2 ++ app/src/main/res/values-de/strings.xml | 2 ++ app/src/main/res/values-el/strings.xml | 2 ++ app/src/main/res/values-eu/strings.xml | 2 ++ app/src/main/res/values-fr/strings.xml | 2 ++ app/src/main/res/values-hr/strings.xml | 2 ++ app/src/main/res/values-it/strings.xml | 2 ++ app/src/main/res/values-ja/strings.xml | 2 ++ app/src/main/res/values-ko-rKR/strings.xml | 2 ++ app/src/main/res/values-lt/strings.xml | 2 ++ app/src/main/res/values-pt/strings.xml | 2 ++ app/src/main/res/values-ru/strings.xml | 2 ++ app/src/main/res/values-sk/strings.xml | 2 ++ app/src/main/res/values-sv/strings.xml | 2 ++ app/src/main/res/values-tr/strings.xml | 2 ++ app/src/main/res/values-zh-rTW/strings.xml | 2 ++ app/src/main/res/values/strings.xml | 2 ++ 17 files changed, 34 insertions(+) diff --git a/app/src/main/res/values-az/strings.xml b/app/src/main/res/values-az/strings.xml index 3dfb0578..ac97865f 100644 --- a/app/src/main/res/values-az/strings.xml +++ b/app/src/main/res/values-az/strings.xml @@ -138,6 +138,8 @@ Manage blocked numbers You are not blocking anyone Add a blocked number + Block number + Block numbers I want to change what fields are visible at contacts. Can I do it? diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index fc739f15..0fbae654 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -138,6 +138,8 @@ Manage blocked numbers You are not blocking anyone Add a blocked number + Block number + Block numbers Ich möchte die sichtbaren Kontaktfelder ändern. Kann ich das machen? diff --git a/app/src/main/res/values-el/strings.xml b/app/src/main/res/values-el/strings.xml index 32a09788..3750fff0 100644 --- a/app/src/main/res/values-el/strings.xml +++ b/app/src/main/res/values-el/strings.xml @@ -138,6 +138,8 @@ Manage blocked numbers You are not blocking anyone Add a blocked number + Block number + Block numbers Θέλω να αλλάξω τα πεδία που θα είναι ορατά στις επαφές. Μπορώ να το κάνω? diff --git a/app/src/main/res/values-eu/strings.xml b/app/src/main/res/values-eu/strings.xml index 54c1509e..3dae5a2e 100644 --- a/app/src/main/res/values-eu/strings.xml +++ b/app/src/main/res/values-eu/strings.xml @@ -138,6 +138,8 @@ Manage blocked numbers You are not blocking anyone Add a blocked number + Block number + Block numbers Aldatu ditzaket kontaktuetan ikusgarri dauden eremuak? diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml index ec36df93..db79ba42 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -138,6 +138,8 @@ Manage blocked numbers You are not blocking anyone Add a blocked number + Block number + Block numbers Je veux modifier les champs affichés sur les fiches de mes contacts. Puis-je le faire ? diff --git a/app/src/main/res/values-hr/strings.xml b/app/src/main/res/values-hr/strings.xml index d58121ed..68e438f9 100644 --- a/app/src/main/res/values-hr/strings.xml +++ b/app/src/main/res/values-hr/strings.xml @@ -138,6 +138,8 @@ Manage blocked numbers You are not blocking anyone Add a blocked number + Block number + Block numbers Želim promijeniti polja koja su vidljiva na kontaktima. Mogu li to napraviti? diff --git a/app/src/main/res/values-it/strings.xml b/app/src/main/res/values-it/strings.xml index 39c3744a..ff93dee4 100644 --- a/app/src/main/res/values-it/strings.xml +++ b/app/src/main/res/values-it/strings.xml @@ -138,6 +138,8 @@ Manage blocked numbers You are not blocking anyone Add a blocked number + Block number + Block numbers Voglio cambiare i campi visibili ai contatti. Come posso fare? diff --git a/app/src/main/res/values-ja/strings.xml b/app/src/main/res/values-ja/strings.xml index cb7d54aa..2c569f79 100644 --- a/app/src/main/res/values-ja/strings.xml +++ b/app/src/main/res/values-ja/strings.xml @@ -138,6 +138,8 @@ ブロックした番号を管理 まだ誰もブロックしていません ブロックする番号を追加 + Block number + Block numbers 連絡先に表示される項目(フィールド)を変更することはできますか? diff --git a/app/src/main/res/values-ko-rKR/strings.xml b/app/src/main/res/values-ko-rKR/strings.xml index b28f64d1..76e49499 100644 --- a/app/src/main/res/values-ko-rKR/strings.xml +++ b/app/src/main/res/values-ko-rKR/strings.xml @@ -138,6 +138,8 @@ Manage blocked numbers You are not blocking anyone Add a blocked number + Block number + Block numbers I want to change what fields are visible at contacts. Can I do it? diff --git a/app/src/main/res/values-lt/strings.xml b/app/src/main/res/values-lt/strings.xml index 4832acc5..f6dfa2d2 100644 --- a/app/src/main/res/values-lt/strings.xml +++ b/app/src/main/res/values-lt/strings.xml @@ -138,6 +138,8 @@ Manage blocked numbers You are not blocking anyone Add a blocked number + Block number + Block numbers Noriu pakeisti, kokie laukai yra matomi kontaktuose. Ar galiu tai padaryti? diff --git a/app/src/main/res/values-pt/strings.xml b/app/src/main/res/values-pt/strings.xml index 715ded7b..49e8d856 100644 --- a/app/src/main/res/values-pt/strings.xml +++ b/app/src/main/res/values-pt/strings.xml @@ -138,6 +138,8 @@ Manage blocked numbers You are not blocking anyone Add a blocked number + Block number + Block numbers I want to change what fields are visible at contacts. Can I do it? diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index 23dbd7d1..46af63fd 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -138,6 +138,8 @@ Manage blocked numbers You are not blocking anyone Add a blocked number + Block number + Block numbers Я хочу изменить поля, отображаемые у контактов. Могу ли я это сделать? diff --git a/app/src/main/res/values-sk/strings.xml b/app/src/main/res/values-sk/strings.xml index 993b9302..79162ae5 100644 --- a/app/src/main/res/values-sk/strings.xml +++ b/app/src/main/res/values-sk/strings.xml @@ -138,6 +138,8 @@ Spravovať blokované čísla Neblokujete nikoho Pridať blokované číslo + Blokovať číslo + Blokovať čísla Chcem upraviť viditeľné polia kontaktov. Dá sa to? diff --git a/app/src/main/res/values-sv/strings.xml b/app/src/main/res/values-sv/strings.xml index 282f5518..e9fe79e2 100644 --- a/app/src/main/res/values-sv/strings.xml +++ b/app/src/main/res/values-sv/strings.xml @@ -138,6 +138,8 @@ Manage blocked numbers You are not blocking anyone Add a blocked number + Block number + Block numbers I want to change what fields are visible at contacts. Can I do it? diff --git a/app/src/main/res/values-tr/strings.xml b/app/src/main/res/values-tr/strings.xml index f1c49df0..7c2b1a82 100644 --- a/app/src/main/res/values-tr/strings.xml +++ b/app/src/main/res/values-tr/strings.xml @@ -138,6 +138,8 @@ Manage blocked numbers You are not blocking anyone Add a blocked number + Block number + Block numbers Rehberde görüntülenecek alanları değiştirmek istiyorum. Bunu yapabilir miyim? diff --git a/app/src/main/res/values-zh-rTW/strings.xml b/app/src/main/res/values-zh-rTW/strings.xml index 2421d03f..b4d5cf35 100644 --- a/app/src/main/res/values-zh-rTW/strings.xml +++ b/app/src/main/res/values-zh-rTW/strings.xml @@ -138,6 +138,8 @@ Manage blocked numbers You are not blocking anyone Add a blocked number + Block number + Block numbers 我想要更改在通訊錄會看到哪些欄位。我能這麼做嗎? diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 039a360b..a0f7c727 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -138,6 +138,8 @@ Manage blocked numbers You are not blocking anyone Add a blocked number + Block number + Block numbers I want to change what fields are visible at contacts. Can I do it? From 47a1ff142bed7aaa8995309cac8385b61789533d Mon Sep 17 00:00:00 2001 From: tibbi Date: Fri, 30 Nov 2018 11:10:56 +0100 Subject: [PATCH 107/134] filter out the blocked numbers from Recents --- .../contacts/pro/activities/MainActivity.kt | 46 ++++++++++++++++++- .../contacts/pro/models/BlockedNumber.kt | 3 ++ 2 files changed, 47 insertions(+), 2 deletions(-) create mode 100644 app/src/main/kotlin/com/simplemobiletools/contacts/pro/models/BlockedNumber.kt diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/MainActivity.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/MainActivity.kt index affe0508..484a37cd 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/MainActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/MainActivity.kt @@ -1,14 +1,18 @@ package com.simplemobiletools.contacts.pro.activities +import android.annotation.TargetApi import android.app.SearchManager import android.content.Context import android.content.Intent +import android.database.Cursor import android.graphics.Color import android.graphics.drawable.ColorDrawable import android.graphics.drawable.Drawable import android.net.Uri +import android.os.Build import android.os.Bundle import android.os.Handler +import android.provider.BlockedNumberContract.BlockedNumbers import android.view.Menu import android.view.MenuItem import androidx.appcompat.widget.SearchView @@ -32,7 +36,9 @@ import com.simplemobiletools.contacts.pro.extensions.getTempFile import com.simplemobiletools.contacts.pro.fragments.MyViewPagerFragment import com.simplemobiletools.contacts.pro.helpers.* import com.simplemobiletools.contacts.pro.interfaces.RefreshContactsListener +import com.simplemobiletools.contacts.pro.models.BlockedNumber import com.simplemobiletools.contacts.pro.models.Contact +import com.simplemobiletools.contacts.pro.models.RecentCall import kotlinx.android.synthetic.main.activity_main.* import kotlinx.android.synthetic.main.fragment_contacts.* import kotlinx.android.synthetic.main.fragment_favorites.* @@ -40,6 +46,7 @@ import kotlinx.android.synthetic.main.fragment_groups.* import kotlinx.android.synthetic.main.fragment_recents.* import java.io.FileOutputStream + class MainActivity : SimpleActivity(), RefreshContactsListener { private var isSearchOpen = false private var searchMenuItem: MenuItem? = null @@ -540,8 +547,14 @@ class MainActivity : SimpleActivity(), RefreshContactsListener { if (refreshTabsMask and RECENTS_TAB_MASK != 0) { ContactsHelper(this).getRecents { + val numbers = getBlockedNumbers() + val recents = it.filter { + val recentCall = it + numbers.none { it.number == recentCall.number || it.normalizedNumber == recentCall.number } + }.toMutableList() as ArrayList + val localContacts = LocalContactsHelper(applicationContext).getAllContacts() - it.filter { it.name == null }.forEach { + recents.filter { it.name == null }.forEach { val namelessCall = it val localContact = localContacts.firstOrNull { it.doesContainPhoneNumber(namelessCall.number) } if (localContact != null) { @@ -550,12 +563,41 @@ class MainActivity : SimpleActivity(), RefreshContactsListener { } runOnUiThread { - recents_fragment?.updateRecentCalls(it) + recents_fragment?.updateRecentCalls(recents) } } } } + @TargetApi(Build.VERSION_CODES.N) + private fun getBlockedNumbers(): ArrayList { + val blockedNumbers = ArrayList() + if (!isNougatPlus()) { + return blockedNumbers + } + + val uri = BlockedNumbers.CONTENT_URI + val projection = arrayOf(BlockedNumbers.COLUMN_ID, BlockedNumbers.COLUMN_ORIGINAL_NUMBER, BlockedNumbers.COLUMN_E164_NUMBER) + + var cursor: Cursor? = null + try { + cursor = contentResolver.query(uri, projection, null, null, null) + if (cursor?.moveToFirst() == true) { + do { + val id = cursor.getLongValue(BlockedNumbers.COLUMN_ID) + val number = cursor.getStringValue(BlockedNumbers.COLUMN_ORIGINAL_NUMBER) ?: "" + val normalizedNumber = cursor.getStringValue(BlockedNumbers.COLUMN_E164_NUMBER) ?: "" + val blockedNumber = BlockedNumber(id, number, normalizedNumber) + blockedNumbers.add(blockedNumber) + } while (cursor.moveToNext()) + } + } finally { + cursor?.close() + } + + return blockedNumbers + } + private fun getAllFragments() = arrayListOf(contacts_fragment, favorites_fragment, recents_fragment, groups_fragment) private fun getRecentsTabIndex(): Int { diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/models/BlockedNumber.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/models/BlockedNumber.kt new file mode 100644 index 00000000..13fe44fd --- /dev/null +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/models/BlockedNumber.kt @@ -0,0 +1,3 @@ +package com.simplemobiletools.contacts.pro.models + +data class BlockedNumber(val id: Long, val number: String, val normalizedNumber: String) From 6fae60381fecc34af9eca7285e7a72e26b7ce862 Mon Sep 17 00:00:00 2001 From: tibbi Date: Fri, 30 Nov 2018 11:34:39 +0100 Subject: [PATCH 108/134] filter out blocked numbers earlier, right at fetching --- .../contacts/pro/activities/MainActivity.kt | 45 +------------------ .../contacts/pro/helpers/ContactsHelper.kt | 37 +++++++++++++++ 2 files changed, 39 insertions(+), 43 deletions(-) diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/MainActivity.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/MainActivity.kt index 484a37cd..be011bc2 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/MainActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/MainActivity.kt @@ -1,18 +1,14 @@ package com.simplemobiletools.contacts.pro.activities -import android.annotation.TargetApi import android.app.SearchManager import android.content.Context import android.content.Intent -import android.database.Cursor import android.graphics.Color import android.graphics.drawable.ColorDrawable import android.graphics.drawable.Drawable import android.net.Uri -import android.os.Build import android.os.Bundle import android.os.Handler -import android.provider.BlockedNumberContract.BlockedNumbers import android.view.Menu import android.view.MenuItem import androidx.appcompat.widget.SearchView @@ -36,9 +32,7 @@ import com.simplemobiletools.contacts.pro.extensions.getTempFile import com.simplemobiletools.contacts.pro.fragments.MyViewPagerFragment import com.simplemobiletools.contacts.pro.helpers.* import com.simplemobiletools.contacts.pro.interfaces.RefreshContactsListener -import com.simplemobiletools.contacts.pro.models.BlockedNumber import com.simplemobiletools.contacts.pro.models.Contact -import com.simplemobiletools.contacts.pro.models.RecentCall import kotlinx.android.synthetic.main.activity_main.* import kotlinx.android.synthetic.main.fragment_contacts.* import kotlinx.android.synthetic.main.fragment_favorites.* @@ -547,14 +541,8 @@ class MainActivity : SimpleActivity(), RefreshContactsListener { if (refreshTabsMask and RECENTS_TAB_MASK != 0) { ContactsHelper(this).getRecents { - val numbers = getBlockedNumbers() - val recents = it.filter { - val recentCall = it - numbers.none { it.number == recentCall.number || it.normalizedNumber == recentCall.number } - }.toMutableList() as ArrayList - val localContacts = LocalContactsHelper(applicationContext).getAllContacts() - recents.filter { it.name == null }.forEach { + it.filter { it.name == null }.forEach { val namelessCall = it val localContact = localContacts.firstOrNull { it.doesContainPhoneNumber(namelessCall.number) } if (localContact != null) { @@ -563,41 +551,12 @@ class MainActivity : SimpleActivity(), RefreshContactsListener { } runOnUiThread { - recents_fragment?.updateRecentCalls(recents) + recents_fragment?.updateRecentCalls(it) } } } } - @TargetApi(Build.VERSION_CODES.N) - private fun getBlockedNumbers(): ArrayList { - val blockedNumbers = ArrayList() - if (!isNougatPlus()) { - return blockedNumbers - } - - val uri = BlockedNumbers.CONTENT_URI - val projection = arrayOf(BlockedNumbers.COLUMN_ID, BlockedNumbers.COLUMN_ORIGINAL_NUMBER, BlockedNumbers.COLUMN_E164_NUMBER) - - var cursor: Cursor? = null - try { - cursor = contentResolver.query(uri, projection, null, null, null) - if (cursor?.moveToFirst() == true) { - do { - val id = cursor.getLongValue(BlockedNumbers.COLUMN_ID) - val number = cursor.getStringValue(BlockedNumbers.COLUMN_ORIGINAL_NUMBER) ?: "" - val normalizedNumber = cursor.getStringValue(BlockedNumbers.COLUMN_E164_NUMBER) ?: "" - val blockedNumber = BlockedNumber(id, number, normalizedNumber) - blockedNumbers.add(blockedNumber) - } while (cursor.moveToNext()) - } - } finally { - cursor?.close() - } - - return blockedNumbers - } - private fun getAllFragments() = arrayListOf(contacts_fragment, favorites_fragment, recents_fragment, groups_fragment) private fun getRecentsTabIndex(): Int { diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/helpers/ContactsHelper.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/helpers/ContactsHelper.kt index 9aa917ba..10abc5bc 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/helpers/ContactsHelper.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/helpers/ContactsHelper.kt @@ -3,12 +3,15 @@ package com.simplemobiletools.contacts.pro.helpers import android.accounts.Account import android.accounts.AccountManager import android.annotation.SuppressLint +import android.annotation.TargetApi import android.content.* import android.database.Cursor import android.graphics.Bitmap import android.net.Uri +import android.os.Build import android.os.Handler import android.os.Looper +import android.provider.BlockedNumberContract import android.provider.CallLog import android.provider.ContactsContract import android.provider.ContactsContract.CommonDataKinds @@ -1547,6 +1550,7 @@ class ContactsHelper(val context: Context) { return@Thread } + val blockedNumbers = getBlockedNumbers() val uri = CallLog.Calls.CONTENT_URI val projection = arrayOf( CallLog.Calls._ID, @@ -1577,6 +1581,10 @@ class ContactsHelper(val context: Context) { continue } + if (blockedNumbers.any { it.number == number || it.normalizedNumber == number }) { + continue + } + var formattedDate = SimpleDateFormat("dd MMM yyyy, $timeFormat", Locale.getDefault()).format(Date(date)) val datePart = formattedDate.substring(0, 11) when { @@ -1621,4 +1629,33 @@ class ContactsHelper(val context: Context) { } }.start() } + + @TargetApi(Build.VERSION_CODES.N) + private fun getBlockedNumbers(): ArrayList { + val blockedNumbers = ArrayList() + if (!isNougatPlus()) { + return blockedNumbers + } + + val uri = BlockedNumberContract.BlockedNumbers.CONTENT_URI + val projection = arrayOf(BlockedNumberContract.BlockedNumbers.COLUMN_ID, BlockedNumberContract.BlockedNumbers.COLUMN_ORIGINAL_NUMBER, BlockedNumberContract.BlockedNumbers.COLUMN_E164_NUMBER) + + var cursor: Cursor? = null + try { + cursor = context.contentResolver.query(uri, projection, null, null, null) + if (cursor?.moveToFirst() == true) { + do { + val id = cursor.getLongValue(BlockedNumberContract.BlockedNumbers.COLUMN_ID) + val number = cursor.getStringValue(BlockedNumberContract.BlockedNumbers.COLUMN_ORIGINAL_NUMBER) ?: "" + val normalizedNumber = cursor.getStringValue(BlockedNumberContract.BlockedNumbers.COLUMN_E164_NUMBER) ?: "" + val blockedNumber = BlockedNumber(id, number, normalizedNumber) + blockedNumbers.add(blockedNumber) + } while (cursor.moveToNext()) + } + } finally { + cursor?.close() + } + + return blockedNumbers + } } From de096cb8c862c3cca99de1950850c3fedaa0372f Mon Sep 17 00:00:00 2001 From: tibbi Date: Fri, 30 Nov 2018 14:37:52 +0100 Subject: [PATCH 109/134] allow blocking numbers directly from Recents screen --- .../pro/adapters/RecentCallsAdapter.kt | 20 +++++++++++++++++- .../contacts/pro/extensions/Context.kt | 10 +++++++++ app/src/main/res/drawable-hdpi/ic_block.png | Bin 0 -> 495 bytes app/src/main/res/drawable-xhdpi/ic_block.png | Bin 0 -> 624 bytes app/src/main/res/drawable-xxhdpi/ic_block.png | Bin 0 -> 928 bytes .../main/res/drawable-xxxhdpi/ic_block.png | Bin 0 -> 1240 bytes app/src/main/res/menu/cab_recent_calls.xml | 5 +++++ 7 files changed, 34 insertions(+), 1 deletion(-) create mode 100644 app/src/main/res/drawable-hdpi/ic_block.png create mode 100644 app/src/main/res/drawable-xhdpi/ic_block.png create mode 100644 app/src/main/res/drawable-xxhdpi/ic_block.png create mode 100644 app/src/main/res/drawable-xxxhdpi/ic_block.png diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/adapters/RecentCallsAdapter.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/adapters/RecentCallsAdapter.kt index 5a871563..a6479f67 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/adapters/RecentCallsAdapter.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/adapters/RecentCallsAdapter.kt @@ -10,6 +10,7 @@ import com.simplemobiletools.commons.views.FastScroller import com.simplemobiletools.commons.views.MyRecyclerView import com.simplemobiletools.contacts.pro.R import com.simplemobiletools.contacts.pro.activities.SimpleActivity +import com.simplemobiletools.contacts.pro.extensions.addBlockedNumber import com.simplemobiletools.contacts.pro.extensions.config import com.simplemobiletools.contacts.pro.helpers.ContactsHelper import com.simplemobiletools.contacts.pro.helpers.RECENTS_TAB_MASK @@ -28,7 +29,11 @@ class RecentCallsAdapter(activity: SimpleActivity, var recentCalls: ArrayList selectAll() R.id.cab_delete -> askConfirmDelete() + R.id.cab_block_number -> blockNumber() } } @@ -92,6 +98,18 @@ class RecentCallsAdapter(activity: SimpleActivity, var recentCalls: ArrayList private fun setupView(view: View, recentCall: RecentCall) { diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/extensions/Context.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/extensions/Context.kt index 0926d25d..6f590ccc 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/extensions/Context.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/extensions/Context.kt @@ -1,9 +1,11 @@ package com.simplemobiletools.contacts.pro.extensions +import android.content.ContentValues import android.content.Context import android.content.Intent import android.database.Cursor import android.net.Uri +import android.provider.BlockedNumberContract.BlockedNumbers import android.provider.ContactsContract import android.telecom.TelecomManager import androidx.core.content.FileProvider @@ -25,6 +27,7 @@ import com.simplemobiletools.contacts.pro.models.ContactSource import com.simplemobiletools.contacts.pro.models.Organization import java.io.File + val Context.config: Config get() = Config.newInstance(applicationContext) val Context.contactsDB: ContactsDao get() = ContactsDatabase.getInstance(applicationContext).ContactsDao() @@ -283,3 +286,10 @@ fun Context.getVisibleContactSources(): ArrayList { sourceNames.removeAll(config.ignoredContactSources) return sourceNames } + +fun Context.addBlockedNumber(number: String) { + ContentValues().apply { + put(BlockedNumbers.COLUMN_ORIGINAL_NUMBER, number) + contentResolver.insert(BlockedNumbers.CONTENT_URI, this) + } +} diff --git a/app/src/main/res/drawable-hdpi/ic_block.png b/app/src/main/res/drawable-hdpi/ic_block.png new file mode 100644 index 0000000000000000000000000000000000000000..1c541fe50a9571c3f2e2d9e84919cf5ec57ec132 GIT binary patch literal 495 zcmVqBX*SXL1%0JKR z5)4SxI;q|}eY(9@@GIjxOCeMRP-vPUlLY4v!2Z_jW6#z@)SE>ozk(I1*9nb+9 z6=eo(1D_P9(A+gh3)q$!_7yBhrO6E^;%g8^HF%R!^AiQSKy@^54>*)c^B3p9o@nS3 zFe!y5#2oM>8vFu`iqYhXYC;SJ&!geppgcx%7jRu}v`z`=iWYW)(qxUCj7Ca9XWY<6 zq|k&I1zto8pMu#bG$AH{r_sW_;9Lq#h=XyU~s6pDp^zHGuRqe)d)I5P4ab;As| zU}unwlYj_kP0>tv&m=imayKE74^LzN2H94 zOk^NkiIJoy<5|HiY7sde`g72N`~1OIrjqdZ={J(iAKa&9n0#YyBT&s&lEw#d)>4kZ zEt;4h97iCJQ6>bo@dw9@Kc*n?n(m?U3&}Lqc%wN*NH(3U@=!zz)1{m za>%%&HI>NX$oa{}a0IEOjr)Pk$QNQE^0PAX-;p94*=(GsPYyC8dR|zKWK-XHWE4_K zJbGSeK^ZdAd1yIu-7YU&MwU5`T}0+s=k>$O1?R!X$OOB*FdTX09OWSW?eanoB*!_b zLz>y;g)~y@991ESz&y&kA%#>qM|nv1!2B%ZiM~jlbMz1yVV4&sAP>F&rt|Ic!c63% zbF>V(Y%(x8Twb`2EOm}XBc-&+$k&C>6Q>dx{ zq4J~1L*TRtLKAKwP{tbn1%MH(AbDdXXYQ z7Y6cek-)O+J9_h-)*TS~ccCcn1l|I50%_BYT?7=7VHgr%6aWC&PAEc#xltwn0000< KMNUMnLSTZCeH~H& literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xxhdpi/ic_block.png b/app/src/main/res/drawable-xxhdpi/ic_block.png new file mode 100644 index 0000000000000000000000000000000000000000..d6dc2222fb8f1e31088e5cc19e554a6f40e5ae32 GIT binary patch literal 928 zcmV;R17G}!P)c1HD@MsNKUfoID^R~TEh>V7I0_2U=@ibai&E>Nz&0-%Qu{8A#e)yNHmfX z3y*BN6K?|NSp?k66ykLw+rr{&;LLI;VI(%Nw$+5dB%d{WR@fFznSA4 zSjNc~6m=2k==A7FT?>Xg5ST!zvz!)8N8nBif`P~eE_asGoE+{&puhR!Ap}0QNGMFo zX-kgnz&{8)WPa#|%%&h>PS2#AT-$|G79ia%JufH{>nz zLT%)A_cOO z==Nb7Qsh2IC_%QG7d9a!?sJ5EWRrPe8FHcf9N{EnnR#Ira)jKE)Ra)gf%c*y+GAA!4_=3K@Gq`w8hoe0dJrL&w;CWII^2z3yg&JL<8hCi;>btmU*bJ#;qZ;aoDw<^@0%$5)QxykxYr`!JSJo?78Xhv zN1}S1Vj*xc->^2r!MSh-lSs6Z&x1|#Ig=k)L!wEXVbO6CBT2S~Z@JXc;3{gd$$#<1 z?ef$t>QK#XT*he>?0HY!#>+Hh3aQnl++5%RW|OJeJaA+#aSBz;B#N0-+5SNe)eIwy zp;WVd%(R}p*ZJQ?#6p5wpoIj(eyIiJU=)mkQ2+qZQ#c3ie=sWm0000+qP|6h1e-RyA;fBY}+iwwv%VuT0Q(RPH*q@bkFVk)L&Us|Fm_) zoJb@Ri9~3?Sgt3|D}2VU?B*2N>|qU`@d|OSXDs#PTtsoEaz9&0#%3O1G9~0(K`ZX$ z1b!XkZd%LPMFFPpF{${NsT7d2fif&)4<_tl5oN?CV$9_LChcP$F|mW@d`1{Pqq&5S zv1AgKOvXx>xP%pW$>Brp;W~!Uh8h(9dy}ijIF|D|JMprTn1qAEyharPko4AZ35&#v+;3V$WQ&-HP3R`h= zh78~F3iWvjcU!4yZsS>to6YnR1L(_6+^nIZnO*lA+&oWlgJ<>kaPy6U-I)yXI>j6@ zh}ImzU52EF{^WIn{$davocYQ?36ApY!zq(?hVze+$X?1zP&`UrBW>g>k4P}|Ca-0- z@|8Z~A8BmF=?!9`=jZY@P8%p7esMWYYbb6Ze}LMD+AzvXKr=F559zi=saSQnh zbvPaHd_Xa>(N^2ecij)NC??5Z98PsDcM|25FFmh%LaX63KRd;Ig*s@P z{2xZUSk71IfcCxr6WL75`3lp}-V`sy(NZakTFP)WT8D}DPLhVS~kTbIXr}RnrhbbOLGkEAxRcJA@K=>0p{~H7UR?-mB;IuR8jf4 zA?KIoFxr|_UvNAfa=yZyIL#41NMi?1{jKG<tmGHxC!DSnzbL@3 zIDKOwKgL@){YsknM^`+U&DR&uN*4)+N37?MOZ8I&h4Snrkt2rlJCKdjKFUjQ3{05c zS`4B;N6D+dq=pPj`Lj7?>VqeR!hDUJ_bDxgP?AS*^EHJfb(CWbZg$a644@~QakGYU zVg^;&in|x6D=DBDan6MN*`>#aueqdCK?0yCm$4alo2h5>)8pgZLId%E=B(x*`T2qh zXXE4Vcesu^p1;wXC9EZpS1ByvAjS&3?BsQpF`oLwXF{Le3SGU@G@n z7zVXAj{EAru2Jy$vXFED0000 + From d00a7da67af6e6b41397293d2babfad4a7e2643a Mon Sep 17 00:00:00 2001 From: tibbi Date: Fri, 30 Nov 2018 14:48:53 +0100 Subject: [PATCH 110/134] adding a new string for Blocked Numbers title --- app/src/main/res/values-az/strings.xml | 1 + app/src/main/res/values-de/strings.xml | 1 + app/src/main/res/values-el/strings.xml | 1 + app/src/main/res/values-eu/strings.xml | 1 + app/src/main/res/values-fr/strings.xml | 1 + app/src/main/res/values-hr/strings.xml | 1 + app/src/main/res/values-it/strings.xml | 1 + app/src/main/res/values-ja/strings.xml | 1 + app/src/main/res/values-ko-rKR/strings.xml | 1 + app/src/main/res/values-lt/strings.xml | 1 + app/src/main/res/values-pt/strings.xml | 1 + app/src/main/res/values-ru/strings.xml | 1 + app/src/main/res/values-sk/strings.xml | 1 + app/src/main/res/values-sv/strings.xml | 1 + app/src/main/res/values-tr/strings.xml | 1 + app/src/main/res/values-zh-rTW/strings.xml | 1 + app/src/main/res/values/strings.xml | 1 + 17 files changed, 17 insertions(+) diff --git a/app/src/main/res/values-az/strings.xml b/app/src/main/res/values-az/strings.xml index ac97865f..188f347d 100644 --- a/app/src/main/res/values-az/strings.xml +++ b/app/src/main/res/values-az/strings.xml @@ -140,6 +140,7 @@ Add a blocked number Block number Block numbers + Blocked numbers I want to change what fields are visible at contacts. Can I do it? diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index 0fbae654..f9507407 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -140,6 +140,7 @@ Add a blocked number Block number Block numbers + Blocked numbers Ich möchte die sichtbaren Kontaktfelder ändern. Kann ich das machen? diff --git a/app/src/main/res/values-el/strings.xml b/app/src/main/res/values-el/strings.xml index 3750fff0..ad02d2e2 100644 --- a/app/src/main/res/values-el/strings.xml +++ b/app/src/main/res/values-el/strings.xml @@ -140,6 +140,7 @@ Add a blocked number Block number Block numbers + Blocked numbers Θέλω να αλλάξω τα πεδία που θα είναι ορατά στις επαφές. Μπορώ να το κάνω? diff --git a/app/src/main/res/values-eu/strings.xml b/app/src/main/res/values-eu/strings.xml index 3dae5a2e..1c2fb86d 100644 --- a/app/src/main/res/values-eu/strings.xml +++ b/app/src/main/res/values-eu/strings.xml @@ -140,6 +140,7 @@ Add a blocked number Block number Block numbers + Blocked numbers Aldatu ditzaket kontaktuetan ikusgarri dauden eremuak? diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml index db79ba42..9181e096 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -140,6 +140,7 @@ Add a blocked number Block number Block numbers + Blocked numbers Je veux modifier les champs affichés sur les fiches de mes contacts. Puis-je le faire ? diff --git a/app/src/main/res/values-hr/strings.xml b/app/src/main/res/values-hr/strings.xml index 68e438f9..94ae2df9 100644 --- a/app/src/main/res/values-hr/strings.xml +++ b/app/src/main/res/values-hr/strings.xml @@ -140,6 +140,7 @@ Add a blocked number Block number Block numbers + Blocked numbers Želim promijeniti polja koja su vidljiva na kontaktima. Mogu li to napraviti? diff --git a/app/src/main/res/values-it/strings.xml b/app/src/main/res/values-it/strings.xml index ff93dee4..776f1480 100644 --- a/app/src/main/res/values-it/strings.xml +++ b/app/src/main/res/values-it/strings.xml @@ -140,6 +140,7 @@ Add a blocked number Block number Block numbers + Blocked numbers Voglio cambiare i campi visibili ai contatti. Come posso fare? diff --git a/app/src/main/res/values-ja/strings.xml b/app/src/main/res/values-ja/strings.xml index 2c569f79..0940b30d 100644 --- a/app/src/main/res/values-ja/strings.xml +++ b/app/src/main/res/values-ja/strings.xml @@ -140,6 +140,7 @@ ブロックする番号を追加 Block number Block numbers + Blocked numbers 連絡先に表示される項目(フィールド)を変更することはできますか? diff --git a/app/src/main/res/values-ko-rKR/strings.xml b/app/src/main/res/values-ko-rKR/strings.xml index 76e49499..8bfa332a 100644 --- a/app/src/main/res/values-ko-rKR/strings.xml +++ b/app/src/main/res/values-ko-rKR/strings.xml @@ -140,6 +140,7 @@ Add a blocked number Block number Block numbers + Blocked numbers I want to change what fields are visible at contacts. Can I do it? diff --git a/app/src/main/res/values-lt/strings.xml b/app/src/main/res/values-lt/strings.xml index f6dfa2d2..925aee00 100644 --- a/app/src/main/res/values-lt/strings.xml +++ b/app/src/main/res/values-lt/strings.xml @@ -140,6 +140,7 @@ Add a blocked number Block number Block numbers + Blocked numbers Noriu pakeisti, kokie laukai yra matomi kontaktuose. Ar galiu tai padaryti? diff --git a/app/src/main/res/values-pt/strings.xml b/app/src/main/res/values-pt/strings.xml index 49e8d856..3c1d5311 100644 --- a/app/src/main/res/values-pt/strings.xml +++ b/app/src/main/res/values-pt/strings.xml @@ -140,6 +140,7 @@ Add a blocked number Block number Block numbers + Blocked numbers I want to change what fields are visible at contacts. Can I do it? diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index 46af63fd..18ffccfe 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -140,6 +140,7 @@ Add a blocked number Block number Block numbers + Blocked numbers Я хочу изменить поля, отображаемые у контактов. Могу ли я это сделать? diff --git a/app/src/main/res/values-sk/strings.xml b/app/src/main/res/values-sk/strings.xml index 79162ae5..e03eaa90 100644 --- a/app/src/main/res/values-sk/strings.xml +++ b/app/src/main/res/values-sk/strings.xml @@ -140,6 +140,7 @@ Pridať blokované číslo Blokovať číslo Blokovať čísla + Blokované čísla Chcem upraviť viditeľné polia kontaktov. Dá sa to? diff --git a/app/src/main/res/values-sv/strings.xml b/app/src/main/res/values-sv/strings.xml index e9fe79e2..9a630c24 100644 --- a/app/src/main/res/values-sv/strings.xml +++ b/app/src/main/res/values-sv/strings.xml @@ -140,6 +140,7 @@ Add a blocked number Block number Block numbers + Blocked numbers I want to change what fields are visible at contacts. Can I do it? diff --git a/app/src/main/res/values-tr/strings.xml b/app/src/main/res/values-tr/strings.xml index 7c2b1a82..5529aeea 100644 --- a/app/src/main/res/values-tr/strings.xml +++ b/app/src/main/res/values-tr/strings.xml @@ -140,6 +140,7 @@ Add a blocked number Block number Block numbers + Blocked numbers Rehberde görüntülenecek alanları değiştirmek istiyorum. Bunu yapabilir miyim? diff --git a/app/src/main/res/values-zh-rTW/strings.xml b/app/src/main/res/values-zh-rTW/strings.xml index b4d5cf35..a3ef7e0d 100644 --- a/app/src/main/res/values-zh-rTW/strings.xml +++ b/app/src/main/res/values-zh-rTW/strings.xml @@ -140,6 +140,7 @@ Add a blocked number Block number Block numbers + Blocked numbers 我想要更改在通訊錄會看到哪些欄位。我能這麼做嗎? diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index a0f7c727..f33fbd58 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -140,6 +140,7 @@ Add a blocked number Block number Block numbers + Blocked numbers I want to change what fields are visible at contacts. Can I do it? From 4131aae57602318dc82b8e6371f37590c1444dfb Mon Sep 17 00:00:00 2001 From: tibbi Date: Fri, 30 Nov 2018 15:13:03 +0100 Subject: [PATCH 111/134] add an activity for managing blocked numbers --- app/src/main/AndroidManifest.xml | 5 ++ .../ManageBlockedNumbersActivity.kt | 61 +++++++++++++++++++ .../pro/activities/SettingsActivity.kt | 5 +- .../contacts/pro/extensions/Context.kt | 42 ++++++++++++- .../contacts/pro/helpers/ContactsHelper.kt | 34 +---------- .../activity_manage_blocked_numbers.xml | 42 +++++++++++++ .../main/res/layout/item_blocked_number.xml | 20 ++++++ .../main/res/menu/menu_add_blocked_number.xml | 9 +++ 8 files changed, 180 insertions(+), 38 deletions(-) create mode 100644 app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/ManageBlockedNumbersActivity.kt create mode 100644 app/src/main/res/layout/activity_manage_blocked_numbers.xml create mode 100644 app/src/main/res/layout/item_blocked_number.xml create mode 100644 app/src/main/res/menu/menu_add_blocked_number.xml diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index fc11ce08..c965a109 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -203,6 +203,11 @@ android:label="@string/frequently_asked_questions" android:parentActivityName="com.simplemobiletools.commons.activities.AboutActivity"/> + + addBlockedNumber() + else -> return super.onOptionsItemSelected(item) + } + return true + } + + override fun refreshItems() { + updateBlockedNumbers() + } + + private fun addBlockedNumber() { + + } +} diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/SettingsActivity.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/SettingsActivity.kt index 145b79b6..db351714 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/SettingsActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/SettingsActivity.kt @@ -1,6 +1,7 @@ package com.simplemobiletools.contacts.pro.activities import android.annotation.TargetApi +import android.content.Intent import android.os.Build import android.os.Bundle import com.simplemobiletools.commons.dialogs.RadioGroupDialog @@ -12,7 +13,6 @@ import com.simplemobiletools.contacts.pro.R import com.simplemobiletools.contacts.pro.dialogs.ManageVisibleFieldsDialog import com.simplemobiletools.contacts.pro.dialogs.ManageVisibleTabsDialog import com.simplemobiletools.contacts.pro.extensions.config -import com.simplemobiletools.contacts.pro.extensions.telecomManager import com.simplemobiletools.contacts.pro.helpers.ON_CLICK_CALL_CONTACT import com.simplemobiletools.contacts.pro.helpers.ON_CLICK_EDIT_CONTACT import com.simplemobiletools.contacts.pro.helpers.ON_CLICK_VIEW_CONTACT @@ -64,11 +64,12 @@ class SettingsActivity : SimpleActivity() { } } + // support for device-wise blocking came on Android 7, rely only on that @TargetApi(Build.VERSION_CODES.N) private fun setupManageBlockedNumbers() { settings_manage_blocked_numbers_holder.beVisibleIf(isNougatPlus()) settings_manage_blocked_numbers_holder.setOnClickListener { - startActivity(telecomManager.createManageBlockedNumbersIntent()) + startActivity(Intent(this, ManageBlockedNumbersActivity::class.java)) } } diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/extensions/Context.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/extensions/Context.kt index 6f590ccc..5aec8054 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/extensions/Context.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/extensions/Context.kt @@ -1,19 +1,21 @@ package com.simplemobiletools.contacts.pro.extensions +import android.annotation.TargetApi import android.content.ContentValues import android.content.Context import android.content.Intent import android.database.Cursor import android.net.Uri +import android.os.Build +import android.provider.BlockedNumberContract import android.provider.BlockedNumberContract.BlockedNumbers import android.provider.ContactsContract import android.telecom.TelecomManager import androidx.core.content.FileProvider -import com.simplemobiletools.commons.extensions.getIntValue -import com.simplemobiletools.commons.extensions.hasPermission -import com.simplemobiletools.commons.extensions.toast +import com.simplemobiletools.commons.extensions.* import com.simplemobiletools.commons.helpers.PERMISSION_READ_CONTACTS import com.simplemobiletools.commons.helpers.PERMISSION_WRITE_CONTACTS +import com.simplemobiletools.commons.helpers.isNougatPlus import com.simplemobiletools.contacts.pro.BuildConfig import com.simplemobiletools.contacts.pro.R import com.simplemobiletools.contacts.pro.activities.EditContactActivity @@ -22,6 +24,7 @@ import com.simplemobiletools.contacts.pro.databases.ContactsDatabase import com.simplemobiletools.contacts.pro.helpers.* import com.simplemobiletools.contacts.pro.interfaces.ContactsDao import com.simplemobiletools.contacts.pro.interfaces.GroupsDao +import com.simplemobiletools.contacts.pro.models.BlockedNumber import com.simplemobiletools.contacts.pro.models.Contact import com.simplemobiletools.contacts.pro.models.ContactSource import com.simplemobiletools.contacts.pro.models.Organization @@ -287,6 +290,39 @@ fun Context.getVisibleContactSources(): ArrayList { return sourceNames } +@TargetApi(Build.VERSION_CODES.N) +fun Context.getBlockedNumbers(): ArrayList { + val blockedNumbers = ArrayList() + if (!isNougatPlus()) { + return blockedNumbers + } + + val uri = BlockedNumberContract.BlockedNumbers.CONTENT_URI + val projection = arrayOf( + BlockedNumberContract.BlockedNumbers.COLUMN_ID, + BlockedNumberContract.BlockedNumbers.COLUMN_ORIGINAL_NUMBER, + BlockedNumberContract.BlockedNumbers.COLUMN_E164_NUMBER + ) + + var cursor: Cursor? = null + try { + cursor = contentResolver.query(uri, projection, null, null, null) + if (cursor?.moveToFirst() == true) { + do { + val id = cursor.getLongValue(BlockedNumberContract.BlockedNumbers.COLUMN_ID) + val number = cursor.getStringValue(BlockedNumberContract.BlockedNumbers.COLUMN_ORIGINAL_NUMBER) ?: "" + val normalizedNumber = cursor.getStringValue(BlockedNumberContract.BlockedNumbers.COLUMN_E164_NUMBER) ?: "" + val blockedNumber = BlockedNumber(id, number, normalizedNumber) + blockedNumbers.add(blockedNumber) + } while (cursor.moveToNext()) + } + } finally { + cursor?.close() + } + + return blockedNumbers +} + fun Context.addBlockedNumber(number: String) { ContentValues().apply { put(BlockedNumbers.COLUMN_ORIGINAL_NUMBER, number) diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/helpers/ContactsHelper.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/helpers/ContactsHelper.kt index 10abc5bc..8c701fbc 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/helpers/ContactsHelper.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/helpers/ContactsHelper.kt @@ -3,15 +3,12 @@ package com.simplemobiletools.contacts.pro.helpers import android.accounts.Account import android.accounts.AccountManager import android.annotation.SuppressLint -import android.annotation.TargetApi import android.content.* import android.database.Cursor import android.graphics.Bitmap import android.net.Uri -import android.os.Build import android.os.Handler import android.os.Looper -import android.provider.BlockedNumberContract import android.provider.CallLog import android.provider.ContactsContract import android.provider.ContactsContract.CommonDataKinds @@ -1550,7 +1547,7 @@ class ContactsHelper(val context: Context) { return@Thread } - val blockedNumbers = getBlockedNumbers() + val blockedNumbers = context.getBlockedNumbers() val uri = CallLog.Calls.CONTENT_URI val projection = arrayOf( CallLog.Calls._ID, @@ -1629,33 +1626,4 @@ class ContactsHelper(val context: Context) { } }.start() } - - @TargetApi(Build.VERSION_CODES.N) - private fun getBlockedNumbers(): ArrayList { - val blockedNumbers = ArrayList() - if (!isNougatPlus()) { - return blockedNumbers - } - - val uri = BlockedNumberContract.BlockedNumbers.CONTENT_URI - val projection = arrayOf(BlockedNumberContract.BlockedNumbers.COLUMN_ID, BlockedNumberContract.BlockedNumbers.COLUMN_ORIGINAL_NUMBER, BlockedNumberContract.BlockedNumbers.COLUMN_E164_NUMBER) - - var cursor: Cursor? = null - try { - cursor = context.contentResolver.query(uri, projection, null, null, null) - if (cursor?.moveToFirst() == true) { - do { - val id = cursor.getLongValue(BlockedNumberContract.BlockedNumbers.COLUMN_ID) - val number = cursor.getStringValue(BlockedNumberContract.BlockedNumbers.COLUMN_ORIGINAL_NUMBER) ?: "" - val normalizedNumber = cursor.getStringValue(BlockedNumberContract.BlockedNumbers.COLUMN_E164_NUMBER) ?: "" - val blockedNumber = BlockedNumber(id, number, normalizedNumber) - blockedNumbers.add(blockedNumber) - } while (cursor.moveToNext()) - } - } finally { - cursor?.close() - } - - return blockedNumbers - } } diff --git a/app/src/main/res/layout/activity_manage_blocked_numbers.xml b/app/src/main/res/layout/activity_manage_blocked_numbers.xml new file mode 100644 index 00000000..64a4f9b3 --- /dev/null +++ b/app/src/main/res/layout/activity_manage_blocked_numbers.xml @@ -0,0 +1,42 @@ + + + + + + + + + + diff --git a/app/src/main/res/layout/item_blocked_number.xml b/app/src/main/res/layout/item_blocked_number.xml new file mode 100644 index 00000000..e78f8724 --- /dev/null +++ b/app/src/main/res/layout/item_blocked_number.xml @@ -0,0 +1,20 @@ + + + + + + diff --git a/app/src/main/res/menu/menu_add_blocked_number.xml b/app/src/main/res/menu/menu_add_blocked_number.xml new file mode 100644 index 00000000..fb290efd --- /dev/null +++ b/app/src/main/res/menu/menu_add_blocked_number.xml @@ -0,0 +1,9 @@ + + + + From bf95eccce34475d863b48bfa80a8e78849297ded Mon Sep 17 00:00:00 2001 From: tibbi Date: Fri, 30 Nov 2018 15:15:15 +0100 Subject: [PATCH 112/134] show the number blocking menu item at Recents only on Android 7+ --- .../contacts/pro/adapters/RecentCallsAdapter.kt | 2 ++ .../com/simplemobiletools/contacts/pro/extensions/Context.kt | 1 + 2 files changed, 3 insertions(+) diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/adapters/RecentCallsAdapter.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/adapters/RecentCallsAdapter.kt index a6479f67..c6a29f07 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/adapters/RecentCallsAdapter.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/adapters/RecentCallsAdapter.kt @@ -6,6 +6,7 @@ import android.view.ViewGroup import com.simplemobiletools.commons.adapters.MyRecyclerViewAdapter import com.simplemobiletools.commons.dialogs.ConfirmationDialog import com.simplemobiletools.commons.extensions.beVisibleIf +import com.simplemobiletools.commons.helpers.isNougatPlus import com.simplemobiletools.commons.views.FastScroller import com.simplemobiletools.commons.views.MyRecyclerView import com.simplemobiletools.contacts.pro.R @@ -31,6 +32,7 @@ class RecentCallsAdapter(activity: SimpleActivity, var recentCalls: ArrayList { return blockedNumbers } +@TargetApi(Build.VERSION_CODES.N) fun Context.addBlockedNumber(number: String) { ContentValues().apply { put(BlockedNumbers.COLUMN_ORIGINAL_NUMBER, number) From 64db7ac0532b0c9742058d871e95da42660800fa Mon Sep 17 00:00:00 2001 From: tibbi Date: Fri, 30 Nov 2018 15:28:57 +0100 Subject: [PATCH 113/134] list the blocked numbers at the particular activity --- .../ManageBlockedNumbersActivity.kt | 7 ++ .../adapters/ManageBlockedNumbersAdapter.kt | 81 +++++++++++++++++++ ...ber.xml => item_manage_blocked_number.xml} | 0 3 files changed, 88 insertions(+) create mode 100644 app/src/main/kotlin/com/simplemobiletools/contacts/pro/adapters/ManageBlockedNumbersAdapter.kt rename app/src/main/res/layout/{item_blocked_number.xml => item_manage_blocked_number.xml} (100%) diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/ManageBlockedNumbersActivity.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/ManageBlockedNumbersActivity.kt index c07285be..062964a4 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/ManageBlockedNumbersActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/ManageBlockedNumbersActivity.kt @@ -9,6 +9,7 @@ import com.simplemobiletools.commons.extensions.underlineText import com.simplemobiletools.commons.extensions.updateTextColors import com.simplemobiletools.commons.interfaces.RefreshRecyclerViewListener import com.simplemobiletools.contacts.pro.R +import com.simplemobiletools.contacts.pro.adapters.ManageBlockedNumbersAdapter import com.simplemobiletools.contacts.pro.extensions.getBlockedNumbers import kotlinx.android.synthetic.main.activity_manage_blocked_numbers.* @@ -31,6 +32,12 @@ class ManageBlockedNumbersActivity : SimpleActivity(), RefreshRecyclerViewListen private fun updateBlockedNumbers() { Thread { val blockedNumbers = getBlockedNumbers() + ManageBlockedNumbersAdapter(this, blockedNumbers, this, manage_blocked_numbers_list) { + + }.apply { + manage_blocked_numbers_list.adapter = this + } + runOnUiThread { manage_blocked_numbers_placeholder.beVisibleIf(blockedNumbers.isEmpty()) manage_blocked_numbers_placeholder_2.beVisibleIf(blockedNumbers.isEmpty()) diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/adapters/ManageBlockedNumbersAdapter.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/adapters/ManageBlockedNumbersAdapter.kt new file mode 100644 index 00000000..f48e385a --- /dev/null +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/adapters/ManageBlockedNumbersAdapter.kt @@ -0,0 +1,81 @@ +package com.simplemobiletools.contacts.pro.adapters + +import android.view.Menu +import android.view.View +import android.view.ViewGroup +import com.simplemobiletools.commons.activities.BaseSimpleActivity +import com.simplemobiletools.commons.adapters.MyRecyclerViewAdapter +import com.simplemobiletools.commons.interfaces.RefreshRecyclerViewListener +import com.simplemobiletools.commons.views.MyRecyclerView +import com.simplemobiletools.contacts.pro.R +import com.simplemobiletools.contacts.pro.extensions.config +import com.simplemobiletools.contacts.pro.models.BlockedNumber +import kotlinx.android.synthetic.main.item_manage_blocked_number.view.* +import java.util.* + +class ManageBlockedNumbersAdapter(activity: BaseSimpleActivity, var blockedNumbers: ArrayList, val listener: RefreshRecyclerViewListener?, + recyclerView: MyRecyclerView, itemClick: (Any) -> Unit) : MyRecyclerViewAdapter(activity, recyclerView, null, itemClick) { + + private val config = activity.config + + init { + setupDragListener(true) + } + + override fun getActionMenuId() = R.menu.cab_remove_only + + override fun prepareActionMode(menu: Menu) {} + + override fun actionItemPressed(id: Int) { + when (id) { + R.id.cab_remove -> removeSelection() + } + } + + override fun getSelectableItemCount() = blockedNumbers.size + + override fun getIsItemSelectable(position: Int) = true + + override fun getItemSelectionKey(position: Int) = blockedNumbers.getOrNull(position)?.id?.toInt() + + override fun getItemKeyPosition(key: Int) = blockedNumbers.indexOfFirst { it.id.toInt() == key } + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int) = createViewHolder(R.layout.item_manage_blocked_number, parent) + + override fun onBindViewHolder(holder: ViewHolder, position: Int) { + val folder = blockedNumbers[position] + holder.bindView(folder, true, true) { itemView, adapterPosition -> + setupView(itemView, folder) + } + bindViewHolder(holder) + } + + override fun getItemCount() = blockedNumbers.size + + private fun getSelectedItems() = blockedNumbers.filter { selectedKeys.contains(it.id.toInt()) } as ArrayList + + private fun setupView(view: View, blockedNumber: BlockedNumber) { + view.apply { + manage_blocked_number_holder?.isSelected = selectedKeys.contains(blockedNumber.id.toInt()) + manage_blocked_number_title.apply { + text = blockedNumber.number + setTextColor(config.textColor) + } + } + } + + private fun removeSelection() { + val removeFolders = ArrayList(selectedKeys.size) + val positions = getSelectedItemPositions() + + getSelectedItems().forEach { + removeFolders.add(it) + } + + blockedNumbers.removeAll(removeFolders) + removeSelectedItems(positions) + if (blockedNumbers.isEmpty()) { + listener?.refreshItems() + } + } +} diff --git a/app/src/main/res/layout/item_blocked_number.xml b/app/src/main/res/layout/item_manage_blocked_number.xml similarity index 100% rename from app/src/main/res/layout/item_blocked_number.xml rename to app/src/main/res/layout/item_manage_blocked_number.xml From fa7a44736901bbcc53479c3602e4baefaa4d0c90 Mon Sep 17 00:00:00 2001 From: tibbi Date: Fri, 30 Nov 2018 15:38:18 +0100 Subject: [PATCH 114/134] properly handle removing blocked numbers from the managing activity --- .../pro/adapters/ManageBlockedNumbersAdapter.kt | 16 ++++++++++------ .../contacts/pro/extensions/Context.kt | 8 ++++++++ 2 files changed, 18 insertions(+), 6 deletions(-) diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/adapters/ManageBlockedNumbersAdapter.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/adapters/ManageBlockedNumbersAdapter.kt index f48e385a..6f248a31 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/adapters/ManageBlockedNumbersAdapter.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/adapters/ManageBlockedNumbersAdapter.kt @@ -9,6 +9,7 @@ import com.simplemobiletools.commons.interfaces.RefreshRecyclerViewListener import com.simplemobiletools.commons.views.MyRecyclerView import com.simplemobiletools.contacts.pro.R import com.simplemobiletools.contacts.pro.extensions.config +import com.simplemobiletools.contacts.pro.extensions.deleteBlockedNumber import com.simplemobiletools.contacts.pro.models.BlockedNumber import kotlinx.android.synthetic.main.item_manage_blocked_number.view.* import java.util.* @@ -43,9 +44,9 @@ class ManageBlockedNumbersAdapter(activity: BaseSimpleActivity, var blockedNumbe override fun onCreateViewHolder(parent: ViewGroup, viewType: Int) = createViewHolder(R.layout.item_manage_blocked_number, parent) override fun onBindViewHolder(holder: ViewHolder, position: Int) { - val folder = blockedNumbers[position] - holder.bindView(folder, true, true) { itemView, adapterPosition -> - setupView(itemView, folder) + val blockedNumber = blockedNumbers[position] + holder.bindView(blockedNumber, true, true) { itemView, adapterPosition -> + setupView(itemView, blockedNumber) } bindViewHolder(holder) } @@ -65,14 +66,17 @@ class ManageBlockedNumbersAdapter(activity: BaseSimpleActivity, var blockedNumbe } private fun removeSelection() { - val removeFolders = ArrayList(selectedKeys.size) + val removeBlockedNumbers = ArrayList(selectedKeys.size) val positions = getSelectedItemPositions() getSelectedItems().forEach { - removeFolders.add(it) + removeBlockedNumbers.add(it) + Thread { + activity.deleteBlockedNumber(it.number) + }.start() } - blockedNumbers.removeAll(removeFolders) + blockedNumbers.removeAll(removeBlockedNumbers) removeSelectedItems(positions) if (blockedNumbers.isEmpty()) { listener?.refreshItems() diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/extensions/Context.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/extensions/Context.kt index 85f2d87a..0c1bb722 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/extensions/Context.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/extensions/Context.kt @@ -330,3 +330,11 @@ fun Context.addBlockedNumber(number: String) { contentResolver.insert(BlockedNumbers.CONTENT_URI, this) } } + +@TargetApi(Build.VERSION_CODES.N) +fun Context.deleteBlockedNumber(number: String) { + val values = ContentValues() + values.put(BlockedNumbers.COLUMN_ORIGINAL_NUMBER, number) + val uri = contentResolver.insert(BlockedNumbers.CONTENT_URI, values) + contentResolver.delete(uri, null, null) +} From 841a13b0689a659ff6ce2aa27bf88a729387d26b Mon Sep 17 00:00:00 2001 From: tibbi Date: Fri, 30 Nov 2018 15:52:46 +0100 Subject: [PATCH 115/134] create a dialog for adding new blocked numbers --- .../ManageBlockedNumbersActivity.kt | 17 +++++---- .../adapters/ManageBlockedNumbersAdapter.kt | 4 +-- .../pro/dialogs/AddBlockedNumberDialog.kt | 35 +++++++++++++++++++ .../res/layout/dialog_add_blocked_number.xml | 20 +++++++++++ 4 files changed, 66 insertions(+), 10 deletions(-) create mode 100644 app/src/main/kotlin/com/simplemobiletools/contacts/pro/dialogs/AddBlockedNumberDialog.kt create mode 100644 app/src/main/res/layout/dialog_add_blocked_number.xml diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/ManageBlockedNumbersActivity.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/ManageBlockedNumbersActivity.kt index 062964a4..a189df05 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/ManageBlockedNumbersActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/ManageBlockedNumbersActivity.kt @@ -10,6 +10,7 @@ import com.simplemobiletools.commons.extensions.updateTextColors import com.simplemobiletools.commons.interfaces.RefreshRecyclerViewListener import com.simplemobiletools.contacts.pro.R import com.simplemobiletools.contacts.pro.adapters.ManageBlockedNumbersAdapter +import com.simplemobiletools.contacts.pro.dialogs.AddBlockedNumberDialog import com.simplemobiletools.contacts.pro.extensions.getBlockedNumbers import kotlinx.android.synthetic.main.activity_manage_blocked_numbers.* @@ -32,13 +33,13 @@ class ManageBlockedNumbersActivity : SimpleActivity(), RefreshRecyclerViewListen private fun updateBlockedNumbers() { Thread { val blockedNumbers = getBlockedNumbers() - ManageBlockedNumbersAdapter(this, blockedNumbers, this, manage_blocked_numbers_list) { - - }.apply { - manage_blocked_numbers_list.adapter = this - } - runOnUiThread { + ManageBlockedNumbersAdapter(this, blockedNumbers, this, manage_blocked_numbers_list) { + + }.apply { + manage_blocked_numbers_list.adapter = this + } + manage_blocked_numbers_placeholder.beVisibleIf(blockedNumbers.isEmpty()) manage_blocked_numbers_placeholder_2.beVisibleIf(blockedNumbers.isEmpty()) } @@ -63,6 +64,8 @@ class ManageBlockedNumbersActivity : SimpleActivity(), RefreshRecyclerViewListen } private fun addBlockedNumber() { - + AddBlockedNumberDialog(this) { + updateBlockedNumbers() + } } } diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/adapters/ManageBlockedNumbersAdapter.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/adapters/ManageBlockedNumbersAdapter.kt index 6f248a31..5dee5305 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/adapters/ManageBlockedNumbersAdapter.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/adapters/ManageBlockedNumbersAdapter.kt @@ -71,9 +71,7 @@ class ManageBlockedNumbersAdapter(activity: BaseSimpleActivity, var blockedNumbe getSelectedItems().forEach { removeBlockedNumbers.add(it) - Thread { - activity.deleteBlockedNumber(it.number) - }.start() + activity.deleteBlockedNumber(it.number) } blockedNumbers.removeAll(removeBlockedNumbers) diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/dialogs/AddBlockedNumberDialog.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/dialogs/AddBlockedNumberDialog.kt new file mode 100644 index 00000000..cfc35f89 --- /dev/null +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/dialogs/AddBlockedNumberDialog.kt @@ -0,0 +1,35 @@ +package com.simplemobiletools.contacts.pro.dialogs + +import androidx.appcompat.app.AlertDialog +import com.simplemobiletools.commons.activities.BaseSimpleActivity +import com.simplemobiletools.commons.extensions.setupDialogStuff +import com.simplemobiletools.commons.extensions.showKeyboard +import com.simplemobiletools.commons.extensions.value +import com.simplemobiletools.contacts.pro.R +import com.simplemobiletools.contacts.pro.extensions.addBlockedNumber +import kotlinx.android.synthetic.main.dialog_add_blocked_number.view.* + +class AddBlockedNumberDialog(val activity: BaseSimpleActivity, val callback: () -> Unit) { + init { + + val view = activity.layoutInflater.inflate(R.layout.dialog_add_blocked_number, null) + + AlertDialog.Builder(activity) + .setPositiveButton(R.string.ok, null) + .setNegativeButton(R.string.cancel, null) + .create().apply { + activity.setupDialogStuff(view, this) { + showKeyboard(view.add_blocked_number_edittext) + getButton(AlertDialog.BUTTON_POSITIVE).setOnClickListener { + val phoneNumber = view.add_blocked_number_edittext.value + if (phoneNumber.isNotEmpty()) { + activity.addBlockedNumber(phoneNumber) + } + + callback() + dismiss() + } + } + } + } +} diff --git a/app/src/main/res/layout/dialog_add_blocked_number.xml b/app/src/main/res/layout/dialog_add_blocked_number.xml new file mode 100644 index 00000000..1e0024d5 --- /dev/null +++ b/app/src/main/res/layout/dialog_add_blocked_number.xml @@ -0,0 +1,20 @@ + + + + + + From b6e00fba448c1c416b4879eb23517a4b4404ab58 Mon Sep 17 00:00:00 2001 From: tibbi Date: Fri, 30 Nov 2018 16:13:07 +0100 Subject: [PATCH 116/134] allow editing blocked numbers --- .../ManageBlockedNumbersActivity.kt | 11 +++++----- .../pro/adapters/RecentCallsAdapter.kt | 1 + .../pro/dialogs/AddBlockedNumberDialog.kt | 21 +++++++++++++------ 3 files changed, 22 insertions(+), 11 deletions(-) diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/ManageBlockedNumbersActivity.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/ManageBlockedNumbersActivity.kt index a189df05..947a179b 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/ManageBlockedNumbersActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/ManageBlockedNumbersActivity.kt @@ -12,6 +12,7 @@ import com.simplemobiletools.contacts.pro.R import com.simplemobiletools.contacts.pro.adapters.ManageBlockedNumbersAdapter import com.simplemobiletools.contacts.pro.dialogs.AddBlockedNumberDialog import com.simplemobiletools.contacts.pro.extensions.getBlockedNumbers +import com.simplemobiletools.contacts.pro.models.BlockedNumber import kotlinx.android.synthetic.main.activity_manage_blocked_numbers.* class ManageBlockedNumbersActivity : SimpleActivity(), RefreshRecyclerViewListener { @@ -25,7 +26,7 @@ class ManageBlockedNumbersActivity : SimpleActivity(), RefreshRecyclerViewListen underlineText() setTextColor(getAdjustedPrimaryColor()) setOnClickListener { - addBlockedNumber() + addOrEditBlockedNumber() } } } @@ -35,7 +36,7 @@ class ManageBlockedNumbersActivity : SimpleActivity(), RefreshRecyclerViewListen val blockedNumbers = getBlockedNumbers() runOnUiThread { ManageBlockedNumbersAdapter(this, blockedNumbers, this, manage_blocked_numbers_list) { - + addOrEditBlockedNumber(it as BlockedNumber) }.apply { manage_blocked_numbers_list.adapter = this } @@ -53,7 +54,7 @@ class ManageBlockedNumbersActivity : SimpleActivity(), RefreshRecyclerViewListen override fun onOptionsItemSelected(item: MenuItem): Boolean { when (item.itemId) { - R.id.add_blocked_number -> addBlockedNumber() + R.id.add_blocked_number -> addOrEditBlockedNumber() else -> return super.onOptionsItemSelected(item) } return true @@ -63,8 +64,8 @@ class ManageBlockedNumbersActivity : SimpleActivity(), RefreshRecyclerViewListen updateBlockedNumbers() } - private fun addBlockedNumber() { - AddBlockedNumberDialog(this) { + private fun addOrEditBlockedNumber(currentNumber: BlockedNumber? = null) { + AddBlockedNumberDialog(this, currentNumber) { updateBlockedNumbers() } } diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/adapters/RecentCallsAdapter.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/adapters/RecentCallsAdapter.kt index c6a29f07..41b24af4 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/adapters/RecentCallsAdapter.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/adapters/RecentCallsAdapter.kt @@ -105,6 +105,7 @@ class RecentCallsAdapter(activity: SimpleActivity, var recentCalls: ArrayList Unit) { +class AddBlockedNumberDialog(val activity: BaseSimpleActivity, val originalNumber: BlockedNumber? = null, val callback: () -> Unit) { init { - - val view = activity.layoutInflater.inflate(R.layout.dialog_add_blocked_number, null) + val view = activity.layoutInflater.inflate(R.layout.dialog_add_blocked_number, null).apply { + if (originalNumber != null) { + add_blocked_number_edittext.setText(originalNumber.number) + } + } AlertDialog.Builder(activity) .setPositiveButton(R.string.ok, null) @@ -21,9 +26,13 @@ class AddBlockedNumberDialog(val activity: BaseSimpleActivity, val callback: () activity.setupDialogStuff(view, this) { showKeyboard(view.add_blocked_number_edittext) getButton(AlertDialog.BUTTON_POSITIVE).setOnClickListener { - val phoneNumber = view.add_blocked_number_edittext.value - if (phoneNumber.isNotEmpty()) { - activity.addBlockedNumber(phoneNumber) + val newBlockedNumber = view.add_blocked_number_edittext.value + if (originalNumber != null && newBlockedNumber != originalNumber.number) { + activity.deleteBlockedNumber(originalNumber.number) + } + + if (newBlockedNumber.isNotEmpty()) { + activity.addBlockedNumber(newBlockedNumber) } callback() From 7331217e8ae348329b2b33cd2ecde2fbde49c63d Mon Sep 17 00:00:00 2001 From: tibbi Date: Fri, 30 Nov 2018 16:35:21 +0100 Subject: [PATCH 117/134] adding a helper function for checking if the app is set as the default dialer --- .../contacts/pro/activities/DialerActivity.kt | 5 +++-- .../com/simplemobiletools/contacts/pro/extensions/Context.kt | 3 +++ .../contacts/pro/fragments/RecentsFragment.kt | 4 ++-- 3 files changed, 8 insertions(+), 4 deletions(-) diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/DialerActivity.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/DialerActivity.kt index 9e23396e..a9f79510 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/DialerActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/DialerActivity.kt @@ -11,6 +11,7 @@ import android.telecom.TelecomManager import com.simplemobiletools.commons.extensions.showErrorToast import com.simplemobiletools.commons.extensions.toast import com.simplemobiletools.contacts.pro.R +import com.simplemobiletools.contacts.pro.extensions.isDefaultDialer import com.simplemobiletools.contacts.pro.extensions.telecomManager @TargetApi(Build.VERSION_CODES.M) @@ -25,7 +26,7 @@ class DialerActivity : SimpleActivity() { callNumber = intent.data // make sure Simple Contacts is the default Phone app before initiating an outgoing call - if (telecomManager.defaultDialerPackage != packageName) { + if (!isDefaultDialer()) { val intent = Intent(TelecomManager.ACTION_CHANGE_DEFAULT_DIALER).putExtra(TelecomManager.EXTRA_CHANGE_DEFAULT_DIALER_PACKAGE_NAME, packageName) startActivityForResult(intent, REQUEST_CODE_SET_DEFAULT_DIALER) } else { @@ -56,7 +57,7 @@ class DialerActivity : SimpleActivity() { override fun onActivityResult(requestCode: Int, resultCode: Int, resultData: Intent?) { super.onActivityResult(requestCode, resultCode, resultData) if (requestCode == REQUEST_CODE_SET_DEFAULT_DIALER) { - if (telecomManager.defaultDialerPackage != packageName) { + if (!isDefaultDialer()) { finish() } else { initOutgoingCall() diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/extensions/Context.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/extensions/Context.kt index 0c1bb722..3fe4c8ad 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/extensions/Context.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/extensions/Context.kt @@ -338,3 +338,6 @@ fun Context.deleteBlockedNumber(number: String) { val uri = contentResolver.insert(BlockedNumbers.CONTENT_URI, values) contentResolver.delete(uri, null, null) } + +@TargetApi(Build.VERSION_CODES.M) +fun Context.isDefaultDialer() = telecomManager.defaultDialerPackage != packageName diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/fragments/RecentsFragment.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/fragments/RecentsFragment.kt index 9be66792..689e62f6 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/fragments/RecentsFragment.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/fragments/RecentsFragment.kt @@ -14,8 +14,8 @@ import com.simplemobiletools.commons.helpers.isMarshmallowPlus import com.simplemobiletools.contacts.pro.activities.EditContactActivity import com.simplemobiletools.contacts.pro.adapters.RecentCallsAdapter import com.simplemobiletools.contacts.pro.extensions.contactClicked +import com.simplemobiletools.contacts.pro.extensions.isDefaultDialer import com.simplemobiletools.contacts.pro.extensions.normalizeNumber -import com.simplemobiletools.contacts.pro.extensions.telecomManager import com.simplemobiletools.contacts.pro.helpers.IS_FROM_SIMPLE_CONTACTS import com.simplemobiletools.contacts.pro.helpers.KEY_PHONE import com.simplemobiletools.contacts.pro.helpers.RECENTS_TAB_MASK @@ -28,7 +28,7 @@ class RecentsFragment(context: Context, attributeSet: AttributeSet) : MyViewPage @TargetApi(Build.VERSION_CODES.M) override fun placeholderClicked() { - if (!isMarshmallowPlus() || (isMarshmallowPlus() && context.telecomManager.defaultDialerPackage == context.packageName)) { + if (!isMarshmallowPlus() || (isMarshmallowPlus() && context.isDefaultDialer())) { activity!!.handlePermission(PERMISSION_WRITE_CALL_LOG) { if (it) { activity!!.handlePermission(PERMISSION_READ_CALL_LOG) { From 4acee7d62bb3b7cc507f59d91a47b8d6a691b53c Mon Sep 17 00:00:00 2001 From: tibbi Date: Fri, 30 Nov 2018 16:40:26 +0100 Subject: [PATCH 118/134] fixing the default dialer check --- .../com/simplemobiletools/contacts/pro/extensions/Context.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/extensions/Context.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/extensions/Context.kt index 3fe4c8ad..9e28945f 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/extensions/Context.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/extensions/Context.kt @@ -340,4 +340,4 @@ fun Context.deleteBlockedNumber(number: String) { } @TargetApi(Build.VERSION_CODES.M) -fun Context.isDefaultDialer() = telecomManager.defaultDialerPackage != packageName +fun Context.isDefaultDialer() = telecomManager.defaultDialerPackage == packageName From c8c7e7ce3b4c5cc9b9a4d16ae57126afa235deca Mon Sep 17 00:00:00 2001 From: tibbi Date: Fri, 30 Nov 2018 16:43:02 +0100 Subject: [PATCH 119/134] fix #287, add handling for some secret codes at the dialpad --- .../contacts/pro/activities/DialerActivity.kt | 2 +- .../pro/activities/DialpadActivity.kt | 33 +++++++++++++++++++ .../contacts/pro/extensions/Context.kt | 2 +- .../contacts/pro/helpers/Constants.kt | 1 + 4 files changed, 36 insertions(+), 2 deletions(-) diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/DialerActivity.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/DialerActivity.kt index a9f79510..099bbd5c 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/DialerActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/DialerActivity.kt @@ -13,10 +13,10 @@ import com.simplemobiletools.commons.extensions.toast import com.simplemobiletools.contacts.pro.R import com.simplemobiletools.contacts.pro.extensions.isDefaultDialer import com.simplemobiletools.contacts.pro.extensions.telecomManager +import com.simplemobiletools.contacts.pro.helpers.REQUEST_CODE_SET_DEFAULT_DIALER @TargetApi(Build.VERSION_CODES.M) class DialerActivity : SimpleActivity() { - private val REQUEST_CODE_SET_DEFAULT_DIALER = 1 private var callNumber: Uri? = null override fun onCreate(savedInstanceState: Bundle?) { diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/DialpadActivity.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/DialpadActivity.kt index d9e3d4ee..c368aeb1 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/DialpadActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/DialpadActivity.kt @@ -1,23 +1,31 @@ package com.simplemobiletools.contacts.pro.activities +import android.annotation.TargetApi import android.content.Intent import android.graphics.Color import android.net.Uri +import android.os.Build import android.os.Bundle +import android.provider.Telephony.Sms.Intents.SECRET_CODE_ACTION +import android.telecom.TelecomManager +import android.telephony.TelephonyManager import android.view.KeyEvent import android.view.Menu import android.view.MenuItem import android.view.View import com.simplemobiletools.commons.extensions.* +import com.simplemobiletools.commons.helpers.isOreoPlus import com.simplemobiletools.contacts.pro.R import com.simplemobiletools.contacts.pro.adapters.ContactsAdapter import com.simplemobiletools.contacts.pro.dialogs.CallConfirmationDialog import com.simplemobiletools.contacts.pro.extensions.callContact import com.simplemobiletools.contacts.pro.extensions.config +import com.simplemobiletools.contacts.pro.extensions.isDefaultDialer import com.simplemobiletools.contacts.pro.extensions.startCallIntent import com.simplemobiletools.contacts.pro.helpers.ContactsHelper import com.simplemobiletools.contacts.pro.helpers.KEY_PHONE import com.simplemobiletools.contacts.pro.helpers.LOCATION_DIALPAD +import com.simplemobiletools.contacts.pro.helpers.REQUEST_CODE_SET_DEFAULT_DIALER import com.simplemobiletools.contacts.pro.models.Contact import kotlinx.android.synthetic.main.activity_dialpad.* @@ -134,7 +142,25 @@ class DialpadActivity : SimpleActivity() { checkDialIntent() } + @TargetApi(Build.VERSION_CODES.O) private fun dialpadValueChanged(text: String) { + val len = text.length + if (len > 8 && text.startsWith("*#*#") && text.endsWith("#*#*")) { + val secretCode = text.substring(4, text.length - 4) + if (isOreoPlus()) { + if (isDefaultDialer()) { + getSystemService(TelephonyManager::class.java).sendDialerSpecialCode(secretCode) + } else { + val intent = Intent(TelecomManager.ACTION_CHANGE_DEFAULT_DIALER).putExtra(TelecomManager.EXTRA_CHANGE_DEFAULT_DIALER_PACKAGE_NAME, packageName) + startActivityForResult(intent, REQUEST_CODE_SET_DEFAULT_DIALER) + } + } else { + val intent = Intent(SECRET_CODE_ACTION, Uri.parse("android_secret_code://$secretCode")) + sendBroadcast(intent) + } + return + } + (dialpad_list.adapter as? ContactsAdapter)?.finishActMode() val filtered = contacts.filter { it.doesContainPhoneNumber(text) } as ArrayList @@ -152,6 +178,13 @@ class DialpadActivity : SimpleActivity() { } } + override fun onActivityResult(requestCode: Int, resultCode: Int, resultData: Intent?) { + super.onActivityResult(requestCode, resultCode, resultData) + if (requestCode == REQUEST_CODE_SET_DEFAULT_DIALER && isDefaultDialer()) { + dialpadValueChanged(dialpad_input.value) + } + } + private fun initCall() { val number = dialpad_input.value if (number.isNotEmpty()) { diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/extensions/Context.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/extensions/Context.kt index 9e28945f..68f7e912 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/extensions/Context.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/extensions/Context.kt @@ -293,7 +293,7 @@ fun Context.getVisibleContactSources(): ArrayList { @TargetApi(Build.VERSION_CODES.N) fun Context.getBlockedNumbers(): ArrayList { val blockedNumbers = ArrayList() - if (!isNougatPlus()) { + if (!isNougatPlus() || !isDefaultDialer()) { return blockedNumbers } diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/helpers/Constants.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/helpers/Constants.kt index 458256b1..8826a543 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/helpers/Constants.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/helpers/Constants.kt @@ -27,6 +27,7 @@ const val IS_FROM_SIMPLE_CONTACTS = "is_from_simple_contacts" const val ADD_NEW_CONTACT_NUMBER = "add_new_contact_number" const val FIRST_CONTACT_ID = 1000000 const val FIRST_GROUP_ID = 10000L +const val REQUEST_CODE_SET_DEFAULT_DIALER = 1 // extras used at third party intents const val KEY_PHONE = "phone" From 69840a321d829289e804ffbd97acfcbc8237a3e9 Mon Sep 17 00:00:00 2001 From: tibbi Date: Fri, 30 Nov 2018 16:49:37 +0100 Subject: [PATCH 120/134] adding some strings related to setting the app as the default dialer --- app/src/main/res/values-az/strings.xml | 4 +++- app/src/main/res/values-de/strings.xml | 4 +++- app/src/main/res/values-el/strings.xml | 4 +++- app/src/main/res/values-eu/strings.xml | 4 +++- app/src/main/res/values-fr/strings.xml | 4 +++- app/src/main/res/values-hr/strings.xml | 4 +++- app/src/main/res/values-it/strings.xml | 4 +++- app/src/main/res/values-ja/strings.xml | 4 +++- app/src/main/res/values-ko-rKR/strings.xml | 4 +++- app/src/main/res/values-lt/strings.xml | 4 +++- app/src/main/res/values-pt/strings.xml | 4 +++- app/src/main/res/values-ru/strings.xml | 4 +++- app/src/main/res/values-sk/strings.xml | 4 +++- app/src/main/res/values-sv/strings.xml | 4 +++- app/src/main/res/values-tr/strings.xml | 4 +++- app/src/main/res/values-zh-rTW/strings.xml | 4 +++- app/src/main/res/values/strings.xml | 4 +++- 17 files changed, 51 insertions(+), 17 deletions(-) diff --git a/app/src/main/res/values-az/strings.xml b/app/src/main/res/values-az/strings.xml index 188f347d..fd4f43b3 100644 --- a/app/src/main/res/values-az/strings.xml +++ b/app/src/main/res/values-az/strings.xml @@ -17,6 +17,8 @@ Lazım olan icazələri istə Create new contact Add to an existing contact + You have to make this app the default dialer app to make use of blocked numbers. + Set to default No contacts found @@ -136,7 +138,7 @@ Manage blocked numbers - You are not blocking anyone + You are not blocking anyone. Add a blocked number Block number Block numbers diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index f9507407..d031d5b3 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -17,6 +17,8 @@ Benötigte Berechtigungen anfordern Neuen Kontakt erstellen Zu einem existierenden Kontakt hinzufügen + You have to make this app the default dialer app to make use of blocked numbers. + Set to default Keine Kontakte gefunden @@ -136,7 +138,7 @@ Manage blocked numbers - You are not blocking anyone + You are not blocking anyone. Add a blocked number Block number Block numbers diff --git a/app/src/main/res/values-el/strings.xml b/app/src/main/res/values-el/strings.xml index ad02d2e2..b18b448e 100644 --- a/app/src/main/res/values-el/strings.xml +++ b/app/src/main/res/values-el/strings.xml @@ -17,6 +17,8 @@ Ζητούνται τα απαιτούμενα δικαιώματα Δημιουργία νέας Επαφής Προσθήκη σε μια υπάρχουσα Επαφή + You have to make this app the default dialer app to make use of blocked numbers. + Set to default No contacts found @@ -136,7 +138,7 @@ Manage blocked numbers - You are not blocking anyone + You are not blocking anyone. Add a blocked number Block number Block numbers diff --git a/app/src/main/res/values-eu/strings.xml b/app/src/main/res/values-eu/strings.xml index 1c2fb86d..da6af990 100644 --- a/app/src/main/res/values-eu/strings.xml +++ b/app/src/main/res/values-eu/strings.xml @@ -17,6 +17,8 @@ Eskatu beharrezko baimenak Create new contact Add to an existing contact + You have to make this app the default dialer app to make use of blocked numbers. + Set to default No contacts found @@ -136,7 +138,7 @@ Manage blocked numbers - You are not blocking anyone + You are not blocking anyone. Add a blocked number Block number Block numbers diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml index 9181e096..093f665a 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -17,6 +17,8 @@ Demander les autorisations nécessaires Créer un nouveau contact Ajouter à un contact existant + You have to make this app the default dialer app to make use of blocked numbers. + Set to default Aucun contact n\'a été trouvé @@ -136,7 +138,7 @@ Manage blocked numbers - You are not blocking anyone + You are not blocking anyone. Add a blocked number Block number Block numbers diff --git a/app/src/main/res/values-hr/strings.xml b/app/src/main/res/values-hr/strings.xml index 94ae2df9..22a6d639 100644 --- a/app/src/main/res/values-hr/strings.xml +++ b/app/src/main/res/values-hr/strings.xml @@ -17,6 +17,8 @@ Zatraži potrebna dopuštenja Create new contact Add to an existing contact + You have to make this app the default dialer app to make use of blocked numbers. + Set to default No contacts found @@ -136,7 +138,7 @@ Manage blocked numbers - You are not blocking anyone + You are not blocking anyone. Add a blocked number Block number Block numbers diff --git a/app/src/main/res/values-it/strings.xml b/app/src/main/res/values-it/strings.xml index 776f1480..4c3cb04d 100644 --- a/app/src/main/res/values-it/strings.xml +++ b/app/src/main/res/values-it/strings.xml @@ -17,6 +17,8 @@ Richiedi le permissioni necessarie Crea un nuovo contatto Aggiungi ad un contatto esistente + You have to make this app the default dialer app to make use of blocked numbers. + Set to default Nessun contatto trovato @@ -136,7 +138,7 @@ Manage blocked numbers - You are not blocking anyone + You are not blocking anyone. Add a blocked number Block number Block numbers diff --git a/app/src/main/res/values-ja/strings.xml b/app/src/main/res/values-ja/strings.xml index 0940b30d..fec96b80 100644 --- a/app/src/main/res/values-ja/strings.xml +++ b/app/src/main/res/values-ja/strings.xml @@ -17,6 +17,8 @@ Request the required permissions 新しい連絡先を作成 既存の連絡先に追加 + You have to make this app the default dialer app to make use of blocked numbers. + Set to default 連絡先が見つかりません @@ -136,7 +138,7 @@ ブロックした番号を管理 - まだ誰もブロックしていません + まだ誰もブロックしていません. ブロックする番号を追加 Block number Block numbers diff --git a/app/src/main/res/values-ko-rKR/strings.xml b/app/src/main/res/values-ko-rKR/strings.xml index 8bfa332a..38dc1ab2 100644 --- a/app/src/main/res/values-ko-rKR/strings.xml +++ b/app/src/main/res/values-ko-rKR/strings.xml @@ -17,6 +17,8 @@ Request the required permissions Create new contact Add to an existing contact + You have to make this app the default dialer app to make use of blocked numbers. + Set to default No contacts found @@ -136,7 +138,7 @@ Manage blocked numbers - You are not blocking anyone + You are not blocking anyone. Add a blocked number Block number Block numbers diff --git a/app/src/main/res/values-lt/strings.xml b/app/src/main/res/values-lt/strings.xml index 925aee00..471adfb6 100644 --- a/app/src/main/res/values-lt/strings.xml +++ b/app/src/main/res/values-lt/strings.xml @@ -17,6 +17,8 @@ Request the required permissions Create new contact Add to an existing contact + You have to make this app the default dialer app to make use of blocked numbers. + Set to default No contacts found @@ -136,7 +138,7 @@ Manage blocked numbers - You are not blocking anyone + You are not blocking anyone. Add a blocked number Block number Block numbers diff --git a/app/src/main/res/values-pt/strings.xml b/app/src/main/res/values-pt/strings.xml index 3c1d5311..d185d0fd 100644 --- a/app/src/main/res/values-pt/strings.xml +++ b/app/src/main/res/values-pt/strings.xml @@ -17,6 +17,8 @@ Pedir a permissão necessária Criar novo contacto Adicionar a contacto existente + You have to make this app the default dialer app to make use of blocked numbers. + Set to default Não existem contactos @@ -136,7 +138,7 @@ Manage blocked numbers - You are not blocking anyone + You are not blocking anyone. Add a blocked number Block number Block numbers diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index 18ffccfe..7bab0c68 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -17,6 +17,8 @@ Запрос необходимых разрешений Создать новый контакт Добавить к существующему контакту + You have to make this app the default dialer app to make use of blocked numbers. + Set to default Контакты не найдены @@ -136,7 +138,7 @@ Manage blocked numbers - You are not blocking anyone + You are not blocking anyone. Add a blocked number Block number Block numbers diff --git a/app/src/main/res/values-sk/strings.xml b/app/src/main/res/values-sk/strings.xml index e03eaa90..614febb0 100644 --- a/app/src/main/res/values-sk/strings.xml +++ b/app/src/main/res/values-sk/strings.xml @@ -17,6 +17,8 @@ Vyžiadať potrebné oprávnenia Vytvoriť nový kontakt Pridať k existujúcemu kontaktu + Pre použitie blokovania čísel musíte nastaviť aplikáciu ako predvolenú pre správu hovorov. + Nastaviť ako predvolenú Nenašli sa žiadne kontakty @@ -136,7 +138,7 @@ Spravovať blokované čísla - Neblokujete nikoho + Neblokujete nikoho. Pridať blokované číslo Blokovať číslo Blokovať čísla diff --git a/app/src/main/res/values-sv/strings.xml b/app/src/main/res/values-sv/strings.xml index 9a630c24..43dba3f3 100644 --- a/app/src/main/res/values-sv/strings.xml +++ b/app/src/main/res/values-sv/strings.xml @@ -17,6 +17,8 @@ Begär de behörigheter som krävs Skapa ny kontakt Lägg till i en befintlig kontakt + You have to make this app the default dialer app to make use of blocked numbers. + Set to default Inga kontakter hittades @@ -136,7 +138,7 @@ Manage blocked numbers - You are not blocking anyone + You are not blocking anyone. Add a blocked number Block number Block numbers diff --git a/app/src/main/res/values-tr/strings.xml b/app/src/main/res/values-tr/strings.xml index 5529aeea..15d9bf3d 100644 --- a/app/src/main/res/values-tr/strings.xml +++ b/app/src/main/res/values-tr/strings.xml @@ -17,6 +17,8 @@ Gerekli izinleri iste Yeni kişi oluştur Mevcut bir kişiye ekle + You have to make this app the default dialer app to make use of blocked numbers. + Set to default Kişi bulunamadı @@ -136,7 +138,7 @@ Manage blocked numbers - You are not blocking anyone + You are not blocking anyone. Add a blocked number Block number Block numbers diff --git a/app/src/main/res/values-zh-rTW/strings.xml b/app/src/main/res/values-zh-rTW/strings.xml index a3ef7e0d..77e3ff87 100644 --- a/app/src/main/res/values-zh-rTW/strings.xml +++ b/app/src/main/res/values-zh-rTW/strings.xml @@ -17,6 +17,8 @@ 請求必要的權限 建立新聯絡人 添加至已存在的聯絡人 + You have to make this app the default dialer app to make use of blocked numbers. + Set to default 未發現聯絡人 @@ -136,7 +138,7 @@ Manage blocked numbers - You are not blocking anyone + You are not blocking anyone. Add a blocked number Block number Block numbers diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index f33fbd58..af52d0b9 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -17,6 +17,8 @@ Request the required permissions Create new contact Add to an existing contact + You have to make this app the default dialer app to make use of blocked numbers. + Set to default No contacts found @@ -136,7 +138,7 @@ Manage blocked numbers - You are not blocking anyone + You are not blocking anyone. Add a blocked number Block number Block numbers From 7865aa93f6525a6f6b4505c6b1152f85e88afaa7 Mon Sep 17 00:00:00 2001 From: tibbi Date: Fri, 30 Nov 2018 16:53:58 +0100 Subject: [PATCH 121/134] adding a helper function for launching the setDefaultDialer intent --- .../contacts/pro/activities/DialerActivity.kt | 3 +-- .../contacts/pro/activities/DialpadActivity.kt | 4 +--- .../contacts/pro/activities/SimpleActivity.kt | 10 ++++++++++ 3 files changed, 12 insertions(+), 5 deletions(-) diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/DialerActivity.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/DialerActivity.kt index 099bbd5c..39ce6b69 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/DialerActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/DialerActivity.kt @@ -27,8 +27,7 @@ class DialerActivity : SimpleActivity() { // make sure Simple Contacts is the default Phone app before initiating an outgoing call if (!isDefaultDialer()) { - val intent = Intent(TelecomManager.ACTION_CHANGE_DEFAULT_DIALER).putExtra(TelecomManager.EXTRA_CHANGE_DEFAULT_DIALER_PACKAGE_NAME, packageName) - startActivityForResult(intent, REQUEST_CODE_SET_DEFAULT_DIALER) + launchSetDefaultDialerIntent() } else { initOutgoingCall() } diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/DialpadActivity.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/DialpadActivity.kt index c368aeb1..f6250e0d 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/DialpadActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/DialpadActivity.kt @@ -7,7 +7,6 @@ import android.net.Uri import android.os.Build import android.os.Bundle import android.provider.Telephony.Sms.Intents.SECRET_CODE_ACTION -import android.telecom.TelecomManager import android.telephony.TelephonyManager import android.view.KeyEvent import android.view.Menu @@ -151,8 +150,7 @@ class DialpadActivity : SimpleActivity() { if (isDefaultDialer()) { getSystemService(TelephonyManager::class.java).sendDialerSpecialCode(secretCode) } else { - val intent = Intent(TelecomManager.ACTION_CHANGE_DEFAULT_DIALER).putExtra(TelecomManager.EXTRA_CHANGE_DEFAULT_DIALER_PACKAGE_NAME, packageName) - startActivityForResult(intent, REQUEST_CODE_SET_DEFAULT_DIALER) + launchSetDefaultDialerIntent() } } else { val intent = Intent(SECRET_CODE_ACTION, Uri.parse("android_secret_code://$secretCode")) diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/SimpleActivity.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/SimpleActivity.kt index 26858bb3..63ac285a 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/SimpleActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/SimpleActivity.kt @@ -1,10 +1,14 @@ package com.simplemobiletools.contacts.pro.activities +import android.annotation.TargetApi import android.content.ContentValues import android.content.Intent +import android.os.Build +import android.telecom.TelecomManager import com.simplemobiletools.commons.activities.BaseSimpleActivity import com.simplemobiletools.contacts.pro.R import com.simplemobiletools.contacts.pro.helpers.KEY_PHONE +import com.simplemobiletools.contacts.pro.helpers.REQUEST_CODE_SET_DEFAULT_DIALER open class SimpleActivity : BaseSimpleActivity() { override fun getAppIconIDs() = arrayListOf( @@ -47,4 +51,10 @@ open class SimpleActivity : BaseSimpleActivity() { } return null } + + @TargetApi(Build.VERSION_CODES.M) + protected fun launchSetDefaultDialerIntent() { + val intent = Intent(TelecomManager.ACTION_CHANGE_DEFAULT_DIALER).putExtra(TelecomManager.EXTRA_CHANGE_DEFAULT_DIALER_PACKAGE_NAME, packageName) + startActivityForResult(intent, REQUEST_CODE_SET_DEFAULT_DIALER) + } } From 8fa8e05a7c6caf60f7a76735af7dd8c443f0e295 Mon Sep 17 00:00:00 2001 From: tibbi Date: Fri, 30 Nov 2018 17:08:08 +0100 Subject: [PATCH 122/134] properly handle not being the default dialer app at the Manage blocked calls screen --- .../ManageBlockedNumbersActivity.kt | 55 +++++++++++++------ 1 file changed, 38 insertions(+), 17 deletions(-) diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/ManageBlockedNumbersActivity.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/ManageBlockedNumbersActivity.kt index 947a179b..ae1ed642 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/ManageBlockedNumbersActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/ManageBlockedNumbersActivity.kt @@ -1,5 +1,6 @@ package com.simplemobiletools.contacts.pro.activities +import android.content.Intent import android.os.Bundle import android.view.Menu import android.view.MenuItem @@ -12,6 +13,8 @@ import com.simplemobiletools.contacts.pro.R import com.simplemobiletools.contacts.pro.adapters.ManageBlockedNumbersAdapter import com.simplemobiletools.contacts.pro.dialogs.AddBlockedNumberDialog import com.simplemobiletools.contacts.pro.extensions.getBlockedNumbers +import com.simplemobiletools.contacts.pro.extensions.isDefaultDialer +import com.simplemobiletools.contacts.pro.helpers.REQUEST_CODE_SET_DEFAULT_DIALER import com.simplemobiletools.contacts.pro.models.BlockedNumber import kotlinx.android.synthetic.main.activity_manage_blocked_numbers.* @@ -21,32 +24,21 @@ class ManageBlockedNumbersActivity : SimpleActivity(), RefreshRecyclerViewListen setContentView(R.layout.activity_manage_blocked_numbers) updateBlockedNumbers() updateTextColors(manage_blocked_numbers_wrapper) + updatePlaceholderTexts() manage_blocked_numbers_placeholder_2.apply { underlineText() setTextColor(getAdjustedPrimaryColor()) setOnClickListener { - addOrEditBlockedNumber() + if (isDefaultDialer()) { + addOrEditBlockedNumber() + } else { + launchSetDefaultDialerIntent() + } } } } - private fun updateBlockedNumbers() { - Thread { - val blockedNumbers = getBlockedNumbers() - runOnUiThread { - ManageBlockedNumbersAdapter(this, blockedNumbers, this, manage_blocked_numbers_list) { - addOrEditBlockedNumber(it as BlockedNumber) - }.apply { - manage_blocked_numbers_list.adapter = this - } - - manage_blocked_numbers_placeholder.beVisibleIf(blockedNumbers.isEmpty()) - manage_blocked_numbers_placeholder_2.beVisibleIf(blockedNumbers.isEmpty()) - } - }.start() - } - override fun onCreateOptionsMenu(menu: Menu?): Boolean { menuInflater.inflate(R.menu.menu_add_blocked_number, menu) return true @@ -64,9 +56,38 @@ class ManageBlockedNumbersActivity : SimpleActivity(), RefreshRecyclerViewListen updateBlockedNumbers() } + private fun updatePlaceholderTexts() { + manage_blocked_numbers_placeholder.text = getString(if (isDefaultDialer()) R.string.not_blocking_anyone else R.string.must_make_default_dialer) + manage_blocked_numbers_placeholder_2.text = getString(if (isDefaultDialer()) R.string.add_a_blocked_number else R.string.set_to_default) + } + + private fun updateBlockedNumbers() { + Thread { + val blockedNumbers = getBlockedNumbers() + runOnUiThread { + ManageBlockedNumbersAdapter(this, blockedNumbers, this, manage_blocked_numbers_list) { + addOrEditBlockedNumber(it as BlockedNumber) + }.apply { + manage_blocked_numbers_list.adapter = this + } + + manage_blocked_numbers_placeholder.beVisibleIf(blockedNumbers.isEmpty()) + manage_blocked_numbers_placeholder_2.beVisibleIf(blockedNumbers.isEmpty()) + } + }.start() + } + private fun addOrEditBlockedNumber(currentNumber: BlockedNumber? = null) { AddBlockedNumberDialog(this, currentNumber) { updateBlockedNumbers() } } + + override fun onActivityResult(requestCode: Int, resultCode: Int, resultData: Intent?) { + super.onActivityResult(requestCode, resultCode, resultData) + if (requestCode == REQUEST_CODE_SET_DEFAULT_DIALER && isDefaultDialer()) { + updatePlaceholderTexts() + updateBlockedNumbers() + } + } } From a8c3dcf23a3db3e64351b7fdfc1ad2eb8b2be1b5 Mon Sep 17 00:00:00 2001 From: tibbi Date: Fri, 30 Nov 2018 17:18:51 +0100 Subject: [PATCH 123/134] properly handle generating contact uri for local contacts --- .../contacts/pro/activities/EditContactActivity.kt | 6 +++++- .../pro/activities/InsertOrEditContactActivity.kt | 9 ++++----- .../simplemobiletools/contacts/pro/extensions/Context.kt | 6 +++++- 3 files changed, 14 insertions(+), 7 deletions(-) diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/EditContactActivity.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/EditContactActivity.kt index df213ace..5be562b6 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/EditContactActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/EditContactActivity.kt @@ -128,7 +128,11 @@ class EditContactActivity : ContactActivity() { val data = intent.data if (data != null) { val rawId = if (data.path.contains("lookup")) { - getLookupUriRawId(data) + if (data.pathSegments.last().startsWith("local_")) { + data.path.substringAfter("local_").toInt() + } else { + getLookupUriRawId(data) + } } else { getContactUriRawId(data) } diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/InsertOrEditContactActivity.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/InsertOrEditContactActivity.kt index 1fbcf274..c933ed30 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/InsertOrEditContactActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/InsertOrEditContactActivity.kt @@ -13,10 +13,7 @@ import com.simplemobiletools.contacts.pro.R import com.simplemobiletools.contacts.pro.adapters.ContactsAdapter import com.simplemobiletools.contacts.pro.extensions.config import com.simplemobiletools.contacts.pro.extensions.getContactPublicUri -import com.simplemobiletools.contacts.pro.helpers.ADD_NEW_CONTACT_NUMBER -import com.simplemobiletools.contacts.pro.helpers.ContactsHelper -import com.simplemobiletools.contacts.pro.helpers.KEY_PHONE -import com.simplemobiletools.contacts.pro.helpers.LOCATION_INSERT_OR_EDIT +import com.simplemobiletools.contacts.pro.helpers.* import com.simplemobiletools.contacts.pro.models.Contact import kotlinx.android.synthetic.main.activity_insert_edit_contact.* @@ -59,10 +56,12 @@ class InsertOrEditContactActivity : SimpleActivity() { private fun gotContacts(contacts: ArrayList) { ContactsAdapter(this, contacts, null, LOCATION_INSERT_OR_EDIT, null, existing_contact_list, existing_contact_fastscroller) { + val contact = it as Contact Intent(applicationContext, EditContactActivity::class.java).apply { - data = getContactPublicUri(it as Contact) + data = getContactPublicUri(contact) action = ADD_NEW_CONTACT_NUMBER putExtra(KEY_PHONE, getPhoneNumberFromIntent(intent)) + putExtra(IS_PRIVATE, contact.source == SMT_PRIVATE) startActivityForResult(this, START_EDIT_ACTIVITY) } }.apply { diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/extensions/Context.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/extensions/Context.kt index 68f7e912..69bb28df 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/extensions/Context.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/extensions/Context.kt @@ -278,7 +278,11 @@ fun Context.removeContactsFromGroup(contacts: ArrayList, groupId: Long) } fun Context.getContactPublicUri(contact: Contact): Uri { - val lookupKey = ContactsHelper(this).getContactLookupKey(contact.id.toString()) + val lookupKey = if (contact.source == SMT_PRIVATE) { + "local_${contact.id}" + } else { + ContactsHelper(this).getContactLookupKey(contact.id.toString()) + } return Uri.withAppendedPath(ContactsContract.Contacts.CONTENT_LOOKUP_URI, lookupKey) } From 12973ac57c47161e992c9e7188287396656a41d6 Mon Sep 17 00:00:00 2001 From: tibbi Date: Fri, 30 Nov 2018 17:25:58 +0100 Subject: [PATCH 124/134] add a helper function for checking if a contact is private --- .../contacts/pro/activities/EditContactActivity.kt | 2 +- .../pro/activities/InsertOrEditContactActivity.kt | 2 +- .../pro/activities/SelectContactActivity.kt | 3 +-- .../contacts/pro/activities/ViewContactActivity.kt | 2 +- .../contacts/pro/extensions/Context.kt | 14 +++++++------- .../contacts/pro/helpers/ContactsHelper.kt | 14 +++++++------- .../contacts/pro/models/Contact.kt | 3 +++ 7 files changed, 21 insertions(+), 19 deletions(-) diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/EditContactActivity.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/EditContactActivity.kt index 5be562b6..7876a7aa 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/EditContactActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/EditContactActivity.kt @@ -91,7 +91,7 @@ class EditContactActivity : ContactActivity() { if (wasActivityInitialized) { menu.findItem(R.id.delete).isVisible = contact?.id != 0 menu.findItem(R.id.share).isVisible = contact?.id != 0 - menu.findItem(R.id.open_with).isVisible = contact?.id != 0 && contact?.source != SMT_PRIVATE + menu.findItem(R.id.open_with).isVisible = contact?.id != 0 && contact?.isPrivate() == false } return true } diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/InsertOrEditContactActivity.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/InsertOrEditContactActivity.kt index c933ed30..36934f94 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/InsertOrEditContactActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/InsertOrEditContactActivity.kt @@ -61,7 +61,7 @@ class InsertOrEditContactActivity : SimpleActivity() { data = getContactPublicUri(contact) action = ADD_NEW_CONTACT_NUMBER putExtra(KEY_PHONE, getPhoneNumberFromIntent(intent)) - putExtra(IS_PRIVATE, contact.source == SMT_PRIVATE) + putExtra(IS_PRIVATE, contact.isPrivate()) startActivityForResult(this, START_EDIT_ACTIVITY) } }.apply { diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/SelectContactActivity.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/SelectContactActivity.kt index a09d7f86..ffeb168c 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/SelectContactActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/SelectContactActivity.kt @@ -17,7 +17,6 @@ import com.simplemobiletools.contacts.pro.extensions.config import com.simplemobiletools.contacts.pro.extensions.getContactPublicUri import com.simplemobiletools.contacts.pro.extensions.getVisibleContactSources import com.simplemobiletools.contacts.pro.helpers.ContactsHelper -import com.simplemobiletools.contacts.pro.helpers.SMT_PRIVATE import com.simplemobiletools.contacts.pro.models.Contact import kotlinx.android.synthetic.main.activity_select_contact.* @@ -90,7 +89,7 @@ class SelectContactActivity : SimpleActivity() { ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE -> it.phoneNumbers.isNotEmpty() else -> true } - it.source != SMT_PRIVATE && hasRequiredValues + !it.isPrivate() && hasRequiredValues } else { true } diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/ViewContactActivity.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/ViewContactActivity.kt index 78c2536b..7b6a2e35 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/ViewContactActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/ViewContactActivity.kt @@ -59,7 +59,7 @@ class ViewContactActivity : ContactActivity() { override fun onCreateOptionsMenu(menu: Menu): Boolean { menuInflater.inflate(R.menu.menu_view_contact, menu) menu.apply { - findItem(R.id.open_with).isVisible = contact?.source != SMT_PRIVATE + findItem(R.id.open_with).isVisible = contact?.isPrivate() == false } return true } diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/extensions/Context.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/extensions/Context.kt index 69bb28df..0b42a0aa 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/extensions/Context.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/extensions/Context.kt @@ -49,7 +49,7 @@ fun Context.getEmptyContact(): Contact { fun Context.viewContact(contact: Contact) { Intent(applicationContext, ViewContactActivity::class.java).apply { putExtra(CONTACT_ID, contact.id) - putExtra(IS_PRIVATE, contact.source == SMT_PRIVATE) + putExtra(IS_PRIVATE, contact.isPrivate()) startActivity(this) } } @@ -57,7 +57,7 @@ fun Context.viewContact(contact: Contact) { fun Context.editContact(contact: Contact) { Intent(applicationContext, EditContactActivity::class.java).apply { putExtra(CONTACT_ID, contact.id) - putExtra(IS_PRIVATE, contact.source == SMT_PRIVATE) + putExtra(IS_PRIVATE, contact.isPrivate()) startActivity(this) } } @@ -254,8 +254,8 @@ fun Context.getTempFile(): File? { } fun Context.addContactsToGroup(contacts: ArrayList, groupId: Long) { - val publicContacts = contacts.filter { it.source != SMT_PRIVATE }.toMutableList() as ArrayList - val privateContacts = contacts.filter { it.source == SMT_PRIVATE }.toMutableList() as ArrayList + val publicContacts = contacts.filter { !it.isPrivate() }.toMutableList() as ArrayList + val privateContacts = contacts.filter { it.isPrivate() }.toMutableList() as ArrayList if (publicContacts.isNotEmpty()) { ContactsHelper(this).addContactsToGroup(publicContacts, groupId) } @@ -266,8 +266,8 @@ fun Context.addContactsToGroup(contacts: ArrayList, groupId: Long) { } fun Context.removeContactsFromGroup(contacts: ArrayList, groupId: Long) { - val publicContacts = contacts.filter { it.source != SMT_PRIVATE }.toMutableList() as ArrayList - val privateContacts = contacts.filter { it.source == SMT_PRIVATE }.toMutableList() as ArrayList + val publicContacts = contacts.filter { !it.isPrivate() }.toMutableList() as ArrayList + val privateContacts = contacts.filter { it.isPrivate() }.toMutableList() as ArrayList if (publicContacts.isNotEmpty() && hasContactPermissions()) { ContactsHelper(this).removeContactsFromGroup(publicContacts, groupId) } @@ -278,7 +278,7 @@ fun Context.removeContactsFromGroup(contacts: ArrayList, groupId: Long) } fun Context.getContactPublicUri(contact: Contact): Uri { - val lookupKey = if (contact.source == SMT_PRIVATE) { + val lookupKey = if (contact.isPrivate()) { "local_${contact.id}" } else { ContactsHelper(this).getContactLookupKey(contact.id.toString()) diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/helpers/ContactsHelper.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/helpers/ContactsHelper.kt index 8c701fbc..acc5127d 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/helpers/ContactsHelper.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/helpers/ContactsHelper.kt @@ -910,7 +910,7 @@ class ContactsHelper(val context: Context) { fun updateContact(contact: Contact, photoUpdateStatus: Int): Boolean { context.toast(R.string.updating) - if (contact.source == SMT_PRIVATE) { + if (contact.isPrivate()) { return LocalContactsHelper(context).insertOrUpdateContact(contact) } @@ -1222,7 +1222,7 @@ class ContactsHelper(val context: Context) { } fun insertContact(contact: Contact): Boolean { - if (contact.source == SMT_PRIVATE) { + if (contact.isPrivate()) { return LocalContactsHelper(context).insertOrUpdateContact(contact) } @@ -1477,7 +1477,7 @@ class ContactsHelper(val context: Context) { private fun toggleFavorites(contacts: ArrayList, addToFavorites: Boolean) { try { val operations = ArrayList() - contacts.filter { it.source != SMT_PRIVATE }.map { it.contactId.toString() }.forEach { + contacts.filter { !it.isPrivate() }.map { it.contactId.toString() }.forEach { val uri = Uri.withAppendedPath(ContactsContract.Contacts.CONTENT_URI, it) ContentProviderOperation.newUpdate(uri).apply { withValue(ContactsContract.Contacts.STARRED, if (addToFavorites) 1 else 0) @@ -1496,13 +1496,13 @@ class ContactsHelper(val context: Context) { } private fun toggleLocalFavorites(contacts: ArrayList, addToFavorites: Boolean) { - val localContacts = contacts.filter { it.source == SMT_PRIVATE }.map { it.id }.toTypedArray() + val localContacts = contacts.filter { it.isPrivate() }.map { it.id }.toTypedArray() LocalContactsHelper(context).toggleFavorites(localContacts, addToFavorites) } fun deleteContact(contact: Contact) { Thread { - if (contact.source == SMT_PRIVATE) { + if (contact.isPrivate()) { context.contactsDB.deleteContactId(contact.id) } else { deleteContacts(arrayListOf(contact)) @@ -1511,13 +1511,13 @@ class ContactsHelper(val context: Context) { } fun deleteContacts(contacts: ArrayList) { - val localContacts = contacts.filter { it.source == SMT_PRIVATE }.map { it.id }.toTypedArray() + val localContacts = contacts.filter { it.isPrivate() }.map { it.id }.toTypedArray() LocalContactsHelper(context).deleteContactIds(localContacts) try { val operations = ArrayList() val selection = "${ContactsContract.RawContacts._ID} = ?" - contacts.filter { it.source != SMT_PRIVATE }.forEach { + contacts.filter { !it.isPrivate() }.forEach { ContentProviderOperation.newDelete(ContactsContract.RawContacts.CONTENT_URI).apply { val selectionArgs = arrayOf(it.id.toString()) withSelection(selection, selectionArgs) diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/models/Contact.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/models/Contact.kt index 750ccce0..50c27d86 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/models/Contact.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/models/Contact.kt @@ -6,6 +6,7 @@ import com.simplemobiletools.commons.helpers.SORT_BY_FIRST_NAME import com.simplemobiletools.commons.helpers.SORT_BY_MIDDLE_NAME import com.simplemobiletools.commons.helpers.SORT_DESCENDING import com.simplemobiletools.contacts.pro.extensions.normalizeNumber +import com.simplemobiletools.contacts.pro.helpers.SMT_PRIVATE data class Contact(var id: Int, var prefix: String, var firstName: String, var middleName: String, var surname: String, var suffix: String, var nickname: String, var photoUri: String, var phoneNumbers: ArrayList, var emails: ArrayList, var addresses: ArrayList
, @@ -132,4 +133,6 @@ data class Contact(var id: Int, var prefix: String, var firstName: String, var m false } } + + fun isPrivate() = source == SMT_PRIVATE } From c3ac30d47ee9e48baf1f24c60aa48dbda761c163 Mon Sep 17 00:00:00 2001 From: tibbi Date: Fri, 30 Nov 2018 18:00:32 +0100 Subject: [PATCH 125/134] improve the name detection at Recents tab --- .../contacts/pro/activities/MainActivity.kt | 32 +++++++++---------- .../contacts/pro/helpers/ContactsHelper.kt | 2 +- .../contacts/pro/models/Contact.kt | 9 +++++- 3 files changed, 25 insertions(+), 18 deletions(-) diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/MainActivity.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/MainActivity.kt index be011bc2..ec08ce56 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/MainActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/MainActivity.kt @@ -519,39 +519,39 @@ class MainActivity : SimpleActivity(), RefreshContactsListener { return@getContacts } + val contacts = it if (refreshTabsMask and CONTACTS_TAB_MASK != 0) { - contacts_fragment?.refreshContacts(it) + contacts_fragment?.refreshContacts(contacts) } if (refreshTabsMask and FAVORITES_TAB_MASK != 0) { - favorites_fragment?.refreshContacts(it) + favorites_fragment?.refreshContacts(contacts) } if (refreshTabsMask and RECENTS_TAB_MASK != 0) { - recents_fragment?.refreshContacts(it) + recents_fragment?.refreshContacts(contacts) } if (refreshTabsMask and GROUPS_TAB_MASK != 0) { if (refreshTabsMask == GROUPS_TAB_MASK) { groups_fragment.skipHashComparing = true } - groups_fragment?.refreshContacts(it) + groups_fragment?.refreshContacts(contacts) } - } - if (refreshTabsMask and RECENTS_TAB_MASK != 0) { - ContactsHelper(this).getRecents { - val localContacts = LocalContactsHelper(applicationContext).getAllContacts() - it.filter { it.name == null }.forEach { - val namelessCall = it - val localContact = localContacts.firstOrNull { it.doesContainPhoneNumber(namelessCall.number) } - if (localContact != null) { - it.name = localContact.getNameToDisplay() + if (refreshTabsMask and RECENTS_TAB_MASK != 0) { + ContactsHelper(this).getRecents { + it.filter { it.name == null }.forEach { + val namelessCall = it + val contact = contacts.firstOrNull { it.doesContainPhoneNumber(namelessCall.number) } + if (contact != null) { + it.name = contact.getNameToDisplay() + } } - } - runOnUiThread { - recents_fragment?.updateRecentCalls(it) + runOnUiThread { + recents_fragment?.updateRecentCalls(it) + } } } } diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/helpers/ContactsHelper.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/helpers/ContactsHelper.kt index acc5127d..8a14f930 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/helpers/ContactsHelper.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/helpers/ContactsHelper.kt @@ -257,7 +257,7 @@ class ContactsHelper(val context: Context) { do { val id = cursor.getIntValue(ContactsContract.Data.RAW_CONTACT_ID) val number = cursor.getStringValue(CommonDataKinds.Phone.NUMBER) ?: continue - val normalizedNumber = cursor.getStringValue(CommonDataKinds.Phone.NORMALIZED_NUMBER) ?: "" + val normalizedNumber = cursor.getStringValue(CommonDataKinds.Phone.NORMALIZED_NUMBER) ?: number.normalizeNumber() val type = cursor.getIntValue(CommonDataKinds.Phone.TYPE) val label = cursor.getStringValue(CommonDataKinds.Phone.LABEL) ?: "" diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/models/Contact.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/models/Contact.kt index 50c27d86..7eb0d57e 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/models/Contact.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/models/Contact.kt @@ -1,6 +1,7 @@ package com.simplemobiletools.contacts.pro.models import android.graphics.Bitmap +import android.telephony.PhoneNumberUtils import com.simplemobiletools.commons.extensions.normalizeString import com.simplemobiletools.commons.helpers.SORT_BY_FIRST_NAME import com.simplemobiletools.commons.helpers.SORT_BY_MIDDLE_NAME @@ -128,7 +129,13 @@ data class Contact(var id: Int, var prefix: String, var firstName: String, var m fun doesContainPhoneNumber(text: String): Boolean { return if (text.isNotEmpty()) { - phoneNumbers.any { it.value.contains(text) || it.normalizedNumber?.contains(text.normalizeNumber()) == true || it.value.normalizeNumber().contains(text.normalizeNumber()) } + val normalizedText = text.normalizeNumber() + phoneNumbers.any { + PhoneNumberUtils.compare(it.normalizedNumber, normalizedText) || + it.value.contains(text) || + it.normalizedNumber?.contains(normalizedText) == true || + it.value.normalizeNumber().contains(normalizedText) + } } else { false } From 758c01ba98625d736433eac6b18afb887c62d498 Mon Sep 17 00:00:00 2001 From: tibbi Date: Fri, 30 Nov 2018 18:06:20 +0100 Subject: [PATCH 126/134] hide the view/edit contact screen till the contact gets loaded --- .../contacts/pro/activities/EditContactActivity.kt | 1 + .../contacts/pro/activities/ViewContactActivity.kt | 1 + app/src/main/res/layout/activity_edit_contact.xml | 3 ++- app/src/main/res/layout/activity_view_contact.xml | 3 ++- 4 files changed, 6 insertions(+), 2 deletions(-) diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/EditContactActivity.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/EditContactActivity.kt index 7876a7aa..f882d3c3 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/EditContactActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/EditContactActivity.kt @@ -161,6 +161,7 @@ class EditContactActivity : ContactActivity() { } private fun gotContact() { + contact_scrollview.beVisible() if (contact == null) { setupNewContact() } else { diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/ViewContactActivity.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/ViewContactActivity.kt index 7b6a2e35..b1ef1744 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/ViewContactActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/ViewContactActivity.kt @@ -127,6 +127,7 @@ class ViewContactActivity : ContactActivity() { } private fun gotContact() { + contact_scrollview.beVisible() setupViewContact() contact_send_sms.beVisibleIf(contact!!.phoneNumbers.isNotEmpty()) contact_start_call.beVisibleIf(contact!!.phoneNumbers.isNotEmpty()) diff --git a/app/src/main/res/layout/activity_edit_contact.xml b/app/src/main/res/layout/activity_edit_contact.xml index ecf79006..304a7a52 100644 --- a/app/src/main/res/layout/activity_edit_contact.xml +++ b/app/src/main/res/layout/activity_edit_contact.xml @@ -4,7 +4,8 @@ xmlns:tools="http://schemas.android.com/tools" android:id="@+id/contact_scrollview" android:layout_width="match_parent" - android:layout_height="wrap_content"> + android:layout_height="wrap_content" + android:visibility="gone"> + android:layout_height="wrap_content" + android:visibility="gone"> Date: Fri, 30 Nov 2018 18:09:19 +0100 Subject: [PATCH 127/134] improve recent call contact detection at clicking a Recent call item --- .../simplemobiletools/contacts/pro/fragments/RecentsFragment.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/fragments/RecentsFragment.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/fragments/RecentsFragment.kt index 689e62f6..049f0569 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/fragments/RecentsFragment.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/fragments/RecentsFragment.kt @@ -57,7 +57,7 @@ class RecentsFragment(context: Context, attributeSet: AttributeSet) : MyViewPage val recentCall = (it as RecentCall).number.normalizeNumber() var selectedContact: Contact? = null for (contact in allContacts) { - if (contact.phoneNumbers.any { it.normalizedNumber == recentCall }) { + if (contact.doesContainPhoneNumber(recentCall)) { selectedContact = contact break } From 2c72491ee9e73121e96061bd85395d9c9aae723b Mon Sep 17 00:00:00 2001 From: tibbi Date: Fri, 30 Nov 2018 19:34:27 +0100 Subject: [PATCH 128/134] fix #262, invoke insert_or_edit at pressing a number at Recents --- .../contacts/pro/fragments/RecentsFragment.kt | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/fragments/RecentsFragment.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/fragments/RecentsFragment.kt index 049f0569..a227c7e9 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/fragments/RecentsFragment.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/fragments/RecentsFragment.kt @@ -11,7 +11,7 @@ import com.simplemobiletools.commons.extensions.hasPermission import com.simplemobiletools.commons.helpers.PERMISSION_READ_CALL_LOG import com.simplemobiletools.commons.helpers.PERMISSION_WRITE_CALL_LOG import com.simplemobiletools.commons.helpers.isMarshmallowPlus -import com.simplemobiletools.contacts.pro.activities.EditContactActivity +import com.simplemobiletools.contacts.pro.activities.InsertOrEditContactActivity import com.simplemobiletools.contacts.pro.adapters.RecentCallsAdapter import com.simplemobiletools.contacts.pro.extensions.contactClicked import com.simplemobiletools.contacts.pro.extensions.isDefaultDialer @@ -66,8 +66,8 @@ class RecentsFragment(context: Context, attributeSet: AttributeSet) : MyViewPage if (selectedContact != null) { activity?.contactClicked(selectedContact) } else { - Intent(context, EditContactActivity::class.java).apply { - action = Intent.ACTION_INSERT + Intent(context, InsertOrEditContactActivity::class.java).apply { + action = Intent.ACTION_INSERT_OR_EDIT putExtra(KEY_PHONE, recentCall) putExtra(IS_FROM_SIMPLE_CONTACTS, true) context.startActivity(this) From c9727109062570758dff5c03a8a68f976129676d Mon Sep 17 00:00:00 2001 From: tibbi Date: Fri, 30 Nov 2018 20:45:40 +0100 Subject: [PATCH 129/134] update commons to 5.5.1 --- app/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/build.gradle b/app/build.gradle index 481b78b3..4ae27831 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -51,7 +51,7 @@ android { } dependencies { - implementation 'com.simplemobiletools:commons:5.5.0' + implementation 'com.simplemobiletools:commons:5.5.1' implementation 'joda-time:joda-time:2.10.1' implementation 'androidx.constraintlayout:constraintlayout:2.0.0-alpha2' implementation 'com.googlecode.ez-vcard:ez-vcard:0.10.4' From 4872fdf5b8dbb1436fb800f8b9769ddbb0bfdd20 Mon Sep 17 00:00:00 2001 From: tibbi Date: Fri, 30 Nov 2018 23:48:25 +0100 Subject: [PATCH 130/134] update version to 6.1.0 --- app/build.gradle | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 4ae27831..5d27b633 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -15,8 +15,8 @@ android { applicationId "com.simplemobiletools.contacts.pro" minSdkVersion 21 targetSdkVersion 28 - versionCode 36 - versionName "6.0.0" + versionCode 37 + versionName "6.1.0" setProperty("archivesBaseName", "contacts") } From 3824bcb2828ebe554a16a61c26c64b4ca1a43f80 Mon Sep 17 00:00:00 2001 From: tibbi Date: Fri, 30 Nov 2018 23:48:30 +0100 Subject: [PATCH 131/134] updating changelog --- CHANGELOG.md | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 1ddd9c8f..6ace45ce 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,18 @@ Changelog ========== +Version 6.1.0 *(2018-11-30)* +---------------------------- + + * Allow setting the app as the default for handling calls + * Allow blocking numbers on Android 7+ + * Improved contact recognition at Recents + * Fixed some handling related to creating new contact with a number, or adding a number to an existing contact + * Add handling for secret codes like *#*#4636#*#* + * Allow copying all contact fields from the view screen by long pressing them + * Added an option for hiding the dialpad button on the main screen + * Fixed some issues related to importing contacts with birthdays + Version 6.0.0 *(2018-11-06)* ---------------------------- From 61a6ffa996ca6fdce114bf9eb8ddfe20d0e24b55 Mon Sep 17 00:00:00 2001 From: fricyo <30796677+fricyo@users.noreply.github.com> Date: Sun, 2 Dec 2018 11:07:38 +0800 Subject: [PATCH 132/134] Update Translation --- app/src/main/res/values-zh-rTW/strings.xml | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/app/src/main/res/values-zh-rTW/strings.xml b/app/src/main/res/values-zh-rTW/strings.xml index 77e3ff87..9be3d686 100644 --- a/app/src/main/res/values-zh-rTW/strings.xml +++ b/app/src/main/res/values-zh-rTW/strings.xml @@ -17,8 +17,8 @@ 請求必要的權限 建立新聯絡人 添加至已存在的聯絡人 - You have to make this app the default dialer app to make use of blocked numbers. - Set to default + 你必須將這應用程式設為預設的撥號程式來使用黑名單。 + 設為預設 未發現聯絡人 @@ -137,12 +137,12 @@ 即時通訊 (IM) - Manage blocked numbers - You are not blocking anyone. - Add a blocked number - Block number - Block numbers - Blocked numbers + 管理黑名單 + 你沒有封鎖任何人 + 添加封鎖的號碼 + 封鎖號碼 + 封鎖號碼 + 黑名單 我想要更改在通訊錄會看到哪些欄位。我能這麼做嗎? From 4d56f71b48ffa415774b5f57568920ed7bff548d Mon Sep 17 00:00:00 2001 From: Emanuele Petriglia Date: Mon, 3 Dec 2018 15:54:13 +0000 Subject: [PATCH 133/134] Update italian translation --- app/src/main/res/values-it/strings.xml | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/app/src/main/res/values-it/strings.xml b/app/src/main/res/values-it/strings.xml index 4c3cb04d..6193ccb3 100644 --- a/app/src/main/res/values-it/strings.xml +++ b/app/src/main/res/values-it/strings.xml @@ -17,8 +17,8 @@ Richiedi le permissioni necessarie Crea un nuovo contatto Aggiungi ad un contatto esistente - You have to make this app the default dialer app to make use of blocked numbers. - Set to default + È necessario impostare quest\'app come predefinita per utilizzare i numeri bloccati. + Imposta come predefinita Nessun contatto trovato @@ -137,12 +137,12 @@ Messaggistica istantanea (IM) - Manage blocked numbers - You are not blocking anyone. - Add a blocked number - Block number - Block numbers - Blocked numbers + Gestisci i numeri bloccati + Non si sta blocccando alcun numero. + Aggiungi un numero da bloccare + Blocca numero + Blocca numeri + Numeri bloccati Voglio cambiare i campi visibili ai contatti. Come posso fare? From d71fd8b2e22283fcff887e6cc5edac28cc4c8872 Mon Sep 17 00:00:00 2001 From: tibbi Date: Tue, 4 Dec 2018 09:50:40 +0100 Subject: [PATCH 134/134] correcting an italian string --- app/src/main/res/values-it/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/res/values-it/strings.xml b/app/src/main/res/values-it/strings.xml index 6193ccb3..49dde94e 100644 --- a/app/src/main/res/values-it/strings.xml +++ b/app/src/main/res/values-it/strings.xml @@ -60,7 +60,7 @@ Chiama contatto Visualizza i dettagli del contatto Gestisci i campi mostrati - Prova a filetrare i contatti duplicati + Prova a filtrare i contatti duplicati Gestisci le schede mostrate Contatti Preferiti