Add background image for work challenge

If the challenge shown is for a work profile, add the default image and
color to the background of the fragment.

Change-Id: I148c6cd3a835a84c7bac78b020839dfdae4a6c36
This commit is contained in:
Benjamin Franz
2016-01-13 12:16:25 +00:00
parent 45bc64afcb
commit 194300dff3
18 changed files with 448 additions and 326 deletions

Binary file not shown.

After

Width:  |  Height:  |  Size: 243 KiB

View File

@@ -13,11 +13,18 @@
See the License for the specific language governing permissions and
limitations under the License.
-->
<LinearLayout
<FrameLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent" >
<include layout="@layout/confirm_lock_background_base" />
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/topLayout"
android:orientation="vertical"
android:layout_width="wrap_content"
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
@@ -90,4 +97,5 @@
android:visibility="gone"/>
</FrameLayout>
</LinearLayout>
</LinearLayout>
</FrameLayout>

View File

@@ -13,7 +13,14 @@
See the License for the specific language governing permissions and
limitations under the License.
-->
<com.android.internal.widget.LinearLayoutWithDefaultTouchRecepient
<FrameLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent" >
<include layout="@layout/confirm_lock_background_base" />
<com.android.internal.widget.LinearLayoutWithDefaultTouchRecepient
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/topLayout"
android:orientation="horizontal"
@@ -111,5 +118,5 @@
android:visibility="gone"/>
</LinearLayout>
</com.android.internal.widget.LinearLayoutWithDefaultTouchRecepient>
</com.android.internal.widget.LinearLayoutWithDefaultTouchRecepient>
</FrameLayout>

View File

@@ -0,0 +1,21 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Copyright (C) 2016 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.
-->
<ImageView
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/background_image"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:scaleType="centerCrop" />

View File

@@ -13,11 +13,18 @@
See the License for the specific language governing permissions and
limitations under the License.
-->
<com.android.internal.widget.LinearLayoutWithDefaultTouchRecepient
<FrameLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent" >
<include layout="@layout/confirm_lock_background_base" />
<com.android.internal.widget.LinearLayoutWithDefaultTouchRecepient
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/topLayout"
android:orientation="vertical"
android:layout_width="wrap_content"
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
@@ -88,4 +95,5 @@
android:contentDescription="@string/confirm_fingerprint_icon_content_description"
android:visibility="gone"/>
</com.android.internal.widget.LinearLayoutWithDefaultTouchRecepient>
</com.android.internal.widget.LinearLayoutWithDefaultTouchRecepient>
</FrameLayout>

View File

@@ -13,11 +13,18 @@
See the License for the specific language governing permissions and
limitations under the License.
-->
<com.android.internal.widget.LinearLayoutWithDefaultTouchRecepient
<FrameLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent" >
<include layout="@layout/confirm_lock_background_base" />
<com.android.internal.widget.LinearLayoutWithDefaultTouchRecepient
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/topLayout"
android:orientation="vertical"
android:layout_width="wrap_content"
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
@@ -92,4 +99,5 @@
android:visibility="gone"/>
</LinearLayout>
</com.android.internal.widget.LinearLayoutWithDefaultTouchRecepient>
</com.android.internal.widget.LinearLayoutWithDefaultTouchRecepient>
</FrameLayout>

View File

@@ -82,6 +82,7 @@
<color name="warning">#ff5621</color>
<color name="confirm_device_credential_dark_background">#263238</color>
<color name="confirm_device_credential_transparent_black">#60000000</color>
<color name="fab_ripple">#1fffffff</color><!-- 12% white -->
<color name="fab_shape">?android:attr/colorAccent</color>
<color name="voice_interaction_highlight">#33b5e5</color>

View File

@@ -255,6 +255,9 @@
<item name="android:windowAnimationStyle">@style/ConfirmDeviceCredentialsAnimationStyle</item>
</style>
<style name="Theme.ConfirmDeviceCredentialsWork" parent="Theme.ConfirmDeviceCredentialsDark">
<item name="@*android:regularColor">@*android:color/white</item>
</style>
<style name="Theme.FingerprintEnroll" parent="@*android:style/Theme.Material.Settings.NoActionBar">
<item name="android:windowAnimationStyle">@style/Animation.SuwWindowAnimation</item>

