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}