From 470caeaa807a535e11917b09269f4635ba39f45e Mon Sep 17 00:00:00 2001 From: Fan Zhang Date: Wed, 10 May 2017 10:06:02 -0700 Subject: [PATCH] Hide app info link for "All work apps" data usage detail We should hide the link because "All work apps" is a meta app, it doesn't point to any specific app, so app info link does not make sense. Change-Id: I768786f2df5d05bbde0723e5585abcdbe875c652 Fix: 36542896 Test: make RunSettingsRoboTests --- .../android/settings/datausage/AppDataUsage.java | 29 ++++---- .../settings/datausage/AppDataUsageTest.java | 84 ++++++++++++++++++++++ 2 files changed, 99 insertions(+), 14 deletions(-) create mode 100644 tests/robotests/src/com/android/settings/datausage/AppDataUsageTest.java diff --git a/src/com/android/settings/datausage/AppDataUsage.java b/src/com/android/settings/datausage/AppDataUsage.java index 96740e27a5..5adc26a4bd 100644 --- a/src/com/android/settings/datausage/AppDataUsage.java +++ b/src/com/android/settings/datausage/AppDataUsage.java @@ -14,8 +14,6 @@ package com.android.settings.datausage; -import static android.net.NetworkPolicyManager.POLICY_REJECT_METERED_BACKGROUND; - import android.app.Activity; import android.app.LoaderManager; import android.content.Context; @@ -23,7 +21,6 @@ import android.content.Intent; import android.content.Loader; import android.content.pm.ApplicationInfo; import android.content.pm.PackageManager; -import android.content.pm.UserInfo; import android.graphics.drawable.Drawable; import android.net.INetworkStatsSession; import android.net.NetworkPolicy; @@ -34,7 +31,6 @@ import android.os.AsyncTask; import android.os.Bundle; import android.os.RemoteException; import android.os.UserHandle; -import android.os.UserManager; import android.support.v14.preference.SwitchPreference; import android.support.v7.preference.Preference; import android.support.v7.preference.PreferenceCategory; @@ -50,7 +46,6 @@ import com.android.settings.applications.AppHeaderController; import com.android.settings.applications.AppInfoBase; import com.android.settings.overlay.FeatureFactory; import com.android.settingslib.AppItem; -import com.android.settingslib.Utils; import com.android.settingslib.net.ChartData; import com.android.settingslib.net.ChartDataLoader; import com.android.settingslib.net.UidDetail; @@ -61,6 +56,8 @@ import java.util.concurrent.LinkedBlockingQueue; import java.util.concurrent.ThreadPoolExecutor; import java.util.concurrent.TimeUnit; +import static android.net.NetworkPolicyManager.POLICY_REJECT_METERED_BACKGROUND; + public class AppDataUsage extends DataUsageBase implements Preference.OnPreferenceChangeListener, DataSaverBackend.Listener { @@ -344,17 +341,21 @@ public class AppDataUsage extends DataUsageBase implements Preference.OnPreferen } catch (PackageManager.NameNotFoundException e) { } + final boolean showInfoButton = mAppItem.key > 0; + final Activity activity = getActivity(); final Preference pref = FeatureFactory.getFactory(activity) - .getApplicationFeatureProvider(activity) - .newAppHeaderController(this, null /* appHeader */) - .setIcon(mIcon) - .setLabel(mLabel) - .setPackageName(pkg) - .setUid(uid) - .setButtonActions(AppHeaderController.ActionType.ACTION_APP_INFO, - AppHeaderController.ActionType.ACTION_NONE) - .done(activity, getPrefContext()); + .getApplicationFeatureProvider(activity) + .newAppHeaderController(this, null /* appHeader */) + .setButtonActions(showInfoButton + ? AppHeaderController.ActionType.ACTION_APP_INFO + : AppHeaderController.ActionType.ACTION_NONE, + AppHeaderController.ActionType.ACTION_NONE) + .setIcon(mIcon) + .setLabel(mLabel) + .setPackageName(pkg) + .setUid(uid) + .done(activity, getPrefContext()); getPreferenceScreen().addPreference(pref); } diff --git a/tests/robotests/src/com/android/settings/datausage/AppDataUsageTest.java b/tests/robotests/src/com/android/settings/datausage/AppDataUsageTest.java new file mode 100644 index 0000000000..2e49ed2a8b --- /dev/null +++ b/tests/robotests/src/com/android/settings/datausage/AppDataUsageTest.java @@ -0,0 +1,84 @@ +/* + * Copyright (C) 2017 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.datausage; + + +import android.content.Context; +import android.os.Bundle; +import android.support.v7.preference.PreferenceManager; +import android.support.v7.preference.PreferenceScreen; +import android.view.View; + +import com.android.settings.SettingsRobolectricTestRunner; +import com.android.settings.TestConfig; +import com.android.settings.applications.AppHeaderController; +import com.android.settings.applications.AppHeaderController.ActionType; +import com.android.settings.testutils.FakeFeatureFactory; +import com.android.settingslib.AppItem; + +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.Answers; +import org.mockito.Mock; +import org.mockito.MockitoAnnotations; +import org.robolectric.RuntimeEnvironment; +import org.robolectric.annotation.Config; +import org.robolectric.util.ReflectionHelpers; + +import static org.mockito.Mockito.RETURNS_DEEP_STUBS; +import static org.mockito.Mockito.doReturn; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.spy; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; + +@RunWith(SettingsRobolectricTestRunner.class) +@Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION) +public class AppDataUsageTest { + + @Mock(answer = Answers.RETURNS_DEEP_STUBS) + private Context mContext; + @Mock(answer = Answers.RETURNS_DEEP_STUBS) + private AppHeaderController mHeaderController; + private FakeFeatureFactory mFeatureFactory; + private AppDataUsage mFragment; + + @Before + public void setUp() { + MockitoAnnotations.initMocks(this); + FakeFeatureFactory.setupForTest(mContext); + mFeatureFactory = (FakeFeatureFactory) FakeFeatureFactory.getFactory(mContext); + } + + @Test + public void bindAppHeader_allWorkApps_shouldNotShowAppInfoLink() { + mFragment = spy(new AppDataUsage()); + + doReturn(mock(PreferenceManager.class, RETURNS_DEEP_STUBS)) + .when(mFragment) + .getPreferenceManager(); + doReturn(mock(PreferenceScreen.class)).when(mFragment).getPreferenceScreen(); + ReflectionHelpers.setField(mFragment, "mAppItem", mock(AppItem.class)); + when(mFeatureFactory.applicationFeatureProvider.newAppHeaderController(mFragment, null)) + .thenReturn(mHeaderController); + + mFragment.onViewCreated(new View(RuntimeEnvironment.application), new Bundle()); + + verify(mHeaderController).setButtonActions(ActionType.ACTION_NONE, ActionType.ACTION_NONE); + } +} -- 2.11.0