Merge "Revert "Linked google truth to Robolectric tests and added an example.""
diff --git a/AndroidManifest.xml b/AndroidManifest.xml
index abcc626..3df376e 100644
--- a/AndroidManifest.xml
+++ b/AndroidManifest.xml
@@ -958,6 +958,7 @@
 
         <activity android:name="Settings$NightDisplaySettingsActivity"
                 android:label="@string/night_display_title"
+                android:enabled="@*android:bool/config_nightDisplayAvailable"
                 android:icon="@drawable/ic_settings_night_display"
                 android:taskAffinity="">
             <intent-filter android:priority="1">
diff --git a/res/values/strings.xml b/res/values/strings.xml
index 0860bd7..73ab3f9 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -2182,21 +2182,21 @@
     <!-- Night display screen, setting option name to configure time to automatically turn off night display. [CHAR LIMIT=30] -->
     <string name="night_display_end_time_title">End time</string>
     <!-- Display settings screen, summary format of night display when off. [CHAR LIMIT=NONE] -->
-    <string name="night_display_summary_off">Off / <xliff:g name="auto_mode_summary" example="Never turn on automatically">%1$s</xliff:g></string>
+    <string name="night_display_summary_off">Off. <xliff:g name="auto_mode_summary" example="Never turn on automatically">%1$s</xliff:g></string>
     <!-- Display settings screen, summary of night display when off and will *never* turn on automatically. [CHAR LIMIT=NONE] -->
-    <string name="night_display_summary_off_auto_mode_never">Never turn on automatically</string>
+    <string name="night_display_summary_off_auto_mode_never">Will never turn on automatically.</string>
     <!-- Display settings screen, summary format of night display when off and will turn on automatically at a user defined time. [CHAR LIMIT=NONE] -->
-    <string name="night_display_summary_off_auto_mode_custom">Turn on automatically at <xliff:g name="time" example="6 AM">%1$s</xliff:g></string>
+    <string name="night_display_summary_off_auto_mode_custom">Will turn on automatically at <xliff:g name="time" example="6 AM">%1$s</xliff:g>.</string>
     <!-- Display settings screen, summary of night display when off and will turn on automatically at sunset. [CHAR LIMIT=NONE] -->
-    <string name="night_display_summary_off_auto_mode_twilight">Turn on automatically at sunset</string>
+    <string name="night_display_summary_off_auto_mode_twilight">Will turn on automatically at sunset.</string>
     <!-- Display settings screen, summary format of night display when on. [CHAR LIMIT=NONE] -->
-    <string name="night_display_summary_on">On / <xliff:g name="auto_mode_summary" example="Never turn off automatically">%1$s</xliff:g></string>
+    <string name="night_display_summary_on">On. <xliff:g name="auto_mode_summary" example="Never turn off automatically">%1$s</xliff:g></string>
     <!-- Display settings screen, summary of night display when on and will *never* turn off automatically. [CHAR LIMIT=NONE] -->
-    <string name="night_display_summary_on_auto_mode_never">Never turn off automatically</string>
+    <string name="night_display_summary_on_auto_mode_never">Will never turn off automatically.</string>
     <!-- Display settings screen, summary format of night display when on and will turn off automatically at a user defined time. [CHAR LIMIT=NONE] -->
-    <string name="night_display_summary_on_auto_mode_custom">Turn off automatically at <xliff:g name="time" example="10 PM">%1$s</xliff:g></string>
+    <string name="night_display_summary_on_auto_mode_custom">Will turn off automatically at <xliff:g name="time" example="10 PM">%1$s</xliff:g>.</string>
     <!-- Display settings screen, summary of night display when on and will turn off automatically at sunrise. [CHAR LIMIT=NONE] -->
-    <string name="night_display_summary_on_auto_mode_twilight">Turn off automatically at sunrise</string>
+    <string name="night_display_summary_on_auto_mode_twilight">Will turn off automatically at sunrise.</string>
 
     <!-- Sound & display settings screen, setting option name to change screen timeout -->
     <string name="screen_timeout">Sleep</string>
