SessionToken2Impl.java revision 5830d047eda8c4b9401214b590efbf1b9e8a1622
1dd4397861fd98aefae95e6d6036a96f499eaf8b1Jaewan Kim/* 2dd4397861fd98aefae95e6d6036a96f499eaf8b1Jaewan Kim * Copyright 2018 The Android Open Source Project 3dd4397861fd98aefae95e6d6036a96f499eaf8b1Jaewan Kim * 4dd4397861fd98aefae95e6d6036a96f499eaf8b1Jaewan Kim * Licensed under the Apache License, Version 2.0 (the "License"); 5dd4397861fd98aefae95e6d6036a96f499eaf8b1Jaewan Kim * you may not use this file except in compliance with the License. 6dd4397861fd98aefae95e6d6036a96f499eaf8b1Jaewan Kim * You may obtain a copy of the License at 7dd4397861fd98aefae95e6d6036a96f499eaf8b1Jaewan Kim * 8dd4397861fd98aefae95e6d6036a96f499eaf8b1Jaewan Kim * http://www.apache.org/licenses/LICENSE-2.0 9dd4397861fd98aefae95e6d6036a96f499eaf8b1Jaewan Kim * 10dd4397861fd98aefae95e6d6036a96f499eaf8b1Jaewan Kim * Unless required by applicable law or agreed to in writing, software 11dd4397861fd98aefae95e6d6036a96f499eaf8b1Jaewan Kim * distributed under the License is distributed on an "AS IS" BASIS, 12dd4397861fd98aefae95e6d6036a96f499eaf8b1Jaewan Kim * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13dd4397861fd98aefae95e6d6036a96f499eaf8b1Jaewan Kim * See the License for the specific language governing permissions and 14dd4397861fd98aefae95e6d6036a96f499eaf8b1Jaewan Kim * limitations under the License. 15dd4397861fd98aefae95e6d6036a96f499eaf8b1Jaewan Kim */ 16dd4397861fd98aefae95e6d6036a96f499eaf8b1Jaewan Kim 17dd4397861fd98aefae95e6d6036a96f499eaf8b1Jaewan Kimpackage com.android.media; 18dd4397861fd98aefae95e6d6036a96f499eaf8b1Jaewan Kim 19dd4397861fd98aefae95e6d6036a96f499eaf8b1Jaewan Kimimport static android.media.SessionToken2.TYPE_SESSION; 20dd4397861fd98aefae95e6d6036a96f499eaf8b1Jaewan Kimimport static android.media.SessionToken2.TYPE_SESSION_SERVICE; 21dd4397861fd98aefae95e6d6036a96f499eaf8b1Jaewan Kimimport static android.media.SessionToken2.TYPE_LIBRARY_SERVICE; 22dd4397861fd98aefae95e6d6036a96f499eaf8b1Jaewan Kim 23dd4397861fd98aefae95e6d6036a96f499eaf8b1Jaewan Kimimport android.content.Context; 24dd4397861fd98aefae95e6d6036a96f499eaf8b1Jaewan Kimimport android.content.Intent; 25dd4397861fd98aefae95e6d6036a96f499eaf8b1Jaewan Kimimport android.content.pm.PackageManager; 26dd4397861fd98aefae95e6d6036a96f499eaf8b1Jaewan Kimimport android.content.pm.PackageManager.NameNotFoundException; 27dd4397861fd98aefae95e6d6036a96f499eaf8b1Jaewan Kimimport android.content.pm.ResolveInfo; 28dd4397861fd98aefae95e6d6036a96f499eaf8b1Jaewan Kimimport android.media.MediaLibraryService2; 29dd4397861fd98aefae95e6d6036a96f499eaf8b1Jaewan Kimimport android.media.MediaSessionService2; 30dd4397861fd98aefae95e6d6036a96f499eaf8b1Jaewan Kimimport android.media.SessionToken2; 31dd4397861fd98aefae95e6d6036a96f499eaf8b1Jaewan Kimimport android.media.SessionToken2.TokenType; 32dd4397861fd98aefae95e6d6036a96f499eaf8b1Jaewan Kimimport android.media.update.SessionToken2Provider; 33dd4397861fd98aefae95e6d6036a96f499eaf8b1Jaewan Kimimport android.os.Bundle; 34dd4397861fd98aefae95e6d6036a96f499eaf8b1Jaewan Kimimport android.os.IBinder; 35dd4397861fd98aefae95e6d6036a96f499eaf8b1Jaewan Kimimport android.text.TextUtils; 36dd4397861fd98aefae95e6d6036a96f499eaf8b1Jaewan Kim 37dd4397861fd98aefae95e6d6036a96f499eaf8b1Jaewan Kimpublic class SessionToken2Impl implements SessionToken2Provider { 38dd4397861fd98aefae95e6d6036a96f499eaf8b1Jaewan Kim private static final String KEY_UID = "android.media.token.uid"; 39dd4397861fd98aefae95e6d6036a96f499eaf8b1Jaewan Kim private static final String KEY_TYPE = "android.media.token.type"; 40dd4397861fd98aefae95e6d6036a96f499eaf8b1Jaewan Kim private static final String KEY_PACKAGE_NAME = "android.media.token.package_name"; 41dd4397861fd98aefae95e6d6036a96f499eaf8b1Jaewan Kim private static final String KEY_SERVICE_NAME = "android.media.token.service_name"; 42dd4397861fd98aefae95e6d6036a96f499eaf8b1Jaewan Kim private static final String KEY_ID = "android.media.token.id"; 43dd4397861fd98aefae95e6d6036a96f499eaf8b1Jaewan Kim private static final String KEY_SESSION_BINDER = "android.media.token.session_binder"; 44dd4397861fd98aefae95e6d6036a96f499eaf8b1Jaewan Kim 45dd4397861fd98aefae95e6d6036a96f499eaf8b1Jaewan Kim private final SessionToken2 mInstance; 46dd4397861fd98aefae95e6d6036a96f499eaf8b1Jaewan Kim private final int mUid; 47dd4397861fd98aefae95e6d6036a96f499eaf8b1Jaewan Kim private final @TokenType int mType; 48dd4397861fd98aefae95e6d6036a96f499eaf8b1Jaewan Kim private final String mPackageName; 49dd4397861fd98aefae95e6d6036a96f499eaf8b1Jaewan Kim private final String mServiceName; 50dd4397861fd98aefae95e6d6036a96f499eaf8b1Jaewan Kim private final String mId; 51dd4397861fd98aefae95e6d6036a96f499eaf8b1Jaewan Kim private final IMediaSession2 mSessionBinder; 52dd4397861fd98aefae95e6d6036a96f499eaf8b1Jaewan Kim 535830d047eda8c4b9401214b590efbf1b9e8a1622Jaewan Kim /** 545830d047eda8c4b9401214b590efbf1b9e8a1622Jaewan Kim * Public constructor for the legacy support (i.e. browser can try connecting to any browser service 555830d047eda8c4b9401214b590efbf1b9e8a1622Jaewan Kim * if it knows the service name) 565830d047eda8c4b9401214b590efbf1b9e8a1622Jaewan Kim */ 575830d047eda8c4b9401214b590efbf1b9e8a1622Jaewan Kim public SessionToken2Impl(Context context, SessionToken2 instance, 585830d047eda8c4b9401214b590efbf1b9e8a1622Jaewan Kim String packageName, String serviceName, int uid) { 595830d047eda8c4b9401214b590efbf1b9e8a1622Jaewan Kim if (TextUtils.isEmpty(packageName)) { 605830d047eda8c4b9401214b590efbf1b9e8a1622Jaewan Kim throw new IllegalArgumentException("package name shouldn't be null"); 615830d047eda8c4b9401214b590efbf1b9e8a1622Jaewan Kim } 625830d047eda8c4b9401214b590efbf1b9e8a1622Jaewan Kim if (TextUtils.isEmpty(serviceName)) { 635830d047eda8c4b9401214b590efbf1b9e8a1622Jaewan Kim throw new IllegalArgumentException("service name shouldn't be null"); 645830d047eda8c4b9401214b590efbf1b9e8a1622Jaewan Kim } 65dd4397861fd98aefae95e6d6036a96f499eaf8b1Jaewan Kim mInstance = instance; 665830d047eda8c4b9401214b590efbf1b9e8a1622Jaewan Kim // Calculate uid if it's not specified. 675830d047eda8c4b9401214b590efbf1b9e8a1622Jaewan Kim final PackageManager manager = context.getPackageManager(); 68dd4397861fd98aefae95e6d6036a96f499eaf8b1Jaewan Kim if (uid < 0) { 69dd4397861fd98aefae95e6d6036a96f499eaf8b1Jaewan Kim try { 70dd4397861fd98aefae95e6d6036a96f499eaf8b1Jaewan Kim uid = manager.getPackageUid(packageName, 0); 71dd4397861fd98aefae95e6d6036a96f499eaf8b1Jaewan Kim } catch (NameNotFoundException e) { 725830d047eda8c4b9401214b590efbf1b9e8a1622Jaewan Kim throw new IllegalArgumentException("Cannot find package " + packageName); 73dd4397861fd98aefae95e6d6036a96f499eaf8b1Jaewan Kim } 74dd4397861fd98aefae95e6d6036a96f499eaf8b1Jaewan Kim } 75dd4397861fd98aefae95e6d6036a96f499eaf8b1Jaewan Kim mUid = uid; 765830d047eda8c4b9401214b590efbf1b9e8a1622Jaewan Kim // calculate id and type 775830d047eda8c4b9401214b590efbf1b9e8a1622Jaewan Kim Intent serviceIntent = new Intent(MediaLibraryService2.SERVICE_INTERFACE); 785830d047eda8c4b9401214b590efbf1b9e8a1622Jaewan Kim serviceIntent.setClassName(packageName, serviceName); 795830d047eda8c4b9401214b590efbf1b9e8a1622Jaewan Kim String id = getSessionId(manager.resolveService(serviceIntent, 805830d047eda8c4b9401214b590efbf1b9e8a1622Jaewan Kim PackageManager.GET_META_DATA)); 815830d047eda8c4b9401214b590efbf1b9e8a1622Jaewan Kim int type = TYPE_LIBRARY_SERVICE; 825830d047eda8c4b9401214b590efbf1b9e8a1622Jaewan Kim if (id == null) { 835830d047eda8c4b9401214b590efbf1b9e8a1622Jaewan Kim // retry with session service 84dd4397861fd98aefae95e6d6036a96f499eaf8b1Jaewan Kim serviceIntent.setClassName(packageName, serviceName); 85dd4397861fd98aefae95e6d6036a96f499eaf8b1Jaewan Kim id = getSessionId(manager.resolveService(serviceIntent, 86dd4397861fd98aefae95e6d6036a96f499eaf8b1Jaewan Kim PackageManager.GET_META_DATA)); 875830d047eda8c4b9401214b590efbf1b9e8a1622Jaewan Kim type = TYPE_SESSION_SERVICE; 88dd4397861fd98aefae95e6d6036a96f499eaf8b1Jaewan Kim } 895830d047eda8c4b9401214b590efbf1b9e8a1622Jaewan Kim if (id == null) { 905830d047eda8c4b9401214b590efbf1b9e8a1622Jaewan Kim throw new IllegalArgumentException("service " + serviceName + " doesn't implement" 915830d047eda8c4b9401214b590efbf1b9e8a1622Jaewan Kim + " session service nor library service"); 925830d047eda8c4b9401214b590efbf1b9e8a1622Jaewan Kim } 935830d047eda8c4b9401214b590efbf1b9e8a1622Jaewan Kim mId = id; 945830d047eda8c4b9401214b590efbf1b9e8a1622Jaewan Kim mType = type; 955830d047eda8c4b9401214b590efbf1b9e8a1622Jaewan Kim mPackageName = packageName; 965830d047eda8c4b9401214b590efbf1b9e8a1622Jaewan Kim mServiceName = serviceName; 975830d047eda8c4b9401214b590efbf1b9e8a1622Jaewan Kim mSessionBinder = null; 985830d047eda8c4b9401214b590efbf1b9e8a1622Jaewan Kim } 995830d047eda8c4b9401214b590efbf1b9e8a1622Jaewan Kim 1005830d047eda8c4b9401214b590efbf1b9e8a1622Jaewan Kim public SessionToken2Impl(Context context, int uid, int type, 1015830d047eda8c4b9401214b590efbf1b9e8a1622Jaewan Kim String packageName, String serviceName, String id, IMediaSession2 sessionBinder) { 1025830d047eda8c4b9401214b590efbf1b9e8a1622Jaewan Kim // TODO(jaewan): Add sanity check 1035830d047eda8c4b9401214b590efbf1b9e8a1622Jaewan Kim mUid = uid; 1045830d047eda8c4b9401214b590efbf1b9e8a1622Jaewan Kim mType = type; 1055830d047eda8c4b9401214b590efbf1b9e8a1622Jaewan Kim mPackageName = packageName; 1065830d047eda8c4b9401214b590efbf1b9e8a1622Jaewan Kim mServiceName = serviceName; 107dd4397861fd98aefae95e6d6036a96f499eaf8b1Jaewan Kim mId = id; 108dd4397861fd98aefae95e6d6036a96f499eaf8b1Jaewan Kim mSessionBinder = sessionBinder; 1095830d047eda8c4b9401214b590efbf1b9e8a1622Jaewan Kim mInstance = new SessionToken2(this); 110dd4397861fd98aefae95e6d6036a96f499eaf8b1Jaewan Kim } 111dd4397861fd98aefae95e6d6036a96f499eaf8b1Jaewan Kim 112dd4397861fd98aefae95e6d6036a96f499eaf8b1Jaewan Kim public static String getSessionId(ResolveInfo resolveInfo) { 113dd4397861fd98aefae95e6d6036a96f499eaf8b1Jaewan Kim if (resolveInfo == null || resolveInfo.serviceInfo == null) { 114dd4397861fd98aefae95e6d6036a96f499eaf8b1Jaewan Kim return null; 115dd4397861fd98aefae95e6d6036a96f499eaf8b1Jaewan Kim } else if (resolveInfo.serviceInfo.metaData == null) { 116dd4397861fd98aefae95e6d6036a96f499eaf8b1Jaewan Kim return ""; 117dd4397861fd98aefae95e6d6036a96f499eaf8b1Jaewan Kim } else { 118dd4397861fd98aefae95e6d6036a96f499eaf8b1Jaewan Kim return resolveInfo.serviceInfo.metaData.getString( 119dd4397861fd98aefae95e6d6036a96f499eaf8b1Jaewan Kim MediaSessionService2.SERVICE_META_DATA, ""); 120dd4397861fd98aefae95e6d6036a96f499eaf8b1Jaewan Kim } 121dd4397861fd98aefae95e6d6036a96f499eaf8b1Jaewan Kim } 122dd4397861fd98aefae95e6d6036a96f499eaf8b1Jaewan Kim 1235830d047eda8c4b9401214b590efbf1b9e8a1622Jaewan Kim public SessionToken2 getInstance() { 1245830d047eda8c4b9401214b590efbf1b9e8a1622Jaewan Kim return mInstance; 1255830d047eda8c4b9401214b590efbf1b9e8a1622Jaewan Kim } 1265830d047eda8c4b9401214b590efbf1b9e8a1622Jaewan Kim 127dd4397861fd98aefae95e6d6036a96f499eaf8b1Jaewan Kim @Override 128dd4397861fd98aefae95e6d6036a96f499eaf8b1Jaewan Kim public String getPackageName_impl() { 129dd4397861fd98aefae95e6d6036a96f499eaf8b1Jaewan Kim return mPackageName; 130dd4397861fd98aefae95e6d6036a96f499eaf8b1Jaewan Kim } 131dd4397861fd98aefae95e6d6036a96f499eaf8b1Jaewan Kim 132dd4397861fd98aefae95e6d6036a96f499eaf8b1Jaewan Kim @Override 133dd4397861fd98aefae95e6d6036a96f499eaf8b1Jaewan Kim public int getUid_impl() { 134dd4397861fd98aefae95e6d6036a96f499eaf8b1Jaewan Kim return mUid; 135dd4397861fd98aefae95e6d6036a96f499eaf8b1Jaewan Kim } 136dd4397861fd98aefae95e6d6036a96f499eaf8b1Jaewan Kim 137dd4397861fd98aefae95e6d6036a96f499eaf8b1Jaewan Kim @Override 138dd4397861fd98aefae95e6d6036a96f499eaf8b1Jaewan Kim public String getId_imp() { 139dd4397861fd98aefae95e6d6036a96f499eaf8b1Jaewan Kim return mId; 140dd4397861fd98aefae95e6d6036a96f499eaf8b1Jaewan Kim } 141dd4397861fd98aefae95e6d6036a96f499eaf8b1Jaewan Kim 142dd4397861fd98aefae95e6d6036a96f499eaf8b1Jaewan Kim @Override 143dd4397861fd98aefae95e6d6036a96f499eaf8b1Jaewan Kim public int getType_impl() { 144dd4397861fd98aefae95e6d6036a96f499eaf8b1Jaewan Kim return mType; 145dd4397861fd98aefae95e6d6036a96f499eaf8b1Jaewan Kim } 146dd4397861fd98aefae95e6d6036a96f499eaf8b1Jaewan Kim 147dd4397861fd98aefae95e6d6036a96f499eaf8b1Jaewan Kim public String getServiceName() { 148dd4397861fd98aefae95e6d6036a96f499eaf8b1Jaewan Kim return mServiceName; 149dd4397861fd98aefae95e6d6036a96f499eaf8b1Jaewan Kim } 150dd4397861fd98aefae95e6d6036a96f499eaf8b1Jaewan Kim 151dd4397861fd98aefae95e6d6036a96f499eaf8b1Jaewan Kim public IMediaSession2 getSessionBinder() { 152dd4397861fd98aefae95e6d6036a96f499eaf8b1Jaewan Kim return mSessionBinder; 153dd4397861fd98aefae95e6d6036a96f499eaf8b1Jaewan Kim } 154dd4397861fd98aefae95e6d6036a96f499eaf8b1Jaewan Kim 155dd4397861fd98aefae95e6d6036a96f499eaf8b1Jaewan Kim public static SessionToken2 fromBundle(Context context, Bundle bundle) { 156dd4397861fd98aefae95e6d6036a96f499eaf8b1Jaewan Kim if (bundle == null) { 157dd4397861fd98aefae95e6d6036a96f499eaf8b1Jaewan Kim return null; 158dd4397861fd98aefae95e6d6036a96f499eaf8b1Jaewan Kim } 159dd4397861fd98aefae95e6d6036a96f499eaf8b1Jaewan Kim final int uid = bundle.getInt(KEY_UID); 160dd4397861fd98aefae95e6d6036a96f499eaf8b1Jaewan Kim final @TokenType int type = bundle.getInt(KEY_TYPE, -1); 161dd4397861fd98aefae95e6d6036a96f499eaf8b1Jaewan Kim final String packageName = bundle.getString(KEY_PACKAGE_NAME); 162dd4397861fd98aefae95e6d6036a96f499eaf8b1Jaewan Kim final String serviceName = bundle.getString(KEY_SERVICE_NAME); 163dd4397861fd98aefae95e6d6036a96f499eaf8b1Jaewan Kim final String id = bundle.getString(KEY_ID); 164dd4397861fd98aefae95e6d6036a96f499eaf8b1Jaewan Kim final IBinder sessionBinder = bundle.getBinder(KEY_SESSION_BINDER); 165dd4397861fd98aefae95e6d6036a96f499eaf8b1Jaewan Kim 166dd4397861fd98aefae95e6d6036a96f499eaf8b1Jaewan Kim // Sanity check. 167dd4397861fd98aefae95e6d6036a96f499eaf8b1Jaewan Kim switch (type) { 168dd4397861fd98aefae95e6d6036a96f499eaf8b1Jaewan Kim case TYPE_SESSION: 169dd4397861fd98aefae95e6d6036a96f499eaf8b1Jaewan Kim if (sessionBinder == null) { 170dd4397861fd98aefae95e6d6036a96f499eaf8b1Jaewan Kim throw new IllegalArgumentException("Unexpected sessionBinder for session," 171dd4397861fd98aefae95e6d6036a96f499eaf8b1Jaewan Kim + " binder=" + sessionBinder); 172dd4397861fd98aefae95e6d6036a96f499eaf8b1Jaewan Kim } 173dd4397861fd98aefae95e6d6036a96f499eaf8b1Jaewan Kim break; 174dd4397861fd98aefae95e6d6036a96f499eaf8b1Jaewan Kim case TYPE_SESSION_SERVICE: 175dd4397861fd98aefae95e6d6036a96f499eaf8b1Jaewan Kim case TYPE_LIBRARY_SERVICE: 176dd4397861fd98aefae95e6d6036a96f499eaf8b1Jaewan Kim if (TextUtils.isEmpty(serviceName)) { 177dd4397861fd98aefae95e6d6036a96f499eaf8b1Jaewan Kim throw new IllegalArgumentException("Session service needs service name"); 178dd4397861fd98aefae95e6d6036a96f499eaf8b1Jaewan Kim } 179dd4397861fd98aefae95e6d6036a96f499eaf8b1Jaewan Kim break; 180dd4397861fd98aefae95e6d6036a96f499eaf8b1Jaewan Kim default: 181dd4397861fd98aefae95e6d6036a96f499eaf8b1Jaewan Kim throw new IllegalArgumentException("Invalid type"); 182dd4397861fd98aefae95e6d6036a96f499eaf8b1Jaewan Kim } 183dd4397861fd98aefae95e6d6036a96f499eaf8b1Jaewan Kim if (TextUtils.isEmpty(packageName) || id == null) { 184dd4397861fd98aefae95e6d6036a96f499eaf8b1Jaewan Kim throw new IllegalArgumentException("Package name nor ID cannot be null."); 185dd4397861fd98aefae95e6d6036a96f499eaf8b1Jaewan Kim } 186dd4397861fd98aefae95e6d6036a96f499eaf8b1Jaewan Kim // TODO(jaewan): Revisit here when we add connection callback to the session for individual 187dd4397861fd98aefae95e6d6036a96f499eaf8b1Jaewan Kim // controller's permission check. With it, sessionBinder should be available 188dd4397861fd98aefae95e6d6036a96f499eaf8b1Jaewan Kim // if and only if for session, not session service. 1895830d047eda8c4b9401214b590efbf1b9e8a1622Jaewan Kim return new SessionToken2Impl(context, uid, type, packageName, serviceName, id, 1905830d047eda8c4b9401214b590efbf1b9e8a1622Jaewan Kim sessionBinder != null ? IMediaSession2.Stub.asInterface(sessionBinder) : null) 1915830d047eda8c4b9401214b590efbf1b9e8a1622Jaewan Kim .getInstance(); 192dd4397861fd98aefae95e6d6036a96f499eaf8b1Jaewan Kim } 193dd4397861fd98aefae95e6d6036a96f499eaf8b1Jaewan Kim 194dd4397861fd98aefae95e6d6036a96f499eaf8b1Jaewan Kim @Override 195dd4397861fd98aefae95e6d6036a96f499eaf8b1Jaewan Kim public Bundle toBundle_impl() { 196dd4397861fd98aefae95e6d6036a96f499eaf8b1Jaewan Kim Bundle bundle = new Bundle(); 197dd4397861fd98aefae95e6d6036a96f499eaf8b1Jaewan Kim bundle.putInt(KEY_UID, mUid); 198dd4397861fd98aefae95e6d6036a96f499eaf8b1Jaewan Kim bundle.putString(KEY_PACKAGE_NAME, mPackageName); 199dd4397861fd98aefae95e6d6036a96f499eaf8b1Jaewan Kim bundle.putString(KEY_SERVICE_NAME, mServiceName); 200dd4397861fd98aefae95e6d6036a96f499eaf8b1Jaewan Kim bundle.putString(KEY_ID, mId); 201dd4397861fd98aefae95e6d6036a96f499eaf8b1Jaewan Kim bundle.putInt(KEY_TYPE, mType); 202dd4397861fd98aefae95e6d6036a96f499eaf8b1Jaewan Kim bundle.putBinder(KEY_SESSION_BINDER, 203dd4397861fd98aefae95e6d6036a96f499eaf8b1Jaewan Kim mSessionBinder != null ? mSessionBinder.asBinder() : null); 204dd4397861fd98aefae95e6d6036a96f499eaf8b1Jaewan Kim return bundle; 205dd4397861fd98aefae95e6d6036a96f499eaf8b1Jaewan Kim } 206dd4397861fd98aefae95e6d6036a96f499eaf8b1Jaewan Kim 207dd4397861fd98aefae95e6d6036a96f499eaf8b1Jaewan Kim @Override 208dd4397861fd98aefae95e6d6036a96f499eaf8b1Jaewan Kim public int hashCode_impl() { 209dd4397861fd98aefae95e6d6036a96f499eaf8b1Jaewan Kim final int prime = 31; 210dd4397861fd98aefae95e6d6036a96f499eaf8b1Jaewan Kim return mType 211dd4397861fd98aefae95e6d6036a96f499eaf8b1Jaewan Kim + prime * (mUid 212dd4397861fd98aefae95e6d6036a96f499eaf8b1Jaewan Kim + prime * (mPackageName.hashCode() 213dd4397861fd98aefae95e6d6036a96f499eaf8b1Jaewan Kim + prime * (mId.hashCode() 214dd4397861fd98aefae95e6d6036a96f499eaf8b1Jaewan Kim + prime * ((mServiceName != null ? mServiceName.hashCode() : 0) 215dd4397861fd98aefae95e6d6036a96f499eaf8b1Jaewan Kim + prime * (mSessionBinder != null ? mSessionBinder.asBinder().hashCode() : 0))))); 216dd4397861fd98aefae95e6d6036a96f499eaf8b1Jaewan Kim } 217dd4397861fd98aefae95e6d6036a96f499eaf8b1Jaewan Kim 218dd4397861fd98aefae95e6d6036a96f499eaf8b1Jaewan Kim @Override 219dd4397861fd98aefae95e6d6036a96f499eaf8b1Jaewan Kim public boolean equals_impl(Object obj) { 220dd4397861fd98aefae95e6d6036a96f499eaf8b1Jaewan Kim if (!(obj instanceof SessionToken2)) { 221dd4397861fd98aefae95e6d6036a96f499eaf8b1Jaewan Kim return false; 222dd4397861fd98aefae95e6d6036a96f499eaf8b1Jaewan Kim } 223dd4397861fd98aefae95e6d6036a96f499eaf8b1Jaewan Kim SessionToken2Impl other = from((SessionToken2) obj); 224dd4397861fd98aefae95e6d6036a96f499eaf8b1Jaewan Kim if (mUid != other.mUid 225dd4397861fd98aefae95e6d6036a96f499eaf8b1Jaewan Kim || !TextUtils.equals(mPackageName, other.mPackageName) 226dd4397861fd98aefae95e6d6036a96f499eaf8b1Jaewan Kim || !TextUtils.equals(mServiceName, other.mServiceName) 227dd4397861fd98aefae95e6d6036a96f499eaf8b1Jaewan Kim || !TextUtils.equals(mId, other.mId) 228dd4397861fd98aefae95e6d6036a96f499eaf8b1Jaewan Kim || mType != other.mType) { 229dd4397861fd98aefae95e6d6036a96f499eaf8b1Jaewan Kim return false; 230dd4397861fd98aefae95e6d6036a96f499eaf8b1Jaewan Kim } 231dd4397861fd98aefae95e6d6036a96f499eaf8b1Jaewan Kim if (mSessionBinder == other.mSessionBinder) { 232dd4397861fd98aefae95e6d6036a96f499eaf8b1Jaewan Kim return true; 233dd4397861fd98aefae95e6d6036a96f499eaf8b1Jaewan Kim } else if (mSessionBinder == null || other.mSessionBinder == null) { 234dd4397861fd98aefae95e6d6036a96f499eaf8b1Jaewan Kim return false; 235dd4397861fd98aefae95e6d6036a96f499eaf8b1Jaewan Kim } 236dd4397861fd98aefae95e6d6036a96f499eaf8b1Jaewan Kim return mSessionBinder.asBinder().equals(other.mSessionBinder.asBinder()); 237dd4397861fd98aefae95e6d6036a96f499eaf8b1Jaewan Kim } 238dd4397861fd98aefae95e6d6036a96f499eaf8b1Jaewan Kim 239dd4397861fd98aefae95e6d6036a96f499eaf8b1Jaewan Kim @Override 240dd4397861fd98aefae95e6d6036a96f499eaf8b1Jaewan Kim public String toString_impl() { 241dd4397861fd98aefae95e6d6036a96f499eaf8b1Jaewan Kim return "SessionToken {pkg=" + mPackageName + " id=" + mId + " type=" + mType 242dd4397861fd98aefae95e6d6036a96f499eaf8b1Jaewan Kim + " service=" + mServiceName + " binder=" + mSessionBinder + "}"; 243dd4397861fd98aefae95e6d6036a96f499eaf8b1Jaewan Kim } 244dd4397861fd98aefae95e6d6036a96f499eaf8b1Jaewan Kim 245dd4397861fd98aefae95e6d6036a96f499eaf8b1Jaewan Kim public static SessionToken2Impl from(SessionToken2 token) { 246dd4397861fd98aefae95e6d6036a96f499eaf8b1Jaewan Kim return ((SessionToken2Impl) token.getProvider()); 247dd4397861fd98aefae95e6d6036a96f499eaf8b1Jaewan Kim } 248dd4397861fd98aefae95e6d6036a96f499eaf8b1Jaewan Kim} 249