diff --git a/app/src/main/java/org/linphone/LinphoneActivity.java b/app/src/main/java/org/linphone/LinphoneActivity.java index 877f2253d..a6386c43e 100644 --- a/app/src/main/java/org/linphone/LinphoneActivity.java +++ b/app/src/main/java/org/linphone/LinphoneActivity.java @@ -408,7 +408,6 @@ public class LinphoneActivity extends LinphoneGenericActivity mFragment = new HistoryDetailFragment(); break; case CONTACTS_LIST: - checkAndRequestWriteContactsPermission(); mFragment = new ContactsFragment(); break; case CONTACT_DETAIL: @@ -439,7 +438,6 @@ public class LinphoneActivity extends LinphoneGenericActivity mFragment = new ChatRoomsFragment(); break; case CREATE_CHAT: - checkAndRequestWriteContactsPermission(); mFragment = new ChatRoomCreationFragment(); break; case INFO_GROUP_CHAT: @@ -1176,12 +1174,12 @@ public class LinphoneActivity extends LinphoneGenericActivity checkAndRequestPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE, 0); } - public void checkAndRequestCameraPermission() { - checkAndRequestPermission(Manifest.permission.CAMERA, 0); + public void checkAndRequestReadContactsPermission() { + checkAndRequestPermission(Manifest.permission.READ_CONTACTS, PERMISSIONS_REQUEST_SYNC); } - private void checkAndRequestWriteContactsPermission() { - checkAndRequestPermission(Manifest.permission.WRITE_CONTACTS, 0); + public void checkAndRequestCameraPermission() { + checkAndRequestPermission(Manifest.permission.CAMERA, 0); } public void checkAndRequestRecordAudioPermissionForEchoCanceller() { diff --git a/app/src/main/java/org/linphone/LinphoneService.java b/app/src/main/java/org/linphone/LinphoneService.java index 27610cd7a..5e6535727 100644 --- a/app/src/main/java/org/linphone/LinphoneService.java +++ b/app/src/main/java/org/linphone/LinphoneService.java @@ -251,7 +251,7 @@ public final class LinphoneService extends Service { if (!Version.sdkAboveOrEqual(Version.API26_O_80) || (ContactsManager.getInstance() != null - && ContactsManager.getInstance().hasContactsAccess())) { + && ContactsManager.getInstance().hasReadContactsAccess())) { getContentResolver() .registerContentObserver( ContactsContract.Contacts.CONTENT_URI, diff --git a/app/src/main/java/org/linphone/contacts/AndroidContact.java b/app/src/main/java/org/linphone/contacts/AndroidContact.java index 09f855744..e3e8a1601 100644 --- a/app/src/main/java/org/linphone/contacts/AndroidContact.java +++ b/app/src/main/java/org/linphone/contacts/AndroidContact.java @@ -79,7 +79,7 @@ class AndroidContact implements Serializable { } protected void saveChangesCommited() { - if (ContactsManager.getInstance().hasContactsAccess() && mChangesToCommit.size() > 0) { + if (ContactsManager.getInstance().hasReadContactsAccess() && mChangesToCommit.size() > 0) { try { ContentResolver contentResolver = LinphoneService.instance().getContentResolver(); ContentProviderResult[] results = diff --git a/app/src/main/java/org/linphone/contacts/ContactEditorFragment.java b/app/src/main/java/org/linphone/contacts/ContactEditorFragment.java index d5da9843d..e64968494 100644 --- a/app/src/main/java/org/linphone/contacts/ContactEditorFragment.java +++ b/app/src/main/java/org/linphone/contacts/ContactEditorFragment.java @@ -112,7 +112,7 @@ public class ContactEditorFragment extends Fragment { mPhoneNumbersSection = mView.findViewById(R.id.phone_numbers); if (getResources().getBoolean(R.bool.hide_phone_numbers_in_editor) - || !ContactsManager.getInstance().hasContactsAccess()) { + || !ContactsManager.getInstance().hasReadContactsAccess()) { // Currently linphone friends don't support phone mNumbers, so hide them mPhoneNumbersSection.setVisibility(View.GONE); } diff --git a/app/src/main/java/org/linphone/contacts/ContactsFragment.java b/app/src/main/java/org/linphone/contacts/ContactsFragment.java index 33b0de0da..ecdb03d50 100644 --- a/app/src/main/java/org/linphone/contacts/ContactsFragment.java +++ b/app/src/main/java/org/linphone/contacts/ContactsFragment.java @@ -162,7 +162,11 @@ public class ContactsFragment extends Fragment mNewContact.setEnabled(LinphoneManager.getLc().getCallsNb() == 0); if (!ContactsManager.getInstance().contactsFetchedOnce()) { - mContactsFetchInProgress.setVisibility(View.VISIBLE); + if (ContactsManager.getInstance().hasReadContactsAccess()) { + mContactsFetchInProgress.setVisibility(View.VISIBLE); + } else { + LinphoneActivity.instance().checkAndRequestReadContactsPermission(); + } } else { if (!mOnlyDisplayLinphoneContacts && ContactsManager.getInstance().getContacts().size() == 0) { diff --git a/app/src/main/java/org/linphone/contacts/ContactsManager.java b/app/src/main/java/org/linphone/contacts/ContactsManager.java index 084bdc915..08956a25e 100644 --- a/app/src/main/java/org/linphone/contacts/ContactsManager.java +++ b/app/src/main/java/org/linphone/contacts/ContactsManager.java @@ -135,6 +135,10 @@ public class ContactsManager extends ContentObserver implements FriendListListen if (mLoadContactTask != null) { mLoadContactTask.cancel(true); } + if (!hasReadContactsAccess()) { + Log.w("[Contacts Manager] Can't fetch contact without READ permission"); + return; + } mLoadContactTask = new AsyncContactsLoader(mContext); mContactsFetchedOnce = true; mLoadContactTask.executeOnExecutor(THREAD_POOL_EXECUTOR); @@ -224,7 +228,7 @@ public class ContactsManager extends ContentObserver implements FriendListListen LinphonePreferences.instance().disableFriendsStorage(); } - public boolean hasContactsAccess() { + public boolean hasReadContactsAccess() { if (mContext == null) { return false; } @@ -238,6 +242,27 @@ public class ContactsManager extends ContentObserver implements FriendListListen && !mContext.getResources().getBoolean(R.bool.force_use_of_linphone_friends); } + public boolean hasWriteContactsAccess() { + if (mContext == null) { + return false; + } + return (PackageManager.PERMISSION_GRANTED + == mContext.getPackageManager() + .checkPermission( + Manifest.permission.WRITE_CONTACTS, mContext.getPackageName())); + } + + public boolean hasWriteSyncPermission() { + if (mContext == null) { + return false; + } + return (PackageManager.PERMISSION_GRANTED + == mContext.getPackageManager() + .checkPermission( + Manifest.permission.WRITE_SYNC_SETTINGS, + mContext.getPackageName())); + } + public boolean isLinphoneContactsPrefered() { ProxyConfig lpc = LinphoneManager.getLc().getDefaultProxyConfig(); return lpc != null @@ -251,11 +276,9 @@ public class ContactsManager extends ContentObserver implements FriendListListen if (!mInitialized) { if (mContext.getResources().getBoolean(R.bool.use_linphone_tag)) { - if (mContext.getPackageManager() - .checkPermission( - Manifest.permission.WRITE_SYNC_SETTINGS, - mContext.getPackageName()) - == PackageManager.PERMISSION_GRANTED) { + if (hasReadContactsAccess() + && hasWriteContactsAccess() + && hasWriteSyncPermission()) { if (LinphoneService.isReady()) { ContactsManager.getInstance().initializeSyncAccount(); mInitialized = true; @@ -264,7 +287,7 @@ public class ContactsManager extends ContentObserver implements FriendListListen } } - if (mContext != null && getContacts().size() == 0 && hasContactsAccess()) { + if (mContext != null && getContacts().size() == 0 && hasReadContactsAccess()) { fetchContactsAsync(); } } diff --git a/app/src/main/java/org/linphone/contacts/LinphoneContact.java b/app/src/main/java/org/linphone/contacts/LinphoneContact.java index 59dcb77f7..9c7eb4177 100644 --- a/app/src/main/java/org/linphone/contacts/LinphoneContact.java +++ b/app/src/main/java/org/linphone/contacts/LinphoneContact.java @@ -61,7 +61,7 @@ public class LinphoneContact extends AndroidContact public static LinphoneContact createContact() { LinphoneContact contact = new LinphoneContact(); - if (ContactsManager.getInstance().hasContactsAccess()) { + if (ContactsManager.getInstance().hasReadContactsAccess()) { contact.createAndroidContact(); } else { contact.createFriend(); @@ -364,7 +364,7 @@ public class LinphoneContact extends AndroidContact lc.addFriend(mFriend); } - if (!ContactsManager.getInstance().hasContactsAccess()) { + if (!ContactsManager.getInstance().hasReadContactsAccess()) { // This refresh is only needed if app has no contacts permission to refresh the list of // Friends. // Otherwise contacts will be refreshed due to changes in native contact and the handler