Adding logic to unlock private space and scroll to the container after unlock event is received by Launcher. This change also moves pieces of Private Space Animation to different classes, in order to make it more robust. Bug: 289024009 Test: atest PrivateProfileManagerTest Flag: ACONFIG com.google.android.apps.nexuslauncher.inject_private_space_tile TEAMFOOD Change-Id: Ica2fbc00ff3516ed5aca7fbbfc0bd2aa036a4cee
233 lines
10 KiB
Java
233 lines
10 KiB
Java
/*
|
|
* Copyright (C) 2023 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.launcher3.allapps;
|
|
|
|
import static androidx.test.core.app.ApplicationProvider.getApplicationContext;
|
|
|
|
import static com.android.launcher3.allapps.UserProfileManager.STATE_DISABLED;
|
|
import static com.android.launcher3.allapps.UserProfileManager.STATE_ENABLED;
|
|
import static com.android.launcher3.allapps.UserProfileManager.STATE_TRANSITION;
|
|
import static com.android.launcher3.util.Executors.UI_HELPER_EXECUTOR;
|
|
|
|
import static org.junit.Assert.assertEquals;
|
|
import static org.mockito.Mockito.when;
|
|
|
|
import android.content.Context;
|
|
import android.graphics.Bitmap;
|
|
import android.graphics.Canvas;
|
|
import android.graphics.drawable.BitmapDrawable;
|
|
import android.graphics.drawable.Drawable;
|
|
import android.view.LayoutInflater;
|
|
import android.view.View;
|
|
import android.widget.ImageView;
|
|
import android.widget.RelativeLayout;
|
|
|
|
import androidx.test.filters.SmallTest;
|
|
import androidx.test.runner.AndroidJUnit4;
|
|
|
|
import com.android.launcher3.R;
|
|
import com.android.launcher3.util.ActivityContextWrapper;
|
|
|
|
import org.junit.Before;
|
|
import org.junit.Test;
|
|
import org.junit.runner.RunWith;
|
|
import org.mockito.Mock;
|
|
import org.mockito.MockitoAnnotations;
|
|
|
|
@SmallTest
|
|
@RunWith(AndroidJUnit4.class)
|
|
public class PrivateSpaceHeaderViewControllerTest {
|
|
|
|
private static final int CONTAINER_HEADER_ELEMENT_COUNT = 1;
|
|
private static final int LOCK_UNLOCK_BUTTON_COUNT = 1;
|
|
private static final int PS_SETTINGS_BUTTON_COUNT_VISIBLE = 1;
|
|
private static final int PS_SETTINGS_BUTTON_COUNT_INVISIBLE = 0;
|
|
private static final int PS_TRANSITION_IMAGE_COUNT = 1;
|
|
|
|
private Context mContext;
|
|
private LayoutInflater mLayoutInflater;
|
|
private PrivateSpaceHeaderViewController mPsHeaderViewController;
|
|
private RelativeLayout mPsHeaderLayout;
|
|
@Mock
|
|
private PrivateProfileManager mPrivateProfileManager;
|
|
@Mock
|
|
private ActivityAllAppsContainerView mAllApps;
|
|
|
|
@Before
|
|
public void setUp() {
|
|
MockitoAnnotations.initMocks(this);
|
|
mContext = new ActivityContextWrapper(getApplicationContext());
|
|
mLayoutInflater = LayoutInflater.from(getApplicationContext());
|
|
mPsHeaderViewController = new PrivateSpaceHeaderViewController(mAllApps,
|
|
mPrivateProfileManager);
|
|
mPsHeaderLayout = (RelativeLayout) mLayoutInflater.inflate(R.layout.private_space_header,
|
|
null);
|
|
}
|
|
|
|
@Test
|
|
public void privateProfileDisabled_psHeaderContainsLockedView() throws Exception {
|
|
Bitmap unlockButton = getBitmap(mContext.getDrawable(R.drawable.bg_ps_unlock_button));
|
|
when(mPrivateProfileManager.getCurrentState()).thenReturn(STATE_DISABLED);
|
|
|
|
mPsHeaderViewController.addPrivateSpaceHeaderViewElements(mPsHeaderLayout);
|
|
awaitTasksCompleted();
|
|
|
|
int totalContainerHeaderView = 0;
|
|
int totalLockUnlockButtonView = 0;
|
|
for (int i = 0; i < mPsHeaderLayout.getChildCount(); i++) {
|
|
View view = mPsHeaderLayout.getChildAt(i);
|
|
if (view.getId() == R.id.ps_container_header) {
|
|
totalContainerHeaderView += 1;
|
|
assertEquals(View.VISIBLE, view.getVisibility());
|
|
} else if (view.getId() == R.id.ps_lock_unlock_button
|
|
&& view instanceof ImageView imageView) {
|
|
totalLockUnlockButtonView += 1;
|
|
assertEquals(View.VISIBLE, view.getVisibility());
|
|
getBitmap(imageView.getDrawable()).sameAs(unlockButton);
|
|
} else {
|
|
assertEquals(View.GONE, view.getVisibility());
|
|
}
|
|
}
|
|
assertEquals(CONTAINER_HEADER_ELEMENT_COUNT, totalContainerHeaderView);
|
|
assertEquals(LOCK_UNLOCK_BUTTON_COUNT, totalLockUnlockButtonView);
|
|
}
|
|
|
|
@Test
|
|
public void privateProfileEnabled_psHeaderContainsUnlockedView() throws Exception {
|
|
Bitmap lockImage = getBitmap(mContext.getDrawable(R.drawable.bg_ps_lock_button));
|
|
Bitmap settingsImage = getBitmap(mContext.getDrawable(R.drawable.bg_ps_settings_button));
|
|
when(mPrivateProfileManager.getCurrentState()).thenReturn(STATE_ENABLED);
|
|
when(mPrivateProfileManager.isPrivateSpaceSettingsAvailable()).thenReturn(true);
|
|
|
|
mPsHeaderViewController.addPrivateSpaceHeaderViewElements(mPsHeaderLayout);
|
|
awaitTasksCompleted();
|
|
|
|
int totalContainerHeaderView = 0;
|
|
int totalLockUnlockButtonView = 0;
|
|
int totalSettingsImageView = 0;
|
|
for (int i = 0; i < mPsHeaderLayout.getChildCount(); i++) {
|
|
View view = mPsHeaderLayout.getChildAt(i);
|
|
if (view.getId() == R.id.ps_container_header) {
|
|
totalContainerHeaderView += 1;
|
|
assertEquals(View.VISIBLE, view.getVisibility());
|
|
} else if (view.getId() == R.id.ps_lock_unlock_button
|
|
&& view instanceof ImageView imageView) {
|
|
totalLockUnlockButtonView += 1;
|
|
assertEquals(View.VISIBLE, view.getVisibility());
|
|
getBitmap(imageView.getDrawable()).sameAs(lockImage);
|
|
} else if (view.getId() == R.id.ps_settings_button
|
|
&& view instanceof ImageView imageView) {
|
|
totalSettingsImageView += 1;
|
|
assertEquals(View.VISIBLE, view.getVisibility());
|
|
getBitmap(imageView.getDrawable()).sameAs(settingsImage);
|
|
} else {
|
|
assertEquals(View.GONE, view.getVisibility());
|
|
}
|
|
}
|
|
assertEquals(CONTAINER_HEADER_ELEMENT_COUNT, totalContainerHeaderView);
|
|
assertEquals(LOCK_UNLOCK_BUTTON_COUNT, totalLockUnlockButtonView);
|
|
assertEquals(PS_SETTINGS_BUTTON_COUNT_VISIBLE, totalSettingsImageView);
|
|
}
|
|
|
|
@Test
|
|
public void privateProfileEnabledAndNoSettingsIntent_psHeaderContainsUnlockedView()
|
|
throws Exception {
|
|
Bitmap lockImage = getBitmap(mContext.getDrawable(R.drawable.bg_ps_lock_button));
|
|
when(mPrivateProfileManager.getCurrentState()).thenReturn(STATE_ENABLED);
|
|
when(mPrivateProfileManager.isPrivateSpaceSettingsAvailable()).thenReturn(false);
|
|
|
|
mPsHeaderViewController.addPrivateSpaceHeaderViewElements(mPsHeaderLayout);
|
|
awaitTasksCompleted();
|
|
|
|
int totalContainerHeaderView = 0;
|
|
int totalLockUnlockButtonView = 0;
|
|
int totalSettingsImageView = 0;
|
|
for (int i = 0; i < mPsHeaderLayout.getChildCount(); i++) {
|
|
View view = mPsHeaderLayout.getChildAt(i);
|
|
if (view.getId() == R.id.ps_container_header) {
|
|
totalContainerHeaderView += 1;
|
|
assertEquals(View.VISIBLE, view.getVisibility());
|
|
} else if (view.getId() == R.id.ps_lock_unlock_button
|
|
&& view instanceof ImageView imageView) {
|
|
totalLockUnlockButtonView += 1;
|
|
assertEquals(View.VISIBLE, view.getVisibility());
|
|
getBitmap(imageView.getDrawable()).sameAs(lockImage);
|
|
} else {
|
|
assertEquals(View.GONE, view.getVisibility());
|
|
}
|
|
}
|
|
assertEquals(CONTAINER_HEADER_ELEMENT_COUNT, totalContainerHeaderView);
|
|
assertEquals(LOCK_UNLOCK_BUTTON_COUNT, totalLockUnlockButtonView);
|
|
assertEquals(PS_SETTINGS_BUTTON_COUNT_INVISIBLE, totalSettingsImageView);
|
|
}
|
|
|
|
@Test
|
|
public void privateProfileTransitioning_psHeaderContainsTransitionView() throws Exception {
|
|
Bitmap transitionImage = getBitmap(mContext.getDrawable(R.drawable.bg_ps_transition_image));
|
|
when(mPrivateProfileManager.getCurrentState()).thenReturn(STATE_TRANSITION);
|
|
|
|
mPsHeaderViewController.addPrivateSpaceHeaderViewElements(mPsHeaderLayout);
|
|
awaitTasksCompleted();
|
|
|
|
int totalContainerHeaderView = 0;
|
|
int totalLockUnlockButtonView = 0;
|
|
for (int i = 0; i < mPsHeaderLayout.getChildCount(); i++) {
|
|
View view = mPsHeaderLayout.getChildAt(i);
|
|
if (view.getId() == R.id.ps_container_header) {
|
|
totalContainerHeaderView += 1;
|
|
assertEquals(View.VISIBLE, view.getVisibility());
|
|
} else if (view.getId() == R.id.ps_transition_image
|
|
&& view instanceof ImageView imageView) {
|
|
totalLockUnlockButtonView += 1;
|
|
assertEquals(View.VISIBLE, view.getVisibility());
|
|
getBitmap(imageView.getDrawable()).sameAs(transitionImage);
|
|
} else {
|
|
assertEquals(View.GONE, view.getVisibility());
|
|
}
|
|
}
|
|
assertEquals(CONTAINER_HEADER_ELEMENT_COUNT, totalContainerHeaderView);
|
|
assertEquals(PS_TRANSITION_IMAGE_COUNT, totalLockUnlockButtonView);
|
|
}
|
|
|
|
private Bitmap getBitmap(Drawable drawable) {
|
|
Bitmap result;
|
|
if (drawable instanceof BitmapDrawable) {
|
|
result = ((BitmapDrawable) drawable).getBitmap();
|
|
} else {
|
|
int width = drawable.getIntrinsicWidth();
|
|
int height = drawable.getIntrinsicHeight();
|
|
// Some drawables have no intrinsic width - e.g. solid colours.
|
|
if (width <= 0) {
|
|
width = 1;
|
|
}
|
|
if (height <= 0) {
|
|
height = 1;
|
|
}
|
|
|
|
result = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
|
|
Canvas canvas = new Canvas(result);
|
|
drawable.setBounds(0, 0, canvas.getWidth(), canvas.getHeight());
|
|
drawable.draw(canvas);
|
|
}
|
|
return result;
|
|
}
|
|
|
|
private static void awaitTasksCompleted() throws Exception {
|
|
UI_HELPER_EXECUTOR.submit(() -> null).get();
|
|
}
|
|
}
|