From 55311ac4c6381d546c00c96af7a8456250b0fd0d Mon Sep 17 00:00:00 2001 From: Margaux Clerc Date: Mon, 7 Mar 2016 17:19:56 +0100 Subject: [PATCH] Fix crash with android permission for Contacts and Echo canceller in the assistant --- src/org/linphone/ContactsManager.java | 52 +++++++++++-------- src/org/linphone/LinphoneActivity.java | 15 ++++-- .../linphone/assistant/AssistantActivity.java | 24 +++++---- 3 files changed, 55 insertions(+), 36 deletions(-) diff --git a/src/org/linphone/ContactsManager.java b/src/org/linphone/ContactsManager.java index 8c9718664..2c0f1814e 100644 --- a/src/org/linphone/ContactsManager.java +++ b/src/org/linphone/ContactsManager.java @@ -47,7 +47,7 @@ public class ContactsManager { private List contactList, sipContactList; private Cursor contactCursor, sipContactCursor; private Account mAccount; - private boolean preferLinphoneContacts = false, isContactPresenceDisabled = true; + private boolean preferLinphoneContacts = false, isContactPresenceDisabled = true, hasContactAccess = false; private ContentResolver contentResolver; private Context context; @@ -73,6 +73,10 @@ public class ContactsManager { public Cursor getSIPContactsCursor() { return sipContactCursor; } + + public void enabledContactsAccess(){ + hasContactAccess = true; + } public void setLinphoneContactsPrefered(boolean isPrefered) { preferLinphoneContacts = isPrefered; @@ -399,34 +403,36 @@ public class ContactsManager { } //Find Sip address - Contact contact; - String [] projection = new String[] {ContactsContract.Data.CONTACT_ID, ContactsContract.Data.DISPLAY_NAME}; - String selection = new StringBuilder() - .append(ContactsContract.CommonDataKinds.SipAddress.SIP_ADDRESS) - .append(" = ?").toString(); + if(hasContactAccess) { + Contact contact; + String[] projection = new String[]{ContactsContract.Data.CONTACT_ID, ContactsContract.Data.DISPLAY_NAME}; + String selection = new StringBuilder() + .append(ContactsContract.CommonDataKinds.SipAddress.SIP_ADDRESS) + .append(" = ?").toString(); - Cursor cur = contentResolver.query(ContactsContract.Data.CONTENT_URI, projection, selection, - new String[]{sipUri}, null); - if (cur != null) { - if (cur.moveToFirst()) { - contact = Compatibility.getContact(contentResolver, cur, cur.getPosition()); - cur.close(); + Cursor cur = contentResolver.query(ContactsContract.Data.CONTENT_URI, projection, selection, + new String[]{sipUri}, null); + if (cur != null) { + if (cur.moveToFirst()) { + contact = Compatibility.getContact(contentResolver, cur, cur.getPosition()); + cur.close(); - if (contact != null) { - return contact; + if (contact != null) { + return contact; + } } + cur.close(); } - cur.close(); - } - //Find number - Uri lookupUri = Uri.withAppendedPath(android.provider.ContactsContract.PhoneLookup.CONTENT_FILTER_URI, Uri.encode(address.getUserName())); - projection = new String[] {ContactsContract.PhoneLookup._ID,ContactsContract.PhoneLookup.NUMBER,ContactsContract.PhoneLookup.DISPLAY_NAME }; - Cursor c = contentResolver.query(lookupUri, projection, null, null, null); - contact = checkPhoneQueryResult(contentResolver, c, ContactsContract.PhoneLookup.NUMBER, ContactsContract.PhoneLookup._ID, address.getUserName()); + //Find number + Uri lookupUri = Uri.withAppendedPath(android.provider.ContactsContract.PhoneLookup.CONTENT_FILTER_URI, Uri.encode(address.getUserName())); + projection = new String[]{ContactsContract.PhoneLookup._ID, ContactsContract.PhoneLookup.NUMBER, ContactsContract.PhoneLookup.DISPLAY_NAME}; + Cursor c = contentResolver.query(lookupUri, projection, null, null, null); + contact = checkPhoneQueryResult(contentResolver, c, ContactsContract.PhoneLookup.NUMBER, ContactsContract.PhoneLookup._ID, address.getUserName()); - if (contact != null) { - return contact; + if (contact != null) { + return contact; + } } return null; diff --git a/src/org/linphone/LinphoneActivity.java b/src/org/linphone/LinphoneActivity.java index 41db86439..64a47a28f 100644 --- a/src/org/linphone/LinphoneActivity.java +++ b/src/org/linphone/LinphoneActivity.java @@ -47,6 +47,7 @@ import org.linphone.mediastream.Log; import org.linphone.assistant.RemoteProvisioningLoginActivity; import org.linphone.ui.AddressText; +import android.Manifest; import android.annotation.SuppressLint; import android.app.Activity; import android.app.Dialog; @@ -56,6 +57,7 @@ import android.app.FragmentTransaction; import android.content.Context; import android.content.Intent; import android.content.pm.ActivityInfo; +import android.content.pm.PackageManager; import android.graphics.Bitmap; import android.graphics.drawable.ColorDrawable; import android.graphics.drawable.Drawable; @@ -161,7 +163,7 @@ public class LinphoneActivity extends Activity implements OnClickListener, Conta } //TODO rework - if (getResources().getBoolean(R.bool.use_linphone_tag)) { + if (getResources().getBoolean(R.bool.use_linphone_tag) && getPackageManager().checkPermission(Manifest.permission.WRITE_SYNC_SETTINGS, getPackageName()) == PackageManager.PERMISSION_GRANTED) { ContactsManager.getInstance().initializeSyncAccount(getApplicationContext(), getContentResolver()); } else { ContactsManager.getInstance().initializeContactManager(getApplicationContext(), getContentResolver()); @@ -1196,7 +1198,10 @@ public class LinphoneActivity extends Activity implements OnClickListener, Conta startService(new Intent(Intent.ACTION_MAIN).setClass(this, LinphoneService.class)); } - ContactsManager.getInstance().prepareContactsInBackground(); + if (getPackageManager().checkPermission(Manifest.permission.READ_CONTACTS, getPackageName()) == PackageManager.PERMISSION_GRANTED){ + ContactsManager.getInstance().enabledContactsAccess(); + ContactsManager.getInstance().prepareContactsInBackground(); + } updateMissedChatCount(); @@ -1453,8 +1458,10 @@ public class LinphoneActivity extends Activity implements OnClickListener, Conta accountsList.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView adapterView, View view, int i, long l) { - int position = Integer.parseInt(view.getTag().toString()); - LinphoneActivity.instance().displayAccountSettings(position); + if(view != null) { + int position = Integer.parseInt(view.getTag().toString()); + LinphoneActivity.instance().displayAccountSettings(position); + } openOrCloseSideMenu(false); } }); diff --git a/src/org/linphone/assistant/AssistantActivity.java b/src/org/linphone/assistant/AssistantActivity.java index 6d35d048a..df15e62ff 100644 --- a/src/org/linphone/assistant/AssistantActivity.java +++ b/src/org/linphone/assistant/AssistantActivity.java @@ -32,6 +32,7 @@ import org.linphone.core.LinphoneCoreFactory; import org.linphone.core.LinphoneCoreListenerBase; import org.linphone.core.LinphoneProxyConfig; +import android.Manifest; import android.app.Activity; import android.app.AlertDialog; import android.app.Dialog; @@ -41,6 +42,7 @@ import android.app.ProgressDialog; import android.content.Context; import android.content.DialogInterface; import android.content.pm.ActivityInfo; +import android.content.pm.PackageManager; import android.graphics.drawable.ColorDrawable; import android.graphics.drawable.Drawable; import android.os.Bundle; @@ -220,17 +222,21 @@ public class AssistantActivity extends Activity implements OnClickListener { } private void launchEchoCancellerCalibration(boolean sendEcCalibrationResult) { - boolean needsEchoCalibration = LinphoneManager.getLc().needsEchoCalibration(); - if (needsEchoCalibration && mPrefs.isFirstLaunch()) { - EchoCancellerCalibrationFragment fragment = new EchoCancellerCalibrationFragment(); - fragment.enableEcCalibrationResultSending(sendEcCalibrationResult); - changeFragment(fragment); - currentFragment = AssistantFragmentsEnum.ECHO_CANCELLER_CALIBRATION; - back.setVisibility(View.VISIBLE); - cancel.setEnabled(false); + if (getPackageManager().checkPermission(Manifest.permission.RECORD_AUDIO, getPackageName()) == PackageManager.PERMISSION_GRANTED) { + boolean needsEchoCalibration = LinphoneManager.getLc().needsEchoCalibration(); + if (needsEchoCalibration && mPrefs.isFirstLaunch()) { + EchoCancellerCalibrationFragment fragment = new EchoCancellerCalibrationFragment(); + fragment.enableEcCalibrationResultSending(sendEcCalibrationResult); + changeFragment(fragment); + currentFragment = AssistantFragmentsEnum.ECHO_CANCELLER_CALIBRATION; + back.setVisibility(View.VISIBLE); + cancel.setEnabled(false); + } else { + success(); + } } else { success(); - } + } } private void logIn(String username, String password, String displayName, String domain, TransportType transport, boolean sendEcCalibrationResult) {