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