1 /* 2 * Copyright 2022 Google LLC 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 package com.google.android.libraries.mobiledatadownload; 17 18 import android.content.Context; 19 import android.text.TextUtils; 20 import android.util.Log; 21 import com.google.common.util.concurrent.Futures; 22 import com.google.common.util.concurrent.ListenableFuture; 23 import com.google.common.util.concurrent.MoreExecutors; 24 import com.google.mobiledatadownload.DownloadConfigProto.DataFile; 25 import com.google.mobiledatadownload.DownloadConfigProto.DataFile.ChecksumType; 26 import com.google.mobiledatadownload.DownloadConfigProto.DataFileGroup; 27 import com.google.mobiledatadownload.DownloadConfigProto.DownloadConditions; 28 import com.google.mobiledatadownload.DownloadConfigProto.DownloadConditions.DeviceNetworkPolicy; 29 30 /** Test FileGroup Populator. */ 31 public class TestFileGroupPopulator implements FileGroupPopulator { 32 33 private static final String TAG = "MDD TestFileGroupPopulator"; 34 35 static final String FILE_GROUP_NAME = "test-group"; 36 static final String FILE_ID = "test-file-id"; 37 static final int FILE_SIZE = 554; 38 static final String FILE_CHECKSUM = "a1cba9d87b1440f41ce9e7da38c43e1f6bd7d5df"; 39 static final String FILE_URL = "https://www.gstatic.com/suggest-dev/odws1_empty.jar"; 40 41 private final Context context; 42 TestFileGroupPopulator(Context context)43 public TestFileGroupPopulator(Context context) { 44 this.context = context; 45 } 46 47 @Override refreshFileGroups(MobileDataDownload mobileDataDownload)48 public ListenableFuture<Void> refreshFileGroups(MobileDataDownload mobileDataDownload) { 49 Log.d(TAG, "Adding file groups " + FILE_GROUP_NAME); 50 51 DataFileGroup dataFileGroup = 52 createDataFileGroup( 53 FILE_GROUP_NAME, 54 context.getPackageName(), 55 new String[] {FILE_ID}, 56 new int[] {FILE_SIZE}, 57 new String[] {FILE_CHECKSUM}, 58 new String[] {FILE_URL}, 59 DeviceNetworkPolicy.DOWNLOAD_ON_ANY_NETWORK); 60 61 ListenableFuture<Boolean> addFileGroupFuture = 62 mobileDataDownload.addFileGroup( 63 AddFileGroupRequest.newBuilder().setDataFileGroup(dataFileGroup).build()); 64 return Futures.transform( 65 addFileGroupFuture, 66 result -> { 67 if (result.booleanValue()) { 68 Log.d(TAG, "Added file groups " + dataFileGroup.getGroupName()); 69 } else { 70 Log.d(TAG, "Failed to add file group " + dataFileGroup.getGroupName()); 71 } 72 return null; 73 }, 74 MoreExecutors.directExecutor()); 75 } 76 77 // A helper function to create a DataFilegroup. 78 static DataFileGroup createDataFileGroup( 79 String groupName, 80 String ownerPackage, 81 String[] fileId, 82 int[] byteSize, 83 String[] checksum, 84 String[] url, 85 DeviceNetworkPolicy deviceNetworkPolicy) { 86 if (fileId.length != byteSize.length 87 || fileId.length != checksum.length 88 || fileId.length != url.length) { 89 throw new IllegalArgumentException(); 90 } 91 92 DataFileGroup.Builder dataFileGroupBuilder = 93 DataFileGroup.newBuilder() 94 .setGroupName(groupName) 95 .setOwnerPackage(ownerPackage) 96 .setDownloadConditions( 97 DownloadConditions.newBuilder().setDeviceNetworkPolicy(deviceNetworkPolicy)); 98 99 for (int i = 0; i < fileId.length; ++i) { 100 DataFile.Builder fileBuilder = 101 DataFile.newBuilder() 102 .setFileId(fileId[i]) 103 .setByteSize(byteSize[i]) 104 .setChecksum(checksum[i]) 105 .setUrlToDownload(url[i]); 106 if (checksum[i].isEmpty()) { 107 fileBuilder.setChecksumType(ChecksumType.NONE); 108 } 109 dataFileGroupBuilder.addFile(fileBuilder.build()); 110 } 111 112 return dataFileGroupBuilder.build(); 113 } 114 115 // Allows to configure android-shared and non-android-shared files. 116 static DataFileGroup createDataFileGroup( 117 String groupName, 118 String ownerPackage, 119 String[] fileId, 120 int[] byteSize, 121 String[] checksum, 122 String[] androidSharingChecksum, 123 String[] url, 124 DeviceNetworkPolicy deviceNetworkPolicy) { 125 if (fileId.length != byteSize.length 126 || fileId.length != checksum.length 127 || fileId.length != url.length) { 128 throw new IllegalArgumentException(); 129 } 130 131 DataFileGroup.Builder dataFileGroupBuilder = 132 DataFileGroup.newBuilder() 133 .setGroupName(groupName) 134 .setOwnerPackage(ownerPackage) 135 .setDownloadConditions( 136 DownloadConditions.newBuilder().setDeviceNetworkPolicy(deviceNetworkPolicy)); 137 138 for (int i = 0; i < fileId.length; ++i) { 139 DataFile.Builder fileBuilder = 140 DataFile.newBuilder() 141 .setFileId(fileId[i]) 142 .setByteSize(byteSize[i]) 143 .setChecksum(checksum[i]) 144 .setUrlToDownload(url[i]); 145 if (checksum[i].isEmpty()) { 146 fileBuilder.setChecksumType(ChecksumType.NONE); 147 } 148 if (!TextUtils.isEmpty(androidSharingChecksum[i])) { 149 fileBuilder 150 .setAndroidSharingType(DataFile.AndroidSharingType.ANDROID_BLOB_WHEN_AVAILABLE) 151 .setAndroidSharingChecksumType(DataFile.AndroidSharingChecksumType.SHA2_256) 152 .setAndroidSharingChecksum(androidSharingChecksum[i]); 153 } 154 dataFileGroupBuilder.addFile(fileBuilder.build()); 155 } 156 return dataFileGroupBuilder.build(); 157 } 158 } 159