1226940ed8550c02875a987f7e46699e6003ec1c0Michal Karpinski/*
2226940ed8550c02875a987f7e46699e6003ec1c0Michal Karpinski * Copyright (C) 2015 The Android Open Source Project
3226940ed8550c02875a987f7e46699e6003ec1c0Michal Karpinski *
4226940ed8550c02875a987f7e46699e6003ec1c0Michal Karpinski * Licensed under the Apache License, Version 2.0 (the "License");
5226940ed8550c02875a987f7e46699e6003ec1c0Michal Karpinski * you may not use this file except in compliance with the License.
6226940ed8550c02875a987f7e46699e6003ec1c0Michal Karpinski * You may obtain a copy of the License at
7226940ed8550c02875a987f7e46699e6003ec1c0Michal Karpinski *
8226940ed8550c02875a987f7e46699e6003ec1c0Michal Karpinski *      http://www.apache.org/licenses/LICENSE-2.0
9226940ed8550c02875a987f7e46699e6003ec1c0Michal Karpinski *
10226940ed8550c02875a987f7e46699e6003ec1c0Michal Karpinski * Unless required by applicable law or agreed to in writing, software
11226940ed8550c02875a987f7e46699e6003ec1c0Michal Karpinski * distributed under the License is distributed on an "AS IS" BASIS,
12226940ed8550c02875a987f7e46699e6003ec1c0Michal Karpinski * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13226940ed8550c02875a987f7e46699e6003ec1c0Michal Karpinski * See the License for the specific language governing permissions and
14226940ed8550c02875a987f7e46699e6003ec1c0Michal Karpinski * limitations under the License.
15226940ed8550c02875a987f7e46699e6003ec1c0Michal Karpinski */
16226940ed8550c02875a987f7e46699e6003ec1c0Michal Karpinski
17226940ed8550c02875a987f7e46699e6003ec1c0Michal Karpinskipackage com.android.shell;
18226940ed8550c02875a987f7e46699e6003ec1c0Michal Karpinski
19226940ed8550c02875a987f7e46699e6003ec1c0Michal Karpinskiimport static com.android.shell.BugreportProgressService.EXTRA_BUGREPORT;
20226940ed8550c02875a987f7e46699e6003ec1c0Michal Karpinskiimport static com.android.shell.BugreportProgressService.INTENT_REMOTE_BUGREPORT_FINISHED;
21226940ed8550c02875a987f7e46699e6003ec1c0Michal Karpinskiimport static com.android.shell.BugreportProgressService.getFileExtra;
22226940ed8550c02875a987f7e46699e6003ec1c0Michal Karpinskiimport static com.android.shell.BugreportProgressService.getUri;
23226940ed8550c02875a987f7e46699e6003ec1c0Michal Karpinskiimport static com.android.shell.BugreportReceiver.cleanupOldFiles;
24226940ed8550c02875a987f7e46699e6003ec1c0Michal Karpinski
25226940ed8550c02875a987f7e46699e6003ec1c0Michal Karpinskiimport java.io.File;
26226940ed8550c02875a987f7e46699e6003ec1c0Michal Karpinski
272552f8aec44d03aa001759a0376c25411ec62c28Michal Karpinskiimport android.app.admin.DevicePolicyManager;
28226940ed8550c02875a987f7e46699e6003ec1c0Michal Karpinskiimport android.content.BroadcastReceiver;
29226940ed8550c02875a987f7e46699e6003ec1c0Michal Karpinskiimport android.content.Context;
30226940ed8550c02875a987f7e46699e6003ec1c0Michal Karpinskiimport android.content.Intent;
31226940ed8550c02875a987f7e46699e6003ec1c0Michal Karpinskiimport android.net.Uri;
32226940ed8550c02875a987f7e46699e6003ec1c0Michal Karpinskiimport android.os.UserHandle;
33a57f0e6b14754aa39e8454d82b9fa08e3f2b53a5Michal Karpinskiimport android.text.format.DateUtils;
34226940ed8550c02875a987f7e46699e6003ec1c0Michal Karpinski
35226940ed8550c02875a987f7e46699e6003ec1c0Michal Karpinski/**
36226940ed8550c02875a987f7e46699e6003ec1c0Michal Karpinski * Receiver that handles finished remote bugreports, by re-sending
37226940ed8550c02875a987f7e46699e6003ec1c0Michal Karpinski * the intent with appended bugreport zip file URI.
38226940ed8550c02875a987f7e46699e6003ec1c0Michal Karpinski *
39226940ed8550c02875a987f7e46699e6003ec1c0Michal Karpinski * <p> Remote bugreport never contains a screenshot.
40226940ed8550c02875a987f7e46699e6003ec1c0Michal Karpinski */
41226940ed8550c02875a987f7e46699e6003ec1c0Michal Karpinskipublic class RemoteBugreportReceiver extends BroadcastReceiver {
42226940ed8550c02875a987f7e46699e6003ec1c0Michal Karpinski
43226940ed8550c02875a987f7e46699e6003ec1c0Michal Karpinski    private static final String BUGREPORT_MIMETYPE = "application/vnd.android.bugreport";
44226940ed8550c02875a987f7e46699e6003ec1c0Michal Karpinski
45a57f0e6b14754aa39e8454d82b9fa08e3f2b53a5Michal Karpinski    /** Always keep just the last remote bugreport's files around. */
46a57f0e6b14754aa39e8454d82b9fa08e3f2b53a5Michal Karpinski    private static final int REMOTE_BUGREPORT_FILES_AMOUNT = 3;
47a57f0e6b14754aa39e8454d82b9fa08e3f2b53a5Michal Karpinski
48a57f0e6b14754aa39e8454d82b9fa08e3f2b53a5Michal Karpinski    /** Always keep remote bugreport files created in the last day. */
49a57f0e6b14754aa39e8454d82b9fa08e3f2b53a5Michal Karpinski    private static final long MIN_KEEP_AGE = DateUtils.DAY_IN_MILLIS;
50226940ed8550c02875a987f7e46699e6003ec1c0Michal Karpinski
51226940ed8550c02875a987f7e46699e6003ec1c0Michal Karpinski    @Override
52226940ed8550c02875a987f7e46699e6003ec1c0Michal Karpinski    public void onReceive(Context context, Intent intent) {
53a57f0e6b14754aa39e8454d82b9fa08e3f2b53a5Michal Karpinski        cleanupOldFiles(this, intent, INTENT_REMOTE_BUGREPORT_FINISHED,
54a57f0e6b14754aa39e8454d82b9fa08e3f2b53a5Michal Karpinski                REMOTE_BUGREPORT_FILES_AMOUNT, MIN_KEEP_AGE);
55226940ed8550c02875a987f7e46699e6003ec1c0Michal Karpinski
56226940ed8550c02875a987f7e46699e6003ec1c0Michal Karpinski        final File bugreportFile = getFileExtra(intent, EXTRA_BUGREPORT);
57226940ed8550c02875a987f7e46699e6003ec1c0Michal Karpinski        final Uri bugreportUri = getUri(context, bugreportFile);
582552f8aec44d03aa001759a0376c25411ec62c28Michal Karpinski        final String bugreportHash = intent.getStringExtra(
592552f8aec44d03aa001759a0376c25411ec62c28Michal Karpinski                DevicePolicyManager.EXTRA_REMOTE_BUGREPORT_HASH);
60226940ed8550c02875a987f7e46699e6003ec1c0Michal Karpinski
612552f8aec44d03aa001759a0376c25411ec62c28Michal Karpinski        final Intent newIntent = new Intent(DevicePolicyManager.ACTION_REMOTE_BUGREPORT_DISPATCH);
62226940ed8550c02875a987f7e46699e6003ec1c0Michal Karpinski        newIntent.setDataAndType(bugreportUri, BUGREPORT_MIMETYPE);
632552f8aec44d03aa001759a0376c25411ec62c28Michal Karpinski        newIntent.putExtra(DevicePolicyManager.EXTRA_REMOTE_BUGREPORT_HASH, bugreportHash);
64226940ed8550c02875a987f7e46699e6003ec1c0Michal Karpinski        context.sendBroadcastAsUser(newIntent, UserHandle.SYSTEM,
65226940ed8550c02875a987f7e46699e6003ec1c0Michal Karpinski                android.Manifest.permission.DUMP);
66226940ed8550c02875a987f7e46699e6003ec1c0Michal Karpinski    }
67226940ed8550c02875a987f7e46699e6003ec1c0Michal Karpinski}
68