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

Commit c00bd0c9 authored by arangelov's avatar arangelov
Browse files

Show disclosure for work profile on org owned device in keyguard

Fixes: 149073538
Test: manually provisioned a work profile on org owned device appears
Test: removed a work profile on org owned device to see disclosure disappears
Test: manually set up device as DO to see disclosure appears
Test: manually created a regular non-organization owned work profile to
see disclosure does not exist
Test: atest KeyguardIndicationControllerTest

Change-Id: I1df774cb4389b64779e7e329c3a1c7ff0b68c3ee
parent 171f5f28
Loading
Loading
Loading
Loading
+47 −6
Original line number Diff line number Diff line
@@ -25,6 +25,7 @@ import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.content.pm.UserInfo;
import android.content.res.ColorStateList;
import android.graphics.Color;
import android.hardware.biometrics.BiometricSourceType;
@@ -34,12 +35,16 @@ import android.os.BatteryManager;
import android.os.Handler;
import android.os.Message;
import android.os.RemoteException;
import android.os.UserHandle;
import android.os.UserManager;
import android.text.TextUtils;
import android.text.format.Formatter;
import android.util.Log;
import android.view.View;
import android.view.ViewGroup;

import androidx.annotation.Nullable;

import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.app.IBatteryStats;
import com.android.internal.widget.ViewClippingUtil;
@@ -96,6 +101,7 @@ public class KeyguardIndicationController implements StateListener,
    private final SettableWakeLock mWakeLock;
    private final DockManager mDockManager;
    private final DevicePolicyManager mDevicePolicyManager;
    private final UserManager mUserManager;

    private BroadcastReceiver mBroadcastReceiver;
    private LockscreenLockIconController mLockIconController;
@@ -142,7 +148,8 @@ public class KeyguardIndicationController implements StateListener,
            DockManager dockManager,
            BroadcastDispatcher broadcastDispatcher,
            DevicePolicyManager devicePolicyManager,
            IBatteryStats iBatteryStats) {
            IBatteryStats iBatteryStats,
            UserManager userManager) {
        mContext = context;
        mBroadcastDispatcher = broadcastDispatcher;
        mDevicePolicyManager = devicePolicyManager;
@@ -155,6 +162,7 @@ public class KeyguardIndicationController implements StateListener,
        mWakeLock = new SettableWakeLock(
                wakeLockBuilder.setTag("Doze:KeyguardIndication").build(), TAG);
        mBatteryInfo = iBatteryStats;
        mUserManager = userManager;

        mKeyguardUpdateMonitor.registerCallback(getKeyguardCallback());
        mKeyguardUpdateMonitor.registerCallback(mTickReceiver);
@@ -180,8 +188,10 @@ public class KeyguardIndicationController implements StateListener,
                    updateDisclosure();
                }
            };
            mBroadcastDispatcher.registerReceiver(mBroadcastReceiver, new IntentFilter(
                    DevicePolicyManager.ACTION_DEVICE_POLICY_MANAGER_STATE_CHANGED));
            IntentFilter intentFilter = new IntentFilter();
            intentFilter.addAction(DevicePolicyManager.ACTION_DEVICE_POLICY_MANAGER_STATE_CHANGED);
            intentFilter.addAction(Intent.ACTION_USER_REMOVED);
            mBroadcastDispatcher.registerReceiver(mBroadcastReceiver, intentFilter);
        }
    }

