From 8924dca7d55ef8fdaf26465f4ee0f8cf88d5af0d Mon Sep 17 00:00:00 2001 From: Brieuc Viel Date: Mon, 25 Sep 2017 15:27:48 +0200 Subject: [PATCH] [DialerIntent] multiples updates to fix crashes --- AndroidManifest.xml | 10 ++++ res/values/non_localizable_strings.xml | 1 + res/values/strings.xml | 1 + res/xml/preferences.xml | 6 +++ src/android/org/linphone/ChatFragment.java | 1 - src/android/org/linphone/DialerFragment.java | 24 ++++----- .../org/linphone/LinphoneActivity.java | 10 +++- .../linphone/LinphoneLauncherActivity.java | 9 ++++ src/android/org/linphone/LinphoneManager.java | 52 ++++++++++++++----- .../org/linphone/LinphonePreferences.java | 30 +++++++---- .../org/linphone/SettingsFragment.java | 11 ++++ 11 files changed, 117 insertions(+), 38 deletions(-) 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) {