@@ -2641,11 +2641,10 @@
 
     <!-- Body of dialog informing user about other files on a storage device [CHAR LIMIT=NONE]-->
     <string name="storage_detail_dialog_other">Other includes shared files saved by apps, files downloaded from the Internet or Bluetooth, Android files, and so on.
-\n\nTo see the entire contents of this <xliff:g id="name" example="SD card">^1</xliff:g>, tap Explore.</string>
+\n\nTo see the visible contents of this <xliff:g id="name" example="SD card">^1</xliff:g>, tap Explore.</string>
 
     <!-- Body of dialog informing user about the storage used by the Android System [CHAR LIMIT=NONE]-->
-    <string name="storage_detail_dialog_system">System includes files used internally by the Android operating system.
-\n\nThese files can\u2019t be viewed individually.</string>
+    <string name="storage_detail_dialog_system">System includes files that Android can\u2019t display individually.</string>
 
     <!-- Body of dialog informing user about other users on a storage device [CHAR LIMIT=NONE]-->
     <string name="storage_detail_dialog_user"><xliff:g id="user" example="Guest user">^1</xliff:g> may have saved photos, music, movies, apps, or other data that is taking up <xliff:g id="size" example="1.2 GB">^2</xliff:g> of storage.
diff --git a/src/com/android/settings/accessibility/ToggleAccessibilityServicePreferenceFragment.java b/src/com/android/settings/accessibility/ToggleAccessibilityServicePreferenceFragment.java
index a7254d5..3168178 100644
--- a/src/com/android/settings/accessibility/ToggleAccessibilityServicePreferenceFragment.java
+++ b/src/com/android/settings/accessibility/ToggleAccessibilityServicePreferenceFragment.java
@@ -203,10 +203,8 @@
     }
 
     private void updateSwitchBarToggleSwitch() {
-        final String settingValue = Settings.Secure.getString(getContentResolver(),
-                Settings.Secure.ENABLED_ACCESSIBILITY_SERVICES);
-        final boolean checked = settingValue != null
-                && settingValue.contains(mComponentName.flattenToString());
+        final boolean checked = AccessibilityUtils.getEnabledServicesFromSettings(getActivity())
+                .contains(mComponentName);
         mSwitchBar.setCheckedInternal(checked);
     }
 
