Merge branch 'master' of git.linphone.org:linphone-android into obiane_new

This commit is contained in:
Erwan Croze 2018-07-30 09:42:07 +02:00
commit 0df1b46409
20 changed files with 222 additions and 126 deletions

2
.gitignore vendored
View file

@ -53,3 +53,5 @@ liblinphone_tester/res/raw/
**/.classpath
**/.project
**/*.kdev4
liblinphone-sdk/res/
**/.vscode

View file

@ -33,7 +33,7 @@ apply plugin: 'com.android.library'
dependencies {
compile 'org.apache.commons:commons-compress:1.16.1'
implementation 'org.apache.commons:commons-compress:1.16.1'
javadocDeps 'org.apache.commons:commons-compress:1.16.1'
}

View file

@ -13,7 +13,7 @@ buildscript {
google()
}
dependencies {
classpath 'com.android.tools.build:gradle:2.3.3'
classpath 'com.android.tools.build:gradle:3.1.0'
}
}

View file

@ -26,8 +26,8 @@ allprojects {
apply plugin: 'com.android.library'
dependencies {
compile group: 'org.apache.commons', name: 'commons-compress', version: '1.16.1'
compile 'com.android.support:support-v4:26.0.2'
implementation group: 'org.apache.commons', name: 'commons-compress', version: '1.16.1'
implementation 'com.android.support:support-v4:26.0.2'
}

View file

@ -393,7 +393,7 @@ debug-sdk: java-clean build copy-libs generate-javadoc generate-apk
liblinphone-android-sdk: java-clean build copy-libs generate-javadoc release
\t./gradlew -q sdkZip
linphone-android-sdk: java-clean build copy-libs
linphone-android-sdk: java-clean build copy-libs
\t./gradlew -b linphoneAndroidSdk.gradle androidJavadocsJar
\t./gradlew -b linphoneAndroidSdk.gradle sourcesJar

View file

@ -152,6 +152,7 @@ public class LinphonePreferences {
// Accounts settings
private ProxyConfig getProxyConfig(int n) {
if (getLc() == null) return null;
ProxyConfig[] prxCfgs = getLc().getProxyConfigList();
if (n < 0 || n >= prxCfgs.length)
return null;
@ -171,6 +172,7 @@ public class LinphonePreferences {
* Useful to edit a authInfo (you should call saveAuthInfo after the modifications to save them).
*/
private AuthInfo getClonedAuthInfo(int n) {
if (getLc() == null) return null;
AuthInfo authInfo = getAuthInfo(n);
if (authInfo == null)
return null;
@ -185,6 +187,7 @@ public class LinphonePreferences {
* Useful to save the changes made to a cloned authInfo.
*/
private void saveAuthInfo(AuthInfo authInfo) {
if (getLc() == null) return;
getLc().addAuthInfo(authInfo);
}
@ -339,8 +342,12 @@ public class LinphonePreferences {
proxy = tempProxy;
}
}
Address proxyAddr = Factory.instance().createAddress(proxy);
Address identityAddr = Factory.instance().createAddress(identity);
if (proxyAddr == null || identityAddr == null) {
throw new CoreException("Proxy or Identity address is null !");
}
if (tempDisplayName != null) {
identityAddr.setDisplayName(tempDisplayName);
@ -539,6 +546,7 @@ public class LinphonePreferences {
}
private void setAccountPassword(int n, String password, String ha1) {
if (getLc() == null) return;
String user = getAccountUsername(n);
String domain = getAccountDomain(n);
String userid = null;
@ -632,6 +640,8 @@ public class LinphonePreferences {
}
Address proxyAddr = Factory.instance().createAddress(proxy);
if (proxyAddr == null) return;
if (!proxy.contains("transport=")) {
proxyAddr.setTransport(getAccountTransport(n));
}
@ -758,6 +768,7 @@ public class LinphonePreferences {
}
public void setDefaultAccount(int accountIndex) {
if (getLc() == null) return;
ProxyConfig[] prxCfgs = getLc().getProxyConfigList();
if (accountIndex >= 0 && accountIndex < prxCfgs.length)
getLc().setDefaultProxyConfig(prxCfgs[accountIndex]);
@ -787,6 +798,7 @@ public class LinphonePreferences {
}
public void setAccountEnabled(int n, boolean enabled) {
if (getLc() == null) return;
ProxyConfig prxCfg = getProxyConfig(n);
if (prxCfg == null) {
LinphoneUtils.displayErrorAlert(getString(R.string.error), mContext);
@ -815,6 +827,7 @@ public class LinphonePreferences {
}
public void resetDefaultProxyConfig(){
if (getLc() == null) return;
int count = getLc().getProxyConfigList().length;
for (int i = 0; i < count; i++) {
if (isAccountEnabled(i)) {
@ -829,6 +842,7 @@ public class LinphonePreferences {
}
public void deleteAccount(int n) {
if (getLc() == null) return;
ProxyConfig proxyCfg = getProxyConfig(n);
if (proxyCfg != null)
getLc().removeProxyConfig(proxyCfg);
@ -849,10 +863,12 @@ public class LinphonePreferences {
// Audio settings
public void setEchoCancellation(boolean enable) {
if (getLc() == null) return;
getLc().enableEchoCancellation(enable);
}
public boolean echoCancellationEnabled() {
if (getLc() == null) return false;
return getLc().echoCancellationEnabled();
}
@ -879,42 +895,50 @@ public class LinphonePreferences {
}
public boolean isVideoEnabled() {
if (getLc() == null) return false;
return getLc().videoSupported() && getLc().videoEnabled();
}
public void enableVideo(boolean enable) {
if (getLc() == null) return;
getLc().enableVideoCapture(enable);
getLc().enableVideoDisplay(enable);
}
public boolean shouldInitiateVideoCall() {
if (getLc() == null) return false;
return getLc().getVideoActivationPolicy().getAutomaticallyInitiate();
}
public void setInitiateVideoCall(boolean initiate) {
if (getLc() == null) return;
VideoActivationPolicy vap = getLc().getVideoActivationPolicy();
vap.setAutomaticallyInitiate(initiate);
getLc().setVideoActivationPolicy(vap);
}
public boolean shouldAutomaticallyAcceptVideoRequests() {
if (getLc() == null) return false;
VideoActivationPolicy vap = getLc().getVideoActivationPolicy();
return vap.getAutomaticallyAccept();
}
public void setAutomaticallyAcceptVideoRequests(boolean accept) {
if (getLc() == null) return;
VideoActivationPolicy vap = getLc().getVideoActivationPolicy();
vap.setAutomaticallyAccept(accept);
getLc().setVideoActivationPolicy(vap);
}
public String getVideoPreset() {
if (getLc() == null) return null;
String preset = getLc().getVideoPreset();
if (preset == null) preset = "default";
return preset;
}
public void setVideoPreset(String preset) {
if (getLc() == null) return;
if (preset.equals("default")) preset = null;
getLc().setVideoPreset(preset);
preset = getVideoPreset();
@ -930,22 +954,27 @@ public class LinphonePreferences {
}
public void setPreferredVideoSize(String preferredVideoSize) {
if (getLc() == null) return;
getLc().setPreferredVideoSizeByName(preferredVideoSize);
}
public int getPreferredVideoFps() {
if (getLc() == null) return 0;
return (int)getLc().getPreferredFramerate();
}
public void setPreferredVideoFps(int fps) {
if (getLc() == null) return;
getLc().setPreferredFramerate(fps);
}
public int getBandwidthLimit() {
if (getLc() == null) return 0;
return getLc().getDownloadBandwidth();
}
public void setBandwidthLimit(int bandwidth) {
if (getLc() == null) return;
getLc().setUploadBandwidth(bandwidth);
getLc().setDownloadBandwidth(bandwidth);
}
@ -953,34 +982,42 @@ public class LinphonePreferences {
// Call settings
public boolean useRfc2833Dtmfs() {
if (getLc() == null) return false;
return getLc().getUseRfc2833ForDtmf();
}
public void sendDtmfsAsRfc2833(boolean use) {
if (getLc() == null) return;
getLc().setUseRfc2833ForDtmf(use);
}
public boolean useSipInfoDtmfs() {
if (getLc() == null) return false;
return getLc().getUseInfoForDtmf();
}
public void sendDTMFsAsSipInfo(boolean use) {
if (getLc() == null) return;
getLc().setUseInfoForDtmf(use);
}
public int getIncTimeout() {
if (getLc() == null) return 0;
return getLc().getIncTimeout();
}
public void setIncTimeout(int timeout) {
if (getLc() == null) return;
getLc().setIncTimeout(timeout);
}
public int getInCallTimeout() {
if (getLc() == null) return 0;
return getLc().getInCallTimeout();
}
public void setInCallTimeout(int timeout) {
if (getLc() == null) return;
getLc().setInCallTimeout(timeout);
}
@ -1030,6 +1067,7 @@ public class LinphonePreferences {
}
public String getSipPort() {
if (getLc() == null) return null;
Transports transports = getLc().getTransports();
int port;
if (transports.getUdpPort() > 0)
@ -1040,6 +1078,7 @@ public class LinphonePreferences {
}
public void setSipPort(int port) {
if (getLc() == null) return;
Transports transports = getLc().getTransports();
transports.setUdpPort(port);
transports.setTcpPort(port);
@ -1048,6 +1087,7 @@ public class LinphonePreferences {
}
private NatPolicy getOrCreateNatPolicy() {
if (getLc() == null) return null;
NatPolicy nat = getLc().getNatPolicy();
if (nat == null) {
nat = getLc().createNatPolicy();
@ -1061,6 +1101,7 @@ public class LinphonePreferences {
}
public void setStunServer(String stun) {
if (getLc() == null) return;
NatPolicy nat = getOrCreateNatPolicy();
nat.setStunServer(stun);
@ -1070,6 +1111,7 @@ public class LinphonePreferences {
}
public void setIceEnabled(boolean enabled) {
if (getLc() == null) return;
NatPolicy nat = getOrCreateNatPolicy();
nat.enableIce(enabled);
nat.enableStun(enabled);
@ -1077,12 +1119,14 @@ public class LinphonePreferences {
}
public void setTurnEnabled(boolean enabled) {
if (getLc() == null) return;
NatPolicy nat = getOrCreateNatPolicy();
nat.enableTurn(enabled);
getLc().setNatPolicy(nat);
}
public void setUpnpEnabled(boolean enabled) {
if (getLc() == null) return;
NatPolicy nat = getOrCreateNatPolicy();
nat.enableUpnp(enabled);
getLc().setNatPolicy(nat);
@ -1109,6 +1153,7 @@ public class LinphonePreferences {
}
public void setTurnUsername(String username) {
if (getLc() == null) return;
NatPolicy nat = getOrCreateNatPolicy();
AuthInfo authInfo = getLc().findAuthInfo(null, nat.getStunServerUsername(), null);
@ -1127,6 +1172,7 @@ public class LinphonePreferences {
}
public void setTurnPassword(String password) {
if (getLc() == null) return;
NatPolicy nat = getOrCreateNatPolicy();
AuthInfo authInfo = getLc().findAuthInfo(null, nat.getStunServerUsername(), null);
@ -1142,10 +1188,12 @@ public class LinphonePreferences {
}
public MediaEncryption getMediaEncryption() {
if (getLc() == null) return null;
return getLc().getMediaEncryption();
}
public void setMediaEncryption(MediaEncryption menc) {
if (getLc() == null) return;
if (menc == null)
return;
@ -1166,6 +1214,7 @@ public class LinphonePreferences {
String appId = getString(R.string.push_sender_id);
if (regId != null && lc.getProxyConfigList().length > 0) {
for (ProxyConfig lpc : lc.getProxyConfigList()) {
if (lpc == null) continue;
if (!lpc.isPushNotificationAllowed()) {
lpc.edit();
lpc.setContactUriParameters(null);
@ -1215,10 +1264,12 @@ public class LinphonePreferences {
}
public void useIpv6(Boolean enable) {
if (getLc() == null) return;
getLc().enableIpv6(enable);
}
public boolean isUsingIpv6() {
if (getLc() == null) return false;
return getLc().ipv6Enabled();
}
// End of network settings
@ -1259,14 +1310,17 @@ public class LinphonePreferences {
}
public String getSharingPictureServerUrl() {
if (getLc() == null) return null;
return getLc().getFileTransferServer();
}
public void setSharingPictureServerUrl(String url) {
if (getLc() == null) return;
getLc().setFileTransferServer(url);
}
public void setRemoteProvisioningUrl(String url) {
if (getLc() == null) return;
if (url != null && url.length() == 0) {
url = null;
}
@ -1274,26 +1328,31 @@ public class LinphonePreferences {
}
public String getRemoteProvisioningUrl() {
if (getLc() == null) return null;
return getLc().getProvisioningUri();
}
public void setDefaultDisplayName(String displayName) {
if (getLc() == null) return;
Address primary = getLc().getPrimaryContactParsed();
primary.setDisplayName(displayName);
getLc().setPrimaryContact(primary.asString());
}
public String getDefaultDisplayName() {
if (getLc() == null) return null;
return getLc().getPrimaryContactParsed().getDisplayName();
}
public void setDefaultUsername(String username) {
if (getLc() == null) return;
Address primary = getLc().getPrimaryContactParsed();
primary.setUsername(username);
getLc().setPrimaryContact(primary.asString());
}
public String getDefaultUsername() {
if (getLc() == null) return null;
return getLc().getPrimaryContactParsed().getUsername();
}
// End of advanced settings
@ -1302,6 +1361,7 @@ public class LinphonePreferences {
private TunnelConfig tunnelConfig = null;
public TunnelConfig getTunnelConfig() {
if (getLc() == null) return null;
if(getLc().tunnelAvailable()) {
Tunnel tunnel = getLc().getTunnel();
if (tunnelConfig == null) {
@ -1384,10 +1444,12 @@ public class LinphonePreferences {
}
public boolean adaptiveRateControlEnabled() {
if (getLc() == null) return false;
return getLc().adaptiveRateControlEnabled();
}
public void enableAdaptiveRateControl(boolean enabled) {
if (getLc() == null) return;
getLc().enableAdaptiveRateControl(enabled);
}
@ -1501,10 +1563,12 @@ public class LinphonePreferences {
}
public LimeState limeEnabled() {
if (getLc() == null) return LimeState.Disabled;
return getLc().limeEnabled();
}
public void enableLime(LimeState lime) {
if (getLc() == null) return;
getLc().enableLime(lime);
}

View file

@ -311,68 +311,21 @@ public final class LinphoneService extends Service {
stopForegroundCompat(NOTIF_ID);
}
@SuppressWarnings("unchecked")
@Override
public void onCreate() {
super.onCreate();
mLastNotificationId = 8; // To not interfere with other notifs ids
mChatNotifMap = new HashMap<String, Notified>();
setupActivityMonitor();
// In case restart after a crash. Main in LinphoneActivity
mNotificationTitle = getString(R.string.service_name);
// Needed in order for the two next calls to succeed, libraries must have been loaded first
LinphonePreferences.instance().setContext(getBaseContext());
Factory.instance().setLogCollectionPath(getFilesDir().getAbsolutePath());
boolean isDebugEnabled = LinphonePreferences.instance().isDebugEnabled();
LinphoneUtils.initLoggingService(isDebugEnabled, getString(R.string.app_name));
// Dump some debugging information to the logs
Log.i(START_LINPHONE_LOGS);
dumpDeviceInformation();
dumpInstalledLinphoneInformation();
//Disable service notification for Android O
if ((Version.sdkAboveOrEqual(Version.API26_O_80))) {
LinphonePreferences.instance().setServiceNotificationVisibility(false);
mDisableRegistrationStatus = true;
}
mNM = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
mNM.cancel(INCALL_NOTIF_ID); // in case of crash the icon is not removed
Compatibility.CreateChannel(this);
Intent notifIntent = new Intent(this, incomingReceivedActivity);
notifIntent.putExtra("Notification", true);
mNotifContentIntent = PendingIntent.getActivity(this, 0, notifIntent, PendingIntent.FLAG_UPDATE_CURRENT);
Bitmap bm = null;
try {
bm = BitmapFactory.decodeResource(getResources(), R.mipmap.ic_launcher);
} catch (Exception e) {
}
mNotif = Compatibility.createNotification(this, mNotificationTitle, "", R.drawable.linphone_notification_icon, R.mipmap.ic_launcher, bm, mNotifContentIntent, true,notifcationsPriority);
public int onStartCommand(Intent intent, int flags, int startId) {
super.onStartCommand(intent, flags, startId);
if (!LinphoneManager.isInstanciated())
LinphoneManager.createAndStart(LinphoneService.this);
instance = this; // instance is ready once linphone manager has been created
incomingReceivedActivityName = LinphonePreferences.instance().getActivityToLaunchOnIncomingReceived();
try {
incomingReceivedActivity = (Class<? extends Activity>) Class.forName(incomingReceivedActivityName);
} catch (ClassNotFoundException e) {
Log.e(e);
}
if (LinphoneManager.getLc() != null) {
LinphoneManager.getLc().addListener(mListener = new CoreListenerStub() {
@Override
public void onCallStateChanged(Core lc, Call call, Call.State state, String message) {
if (instance == null) {
Log.i("Service not ready, discarding call state change to ", state.toString());
return;
}
LinphoneManager.getLc().addListener(mListener = new CoreListenerStub() {
@Override
public void onCallStateChanged(Core lc, Call call, Call.State state, String message) {
if (instance == null) {
Log.i("Service not ready, discarding call state change to ",state.toString());
return;
}
if (state == Call.State.IncomingReceived) {
if (!LinphoneManager.getInstance().getCallGsmON())
@ -452,14 +405,10 @@ public final class LinphoneService extends Service {
}
}
}
});
}
});
try {
mStartForeground = getClass().getMethod("startForeground", mStartFgSign);
mStopForeground = getClass().getMethod("stopForeground", mStopFgSign);
} catch (NoSuchMethodException e) {
Log.e(e, "Couldn't find startForeground or stopForeground");
if (displayServiceNotification() || (Version.sdkAboveOrEqual(Version.API26_O_80) && intent.getBooleanExtra("ForceStartForeground", false))) {
startForegroundCompat(NOTIF_ID, mNotif);
}
if (!Version.sdkAboveOrEqual(Version.API26_O_80)
@ -467,10 +416,6 @@ public final class LinphoneService extends Service {
getContentResolver().registerContentObserver(ContactsContract.Contacts.CONTENT_URI, true, ContactsManager.getInstance());
}
if (displayServiceNotification()) {
startForegroundCompat(NOTIF_ID, mNotif);
}
if (!mTestDelayElapsed) {
// Only used when testing. Simulates a 5 seconds delay for launching service
mHandler.postDelayed(new Runnable() {
@ -481,11 +426,71 @@ public final class LinphoneService extends Service {
}
//make sure the application will at least wakes up every 10 mn
Intent intent = new Intent(this, KeepAliveReceiver.class);
PendingIntent keepAlivePendingIntent = PendingIntent.getBroadcast(this, 0, intent, PendingIntent.FLAG_ONE_SHOT);
Intent keepAliveIntent = new Intent(this, KeepAliveReceiver.class);
PendingIntent keepAlivePendingIntent = PendingIntent.getBroadcast(this, 0, keepAliveIntent, PendingIntent.FLAG_ONE_SHOT);
AlarmManager alarmManager = ((AlarmManager) this.getSystemService(Context.ALARM_SERVICE));
Compatibility.scheduleAlarm(alarmManager, AlarmManager.ELAPSED_REALTIME_WAKEUP, SystemClock.elapsedRealtime() + 600000, keepAlivePendingIntent);
return START_STICKY;
}
@SuppressWarnings("unchecked")
@Override
public void onCreate() {
super.onCreate();
mLastNotificationId = 8; // To not interfere with other notifs ids
mChatNotifMap = new HashMap<String, Notified>();
setupActivityMonitor();
// In case restart after a crash. Main in LinphoneActivity
mNotificationTitle = getString(R.string.service_name);
// Needed in order for the two next calls to succeed, libraries must have been loaded first
LinphonePreferences.instance().setContext(getBaseContext());
Factory.instance().setLogCollectionPath(getFilesDir().getAbsolutePath());
boolean isDebugEnabled = LinphonePreferences.instance().isDebugEnabled();
LinphoneUtils.initLoggingService(isDebugEnabled, getString(R.string.app_name));
// Dump some debugging information to the logs
Log.i(START_LINPHONE_LOGS);
dumpDeviceInformation();
dumpInstalledLinphoneInformation();
//Disable service notification for Android O
if ((Version.sdkAboveOrEqual(Version.API26_O_80))) {
LinphonePreferences.instance().setServiceNotificationVisibility(false);
mDisableRegistrationStatus = true;
}
mNM = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
mNM.cancel(INCALL_NOTIF_ID); // in case of crash the icon is not removed
Compatibility.CreateChannel(this);
Intent notifIntent = new Intent(this, incomingReceivedActivity);
notifIntent.putExtra("Notification", true);
mNotifContentIntent = PendingIntent.getActivity(this, 0, notifIntent, PendingIntent.FLAG_UPDATE_CURRENT);
Bitmap bm = null;
try {
bm = BitmapFactory.decodeResource(getResources(), R.mipmap.ic_launcher);
} catch (Exception e) {
}
mNotif = Compatibility.createNotification(this, mNotificationTitle, "", R.drawable.linphone_notification_icon, R.mipmap.ic_launcher, bm, mNotifContentIntent, true,notifcationsPriority);
incomingReceivedActivityName = LinphonePreferences.instance().getActivityToLaunchOnIncomingReceived();
try {
incomingReceivedActivity = (Class<? extends Activity>) Class.forName(incomingReceivedActivityName);
} catch (ClassNotFoundException e) {
Log.e(e);
}
try {
mStartForeground = getClass().getMethod("startForeground", mStartFgSign);
mStopForeground = getClass().getMethod("stopForeground", mStopFgSign);
} catch (NoSuchMethodException e) {
Log.e(e, "Couldn't find startForeground or stopForeground");
}
mWindowManager = (WindowManager) getSystemService(WINDOW_SERVICE);
}

View file

@ -867,6 +867,8 @@ public final class LinphoneUtils {
}
public static Spanned getTextWithHttpLinks(String text) {
if (text == null) return null;
if (text.contains("<")) {
text = text.replace("<", "&lt;");
}

View file

@ -292,8 +292,11 @@ public class LinphoneActivity extends LinphoneGenericActivity implements OnClick
}
};
int missedCalls = (LinphoneManager.getLcIfManagerNotDestroyedOrNull() != null) ? LinphoneManager.getLc().getMissedCallsCount() : 0;
displayMissedCalls(missedCalls);
Core lc = LinphoneManager.getLcIfManagerNotDestroyedOrNull();
if (lc != null) {
int missedCalls = lc.getMissedCallsCount();
displayMissedCalls(missedCalls);
}
int rotation = getWindowManager().getDefaultDisplay().getRotation();
switch (rotation) {

View file

@ -520,7 +520,10 @@ public class CallActivity extends LinphoneGenericActivity implements OnClickList
}
});
initCallStatsRefresher(LinphoneManager.getLc().getCurrentCall(), findViewById(R.id.incall_stats));
Core lc = LinphoneManager.getLcIfManagerNotDestroyedOrNull();
if (lc != null) {
initCallStatsRefresher(lc.getCurrentCall(), findViewById(R.id.incall_stats));
}
}
private void refreshIncallUi(){

View file

@ -280,7 +280,7 @@ public class GroupChatFragment extends Fragment implements ChatRoomListener, Con
removeVirtualKeyboardVisiblityListener();
LinphoneManager.getInstance().setCurrentChatRoomAddress(null);
if (mChatRoom != null) mChatRoom.removeListener(this);
mEventsAdapter.clear();
if (mEventsAdapter != null) mEventsAdapter.clear();
super.onPause();
}

View file

@ -75,21 +75,23 @@ public class ContactDetailsFragment extends Fragment implements OnClickListener
String tag = (String)v.getTag();
Core lc = LinphoneManager.getLc();
Address participant = Factory.instance().createAddress(tag);
ChatRoom room = lc.findOneToOneChatRoom(lc.getDefaultProxyConfig().getContact(), participant);
if (room != null) {
LinphoneActivity.instance().goToChat(room.getPeerAddress().asStringUriOnly(), null);
} else {
ProxyConfig lpc = lc.getDefaultProxyConfig();
if (lpc != null && lpc.getConferenceFactoryUri() != null && !LinphonePreferences.instance().useBasicChatRoomFor1To1()) {
mWaitLayout.setVisibility(View.VISIBLE);
mChatRoom = lc.createClientGroupChatRoom(getString(R.string.dummy_group_chat_subject), false);
mChatRoom.addListener(mChatRoomCreationListener);
Address participants[] = new Address[1];
participants[0] = participant;
mChatRoom.addParticipants(participants);
} else {
room = lc.getChatRoom(participant);
ProxyConfig defaultProxyConfig = lc.getDefaultProxyConfig();
if (defaultProxyConfig != null) {
ChatRoom room = lc.findOneToOneChatRoom(defaultProxyConfig.getContact(), participant);
if (room != null) {
LinphoneActivity.instance().goToChat(room.getPeerAddress().asStringUriOnly(), null);
} else {
if (defaultProxyConfig.getConferenceFactoryUri() != null && !LinphonePreferences.instance().useBasicChatRoomFor1To1()) {
mWaitLayout.setVisibility(View.VISIBLE);
mChatRoom = lc.createClientGroupChatRoom(getString(R.string.dummy_group_chat_subject), false);
mChatRoom.addListener(mChatRoomCreationListener);
Address participants[] = new Address[1];
participants[0] = participant;
mChatRoom.addParticipants(participants);
} else {
room = lc.getChatRoom(participant);
LinphoneActivity.instance().goToChat(room.getPeerAddress().asStringUriOnly(), null);
}
}
}
}

View file

@ -414,9 +414,10 @@ public class LinphoneContact implements Serializable, Comparable<LinphoneContact
private void createOrUpdateFriend() {
boolean created = false;
Core lc = LinphoneManager.getLcIfManagerNotDestroyedOrNull();
if (lc == null) return;
if (!isFriend()) {
friend = LinphoneManager.getLc().createFriend();
friend = lc.createFriend();
friend.enableSubscribes(false);
friend.setIncSubscribePolicy(SubscribePolicy.SPDeny);
if (isAndroidContact()) {

View file

@ -40,8 +40,9 @@ public class LinphoneNumberOrAddress implements Serializable, Comparable<Linphon
@Override
public int compareTo(LinphoneNumberOrAddress noa) {
if (noa.isSIPAddress() == isSIPAddress() && noa.getValue() != null) {
return noa.getValue().compareTo(getValue());
String value = noa.getValue();
if (noa.isSIPAddress() == isSIPAddress() && value != null) {
return value.compareTo(getValue());
} else {
return isSIPAddress() ? -1 : 1;
}

View file

@ -183,7 +183,7 @@ public class SearchContactsListAdapter extends BaseAdapter {
}
if (sr.getAddress() != null || sr.getPhoneNumber() != null) {
for (ContactAddress ca : result) {
String normalizedPhoneNumber = (ca.getPhoneNumber() != null) ? prx.normalizePhoneNumber(ca.getPhoneNumber()) : null;
String normalizedPhoneNumber = (ca != null && ca.getPhoneNumber() != null && prx != null) ? prx.normalizePhoneNumber(ca.getPhoneNumber()) : null;
if ((sr.getAddress() != null && ca.getAddress() != null
&& ca.getAddress().asStringUriOnly().equals(sr.getAddress().asStringUriOnly()))
|| (sr.getPhoneNumber() != null && normalizedPhoneNumber != null

View file

@ -572,7 +572,9 @@ public class HistoryListFragment extends Fragment implements OnClickListener, On
} else {
address = log.getToAddress();
}
LinphoneActivity.instance().setAddresGoToDialerAndCall(address.asStringUriOnly(), address.getDisplayName(), null);
if (address != null) {
LinphoneActivity.instance().setAddresGoToDialerAndCall(address.asStringUriOnly(), address.getDisplayName(), null);
}
}
}
});

View file

@ -526,33 +526,35 @@ public class SettingsFragment extends PreferencesListFragment {
codecs.removeAll();
Core lc = LinphoneManager.getLcIfManagerNotDestroyedOrNull();
for (final PayloadType pt : lc.getAudioPayloadTypes()) {
CheckBoxPreference codec = new CheckBoxPreference(getActivity());
codec.setTitle(pt.getMimeType());
/* Special case */
if (pt.getMimeType().equals("mpeg4-generic")) {
if (android.os.Build.VERSION.SDK_INT < 16) {
/* Make sure AAC is disabled */
pt.enable(false);
continue;
} else {
codec.setTitle("AAC-ELD");
if (lc != null) {
for (final PayloadType pt : lc.getAudioPayloadTypes()) {
CheckBoxPreference codec = new CheckBoxPreference(getActivity());
codec.setTitle(pt.getMimeType());
/* Special case */
if (pt.getMimeType().equals("mpeg4-generic")) {
if (android.os.Build.VERSION.SDK_INT < 16) {
/* Make sure AAC is disabled */
pt.enable(false);
continue;
} else {
codec.setTitle("AAC-ELD");
}
}
codec.setSummary(pt.getClockRate() + " Hz");
codec.setDefaultValue(pt.enabled());
codec.setOnPreferenceChangeListener(new OnPreferenceChangeListener() {
@Override
public boolean onPreferenceChange(Preference preference, Object newValue) {
boolean enable = (Boolean) newValue;
pt.enable(enable);
return true;
}
});
codecs.addPreference(codec);
}
codec.setSummary(pt.getClockRate() + " Hz");
codec.setDefaultValue(pt.enabled());
codec.setOnPreferenceChangeListener(new OnPreferenceChangeListener() {
@Override
public boolean onPreferenceChange(Preference preference, Object newValue) {
boolean enable = (Boolean) newValue;
pt.enable(enable);
return true;
}
});
codecs.addPreference(codec);
}
CheckBoxPreference echoCancellation = (CheckBoxPreference) findPreference(getString(R.string.pref_echo_cancellation_key));
@ -1062,8 +1064,13 @@ public class SettingsFragment extends PreferencesListFragment {
@Override
public boolean onPreferenceChange(Preference preference, Object newValue) {
String value = (String)newValue;
mPrefs.setIncTimeout(Integer.valueOf(value));
preference.setSummary(value);
try {
mPrefs.setIncTimeout(Integer.valueOf(value));
preference.setSummary(value);
} catch (NumberFormatException nfe) {
Log.e("Value is not an Integer ! " + value);
return false;
}
return true;
}
});

View file

@ -42,6 +42,7 @@ public class BootReceiver extends BroadcastReceiver {
if (autostart) {
Intent lLinphoneServiceIntent = new Intent(Intent.ACTION_MAIN);
lLinphoneServiceIntent.setClass(context, LinphoneService.class);
lLinphoneServiceIntent.putExtra("ForceStartForeground", true);
Compatibility.startService(context, lLinphoneServiceIntent);
}
}

View file

@ -24,6 +24,8 @@ import android.content.Context;
import android.content.Intent;
import android.telephony.TelephonyManager;
import org.linphone.core.Core;
import org.linphone.LinphoneManager;
/**
@ -39,7 +41,8 @@ public class PhoneStateChangedReceiver extends BroadcastReceiver {
if (TelephonyManager.EXTRA_STATE_OFFHOOK.equals(extraState) || TelephonyManager.EXTRA_STATE_RINGING.equals(extraState)) {
LinphoneManager.getInstance().setCallGsmON(true);
LinphoneManager.getLc().pauseAllCalls();
Core lc = LinphoneManager.getLcIfManagerNotDestroyedOrNull();
lc.pauseAllCalls();
} else if (TelephonyManager.EXTRA_STATE_IDLE.equals(extraState)) {
LinphoneManager.getInstance().setCallGsmON(false);
}

View file

@ -64,7 +64,7 @@ public class ListSelectionHelper {
mEditButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (mAdapter.getCount() > 0) {
if (mAdapter != null && mAdapter.getCount() > 0) {
mAdapter.enableEdition(true);
mTopBar.setVisibility(View.GONE);
mEditTopBar.setVisibility(View.VISIBLE);