From b3ba0ac11ff7d11b2aea9ed3b0c8b8584a54f7be Mon Sep 17 00:00:00 2001 From: Beverly Date: Thu, 21 Jun 2018 10:23:03 -0400 Subject: [PATCH 1/2] Enable and add logging to ManageApplications Bug: 77541894 Test: n/a Change-Id: Ia6a26c97aa4cb7d81987a291d4b568e89087959b --- .../AppStateNotificationBridge.java | 10 ++++++- .../ManageApplications.java | 29 ++++++++++++++----- 2 files changed, 31 insertions(+), 8 deletions(-) diff --git a/src/com/android/settings/applications/AppStateNotificationBridge.java b/src/com/android/settings/applications/AppStateNotificationBridge.java index 205c92d091a..d06aeb1110a 100644 --- a/src/com/android/settings/applications/AppStateNotificationBridge.java +++ b/src/com/android/settings/applications/AppStateNotificationBridge.java @@ -23,6 +23,7 @@ import android.os.UserHandle; import android.os.UserManager; import android.text.format.DateUtils; import android.util.ArrayMap; +import android.util.Log; import android.view.View; import android.view.ViewGroup; import android.widget.Switch; @@ -46,6 +47,8 @@ import java.util.Map; */ public class AppStateNotificationBridge extends AppStateBaseBridge { + private final String TAG = "AppStateNotificationBridge"; + private final boolean DEBUG = true; private final Context mContext; private IUsageStatsManager mUsageStatsManager; protected List mUserIds; @@ -70,7 +73,12 @@ public class AppStateNotificationBridge extends AppStateBaseBridge { @Override protected void loadAllExtraInfo() { ArrayList apps = mAppSession.getAllApps(); - if (apps == null) return; + if (apps == null) { + if (DEBUG) { + Log.d(TAG, "No apps. No extra info loaded"); + } + return; + } final Map map = getAggregatedUsageEvents(); for (AppEntry entry : apps) { diff --git a/src/com/android/settings/applications/manageapplications/ManageApplications.java b/src/com/android/settings/applications/manageapplications/ManageApplications.java index 06503c2071f..262281de056 100644 --- a/src/com/android/settings/applications/manageapplications/ManageApplications.java +++ b/src/com/android/settings/applications/manageapplications/ManageApplications.java @@ -16,7 +16,6 @@ package com.android.settings.applications.manageapplications; -import static androidx.recyclerview.widget.RecyclerView.SCROLL_STATE_IDLE; import static com.android.settings.applications.manageapplications.AppFilterRegistry .FILTER_APPS_ALL; import static com.android.settings.applications.manageapplications.AppFilterRegistry @@ -38,6 +37,8 @@ import static com.android.settings.applications.manageapplications.AppFilterRegi import static com.android.settings.applications.manageapplications.AppFilterRegistry .FILTER_APPS_WORK; +import static androidx.recyclerview.widget.RecyclerView.SCROLL_STATE_IDLE; + import android.annotation.Nullable; import android.annotation.StringRes; import android.app.Activity; @@ -141,7 +142,7 @@ public class ManageApplications extends InstrumentedFragment implements View.OnClickListener, OnItemSelectedListener { static final String TAG = "ManageApplications"; - static final boolean DEBUG = Log.isLoggable(TAG, Log.DEBUG); + static final boolean DEBUG = true; // Intent extras. public static final String EXTRA_CLASSNAME = "classname"; @@ -721,7 +722,9 @@ public class ManageApplications extends InstrumentedFragment mFilter = mFilterAdapter.getFilter(position); mApplications.setFilter(mFilter); - if (DEBUG) Log.d(TAG, "Selecting filter " + mFilter); + if (DEBUG) { + Log.d(TAG, "Selecting filter " + getContext().getText(mFilter.getTitle())); + } } @Override @@ -784,7 +787,7 @@ public class ManageApplications extends InstrumentedFragment return; } if (DEBUG) { - Log.d(TAG, "Enabling filter " + filter); + Log.d(TAG, "Enabling filter " + mContext.getText(filter.getTitle())); } mFilterOptions.add(filter); Collections.sort(mFilterOptions); @@ -793,7 +796,8 @@ public class ManageApplications extends InstrumentedFragment notifyDataSetChanged(); if (mFilterOptions.size() == 1) { if (DEBUG) { - Log.d(TAG, "Auto selecting filter " + filter); + Log.d(TAG, "Auto selecting filter " + filter + " " + mContext.getText( + filter.getTitle())); } mManageApplications.mFilterSpinner.setSelection(0); mManageApplications.onItemSelected(null, null, 0, 0); @@ -816,7 +820,8 @@ public class ManageApplications extends InstrumentedFragment return; } if (DEBUG) { - Log.d(TAG, "Disabling filter " + filter); + Log.d(TAG, "Disabling filter " + filter + " " + mContext.getText( + filter.getTitle())); } Collections.sort(mFilterOptions); mManageApplications.mSpinnerHeader.setVisibility( @@ -825,7 +830,8 @@ public class ManageApplications extends InstrumentedFragment if (mManageApplications.mFilter == filter) { if (mFilterOptions.size() > 0) { if (DEBUG) { - Log.d(TAG, "Auto selecting filter " + mFilterOptions.get(0)); + Log.d(TAG, "Auto selecting filter " + mFilterOptions.get(0) + + mContext.getText(mFilterOptions.get(0).getTitle())); } mManageApplications.mFilterSpinner.setSelection(0); mManageApplications.onItemSelected(null, null, 0, 0); @@ -1035,6 +1041,12 @@ public class ManageApplications extends InstrumentedFragment if (!mHasReceivedLoadEntries || (mExtraInfoBridge != null && !mHasReceivedBridgeCallback)) { // Don't rebuild the list until all the app entries are loaded. + if (DEBUG) { + Log.d(TAG, "Not rebuilding until all the app entries loaded." + + " !mHasReceivedLoadEntries=" + !mHasReceivedLoadEntries + + " !mExtraInfoBridgeNull=" + (mExtraInfoBridge != null) + + " !mHasReceivedBridgeCallback=" + !mHasReceivedBridgeCallback); + } return; } ApplicationsState.AppFilter filterObj; @@ -1140,6 +1152,9 @@ public class ManageApplications extends InstrumentedFragment @Override public void onRebuildComplete(ArrayList entries) { + if (DEBUG) { + Log.d(TAG, "onRebuildComplete"); + } final int filterType = mAppFilter.getFilterType(); if (filterType == FILTER_APPS_POWER_WHITELIST || filterType == FILTER_APPS_POWER_WHITELIST_ALL) { From b6852d782860556b4547569b7ec7cd4f712d65f3 Mon Sep 17 00:00:00 2001 From: arangelov Date: Tue, 29 May 2018 19:14:01 +0100 Subject: [PATCH 2/2] Add a metadata to control whether an external intent should be opened in the personal profile when in a managed profile. This change introduces the com.android.settings.profile metadata with possible values "primary_profile_only" and "all_profiles" (the default value when not specified). If an application declares this metadata with a value of "primary_profile_only", in a work profile the ProfileSelectDialog is never shown and the application is opened straight in the personal profile. If an application specifies a value of "all_profiles" or does not specify anything, the ProfileSelectDialog is shown to the user. Bug: 79868199 Test: atest packages/apps/Settings/tests/robotests/src/com/android/settings/dashboard/DashboardFeatureProviderImplTest.java#openTileIntent_profileSelectionDialog_shouldShow Test: atest packages/apps/Settings/tests/robotests/src/com/android/settings/dashboard/DashboardFeatureProviderImplTest.java#openTileIntent_profileSelectionDialog_explicitMetadataShouldShow Test: atest packages/apps/Settings/tests/robotests/src/com/android/settings/dashboard/DashboardFeatureProviderImplTest.java#openTileIntent_profileSelectionDialog_shouldNotShow Change-Id: Id62ab44b58b93c479407cc1bacc7a806a09bfd1b --- .../DashboardFeatureProviderImpl.java | 4 +- .../DashboardFeatureProviderImplTest.java | 63 +++++++++++++++++-- 2 files changed, 60 insertions(+), 7 deletions(-) diff --git a/src/com/android/settings/dashboard/DashboardFeatureProviderImpl.java b/src/com/android/settings/dashboard/DashboardFeatureProviderImpl.java index 48bd2952d46..a44335518e9 100644 --- a/src/com/android/settings/dashboard/DashboardFeatureProviderImpl.java +++ b/src/com/android/settings/dashboard/DashboardFeatureProviderImpl.java @@ -60,7 +60,6 @@ import androidx.preference.Preference; public class DashboardFeatureProviderImpl implements DashboardFeatureProvider { private static final String TAG = "DashboardFeatureImpl"; - private static final String DASHBOARD_TILE_PREF_KEY_PREFIX = "dashboard_tile_pref_"; private static final String META_DATA_KEY_INTENT_ACTION = "com.android.settings.intent.action"; @VisibleForTesting @@ -277,7 +276,8 @@ public class DashboardFeatureProviderImpl implements DashboardFeatureProvider { return; } ProfileSelectDialog.updateUserHandlesIfNeeded(mContext, tile); - if (tile.userHandle == null) { + + if (tile.userHandle == null || tile.isPrimaryProfileOnly()) { mMetricsFeatureProvider.logDashboardStartIntent(mContext, intent, sourceMetricCategory); activity.startActivityForResult(intent, 0); } else if (tile.userHandle.size() == 1) { diff --git a/tests/robotests/src/com/android/settings/dashboard/DashboardFeatureProviderImplTest.java b/tests/robotests/src/com/android/settings/dashboard/DashboardFeatureProviderImplTest.java index 7cfdf3255d9..7228a2fde72 100644 --- a/tests/robotests/src/com/android/settings/dashboard/DashboardFeatureProviderImplTest.java +++ b/tests/robotests/src/com/android/settings/dashboard/DashboardFeatureProviderImplTest.java @@ -16,12 +16,16 @@ package com.android.settings.dashboard; +import static com.android.settingslib.drawer.TileUtils.META_DATA_KEY_PROFILE; +import static com.android.settingslib.drawer.TileUtils.PROFILE_ALL; +import static com.android.settingslib.drawer.TileUtils.PROFILE_PRIMARY; import static com.google.common.truth.Truth.assertThat; import static org.mockito.Matchers.any; import static org.mockito.Matchers.anyInt; import static org.mockito.Matchers.eq; import static org.mockito.Mockito.doReturn; import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.never; import static org.mockito.Mockito.spy; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.verifyZeroInteractions; @@ -39,7 +43,7 @@ import android.graphics.drawable.Icon; import android.os.Bundle; import android.os.UserHandle; import android.os.UserManager; - +import androidx.preference.Preference; import com.android.internal.logging.nano.MetricsProto; import com.android.settings.R; import com.android.settings.SettingsActivity; @@ -55,6 +59,7 @@ import com.android.settingslib.drawer.DashboardCategory; import com.android.settingslib.drawer.Tile; import com.android.settingslib.drawer.TileUtils; +import java.util.ArrayList; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; @@ -68,10 +73,6 @@ import org.robolectric.shadows.ShadowActivity; import org.robolectric.shadows.ShadowApplication; import org.robolectric.util.ReflectionHelpers; -import java.util.ArrayList; - -import androidx.preference.Preference; - @RunWith(SettingsRobolectricTestRunner.class) @Config(shadows = ShadowUserManager.class) public class DashboardFeatureProviderImplTest { @@ -455,4 +456,56 @@ public class DashboardFeatureProviderImplTest { public void testShouldTintIcon_disabledInResources_shouldBeFalse() { assertThat(mImpl.shouldTintIcon()).isFalse(); } + + @Test + public void openTileIntent_profileSelectionDialog_shouldShow() { + final Tile tile = new Tile(); + tile.metaData = new Bundle(); + tile.intent = new Intent(); + tile.intent.setComponent(new ComponentName("pkg", "class")); + final ArrayList handles = new ArrayList<>(); + handles.add(new UserHandle(0)); + handles.add(new UserHandle(10)); + tile.userHandle = handles; + mImpl.openTileIntent(mActivity, tile); + + verify(mActivity, never()) + .startActivityForResult(any(Intent.class), eq(0)); + verify(mActivity).getFragmentManager(); + } + + @Test + public void openTileIntent_profileSelectionDialog_explicitMetadataShouldShow() { + final Tile tile = new Tile(); + tile.metaData = new Bundle(); + tile.metaData.putString(META_DATA_KEY_PROFILE, PROFILE_ALL); + tile.intent = new Intent(); + tile.intent.setComponent(new ComponentName("pkg", "class")); + final ArrayList handles = new ArrayList<>(); + handles.add(new UserHandle(0)); + handles.add(new UserHandle(10)); + tile.userHandle = handles; + mImpl.openTileIntent(mActivity, tile); + + verify(mActivity, never()) + .startActivityForResult(any(Intent.class), eq(0)); + verify(mActivity).getFragmentManager(); + } + @Test + public void openTileIntent_profileSelectionDialog_shouldNotShow() { + final Tile tile = new Tile(); + tile.metaData = new Bundle(); + tile.metaData.putString(META_DATA_KEY_PROFILE, PROFILE_PRIMARY); + tile.intent = new Intent(); + tile.intent.setComponent(new ComponentName("pkg", "class")); + final ArrayList handles = new ArrayList<>(); + handles.add(new UserHandle(0)); + handles.add(new UserHandle(10)); + tile.userHandle = handles; + mImpl.openTileIntent(mActivity, tile); + + verify(mActivity) + .startActivityForResult(any(Intent.class), eq(0)); + verify(mActivity, never()).getFragmentManager(); + } }