diff --git a/src/com/android/settings/core/instrumentation/InstrumentedDialogFragment.java b/src/com/android/settings/core/instrumentation/InstrumentedDialogFragment.java
new file mode 100644
index 0000000..6f97068
--- /dev/null
+++ b/src/com/android/settings/core/instrumentation/InstrumentedDialogFragment.java
@@ -0,0 +1,27 @@
+/*
+ * Copyright (C) 2016 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.android.settings.core.instrumentation;
+
+import com.android.settings.core.lifecycle.ObservableDialogFragment;
+
+public abstract class InstrumentedDialogFragment extends ObservableDialogFragment
+        implements Instrumentable {
+
+    public InstrumentedDialogFragment() {
+        mLifecycle.addObserver(new VisibilityLoggerMixin(getMetricsCategory()));
+    }
+
+}
diff --git a/src/com/android/settings/deviceinfo/PrivateVolumeSettings.java b/src/com/android/settings/deviceinfo/PrivateVolumeSettings.java
index 1d85a09..428e472 100644
--- a/src/com/android/settings/deviceinfo/PrivateVolumeSettings.java
+++ b/src/com/android/settings/deviceinfo/PrivateVolumeSettings.java
@@ -72,8 +72,6 @@
 import java.util.List;
 import java.util.Objects;
 
-import static com.android.settings.deviceinfo.StorageSettings.TAG;
-
 /**
  * Panel showing summary and actions for a {@link VolumeInfo#TYPE_PRIVATE}
  * storage volume.
@@ -82,6 +80,9 @@
     // TODO: disable unmount when providing over MTP/PTP
     // TODO: warn when mounted read-only
 
+    private static final String TAG = "PrivateVolumeSettings";
+    private static final boolean LOGV = false;
+
     private static final String TAG_RENAME = "rename";
     private static final String TAG_OTHER_INFO = "otherInfo";
     private static final String TAG_SYSTEM_INFO = "systemInfo";
@@ -164,6 +165,9 @@
         final long sharedDataSize = mVolume.getPath().getTotalSpace();
         mTotalSize = getArguments().getLong(EXTRA_VOLUME_SIZE, 0);
         mSystemSize = mTotalSize - sharedDataSize;
+        if (LOGV) Log.v(TAG,
+                "onCreate() mTotalSize: " + mTotalSize + " sharedDataSize: " + sharedDataSize);
+
         if (mTotalSize <= 0) {
             mTotalSize = sharedDataSize;
             mSystemSize = 0;
@@ -260,6 +264,8 @@
         final long freeBytes = mVolume.getPath().getFreeSpace();
         final long usedBytes = mTotalSize - freeBytes;
 
+        if (LOGV) Log.v(TAG, "update() freeBytes: " + freeBytes + " usedBytes: " + usedBytes);
+
         final BytesResult result = Formatter.formatBytes(getResources(), usedBytes, 0);
         mSummary.setTitle(TextUtils.expandTemplate(getText(R.string.storage_size_large),
                 result.value, result.units));
@@ -554,6 +560,11 @@
     };
 
     private void updateDetails(MeasurementDetails details) {
+        StorageItemPreference otherItem = null;
+        long accountedSize = 0;
+        long totalMiscSize = 0;
+        long totalDownloadsSize = 0;
+
         for (int i = 0; i < mItemPoolIndex; ++i) {
             StorageItemPreference item = mItemPreferencePool.get(i);
             final int userId = item.userHandle;
@@ -566,20 +577,31 @@
             switch (itemTitleId) {
                 case R.string.storage_detail_system: {
                     updatePreference(item, mSystemSize);
+                    accountedSize += mSystemSize;
+                    if (LOGV) Log.v(TAG, "mSystemSize: " + mSystemSize
+                            + " accountedSize: " + accountedSize);
                 } break;
                 case R.string.storage_detail_apps: {
                     updatePreference(item, details.appsSize.get(userId));
+                    accountedSize += details.appsSize.get(userId);
+                    if (LOGV) Log.v(TAG, "appsSize: " + details.appsSize.get(userId)
+                            + " accountedSize: " + accountedSize);
                 } break;
                 case R.string.storage_detail_images: {
                     final long imagesSize = totalValues(details, userId,
-                            Environment.DIRECTORY_DCIM, Environment.DIRECTORY_MOVIES,
-                            Environment.DIRECTORY_PICTURES);
+                            Environment.DIRECTORY_DCIM, Environment.DIRECTORY_PICTURES);
                     updatePreference(item, imagesSize);
+                    accountedSize += imagesSize;
+                    if (LOGV) Log.v(TAG, "imagesSize: " + imagesSize
+                            + " accountedSize: " + accountedSize);
                 } break;
                 case R.string.storage_detail_videos: {
                     final long videosSize = totalValues(details, userId,
                             Environment.DIRECTORY_MOVIES);
                     updatePreference(item, videosSize);
+                    accountedSize += videosSize;
+                    if (LOGV) Log.v(TAG, "videosSize: " + videosSize
+                            + " accountedSize: " + accountedSize);
                 } break;
                 case R.string.storage_detail_audio: {
                     final long audioSize = totalValues(details, userId,
@@ -587,19 +609,54 @@
                             Environment.DIRECTORY_ALARMS, Environment.DIRECTORY_NOTIFICATIONS,
                             Environment.DIRECTORY_RINGTONES, Environment.DIRECTORY_PODCASTS);
                     updatePreference(item, audioSize);
+                    accountedSize += audioSize;
+                    if (LOGV) Log.v(TAG, "audioSize: " + audioSize
+                            + " accountedSize: " + accountedSize);
                 } break;
                 case R.string.storage_detail_other: {
-                    updatePreference(item, details.miscSize.get(userId));
+                    final long downloadsSize = totalValues(details, userId,
+                            Environment.DIRECTORY_DOWNLOADS);
+                    final long miscSize = details.miscSize.get(userId);
+                    totalDownloadsSize += downloadsSize;
+                    totalMiscSize += miscSize;
+                    accountedSize += miscSize + downloadsSize;
+
+                    if (LOGV)
+                        Log.v(TAG, "miscSize for " + userId + ": " + miscSize + "(total: "
+                                + totalMiscSize + ") \ndownloadsSize: " + downloadsSize + "(total: "
+                                + totalDownloadsSize + ") accountedSize: " + accountedSize);
+
+                    // Cannot display 'Other' until all known items are accounted for.
+                    otherItem = item;
                 } break;
                 case R.string.storage_detail_cached: {
                     updatePreference(item, details.cacheSize);
+                    accountedSize += details.cacheSize;
+                    if (LOGV)
+                        Log.v(TAG, "cacheSize: " + details.cacheSize + " accountedSize: "
+                                + accountedSize);
                 } break;
                 case 0: {
                     final long userSize = details.usersSize.get(userId);
                     updatePreference(item, userSize);
+                    accountedSize += userSize;
+                    if (LOGV) Log.v(TAG, "userSize: " + userSize
+                            + " accountedSize: " + accountedSize);
                 } break;
             }
         }
+        if (otherItem != null) {
+            final long usedSize = mTotalSize - details.availSize;
+            final long unaccountedSize = usedSize - accountedSize;
+            final long otherSize = totalMiscSize + totalDownloadsSize + unaccountedSize;
+            if (LOGV)
+                Log.v(TAG, "Other items: \n\tmTotalSize: " + mTotalSize + " availSize: "
+                        + details.availSize + " usedSize: " + usedSize + "\n\taccountedSize: "
+                        + accountedSize + " unaccountedSize size: " + unaccountedSize
+                        + "\n\ttotalMiscSize: " + totalMiscSize + " totalDownloadsSize: "
+                        + totalDownloadsSize + "\n\tdetails: " + details);
+            updatePreference(otherItem, otherSize);
+        }
     }
 
     private void updatePreference(StorageItemPreference pref, long size) {
diff --git a/src/com/android/settings/support/SupportDisclaimerDialogFragment.java b/src/com/android/settings/support/SupportDisclaimerDialogFragment.java
index db74f0f..dc2b983 100644
--- a/src/com/android/settings/support/SupportDisclaimerDialogFragment.java
+++ b/src/com/android/settings/support/SupportDisclaimerDialogFragment.java
@@ -35,14 +35,15 @@
 import com.android.internal.logging.MetricsLogger;
 import com.android.internal.logging.MetricsProto;
 import com.android.settings.R;
+import com.android.settings.core.instrumentation.InstrumentedDialogFragment;
 import com.android.settings.overlay.FeatureFactory;
 import com.android.settings.overlay.SupportFeatureProvider;
 
 /**
  * {@link DialogFragment} for support disclaimer.
  */
