Merge "Fix usage stats for outgoing calls." into klp-dev
diff --git a/res/values/config.xml b/res/values/config.xml
index adc54ee..5146b1f 100644
--- a/res/values/config.xml
+++ b/res/values/config.xml
@@ -120,11 +120,14 @@
     <bool name="config_operator_selection_expand" translatable="false">true</bool>
     <bool name="config_prefer_2g" translatable="false">true</bool>
 
-    <!-- Package name for the default in-call UI Service [DO NOT TRANSLATE] -->
-    <string name="incall_ui_default_package" translatable="false">com.android.dialer</string>
+    <!-- Package name for the default in-call UI and dialer [DO NOT TRANSLATE] -->
+    <string name="ui_default_package" translatable="false">com.android.dialer</string>
 
     <!-- Class name for the default in-call UI Service [DO NOT TRANSLATE] -->
-    <string name="incall_ui_default_class" translatable="false">com.android.incallui.CallHandlerService</string>
+    <string name="incall_default_class" translatable="false">com.android.incallui.CallHandlerService</string>
+
+    <!-- Class name for the default main Dialer activity [DO NOT TRANSLATE] -->
+    <string name="dialer_default_class" translatable="false">com.android.dialer.DialtactsActivity</string>
 
     <!-- CDMA activation goes through HFA [DO NOT TRANSLATE] -->
     <bool name="config_use_hfa_for_provisioning" translatable="false">false</bool>
diff --git a/src/com/android/phone/CallHandlerServiceProxy.java b/src/com/android/phone/CallHandlerServiceProxy.java
index 18b77ef..6670ae4 100644
--- a/src/com/android/phone/CallHandlerServiceProxy.java
+++ b/src/com/android/phone/CallHandlerServiceProxy.java
@@ -63,6 +63,7 @@
     private CallCommandService mCallCommandService;
     private CallModeler mCallModeler;
     private Context mContext;
+    private boolean mFullUpdateOnConnect;
 
     private ICallHandlerService mCallHandlerServiceGuarded;  // Guarded by mServiceAndQueueLock
     // Single queue to guarantee ordering
@@ -297,8 +298,7 @@
                 // always have an in call ui.
                 unbind();
 
-                // We were disconnected from the UI.  End all calls.
-                PhoneUtils.hangupAllCalls(PhoneGlobals.getInstance().getCallManager());
+                reconnectOnRemainingCalls();
             }
         }
     }
@@ -320,8 +320,8 @@
     private static Intent getInCallServiceIntent(Context context) {
         final Intent serviceIntent = new Intent(ICallHandlerService.class.getName());
         final ComponentName component = new ComponentName(context.getResources().getString(
-                R.string.incall_ui_default_package), context.getResources().getString(
-                R.string.incall_ui_default_class));
+                R.string.ui_default_package), context.getResources().getString(
+                R.string.incall_default_class));
         serviceIntent.setComponent(component);
         return serviceIntent;
     }
@@ -438,6 +438,21 @@
             makeInitialServiceCalls();
 
             processQueue();
+
+            if (mFullUpdateOnConnect) {
+                mFullUpdateOnConnect = false;
+                onUpdate(mCallModeler.getFullList());
+            }
+        }
+    }
+
+    /**
+     * Checks to see if there are any live calls left, and if so, try reconnecting the UI.
+     */
+    private void reconnectOnRemainingCalls() {
+        if (mCallModeler.hasLiveCall()) {
+            mFullUpdateOnConnect = true;
+            setupServiceConnection();
         }
     }
 
diff --git a/src/com/android/phone/CallModeler.java b/src/com/android/phone/CallModeler.java
index 51d3a37..9f4bb76 100644
--- a/src/com/android/phone/CallModeler.java
+++ b/src/com/android/phone/CallModeler.java
@@ -299,6 +299,7 @@
             }
         }
 
+        PhoneGlobals.getInstance().updateWakeState();
         return call;
     }
 
@@ -323,6 +324,9 @@
 
             mCallMap.remove(conn);
         }
