diff --git a/res/layout/contact_cell.xml b/res/layout/contact_cell.xml
index cf233a2ce..0d5615ff8 100644
--- a/res/layout/contact_cell.xml
+++ b/res/layout/contact_cell.xml
@@ -95,6 +95,19 @@
android:scaleType="centerInside"
android:src="@drawable/led_connected" />
+
+
+
\ No newline at end of file
diff --git a/res/raw/linphonerc_default b/res/raw/linphonerc_default
index 61e812811..6ced4c1b6 100644
--- a/res/raw/linphonerc_default
+++ b/res/raw/linphonerc_default
@@ -7,6 +7,8 @@ contact="Linphone Android"
use_info=0
use_ipv6=0
keepalive_period=30000
+rls_uri=sip:rls@sip1.linphone.org
+use_rls_presence=1
[video]
size=qvga
diff --git a/res/values/non_localizable_strings.xml b/res/values/non_localizable_strings.xml
index 2a3a3b75b..b7b638830 100644
--- a/res/values/non_localizable_strings.xml
+++ b/res/values/non_localizable_strings.xml
@@ -71,6 +71,7 @@
pref_bandwidth_limit_key
pref_animation_enable_key
pref_escape_plus_key
+ pref_friendlist_subscribe_key
pref_echo_cancellation_key
pref_autostart_key
Outbound proxy
diff --git a/res/values/strings.xml b/res/values/strings.xml
index 61bd98f75..5c3ac39e7 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -204,6 +204,7 @@
AVPF
AVPF regular RTCP interval in seconds (between 1 and 5)
Replace + by 00
+ Friendlist subscribe
Auth userid
Enter authentication userid (optional)
Display name
diff --git a/res/xml/account_preferences.xml b/res/xml/account_preferences.xml
index cd70b14fd..2e46704d7 100644
--- a/res/xml/account_preferences.xml
+++ b/res/xml/account_preferences.xml
@@ -72,6 +72,10 @@
+
+
diff --git a/src/org/linphone/AccountPreferencesFragment.java b/src/org/linphone/AccountPreferencesFragment.java
index a1b217840..2b8b78538 100644
--- a/src/org/linphone/AccountPreferencesFragment.java
+++ b/src/org/linphone/AccountPreferencesFragment.java
@@ -176,7 +176,7 @@ public class AccountPreferencesFragment extends PreferencesListFragment {
}
preference.setSummary(newValue.toString());
return true;
- }
+ }
};
OnPreferenceChangeListener prefixChangedListener = new OnPreferenceChangeListener() {
@Override
@@ -234,6 +234,14 @@ public class AccountPreferencesFragment extends PreferencesListFragment {
return true;
}
};
+ OnPreferenceChangeListener friendlistSubscribeListener = new OnPreferenceChangeListener() {
+ @Override
+ public boolean onPreferenceChange(Preference preference, Object newValue) {
+ boolean value = (Boolean) newValue;
+ LinphoneManager.getInstance().subscribeFriendList(value);
+ return true;
+ }
+ };
OnPreferenceChangeListener disableChangedListener = new OnPreferenceChangeListener() {
@Override
public boolean onPreferenceChange(Preference preference, Object newValue) {
@@ -365,6 +373,12 @@ public class AccountPreferencesFragment extends PreferencesListFragment {
if(!isNewAccount){
escape.setChecked(mPrefs.getReplacePlusByZeroZero(n));
}
+
+ CheckBoxPreference friendlistSubscribe = (CheckBoxPreference) advanced.getPreference(8);
+ friendlistSubscribe.setOnPreferenceChangeListener(friendlistSubscribeListener);
+ if(!isNewAccount){
+ escape.setChecked(mPrefs.getReplacePlusByZeroZero(n));
+ }
PreferenceCategory manage = (PreferenceCategory) getPreferenceScreen().findPreference(getString(R.string.pref_manage_key));
final CheckBoxPreference disable = (CheckBoxPreference) manage.getPreference(0);
diff --git a/src/org/linphone/ContactsListFragment.java b/src/org/linphone/ContactsListFragment.java
index f81e59b00..6c2ffa021 100644
--- a/src/org/linphone/ContactsListFragment.java
+++ b/src/org/linphone/ContactsListFragment.java
@@ -459,6 +459,7 @@ public class ContactsListFragment extends Fragment implements OnClickListener, O
}
CheckBox delete = (CheckBox) view.findViewById(R.id.delete);
+ ImageView linphoneFriend = (ImageView) view.findViewById(R.id.friendLinphone);
TextView name = (TextView) view.findViewById(R.id.name);
name.setText(contact.getFullName());
@@ -474,7 +475,13 @@ public class ContactsListFragment extends Fragment implements OnClickListener, O
separatorText.setText(String.valueOf(fullName.charAt(0)));
}
}
-
+
+ if(contact.isInLinphoneFriendList()){
+ linphoneFriend.setVisibility(View.VISIBLE);
+ } else {
+ linphoneFriend.setVisibility(View.GONE);
+ }
+
ImageView icon = (ImageView) view.findViewById(R.id.contact_picture);
if (contact.hasPhoto()) {
LinphoneUtils.setImagePictureFromUri(getActivity(), icon, contact.getPhotoUri(), contact.getThumbnailUri());
diff --git a/src/org/linphone/LinphoneActivity.java b/src/org/linphone/LinphoneActivity.java
index 048892aac..4af290067 100644
--- a/src/org/linphone/LinphoneActivity.java
+++ b/src/org/linphone/LinphoneActivity.java
@@ -50,13 +50,16 @@ import org.linphone.ui.AddressText;
import android.Manifest;
import android.annotation.SuppressLint;
import android.app.Activity;
+import android.app.ActivityManager;
import android.app.Dialog;
import android.app.Fragment;
import android.app.FragmentManager;
import android.app.FragmentTransaction;
+import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.pm.ActivityInfo;
+import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.graphics.Bitmap;
import android.graphics.drawable.ColorDrawable;
@@ -1122,6 +1125,9 @@ public class LinphoneActivity extends Activity implements OnClickListener, Conta
protected void onPause() {
getIntent().putExtra("PreviousActivity", 0);
+ if(LinphonePreferences.instance().isFriendlistsubscriptionEnabled()){
+ LinphoneManager.getInstance().subscribeFriendList(!isApplicationBroughtToBackground(this));
+ }
LinphoneCore lc = LinphoneManager.getLcIfManagerNotDestroyedOrNull();
if (lc != null) {
lc.removeListener(mListener);
@@ -1129,7 +1135,28 @@ public class LinphoneActivity extends Activity implements OnClickListener, Conta
super.onPause();
}
-
+
+ public static boolean isApplicationBroughtToBackground(final Activity activity) {
+ ActivityManager activityManager = (ActivityManager) activity.getSystemService(Context.ACTIVITY_SERVICE);
+ List tasks = activityManager.getRunningTasks(1);
+
+ // Check the top Activity against the list of Activities contained in the Application's package.
+ if (!tasks.isEmpty()) {
+ ComponentName topActivity = tasks.get(0).topActivity;
+ try {
+ PackageInfo pi = activity.getPackageManager().getPackageInfo(activity.getPackageName(), PackageManager.GET_ACTIVITIES);
+ for (ActivityInfo activityInfo : pi.activities) {
+ if(topActivity.getClassName().equals(activityInfo.name)) {
+ return false;
+ }
+ }
+ } catch( PackageManager.NameNotFoundException e) {
+ return false; // Never happens.
+ }
+ }
+ return true;
+ }
+
public void checkAndRequestExternalStoragePermission() {
if (LinphonePreferences.instance().writeExternalStoragePermAsked()) {
return;
@@ -1171,7 +1198,7 @@ public class LinphoneActivity extends Activity implements OnClickListener, Conta
public void checkAndRequestPermission(String permission, int result) {
if (getPackageManager().checkPermission(permission, getPackageName()) != PackageManager.PERMISSION_GRANTED) {
- ActivityCompat.requestPermissions(this, new String[]{ permission }, result);
+ ActivityCompat.requestPermissions(this, new String[]{permission}, result);
}
}
@@ -1244,6 +1271,9 @@ public class LinphoneActivity extends Activity implements OnClickListener, Conta
refreshAccounts();
updateMissedChatCount();
+ if(LinphonePreferences.instance().isFriendlistsubscriptionEnabled()){
+ LinphoneManager.getInstance().subscribeFriendList(true);
+ }
displayMissedCalls(LinphoneManager.getLc().getMissedCallsCount());
diff --git a/src/org/linphone/LinphoneContact.java b/src/org/linphone/LinphoneContact.java
index cc73283ec..ba76ea319 100644
--- a/src/org/linphone/LinphoneContact.java
+++ b/src/org/linphone/LinphoneContact.java
@@ -29,6 +29,7 @@ import org.linphone.core.LinphoneCoreException;
import org.linphone.core.LinphoneCoreFactory;
import org.linphone.core.LinphoneFriend;
import org.linphone.core.LinphoneFriend.SubscribePolicy;
+import org.linphone.core.PresenceBasicStatus;
import org.linphone.mediastream.Log;
import android.content.ContentProviderOperation;
@@ -446,6 +447,10 @@ public class LinphoneContact implements Serializable, Comparable= 0 && accountIndex < prxCfgs.length)