• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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