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