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)