diff options
-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); + } +} |