summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRobert Horvath <robhor@google.com>2020-03-13 11:41:50 +0100
committerRobert Horvath <robhor@google.com>2020-04-17 13:23:28 +0200
commit2de92474a79a47502a6f2a5805a05e147848de7d (patch)
treea499729696f0d22cbdfc865137df3f9b695cc728
parentb22f2113544f2bcb6929857df0de8b17c41dfb8b (diff)
downloadtvsystem-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.bp1
-rw-r--r--api/current.txt25
-rw-r--r--java/com/android/libraries/tv/tvsystem/user/ITvUserManager.java55
-rw-r--r--java/com/android/libraries/tv/tvsystem/user/TvUserManager.java124
4 files changed, 205 insertions, 0 deletions
diff --git a/Android.bp b/Android.bp
index f1c2c84..9bc6cab 100644
--- a/Android.bp
+++ b/Android.bp
@@ -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);
+ }
+}