View File

@@ -172,7 +172,7 @@ public class ChooseLockGeneric extends SettingsActivity {
!mLockPatternUtils.isSeparateProfileChallengeAllowed(targetUser)) {
// Always use parent if explicitely requested or if profile challenge is not
// supported
mUserId = Utils.getSameOwnerUserId(getContext(), getArguments());
mUserId = Utils.getUserIdFromBundle(getContext(), getArguments());
} else {
mUserId = targetUser;
}

View File

@@ -238,7 +238,7 @@ public class ChooseLockPassword extends SettingsActivity {
throw new SecurityException("Fragment contained in wrong activity");
}
// Only take this argument into account if it belongs to the current profile.
mUserId = Utils.getSameOwnerUserId(getActivity(), intent.getExtras());
mUserId = Utils.getUserIdFromBundle(getActivity(), intent.getExtras());
mRequestedQuality = Math.max(intent.getIntExtra(LockPatternUtils.PASSWORD_TYPE_KEY,
mRequestedQuality), mLockPatternUtils.getRequestedPasswordQuality(
mUserId));

View File

@@ -370,7 +370,7 @@ public class ChooseLockPattern extends SettingsActivity {
}
Intent intent = getActivity().getIntent();
// Only take this argument into account if it belongs to the current profile.
mUserId = Utils.getSameOwnerUserId(getActivity(), intent.getExtras());
mUserId = Utils.getUserIdFromBundle(getActivity(), intent.getExtras());
}
@Override

View File

