• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright 2021 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.tv.tuner.cts;
18 
19 import android.app.Service;
20 import android.content.Context;
21 import android.content.Intent;
22 import android.media.tv.tuner.Tuner;
23 import android.media.tv.tuner.cts.ISharedFilterTestServer;
24 import android.media.tv.tuner.filter.Filter;
25 import android.media.tv.tuner.filter.FilterCallback;
26 import android.media.tv.tuner.filter.FilterEvent;
27 import android.media.tv.tuner.filter.SharedFilter;
28 import android.media.tv.tuner.filter.SharedFilterCallback;
29 import android.media.tv.tuner.frontend.FrontendInfo;
30 import android.os.IBinder;
31 import android.util.Log;
32 
33 import java.util.List;
34 import java.util.concurrent.Executor;
35 
36 public class SharedFilterTestService extends Service {
37     private static final String TAG = "SharedFilterTestService";
38     private Context mContext = null;
39     private Tuner mTuner = null;
40     private Filter mFilter = null;
41     private boolean mTuning = false;
42 
43     @Override
onBind(Intent intent)44     public IBinder onBind(Intent intent) {
45         mContext = this;
46         mTuner = new Tuner(mContext, null, 100);
47         return new SharedFilterTestServer();
48     }
49 
50     @Override
onUnbind(Intent intent)51     public boolean onUnbind(Intent intent) {
52         mTuner.close();
53         mTuner = null;
54         return false;
55     }
56 
57     private class SharedFilterTestServer extends ISharedFilterTestServer.Stub {
58         @Override
acquireSharedFilterToken()59         public String acquireSharedFilterToken() {
60             mFilter = TunerTest.createTsSectionFilter(
61                     mTuner, getExecutor(), getFilterCallback());
62 
63             // Tune a frontend before start the filter
64             List<FrontendInfo> infos = mTuner.getAvailableFrontendInfos();
65             mTuner.tune(TunerTest.createFrontendSettings(infos.get(0)));
66             mTuning = true;
67 
68             return mFilter.acquireSharedFilterToken();
69         }
70 
71         @Override
closeFilter()72         public void closeFilter() {
73             if (mTuning) {
74                 mTuner.cancelTuning();
75                 mTuning = false;
76             }
77             mFilter.close();
78             mFilter = null;
79         }
80 
81         @Override
freeSharedFilterToken(String token)82         public void freeSharedFilterToken(String token) {
83             if (mTuning) {
84                 mTuner.cancelTuning();
85                 mTuning = false;
86             }
87             mFilter.freeSharedFilterToken(token);
88         }
89 
90         @Override
verifySharedFilter(String token)91         public boolean verifySharedFilter(String token) {
92             SharedFilter f = Tuner.openSharedFilter(
93                     mContext, token, getExecutor(), getSharedFilterCallback());
94             if (f == null) {
95                 Log.e(TAG, "SharedFilter is null");
96                 return false;
97             }
98             if (f.start() != Tuner.RESULT_SUCCESS) {
99                 f = null;
100                 Log.e(TAG, "Failed to start SharedFilter");
101                 return false;
102             }
103             if (f.flush() != Tuner.RESULT_SUCCESS) {
104                 f.close();
105                 f = null;
106                 Log.e(TAG, "Failed to flush SharedFilter");
107                 return false;
108             }
109             int size = f.read(new byte[3], 0, 3);
110             if (size < 0 || size > 3) {
111                 f.close();
112                 f = null;
113                 Log.e(TAG, "Failed to read from SharedFilter");
114                 return false;
115             }
116             if (f.stop() != Tuner.RESULT_SUCCESS) {
117                 f.close();
118                 f = null;
119                 Log.e(TAG, "Failed to stop SharedFilter");
120                 return false;
121             }
122             f.close();
123             f = null;
124             return true;
125         }
126     }
127 
getFilterCallback()128     private FilterCallback getFilterCallback() {
129         return new FilterCallback() {
130             @Override
131             public void onFilterEvent(Filter filter, FilterEvent[] events) {}
132             @Override
133             public void onFilterStatusChanged(Filter filter, int status) {}
134         };
135     }
136 
getSharedFilterCallback()137     private SharedFilterCallback getSharedFilterCallback() {
138         return new SharedFilterCallback() {
139             @Override
140             public void onFilterEvent(SharedFilter filter, FilterEvent[] events) {}
141             @Override
142             public void onFilterStatusChanged(SharedFilter filter, int status) {}
143         };
144     }
145 
getExecutor()146     private Executor getExecutor() { return Runnable::run; }
147 }
148