Fixed crash if contact permission isn't granted + auto fetch if granted while in contacts fragment
This commit is contained in:
parent
f110e817d5
commit
9e076971a0
7 changed files with 44 additions and 19 deletions
|
@ -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() {
|
||||||
|
|
|
@ -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,
|
||||||
|
|
|
@ -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 =
|
||||||
|
|
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
|
@ -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) {
|
||||||
|
|
|
@ -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();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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
|
||||||
|
|
Loading…
Reference in a new issue