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);
+ }
}