Foreground service (fix choppy sound when not visible)
This commit is contained in:
parent
c71597e27e
commit
fc67293df4
4 changed files with 102 additions and 11 deletions
|
@ -485,7 +485,7 @@ public class ConferenceActivity extends ListActivity implements
|
||||||
public View getView(int position, View v, ViewGroup parent) {
|
public View getView(int position, View v, ViewGroup parent) {
|
||||||
Log.i("ConferenceActivity.getView(",position,") out of ", linphoneCalls.size());
|
Log.i("ConferenceActivity.getView(",position,") out of ", linphoneCalls.size());
|
||||||
if (v == null) {
|
if (v == null) {
|
||||||
if (Version.sdkAboveOrEqual(Version.API06_ECLAIR_20)) {
|
if (Version.sdkAboveOrEqual(Version.API06_ECLAIR_201)) {
|
||||||
v = getLayoutInflater().inflate(R.layout.conf_callee, null);
|
v = getLayoutInflater().inflate(R.layout.conf_callee, null);
|
||||||
} else {
|
} else {
|
||||||
v = getLayoutInflater().inflate(R.layout.conf_callee_older_devices, null);
|
v = getLayoutInflater().inflate(R.layout.conf_callee_older_devices, null);
|
||||||
|
|
|
@ -56,7 +56,7 @@ public final class ContactHelper {
|
||||||
|
|
||||||
public boolean query() {
|
public boolean query() {
|
||||||
boolean succeeded;
|
boolean succeeded;
|
||||||
if (Version.sdkAboveOrEqual(Version.API06_ECLAIR_20)) {
|
if (Version.sdkAboveOrEqual(Version.API06_ECLAIR_201)) {
|
||||||
ContactHelperNew helper = new ContactHelperNew();
|
ContactHelperNew helper = new ContactHelperNew();
|
||||||
succeeded = helper.queryNewContactAPI();
|
succeeded = helper.queryNewContactAPI();
|
||||||
} else {
|
} else {
|
||||||
|
|
|
@ -19,6 +19,8 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||||
package org.linphone;
|
package org.linphone;
|
||||||
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
|
import java.lang.reflect.InvocationTargetException;
|
||||||
|
import java.lang.reflect.Method;
|
||||||
|
|
||||||
import org.linphone.LinphoneManager.NewOutgoingCallUiListener;
|
import org.linphone.LinphoneManager.NewOutgoingCallUiListener;
|
||||||
import org.linphone.LinphoneSimpleListener.LinphoneServiceListener;
|
import org.linphone.LinphoneSimpleListener.LinphoneServiceListener;
|
||||||
|
@ -34,7 +36,6 @@ import android.app.Notification;
|
||||||
import android.app.NotificationManager;
|
import android.app.NotificationManager;
|
||||||
import android.app.PendingIntent;
|
import android.app.PendingIntent;
|
||||||
import android.app.Service;
|
import android.app.Service;
|
||||||
import android.content.Context;
|
|
||||||
import android.content.Intent;
|
import android.content.Intent;
|
||||||
import android.content.pm.PackageInfo;
|
import android.content.pm.PackageInfo;
|
||||||
import android.content.pm.PackageManager.NameNotFoundException;
|
import android.content.pm.PackageManager.NameNotFoundException;
|
||||||
|
@ -80,7 +81,6 @@ public final class LinphoneService extends Service implements LinphoneServiceLis
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
private NotificationManager mNotificationMgr;
|
|
||||||
private final static int NOTIF_ID=1;
|
private final static int NOTIF_ID=1;
|
||||||
|
|
||||||
private Notification mNotif;
|
private Notification mNotif;
|
||||||
|
@ -115,7 +115,7 @@ public final class LinphoneService extends Service implements LinphoneServiceLis
|
||||||
dumpDeviceInformation();
|
dumpDeviceInformation();
|
||||||
dumpInstalledLinphoneInformation();
|
dumpInstalledLinphoneInformation();
|
||||||
|
|
||||||
mNotificationMgr = (NotificationManager) this.getSystemService(Context.NOTIFICATION_SERVICE);
|
mNM = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
|
||||||
mNotif = new Notification(R.drawable.status_level, "", System.currentTimeMillis());
|
mNotif = new Notification(R.drawable.status_level, "", System.currentTimeMillis());
|
||||||
mNotif.iconLevel=IC_LEVEL_ORANGE;
|
mNotif.iconLevel=IC_LEVEL_ORANGE;
|
||||||
mNotif.flags |= Notification.FLAG_ONGOING_EVENT;
|
mNotif.flags |= Notification.FLAG_ONGOING_EVENT;
|
||||||
|
@ -123,16 +123,106 @@ public final class LinphoneService extends Service implements LinphoneServiceLis
|
||||||
Intent notifIntent = new Intent(this, LinphoneActivity.class);
|
Intent notifIntent = new Intent(this, LinphoneActivity.class);
|
||||||
mNotifContentIntent = PendingIntent.getActivity(this, 0, notifIntent, 0);
|
mNotifContentIntent = PendingIntent.getActivity(this, 0, notifIntent, 0);
|
||||||
mNotif.setLatestEventInfo(this, notificationTitle,"", mNotifContentIntent);
|
mNotif.setLatestEventInfo(this, notificationTitle,"", mNotifContentIntent);
|
||||||
mNotificationMgr.notify(NOTIF_ID, mNotif);
|
|
||||||
|
|
||||||
|
|
||||||
LinphoneManager.createAndStart(this, this);
|
LinphoneManager.createAndStart(this, this);
|
||||||
LinphoneManager.getLc().setPresenceInfo(0, null, OnlineStatus.Online);
|
LinphoneManager.getLc().setPresenceInfo(0, null, OnlineStatus.Online);
|
||||||
instance = this; // instance is ready once linphone manager has been created
|
instance = this; // instance is ready once linphone manager has been created
|
||||||
|
|
||||||
|
|
||||||
|
// Retrieve methods to publish notification and keep Android
|
||||||
|
// from killing us and keep the audio quality high.
|
||||||
|
if (Version.sdkStrictlyBelow(Version.API05_ECLAIR_20)) {
|
||||||
|
try {
|
||||||
|
mSetForeground = getClass().getMethod("setForeground", mSetFgSign);
|
||||||
|
} catch (NoSuchMethodException e) {
|
||||||
|
Log.e(e, "Couldn't find foreground method");
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
try {
|
||||||
|
mStartForeground = getClass().getMethod("startForeground", mStartFgSign);
|
||||||
|
mStopForeground = getClass().getMethod("stopForeground", mStopFgSign);
|
||||||
|
} catch (NoSuchMethodException e) {
|
||||||
|
Log.e(e, "Couldn't find startGoreground or stopForeground");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
startForegroundCompat(NOTIF_ID, mNotif);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
private static final Class<?>[] mSetFgSign = new Class[] {boolean.class};
|
||||||
|
private static final Class<?>[] mStartFgSign = new Class[] {
|
||||||
|
int.class, Notification.class};
|
||||||
|
private static final Class<?>[] mStopFgSign = new Class[] {boolean.class};
|
||||||
|
|
||||||
|
private NotificationManager mNM;
|
||||||
|
private Method mSetForeground;
|
||||||
|
private Method mStartForeground;
|
||||||
|
private Method mStopForeground;
|
||||||
|
private Object[] mSetForegroundArgs = new Object[1];
|
||||||
|
private Object[] mStartForegroundArgs = new Object[2];
|
||||||
|
private Object[] mStopForegroundArgs = new Object[1];
|
||||||
|
|
||||||
|
void invokeMethod(Method method, Object[] args) {
|
||||||
|
try {
|
||||||
|
method.invoke(this, args);
|
||||||
|
} catch (InvocationTargetException e) {
|
||||||
|
// Should not happen.
|
||||||
|
Log.w(e, "Unable to invoke method");
|
||||||
|
} catch (IllegalAccessException e) {
|
||||||
|
// Should not happen.
|
||||||
|
Log.w(e, "Unable to invoke method");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This is a wrapper around the new startForeground method, using the older
|
||||||
|
* APIs if it is not available.
|
||||||
|
*/
|
||||||
|
void startForegroundCompat(int id, Notification notification) {
|
||||||
|
// If we have the new startForeground API, then use it.
|
||||||
|
if (mStartForeground != null) {
|
||||||
|
mStartForegroundArgs[0] = Integer.valueOf(id);
|
||||||
|
mStartForegroundArgs[1] = notification;
|
||||||
|
invokeMethod(mStartForeground, mStartForegroundArgs);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Fall back on the old API.
|
||||||
|
if (mSetForeground != null) {
|
||||||
|
mSetForegroundArgs[0] = Boolean.TRUE;
|
||||||
|
invokeMethod(mSetForeground, mSetForegroundArgs);
|
||||||
|
// continue
|
||||||
|
}
|
||||||
|
|
||||||
|
mNM.notify(id, notification);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This is a wrapper around the new stopForeground method, using the older
|
||||||
|
* APIs if it is not available.
|
||||||
|
*/
|
||||||
|
void stopForegroundCompat(int id) {
|
||||||
|
// If we have the new stopForeground API, then use it.
|
||||||
|
if (mStopForeground != null) {
|
||||||
|
mStopForegroundArgs[0] = Boolean.TRUE;
|
||||||
|
invokeMethod(mStopForeground, mStopForegroundArgs);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Fall back on the old API. Note to cancel BEFORE changing the
|
||||||
|
// foreground state, since we could be killed at that point.
|
||||||
|
mNM.cancel(id);
|
||||||
|
if (mSetForeground != null) {
|
||||||
|
mSetForegroundArgs[0] = Boolean.FALSE;
|
||||||
|
invokeMethod(mSetForeground, mSetForegroundArgs);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
public static final String START_LINPHONE_LOGS = " ==== Phone information dump ====";
|
public static final String START_LINPHONE_LOGS = " ==== Phone information dump ====";
|
||||||
private void dumpDeviceInformation() {
|
private void dumpDeviceInformation() {
|
||||||
StringBuilder sb = new StringBuilder();
|
StringBuilder sb = new StringBuilder();
|
||||||
|
@ -169,7 +259,7 @@ public final class LinphoneService extends Service implements LinphoneServiceLis
|
||||||
}
|
}
|
||||||
|
|
||||||
mNotif.setLatestEventInfo(this, notificationTitle, text, mNotifContentIntent);
|
mNotif.setLatestEventInfo(this, notificationTitle, text, mNotifContentIntent);
|
||||||
mNotificationMgr.notify(NOTIF_ID, mNotif);
|
mNM.notify(NOTIF_ID, mNotif);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -183,10 +273,11 @@ public final class LinphoneService extends Service implements LinphoneServiceLis
|
||||||
@Override
|
@Override
|
||||||
public void onDestroy() {
|
public void onDestroy() {
|
||||||
super.onDestroy();
|
super.onDestroy();
|
||||||
|
// Make sure our notification is gone.
|
||||||
|
stopForegroundCompat(NOTIF_ID);
|
||||||
|
|
||||||
LinphoneManager.getLcIfManagerNotDestroyedOrNull().setPresenceInfo(0, null, OnlineStatus.Offline);
|
LinphoneManager.getLcIfManagerNotDestroyedOrNull().setPresenceInfo(0, null, OnlineStatus.Offline);
|
||||||
LinphoneManager.destroy(this);
|
LinphoneManager.destroy(this);
|
||||||
|
|
||||||
mNotificationMgr.cancel(NOTIF_ID);
|
|
||||||
instance=null;
|
instance=null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -118,7 +118,7 @@ public final class LinphoneUtils {
|
||||||
if (bm == null) view.setImageResource(notFoundResource);
|
if (bm == null) view.setImageResource(notFoundResource);
|
||||||
view.setImageBitmap(bm);
|
view.setImageBitmap(bm);
|
||||||
} else {
|
} else {
|
||||||
if (Version.sdkAboveOrEqual(Version.API06_ECLAIR_20)) {
|
if (Version.sdkAboveOrEqual(Version.API06_ECLAIR_201)) {
|
||||||
view.setImageURI(uri);
|
view.setImageURI(uri);
|
||||||
} else {
|
} else {
|
||||||
Bitmap bitmap = android.provider.Contacts.People.loadContactPhoto(c, uri, notFoundResource, null);
|
Bitmap bitmap = android.provider.Contacts.People.loadContactPhoto(c, uri, notFoundResource, null);
|
||||||
|
|
Loading…
Reference in a new issue