diff options
author | Robert Horvath <robhor@google.com> | 2020-03-13 11:41:50 +0100 |
---|---|---|
committer | Robert Horvath <robhor@google.com> | 2020-04-17 13:23:28 +0200 |
commit | 2de92474a79a47502a6f2a5805a05e147848de7d (patch) | |
tree | a499729696f0d22cbdfc865137df3f9b695cc728 | |
parent | b22f2113544f2bcb6929857df0de8b17c41dfb8b (diff) | |
download | tvsystem-2de92474a79a47502a6f2a5805a05e147848de7d.tar.gz |
Add user management APIs to TvSystem
To be used for profile management applications.
These APIs mostly just forward calls to hidden system APIs.
The #createManagedProfile method additionally modifies the passed in
list to make sure disallowed packages are not installed for the new
profile, and required packages are.
All APIs operate on the user that owns the passed in context.
Bug: 149465312
Test: m
Test: Call method from support library in sample app
Change-Id: I0b96916071e1facdf4e01dc4936580e7daf44375
(cherry picked from commit 39f53e794161f311aeea5df13b0e9dfd0b20d0ea)
-rw-r--r-- | Android.bp | 1 | ||||
-rw-r--r-- | api/current.txt | 25 | ||||
-rw-r--r-- | java/com/android/libraries/tv/tvsystem/user/ITvUserManager.java | 55 | ||||
-rw-r--r-- | java/com/android/libraries/tv/tvsystem/user/TvUserManager.java | 124 |
4 files changed, 205 insertions, 0 deletions
@@ -18,6 +18,7 @@ java_sdk_library { api_packages: [ "com.android.libraries.tv.tvsystem", "com.android.libraries.tv.tvsystem.display", + "com.android.libraries.tv.tvsystem.user", "com.android.libraries.tv.tvsystem.wifi" ], dex_preopt: { diff --git a/api/current.txt b/api/current.txt index fa68a6a..bc42215 100644 --- a/api/current.txt +++ b/api/current.txt @@ -27,3 +27,28 @@ package com.android.libraries.tv.tvsystem.display { } +package com.android.libraries.tv.tvsystem.user { + + public interface ITvUserManager { + method @Nullable public android.os.UserHandle createManagedProfile(@NonNull String, @Nullable String[]) throws android.os.UserManager.UserOperationException; + method @Nullable public android.graphics.Bitmap getUserIcon(); + method @NonNull public String getUserName(); + method @NonNull public java.util.List<android.os.UserHandle> getUserProfiles(boolean); + method public boolean isManagedProfile(); + method public void setUserIcon(@NonNull android.graphics.Bitmap); + method public void setUserName(@Nullable String); + } + + public final class TvUserManager implements com.android.libraries.tv.tvsystem.user.ITvUserManager { + ctor public TvUserManager(android.content.Context); + method public android.os.UserHandle createManagedProfile(@NonNull String, @Nullable String[]); + method @Nullable public android.graphics.Bitmap getUserIcon(); + method @NonNull public String getUserName(); + method @NonNull public java.util.List<android.os.UserHandle> getUserProfiles(boolean); + method public boolean isManagedProfile(); + method public void setUserIcon(@NonNull android.graphics.Bitmap); + method public void setUserName(@Nullable String); + } + +} + diff --git a/java/com/android/libraries/tv/tvsystem/user/ITvUserManager.java b/java/com/android/libraries/tv/tvsystem/user/ITvUserManager.java new file mode 100644 index 0000000..4a1081e --- /dev/null +++ b/java/com/android/libraries/tv/tvsystem/user/ITvUserManager.java @@ -0,0 +1,55 @@ +/* + * Copyright (C) 2020 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.libraries.tv.tvsystem.user; + +import android.accounts.AccountManagerCallback; +import android.accounts.AccountManagerFuture; +import android.annotation.NonNull; +import android.annotation.Nullable; +import android.app.Activity; +import android.graphics.Bitmap; +import android.os.Bundle; +import android.os.Handler; +import android.os.UserHandle; +import android.os.UserManager; + +import java.util.List; + +/** + * Provides access to hidden {@link android.os.UserManager} APIs. + * All methods here are user handle aware - they act on the user that owns the passed in Context. + */ +public interface ITvUserManager { + @Nullable + UserHandle createManagedProfile(@NonNull String name, @Nullable String[] disallowedPackages) + throws UserManager.UserOperationException; + + @NonNull + List<UserHandle> getUserProfiles(boolean enabledOnly); + + @NonNull + String getUserName(); + + void setUserName(@Nullable String name); + + @Nullable + Bitmap getUserIcon(); + + void setUserIcon(@NonNull Bitmap icon); + + boolean isManagedProfile(); +} diff --git a/java/com/android/libraries/tv/tvsystem/user/TvUserManager.java b/java/com/android/libraries/tv/tvsystem/user/TvUserManager.java new file mode 100644 index 0000000..b5a7024 --- /dev/null +++ b/java/com/android/libraries/tv/tvsystem/user/TvUserManager.java @@ -0,0 +1,124 @@ +/* + * Copyright (C) 2020 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.libraries.tv.tvsystem.user; + +import android.annotation.NonNull; +import android.annotation.Nullable; +import android.content.Context; +import android.content.pm.UserInfo; +import android.content.res.Resources; +import android.graphics.Bitmap; +import android.os.UserHandle; +import android.os.UserManager; + +import com.android.internal.R; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.HashSet; +import java.util.List; +import java.util.Set; + +public final class TvUserManager implements ITvUserManager { + private final UserManager mUserManager; + private final int mUserId; + + private final Set<String> mRequiredSystemApps = new HashSet<>(); + private final Set<String> mDisallowedSystemApps = new HashSet<>(); + + public TvUserManager(Context context) { + mUserId = context.getUserId(); + mUserManager = context.getSystemService(UserManager.class); + populateSystemAppsList(context.getResources()); + } + + private void populateSystemAppsList(@NonNull Resources resources) { + Collections.addAll(mRequiredSystemApps, + resources.getStringArray(R.array.required_apps_managed_profile)); + Collections.addAll(mRequiredSystemApps, + resources.getStringArray(R.array.vendor_required_apps_managed_profile)); + + Collections.addAll(mDisallowedSystemApps, + resources.getStringArray(R.array.disallowed_apps_managed_profile)); + Collections.addAll(mDisallowedSystemApps, + resources.getStringArray(R.array.vendor_disallowed_apps_managed_profile)); + } + + @Override + public UserHandle createManagedProfile(@NonNull String name, + @Nullable String[] disallowedPackages) { + UserInfo profileInfo = mUserManager.createProfileForUser(name, + UserManager.USER_TYPE_PROFILE_MANAGED, 0 /* flags */, mUserId, + filterDisallowedPackages(disallowedPackages)); + if (profileInfo != null) { + return profileInfo.getUserHandle(); + } + + return null; + } + + @NonNull + private String[] filterDisallowedPackages(@Nullable String[] disallowedPackages) { + List<String> packages = new ArrayList<>(); + + if (disallowedPackages != null) { + Collections.addAll(packages, disallowedPackages); + } + + packages.addAll(mDisallowedSystemApps); + packages.removeAll(mRequiredSystemApps); + + return packages.toArray(new String[0]); + } + + @Override + @NonNull + public List<UserHandle> getUserProfiles(boolean enabledOnly) { + int[] userIds = mUserManager.getProfileIds(mUserId, enabledOnly); + List<UserHandle> result = new ArrayList<>(userIds.length); + for (int userId : userIds) { + result.add(UserHandle.of(userId)); + } + return result; + } + + @Override + @NonNull + public String getUserName() { + return mUserManager.getUserInfo(mUserId).name; + } + + @Override + public void setUserName(@Nullable String name) { + mUserManager.setUserName(mUserId, name); + } + + @Override + @Nullable + public Bitmap getUserIcon() { + return mUserManager.getUserIcon(mUserId); + } + + @Override + public void setUserIcon(@NonNull Bitmap icon) { + mUserManager.setUserIcon(mUserId, icon); + } + + @Override + public boolean isManagedProfile() { + return mUserManager.isManagedProfile(mUserId); + } +} |