@@ -223,9 +233,8 @@ public class KeyguardIndicationController implements StateListener,

    private void updateDisclosure() {
        // NOTE: Because this uses IPC, avoid calling updateDisclosure() on a critical path.
        if (whitelistIpcs(mDevicePolicyManager::isDeviceManaged)) {
            final CharSequence organizationName =
                    mDevicePolicyManager.getDeviceOwnerOrganizationName();
        if (whitelistIpcs(this::isOrganizationOwnedDevice)) {
            CharSequence organizationName = getOrganizationOwnedDeviceOrganizationName();
            if (organizationName != null) {
                mDisclosure.switchIndication(mContext.getResources().getString(
                        R.string.do_disclosure_with_name, organizationName));
@@ -238,6 +247,38 @@ public class KeyguardIndicationController implements StateListener,
        }
    }

    private boolean isOrganizationOwnedDevice() {
        return mDevicePolicyManager.isDeviceManaged()
                || mDevicePolicyManager.isOrganizationOwnedDeviceWithManagedProfile();
    }

    @Nullable
    private CharSequence getOrganizationOwnedDeviceOrganizationName() {
        if (mDevicePolicyManager.isDeviceManaged()) {
            return mDevicePolicyManager.getDeviceOwnerOrganizationName();
        } else if (mDevicePolicyManager.isOrganizationOwnedDeviceWithManagedProfile()) {
            return getWorkProfileOrganizationName();
        }
        return null;
    }

    private CharSequence getWorkProfileOrganizationName() {
        final int profileId = getWorkProfileUserId(UserHandle.myUserId());
        if (profileId == UserHandle.USER_NULL) {
            return null;
        }
        return mDevicePolicyManager.getOrganizationNameForUser(profileId);
    }

    private int getWorkProfileUserId(int userId) {
        for (final UserInfo userInfo : mUserManager.getProfiles(userId)) {
            if (userInfo.isManagedProfile()) {
                return userInfo.id;
            }
        }
        return UserHandle.USER_NULL;
    }

    public void setVisible(boolean visible) {
        mVisible = visible;
        mIndicationArea.setVisibility(visible ? View.VISIBLE : View.GONE);
+36 −3
Original line number Diff line number Diff line
@@ -16,6 +16,8 @@

package com.android.systemui.statusbar;

import static android.content.pm.UserInfo.FLAG_MANAGED_PROFILE;

import static com.google.common.truth.Truth.assertThat;

import static org.junit.Assert.assertFalse;
@@ -40,6 +42,7 @@ import android.app.trust.TrustManager;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.pm.UserInfo;
import android.graphics.Color;
import android.hardware.biometrics.BiometricSourceType;
import android.hardware.face.FaceManager;
@@ -79,6 +82,8 @@ import org.mockito.Captor;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;

import java.util.Collections;

@SmallTest
@RunWith(AndroidJUnit4.class)
public class KeyguardIndicationControllerTest extends SysuiTestCase {
@@ -154,7 +159,8 @@ public class KeyguardIndicationControllerTest extends SysuiTestCase {

        mController = new KeyguardIndicationController(mContext, mWakeLockBuilder,
                mKeyguardStateController, mStatusBarStateController, mKeyguardUpdateMonitor,
                mDockManager, mBroadcastDispatcher, mDevicePolicyManager, mIBatteryStats);
                mDockManager, mBroadcastDispatcher, mDevicePolicyManager, mIBatteryStats,
                mUserManager);
        mController.setIndicationArea(mIndicationArea);
        mController.setStatusBarKeyguardViewManager(mStatusBarKeyguardViewManager);
        clearInvocations(mIBatteryStats);
@@ -242,6 +248,7 @@ public class KeyguardIndicationControllerTest extends SysuiTestCase {
    @Test
    public void disclosure_unmanaged() {
        when(mDevicePolicyManager.isDeviceManaged()).thenReturn(false);
        when(mDevicePolicyManager.isOrganizationOwnedDeviceWithManagedProfile()).thenReturn(false);
        createController();

        verify(mDisclosure).setVisibility(View.GONE);
@@ -249,7 +256,7 @@ public class KeyguardIndicationControllerTest extends SysuiTestCase {
    }

    @Test
    public void disclosure_managedNoOwnerName() {
    public void disclosure_deviceOwner_noOwnerName() {
        when(mDevicePolicyManager.isDeviceManaged()).thenReturn(true);
        when(mDevicePolicyManager.getDeviceOwnerOrganizationName()).thenReturn(null);
        createController();
@@ -259,6 +266,19 @@ public class KeyguardIndicationControllerTest extends SysuiTestCase {
        verifyNoMoreInteractions(mDisclosure);
    }

    @Test
    public void disclosure_orgOwnedDeviceWithManagedProfile_noOwnerName() {
        when(mDevicePolicyManager.isOrganizationOwnedDeviceWithManagedProfile()).thenReturn(true);
        when(mUserManager.getProfiles(anyInt())).thenReturn(Collections.singletonList(
                new UserInfo(10, /* name */ null, /* flags */ FLAG_MANAGED_PROFILE)));
        when(mDevicePolicyManager.getOrganizationNameForUser(eq(10))).thenReturn(null);
        createController();

        verify(mDisclosure).setVisibility(View.VISIBLE);
        verify(mDisclosure).switchIndication(R.string.do_disclosure_generic);
        verifyNoMoreInteractions(mDisclosure);
    }

    @Test
    public void disclosure_hiddenWhenDozing() {
        when(mDevicePolicyManager.isDeviceManaged()).thenReturn(true);
@@ -292,7 +312,7 @@ public class KeyguardIndicationControllerTest extends SysuiTestCase {
    }

    @Test
    public void disclosure_managedOwnerName() {
    public void disclosure_deviceOwner_withOwnerName() {
        when(mDevicePolicyManager.isDeviceManaged()).thenReturn(true);
        when(mDevicePolicyManager.getDeviceOwnerOrganizationName()).thenReturn(ORGANIZATION_NAME);
        createController();
@@ -302,6 +322,19 @@ public class KeyguardIndicationControllerTest extends SysuiTestCase {
        verifyNoMoreInteractions(mDisclosure);
    }

    @Test
    public void disclosure_orgOwnedDeviceWithManagedProfile_withOwnerName() {
        when(mDevicePolicyManager.isOrganizationOwnedDeviceWithManagedProfile()).thenReturn(true);
        when(mUserManager.getProfiles(anyInt())).thenReturn(Collections.singletonList(
                new UserInfo(10, /* name */ null, FLAG_MANAGED_PROFILE)));
        when(mDevicePolicyManager.getOrganizationNameForUser(eq(10))).thenReturn(ORGANIZATION_NAME);
        createController();

        verify(mDisclosure).setVisibility(View.VISIBLE);
        verify(mDisclosure).switchIndication(mDisclosureWithOrganization);
        verifyNoMoreInteractions(mDisclosure);
    }

    @Test
    public void disclosure_updateOnTheFly() {
        ArgumentCaptor<BroadcastReceiver> receiver = ArgumentCaptor.forClass(