Home | History | Annotate | Download | only in cts
      1 /*
      2  * Copyright 2018 The Android Open Source Project
      3  *
      4  * Licensed under the Apache License, Version 2.0 (the "License");
      5  * you may not use this file except in compliance with the License.
      6  * You may obtain a copy of the License at
      7  *
      8  *      http://www.apache.org/licenses/LICENSE-2.0
      9  *
     10  * Unless required by applicable law or agreed to in writing, software
     11  * distributed under the License is distributed on an "AS IS" BASIS,
     12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13  * See the License for the specific language governing permissions and
     14  * limitations under the License.
     15  */
     16 
     17 package android.media.cts;
     18 
     19 import android.media.MediaSession2;
     20 import android.media.MediaSession2.ControllerInfo;
     21 import android.media.MediaSession2Service;
     22 import android.media.Session2CommandGroup;
     23 import android.os.Process;
     24 
     25 import com.android.internal.annotations.GuardedBy;
     26 
     27 import java.util.List;
     28 
     29 /**
     30  * Stub implementation of {@link MediaSession2Service} for testing.
     31  */
     32 public class StubMediaSession2Service extends MediaSession2Service {
     33     /**
     34      * ID of the session that this service will create.
     35      */
     36     private static final String ID = "StubMediaSession2Service";
     37 
     38     @GuardedBy("StubMediaSession2Service.class")
     39     private static HandlerExecutor sHandlerExecutor;
     40     @GuardedBy("StubMediaSession2Service.class")
     41     private static StubMediaSession2Service sInstance;
     42     @GuardedBy("StubMediaSession2Service.class")
     43     private static TestInjector sTestInjector;
     44 
     45     public static void setHandlerExecutor(HandlerExecutor handlerExecutor) {
     46         synchronized (StubMediaSession2Service.class) {
     47             sHandlerExecutor = handlerExecutor;
     48         }
     49     }
     50 
     51     public static StubMediaSession2Service getInstance() {
     52         synchronized (StubMediaSession2Service.class) {
     53             return sInstance;
     54         }
     55     }
     56 
     57     public static void setTestInjector(TestInjector injector) {
     58         synchronized (StubMediaSession2Service.class) {
     59             sTestInjector = injector;
     60         }
     61     }
     62 
     63     @Override
     64     public void onCreate() {
     65         super.onCreate();
     66         synchronized (StubMediaSession2Service.class) {
     67             sInstance = this;
     68         }
     69     }
     70 
     71     @Override
     72     public void onDestroy() {
     73         List<MediaSession2> sessions = getSessions();
     74         for (MediaSession2 session : sessions) {
     75             session.close();
     76         }
     77         synchronized (StubMediaSession2Service.class) {
     78             if (sTestInjector != null) {
     79                 sTestInjector.onServiceDestroyed();
     80             }
     81             sInstance = null;
     82         }
     83         super.onDestroy();
     84     }
     85 
     86     @Override
     87     public MediaNotification onUpdateNotification(MediaSession2 session) {
     88         synchronized (StubMediaSession2Service.class) {
     89             if (sTestInjector != null) {
     90                 sTestInjector.onUpdateNotification(session);
     91             }
     92             sInstance = null;
     93         }
     94         return null;
     95     }
     96 
     97     @Override
     98     public MediaSession2 onGetSession(ControllerInfo controllerInfo) {
     99         synchronized (StubMediaSession2Service.class) {
    100             if (sTestInjector != null) {
    101                 return sTestInjector.onGetSession(controllerInfo);
    102             }
    103         }
    104         if (getSessions().size() > 0) {
    105             return getSessions().get(0);
    106         }
    107         return new MediaSession2.Builder(this)
    108                 .setId(ID)
    109                 .setSessionCallback(sHandlerExecutor, new MediaSession2.SessionCallback() {
    110                     @Override
    111                     public Session2CommandGroup onConnect(MediaSession2 session,
    112                             ControllerInfo controller) {
    113                         if (controller.getUid() == Process.myUid()) {
    114                             return new Session2CommandGroup.Builder().build();
    115                         }
    116                         return null;
    117                     }
    118                 }).build();
    119     }
    120 
    121     public static abstract class TestInjector {
    122         MediaSession2 onGetSession(ControllerInfo controllerInfo) {
    123             return null;
    124         }
    125 
    126         MediaNotification onUpdateNotification(MediaSession2 session) {
    127             return null;
    128         }
    129 
    130         void onServiceDestroyed() {
    131             // no-op
    132         }
    133     }
    134 }