-public final class SupportDisclaimerDialogFragment extends DialogFragment implements
-        DialogInterface.OnClickListener {
+public final class SupportDisclaimerDialogFragment extends InstrumentedDialogFragment
+        implements DialogInterface.OnClickListener {
 
     public static final String TAG = "SupportDisclaimerDialog";
     private static final String EXTRA_TYPE = "extra_type";
@@ -90,7 +91,7 @@
         final Bundle bundle = getArguments();
         MetricsLogger.action(activity, MetricsProto.MetricsEvent.ACTION_SUPPORT_DISCLAIMER_OK);
         supportFeatureProvider.startSupport(getActivity(),
-                (Account) bundle.getParcelable(EXTRA_ACCOUNT), bundle.getInt(EXTRA_TYPE));
+                bundle.getParcelable(EXTRA_ACCOUNT), bundle.getInt(EXTRA_TYPE));
     }
 
     @Override
@@ -115,6 +116,11 @@
         }
     }
 
+    @Override
+    public int getMetricsCategory() {
+        return MetricsProto.MetricsEvent.DIALOG_SUPPORT_DISCLAIMER;
+    }
+
     /**
      * A {@link URLSpan} that doesn't decorate the link with underline.
      */
diff --git a/tests/robotests/src/com/android/settings/core/lifecycle/LifecycleTest.java b/tests/robotests/src/com/android/settings/core/lifecycle/LifecycleTest.java
index cd30fad..0294fc0 100644
--- a/tests/robotests/src/com/android/settings/core/lifecycle/LifecycleTest.java
+++ b/tests/robotests/src/com/android/settings/core/lifecycle/LifecycleTest.java
@@ -15,11 +15,6 @@
  */
 package com.android.settings.core.lifecycle;
 
