1717
1818import androidx .appcompat .app .AppCompatActivity ;
1919import androidx .core .content .ContextCompat ;
20- import androidx .core .content .FileProvider ;
21-
22- import java .io .File ;
2320import java .util .Locale ;
2421
2522final class OtaController {
@@ -115,7 +112,11 @@ private void maybeStartDownload(OtaUpdateManager.UpdateInfo info) {
115112 return ;
116113 }
117114 NetworkStateHelper .Transport transport = NetworkStateHelper .getActiveTransport (activity );
118- if (transport == NetworkStateHelper .Transport .CELLULAR ) {
115+ boolean warnForMeteredDownload = transport == NetworkStateHelper .Transport .CELLULAR
116+ || (NetworkStateHelper .isActiveNetworkMetered (activity )
117+ && transport != NetworkStateHelper .Transport .WIFI
118+ && transport != NetworkStateHelper .Transport .ETHERNET );
119+ if (warnForMeteredDownload ) {
119120 OtaDialogs .showConfirmDialog (
120121 activity ,
121122 activity .getString (R .string .ota_dialog_mobile_warning_message , info .latestVersion ),
@@ -261,9 +262,9 @@ private void startVerification(long downloadId, TextView statusView, View instal
261262 if (installButton != null ) installButton .setVisibility (View .GONE );
262263 if (statusView != null ) statusView .setText (R .string .ota_progress_verifying );
263264
264- File apkFile ;
265+ Uri apkUri ;
265266 try {
266- apkFile = resolveApkFile (downloadId );
267+ apkUri = resolveDownloadedApkUri (downloadId );
267268 } catch (Exception e ) {
268269 verificationInFlight = false ;
269270 if (statusView != null ) {
@@ -273,7 +274,7 @@ private void startVerification(long downloadId, TextView statusView, View instal
273274 return ;
274275 }
275276
276- OtaUpdateManager .verifyDownloadedApk (apkFile , activeDownloadInfo , (success , computedSha256 , message ) -> {
277+ OtaUpdateManager .verifyDownloadedApk (activity , apkUri , activeDownloadInfo , (success , computedSha256 , message ) -> {
277278 if (downloadId != verificationDownloadId ) return ;
278279 verificationInFlight = false ;
279280 verificationPassed = success ;
@@ -296,15 +297,10 @@ private void startVerification(long downloadId, TextView statusView, View instal
296297
297298 private void installUpdate (long downloadId ) {
298299 try {
299- File apkFile = resolveApkFile (downloadId );
300- if (apkFile == null || ! apkFile . exists () ) {
300+ Uri apkUri = resolveDownloadedApkUri (downloadId );
301+ if (apkUri == null ) {
301302 throw new IllegalStateException ("Downloaded APK not found" );
302303 }
303- Uri apkUri = FileProvider .getUriForFile (
304- activity ,
305- BuildConfig .APPLICATION_ID + ".fileprovider" ,
306- apkFile
307- );
308304 Intent installIntent = new Intent (Intent .ACTION_INSTALL_PACKAGE );
309305 installIntent .setData (apkUri );
310306 installIntent .setFlags (Intent .FLAG_ACTIVITY_NEW_TASK | Intent .FLAG_GRANT_READ_URI_PERMISSION );
@@ -327,16 +323,18 @@ private void installUpdate(long downloadId) {
327323 }
328324 }
329325
330- private File resolveApkFile (long downloadId ) throws Exception {
326+ private Uri resolveDownloadedApkUri (long downloadId ) throws Exception {
331327 DownloadManager dm = activity .getSystemService (DownloadManager .class );
332328 if (dm == null ) return null ;
329+ Uri downloadedUri = dm .getUriForDownloadedFile (downloadId );
330+ if (downloadedUri != null ) {
331+ return downloadedUri ;
332+ }
333333 try (Cursor cursor = dm .query (new DownloadManager .Query ().setFilterById (downloadId ))) {
334334 if (cursor == null || !cursor .moveToFirst ()) return null ;
335335 String localUri = cursor .getString (cursor .getColumnIndexOrThrow (DownloadManager .COLUMN_LOCAL_URI ));
336336 if (localUri == null || localUri .isEmpty ()) return null ;
337- Uri uri = Uri .parse (localUri );
338- if (!"file" .equalsIgnoreCase (uri .getScheme ())) return null ;
339- return new File (uri .getPath ());
337+ return Uri .parse (localUri );
340338 }
341339 }
342340
0 commit comments