Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 2dd9f7b6 authored by arangelov's avatar arangelov
Browse files

Show a spinner when waiting for the work profile to turn on.

This covers the usecase when we show the share sheet or
intent resolver on a device with a work profile, and
the work profile is turned off. In that case, when
sharing from the personal profile, we show an empty
state screen with the option to turn on the work profile.
When we tap that button, we now show a spinner, as there
is a delay until the profile is actually enabled.

Fixes: 149821684
Test: manual

Change-Id: Id90b21a61b10ecce8172bddc42fdeec5fb61c5fe
parent 13fa0257
Loading
Loading
Loading
Loading
+41 −3
Original line number Original line Diff line number Diff line
@@ -64,6 +64,7 @@ public abstract class AbstractMultiProfilePagerAdapter extends PagerAdapter {
    private final UserHandle mPersonalProfileUserHandle;
    private final UserHandle mPersonalProfileUserHandle;
    private final UserHandle mWorkProfileUserHandle;
    private final UserHandle mWorkProfileUserHandle;
    private Injector mInjector;
    private Injector mInjector;
    private boolean mIsWaitingToEnableWorkProfile;


    AbstractMultiProfilePagerAdapter(Context context, int currentPage,
    AbstractMultiProfilePagerAdapter(Context context, int currentPage,
            UserHandle personalProfileUserHandle,
            UserHandle personalProfileUserHandle,
@@ -90,10 +91,19 @@ public abstract class AbstractMultiProfilePagerAdapter extends PagerAdapter {
            @Override
            @Override
            public void requestQuietModeEnabled(boolean enabled, UserHandle workProfileUserHandle) {
            public void requestQuietModeEnabled(boolean enabled, UserHandle workProfileUserHandle) {
                userManager.requestQuietModeEnabled(enabled, workProfileUserHandle);
                userManager.requestQuietModeEnabled(enabled, workProfileUserHandle);
                mIsWaitingToEnableWorkProfile = true;
            }
            }
        };
        };
    }
    }


    protected void markWorkProfileEnabledBroadcastReceived() {
        mIsWaitingToEnableWorkProfile = false;
    }

    protected boolean isWaitingToEnableWorkProfile() {
        return mIsWaitingToEnableWorkProfile;
    }

    /**
    /**
     * Overrides the default {@link Injector} for testing purposes.
     * Overrides the default {@link Injector} for testing purposes.
     */
     */
