1fedc493cd810fbd4385efbd647ee70852870988fLeon Scroggins/* 2fedc493cd810fbd4385efbd647ee70852870988fLeon Scroggins * Copyright (C) 2010 The Android Open Source Project 3fedc493cd810fbd4385efbd647ee70852870988fLeon Scroggins * 4fedc493cd810fbd4385efbd647ee70852870988fLeon Scroggins * Licensed under the Apache License, Version 2.0 (the "License"); 5fedc493cd810fbd4385efbd647ee70852870988fLeon Scroggins * you may not use this file except in compliance with the License. 6fedc493cd810fbd4385efbd647ee70852870988fLeon Scroggins * You may obtain a copy of the License at 7fedc493cd810fbd4385efbd647ee70852870988fLeon Scroggins * 8fedc493cd810fbd4385efbd647ee70852870988fLeon Scroggins * http://www.apache.org/licenses/LICENSE-2.0 9fedc493cd810fbd4385efbd647ee70852870988fLeon Scroggins * 10fedc493cd810fbd4385efbd647ee70852870988fLeon Scroggins * Unless required by applicable law or agreed to in writing, software 11fedc493cd810fbd4385efbd647ee70852870988fLeon Scroggins * distributed under the License is distributed on an "AS IS" BASIS, 12fedc493cd810fbd4385efbd647ee70852870988fLeon Scroggins * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13fedc493cd810fbd4385efbd647ee70852870988fLeon Scroggins * See the License for the specific language governing permissions and 14fedc493cd810fbd4385efbd647ee70852870988fLeon Scroggins * limitations under the License. 15fedc493cd810fbd4385efbd647ee70852870988fLeon Scroggins */ 16fedc493cd810fbd4385efbd647ee70852870988fLeon Scroggins 17fedc493cd810fbd4385efbd647ee70852870988fLeon Scrogginspackage com.android.browser; 18fedc493cd810fbd4385efbd647ee70852870988fLeon Scroggins 195a862fcbbd5672fb85aa2f48d963a2dd4d1da940Steve Howardimport android.app.DownloadManager; 207c08a2b624566e731b4f23235d05de6eb2859235Leon Scrogginsimport android.content.ActivityNotFoundException; 21fedc493cd810fbd4385efbd647ee70852870988fLeon Scrogginsimport android.content.BroadcastReceiver; 22fedc493cd810fbd4385efbd647ee70852870988fLeon Scrogginsimport android.content.Context; 23fedc493cd810fbd4385efbd647ee70852870988fLeon Scrogginsimport android.content.Intent; 24fedc493cd810fbd4385efbd647ee70852870988fLeon Scrogginsimport android.net.Uri; 252d8a51dc35585b01725b8ffdd562d6a6f8a5606dLeon Scrogginsimport android.os.Handler; 262d8a51dc35585b01725b8ffdd562d6a6f8a5606dLeon Scrogginsimport android.os.HandlerThread; 27fedc493cd810fbd4385efbd647ee70852870988fLeon Scroggins 28fedc493cd810fbd4385efbd647ee70852870988fLeon Scroggins/** 29a682a3ccac02db69bd8708258aae263be4b22e72Leon Scroggins III * This {@link BroadcastReceiver} handles clicks to notifications that 30a682a3ccac02db69bd8708258aae263be4b22e72Leon Scroggins III * downloads from the browser are in progress/complete. Clicking on an 31a682a3ccac02db69bd8708258aae263be4b22e72Leon Scroggins III * in-progress or failed download will open the download manager. Clicking on 32a682a3ccac02db69bd8708258aae263be4b22e72Leon Scroggins III * a complete, successful download will open the file. 33fedc493cd810fbd4385efbd647ee70852870988fLeon Scroggins */ 34fedc493cd810fbd4385efbd647ee70852870988fLeon Scrogginspublic class OpenDownloadReceiver extends BroadcastReceiver { 352d8a51dc35585b01725b8ffdd562d6a6f8a5606dLeon Scroggins private static Handler sAsyncHandler; 362d8a51dc35585b01725b8ffdd562d6a6f8a5606dLeon Scroggins static { 372d8a51dc35585b01725b8ffdd562d6a6f8a5606dLeon Scroggins HandlerThread thr = new HandlerThread("Open browser download async"); 382d8a51dc35585b01725b8ffdd562d6a6f8a5606dLeon Scroggins thr.start(); 392d8a51dc35585b01725b8ffdd562d6a6f8a5606dLeon Scroggins sAsyncHandler = new Handler(thr.getLooper()); 402d8a51dc35585b01725b8ffdd562d6a6f8a5606dLeon Scroggins } 4109ccfc737f764131c16334a444c7b96ab751c402Leon Scroggins @Override 422d8a51dc35585b01725b8ffdd562d6a6f8a5606dLeon Scroggins public void onReceive(final Context context, Intent intent) { 4309ccfc737f764131c16334a444c7b96ab751c402Leon Scroggins String action = intent.getAction(); 4409ccfc737f764131c16334a444c7b96ab751c402Leon Scroggins if (!DownloadManager.ACTION_NOTIFICATION_CLICKED.equals(action)) { 4509ccfc737f764131c16334a444c7b96ab751c402Leon Scroggins openDownloadsPage(context); 4609ccfc737f764131c16334a444c7b96ab751c402Leon Scroggins return; 4709ccfc737f764131c16334a444c7b96ab751c402Leon Scroggins } 4809ccfc737f764131c16334a444c7b96ab751c402Leon Scroggins long ids[] = intent.getLongArrayExtra( 4909ccfc737f764131c16334a444c7b96ab751c402Leon Scroggins DownloadManager.EXTRA_NOTIFICATION_CLICK_DOWNLOAD_IDS); 5009ccfc737f764131c16334a444c7b96ab751c402Leon Scroggins if (ids == null || ids.length == 0) { 5109ccfc737f764131c16334a444c7b96ab751c402Leon Scroggins openDownloadsPage(context); 5209ccfc737f764131c16334a444c7b96ab751c402Leon Scroggins return; 5309ccfc737f764131c16334a444c7b96ab751c402Leon Scroggins } 542d8a51dc35585b01725b8ffdd562d6a6f8a5606dLeon Scroggins final long id = ids[0]; 552d8a51dc35585b01725b8ffdd562d6a6f8a5606dLeon Scroggins final PendingResult result = goAsync(); 562d8a51dc35585b01725b8ffdd562d6a6f8a5606dLeon Scroggins Runnable worker = new Runnable() { 572d8a51dc35585b01725b8ffdd562d6a6f8a5606dLeon Scroggins @Override 582d8a51dc35585b01725b8ffdd562d6a6f8a5606dLeon Scroggins public void run() { 592d8a51dc35585b01725b8ffdd562d6a6f8a5606dLeon Scroggins onReceiveAsync(context, id); 602d8a51dc35585b01725b8ffdd562d6a6f8a5606dLeon Scroggins result.finish(); 612d8a51dc35585b01725b8ffdd562d6a6f8a5606dLeon Scroggins } 622d8a51dc35585b01725b8ffdd562d6a6f8a5606dLeon Scroggins }; 632d8a51dc35585b01725b8ffdd562d6a6f8a5606dLeon Scroggins sAsyncHandler.post(worker); 642d8a51dc35585b01725b8ffdd562d6a6f8a5606dLeon Scroggins } 652d8a51dc35585b01725b8ffdd562d6a6f8a5606dLeon Scroggins 662d8a51dc35585b01725b8ffdd562d6a6f8a5606dLeon Scroggins private void onReceiveAsync(Context context, long id) { 6709ccfc737f764131c16334a444c7b96ab751c402Leon Scroggins DownloadManager manager = (DownloadManager) context.getSystemService( 6809ccfc737f764131c16334a444c7b96ab751c402Leon Scroggins Context.DOWNLOAD_SERVICE); 691d88aa02955a2579e38f6aeea56ec737a0310d62Vasu Nori Uri uri = manager.getUriForDownloadedFile(id); 701d88aa02955a2579e38f6aeea56ec737a0310d62Vasu Nori if (uri == null) { 711d88aa02955a2579e38f6aeea56ec737a0310d62Vasu Nori // Open the downloads page 721d88aa02955a2579e38f6aeea56ec737a0310d62Vasu Nori openDownloadsPage(context); 731d88aa02955a2579e38f6aeea56ec737a0310d62Vasu Nori } else { 741d88aa02955a2579e38f6aeea56ec737a0310d62Vasu Nori Intent launchIntent = new Intent(Intent.ACTION_VIEW); 75628bc7e9fe6305057835c4d8e5577611d2114116Vasu Nori launchIntent.setDataAndType(uri, manager.getMimeTypeForDownloadedFile(id)); 761d88aa02955a2579e38f6aeea56ec737a0310d62Vasu Nori launchIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 777c08a2b624566e731b4f23235d05de6eb2859235Leon Scroggins try { 787c08a2b624566e731b4f23235d05de6eb2859235Leon Scroggins context.startActivity(launchIntent); 797c08a2b624566e731b4f23235d05de6eb2859235Leon Scroggins } catch (ActivityNotFoundException e) { 807c08a2b624566e731b4f23235d05de6eb2859235Leon Scroggins openDownloadsPage(context); 817c08a2b624566e731b4f23235d05de6eb2859235Leon Scroggins } 82fedc493cd810fbd4385efbd647ee70852870988fLeon Scroggins } 83fedc493cd810fbd4385efbd647ee70852870988fLeon Scroggins } 8409ccfc737f764131c16334a444c7b96ab751c402Leon Scroggins 8509ccfc737f764131c16334a444c7b96ab751c402Leon Scroggins /** 8609ccfc737f764131c16334a444c7b96ab751c402Leon Scroggins * Open the Activity which shows a list of all downloads. 8709ccfc737f764131c16334a444c7b96ab751c402Leon Scroggins * @param context 8809ccfc737f764131c16334a444c7b96ab751c402Leon Scroggins */ 8909ccfc737f764131c16334a444c7b96ab751c402Leon Scroggins private void openDownloadsPage(Context context) { 9009ccfc737f764131c16334a444c7b96ab751c402Leon Scroggins Intent pageView = new Intent(DownloadManager.ACTION_VIEW_DOWNLOADS); 9109ccfc737f764131c16334a444c7b96ab751c402Leon Scroggins pageView.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 9209ccfc737f764131c16334a444c7b96ab751c402Leon Scroggins context.startActivity(pageView); 9309ccfc737f764131c16334a444c7b96ab751c402Leon Scroggins } 94fedc493cd810fbd4385efbd647ee70852870988fLeon Scroggins} 95