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();
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() {

View file

@ -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,

View file

@ -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 =

View file

@ -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);
}

View file

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

View file

@ -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();
}
}

View file

@ -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