diff --git a/AndroidManifest.xml b/AndroidManifest.xml
index b69c4f80a..f3f395885 100755
--- a/AndroidManifest.xml
+++ b/AndroidManifest.xml
@@ -115,6 +115,10 @@
+
+
+
+
+
+
+
+
+
Chat
diff --git a/res/xml/preferences.xml b/res/xml/preferences.xml
index 5fab85a1f..43ec3930e 100644
--- a/res/xml/preferences.xml
+++ b/res/xml/preferences.xml
@@ -225,6 +225,12 @@
android:key="@string/pref_voice_mail_key"
android:persistent="false"/>
+
+
+
diff --git a/src/android/org/linphone/ChatFragment.java b/src/android/org/linphone/ChatFragment.java
index 67534f69a..1453fa321 100644
--- a/src/android/org/linphone/ChatFragment.java
+++ b/src/android/org/linphone/ChatFragment.java
@@ -1639,7 +1639,6 @@ public class ChatFragment extends Fragment implements OnClickListener, LinphoneC
file = new File(imageUri);
contentUri = FileProvider.getUriForFile(getActivity(), "org.linphone.provider", file);
} else if (imageUri.startsWith("content://")) {
- Log.e("===>>> ChatFragment - getView() - imageUri = "+imageUri);
contentUri = Uri.parse(imageUri);
} else {
file = new File(imageUri);
diff --git a/src/android/org/linphone/DialerFragment.java b/src/android/org/linphone/DialerFragment.java
index 770aeacf5..e5f6dca71 100644
--- a/src/android/org/linphone/DialerFragment.java
+++ b/src/android/org/linphone/DialerFragment.java
@@ -17,18 +17,11 @@ You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
-import org.linphone.core.LinphoneCore;
-import org.linphone.mediastream.Log;
-import org.linphone.ui.AddressAware;
-import org.linphone.ui.AddressText;
-import org.linphone.ui.CallButton;
-import org.linphone.ui.EraseButton;
-
+import android.app.Fragment;
import android.content.Intent;
import android.content.res.Configuration;
import android.net.Uri;
import android.os.Bundle;
-import android.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
@@ -36,6 +29,13 @@ import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.LinearLayout;
+import org.linphone.core.LinphoneCore;
+import org.linphone.mediastream.Log;
+import org.linphone.ui.AddressAware;
+import org.linphone.ui.AddressText;
+import org.linphone.ui.CallButton;
+import org.linphone.ui.EraseButton;
+
/**
* @author Sylvain Berfini
*/
@@ -63,14 +63,14 @@ public class DialerFragment extends Fragment {
mCall = (CallButton) view.findViewById(R.id.call);
mCall.setAddressWidget(mAddress);
- if (LinphoneActivity.isInstanciated() && LinphoneManager.getLc().getCallsNb() > 0) {
+ if (LinphoneActivity.isInstanciated() && LinphoneManager.getLcIfManagerNotDestroyedOrNull() != null && LinphoneManager.getLcIfManagerNotDestroyedOrNull().getCallsNb() > 0) {
if (isCallTransferOngoing) {
mCall.setImageResource(R.drawable.call_transfer);
} else {
mCall.setImageResource(R.drawable.call_add);
}
} else {
- if (LinphoneManager.getLc().getVideoAutoInitiatePolicy()) {
+ if (LinphoneManager.getLcIfManagerNotDestroyedOrNull() != null && LinphoneManager.getLcIfManagerNotDestroyedOrNull().getVideoAutoInitiatePolicy()) {
mCall.setImageResource(R.drawable.call_video_start);
} else {
mCall.setImageResource(R.drawable.call_audio_start);
@@ -83,7 +83,7 @@ public class DialerFragment extends Fragment {
}
mAddContact = (ImageView) view.findViewById(R.id.add_contact);
- mAddContact.setEnabled(!(LinphoneActivity.isInstanciated() && LinphoneManager.getLc().getCallsNb() > 0));
+ mAddContact.setEnabled(!(LinphoneActivity.isInstanciated() && LinphoneManager.getLcIfManagerNotDestroyedOrNull() != null && LinphoneManager.getLc().getCallsNb() > 0));
addContactListener = new OnClickListener() {
@Override
@@ -215,7 +215,7 @@ public class DialerFragment extends Fragment {
}
public void enableDisableAddContact() {
- mAddContact.setEnabled(LinphoneManager.getLc().getCallsNb() > 0 || !mAddress.getText().toString().equals(""));
+ mAddContact.setEnabled(LinphoneManager.getLcIfManagerNotDestroyedOrNull() != null && LinphoneManager.getLc().getCallsNb() > 0 || !mAddress.getText().toString().equals(""));
}
public void displayTextInAddressBar(String numberOrSipAddress) {
diff --git a/src/android/org/linphone/LinphoneActivity.java b/src/android/org/linphone/LinphoneActivity.java
index 970f70298..ed1a4ca34 100644
--- a/src/android/org/linphone/LinphoneActivity.java
+++ b/src/android/org/linphone/LinphoneActivity.java
@@ -1475,7 +1475,6 @@ public class LinphoneActivity extends LinphoneGenericActivity implements OnClick
((SettingsFragment) fragment).closePreferenceScreen();
}
}
-
Bundle extras = intent.getExtras();
if (extras != null && extras.getBoolean("GoToChat", false)) {
LinphoneService.instance().removeMessageNotification();
@@ -1494,6 +1493,15 @@ public class LinphoneActivity extends LinphoneGenericActivity implements OnClick
LinphoneCall call = LinphoneManager.getLc().getCalls()[0];
startIncallActivity(call);
}
+ }else if (extras != null && extras.getBoolean("StartCall", false)) {
+ boolean extraBool = extras.getBoolean("StartCall", false);
+ if (CallActivity.isInstanciated()) {
+ CallActivity.instance().startIncomingCallActivity();
+ } else {
+ mAddressWaitingToBeCalled = extras.getString("NumberToCall");
+ goToDialerFragment();
+ //startActivity(new Intent(this, CallIncomingActivity.class));
+ }
} else {
DialerFragment dialerFragment = DialerFragment.instance();
if (dialerFragment != null) {
diff --git a/src/android/org/linphone/LinphoneLauncherActivity.java b/src/android/org/linphone/LinphoneLauncherActivity.java
index 9dd7dbd23..24ca01738 100644
--- a/src/android/org/linphone/LinphoneLauncherActivity.java
+++ b/src/android/org/linphone/LinphoneLauncherActivity.java
@@ -41,6 +41,8 @@ import static android.content.Intent.ACTION_MAIN;
*/
public class LinphoneLauncherActivity extends Activity {
+ private final String ACTION_CALL_LINPHONE = "org.linphone.intent.action.CallLaunched";
+
private Handler mHandler;
private ServiceWaitThread mServiceThread;
private String addressToCall;
@@ -148,6 +150,13 @@ public class LinphoneLauncherActivity extends Activity {
}
newIntent.putExtra("fileShared", stringUriFileShared);
}
+ }else if( ACTION_CALL_LINPHONE.equals(action) && (intent.getStringExtra("NumberToCall") != null)) {
+ String numberToCall = intent.getStringExtra("NumberToCall");
+ if (CallActivity.isInstanciated()) {
+ CallActivity.instance().startIncomingCallActivity();
+ } else {
+ LinphoneManager.getInstance().newOutgoingCall(numberToCall, null);
+ }
}
}
if (uriToResolve != null) {
diff --git a/src/android/org/linphone/LinphoneManager.java b/src/android/org/linphone/LinphoneManager.java
index 08241d18b..0a969e59e 100644
--- a/src/android/org/linphone/LinphoneManager.java
+++ b/src/android/org/linphone/LinphoneManager.java
@@ -154,10 +154,12 @@ public class LinphoneManager implements LinphoneCoreListener, LinphoneChatMessag
private BroadcastReceiver mKeepAliveReceiver;
private BroadcastReceiver mDozeReceiver;
private BroadcastReceiver mHookReceiver;
+ private BroadcastReceiver mCallReceiver;
private BroadcastReceiver mNetworkReceiver;
private IntentFilter mKeepAliveIntentFilter;
private IntentFilter mDozeIntentFilter;
private IntentFilter mHookIntentFilter;
+ private IntentFilter mCallIntentFilter;
private IntentFilter mNetworkIntentFilter;
private Handler mHandler = new Handler();
private WakeLock mIncallWakeLock;
@@ -707,6 +709,11 @@ public class LinphoneManager implements LinphoneCoreListener, LinphoneChatMessag
} catch (Exception e) {
Log.e(e);
}
+ try {
+ mServiceContext.unregisterReceiver(mCallReceiver);
+ } catch (Exception e) {
+ Log.e(e);
+ }
try {
mServiceContext.unregisterReceiver(mKeepAliveReceiver);
} catch (Exception e) {
@@ -714,7 +721,9 @@ public class LinphoneManager implements LinphoneCoreListener, LinphoneChatMessag
}
try {
dozeManager(false);
- } catch (Exception e) {
+ } catch (IllegalArgumentException iae) {
+ Log.e(iae);
+ }catch (Exception e) {
Log.e(e);
}
mLc = null;
@@ -731,9 +740,7 @@ public class LinphoneManager implements LinphoneCoreListener, LinphoneChatMessag
try {
copyAssetsFromPackage();
//traces alway start with traces enable to not missed first initialization
-
mLc = LinphoneCoreFactory.instance().createLinphoneCore(this, mLinphoneConfigFile, mLinphoneFactoryConfigFile, null, c);
-
TimerTask lTask = new TimerTask() {
@Override
public void run() {
@@ -750,8 +757,7 @@ public class LinphoneManager implements LinphoneCoreListener, LinphoneChatMessag
/*use schedule instead of scheduleAtFixedRate to avoid iterate from being call in burst after cpu wake up*/
mTimer = new Timer("Linphone scheduler");
mTimer.schedule(lTask, 0, 20);
- }
- catch (Exception e) {
+ } catch (Exception e) {
Log.e(e, "Cannot start linphone");
}
}
@@ -840,15 +846,21 @@ public class LinphoneManager implements LinphoneCoreListener, LinphoneChatMessag
mKeepAliveReceiver = new KeepAliveReceiver();
mServiceContext.registerReceiver(mKeepAliveReceiver, mKeepAliveIntentFilter);
- mDozeIntentFilter = new IntentFilter();
- if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
- mDozeIntentFilter.addAction(PowerManager.ACTION_DEVICE_IDLE_MODE_CHANGED);
- }
+ mCallIntentFilter = new IntentFilter("android.intent.action.ACTION_NEW_OUTGOING_CALL");
+ mCallIntentFilter.setPriority(99999999);
+ mCallReceiver = new OutgoingCallReceiver();
+ try {
+ mServiceContext.registerReceiver(mCallReceiver, mCallIntentFilter);
+ }catch(IllegalArgumentException e){e.printStackTrace();}
+ mProximityWakelock = mPowerManager.newWakeLock(PowerManager.PROXIMITY_SCREEN_OFF_WAKE_LOCK, "manager_proximity_sensor");
+
- mDozeReceiver = new DozeReceiver();
if (mPrefs.isDozeModeEnabled()) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
+ mDozeIntentFilter = new IntentFilter();
+ mDozeIntentFilter.addAction(PowerManager.ACTION_DEVICE_IDLE_MODE_CHANGED);
+ mDozeReceiver = new DozeReceiver();
dozeModeEnabled = ((PowerManager) mServiceContext.getSystemService(Context.POWER_SERVICE)).isDeviceIdleMode();
if (dozeModeEnabled)
mServiceContext.registerReceiver(mDozeReceiver, mDozeIntentFilter);
@@ -860,8 +872,6 @@ public class LinphoneManager implements LinphoneCoreListener, LinphoneChatMessag
mHookReceiver = new HookReceiver();
mServiceContext.registerReceiver(mHookReceiver, mHookIntentFilter);
- mProximityWakelock = mPowerManager.newWakeLock(PowerManager.PROXIMITY_SCREEN_OFF_WAKE_LOCK, "manager_proximity_sensor");
-
// Since Android N we need to register the network manager
if (Build.VERSION.SDK_INT > Build.VERSION_CODES.M) {
mNetworkReceiver = new NetworkManager();
@@ -1045,8 +1055,15 @@ public class LinphoneManager implements LinphoneCoreListener, LinphoneChatMessag
} catch (Exception e) {
Log.e(e);
}
+ try {
+ mServiceContext.unregisterReceiver(mCallReceiver);
+ } catch (Exception e) {
+ Log.e(e);
+ }
try {
dozeManager(false);
+ } catch (IllegalArgumentException iae) {
+ Log.e(iae);
} catch (Exception e) {
Log.e(e);
}
@@ -1062,7 +1079,14 @@ public class LinphoneManager implements LinphoneCoreListener, LinphoneChatMessag
dozeModeEnabled = true;
} else {
Log.i("[Doze Mode]: unregister");
- mServiceContext.unregisterReceiver(mDozeReceiver);
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
+ try {
+ mServiceContext.unregisterReceiver(mDozeReceiver);
+ } catch (IllegalArgumentException e) {
+ e.printStackTrace();
+ }
+
+ }
dozeModeEnabled = false;
}
}
@@ -1274,6 +1298,8 @@ public class LinphoneManager implements LinphoneCoreListener, LinphoneChatMessag
Log.e("LinphoneManager"," globalState ON");
initLiblinphone(lc);
+ }catch(IllegalArgumentException iae){
+ Log.e(iae);
} catch (LinphoneCoreException e) {
Log.e(e);
}
diff --git a/src/android/org/linphone/LinphonePreferences.java b/src/android/org/linphone/LinphonePreferences.java
index b2fcdc7f0..3c6fac444 100644
--- a/src/android/org/linphone/LinphonePreferences.java
+++ b/src/android/org/linphone/LinphonePreferences.java
@@ -19,12 +19,10 @@ along with this program; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
-import java.io.BufferedReader;
-import java.io.File;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.InputStreamReader;
-import java.util.ArrayList;
+import android.Manifest;
+import android.content.Context;
+import android.content.pm.PackageManager;
+import android.os.Build;
import org.linphone.core.LinphoneAddress;
import org.linphone.core.LinphoneAddress.TransportType;
@@ -43,10 +41,12 @@ import org.linphone.core.TunnelConfig;
import org.linphone.mediastream.Log;
import org.linphone.purchase.Purchasable;
-import android.Manifest;
-import android.content.Context;
-import android.content.pm.PackageManager;
-import android.os.Build;
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.util.ArrayList;
/**
* @author Sylvain Berfini
@@ -1001,7 +1001,15 @@ public class LinphonePreferences {
public void setVoiceMailUri(String uri) {
getConfig().setString("app", "voice_mail", uri);
}
- // End of call settings
+
+ public boolean getNativeDialerCall() {
+ return getConfig().getBool("app", "native_dialer_call", false);
+ }
+
+ public void setNativeDialerCall(boolean use) {
+ getConfig().setBool("app", "native_dialer_call", use);
+ }
+// End of call settings
// Network settings
public void setWifiOnlyEnabled(Boolean enable) {
diff --git a/src/android/org/linphone/SettingsFragment.java b/src/android/org/linphone/SettingsFragment.java
index b88542f59..0a2c224da 100644
--- a/src/android/org/linphone/SettingsFragment.java
+++ b/src/android/org/linphone/SettingsFragment.java
@@ -885,6 +885,7 @@ public class SettingsFragment extends PreferencesListFragment {
CheckBoxPreference autoAnswer = (CheckBoxPreference) findPreference(getString(R.string.pref_auto_answer_key));
CheckBoxPreference rfc2833 = (CheckBoxPreference) findPreference(getString(R.string.pref_rfc2833_dtmf_key));
CheckBoxPreference sipInfo = (CheckBoxPreference) findPreference(getString(R.string.pref_sipinfo_dtmf_key));
+ CheckBoxPreference dialerCall = (CheckBoxPreference) findPreference(getString(R.string.pref_dialer_call_key));
EditTextPreference incTimeout = (EditTextPreference) findPreference(getString(R.string.pref_incoming_call_timeout_key));
EditTextPreference autoAnswerTime = (EditTextPreference) findPreference(getString(R.string.pref_auto_answer_time_key));
@@ -904,6 +905,7 @@ public class SettingsFragment extends PreferencesListFragment {
}
setPreferenceDefaultValueAndSummary(R.string.pref_voice_mail_key, mPrefs.getVoiceMailUri());
+ dialerCall.setChecked(mPrefs.getNativeDialerCall());
}
public void enableDeviceRingtone(boolean enabled) {
@@ -997,6 +999,15 @@ public class SettingsFragment extends PreferencesListFragment {
}
});
+ findPreference(getString(R.string.pref_dialer_call_key)).setOnPreferenceChangeListener(new OnPreferenceChangeListener() {
+ @Override
+ public boolean onPreferenceChange(Preference preference, Object newValue) {
+ boolean use = (Boolean) newValue;
+ mPrefs.setNativeDialerCall(use);
+ return true;
+ }
+ });
+
findPreference(getString(R.string.pref_incoming_call_timeout_key)).setOnPreferenceChangeListener(new OnPreferenceChangeListener() {
@Override
public boolean onPreferenceChange(Preference preference, Object newValue) {