1 /*
2  * Copyright (C) 2017 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.phone.testapps.embmsmw;
18 
19 import android.content.Context;
20 import android.net.Uri;
21 import android.telephony.mbms.FileInfo;
22 import android.telephony.mbms.FileServiceInfo;
23 
24 import java.util.ArrayList;
25 import java.util.Arrays;
26 import java.util.Date;
27 import java.util.HashMap;
28 import java.util.List;
29 import java.util.Locale;
30 import java.util.Map;
31 import java.util.stream.Collectors;
32 
33 public class FileServiceRepository {
34     private int sServiceIdCounter = 0;
35     private final Map<String, FileServiceInfo> mIdToServiceInfo = new HashMap<>();
36     private final Map<Uri, Integer> mFileUriToResource = new HashMap<>();
37 
38     private static final String FILE_DOWNLOAD_SCHEME = "filedownload";
39     private static final String FILE_AUTHORITY = "com.android.phone.testapps";
40 
41     private static FileServiceRepository sInstance;
getInstance(Context context)42     public static FileServiceRepository getInstance(Context context) {
43         if (sInstance == null) {
44             sInstance = new FileServiceRepository(context);
45         }
46         return sInstance;
47     }
48 
49     private final Context mContext;
50 
FileServiceRepository(Context context)51     private FileServiceRepository(Context context) {
52         mContext = context;
53         Uri sunAndTree = initFile("sunAndTree.png", R.raw.suntree);
54         Uri snake = initFile("animals/snake.png", R.raw.snake);
55         Uri unicorn = initFile("animals/unicorn.png", R.raw.unicorn);
56         Uri sheep = initFile("animals/sheep.png", R.raw.sheep);
57 
58         createFileService("Class1", sunAndTree);
59         createFileService("Class1", snake, unicorn, sheep);
60     }
61 
getFileServicesForClasses( List<String> serviceClasses)62     public List<FileServiceInfo> getFileServicesForClasses(
63             List<String> serviceClasses) {
64         return mIdToServiceInfo.values().stream()
65                 .filter((info) -> serviceClasses.contains(info.getServiceClassName()))
66                 .collect(Collectors.toList());
67     }
68 
getAllFileServices()69     public List<FileServiceInfo> getAllFileServices() {
70         return new ArrayList<>(mIdToServiceInfo.values());
71     }
72 
getFileServiceInfoForId(String serviceId)73     public FileServiceInfo getFileServiceInfoForId(String serviceId) {
74         return mIdToServiceInfo.getOrDefault(serviceId, null);
75     }
76 
getResourceForFileUri(Uri uri)77     public int getResourceForFileUri(Uri uri) {
78         return mFileUriToResource.getOrDefault(uri, 0);
79     }
80 
createFileService(String className, Uri... filesIncluded)81     private void createFileService(String className, Uri... filesIncluded) {
82         sServiceIdCounter++;
83         String id = "FileServiceId[" + sServiceIdCounter + "]";
84         List<Locale> locales = new ArrayList<Locale>(2) {{
85             add(Locale.US);
86             add(Locale.UK);
87         }};
88         Map<Locale, String> localeDict = new HashMap<Locale, String>() {{
89             put(Locale.US, "File Source " + sServiceIdCounter);
90             put(Locale.UK, "File Source with extra vowels " + sServiceIdCounter);
91         }};
92         List<FileInfo> fileInfos = Arrays.stream(filesIncluded)
93                 .map(this::getFileInfoForUri)
94                 .collect(Collectors.toList());
95         FileServiceInfo info = new FileServiceInfo(localeDict, className, locales,
96                 id, new Date(System.currentTimeMillis() - 10000),
97                 new Date(System.currentTimeMillis() + 10000),
98                 fileInfos);
99         mIdToServiceInfo.put(id, info);
100     }
101 
initFile(String relPath, int resource)102     private Uri initFile(String relPath, int resource) {
103         Uri uri = new Uri.Builder()
104                 .scheme(FILE_DOWNLOAD_SCHEME)
105                 .authority(FILE_AUTHORITY)
106                 .path(relPath)
107                 .build();
108         mFileUriToResource.put(uri, resource);
109         return uri;
110     }
111 
getFileInfoForUri(Uri uri)112     private FileInfo getFileInfoForUri(Uri uri) {
113         if (!mFileUriToResource.containsKey(uri)) {
114             return null;
115         }
116 
117         return new FileInfo(uri, "application/octet-stream");
118     }
119 }
120