Fixed crash if contact permission isn't granted + auto fetch if granted while in contacts fragment

This commit is contained in:
Sylvain Berfini 2019-02-22 10:27:20 +01:00
parent f110e817d5
commit 9e076971a0
7 changed files with 44 additions and 19 deletions

View file

@ -408,7 +408,6 @@ public class LinphoneActivity extends LinphoneGenericActivity
mFragment = new HistoryDetailFragment(); mFragment = new HistoryDetailFragment();
break; break;
case CONTACTS_LIST: case CONTACTS_LIST:
checkAndRequestWriteContactsPermission();
mFragment = new ContactsFragment(); mFragment = new ContactsFragment();
break; break;
case CONTACT_DETAIL: case CONTACT_DETAIL:
@ -439,7 +438,6 @@ public class LinphoneActivity extends LinphoneGenericActivity
mFragment = new ChatRoomsFragment(); mFragment = new ChatRoomsFragment();
break; break;
case CREATE_CHAT: case CREATE_CHAT:
checkAndRequestWriteContactsPermission();
mFragment = new ChatRoomCreationFragment(); mFragment = new ChatRoomCreationFragment();
break; break;
case INFO_GROUP_CHAT: case INFO_GROUP_CHAT:
@ -1176,12 +1174,12 @@ public class LinphoneActivity extends LinphoneGenericActivity
checkAndRequestPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE, 0); checkAndRequestPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE, 0);
} }
public void checkAndRequestCameraPermission() { public void checkAndRequestReadContactsPermission() {
checkAndRequestPermission(Manifest.permission.CAMERA, 0); checkAndRequestPermission(Manifest.permission.READ_CONTACTS, PERMISSIONS_REQUEST_SYNC);
} }
private void checkAndRequestWriteContactsPermission() { public void checkAndRequestCameraPermission() {
checkAndRequestPermission(Manifest.permission.WRITE_CONTACTS, 0); checkAndRequestPermission(Manifest.permission.CAMERA, 0);
} }
public void checkAndRequestRecordAudioPermissionForEchoCanceller() { public void checkAndRequestRecordAudioPermissionForEchoCanceller() {

View file

@ -251,7 +251,7 @@ public final class LinphoneService extends Service {
if (!Version.sdkAboveOrEqual(Version.API26_O_80) if (!Version.sdkAboveOrEqual(Version.API26_O_80)
|| (ContactsManager.getInstance() != null || (ContactsManager.getInstance() != null
&& ContactsManager.getInstance().hasContactsAccess())) { && ContactsManager.getInstance().hasReadContactsAccess())) {
getContentResolver() getContentResolver()
.registerContentObserver( .registerContentObserver(
ContactsContract.Contacts.CONTENT_URI, ContactsContract.Contacts.CONTENT_URI,

View file

@ -79,7 +79,7 @@ class AndroidContact implements Serializable {
} }
protected void saveChangesCommited() { protected void saveChangesCommited() {
if (ContactsManager.getInstance().hasContactsAccess() && mChangesToCommit.size() > 0) { if (ContactsManager.getInstance().hasReadContactsAccess() && mChangesToCommit.size() > 0) {
try { try {
ContentResolver contentResolver = LinphoneService.instance().getContentResolver(); ContentResolver contentResolver = LinphoneService.instance().getContentResolver();
ContentProviderResult[] results = ContentProviderResult[] results =

View file

@ -112,7 +112,7 @@ public class ContactEditorFragment extends Fragment {
mPhoneNumbersSection = mView.findViewById(R.id.phone_numbers); mPhoneNumbersSection = mView.findViewById(R.id.phone_numbers);
if (getResources().getBoolean(R.bool.hide_phone_numbers_in_editor) 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 // Currently linphone friends don't support phone mNumbers, so hide them
mPhoneNumbersSection.setVisibility(View.GONE); mPhoneNumbersSection.setVisibility(View.GONE);
} }

View file

@ -162,7 +162,11 @@ public class ContactsFragment extends Fragment
mNewContact.setEnabled(LinphoneManager.getLc().getCallsNb() == 0); mNewContact.setEnabled(LinphoneManager.getLc().getCallsNb() == 0);
if (!ContactsManager.getInstance().contactsFetchedOnce()) { if (!ContactsManager.getInstance().contactsFetchedOnce()) {
mContactsFetchInProgress.setVisibility(View.VISIBLE); if (ContactsManager.getInstance().hasReadContactsAccess()) {
mContactsFetchInProgress.setVisibility(View.VISIBLE);
} else {
LinphoneActivity.instance().checkAndRequestReadContactsPermission();
}
} else { } else {
if (!mOnlyDisplayLinphoneContacts if (!mOnlyDisplayLinphoneContacts
&& ContactsManager.getInstance().getContacts().size() == 0) { && ContactsManager.getInstance().getContacts().size() == 0) {

View file

@ -135,6 +135,10 @@ public class ContactsManager extends ContentObserver implements FriendListListen
if (mLoadContactTask != null) { if (mLoadContactTask != null) {
mLoadContactTask.cancel(true); mLoadContactTask.cancel(true);
} }
if (!hasReadContactsAccess()) {
Log.w("[Contacts Manager] Can't fetch contact without READ permission");
return;
}
mLoadContactTask = new AsyncContactsLoader(mContext); mLoadContactTask = new AsyncContactsLoader(mContext);
mContactsFetchedOnce = true; mContactsFetchedOnce = true;
mLoadContactTask.executeOnExecutor(THREAD_POOL_EXECUTOR); mLoadContactTask.executeOnExecutor(THREAD_POOL_EXECUTOR);
@ -224,7 +228,7 @@ public class ContactsManager extends ContentObserver implements FriendListListen
LinphonePreferences.instance().disableFriendsStorage(); LinphonePreferences.instance().disableFriendsStorage();
} }
public boolean hasContactsAccess() { public boolean hasReadContactsAccess() {
if (mContext == null) { if (mContext == null) {
return false; return false;
} }
@ -238,6 +242,27 @@ public class ContactsManager extends ContentObserver implements FriendListListen
&& !mContext.getResources().getBoolean(R.bool.force_use_of_linphone_friends); && !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() { public boolean isLinphoneContactsPrefered() {
ProxyConfig lpc = LinphoneManager.getLc().getDefaultProxyConfig(); ProxyConfig lpc = LinphoneManager.getLc().getDefaultProxyConfig();
return lpc != null return lpc != null
@ -251,11 +276,9 @@ public class ContactsManager extends ContentObserver implements FriendListListen
if (!mInitialized) { if (!mInitialized) {
if (mContext.getResources().getBoolean(R.bool.use_linphone_tag)) { if (mContext.getResources().getBoolean(R.bool.use_linphone_tag)) {
if (mContext.getPackageManager() if (hasReadContactsAccess()
.checkPermission( && hasWriteContactsAccess()
Manifest.permission.WRITE_SYNC_SETTINGS, && hasWriteSyncPermission()) {
mContext.getPackageName())
== PackageManager.PERMISSION_GRANTED) {
if (LinphoneService.isReady()) { if (LinphoneService.isReady()) {
ContactsManager.getInstance().initializeSyncAccount(); ContactsManager.getInstance().initializeSyncAccount();
mInitialized = true; 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(); fetchContactsAsync();
} }
} }

View file

@ -61,7 +61,7 @@ public class LinphoneContact extends AndroidContact
public static LinphoneContact createContact() { public static LinphoneContact createContact() {
LinphoneContact contact = new LinphoneContact(); LinphoneContact contact = new LinphoneContact();
if (ContactsManager.getInstance().hasContactsAccess()) { if (ContactsManager.getInstance().hasReadContactsAccess()) {
contact.createAndroidContact(); contact.createAndroidContact();
} else { } else {
contact.createFriend(); contact.createFriend();
@ -364,7 +364,7 @@ public class LinphoneContact extends AndroidContact
lc.addFriend(mFriend); 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 // This refresh is only needed if app has no contacts permission to refresh the list of
// Friends. // Friends.
// Otherwise contacts will be refreshed due to changes in native contact and the handler // Otherwise contacts will be refreshed due to changes in native contact and the handler