+
+        mCallManager.clearDisconnected();
+        PhoneGlobals.getInstance().updateWakeState();
     }
 
     /**
@@ -338,6 +342,8 @@
                 mListeners.get(i).onUpdate(updatedCalls);
             }
         }
+
+        PhoneGlobals.getInstance().updateWakeState();
     }
 
 
@@ -361,17 +367,24 @@
                 // We only send updates for live calls which are not incoming (ringing).
                 // Disconnected and incoming calls are handled by onDisconnect and
                 // onNewRingingConnection.
-                boolean shouldUpdate =
+                final boolean shouldUpdate =
                         connection.getState() !=
                                 com.android.internal.telephony.Call.State.DISCONNECTED &&
                         connection.getState() !=
                                 com.android.internal.telephony.Call.State.IDLE &&
                         !connection.getState().isRinging();
 
+                final boolean isDisconnecting = connection.getState() ==
+                                com.android.internal.telephony.Call.State.DISCONNECTING;
+
+                // For disconnecting calls, we still need to send the update to the UI but we do
+                // not create a new call if the call did not exist.
+                final boolean shouldCreate = shouldUpdate && !isDisconnecting;
+
                 // New connections return a Call with INVALID state, which does not translate to
                 // a state in the internal.telephony.Call object.  This ensures that staleness
                 // check below fails and we always add the item to the update list if it is new.
-                final Call call = getCallFromMap(mCallMap, connection, shouldUpdate /* create */);
+                final Call call = getCallFromMap(mCallMap, connection, shouldCreate /* create */);
 
                 if (call == null || !shouldUpdate) {
                     if (DBG) Log.d(TAG, "update skipped");
diff --git a/src/com/android/phone/HfaService.java b/src/com/android/phone/HfaService.java
index 3aeed4d..d5c92b8 100644
--- a/src/com/android/phone/HfaService.java
+++ b/src/com/android/phone/HfaService.java
@@ -28,6 +28,8 @@
 public class HfaService extends Service {
     private static final String TAG = HfaService.class.getSimpleName();
 
+    private HfaLogic mHfaLogic;
+
     @Override
     public void onCreate() {
         Log.i(TAG, "service started");
@@ -38,7 +40,7 @@
         final PendingIntent otaResponseIntent = intent.getParcelableExtra(
                 OtaUtils.EXTRA_OTASP_RESULT_CODE_PENDING_INTENT);
 
-        new HfaLogic(this, new HfaLogic.HfaLogicCallback() {
+        mHfaLogic = new HfaLogic(this, new HfaLogic.HfaLogicCallback() {
             @Override
             public void onSuccess() {
                 Log.i(TAG, "onSuccess");
@@ -52,7 +54,8 @@
                 // we do the same thing...finish.
                 onComplete();
             }
-        }, otaResponseIntent).start();
+        }, otaResponseIntent);
+        mHfaLogic.start();
 
         return START_STICKY;
     }
diff --git a/src/com/android/phone/NotificationMgr.java b/src/com/android/phone/NotificationMgr.java
index 8ead0ce..3e30798 100644
--- a/src/com/android/phone/NotificationMgr.java
+++ b/src/com/android/phone/NotificationMgr.java
@@ -249,6 +249,7 @@
                 state |= StatusBarManager.DISABLE_HOME;
                 state |= StatusBarManager.DISABLE_RECENT;
                 state |= StatusBarManager.DISABLE_BACK;
+                state |= StatusBarManager.DISABLE_SEARCH;
             }
 
             if (DBG) log("updateStatusBar: state = 0x" + Integer.toHexString(state));
diff --git a/src/com/android/phone/OutgoingCallBroadcaster.java b/src/com/android/phone/OutgoingCallBroadcaster.java
index a4f7178..8939fdd 100644
--- a/src/com/android/phone/OutgoingCallBroadcaster.java
+++ b/src/com/android/phone/OutgoingCallBroadcaster.java
@@ -26,6 +26,7 @@
 import android.content.DialogInterface;
 import android.content.Intent;
 import android.content.res.Configuration;
+import android.content.res.Resources;
 import android.net.Uri;
 import android.os.Binder;
 import android.os.Bundle;
@@ -520,11 +521,12 @@
                 // use the java resolver to find the dialer class (as
                 // opposed to a Context which look up known android
                 // packages only)
-                invokeFrameworkDialer.setClassName("com.android.dialer",
-                                                   "com.android.dialer.DialtactsActivity");
+                final Resources resources = getResources();
+                invokeFrameworkDialer.setClassName(
+                        resources.getString(R.string.ui_default_package),
+                        resources.getString(R.string.dialer_default_class));
                 invokeFrameworkDialer.setAction(Intent.ACTION_DIAL);
                 invokeFrameworkDialer.setData(intent.getData());
-
                 if (DBG) Log.v(TAG, "onCreate(): calling startActivity for Dialer: "
                                + invokeFrameworkDialer);
                 startActivity(invokeFrameworkDialer);