1ceb6b6e131a1c8c7451e9b7298bec573f28fa731Jaewan Kim/* 2ceb6b6e131a1c8c7451e9b7298bec573f28fa731Jaewan Kim * Copyright 2018 The Android Open Source Project 3ceb6b6e131a1c8c7451e9b7298bec573f28fa731Jaewan Kim * 4ceb6b6e131a1c8c7451e9b7298bec573f28fa731Jaewan Kim * Licensed under the Apache License, Version 2.0 (the "License"); 5ceb6b6e131a1c8c7451e9b7298bec573f28fa731Jaewan Kim * you may not use this file except in compliance with the License. 6ceb6b6e131a1c8c7451e9b7298bec573f28fa731Jaewan Kim * You may obtain a copy of the License at 7ceb6b6e131a1c8c7451e9b7298bec573f28fa731Jaewan Kim * 8ceb6b6e131a1c8c7451e9b7298bec573f28fa731Jaewan Kim * http://www.apache.org/licenses/LICENSE-2.0 9ceb6b6e131a1c8c7451e9b7298bec573f28fa731Jaewan Kim * 10ceb6b6e131a1c8c7451e9b7298bec573f28fa731Jaewan Kim * Unless required by applicable law or agreed to in writing, software 11ceb6b6e131a1c8c7451e9b7298bec573f28fa731Jaewan Kim * distributed under the License is distributed on an "AS IS" BASIS, 12ceb6b6e131a1c8c7451e9b7298bec573f28fa731Jaewan Kim * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13ceb6b6e131a1c8c7451e9b7298bec573f28fa731Jaewan Kim * See the License for the specific language governing permissions and 14ceb6b6e131a1c8c7451e9b7298bec573f28fa731Jaewan Kim * limitations under the License. 15ceb6b6e131a1c8c7451e9b7298bec573f28fa731Jaewan Kim */ 16ceb6b6e131a1c8c7451e9b7298bec573f28fa731Jaewan Kim 17ceb6b6e131a1c8c7451e9b7298bec573f28fa731Jaewan Kimpackage android.media; 18ceb6b6e131a1c8c7451e9b7298bec573f28fa731Jaewan Kim 19ceb6b6e131a1c8c7451e9b7298bec573f28fa731Jaewan Kimimport android.annotation.IntDef; 20ceb6b6e131a1c8c7451e9b7298bec573f28fa731Jaewan Kimimport android.annotation.NonNull; 21f7a7706d146fec4905210fcaa1eed7a382fa2be8Jaewan Kimimport android.content.Context; 22ceb6b6e131a1c8c7451e9b7298bec573f28fa731Jaewan Kimimport android.media.session.MediaSessionManager; 23f7a7706d146fec4905210fcaa1eed7a382fa2be8Jaewan Kimimport android.media.update.ApiLoader; 24f7a7706d146fec4905210fcaa1eed7a382fa2be8Jaewan Kimimport android.media.update.SessionToken2Provider; 25ceb6b6e131a1c8c7451e9b7298bec573f28fa731Jaewan Kimimport android.os.Bundle; 26ceb6b6e131a1c8c7451e9b7298bec573f28fa731Jaewan Kim 27ceb6b6e131a1c8c7451e9b7298bec573f28fa731Jaewan Kimimport java.lang.annotation.Retention; 28ceb6b6e131a1c8c7451e9b7298bec573f28fa731Jaewan Kimimport java.lang.annotation.RetentionPolicy; 29ceb6b6e131a1c8c7451e9b7298bec573f28fa731Jaewan Kim 30ceb6b6e131a1c8c7451e9b7298bec573f28fa731Jaewan Kim/** 313a582e73c115e693bab8cb6f213d275704b9c5d7Jean-Michel Trivi * @hide 32ceb6b6e131a1c8c7451e9b7298bec573f28fa731Jaewan Kim * Represents an ongoing {@link MediaSession2} or a {@link MediaSessionService2}. 33ceb6b6e131a1c8c7451e9b7298bec573f28fa731Jaewan Kim * If it's representing a session service, it may not be ongoing. 34ceb6b6e131a1c8c7451e9b7298bec573f28fa731Jaewan Kim * <p> 35ceb6b6e131a1c8c7451e9b7298bec573f28fa731Jaewan Kim * This may be passed to apps by the session owner to allow them to create a 36ceb6b6e131a1c8c7451e9b7298bec573f28fa731Jaewan Kim * {@link MediaController2} to communicate with the session. 37ceb6b6e131a1c8c7451e9b7298bec573f28fa731Jaewan Kim * <p> 38ceb6b6e131a1c8c7451e9b7298bec573f28fa731Jaewan Kim * It can be also obtained by {@link MediaSessionManager}. 39ceb6b6e131a1c8c7451e9b7298bec573f28fa731Jaewan Kim */ 406cc1a5de46ec18172d75ac589dbe8b306d0fb8d2Jaewan Kim// New version of MediaSession.Token for following reasons 416cc1a5de46ec18172d75ac589dbe8b306d0fb8d2Jaewan Kim// - Stop implementing Parcelable for updatable support 426cc1a5de46ec18172d75ac589dbe8b306d0fb8d2Jaewan Kim// - Represent session and library service (formerly browser service) in one class. 436cc1a5de46ec18172d75ac589dbe8b306d0fb8d2Jaewan Kim// Previously MediaSession.Token was for session and ComponentName was for service. 4404de5de9a0329db56fe568041a2697c73c58da54Jaewan Kimpublic final class SessionToken2 { 45ceb6b6e131a1c8c7451e9b7298bec573f28fa731Jaewan Kim @Retention(RetentionPolicy.SOURCE) 46bcecf31a977b4a3cf77f1ab76264b817d5a29fe2Jaewan Kim @IntDef(value = {TYPE_SESSION, TYPE_SESSION_SERVICE, TYPE_LIBRARY_SERVICE}) 47ceb6b6e131a1c8c7451e9b7298bec573f28fa731Jaewan Kim public @interface TokenType { 48ceb6b6e131a1c8c7451e9b7298bec573f28fa731Jaewan Kim } 49ceb6b6e131a1c8c7451e9b7298bec573f28fa731Jaewan Kim 50ceb6b6e131a1c8c7451e9b7298bec573f28fa731Jaewan Kim public static final int TYPE_SESSION = 0; 51ceb6b6e131a1c8c7451e9b7298bec573f28fa731Jaewan Kim public static final int TYPE_SESSION_SERVICE = 1; 52bcecf31a977b4a3cf77f1ab76264b817d5a29fe2Jaewan Kim public static final int TYPE_LIBRARY_SERVICE = 2; 53ceb6b6e131a1c8c7451e9b7298bec573f28fa731Jaewan Kim 54f7a7706d146fec4905210fcaa1eed7a382fa2be8Jaewan Kim private final SessionToken2Provider mProvider; 55ceb6b6e131a1c8c7451e9b7298bec573f28fa731Jaewan Kim 5644fec2d66c3a758fd9c742a3c675ec5c689bbad2Jaewan Kim // From the return value of android.os.Process.getUidForName(String) when error 5744fec2d66c3a758fd9c742a3c675ec5c689bbad2Jaewan Kim private static final int UID_UNKNOWN = -1; 5844fec2d66c3a758fd9c742a3c675ec5c689bbad2Jaewan Kim 59f7a7706d146fec4905210fcaa1eed7a382fa2be8Jaewan Kim /** 60f7a7706d146fec4905210fcaa1eed7a382fa2be8Jaewan Kim * Constructor for the token. You can only create token for session service or library service 61f7a7706d146fec4905210fcaa1eed7a382fa2be8Jaewan Kim * to use by {@link MediaController2} or {@link MediaBrowser2}. 62f7a7706d146fec4905210fcaa1eed7a382fa2be8Jaewan Kim * 63f7a7706d146fec4905210fcaa1eed7a382fa2be8Jaewan Kim * @param context context 64f7a7706d146fec4905210fcaa1eed7a382fa2be8Jaewan Kim * @param packageName package name 65f7a7706d146fec4905210fcaa1eed7a382fa2be8Jaewan Kim * @param serviceName name of service. Can be {@code null} if it's not an service. 66f7a7706d146fec4905210fcaa1eed7a382fa2be8Jaewan Kim */ 6744fec2d66c3a758fd9c742a3c675ec5c689bbad2Jaewan Kim public SessionToken2(@NonNull Context context, @NonNull String packageName, 68f7a7706d146fec4905210fcaa1eed7a382fa2be8Jaewan Kim @NonNull String serviceName) { 6944fec2d66c3a758fd9c742a3c675ec5c689bbad2Jaewan Kim this(context, packageName, serviceName, UID_UNKNOWN); 70f7a7706d146fec4905210fcaa1eed7a382fa2be8Jaewan Kim } 71ceb6b6e131a1c8c7451e9b7298bec573f28fa731Jaewan Kim 72ceb6b6e131a1c8c7451e9b7298bec573f28fa731Jaewan Kim /** 7344fec2d66c3a758fd9c742a3c675ec5c689bbad2Jaewan Kim * Constructor for the token. You can only create token for session service or library service 7444fec2d66c3a758fd9c742a3c675ec5c689bbad2Jaewan Kim * to use by {@link MediaController2} or {@link MediaBrowser2}. 75ceb6b6e131a1c8c7451e9b7298bec573f28fa731Jaewan Kim * 76f7a7706d146fec4905210fcaa1eed7a382fa2be8Jaewan Kim * @param context context 77ceb6b6e131a1c8c7451e9b7298bec573f28fa731Jaewan Kim * @param packageName package name 78ceb6b6e131a1c8c7451e9b7298bec573f28fa731Jaewan Kim * @param serviceName name of service. Can be {@code null} if it's not an service. 7944fec2d66c3a758fd9c742a3c675ec5c689bbad2Jaewan Kim * @param uid uid of the app. 8044fec2d66c3a758fd9c742a3c675ec5c689bbad2Jaewan Kim * @hide 8144fec2d66c3a758fd9c742a3c675ec5c689bbad2Jaewan Kim */ 8244fec2d66c3a758fd9c742a3c675ec5c689bbad2Jaewan Kim public SessionToken2(@NonNull Context context, @NonNull String packageName, 8344fec2d66c3a758fd9c742a3c675ec5c689bbad2Jaewan Kim @NonNull String serviceName, int uid) { 846bd3ab6dc6ad4001c387d7f4a4a2ce954be6ca16Christofer Åkersten mProvider = ApiLoader.getProvider().createSessionToken2( 8544fec2d66c3a758fd9c742a3c675ec5c689bbad2Jaewan Kim context, this, packageName, serviceName, uid); 8644fec2d66c3a758fd9c742a3c675ec5c689bbad2Jaewan Kim } 8744fec2d66c3a758fd9c742a3c675ec5c689bbad2Jaewan Kim 8844fec2d66c3a758fd9c742a3c675ec5c689bbad2Jaewan Kim /** 8944fec2d66c3a758fd9c742a3c675ec5c689bbad2Jaewan Kim * Constructor for the token. 9044fec2d66c3a758fd9c742a3c675ec5c689bbad2Jaewan Kim * @hide 91ceb6b6e131a1c8c7451e9b7298bec573f28fa731Jaewan Kim */ 9244fec2d66c3a758fd9c742a3c675ec5c689bbad2Jaewan Kim public SessionToken2(@NonNull SessionToken2Provider provider) { 9344fec2d66c3a758fd9c742a3c675ec5c689bbad2Jaewan Kim mProvider = provider; 94ceb6b6e131a1c8c7451e9b7298bec573f28fa731Jaewan Kim } 95ceb6b6e131a1c8c7451e9b7298bec573f28fa731Jaewan Kim 96f7a7706d146fec4905210fcaa1eed7a382fa2be8Jaewan Kim @Override 97ceb6b6e131a1c8c7451e9b7298bec573f28fa731Jaewan Kim public int hashCode() { 98f7a7706d146fec4905210fcaa1eed7a382fa2be8Jaewan Kim return mProvider.hashCode_impl(); 99ceb6b6e131a1c8c7451e9b7298bec573f28fa731Jaewan Kim } 100ceb6b6e131a1c8c7451e9b7298bec573f28fa731Jaewan Kim 101ceb6b6e131a1c8c7451e9b7298bec573f28fa731Jaewan Kim @Override 102ceb6b6e131a1c8c7451e9b7298bec573f28fa731Jaewan Kim public boolean equals(Object obj) { 103f7a7706d146fec4905210fcaa1eed7a382fa2be8Jaewan Kim return mProvider.equals_impl(obj); 104ceb6b6e131a1c8c7451e9b7298bec573f28fa731Jaewan Kim } 105ceb6b6e131a1c8c7451e9b7298bec573f28fa731Jaewan Kim 106ceb6b6e131a1c8c7451e9b7298bec573f28fa731Jaewan Kim @Override 107ceb6b6e131a1c8c7451e9b7298bec573f28fa731Jaewan Kim public String toString() { 108f7a7706d146fec4905210fcaa1eed7a382fa2be8Jaewan Kim return mProvider.toString_impl(); 109f7a7706d146fec4905210fcaa1eed7a382fa2be8Jaewan Kim } 110f7a7706d146fec4905210fcaa1eed7a382fa2be8Jaewan Kim 1116cc1a5de46ec18172d75ac589dbe8b306d0fb8d2Jaewan Kim /** 1126cc1a5de46ec18172d75ac589dbe8b306d0fb8d2Jaewan Kim * @hide 1136cc1a5de46ec18172d75ac589dbe8b306d0fb8d2Jaewan Kim */ 114f7a7706d146fec4905210fcaa1eed7a382fa2be8Jaewan Kim public SessionToken2Provider getProvider() { 115f7a7706d146fec4905210fcaa1eed7a382fa2be8Jaewan Kim return mProvider; 116f7a7706d146fec4905210fcaa1eed7a382fa2be8Jaewan Kim } 117f7a7706d146fec4905210fcaa1eed7a382fa2be8Jaewan Kim 118f7a7706d146fec4905210fcaa1eed7a382fa2be8Jaewan Kim /** 119f7a7706d146fec4905210fcaa1eed7a382fa2be8Jaewan Kim * @return uid of the session 120f7a7706d146fec4905210fcaa1eed7a382fa2be8Jaewan Kim */ 121f7a7706d146fec4905210fcaa1eed7a382fa2be8Jaewan Kim public int getUid() { 122f7a7706d146fec4905210fcaa1eed7a382fa2be8Jaewan Kim return mProvider.getUid_impl(); 123ceb6b6e131a1c8c7451e9b7298bec573f28fa731Jaewan Kim } 124ceb6b6e131a1c8c7451e9b7298bec573f28fa731Jaewan Kim 125ceb6b6e131a1c8c7451e9b7298bec573f28fa731Jaewan Kim /** 126ceb6b6e131a1c8c7451e9b7298bec573f28fa731Jaewan Kim * @return package name 127ceb6b6e131a1c8c7451e9b7298bec573f28fa731Jaewan Kim */ 128ceb6b6e131a1c8c7451e9b7298bec573f28fa731Jaewan Kim public String getPackageName() { 129f7a7706d146fec4905210fcaa1eed7a382fa2be8Jaewan Kim return mProvider.getPackageName_impl(); 130ceb6b6e131a1c8c7451e9b7298bec573f28fa731Jaewan Kim } 131ceb6b6e131a1c8c7451e9b7298bec573f28fa731Jaewan Kim 132ceb6b6e131a1c8c7451e9b7298bec573f28fa731Jaewan Kim /** 133ceb6b6e131a1c8c7451e9b7298bec573f28fa731Jaewan Kim * @return id 134ceb6b6e131a1c8c7451e9b7298bec573f28fa731Jaewan Kim */ 135ceb6b6e131a1c8c7451e9b7298bec573f28fa731Jaewan Kim public String getId() { 136f7a7706d146fec4905210fcaa1eed7a382fa2be8Jaewan Kim return mProvider.getId_imp(); 137ceb6b6e131a1c8c7451e9b7298bec573f28fa731Jaewan Kim } 138ceb6b6e131a1c8c7451e9b7298bec573f28fa731Jaewan Kim 139ceb6b6e131a1c8c7451e9b7298bec573f28fa731Jaewan Kim /** 140ceb6b6e131a1c8c7451e9b7298bec573f28fa731Jaewan Kim * @return type of the token 141ceb6b6e131a1c8c7451e9b7298bec573f28fa731Jaewan Kim * @see #TYPE_SESSION 142ceb6b6e131a1c8c7451e9b7298bec573f28fa731Jaewan Kim * @see #TYPE_SESSION_SERVICE 143ceb6b6e131a1c8c7451e9b7298bec573f28fa731Jaewan Kim */ 144ceb6b6e131a1c8c7451e9b7298bec573f28fa731Jaewan Kim public @TokenType int getType() { 145f7a7706d146fec4905210fcaa1eed7a382fa2be8Jaewan Kim return mProvider.getType_impl(); 146ceb6b6e131a1c8c7451e9b7298bec573f28fa731Jaewan Kim } 147ceb6b6e131a1c8c7451e9b7298bec573f28fa731Jaewan Kim 148ceb6b6e131a1c8c7451e9b7298bec573f28fa731Jaewan Kim /** 149ceb6b6e131a1c8c7451e9b7298bec573f28fa731Jaewan Kim * Create a token from the bundle, exported by {@link #toBundle()}. 150ceb6b6e131a1c8c7451e9b7298bec573f28fa731Jaewan Kim * @param bundle 151ceb6b6e131a1c8c7451e9b7298bec573f28fa731Jaewan Kim * @return 152ceb6b6e131a1c8c7451e9b7298bec573f28fa731Jaewan Kim */ 1536823d81d8c2ea8c7b9c3a4c72f9005174050c22fChristofer Åkersten public static SessionToken2 fromBundle(@NonNull Bundle bundle) { 1546823d81d8c2ea8c7b9c3a4c72f9005174050c22fChristofer Åkersten return ApiLoader.getProvider().fromBundle_SessionToken2(bundle); 155ceb6b6e131a1c8c7451e9b7298bec573f28fa731Jaewan Kim } 156ceb6b6e131a1c8c7451e9b7298bec573f28fa731Jaewan Kim 157ceb6b6e131a1c8c7451e9b7298bec573f28fa731Jaewan Kim /** 158ceb6b6e131a1c8c7451e9b7298bec573f28fa731Jaewan Kim * Create a {@link Bundle} from this token to share it across processes. 159ceb6b6e131a1c8c7451e9b7298bec573f28fa731Jaewan Kim * @return Bundle 160ceb6b6e131a1c8c7451e9b7298bec573f28fa731Jaewan Kim */ 161ceb6b6e131a1c8c7451e9b7298bec573f28fa731Jaewan Kim public Bundle toBundle() { 162f7a7706d146fec4905210fcaa1eed7a382fa2be8Jaewan Kim return mProvider.toBundle_impl(); 163ceb6b6e131a1c8c7451e9b7298bec573f28fa731Jaewan Kim } 164ceb6b6e131a1c8c7451e9b7298bec573f28fa731Jaewan Kim} 165