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

Commit c364f5d9 authored by Alex Kershaw's avatar Alex Kershaw
Browse files

Remove policy transparency for cross-profile calendar setting

We will likely deprecate this setting in the next release, to be
replaced by usage of 'connected work and personal apps'. However, we are
keeping it in this release as it's still possible that a lightweight
calendar access API could be useful, if the admin and user approvals are
combined.

For now, the error message that refers to cross-profile calendar when
the setting is disabled is confusing admins, since we're not
recommending usage of this API at this time.

Remove the setting when it is disabled, rather than showing policy
transparency.

Fixes: 143477431
Test: manual
Change-Id: I65573a5ba892e12a4dabcdf23541f33516db0a8a
parent ef28e9b7
Loading
Loading
Loading
Loading
+0 −3
Original line number Diff line number Diff line
@@ -10545,9 +10545,6 @@
    <string name="cross_profile_calendar_title">Cross-profile calendar</string>
    <!-- [CHAR LIMIT=NONE] Setting description. If the user turns on this setting, they can see their work events on their personal calendar. -->
    <string name="cross_profile_calendar_summary">Show work events on your personal calendar</string>
    <!-- [CHAR LIMIT=NONE] The preference summary when cross-profile calendar is restricted. -->
    <string name="cross_profile_calendar_restricted_summary">Your organization doesn\u2019t allow personal apps to access your work calendar</string>
    <!-- Time in hours -->
    <plurals name="hours">
+0 −8
Original line number Diff line number Diff line
@@ -32,18 +32,10 @@
        settings:useAdditionalSummary="true"
        settings:controller="com.android.settings.accounts.ContactSearchPreferenceController"/>

    <!-- Only one of these preferences will be visible at a time, depending on
         CrossProfileCalendarPreferenceController#isCrossProfileCalendarDisallowedByAdmin -->
    <SwitchPreference
        android:key="cross_profile_calendar"
        android:summary="@string/cross_profile_calendar_summary"
        android:title="@string/cross_profile_calendar_title"
        settings:controller="com.android.settings.accounts.CrossProfileCalendarPreferenceController"/>
    <Preference
        android:key="cross_profile_calendar_disabled"
        android:summary="@string/cross_profile_calendar_restricted_summary"
        android:title="@string/cross_profile_calendar_title"
        android:enabled="false"
        settings:controller="com.android.settings.accounts.CrossProfileCalendarDisabledPreferenceController"/>

</PreferenceScreen>
 No newline at end of file
+0 −47
Original line number Diff line number Diff line
/*
 * Copyright (C) 2019 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.accounts;
import static com.android.settings.accounts.CrossProfileCalendarPreferenceController.isCrossProfileCalendarDisallowedByAdmin;

import android.content.Context;
import android.os.UserHandle;

import com.android.settings.core.BasePreferenceController;

public class CrossProfileCalendarDisabledPreferenceController extends BasePreferenceController {
    private UserHandle mManagedUser;

    public void setManagedUser(UserHandle managedUser) {
        mManagedUser = managedUser;
    }

    public CrossProfileCalendarDisabledPreferenceController(Context context,
            String preferenceKey) {
        super(context, preferenceKey);
    }

    @Override
    public int getAvailabilityStatus() {
        if (mManagedUser != null
                && isCrossProfileCalendarDisallowedByAdmin(
                        mContext, mManagedUser.getIdentifier())) {
            return AVAILABLE;
        }

        return DISABLED_FOR_USER;
    }
}
+0 −1
Original line number Diff line number Diff line
@@ -79,7 +79,6 @@ public class ManagedProfileSettings extends DashboardFragment {
        use(WorkModePreferenceController.class).setManagedUser(mManagedUser);
        use(ContactSearchPreferenceController.class).setManagedUser(mManagedUser);
        use(CrossProfileCalendarPreferenceController.class).setManagedUser(mManagedUser);
        use(CrossProfileCalendarDisabledPreferenceController.class).setManagedUser(mManagedUser);
    }

    @Override
+0 −99
Original line number Diff line number Diff line
/*
 * Copyright (C) 2018 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.accounts;

import static com.android.settings.core.BasePreferenceController.AVAILABLE;
import static com.android.settings.core.BasePreferenceController.DISABLED_FOR_USER;

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

import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.anyInt;
import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
import static org.robolectric.RuntimeEnvironment.application;

import android.app.admin.DevicePolicyManager;
import android.content.ComponentName;
import android.content.Context;
import android.os.UserHandle;

import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
import org.robolectric.RobolectricTestRunner;
import org.robolectric.RuntimeEnvironment;
import org.robolectric.Shadows;
import org.robolectric.shadows.ShadowDevicePolicyManager;

import java.util.Collections;

@RunWith(RobolectricTestRunner.class)
public class CrossProfileCalendarDisabledPreferenceControllerTest {

    private static final String PREF_KEY = "cross_profile_calendar_disabled";
    private static final int MANAGED_USER_ID = 10;
    private static final String TEST_PACKAGE_NAME = "com.test";
    private static final ComponentName TEST_COMPONENT_NAME = new ComponentName("test", "test");

    @Mock
    private UserHandle mManagedUser;

    private Context mContext;
    private CrossProfileCalendarDisabledPreferenceController mController;
    private ShadowDevicePolicyManager mDpm;

    @Before
    public void setUp() throws Exception {
        MockitoAnnotations.initMocks(this);
        mContext = spy(RuntimeEnvironment.application);
        mController = new CrossProfileCalendarDisabledPreferenceController(mContext, PREF_KEY);
        mController.setManagedUser(mManagedUser);
        mDpm = Shadows.shadowOf(application.getSystemService(DevicePolicyManager.class));

        when(mManagedUser.getIdentifier()).thenReturn(MANAGED_USER_ID);
        doReturn(mContext).when(mContext).createPackageContextAsUser(
                any(String.class), anyInt(), any(UserHandle.class));
    }

    @Test
    public void getAvailabilityStatus_noPackageAllowed_shouldBeAvailable() {
        mDpm.setProfileOwner(TEST_COMPONENT_NAME);

        assertThat(mController.getAvailabilityStatus()).isEqualTo(AVAILABLE);
    }

    @Test
    public void getAvailabilityStatus_somePackagesAllowed_shouldBeDisabledForUser() {
        mDpm.setProfileOwner(TEST_COMPONENT_NAME);
        mDpm.setCrossProfileCalendarPackages(TEST_COMPONENT_NAME,
                Collections.singleton(TEST_PACKAGE_NAME));

        assertThat(mController.getAvailabilityStatus()).isEqualTo(DISABLED_FOR_USER);
    }

    @Test
    public void getAvailabilityStatus_allPackagesAllowed_shouldBeDisabledForUser() {
        mDpm.setProfileOwner(TEST_COMPONENT_NAME);
        mDpm.setCrossProfileCalendarPackages(TEST_COMPONENT_NAME, null);

        assertThat(mController.getAvailabilityStatus()).isEqualTo(DISABLED_FOR_USER);
    }
}
 No newline at end of file
Loading