-import android.app.Fragment;
-import android.app.FragmentManager;
-import android.app.FragmentTransaction;
-import android.os.Bundle;
-
 import com.android.settings.TestConfig;
 import com.android.settings.core.lifecycle.events.OnDestroy;
 import com.android.settings.core.lifecycle.events.OnPause;
@@ -33,6 +28,7 @@
 import org.robolectric.RobolectricTestRunner;
 import org.robolectric.annotation.Config;
 import org.robolectric.util.ActivityController;
+import org.robolectric.util.FragmentController;
 
 import static org.junit.Assert.assertTrue;
 
@@ -52,23 +48,13 @@
 
     public static class TestActivity extends ObservableActivity {
 
-        final TestDialogFragment mFragment;
         final TestObserver mActObserver;
 
         public TestActivity() {
-            mFragment = new TestDialogFragment();
             mActObserver = new TestObserver();
             getLifecycle().addObserver(mActObserver);
         }
 
-        @Override
-        public void onCreate(Bundle b) {
-            super.onCreate(b);
-            FragmentManager fragmentManager = getFragmentManager();
-            FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
-            fragmentTransaction.add(mFragment, "tag");
-            fragmentTransaction.commit();
-        }
     }
 
     public static class TestObserver implements LifecycleObserver, OnStart, OnResume,
@@ -107,24 +93,34 @@
     }
 
     @Test
-    public void runThroughLifecycles_shouldObserveEverything() {
+    public void runThroughActivityLifecycles_shouldObserveEverything() {
         ActivityController<TestActivity> ac = Robolectric.buildActivity(TestActivity.class);
         TestActivity activity = ac.get();
 
-        ac.create().start();
-        assertTrue(activity.mFragment.mFragObserver.mOnStartObserved);
+        ac.start();
         assertTrue(activity.mActObserver.mOnStartObserved);
         ac.resume();
-        assertTrue(activity.mFragment.mFragObserver.mOnResumeObserved);
         assertTrue(activity.mActObserver.mOnResumeObserved);
         ac.pause();
-        assertTrue(activity.mFragment.mFragObserver.mOnPauseObserved);
         assertTrue(activity.mActObserver.mOnPauseObserved);
         ac.stop();
-        assertTrue(activity.mFragment.mFragObserver.mOnStopObserved);
         assertTrue(activity.mActObserver.mOnStopObserved);
         ac.destroy();
-        assertTrue(activity.mFragment.mFragObserver.mOnDestroyObserved);
         assertTrue(activity.mActObserver.mOnDestroyObserved);
     }
+
+    @Test
+    public void runThroughFragmentLifecycles_shouldObserveEverything() {
+        FragmentController<TestDialogFragment> fragmentController =
+                Robolectric.buildFragment(TestDialogFragment.class);
+        TestDialogFragment fragment = fragmentController.get();
+
+        fragmentController.create().start().resume().pause().stop().destroy();
+
+        assertTrue(fragment.mFragObserver.mOnStartObserved);
+        assertTrue(fragment.mFragObserver.mOnResumeObserved);
+        assertTrue(fragment.mFragObserver.mOnPauseObserved);
+        assertTrue(fragment.mFragObserver.mOnStopObserved);
+        assertTrue(fragment.mFragObserver.mOnDestroyObserved);
+    }
 }