Fix the phone hung issue if the focus is in SipEditor.

1. We will defer the close until the user change any field in
SipEditor.
2. Disables all fields and 'remove account' when we launch the sip
editor and phone is not idle.
3. Disables the "Receive incoming call"  and "Add Account" buttons in
SIP Setting screen if the phone is not idle.

bug : http://b/3116480

Change-Id: I2f1d31c46b402f062234e9d6e86a00d9ce61c045
diff --git a/src/com/android/phone/sip/SipEditor.java b/src/com/android/phone/sip/SipEditor.java
index e40e3f0..034d09f 100644
--- a/src/com/android/phone/sip/SipEditor.java
+++ b/src/com/android/phone/sip/SipEditor.java
@@ -16,6 +16,8 @@
 
 package com.android.phone.sip;
 
+import com.android.internal.telephony.CallManager;
+import com.android.internal.telephony.Phone;
 import com.android.phone.R;
 import com.android.phone.SipUtil;
 
@@ -23,6 +25,7 @@
 import android.content.DialogInterface;
 import android.content.Intent;
 import android.content.SharedPreferences;
+import android.net.sip.SipException;
 import android.net.sip.SipManager;
 import android.net.sip.SipProfile;
 import android.os.Bundle;
@@ -33,12 +36,14 @@
 import android.preference.Preference;
 import android.preference.PreferenceActivity;
 import android.preference.PreferenceGroup;
+import android.preference.PreferenceScreen;
 import android.text.TextUtils;
 import android.util.Log;
 import android.view.KeyEvent;
 import android.view.Menu;
 import android.view.MenuItem;
 import android.view.View;
+import android.widget.AdapterView;
 import android.widget.Button;
 import android.widget.Toast;
 
@@ -66,11 +71,14 @@
     private AdvancedSettings mAdvancedSettings;
     private SipSharedPreferences mSharedPreferences;
     private boolean mDisplayNameSet;
-    private boolean mHomeButtonClicked = false;
+    private boolean mHomeButtonClicked;
+    private boolean mUpdateRequired;
 
     private SipManager mSipManager;
     private SipProfileDb mProfileDb;
     private SipProfile mOldProfile;
+    private CallManager mCallManager;
+    private Button mRemoveButton;
 
     enum PreferenceKey {
         Username(R.string.username, 0, R.string.default_preference_summary),
@@ -134,6 +142,20 @@
     }
 
     @Override
+    public void onResume() {
+        super.onResume();
+        mHomeButtonClicked = false;
+        if (mCallManager.getState() != Phone.State.IDLE) {
+            mAdvancedSettings.show();
+            getPreferenceScreen().setEnabled(false);
+            if (mRemoveButton != null) mRemoveButton.setEnabled(false);
+        } else {
+            getPreferenceScreen().setEnabled(true);
+            if (mRemoveButton != null) mRemoveButton.setEnabled(true);
+        }
+    }
+
+    @Override
     public void onCreate(Bundle savedInstanceState) {
         Log.v(TAG, "start profile editor");
         super.onCreate(savedInstanceState);
@@ -141,6 +163,7 @@
         mSipManager = SipManager.newInstance(this);
         mSharedPreferences = new SipSharedPreferences(this);
         mProfileDb = new SipProfileDb(this);
+        mCallManager = CallManager.getInstance();
 
         setContentView(R.layout.sip_settings_ui);
         addPreferencesFromResource(R.xml.sip_edit);
@@ -159,10 +182,10 @@
                     .setVisibility(View.GONE);
             screen.setTitle(R.string.sip_edit_new_title);
         } else {
-            Button removeButton =
+            mRemoveButton =
                     (Button)findViewById(R.id.add_remove_account_button);
-            removeButton.setText(getString(R.string.remove_sip_account));
-            removeButton.setOnClickListener(
+            mRemoveButton.setText(getString(R.string.remove_sip_account));
+            mRemoveButton.setOnClickListener(
                     new android.view.View.OnClickListener() {
                         public void onClick(View v) {
                             setRemovedProfileAndFinish();
@@ -322,14 +345,13 @@
             }
         }
 
-        if (allEmpty) {
+        if (allEmpty || !mUpdateRequired) {
             finish();
             return;
         } else if (firstEmptyFieldTitle != null) {
             showAlert(getString(R.string.empty_alert, firstEmptyFieldTitle));
             return;
         }
-
         try {
             SipProfile profile = createSipProfile();
             Intent intent = new Intent(this, SipSettings.class);
@@ -398,6 +420,12 @@
     }
 
     public boolean onPreferenceChange(Preference pref, Object newValue) {
+        if (!mUpdateRequired) {
+            mUpdateRequired = true;
+            if (mOldProfile != null) {
+                unregisterProfile(mOldProfile.getUriString());
+            }
+        }
         if (pref instanceof CheckBoxPreference) return true;
         String value = (newValue == null) ? "" : newValue.toString();
         if (TextUtils.isEmpty(value)) {
@@ -576,7 +604,7 @@
             }
         }
 
-        private void show() {
+        void show() {
             mShowing = true;
             mAdvancedSettingsTrigger.setSummary(R.string.advanced_settings_hide);
             PreferenceGroup screen = (PreferenceGroup) getPreferenceScreen();
diff --git a/src/com/android/phone/sip/SipSettings.java b/src/com/android/phone/sip/SipSettings.java
index e59ccf5..79a61ca 100644
--- a/src/com/android/phone/sip/SipSettings.java
+++ b/src/com/android/phone/sip/SipSettings.java
@@ -16,6 +16,8 @@
 
 package com.android.phone.sip;
 
+import com.android.internal.telephony.CallManager;
+import com.android.internal.telephony.Phone;
 import com.android.phone.R;
 import com.android.phone.SipUtil;
 
@@ -71,10 +73,12 @@
 
     private PackageManager mPackageManager;
     private SipManager mSipManager;
+    private CallManager mCallManager;
     private SipProfileDb mProfileDb;
 
     private SipProfile mProfile; // profile that's being edited
 
+    private Button mButtonAddSipAccount;
     private CheckBoxPreference mButtonSipReceiveCalls;
     private PreferenceCategory mSipListContainer;
     private Map<String, SipPreference> mSipPreferenceMap;
@@ -150,6 +154,7 @@
         mSipListContainer = (PreferenceCategory) findPreference(PREF_SIP_LIST);
         registerForAddSipListener();
         registerForReceiveCallsCheckBox();
+        mCallManager = CallManager.getInstance();
 
         updateProfilesStatus();
     }
@@ -157,6 +162,14 @@
     @Override
     public void onResume() {
         super.onResume();
+
+        if (mCallManager.getState() != Phone.State.IDLE) {
+            mButtonAddSipAccount.setEnabled(false);
+            mButtonSipReceiveCalls.setEnabled(false);
+        } else {
+            mButtonAddSipAccount.setEnabled(true);
+            mButtonSipReceiveCalls.setEnabled(true);
+        }
     }
 
     @Override
@@ -190,8 +203,10 @@
     }
 
     private void registerForAddSipListener() {
-        ((Button) findViewById(R.id.add_remove_account_button))
-                .setOnClickListener(new android.view.View.OnClickListener() {
+        mButtonAddSipAccount =
+                (Button) findViewById(R.id.add_remove_account_button);
+        mButtonAddSipAccount.setOnClickListener(
+                new android.view.View.OnClickListener() {
                     public void onClick(View v) {
                         startSipEditor(null);
                     }