From afec9d0356bbf530354d9572dbef5be7f5deb038 Mon Sep 17 00:00:00 2001 From: arangelov Date: Tue, 17 Mar 2020 12:41:01 +0000 Subject: [PATCH] Improve strings for share sheet and intent resolvers. Fixes: 151694643 Fixes: 150942431 Test: manual Change-Id: Ie419e791aa1d2d2cbd32b3f091833b54b90c81eb --- .../app/AbstractMultiProfilePagerAdapter.java | 63 ++++++++++++++----- .../app/ChooserMultiProfilePagerAdapter.java | 22 ++++++- .../internal/app/ResolverActivity.java | 14 ++--- .../app/ResolverMultiProfilePagerAdapter.java | 18 +++++- core/res/res/layout/resolver_empty_states.xml | 10 ++- core/res/res/values/strings.xml | 57 ++++++++++------- core/res/res/values/symbols.xml | 13 ++-- .../internal/app/ChooserActivityTest.java | 4 +- .../internal/app/ResolverActivityTest.java | 4 +- 9 files changed, 144 insertions(+), 61 deletions(-) diff --git a/core/java/com/android/internal/app/AbstractMultiProfilePagerAdapter.java b/core/java/com/android/internal/app/AbstractMultiProfilePagerAdapter.java index ec2653fe67b29..a8155928dacc6 100644 --- a/core/java/com/android/internal/app/AbstractMultiProfilePagerAdapter.java +++ b/core/java/com/android/internal/app/AbstractMultiProfilePagerAdapter.java @@ -115,6 +115,10 @@ public abstract class AbstractMultiProfilePagerAdapter extends PagerAdapter { mInjector = injector; } + protected boolean isQuietModeEnabled(UserHandle workProfileUserHandle) { + return mInjector.isQuietModeEnabled(workProfileUserHandle); + } + void setOnProfileSelectedListener(OnProfileSelectedListener listener) { mOnProfileSelectedListener = listener; } @@ -339,23 +343,32 @@ public abstract class AbstractMultiProfilePagerAdapter extends PagerAdapter { protected abstract void showNoPersonalToWorkIntentsEmptyState( ResolverListAdapter activeListAdapter); + protected abstract void showNoPersonalAppsAvailableEmptyState( + ResolverListAdapter activeListAdapter); + + protected abstract void showNoWorkAppsAvailableEmptyState( + ResolverListAdapter activeListAdapter); + protected abstract void showNoWorkToPersonalIntentsEmptyState( ResolverListAdapter activeListAdapter); - void showEmptyState(ResolverListAdapter listAdapter) { + void showNoAppsAvailableEmptyState(ResolverListAdapter listAdapter) { UserHandle listUserHandle = listAdapter.getUserHandle(); - if (UserHandle.myUserId() == listUserHandle.getIdentifier() - || !hasAppsInOtherProfile(listAdapter)) { - if (mWorkProfileUserHandle != null) { - DevicePolicyEventLogger.createEvent( - DevicePolicyEnums.RESOLVER_EMPTY_STATE_NO_APPS_RESOLVED) - .setStrings(getMetricsCategory()) - .write(); + if (mWorkProfileUserHandle != null + && (UserHandle.myUserId() == listUserHandle.getIdentifier() + || !hasAppsInOtherProfile(listAdapter))) { + DevicePolicyEventLogger.createEvent( + DevicePolicyEnums.RESOLVER_EMPTY_STATE_NO_APPS_RESOLVED) + .setStrings(getMetricsCategory()) + .setBoolean(/*isPersonalProfile*/ listUserHandle == mPersonalProfileUserHandle) + .write(); + if (listUserHandle == mPersonalProfileUserHandle) { + showNoPersonalAppsAvailableEmptyState(listAdapter); + } else { + showNoWorkAppsAvailableEmptyState(listAdapter); } - showEmptyState(listAdapter, - R.drawable.ic_no_apps, - R.string.resolver_no_apps_available, - /* subtitleRes */ 0); + } else if (mWorkProfileUserHandle == null) { + showConsumerUserNoAppsAvailableEmptyState(listAdapter); } } @@ -371,7 +384,7 @@ public abstract class AbstractMultiProfilePagerAdapter extends PagerAdapter { userHandleToPageIndex(activeListAdapter.getUserHandle())); descriptor.rootView.findViewById(R.id.resolver_list).setVisibility(View.GONE); View emptyStateView = descriptor.getEmptyStateView(); - resetViewVisibilities(emptyStateView); + resetViewVisibilitiesForWorkProfileEmptyState(emptyStateView); emptyStateView.setVisibility(View.VISIBLE); ImageView icon = emptyStateView.findViewById(R.id.resolver_empty_state_icon); @@ -395,6 +408,17 @@ public abstract class AbstractMultiProfilePagerAdapter extends PagerAdapter { activeListAdapter.markTabLoaded(); } + private void showConsumerUserNoAppsAvailableEmptyState(ResolverListAdapter activeListAdapter) { + ProfileDescriptor descriptor = getItem( + userHandleToPageIndex(activeListAdapter.getUserHandle())); + descriptor.rootView.findViewById(R.id.resolver_list).setVisibility(View.GONE); + View emptyStateView = descriptor.getEmptyStateView(); + resetViewVisibilitiesForConsumerUserEmptyState(emptyStateView); + emptyStateView.setVisibility(View.VISIBLE); + + activeListAdapter.markTabLoaded(); + } + private void showSpinner(View emptyStateView) { emptyStateView.findViewById(R.id.resolver_empty_state_icon).setVisibility(View.INVISIBLE); emptyStateView.findViewById(R.id.resolver_empty_state_title).setVisibility(View.INVISIBLE); @@ -402,14 +426,25 @@ public abstract class AbstractMultiProfilePagerAdapter extends PagerAdapter { .setVisibility(View.INVISIBLE); emptyStateView.findViewById(R.id.resolver_empty_state_button).setVisibility(View.INVISIBLE); emptyStateView.findViewById(R.id.resolver_empty_state_progress).setVisibility(View.VISIBLE); + emptyStateView.findViewById(R.id.empty).setVisibility(View.GONE); } - private void resetViewVisibilities(View emptyStateView) { + private void resetViewVisibilitiesForWorkProfileEmptyState(View emptyStateView) { emptyStateView.findViewById(R.id.resolver_empty_state_icon).setVisibility(View.VISIBLE); emptyStateView.findViewById(R.id.resolver_empty_state_title).setVisibility(View.VISIBLE); emptyStateView.findViewById(R.id.resolver_empty_state_subtitle).setVisibility(View.VISIBLE); emptyStateView.findViewById(R.id.resolver_empty_state_button).setVisibility(View.INVISIBLE); emptyStateView.findViewById(R.id.resolver_empty_state_progress).setVisibility(View.GONE); + emptyStateView.findViewById(R.id.empty).setVisibility(View.GONE); + } + + private void resetViewVisibilitiesForConsumerUserEmptyState(View emptyStateView) { + emptyStateView.findViewById(R.id.resolver_empty_state_icon).setVisibility(View.GONE); + emptyStateView.findViewById(R.id.resolver_empty_state_title).setVisibility(View.GONE); + emptyStateView.findViewById(R.id.resolver_empty_state_subtitle).setVisibility(View.GONE); + emptyStateView.findViewById(R.id.resolver_empty_state_button).setVisibility(View.GONE); + emptyStateView.findViewById(R.id.resolver_empty_state_progress).setVisibility(View.GONE); + emptyStateView.findViewById(R.id.empty).setVisibility(View.VISIBLE); } protected void showListView(ResolverListAdapter activeListAdapter) { diff --git a/core/java/com/android/internal/app/ChooserMultiProfilePagerAdapter.java b/core/java/com/android/internal/app/ChooserMultiProfilePagerAdapter.java index c6a00f3e46b4a..57157f7b1f5b2 100644 --- a/core/java/com/android/internal/app/ChooserMultiProfilePagerAdapter.java +++ b/core/java/com/android/internal/app/ChooserMultiProfilePagerAdapter.java @@ -175,7 +175,7 @@ public class ChooserMultiProfilePagerAdapter extends AbstractMultiProfilePagerAd View.OnClickListener listener) { showEmptyState(activeListAdapter, R.drawable.ic_work_apps_off, - R.string.resolver_turn_on_work_apps_share, + R.string.resolver_turn_on_work_apps, /* subtitleRes */ 0, listener); } @@ -185,7 +185,7 @@ public class ChooserMultiProfilePagerAdapter extends AbstractMultiProfilePagerAd showEmptyState(activeListAdapter, R.drawable.ic_sharing_disabled, R.string.resolver_cant_share_with_work_apps, - R.string.resolver_cant_share_cross_profile_explanation); + R.string.resolver_cant_share_with_work_apps_explanation); } @Override @@ -193,7 +193,23 @@ public class ChooserMultiProfilePagerAdapter extends AbstractMultiProfilePagerAd showEmptyState(activeListAdapter, R.drawable.ic_sharing_disabled, R.string.resolver_cant_share_with_personal_apps, - R.string.resolver_cant_share_cross_profile_explanation); + R.string.resolver_cant_share_with_personal_apps_explanation); + } + + @Override + protected void showNoPersonalAppsAvailableEmptyState(ResolverListAdapter listAdapter) { + showEmptyState(listAdapter, + R.drawable.ic_no_apps, + R.string.resolver_no_personal_apps_available_share, + /* subtitleRes */ 0); + } + + @Override + protected void showNoWorkAppsAvailableEmptyState(ResolverListAdapter listAdapter) { + showEmptyState(listAdapter, + R.drawable.ic_no_apps, + R.string.resolver_no_work_apps_available_share, + /* subtitleRes */ 0); } class ChooserProfileDescriptor extends ProfileDescriptor { diff --git a/core/java/com/android/internal/app/ResolverActivity.java b/core/java/com/android/internal/app/ResolverActivity.java index 8e64b970441a1..d14203381c656 100644 --- a/core/java/com/android/internal/app/ResolverActivity.java +++ b/core/java/com/android/internal/app/ResolverActivity.java @@ -752,6 +752,11 @@ public class ResolverActivity extends Activity implements } mRegistered = true; } + if (shouldShowTabs() && mMultiProfilePagerAdapter.isWaitingToEnableWorkProfile()) { + if (mMultiProfilePagerAdapter.isQuietModeEnabled(getWorkProfileUserHandle())) { + mMultiProfilePagerAdapter.markWorkProfileEnabledBroadcastReceived(); + } + } mMultiProfilePagerAdapter.getActiveListAdapter().handlePackagesChanged(); updateProfileViewButton(); } @@ -990,7 +995,7 @@ public class ResolverActivity extends Activity implements return; } if (shouldShowEmptyState(listAdapter)) { - mMultiProfilePagerAdapter.showEmptyState(listAdapter); + mMultiProfilePagerAdapter.showNoAppsAvailableEmptyState(listAdapter); } else { mMultiProfilePagerAdapter.showListView(listAdapter); } @@ -1603,8 +1608,6 @@ public class ResolverActivity extends Activity implements } private void resetTabsHeaderStyle(TabWidget tabWidget) { - String workContentDescription = getString(R.string.resolver_work_tab_accessibility); - String personalContentDescription = getString(R.string.resolver_personal_tab_accessibility); for (int i = 0; i < tabWidget.getChildCount(); i++) { View tabView = tabWidget.getChildAt(i); TextView title = tabView.findViewById(android.R.id.title); @@ -1612,11 +1615,6 @@ public class ResolverActivity extends Activity implements title.setTextColor(getAttrColor(this, android.R.attr.textColorTertiary)); title.setTextSize(TypedValue.COMPLEX_UNIT_PX, getResources().getDimension(R.dimen.resolver_tab_text_size)); - if (title.getText().equals(getString(R.string.resolver_personal_tab))) { - tabView.setContentDescription(personalContentDescription); - } else if (title.getText().equals(getString(R.string.resolver_work_tab))) { - tabView.setContentDescription(workContentDescription); - } } } diff --git a/core/java/com/android/internal/app/ResolverMultiProfilePagerAdapter.java b/core/java/com/android/internal/app/ResolverMultiProfilePagerAdapter.java index 578f6ae63ff11..b690a18f2d0ea 100644 --- a/core/java/com/android/internal/app/ResolverMultiProfilePagerAdapter.java +++ b/core/java/com/android/internal/app/ResolverMultiProfilePagerAdapter.java @@ -167,7 +167,7 @@ public class ResolverMultiProfilePagerAdapter extends AbstractMultiProfilePagerA View.OnClickListener listener) { showEmptyState(activeListAdapter, R.drawable.ic_work_apps_off, - R.string.resolver_turn_on_work_apps_view, + R.string.resolver_turn_on_work_apps, /* subtitleRes */ 0, listener); } @@ -188,6 +188,22 @@ public class ResolverMultiProfilePagerAdapter extends AbstractMultiProfilePagerA R.string.resolver_cant_access_personal_apps_explanation); } + @Override + protected void showNoPersonalAppsAvailableEmptyState(ResolverListAdapter listAdapter) { + showEmptyState(listAdapter, + R.drawable.ic_no_apps, + R.string.resolver_no_personal_apps_available_resolve, + /* subtitleRes */ 0); + } + + @Override + protected void showNoWorkAppsAvailableEmptyState(ResolverListAdapter listAdapter) { + showEmptyState(listAdapter, + R.drawable.ic_no_apps, + R.string.resolver_no_work_apps_available_resolve, + /* subtitleRes */ 0); + } + class ResolverProfileDescriptor extends ProfileDescriptor { private ResolverListAdapter resolverListAdapter; final ListView listView; diff --git a/core/res/res/layout/resolver_empty_states.xml b/core/res/res/layout/resolver_empty_states.xml index 5fdf190421996..67299e837e8dd 100644 --- a/core/res/res/layout/resolver_empty_states.xml +++ b/core/res/res/layout/resolver_empty_states.xml @@ -18,7 +18,7 @@ xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/resolver_empty_state" android:layout_width="match_parent" - android:layout_height="@dimen/resolver_empty_state_height" + android:layout_height="wrap_content" android:orientation="vertical" android:gravity="center_horizontal" android:visibility="gone" @@ -72,4 +72,12 @@ android:layout_centerHorizontal="true" android:layout_below="@+id/resolver_empty_state_subtitle" android:indeterminateTint="?attr/colorAccent"/> + \ No newline at end of file diff --git a/core/res/res/values/strings.xml b/core/res/res/values/strings.xml index 26024ed34bc31..dd3b0b439ecc2 100644 --- a/core/res/res/values/strings.xml +++ b/core/res/res/values/strings.xml @@ -5388,33 +5388,42 @@ Personal Work - - Personal view - - Work view - - Can\u2019t share with work apps - - Can\u2019t share with personal apps - - Your IT admin blocked sharing between personal and work profiles - - Can\u2019t access work apps - - Your IT admin doesn\u2019t let you view personal content in work apps - - Can\u2019t access personal apps - - Your IT admin doesn\u2019t let you view work content in personal apps - - Turn on work profile to share content - - Turn on work profile to view content - - No apps available + + + Can\u2019t share this with work apps + + Your IT admin doesn\u2019t allow you to share this content with apps in your work profile + + + Can\u2019t open this with work apps + + Your IT admin doesn\u2019t allow you to open this content with apps in your work profile + + + Can\u2019t share this with personal apps + + Your IT admin doesn\u2019t allow you to share this content with apps in your personal profile + + + Can\u2019t open this with personal apps + + Your IT admin doesn\u2019t allow you to open this content with apps in your personal profile + + + Work profile is paused Turn on + + No work apps can support this content + + No work apps can open this content + + + No personal apps can support this content + + No personal apps can open this content + Record or play audio in telephony calls diff --git a/core/res/res/values/symbols.xml b/core/res/res/values/symbols.xml index 3f4808815df82..bf6ca29aed99c 100644 --- a/core/res/res/values/symbols.xml +++ b/core/res/res/values/symbols.xml @@ -3885,9 +3885,7 @@ - - @@ -3897,15 +3895,18 @@ + - + - - - + + + + + diff --git a/core/tests/coretests/src/com/android/internal/app/ChooserActivityTest.java b/core/tests/coretests/src/com/android/internal/app/ChooserActivityTest.java index a6cbc1ae466d6..e427421a5a80e 100644 --- a/core/tests/coretests/src/com/android/internal/app/ChooserActivityTest.java +++ b/core/tests/coretests/src/com/android/internal/app/ChooserActivityTest.java @@ -1343,7 +1343,7 @@ public class ChooserActivityTest { onView(withText(R.string.resolver_work_tab)).perform(click()); waitForIdle(); - onView(withText(R.string.resolver_turn_on_work_apps_share)) + onView(withText(R.string.resolver_turn_on_work_apps)) .check(matches(isDisplayed())); } @@ -1368,7 +1368,7 @@ public class ChooserActivityTest { onView(withText(R.string.resolver_work_tab)).perform(click()); waitForIdle(); - onView(withText(R.string.resolver_no_apps_available)) + onView(withText(R.string.resolver_no_work_apps_available_share)) .check(matches(isDisplayed())); } diff --git a/core/tests/coretests/src/com/android/internal/app/ResolverActivityTest.java b/core/tests/coretests/src/com/android/internal/app/ResolverActivityTest.java index 9d1ca615e54b6..4ec89b7d28177 100644 --- a/core/tests/coretests/src/com/android/internal/app/ResolverActivityTest.java +++ b/core/tests/coretests/src/com/android/internal/app/ResolverActivityTest.java @@ -624,7 +624,7 @@ public class ResolverActivityTest { onView(withText(R.string.resolver_work_tab)).perform(click()); waitForIdle(); - onView(withText(R.string.resolver_turn_on_work_apps_view)) + onView(withText(R.string.resolver_turn_on_work_apps)) .check(matches(isDisplayed())); } @@ -648,7 +648,7 @@ public class ResolverActivityTest { onView(withText(R.string.resolver_work_tab)).perform(click()); waitForIdle(); - onView(withText(R.string.resolver_no_apps_available)) + onView(withText(R.string.resolver_no_work_apps_available_resolve)) .check(matches(isDisplayed())); }