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