summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-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);
+ }
+}