From 9290184ebfbe4f68da4e5bcc619fd40f0ae8f48c Mon Sep 17 00:00:00 2001 From: Bartosz Fabianowski Date: Fri, 24 Mar 2017 11:28:09 +0100 Subject: [PATCH] Hide potentially invisible DO Disclosures by default Hiding/unhiding a pref triggers an animation. DO Disclosures that may not be visible should be hidden by default so that they fade in if applicable, not fade out if not applicable. Also, the network and security logging disclosures should only be shown if logging is currently on or was on in the past and a network log was retrieved at least once. Bug: 32692748 Test: m RunSettingsRoboTests Change-Id: I8c85f2f66ba295f145e5f5e79febb1b1a9bc6ede --- res/values/strings.xml | 2 +- res/xml/enterprise_privacy_settings.xml | 20 +++++++++++++++---- .../DevicePolicyManagerWrapper.java | 14 +++++++++++++ .../DevicePolicyManagerWrapperImpl.java | 13 ++++++++++++ .../EnterprisePrivacyFeatureProvider.java | 10 ++++++++++ .../EnterprisePrivacyFeatureProviderImpl.java | 10 ++++++++++ .../NetworkLogsPreferenceController.java | 6 ++++++ .../SecurityLogsPreferenceController.java | 6 ++++++ ...minActionPreferenceControllerBaseTest.java | 8 ++++++++ .../BugReportsPreferenceControllerTest.java | 7 +++++++ ...erprisePrivacyFeatureProviderImplTest.java | 18 +++++++++++++++++ .../NetworkLogsPreferenceControllerTest.java | 18 +++++++++++++++++ .../SecurityLogsPreferenceControllerTest.java | 18 +++++++++++++++++ 13 files changed, 145 insertions(+), 5 deletions(-) diff --git a/res/values/strings.xml b/res/values/strings.xml index 11aa84cbd9f..12fb356ac04 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -8272,7 +8272,7 @@ Time and data spent in each app on your device - Network traffic logs on your device + Most recent network traffic log Most recent bug report diff --git a/res/xml/enterprise_privacy_settings.xml b/res/xml/enterprise_privacy_settings.xml index e6246c2c43b..a8deb911b3e 100644 --- a/res/xml/enterprise_privacy_settings.xml +++ b/res/xml/enterprise_privacy_settings.xml @@ -27,7 +27,6 @@ @@ -36,12 +35,12 @@ android:title="@string/enterprise_privacy_installed_packages" settings:multiLine="true"/> @@ -57,58 +57,70 @@ diff --git a/src/com/android/settings/enterprise/DevicePolicyManagerWrapper.java b/src/com/android/settings/enterprise/DevicePolicyManagerWrapper.java index ed9dd947079..e988fdadf19 100644 --- a/src/com/android/settings/enterprise/DevicePolicyManagerWrapper.java +++ b/src/com/android/settings/enterprise/DevicePolicyManagerWrapper.java @@ -80,6 +80,20 @@ public interface DevicePolicyManagerWrapper { int getPermissionGrantState(@Nullable ComponentName admin, String packageName, String permission); + /** + * Calls {@code DevicePolicyManager.isSecurityLoggingEnabled()}. + * + * @see android.app.admin.DevicePolicyManager#isSecurityLoggingEnabled + */ + boolean isSecurityLoggingEnabled(@Nullable ComponentName admin); + + /** + * Calls {@code DevicePolicyManager.isNetworkLoggingEnabled()}. + * + * @see android.app.admin.DevicePolicyManager#isNetworkLoggingEnabled + */ + boolean isNetworkLoggingEnabled(@Nullable ComponentName admin); + /** * Calls {@code DevicePolicyManager.getLastSecurityLogRetrievalTime()}. * diff --git a/src/com/android/settings/enterprise/DevicePolicyManagerWrapperImpl.java b/src/com/android/settings/enterprise/DevicePolicyManagerWrapperImpl.java index 647b4a75b5e..2d379d95ad7 100644 --- a/src/com/android/settings/enterprise/DevicePolicyManagerWrapperImpl.java +++ b/src/com/android/settings/enterprise/DevicePolicyManagerWrapperImpl.java @@ -19,6 +19,7 @@ package com.android.settings.enterprise; import android.annotation.NonNull; import android.app.admin.DevicePolicyManager; import android.content.ComponentName; +import android.os.SystemProperties; import android.os.UserHandle; import android.support.annotation.Nullable; @@ -67,6 +68,18 @@ public class DevicePolicyManagerWrapperImpl implements DevicePolicyManagerWrappe return mDpm.getPermissionGrantState(admin, packageName, permission); } + @Override + public boolean isSecurityLoggingEnabled(@Nullable ComponentName admin) { + // TODO(b/36584321): Switch to DevicePolicyManager#isSecurityLoggingEnabled once that is + // callable by the system. + return SystemProperties.getBoolean("persist.logd.security", false); + } + + @Override + public boolean isNetworkLoggingEnabled(@Nullable ComponentName admin) { + return mDpm.isNetworkLoggingEnabled(admin); + } + @Override public long getLastSecurityLogRetrievalTime() { return mDpm.getLastSecurityLogRetrievalTime(); diff --git a/src/com/android/settings/enterprise/EnterprisePrivacyFeatureProvider.java b/src/com/android/settings/enterprise/EnterprisePrivacyFeatureProvider.java index 447886595ac..4ad0f2e796c 100644 --- a/src/com/android/settings/enterprise/EnterprisePrivacyFeatureProvider.java +++ b/src/com/android/settings/enterprise/EnterprisePrivacyFeatureProvider.java @@ -63,6 +63,16 @@ public interface EnterprisePrivacyFeatureProvider { */ Date getLastNetworkLogRetrievalTime(); + /** + * Returns whether security logging is currently enabled. + */ + boolean isSecurityLoggingEnabled(); + + /** + * Returns whether network logging is currently enabled. + */ + boolean isNetworkLoggingEnabled(); + /** * Returns whether the Device Owner in the primary user set an always-on VPN. */ diff --git a/src/com/android/settings/enterprise/EnterprisePrivacyFeatureProviderImpl.java b/src/com/android/settings/enterprise/EnterprisePrivacyFeatureProviderImpl.java index 69eaa2e40ab..6d038dc0407 100644 --- a/src/com/android/settings/enterprise/EnterprisePrivacyFeatureProviderImpl.java +++ b/src/com/android/settings/enterprise/EnterprisePrivacyFeatureProviderImpl.java @@ -131,6 +131,16 @@ public class EnterprisePrivacyFeatureProviderImpl implements EnterprisePrivacyFe return timestamp < 0 ? null : new Date(timestamp); } + @Override + public boolean isSecurityLoggingEnabled() { + return mDpm.isSecurityLoggingEnabled(null); + } + + @Override + public boolean isNetworkLoggingEnabled() { + return mDpm.isNetworkLoggingEnabled(null); + } + @Override public boolean isAlwaysOnVpnSetInPrimaryUser() { return VpnUtils.isAlwaysOnVpnSet(mCm, MY_USER_ID); diff --git a/src/com/android/settings/enterprise/NetworkLogsPreferenceController.java b/src/com/android/settings/enterprise/NetworkLogsPreferenceController.java index d7da5256675..fd87bbe5fb8 100644 --- a/src/com/android/settings/enterprise/NetworkLogsPreferenceController.java +++ b/src/com/android/settings/enterprise/NetworkLogsPreferenceController.java @@ -30,6 +30,12 @@ public class NetworkLogsPreferenceController extends AdminActionPreferenceContro return mFeatureProvider.getLastNetworkLogRetrievalTime(); } + @Override + public boolean isAvailable() { + return mFeatureProvider.isNetworkLoggingEnabled() || + mFeatureProvider.getLastNetworkLogRetrievalTime() != null; + } + @Override public String getPreferenceKey() { return KEY_NETWORK_LOGS; diff --git a/src/com/android/settings/enterprise/SecurityLogsPreferenceController.java b/src/com/android/settings/enterprise/SecurityLogsPreferenceController.java index 60baa6331c2..482b014fa24 100644 --- a/src/com/android/settings/enterprise/SecurityLogsPreferenceController.java +++ b/src/com/android/settings/enterprise/SecurityLogsPreferenceController.java @@ -30,6 +30,12 @@ public class SecurityLogsPreferenceController extends AdminActionPreferenceContr return mFeatureProvider.getLastSecurityLogRetrievalTime(); } + @Override + public boolean isAvailable() { + return mFeatureProvider.isSecurityLoggingEnabled() || + mFeatureProvider.getLastSecurityLogRetrievalTime() != null; + } + @Override public String getPreferenceKey() { return KEY_SECURITY_LOGS; diff --git a/tests/robotests/src/com/android/settings/enterprise/AdminActionPreferenceControllerBaseTest.java b/tests/robotests/src/com/android/settings/enterprise/AdminActionPreferenceControllerBaseTest.java index 64422426cf7..b5d6b7ac69b 100644 --- a/tests/robotests/src/com/android/settings/enterprise/AdminActionPreferenceControllerBaseTest.java +++ b/tests/robotests/src/com/android/settings/enterprise/AdminActionPreferenceControllerBaseTest.java @@ -21,11 +21,14 @@ import android.content.Context; import com.android.settings.SettingsRobolectricTestRunner; import com.android.settings.TestConfig; +import org.junit.Test; import org.junit.runner.RunWith; import org.robolectric.annotation.Config; import java.util.Date; +import static com.google.common.truth.Truth.assertThat; + /** * Tests for {@link AdminActionPreferenceControllerBase}. */ @@ -47,6 +50,11 @@ public final class AdminActionPreferenceControllerBaseTest extends mDate = date; } + @Test + public void testIsAvailable() { + assertThat(mController.isAvailable()).isTrue(); + } + @Override public String getPreferenceKey() { return null; diff --git a/tests/robotests/src/com/android/settings/enterprise/BugReportsPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/enterprise/BugReportsPreferenceControllerTest.java index ae1e264992c..b9c838bdbe5 100644 --- a/tests/robotests/src/com/android/settings/enterprise/BugReportsPreferenceControllerTest.java +++ b/tests/robotests/src/com/android/settings/enterprise/BugReportsPreferenceControllerTest.java @@ -20,11 +20,13 @@ import com.android.settings.SettingsRobolectricTestRunner; import com.android.settings.TestConfig; import com.android.settings.testutils.FakeFeatureFactory; +import org.junit.Test; import org.junit.runner.RunWith; import org.robolectric.annotation.Config; import java.util.Date; +import static com.google.common.truth.Truth.assertThat; import static org.mockito.Mockito.when; /** @@ -47,6 +49,11 @@ public final class BugReportsPreferenceControllerTest extends .thenReturn(date); } + @Test + public void testIsAvailable() { + assertThat(mController.isAvailable()).isTrue(); + } + @Override public String getPreferenceKey() { return "bug_reports"; diff --git a/tests/robotests/src/com/android/settings/enterprise/EnterprisePrivacyFeatureProviderImplTest.java b/tests/robotests/src/com/android/settings/enterprise/EnterprisePrivacyFeatureProviderImplTest.java index 2afcab9b448..8d78ef7ef2a 100644 --- a/tests/robotests/src/com/android/settings/enterprise/EnterprisePrivacyFeatureProviderImplTest.java +++ b/tests/robotests/src/com/android/settings/enterprise/EnterprisePrivacyFeatureProviderImplTest.java @@ -176,6 +176,24 @@ public final class EnterprisePrivacyFeatureProviderImplTest { assertThat(mProvider.getLastNetworkLogRetrievalTime()).isEqualTo(TIMESTAMP); } + @Test + public void testIsSecurityLoggingEnabled() { + when(mDevicePolicyManager.isSecurityLoggingEnabled(null)).thenReturn(false); + assertThat(mProvider.isSecurityLoggingEnabled()).isFalse(); + + when(mDevicePolicyManager.isSecurityLoggingEnabled(null)).thenReturn(true); + assertThat(mProvider.isSecurityLoggingEnabled()).isTrue(); + } + + @Test + public void testIsNetworkLoggingEnabled() { + when(mDevicePolicyManager.isNetworkLoggingEnabled(null)).thenReturn(false); + assertThat(mProvider.isNetworkLoggingEnabled()).isFalse(); + + when(mDevicePolicyManager.isNetworkLoggingEnabled(null)).thenReturn(true); + assertThat(mProvider.isNetworkLoggingEnabled()).isTrue(); + } + @Test public void testIsAlwaysOnVpnSetInPrimaryUser() { when(mConnectivityManger.getAlwaysOnVpnPackageForUser(MY_USER_ID)).thenReturn(null); diff --git a/tests/robotests/src/com/android/settings/enterprise/NetworkLogsPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/enterprise/NetworkLogsPreferenceControllerTest.java index fe9fcf6efdb..33360cc04a7 100644 --- a/tests/robotests/src/com/android/settings/enterprise/NetworkLogsPreferenceControllerTest.java +++ b/tests/robotests/src/com/android/settings/enterprise/NetworkLogsPreferenceControllerTest.java @@ -20,11 +20,13 @@ import com.android.settings.SettingsRobolectricTestRunner; import com.android.settings.TestConfig; import com.android.settings.testutils.FakeFeatureFactory; +import org.junit.Test; import org.junit.runner.RunWith; import org.robolectric.annotation.Config; import java.util.Date; +import static com.google.common.truth.Truth.assertThat; import static org.mockito.Mockito.when; /** @@ -47,6 +49,22 @@ public final class NetworkLogsPreferenceControllerTest extends .thenReturn(date); } + @Test + public void testIsAvailable() { + setDate(null); + when(mFeatureFactory.enterprisePrivacyFeatureProvider.isNetworkLoggingEnabled()) + .thenReturn(false); + assertThat(mController.isAvailable()).isFalse(); + + setDate(new Date()); + assertThat(mController.isAvailable()).isTrue(); + + setDate(null); + when(mFeatureFactory.enterprisePrivacyFeatureProvider.isNetworkLoggingEnabled()) + .thenReturn(true); + assertThat(mController.isAvailable()).isTrue(); + } + @Override public String getPreferenceKey() { return "network_logs"; diff --git a/tests/robotests/src/com/android/settings/enterprise/SecurityLogsPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/enterprise/SecurityLogsPreferenceControllerTest.java index b260d61d433..1205b0bb4c3 100644 --- a/tests/robotests/src/com/android/settings/enterprise/SecurityLogsPreferenceControllerTest.java +++ b/tests/robotests/src/com/android/settings/enterprise/SecurityLogsPreferenceControllerTest.java @@ -20,11 +20,13 @@ import com.android.settings.SettingsRobolectricTestRunner; import com.android.settings.TestConfig; import com.android.settings.testutils.FakeFeatureFactory; +import org.junit.Test; import org.junit.runner.RunWith; import org.robolectric.annotation.Config; import java.util.Date; +import static com.google.common.truth.Truth.assertThat; import static org.mockito.Mockito.when; /** @@ -47,6 +49,22 @@ public final class SecurityLogsPreferenceControllerTest extends .thenReturn(date); } + @Test + public void testIsAvailable() { + setDate(null); + when(mFeatureFactory.enterprisePrivacyFeatureProvider.isSecurityLoggingEnabled()) + .thenReturn(false); + assertThat(mController.isAvailable()).isFalse(); + + setDate(new Date()); + assertThat(mController.isAvailable()).isTrue(); + + setDate(null); + when(mFeatureFactory.enterprisePrivacyFeatureProvider.isSecurityLoggingEnabled()) + .thenReturn(true); + assertThat(mController.isAvailable()).isTrue(); + } + @Override public String getPreferenceKey() { return "security_logs";