1ed13187a745866483139e2878037e1f8427ce567Kenny Guy/* 2ed13187a745866483139e2878037e1f8427ce567Kenny Guy * Copyright (C) 2014 The Android Open Source Project 3ed13187a745866483139e2878037e1f8427ce567Kenny Guy * 4ed13187a745866483139e2878037e1f8427ce567Kenny Guy * Licensed under the Apache License, Version 2.0 (the "License"); 5ed13187a745866483139e2878037e1f8427ce567Kenny Guy * you may not use this file except in compliance with the License. 6ed13187a745866483139e2878037e1f8427ce567Kenny Guy * You may obtain a copy of the License at 7ed13187a745866483139e2878037e1f8427ce567Kenny Guy * 8ed13187a745866483139e2878037e1f8427ce567Kenny Guy * http://www.apache.org/licenses/LICENSE-2.0 9ed13187a745866483139e2878037e1f8427ce567Kenny Guy * 10ed13187a745866483139e2878037e1f8427ce567Kenny Guy * Unless required by applicable law or agreed to in writing, software 11ed13187a745866483139e2878037e1f8427ce567Kenny Guy * distributed under the License is distributed on an "AS IS" BASIS, 12ed13187a745866483139e2878037e1f8427ce567Kenny Guy * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13ed13187a745866483139e2878037e1f8427ce567Kenny Guy * See the License for the specific language governing permissions and 14ed13187a745866483139e2878037e1f8427ce567Kenny Guy * limitations under the License. 15ed13187a745866483139e2878037e1f8427ce567Kenny Guy */ 16ed13187a745866483139e2878037e1f8427ce567Kenny Guy 17ed13187a745866483139e2878037e1f8427ce567Kenny Guypackage com.android.launcher3.compat; 18ed13187a745866483139e2878037e1f8427ce567Kenny Guy 19ed13187a745866483139e2878037e1f8427ce567Kenny Guyimport android.content.Context; 2018bf8e2ffde3444d53aaa9654da02cdedd0b7cd1Sunny Goyalimport android.content.SharedPreferences; 21f9847b9bd3e5286fe10667ec12dab5b4c43355faDharmesh Mokaniimport android.content.pm.PackageManager; 22ed13187a745866483139e2878037e1f8427ce567Kenny Guyimport android.os.UserHandle; 23a52ecb0390c85afb385371bb844bb496c59ddf87Sunny Goyalimport android.os.UserManager; 248cae50d8b2b2e8f4d8ee76b6b8e51b66326abe7fRajeev Kumarimport android.util.ArrayMap; 25823fd5090209017a029460e7dbd8ab9d51d013ddSunny Goyalimport com.android.launcher3.util.LongArrayMap; 26a474a9bcf5d533ac942c58409e45e5ec6d8b4893Sunny Goyalimport com.android.launcher3.util.ManagedProfileHeuristic; 27ed13187a745866483139e2878037e1f8427ce567Kenny Guyimport java.util.ArrayList; 28c2bd8101b8e26b9ebb2c079ae6867229dad3f196Kenny Guyimport java.util.Collections; 29ed13187a745866483139e2878037e1f8427ce567Kenny Guyimport java.util.List; 30ed13187a745866483139e2878037e1f8427ce567Kenny Guy 31a52ecb0390c85afb385371bb844bb496c59ddf87Sunny Goyalpublic class UserManagerCompatVL extends UserManagerCompat { 3218bf8e2ffde3444d53aaa9654da02cdedd0b7cd1Sunny Goyal private static final String USER_CREATION_TIME_KEY = "user_creation_time_"; 3318bf8e2ffde3444d53aaa9654da02cdedd0b7cd1Sunny Goyal 34a52ecb0390c85afb385371bb844bb496c59ddf87Sunny Goyal protected final UserManager mUserManager; 35f9847b9bd3e5286fe10667ec12dab5b4c43355faDharmesh Mokani private final PackageManager mPm; 3618bf8e2ffde3444d53aaa9654da02cdedd0b7cd1Sunny Goyal private final Context mContext; 37ed13187a745866483139e2878037e1f8427ce567Kenny Guy 38a52ecb0390c85afb385371bb844bb496c59ddf87Sunny Goyal protected LongArrayMap<UserHandle> mUsers; 39a52ecb0390c85afb385371bb844bb496c59ddf87Sunny Goyal // Create a separate reverse map as LongArrayMap.indexOfValue checks if objects are same 40a52ecb0390c85afb385371bb844bb496c59ddf87Sunny Goyal // and not {@link Object#equals} 418cae50d8b2b2e8f4d8ee76b6b8e51b66326abe7fRajeev Kumar protected ArrayMap<UserHandle, Long> mUserToSerialMap; 42a52ecb0390c85afb385371bb844bb496c59ddf87Sunny Goyal 43ed13187a745866483139e2878037e1f8427ce567Kenny Guy UserManagerCompatVL(Context context) { 44a52ecb0390c85afb385371bb844bb496c59ddf87Sunny Goyal mUserManager = (UserManager) context.getSystemService(Context.USER_SERVICE); 45f9847b9bd3e5286fe10667ec12dab5b4c43355faDharmesh Mokani mPm = context.getPackageManager(); 4618bf8e2ffde3444d53aaa9654da02cdedd0b7cd1Sunny Goyal mContext = context; 47ed13187a745866483139e2878037e1f8427ce567Kenny Guy } 48ed13187a745866483139e2878037e1f8427ce567Kenny Guy 496075170b838bfe7a040bbff25c2c22859b7d6ee5Dharmesh Mokani @Override 50a52ecb0390c85afb385371bb844bb496c59ddf87Sunny Goyal public long getSerialNumberForUser(UserHandle user) { 51a52ecb0390c85afb385371bb844bb496c59ddf87Sunny Goyal synchronized (this) { 52a52ecb0390c85afb385371bb844bb496c59ddf87Sunny Goyal if (mUserToSerialMap != null) { 53a52ecb0390c85afb385371bb844bb496c59ddf87Sunny Goyal Long serial = mUserToSerialMap.get(user); 54a52ecb0390c85afb385371bb844bb496c59ddf87Sunny Goyal return serial == null ? 0 : serial; 55a52ecb0390c85afb385371bb844bb496c59ddf87Sunny Goyal } 56a52ecb0390c85afb385371bb844bb496c59ddf87Sunny Goyal } 57a52ecb0390c85afb385371bb844bb496c59ddf87Sunny Goyal return mUserManager.getSerialNumberForUser(user); 58a52ecb0390c85afb385371bb844bb496c59ddf87Sunny Goyal } 59a52ecb0390c85afb385371bb844bb496c59ddf87Sunny Goyal 60a52ecb0390c85afb385371bb844bb496c59ddf87Sunny Goyal @Override 61a52ecb0390c85afb385371bb844bb496c59ddf87Sunny Goyal public UserHandle getUserForSerialNumber(long serialNumber) { 62a52ecb0390c85afb385371bb844bb496c59ddf87Sunny Goyal synchronized (this) { 63a52ecb0390c85afb385371bb844bb496c59ddf87Sunny Goyal if (mUsers != null) { 64a52ecb0390c85afb385371bb844bb496c59ddf87Sunny Goyal return mUsers.get(serialNumber); 65a52ecb0390c85afb385371bb844bb496c59ddf87Sunny Goyal } 66a52ecb0390c85afb385371bb844bb496c59ddf87Sunny Goyal } 67a52ecb0390c85afb385371bb844bb496c59ddf87Sunny Goyal return mUserManager.getUserForSerialNumber(serialNumber); 68a52ecb0390c85afb385371bb844bb496c59ddf87Sunny Goyal } 69a52ecb0390c85afb385371bb844bb496c59ddf87Sunny Goyal 70a52ecb0390c85afb385371bb844bb496c59ddf87Sunny Goyal @Override 71a52ecb0390c85afb385371bb844bb496c59ddf87Sunny Goyal public boolean isQuietModeEnabled(UserHandle user) { 72a52ecb0390c85afb385371bb844bb496c59ddf87Sunny Goyal return false; 73a52ecb0390c85afb385371bb844bb496c59ddf87Sunny Goyal } 74a52ecb0390c85afb385371bb844bb496c59ddf87Sunny Goyal 75a52ecb0390c85afb385371bb844bb496c59ddf87Sunny Goyal @Override 76a52ecb0390c85afb385371bb844bb496c59ddf87Sunny Goyal public boolean isUserUnlocked(UserHandle user) { 77a52ecb0390c85afb385371bb844bb496c59ddf87Sunny Goyal return true; 78a52ecb0390c85afb385371bb844bb496c59ddf87Sunny Goyal } 79a52ecb0390c85afb385371bb844bb496c59ddf87Sunny Goyal 80a52ecb0390c85afb385371bb844bb496c59ddf87Sunny Goyal @Override 81a52ecb0390c85afb385371bb844bb496c59ddf87Sunny Goyal public boolean isDemoUser() { 82a52ecb0390c85afb385371bb844bb496c59ddf87Sunny Goyal return false; 83a52ecb0390c85afb385371bb844bb496c59ddf87Sunny Goyal } 84a52ecb0390c85afb385371bb844bb496c59ddf87Sunny Goyal 85a52ecb0390c85afb385371bb844bb496c59ddf87Sunny Goyal @Override 86823fd5090209017a029460e7dbd8ab9d51d013ddSunny Goyal public void enableAndResetCache() { 87823fd5090209017a029460e7dbd8ab9d51d013ddSunny Goyal synchronized (this) { 88a2a039b66f05a1164f954387b1c12a8fb4063e92Sunny Goyal mUsers = new LongArrayMap<>(); 898cae50d8b2b2e8f4d8ee76b6b8e51b66326abe7fRajeev Kumar mUserToSerialMap = new ArrayMap<>(); 90823fd5090209017a029460e7dbd8ab9d51d013ddSunny Goyal List<UserHandle> users = mUserManager.getUserProfiles(); 91823fd5090209017a029460e7dbd8ab9d51d013ddSunny Goyal if (users != null) { 92823fd5090209017a029460e7dbd8ab9d51d013ddSunny Goyal for (UserHandle user : users) { 93a2a039b66f05a1164f954387b1c12a8fb4063e92Sunny Goyal long serial = mUserManager.getSerialNumberForUser(user); 947c74e4ae641e76f73d74348e293c244a157f6585Sunny Goyal mUsers.put(serial, user); 957c74e4ae641e76f73d74348e293c244a157f6585Sunny Goyal mUserToSerialMap.put(user, serial); 96823fd5090209017a029460e7dbd8ab9d51d013ddSunny Goyal } 97823fd5090209017a029460e7dbd8ab9d51d013ddSunny Goyal } 98823fd5090209017a029460e7dbd8ab9d51d013ddSunny Goyal } 99823fd5090209017a029460e7dbd8ab9d51d013ddSunny Goyal } 100823fd5090209017a029460e7dbd8ab9d51d013ddSunny Goyal 101823fd5090209017a029460e7dbd8ab9d51d013ddSunny Goyal @Override 1027c74e4ae641e76f73d74348e293c244a157f6585Sunny Goyal public List<UserHandle> getUserProfiles() { 103823fd5090209017a029460e7dbd8ab9d51d013ddSunny Goyal synchronized (this) { 104823fd5090209017a029460e7dbd8ab9d51d013ddSunny Goyal if (mUsers != null) { 1057c74e4ae641e76f73d74348e293c244a157f6585Sunny Goyal return new ArrayList<>(mUserToSerialMap.keySet()); 106823fd5090209017a029460e7dbd8ab9d51d013ddSunny Goyal } 107823fd5090209017a029460e7dbd8ab9d51d013ddSunny Goyal } 108823fd5090209017a029460e7dbd8ab9d51d013ddSunny Goyal 109c2bd8101b8e26b9ebb2c079ae6867229dad3f196Kenny Guy List<UserHandle> users = mUserManager.getUserProfiles(); 1107c74e4ae641e76f73d74348e293c244a157f6585Sunny Goyal return users == null ? Collections.<UserHandle>emptyList() : users; 111ed13187a745866483139e2878037e1f8427ce567Kenny Guy } 112ed13187a745866483139e2878037e1f8427ce567Kenny Guy 1136075170b838bfe7a040bbff25c2c22859b7d6ee5Dharmesh Mokani @Override 1147c74e4ae641e76f73d74348e293c244a157f6585Sunny Goyal public CharSequence getBadgedLabelForUser(CharSequence label, UserHandle user) { 115c2bd8101b8e26b9ebb2c079ae6867229dad3f196Kenny Guy if (user == null) { 116c2bd8101b8e26b9ebb2c079ae6867229dad3f196Kenny Guy return label; 117ed13187a745866483139e2878037e1f8427ce567Kenny Guy } 1187c74e4ae641e76f73d74348e293c244a157f6585Sunny Goyal return mPm.getUserBadgedLabel(label, user); 119ed13187a745866483139e2878037e1f8427ce567Kenny Guy } 12018bf8e2ffde3444d53aaa9654da02cdedd0b7cd1Sunny Goyal 12118bf8e2ffde3444d53aaa9654da02cdedd0b7cd1Sunny Goyal @Override 1227c74e4ae641e76f73d74348e293c244a157f6585Sunny Goyal public long getUserCreationTime(UserHandle user) { 123a474a9bcf5d533ac942c58409e45e5ec6d8b4893Sunny Goyal SharedPreferences prefs = ManagedProfileHeuristic.prefs(mContext); 12418bf8e2ffde3444d53aaa9654da02cdedd0b7cd1Sunny Goyal String key = USER_CREATION_TIME_KEY + getSerialNumberForUser(user); 12518bf8e2ffde3444d53aaa9654da02cdedd0b7cd1Sunny Goyal if (!prefs.contains(key)) { 12618bf8e2ffde3444d53aaa9654da02cdedd0b7cd1Sunny Goyal prefs.edit().putLong(key, System.currentTimeMillis()).apply(); 12718bf8e2ffde3444d53aaa9654da02cdedd0b7cd1Sunny Goyal } 12818bf8e2ffde3444d53aaa9654da02cdedd0b7cd1Sunny Goyal return prefs.getLong(key, 0); 12918bf8e2ffde3444d53aaa9654da02cdedd0b7cd1Sunny Goyal } 130ed13187a745866483139e2878037e1f8427ce567Kenny Guy} 131ed13187a745866483139e2878037e1f8427ce567Kenny Guy 132