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