Make running services initial update async.

Also fix the value show for an app's awake time.

Change-Id: I801681d3a1d47a6bb1f3fb8cc5b0ef009201146f
diff --git a/res/layout/manage_applications.xml b/res/layout/manage_applications.xml
index c398f5e..758e476 100755
--- a/res/layout/manage_applications.xml
+++ b/res/layout/manage_applications.xml
@@ -38,4 +38,23 @@
             android:layout_width="match_parent"
             android:layout_height="match_parent" />
 
+    <LinearLayout android:id="@+id/loading_container"
+            android:orientation="vertical"
+            android:layout_width="match_parent"
+            android:layout_height="match_parent"
+            android:visibility="gone"
+            android:gravity="center">
+
+        <ProgressBar style="?android:attr/progressBarStyleLarge"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content" />
+        <TextView android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:textAppearance="?android:attr/textAppearanceSmall"
+                android:text="@string/settings_safetylegal_activity_loading"
+                android:paddingTop="4dip"
+                android:singleLine="true" />
+
+    </LinearLayout>
+
 </FrameLayout>
\ No newline at end of file
diff --git a/src/com/android/settings/applications/ManageApplications.java b/src/com/android/settings/applications/ManageApplications.java
index fd689c5..772e48d 100644
--- a/src/com/android/settings/applications/ManageApplications.java
+++ b/src/com/android/settings/applications/ManageApplications.java
@@ -33,6 +33,7 @@
 import android.view.View;
 import android.view.ViewGroup;
 import android.view.Window;
+import android.view.animation.AnimationUtils;
 import android.widget.AbsListView;
 import android.widget.AdapterView;
 import android.widget.BaseAdapter;
@@ -92,6 +93,8 @@
     
     private String mCurrentPkgName;
     
+    private View mLoadingContainer;
+
     private View mListContainer;
 
     // ListView used to display list
@@ -107,6 +110,12 @@
     private boolean mActivityResumed;
     private Object mNonConfigInstance;
     
+    final Runnable mRunningProcessesAvail = new Runnable() {
+        public void run() {
+            handleRunningProcessesAvail();
+        }
+    };
+
     // View Holder used when displaying views
     static class AppViewHolder {
         ApplicationsState.AppEntry entry;
@@ -405,6 +414,7 @@
         // initialize the inflater
         mInflater = (LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE);
         mRootView = mInflater.inflate(R.layout.manage_applications, null);
+        mLoadingContainer = mRootView.findViewById(R.id.loading_container);
         mListContainer = mRootView.findViewById(R.id.list_container);
         // Create adapter and list view here
         ListView lv = (ListView) mListContainer.findViewById(android.R.id.list);
@@ -561,19 +571,35 @@
                 mRunningProcessesView.doCreate(null, mNonConfigInstance);
                 mCreatedRunning = true;
             }
+            boolean haveData = true;
             if (mActivityResumed && !mResumedRunning) {
-                mRunningProcessesView.doResume();
+                haveData = mRunningProcessesView.doResume(mRunningProcessesAvail);
                 mResumedRunning = true;
             }
             mApplicationsAdapter.pause();
             if (mCurView != which) {
-                mRunningProcessesView.setVisibility(View.VISIBLE);
+                if (haveData) {
+                    mRunningProcessesView.setVisibility(View.VISIBLE);
+                } else {
+                    mLoadingContainer.setVisibility(View.VISIBLE);
+                }
                 mListContainer.setVisibility(View.GONE);
             }
         }
         mCurView = which;
     }
 
+    void handleRunningProcessesAvail() {
+        if (mCurView == VIEW_RUNNING) {
+            mLoadingContainer.startAnimation(AnimationUtils.loadAnimation(
+                    this, android.R.anim.fade_out));
+            mRunningProcessesView.startAnimation(AnimationUtils.loadAnimation(
+                    this, android.R.anim.fade_in));
+            mRunningProcessesView.setVisibility(View.VISIBLE);
+            mLoadingContainer.setVisibility(View.GONE);
+        }
+    }
+
     public void showCurrentTab() {
         String tabId = getTabHost().getCurrentTabTag();
         int newOption;
diff --git a/src/com/android/settings/applications/RunningProcessesView.java b/src/com/android/settings/applications/RunningProcessesView.java
index f2d8e9e..1de67f7 100644
--- a/src/com/android/settings/applications/RunningProcessesView.java
+++ b/src/com/android/settings/applications/RunningProcessesView.java
@@ -64,6 +64,8 @@
     
     RunningState mState;
     
+    Runnable mDataAvail;
+
     StringBuilder mBuilder = new StringBuilder(128);
     
     RunningState.BaseItem mCurSelected;
@@ -390,6 +392,11 @@
             adapter.notifyDataSetChanged();
         }
         
+        if (mDataAvail != null) {
+            mDataAvail.run();
+            mDataAvail = null;
+        }
+
         // This is the amount of available memory until we start killing
         // background services.
         long availMem = readAvailMem() - SECONDARY_SERVER_MEM;
@@ -475,15 +482,19 @@
     
     public void doPause() {
         mState.pause();
+        mDataAvail = null;
     }
 
-    public void doResume() {
+    public boolean doResume(Runnable dataAvail) {
         mState.resume(this);
         if (mState.hasData()) {
             // If the state already has its data, then let's populate our
             // list right now to avoid flicker.
             refreshUi(true);
+            return true;
         }
+        mDataAvail = dataAvail;
+        return false;
     }
 
     public Object doRetainNonConfigurationInstance() {
diff --git a/src/com/android/settings/fuelgauge/PowerUsageSummary.java b/src/com/android/settings/fuelgauge/PowerUsageSummary.java
index 3ff7080..5d4c1b9 100644
--- a/src/com/android/settings/fuelgauge/PowerUsageSummary.java
+++ b/src/com/android/settings/fuelgauge/PowerUsageSummary.java
@@ -392,16 +392,12 @@
             for (Map.Entry<String, ? extends BatteryStats.Uid.Wakelock> wakelockEntry
                     : wakelockStats.entrySet()) {
                 Uid.Wakelock wakelock = wakelockEntry.getValue();
-                BatteryStats.Timer timer = wakelock.getWakeTime(BatteryStats.WAKE_TYPE_FULL);
+                // Only care about partial wake locks since full wake locks
+                // are canceled when the user turns the screen off.
+                BatteryStats.Timer timer = wakelock.getWakeTime(BatteryStats.WAKE_TYPE_PARTIAL);
                 if (timer != null) {
                     wakelockTime += timer.getTotalTimeLocked(uSecTime, which);
                 }
-                timer = wakelock.getWakeTime(BatteryStats.WAKE_TYPE_PARTIAL);
-                if (timer != null) {
-                    wakelockTime += timer.getTotalTimeLocked(uSecTime, which);
-                }
-                // Note: not considering window, since that is just the system
-                // keeping the screen on while the app is running.
             }
             wakelockTime /= 1000; // convert to millis