@@ -90,7 +90,7 @@ public final class ChooseLockSettingsHelper {
boolean launchConfirmationActivity(int request, CharSequence title, boolean returnCredentials,
int userId) {
return launchConfirmationActivity(request, title, null, null,
returnCredentials, false, false, 0, Utils.getSameOwnerUserId(mActivity, userId));
returnCredentials, false, false, 0, Utils.enforceSameOwner(mActivity, userId));
}
/**
@@ -110,7 +110,7 @@ public final class ChooseLockSettingsHelper {
@Nullable CharSequence header, @Nullable CharSequence description,
boolean returnCredentials, boolean external) {
return launchConfirmationActivity(request, title, header, description,
returnCredentials, external, false, 0, Utils.getEffectiveUserId(mActivity));
returnCredentials, external, false, 0, Utils.getCredentialOwnerUserId(mActivity));
}
/**
@@ -131,7 +131,7 @@ public final class ChooseLockSettingsHelper {
@Nullable CharSequence header, @Nullable CharSequence description,
boolean returnCredentials, boolean external, int userId) {
return launchConfirmationActivity(request, title, header, description,
returnCredentials, external, false, 0, Utils.getSameOwnerUserId(mActivity, userId));
returnCredentials, external, false, 0, Utils.enforceSameOwner(mActivity, userId));
}
/**
@@ -147,7 +147,7 @@ public final class ChooseLockSettingsHelper {
@Nullable CharSequence header, @Nullable CharSequence description,
long challenge) {
return launchConfirmationActivity(request, title, header, description,
false, false, true, challenge, Utils.getEffectiveUserId(mActivity));
false, false, true, challenge, Utils.getCredentialOwnerUserId(mActivity));
}
private boolean launchConfirmationActivity(int request, @Nullable CharSequence title,

View File

@@ -64,12 +64,12 @@ public class ConfirmDeviceCredentialActivity extends Activity {
Intent intent = getIntent();
String title = intent.getStringExtra(KeyguardManager.EXTRA_TITLE);
String details = intent.getStringExtra(KeyguardManager.EXTRA_DESCRIPTION);
int userId = Utils.getEffectiveUserId(this);
int userId = Utils.getCredentialOwnerUserId(this);
if (isInternalActivity()) {
int givenUserId = intent.getIntExtra(Intent.EXTRA_USER_ID, userId);
UserManager userManager = UserManager.get(this);
if (userManager.isSameProfileGroup(givenUserId, userId)) {
userId = givenUserId;
try {
userId = Utils.getUserIdFromBundle(this, intent.getExtras());
} catch (SecurityException se) {
Log.e(TAG, "Invalid intent extra", se);
}
}
ChooseLockSettingsHelper helper = new ChooseLockSettingsHelper(this);

View File

@@ -18,8 +18,10 @@ package com.android.settings;
import android.app.Fragment;
import android.app.KeyguardManager;
import android.content.Intent;
import android.os.Bundle;
import android.os.Handler;
import android.os.UserManager;
import android.view.MenuItem;
import android.view.WindowManager;
@@ -33,7 +35,12 @@ public abstract class ConfirmDeviceCredentialBaseActivity extends SettingsActivi
@Override
protected void onCreate(Bundle savedState) {
if (getIntent().getBooleanExtra(ConfirmDeviceCredentialBaseFragment.DARK_THEME, false)) {
int credentialOwnerUserId = Utils.getCredentialOwnerUserId(this,
Utils.getUserIdFromBundle(this, getIntent().getExtras()));
if (Utils.isManagedProfile(UserManager.get(this), credentialOwnerUserId)) {
setTheme(R.style.Theme_ConfirmDeviceCredentialsWork);
} else if (getIntent().getBooleanExtra(
ConfirmDeviceCredentialBaseFragment.DARK_THEME, false)) {
setTheme(R.style.Theme_ConfirmDeviceCredentialsDark);
mDark = true;
}

View File

@@ -24,10 +24,16 @@ import android.app.IActivityManager;
import android.content.Context;
import android.content.Intent;
import android.content.IntentSender;
import android.graphics.Point;
import android.graphics.PorterDuff;
import android.graphics.drawable.Drawable;
import android.os.Bundle;
import android.os.RemoteException;
import android.os.UserManager;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.FrameLayout;
import android.widget.ImageView;
import android.widget.TextView;
@@ -80,6 +86,14 @@ public abstract class ConfirmDeviceCredentialBaseFragment extends InstrumentedFr
getActivity().finish();
}
});
int credentialOwnerUserId = Utils.getCredentialOwnerUserId(
getActivity(),
Utils.getUserIdFromBundle(
getActivity(),
getActivity().getIntent().getExtras()));
if (Utils.isManagedProfile(UserManager.get(getActivity()), credentialOwnerUserId)) {
setWorkChallengeBackground(view);
}
}
@Override
@@ -155,4 +169,20 @@ public abstract class ConfirmDeviceCredentialBaseFragment extends InstrumentedFr
}
}
}
private void setWorkChallengeBackground(View baseView) {
ImageView imageView = (ImageView) baseView.findViewById(R.id.background_image);
if (imageView != null) {
Drawable image = getResources().getDrawable(R.drawable.work_challenge_background);
image.setColorFilter(
getResources().getColor(R.color.confirm_device_credential_transparent_black),
PorterDuff.Mode.DARKEN);
imageView.setImageDrawable(image);
Point screenSize = new Point();
getActivity().getWindowManager().getDefaultDisplay().getSize(screenSize);
imageView.setLayoutParams(new FrameLayout.LayoutParams(
ViewGroup.LayoutParams.MATCH_PARENT,
screenSize.y));
}
}
}

View File

@@ -111,7 +111,7 @@ public class ConfirmLockPassword extends ConfirmDeviceCredentialBaseActivity {
mLockPatternUtils = new LockPatternUtils(getActivity());
Intent intent = getActivity().getIntent();
// Only take this argument into account if it belongs to the current profile.
mEffectiveUserId = Utils.getSameOwnerUserId(getActivity(), intent.getExtras());
mEffectiveUserId = Utils.getUserIdFromBundle(getActivity(), intent.getExtras());
}
@Override

View File

@@ -116,7 +116,7 @@ public class ConfirmLockPattern extends ConfirmDeviceCredentialBaseActivity {
mLockPatternUtils = new LockPatternUtils(getActivity());
Intent intent = getActivity().getIntent();
// Only take this argument into account if it belongs to the current profile.
mEffectiveUserId = Utils.getSameOwnerUserId(getActivity(), intent.getExtras());
mEffectiveUserId = Utils.getUserIdFromBundle(getActivity(), intent.getExtras());
}
@Override

View File

@@ -16,6 +16,7 @@
package com.android.settings;
import android.annotation.NonNull;
import android.annotation.Nullable;
import android.app.ActivityManager;
import android.app.ActivityManagerNative;
@@ -180,6 +181,19 @@ public final class Utils extends com.android.settingslib.Utils {
return false;
}
/**
* Returns the UserManager for a given context
*
* @throws IllegalStateException if no UserManager could be retrieved.
*/
public static UserManager getUserManager(Context context) {
UserManager um = UserManager.get(context);
if (um == null) {
throw new IllegalStateException("Unable to load UserManager");
}
return um;
}
/**
* Returns true if Monkey is running.
*/
@@ -569,10 +583,24 @@ public final class Utils extends com.android.settingslib.Utils {
/**
* Returns true if the current profile is a managed one.
*
* @throws IllegalArgumentException if userManager is null.
*/
public static boolean isManagedProfile(UserManager userManager) {
UserInfo currentUser = userManager.getUserInfo(userManager.getUserHandle());
return currentUser.isManagedProfile();
public static boolean isManagedProfile(@NonNull UserManager userManager) {
return isManagedProfile(userManager, UserHandle.myUserId());
}
/**
* Returns true if the userId passed in is a managed profile.
*
* @throws IllegalArgumentException if userManager is null.
*/
public static boolean isManagedProfile(@NonNull UserManager userManager, int userId) {
if (userManager == null) {
throw new IllegalArgumentException("userManager must not be null");
}
UserInfo userInfo = userManager.getUserInfo(userId);
return (userInfo != null) ? userInfo.isManagedProfile() : false;
}
/**
@@ -932,17 +960,17 @@ public final class Utils extends com.android.settingslib.Utils {
}
/**
* Returns the user id present in the bundle with {@link ChooseLockGeneric#KEY_USER_ID} if it
* Returns the user id present in the bundle with {@link Intent#EXTRA_USER_ID} if it
* belongs to the current user.
*
* @throws SecurityException if the given userId does not belong to the current user group.
*/
public static int getSameOwnerUserId(Context context, Bundle bundle) {
public static int getUserIdFromBundle(Context context, Bundle bundle) {
if (bundle == null) {
return getEffectiveUserId(context);
return getCredentialOwnerUserId(context);
}
int userId = bundle.getInt(Intent.EXTRA_USER_ID, UserHandle.myUserId());
return getSameOwnerUserId(context, userId);
return enforceSameOwner(context, userId);
}
/**
@@ -950,27 +978,28 @@ public final class Utils extends com.android.settingslib.Utils {
*
* @throws SecurityException if the given userId does not belong to the current user group.
*/
public static int getSameOwnerUserId(Context context, int userId) {
UserManager um = UserManager.get(context);
if (um != null) {
if (um.getUserProfiles().contains(new UserHandle(userId))) {
return userId;
} else {
public static int enforceSameOwner(Context context, int userId) {
UserManager um = getUserManager(context);
if (!um.getUserProfiles().contains(new UserHandle(userId))) {
throw new SecurityException("Given user id " + userId + " does not belong to user "
+ UserHandle.myUserId());
}
}
return getEffectiveUserId(context);
return userId;
}
public static int getEffectiveUserId(Context context) {
UserManager um = UserManager.get(context);
if (um != null) {
return um.getCredentialOwnerProfile(UserHandle.myUserId());
} else {
Log.e(TAG, "Unable to acquire UserManager");
return UserHandle.myUserId();
/**
* Returns the effective credential owner of the calling user.
*/
public static int getCredentialOwnerUserId(Context context) {
return getCredentialOwnerUserId(context, UserHandle.myUserId());
}
/**
* Returns the user id of the credential owner of the given user id.
*/
public static int getCredentialOwnerUserId(Context context, int userId) {
UserManager um = getUserManager(context);
return um.getCredentialOwnerProfile(userId);
}
public static int resolveResource(Context context, int attr) {