1b4cd42a1df69ec887d0c66e8fe6fe1f27ebbf9bcSunny Goyalpackage com.android.launcher3.util;
2b4cd42a1df69ec887d0c66e8fe6fe1f27ebbf9bcSunny Goyal
3b4cd42a1df69ec887d0c66e8fe6fe1f27ebbf9bcSunny Goyal/**
4b4cd42a1df69ec887d0c66e8fe6fe1f27ebbf9bcSunny Goyal * Copyright (C) 2015 The Android Open Source Project
5b4cd42a1df69ec887d0c66e8fe6fe1f27ebbf9bcSunny Goyal *
6b4cd42a1df69ec887d0c66e8fe6fe1f27ebbf9bcSunny Goyal * Licensed under the Apache License, Version 2.0 (the "License");
7b4cd42a1df69ec887d0c66e8fe6fe1f27ebbf9bcSunny Goyal * you may not use this file except in compliance with the License.
8b4cd42a1df69ec887d0c66e8fe6fe1f27ebbf9bcSunny Goyal * You may obtain a copy of the License at
9b4cd42a1df69ec887d0c66e8fe6fe1f27ebbf9bcSunny Goyal *
10b4cd42a1df69ec887d0c66e8fe6fe1f27ebbf9bcSunny Goyal *      http://www.apache.org/licenses/LICENSE-2.0
11b4cd42a1df69ec887d0c66e8fe6fe1f27ebbf9bcSunny Goyal *
12b4cd42a1df69ec887d0c66e8fe6fe1f27ebbf9bcSunny Goyal * Unless required by applicable law or agreed to in writing, software
13b4cd42a1df69ec887d0c66e8fe6fe1f27ebbf9bcSunny Goyal * distributed under the License is distributed on an "AS IS" BASIS,
14b4cd42a1df69ec887d0c66e8fe6fe1f27ebbf9bcSunny Goyal * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15b4cd42a1df69ec887d0c66e8fe6fe1f27ebbf9bcSunny Goyal * See the License for the specific language governing permissions and
16b4cd42a1df69ec887d0c66e8fe6fe1f27ebbf9bcSunny Goyal * limitations under the License.
17b4cd42a1df69ec887d0c66e8fe6fe1f27ebbf9bcSunny Goyal */
18b4cd42a1df69ec887d0c66e8fe6fe1f27ebbf9bcSunny Goyal
19b4cd42a1df69ec887d0c66e8fe6fe1f27ebbf9bcSunny Goyalimport android.content.ComponentName;
206b1c73f50a99a215c923aa0caca8e63c593a4eb2Winson Chungimport android.content.Context;
21b4cd42a1df69ec887d0c66e8fe6fe1f27ebbf9bcSunny Goyalimport com.android.launcher3.compat.UserHandleCompat;
226b1c73f50a99a215c923aa0caca8e63c593a4eb2Winson Chungimport com.android.launcher3.compat.UserManagerCompat;
23b4cd42a1df69ec887d0c66e8fe6fe1f27ebbf9bcSunny Goyal
24b4cd42a1df69ec887d0c66e8fe6fe1f27ebbf9bcSunny Goyalimport java.util.Arrays;
25b4cd42a1df69ec887d0c66e8fe6fe1f27ebbf9bcSunny Goyal
26b4cd42a1df69ec887d0c66e8fe6fe1f27ebbf9bcSunny Goyalpublic class ComponentKey {
27b4cd42a1df69ec887d0c66e8fe6fe1f27ebbf9bcSunny Goyal
28b4cd42a1df69ec887d0c66e8fe6fe1f27ebbf9bcSunny Goyal    public final ComponentName componentName;
29b4cd42a1df69ec887d0c66e8fe6fe1f27ebbf9bcSunny Goyal    public final UserHandleCompat user;
30b4cd42a1df69ec887d0c66e8fe6fe1f27ebbf9bcSunny Goyal
31b4cd42a1df69ec887d0c66e8fe6fe1f27ebbf9bcSunny Goyal    private final int mHashCode;
32b4cd42a1df69ec887d0c66e8fe6fe1f27ebbf9bcSunny Goyal
33b4cd42a1df69ec887d0c66e8fe6fe1f27ebbf9bcSunny Goyal    public ComponentKey(ComponentName componentName, UserHandleCompat user) {
34b4cd42a1df69ec887d0c66e8fe6fe1f27ebbf9bcSunny Goyal        assert (componentName != null);
35b4cd42a1df69ec887d0c66e8fe6fe1f27ebbf9bcSunny Goyal        assert (user != null);
36b4cd42a1df69ec887d0c66e8fe6fe1f27ebbf9bcSunny Goyal        this.componentName = componentName;
37b4cd42a1df69ec887d0c66e8fe6fe1f27ebbf9bcSunny Goyal        this.user = user;
38b4cd42a1df69ec887d0c66e8fe6fe1f27ebbf9bcSunny Goyal        mHashCode = Arrays.hashCode(new Object[] {componentName, user});
39b4cd42a1df69ec887d0c66e8fe6fe1f27ebbf9bcSunny Goyal
40b4cd42a1df69ec887d0c66e8fe6fe1f27ebbf9bcSunny Goyal    }
41b4cd42a1df69ec887d0c66e8fe6fe1f27ebbf9bcSunny Goyal
426b1c73f50a99a215c923aa0caca8e63c593a4eb2Winson Chung    /**
436b1c73f50a99a215c923aa0caca8e63c593a4eb2Winson Chung     * Creates a new component key from an encoded component key string in the form of
446b1c73f50a99a215c923aa0caca8e63c593a4eb2Winson Chung     * [flattenedComponentString#userId].  If the userId is not present, then it defaults
456b1c73f50a99a215c923aa0caca8e63c593a4eb2Winson Chung     * to the current user.
466b1c73f50a99a215c923aa0caca8e63c593a4eb2Winson Chung     */
476b1c73f50a99a215c923aa0caca8e63c593a4eb2Winson Chung    public ComponentKey(Context context, String componentKeyStr) {
486b1c73f50a99a215c923aa0caca8e63c593a4eb2Winson Chung        int userDelimiterIndex = componentKeyStr.indexOf("#");
496b1c73f50a99a215c923aa0caca8e63c593a4eb2Winson Chung        if (userDelimiterIndex != -1) {
506b1c73f50a99a215c923aa0caca8e63c593a4eb2Winson Chung            String componentStr = componentKeyStr.substring(0, userDelimiterIndex);
516b1c73f50a99a215c923aa0caca8e63c593a4eb2Winson Chung            Long componentUser = Long.valueOf(componentKeyStr.substring(userDelimiterIndex + 1));
526b1c73f50a99a215c923aa0caca8e63c593a4eb2Winson Chung            componentName = ComponentName.unflattenFromString(componentStr);
536b1c73f50a99a215c923aa0caca8e63c593a4eb2Winson Chung            user = UserManagerCompat.getInstance(context)
546b1c73f50a99a215c923aa0caca8e63c593a4eb2Winson Chung                    .getUserForSerialNumber(componentUser.longValue());
556b1c73f50a99a215c923aa0caca8e63c593a4eb2Winson Chung        } else {
566b1c73f50a99a215c923aa0caca8e63c593a4eb2Winson Chung            // No user provided, default to the current user
576b1c73f50a99a215c923aa0caca8e63c593a4eb2Winson Chung            componentName = ComponentName.unflattenFromString(componentKeyStr);
586b1c73f50a99a215c923aa0caca8e63c593a4eb2Winson Chung            user = UserHandleCompat.myUserHandle();
596b1c73f50a99a215c923aa0caca8e63c593a4eb2Winson Chung        }
606b1c73f50a99a215c923aa0caca8e63c593a4eb2Winson Chung        mHashCode = Arrays.hashCode(new Object[] {componentName, user});
616b1c73f50a99a215c923aa0caca8e63c593a4eb2Winson Chung    }
626b1c73f50a99a215c923aa0caca8e63c593a4eb2Winson Chung
636b1c73f50a99a215c923aa0caca8e63c593a4eb2Winson Chung    /**
646b1c73f50a99a215c923aa0caca8e63c593a4eb2Winson Chung     * Encodes a component key as a string of the form [flattenedComponentString#userId].
656b1c73f50a99a215c923aa0caca8e63c593a4eb2Winson Chung     */
666b1c73f50a99a215c923aa0caca8e63c593a4eb2Winson Chung    public String flattenToString(Context context) {
676b1c73f50a99a215c923aa0caca8e63c593a4eb2Winson Chung        return componentName.flattenToString() + "#" +
686b1c73f50a99a215c923aa0caca8e63c593a4eb2Winson Chung                UserManagerCompat.getInstance(context).getSerialNumberForUser(user);
696b1c73f50a99a215c923aa0caca8e63c593a4eb2Winson Chung    }
706b1c73f50a99a215c923aa0caca8e63c593a4eb2Winson Chung
71b4cd42a1df69ec887d0c66e8fe6fe1f27ebbf9bcSunny Goyal    @Override
72b4cd42a1df69ec887d0c66e8fe6fe1f27ebbf9bcSunny Goyal    public int hashCode() {
73b4cd42a1df69ec887d0c66e8fe6fe1f27ebbf9bcSunny Goyal        return mHashCode;
74b4cd42a1df69ec887d0c66e8fe6fe1f27ebbf9bcSunny Goyal    }
75b4cd42a1df69ec887d0c66e8fe6fe1f27ebbf9bcSunny Goyal
76b4cd42a1df69ec887d0c66e8fe6fe1f27ebbf9bcSunny Goyal    @Override
77b4cd42a1df69ec887d0c66e8fe6fe1f27ebbf9bcSunny Goyal    public boolean equals(Object o) {
78b4cd42a1df69ec887d0c66e8fe6fe1f27ebbf9bcSunny Goyal        ComponentKey other = (ComponentKey) o;
79b4cd42a1df69ec887d0c66e8fe6fe1f27ebbf9bcSunny Goyal        return other.componentName.equals(componentName) && other.user.equals(user);
80b4cd42a1df69ec887d0c66e8fe6fe1f27ebbf9bcSunny Goyal    }
81b4cd42a1df69ec887d0c66e8fe6fe1f27ebbf9bcSunny Goyal}