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