@@ -294,8 +304,12 @@ public abstract class AbstractMultiProfilePagerAdapter extends PagerAdapter {
                    R.drawable.ic_work_apps_off,
                    R.drawable.ic_work_apps_off,
                    R.string.resolver_turn_on_work_apps,
                    R.string.resolver_turn_on_work_apps,
                    R.string.resolver_turn_on_work_apps_explanation,
                    R.string.resolver_turn_on_work_apps_explanation,
                    (View.OnClickListener) v ->
                    (View.OnClickListener) v -> {
                            mInjector.requestQuietModeEnabled(false, mWorkProfileUserHandle));
                        ProfileDescriptor descriptor = getItem(
                                userHandleToPageIndex(activeListAdapter.getUserHandle()));
                        showSpinner(descriptor.getEmptyStateView());
                        mInjector.requestQuietModeEnabled(false, mWorkProfileUserHandle);
                    });
            return false;
            return false;
        }
        }
        if (UserHandle.myUserId() != listUserHandle.getIdentifier()) {
        if (UserHandle.myUserId() != listUserHandle.getIdentifier()) {
@@ -355,7 +369,8 @@ public abstract class AbstractMultiProfilePagerAdapter extends PagerAdapter {
        ProfileDescriptor descriptor = getItem(
        ProfileDescriptor descriptor = getItem(
                userHandleToPageIndex(activeListAdapter.getUserHandle()));
                userHandleToPageIndex(activeListAdapter.getUserHandle()));
        descriptor.rootView.findViewById(R.id.resolver_list).setVisibility(View.GONE);
        descriptor.rootView.findViewById(R.id.resolver_list).setVisibility(View.GONE);
        View emptyStateView = descriptor.rootView.findViewById(R.id.resolver_empty_state);
        View emptyStateView = descriptor.getEmptyStateView();
        resetViewVisibilities(emptyStateView);
        emptyStateView.setVisibility(View.VISIBLE);
        emptyStateView.setVisibility(View.VISIBLE);


        ImageView icon = emptyStateView.findViewById(R.id.resolver_empty_state_icon);
        ImageView icon = emptyStateView.findViewById(R.id.resolver_empty_state_icon);
@@ -372,6 +387,23 @@ public abstract class AbstractMultiProfilePagerAdapter extends PagerAdapter {
        button.setOnClickListener(buttonOnClick);
        button.setOnClickListener(buttonOnClick);
    }
    }


    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);
        emptyStateView.findViewById(R.id.resolver_empty_state_subtitle)
                .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);
    }

    private void resetViewVisibilities(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);
    }

    private void showListView(ResolverListAdapter activeListAdapter) {
    private void showListView(ResolverListAdapter activeListAdapter) {
        ProfileDescriptor descriptor = getItem(
        ProfileDescriptor descriptor = getItem(
                userHandleToPageIndex(activeListAdapter.getUserHandle()));
                userHandleToPageIndex(activeListAdapter.getUserHandle()));
@@ -409,8 +441,14 @@ public abstract class AbstractMultiProfilePagerAdapter extends PagerAdapter {


    protected class ProfileDescriptor {
    protected class ProfileDescriptor {
        final ViewGroup rootView;
        final ViewGroup rootView;
        private final ViewGroup mEmptyStateView;
        ProfileDescriptor(ViewGroup rootView) {
        ProfileDescriptor(ViewGroup rootView) {
            this.rootView = rootView;
            this.rootView = rootView;
            mEmptyStateView = rootView.findViewById(R.id.resolver_empty_state);
        }

        private ViewGroup getEmptyStateView() {
            return mEmptyStateView;
        }
        }
    }
    }


+18 −2
Original line number Original line Diff line number Diff line
@@ -756,7 +756,7 @@ public class ResolverActivity extends Activity implements


    private void registerWorkProfileStateReceiver() {
    private void registerWorkProfileStateReceiver() {
        IntentFilter filter = new IntentFilter();
        IntentFilter filter = new IntentFilter();
        filter.addAction(Intent.ACTION_MANAGED_PROFILE_AVAILABLE);
        filter.addAction(Intent.ACTION_USER_UNLOCKED);
        filter.addAction(Intent.ACTION_MANAGED_PROFILE_UNAVAILABLE);
        filter.addAction(Intent.ACTION_MANAGED_PROFILE_UNAVAILABLE);
        registerReceiverAsUser(mWorkProfileStateReceiver, UserHandle.ALL, filter, null, null);
        registerReceiverAsUser(mWorkProfileStateReceiver, UserHandle.ALL, filter, null, null);
    }
    }
@@ -1729,6 +1729,14 @@ public class ResolverActivity extends Activity implements
    @Override // ResolverListCommunicator
    @Override // ResolverListCommunicator
    public void onHandlePackagesChanged(ResolverListAdapter listAdapter) {
    public void onHandlePackagesChanged(ResolverListAdapter listAdapter) {
        if (listAdapter == mMultiProfilePagerAdapter.getActiveListAdapter()) {
        if (listAdapter == mMultiProfilePagerAdapter.getActiveListAdapter()) {
            if (listAdapter.getUserHandle() == getWorkProfileUserHandle()
                    && mMultiProfilePagerAdapter.isWaitingToEnableWorkProfile()) {
                // We have just turned on the work profile and entered the pass code to start it,
                // now we are waiting to receive the ACTION_USER_UNLOCKED broadcast. There is no
                // point in reloading the list now, since the work profile user is still
                // turning on.
                return;
            }
            boolean listRebuilt = mMultiProfilePagerAdapter.rebuildActiveTab(true);
            boolean listRebuilt = mMultiProfilePagerAdapter.rebuildActiveTab(true);
            if (listRebuilt) {
            if (listRebuilt) {
                ResolverListAdapter activeListAdapter =
                ResolverListAdapter activeListAdapter =
@@ -1749,10 +1757,18 @@ public class ResolverActivity extends Activity implements
            @Override
            @Override
            public void onReceive(Context context, Intent intent) {
            public void onReceive(Context context, Intent intent) {
                String action = intent.getAction();
                String action = intent.getAction();
                if (!TextUtils.equals(action, Intent.ACTION_MANAGED_PROFILE_AVAILABLE)
                if (!TextUtils.equals(action, Intent.ACTION_USER_UNLOCKED)
                        && !TextUtils.equals(action, Intent.ACTION_MANAGED_PROFILE_UNAVAILABLE)) {
                        && !TextUtils.equals(action, Intent.ACTION_MANAGED_PROFILE_UNAVAILABLE)) {
                    return;
                    return;
                }
                }
                int userHandle = intent.getIntExtra(Intent.EXTRA_USER_HANDLE, -1);
                if (TextUtils.equals(action, Intent.ACTION_USER_UNLOCKED)
                        && userHandle != getWorkProfileUserHandle().getIdentifier()) {
                    return;
                }
                if (TextUtils.equals(action, Intent.ACTION_USER_UNLOCKED)) {
                    mMultiProfilePagerAdapter.markWorkProfileEnabledBroadcastReceived();
                }
                if (mMultiProfilePagerAdapter.getCurrentUserHandle()
                if (mMultiProfilePagerAdapter.getCurrentUserHandle()
                        == getWorkProfileUserHandle()) {
                        == getWorkProfileUserHandle()) {
                    mMultiProfilePagerAdapter.rebuildActiveTab(true);
                    mMultiProfilePagerAdapter.rebuildActiveTab(true);
+24 −7
Original line number Original line Diff line number Diff line
@@ -14,7 +14,7 @@
  ~ limitations under the License.
  ~ limitations under the License.
  -->
  -->


<LinearLayout
<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/resolver_empty_state"
    android:id="@+id/resolver_empty_state"
    android:layout_width="match_parent"
    android:layout_width="match_parent"
@@ -28,25 +28,31 @@
        android:id="@+id/resolver_empty_state_icon"
        android:id="@+id/resolver_empty_state_icon"
        android:layout_marginTop="48dp"
        android:layout_marginTop="48dp"
        android:layout_width="24dp"
        android:layout_width="24dp"
        android:layout_height="24dp"/>
        android:layout_height="24dp"
        android:layout_centerHorizontal="true" />
    <TextView
    <TextView
        android:id="@+id/resolver_empty_state_title"
        android:id="@+id/resolver_empty_state_title"
        android:layout_below="@+id/resolver_empty_state_icon"
        android:layout_marginTop="8dp"
        android:layout_marginTop="8dp"
        android:layout_width="wrap_content"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_height="wrap_content"
        android:fontFamily="@string/config_headlineFontFamilyMedium"
        android:fontFamily="@string/config_headlineFontFamilyMedium"
        android:textColor="@color/resolver_empty_state_text"
        android:textColor="@color/resolver_empty_state_text"
        android:textSize="14sp"/>
        android:textSize="18sp"
        android:layout_centerHorizontal="true" />
    <TextView
    <TextView
        android:id="@+id/resolver_empty_state_subtitle"
        android:id="@+id/resolver_empty_state_subtitle"
        android:layout_below="@+id/resolver_empty_state_title"
        android:layout_marginTop="4dp"
        android:layout_marginTop="4dp"
        android:layout_width="wrap_content"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_height="wrap_content"
        android:textColor="@color/resolver_empty_state_text"
        android:textColor="@color/resolver_empty_state_text"
        android:textSize="12sp"
        android:textSize="14sp"
        android:gravity="center_horizontal" />
        android:gravity="center_horizontal"
        android:layout_centerHorizontal="true" />
    <Button
    <Button
        android:id="@+id/resolver_empty_state_button"
        android:id="@+id/resolver_empty_state_button"
        android:layout_below="@+id/resolver_empty_state_subtitle"
        android:layout_marginTop="16dp"
        android:layout_marginTop="16dp"
        android:text="@string/resolver_switch_on_work"
        android:text="@string/resolver_switch_on_work"
        android:layout_width="wrap_content"
        android:layout_width="wrap_content"
@@ -54,5 +60,16 @@
        android:background="@null"
        android:background="@null"
        android:fontFamily="@string/config_headlineFontFamilyMedium"
        android:fontFamily="@string/config_headlineFontFamilyMedium"
        android:textSize="14sp"
        android:textSize="14sp"
        android:textColor="@color/resolver_tabs_active_color"/>
        android:textColor="@color/resolver_tabs_active_color"
</LinearLayout>
        android:layout_centerHorizontal="true" />
 No newline at end of file
    <ProgressBar
        android:id="@+id/resolver_empty_state_progress"
        style="@style/Widget.Material.Light.ProgressBar"
        android:visibility="gone"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:indeterminate="true"
        android:layout_centerHorizontal="true"
        android:layout_below="@+id/resolver_empty_state_subtitle"
        android:indeterminateTint="@color/resolver_tabs_active_color"/>
</RelativeLayout>
 No newline at end of file
+1 −0
Original line number Original line Diff line number Diff line
@@ -3879,6 +3879,7 @@
  <java-symbol type="id" name="resolver_empty_state_title" />
  <java-symbol type="id" name="resolver_empty_state_title" />
  <java-symbol type="id" name="resolver_empty_state_subtitle" />
  <java-symbol type="id" name="resolver_empty_state_subtitle" />
  <java-symbol type="id" name="resolver_empty_state_button" />
  <java-symbol type="id" name="resolver_empty_state_button" />
  <java-symbol type="id" name="resolver_empty_state_progress" />
  <java-symbol type="id" name="resolver_tab_divider" />
  <java-symbol type="id" name="resolver_tab_divider" />
  <java-symbol type="string" name="resolver_cant_share_with_work_apps" />
  <java-symbol type="string" name="resolver_cant_share_with_work_apps" />
  <java-symbol type="string" name="resolver_cant_share_with_personal_apps" />
  <java-symbol type="string" name="resolver_cant_share_with_personal_apps" />