1 /*
2  * Copyright (C) 2024 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 com.android.providers.media.mediacognitionservices;
18 
19 import android.content.UriMatcher;
20 import android.os.CancellationSignal;
21 import android.provider.MediaCognitionGetVersionsCallback;
22 import android.provider.MediaCognitionProcessingCallback;
23 import android.provider.MediaCognitionProcessingRequest;
24 import android.provider.MediaCognitionProcessingResponse;
25 import android.provider.MediaCognitionProcessingVersions;
26 import android.provider.MediaCognitionService;
27 
28 import androidx.annotation.NonNull;
29 
30 import java.util.ArrayList;
31 import java.util.Arrays;
32 import java.util.List;
33 
34 public class TestMediaCognitionService extends MediaCognitionService {
35     private static final int TEST_IMAGE = 1;
36     private static final int TEST_IMAGE_LARGE_DATA = 2;
37 
38     private static final UriMatcher sUriMatcher = new UriMatcher(UriMatcher.NO_MATCH);
39     static {
40         sUriMatcher.addURI("media", "test_image/#", TEST_IMAGE);
41 
42         sUriMatcher.addURI("media", "test_image_large_data/#", TEST_IMAGE_LARGE_DATA);
43     }
44     @Override
onProcessMedia(@onNull List<MediaCognitionProcessingRequest> requests, CancellationSignal cancellationSignal, @NonNull MediaCognitionProcessingCallback callback)45     public void onProcessMedia(@NonNull List<MediaCognitionProcessingRequest> requests,
46             CancellationSignal cancellationSignal,
47             @NonNull MediaCognitionProcessingCallback callback) {
48         if (requests.size() == 0) {
49             callback.onFailure("empty request");
50         }
51         List<MediaCognitionProcessingResponse> responses =
52                 new ArrayList<MediaCognitionProcessingResponse>();
53         int count = 1;
54         String largeString = null;
55         for (MediaCognitionProcessingRequest request: requests) {
56             MediaCognitionProcessingResponse.Builder responseBuilder =
57                     new MediaCognitionProcessingResponse.Builder(request);
58             String image_ocr_latin = "";
59             String image_label = "";
60             switch (sUriMatcher.match(request.getUri())) {
61                 case TEST_IMAGE : {
62                     image_ocr_latin = "image_ocr_latin_" + count;
63                     image_label = "image_label_" + count;
64                     break;
65                 }
66                 case TEST_IMAGE_LARGE_DATA : {
67                     if (largeString == null) {
68                         largeString = generateLargeString();
69                     }
70                     image_ocr_latin = largeString;
71                     image_label = largeString;
72                 }
73             }
74             if (request.checkProcessingRequired(ProcessingTypes.IMAGE_LABEL)) {
75                 responseBuilder.setImageLabels(new ArrayList<String>(
76                         Arrays.asList(image_label)));
77             }
78             if (request.checkProcessingRequired(ProcessingTypes.IMAGE_OCR_LATIN)) {
79                 responseBuilder.setImageOcrLatin(image_ocr_latin);
80             }
81             responses.add(responseBuilder.build());
82             count++;
83         }
84         callback.onSuccess(responses);
85     }
86 
generateLargeString()87     private String generateLargeString() {
88         StringBuilder builder = new StringBuilder(25000);
89         for (int i = 0; i < 25000; i++) {
90             builder.append('a');
91         }
92         return builder.toString();
93     }
94 
95 
96     @Override
onGetProcessingVersions(@onNull MediaCognitionGetVersionsCallback callback)97     public void onGetProcessingVersions(@NonNull MediaCognitionGetVersionsCallback callback) {
98         MediaCognitionProcessingVersions versions = new MediaCognitionProcessingVersions();
99         versions.setProcessingVersion(MediaCognitionService.ProcessingTypes.IMAGE_LABEL, 1);
100         versions.setProcessingVersion(MediaCognitionService.ProcessingTypes.IMAGE_OCR_LATIN, 1);
101         callback.onSuccess(versions);
102     }
103 }
104