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