13fc437e89b018f258a3dee1a83014555aa156dc4Michal Karpinski/* 23fc437e89b018f258a3dee1a83014555aa156dc4Michal Karpinski * Copyright (C) 2016 The Android Open Source Project 33fc437e89b018f258a3dee1a83014555aa156dc4Michal Karpinski * 43fc437e89b018f258a3dee1a83014555aa156dc4Michal Karpinski * Licensed under the Apache License, Version 2.0 (the "License"); 53fc437e89b018f258a3dee1a83014555aa156dc4Michal Karpinski * you may not use this file except in compliance with the License. 63fc437e89b018f258a3dee1a83014555aa156dc4Michal Karpinski * You may obtain a copy of the License at 73fc437e89b018f258a3dee1a83014555aa156dc4Michal Karpinski * 83fc437e89b018f258a3dee1a83014555aa156dc4Michal Karpinski * http://www.apache.org/licenses/LICENSE-2.0 93fc437e89b018f258a3dee1a83014555aa156dc4Michal Karpinski * 103fc437e89b018f258a3dee1a83014555aa156dc4Michal Karpinski * Unless required by applicable law or agreed to in writing, software 113fc437e89b018f258a3dee1a83014555aa156dc4Michal Karpinski * distributed under the License is distributed on an "AS IS" BASIS, 123fc437e89b018f258a3dee1a83014555aa156dc4Michal Karpinski * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 133fc437e89b018f258a3dee1a83014555aa156dc4Michal Karpinski * See the License for the specific language governing permissions and 143fc437e89b018f258a3dee1a83014555aa156dc4Michal Karpinski * limitations under the License. 153fc437e89b018f258a3dee1a83014555aa156dc4Michal Karpinski */ 163fc437e89b018f258a3dee1a83014555aa156dc4Michal Karpinski 173fc437e89b018f258a3dee1a83014555aa156dc4Michal Karpinskipackage com.android.server.devicepolicy; 183fc437e89b018f258a3dee1a83014555aa156dc4Michal Karpinski 19e9377a7d84c23571342ea1c4dc6c12875eaaf3dfMichal Karpinskiimport android.annotation.IntDef; 203fc437e89b018f258a3dee1a83014555aa156dc4Michal Karpinskiimport android.app.Notification; 213fc437e89b018f258a3dee1a83014555aa156dc4Michal Karpinskiimport android.app.PendingIntent; 22ba24409033241e680d111e7dea6501e760d972c5Michal Karpinskiimport android.app.admin.DevicePolicyManager; 23ba24409033241e680d111e7dea6501e760d972c5Michal Karpinskiimport android.content.ComponentName; 243fc437e89b018f258a3dee1a83014555aa156dc4Michal Karpinskiimport android.content.Context; 253fc437e89b018f258a3dee1a83014555aa156dc4Michal Karpinskiimport android.content.Intent; 26ba24409033241e680d111e7dea6501e760d972c5Michal Karpinskiimport android.os.UserHandle; 27ba24409033241e680d111e7dea6501e760d972c5Michal Karpinskiimport android.provider.Settings; 283fc437e89b018f258a3dee1a83014555aa156dc4Michal Karpinskiimport android.text.format.DateUtils; 293fc437e89b018f258a3dee1a83014555aa156dc4Michal Karpinski 303fc437e89b018f258a3dee1a83014555aa156dc4Michal Karpinskiimport com.android.internal.R; 31282cfefea0fbbd299839e353e6d30affdcd4a55cChris Wrenimport com.android.internal.messages.nano.SystemMessageProto.SystemMessage; 32af759c52ce01fe6b5144957e38da956af01a217bGeoffrey Pitschimport com.android.internal.notification.SystemNotificationChannels; 333fc437e89b018f258a3dee1a83014555aa156dc4Michal Karpinski 34e9377a7d84c23571342ea1c4dc6c12875eaaf3dfMichal Karpinskiimport java.lang.annotation.Retention; 35e9377a7d84c23571342ea1c4dc6c12875eaaf3dfMichal Karpinskiimport java.lang.annotation.RetentionPolicy; 36e9377a7d84c23571342ea1c4dc6c12875eaaf3dfMichal Karpinski 373fc437e89b018f258a3dee1a83014555aa156dc4Michal Karpinski/** 383fc437e89b018f258a3dee1a83014555aa156dc4Michal Karpinski * Utilities class for the remote bugreport operation. 393fc437e89b018f258a3dee1a83014555aa156dc4Michal Karpinski */ 403fc437e89b018f258a3dee1a83014555aa156dc4Michal Karpinskiclass RemoteBugreportUtils { 413fc437e89b018f258a3dee1a83014555aa156dc4Michal Karpinski 42282cfefea0fbbd299839e353e6d30affdcd4a55cChris Wren static final int NOTIFICATION_ID = SystemMessage.NOTE_REMOTE_BUGREPORT; 43e9377a7d84c23571342ea1c4dc6c12875eaaf3dfMichal Karpinski 44e9377a7d84c23571342ea1c4dc6c12875eaaf3dfMichal Karpinski @Retention(RetentionPolicy.SOURCE) 45e9377a7d84c23571342ea1c4dc6c12875eaaf3dfMichal Karpinski @IntDef({ 46ba24409033241e680d111e7dea6501e760d972c5Michal Karpinski DevicePolicyManager.NOTIFICATION_BUGREPORT_STARTED, 47ba24409033241e680d111e7dea6501e760d972c5Michal Karpinski DevicePolicyManager.NOTIFICATION_BUGREPORT_ACCEPTED_NOT_FINISHED, 48ba24409033241e680d111e7dea6501e760d972c5Michal Karpinski DevicePolicyManager.NOTIFICATION_BUGREPORT_FINISHED_NOT_ACCEPTED 49e9377a7d84c23571342ea1c4dc6c12875eaaf3dfMichal Karpinski }) 50e9377a7d84c23571342ea1c4dc6c12875eaaf3dfMichal Karpinski @interface RemoteBugreportNotificationType {} 513fc437e89b018f258a3dee1a83014555aa156dc4Michal Karpinski 523fc437e89b018f258a3dee1a83014555aa156dc4Michal Karpinski static final long REMOTE_BUGREPORT_TIMEOUT_MILLIS = 10 * DateUtils.MINUTE_IN_MILLIS; 533fc437e89b018f258a3dee1a83014555aa156dc4Michal Karpinski 543fc437e89b018f258a3dee1a83014555aa156dc4Michal Karpinski static final String CTL_STOP = "ctl.stop"; 553fc437e89b018f258a3dee1a83014555aa156dc4Michal Karpinski static final String REMOTE_BUGREPORT_SERVICE = "bugreportremote"; 563fc437e89b018f258a3dee1a83014555aa156dc4Michal Karpinski 573fc437e89b018f258a3dee1a83014555aa156dc4Michal Karpinski static final String BUGREPORT_MIMETYPE = "application/vnd.android.bugreport"; 583fc437e89b018f258a3dee1a83014555aa156dc4Michal Karpinski 59e9377a7d84c23571342ea1c4dc6c12875eaaf3dfMichal Karpinski static Notification buildNotification(Context context, 60e9377a7d84c23571342ea1c4dc6c12875eaaf3dfMichal Karpinski @RemoteBugreportNotificationType int type) { 61ba24409033241e680d111e7dea6501e760d972c5Michal Karpinski Intent dialogIntent = new Intent(Settings.ACTION_SHOW_REMOTE_BUGREPORT_DIALOG); 62ba24409033241e680d111e7dea6501e760d972c5Michal Karpinski dialogIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK); 63ba24409033241e680d111e7dea6501e760d972c5Michal Karpinski dialogIntent.putExtra(DevicePolicyManager.EXTRA_BUGREPORT_NOTIFICATION_TYPE, type); 64ba24409033241e680d111e7dea6501e760d972c5Michal Karpinski PendingIntent pendingDialogIntent = PendingIntent.getActivityAsUser(context, type, 65ba24409033241e680d111e7dea6501e760d972c5Michal Karpinski dialogIntent, 0, null, UserHandle.CURRENT); 66ba24409033241e680d111e7dea6501e760d972c5Michal Karpinski 67af759c52ce01fe6b5144957e38da956af01a217bGeoffrey Pitsch Notification.Builder builder = 68af759c52ce01fe6b5144957e38da956af01a217bGeoffrey Pitsch new Notification.Builder(context, SystemNotificationChannels.DEVELOPER) 69af759c52ce01fe6b5144957e38da956af01a217bGeoffrey Pitsch .setSmallIcon(com.android.internal.R.drawable.stat_sys_adb) 70af759c52ce01fe6b5144957e38da956af01a217bGeoffrey Pitsch .setOngoing(true) 71af759c52ce01fe6b5144957e38da956af01a217bGeoffrey Pitsch .setLocalOnly(true) 72af759c52ce01fe6b5144957e38da956af01a217bGeoffrey Pitsch .setContentIntent(pendingDialogIntent) 73af759c52ce01fe6b5144957e38da956af01a217bGeoffrey Pitsch .setColor(context.getColor( 74af759c52ce01fe6b5144957e38da956af01a217bGeoffrey Pitsch com.android.internal.R.color.system_notification_accent_color)); 753fc437e89b018f258a3dee1a83014555aa156dc4Michal Karpinski 76ba24409033241e680d111e7dea6501e760d972c5Michal Karpinski if (type == DevicePolicyManager.NOTIFICATION_BUGREPORT_ACCEPTED_NOT_FINISHED) { 77e9377a7d84c23571342ea1c4dc6c12875eaaf3dfMichal Karpinski builder.setContentTitle(context.getString( 78ba24409033241e680d111e7dea6501e760d972c5Michal Karpinski R.string.sharing_remote_bugreport_notification_title)) 79ba24409033241e680d111e7dea6501e760d972c5Michal Karpinski .setProgress(0, 0, true); 80ba24409033241e680d111e7dea6501e760d972c5Michal Karpinski } else if (type == DevicePolicyManager.NOTIFICATION_BUGREPORT_STARTED) { 81ba24409033241e680d111e7dea6501e760d972c5Michal Karpinski builder.setContentTitle(context.getString( 82ba24409033241e680d111e7dea6501e760d972c5Michal Karpinski R.string.taking_remote_bugreport_notification_title)) 83ba24409033241e680d111e7dea6501e760d972c5Michal Karpinski .setProgress(0, 0, true); 84ba24409033241e680d111e7dea6501e760d972c5Michal Karpinski } else if (type == DevicePolicyManager.NOTIFICATION_BUGREPORT_FINISHED_NOT_ACCEPTED) { 85e9377a7d84c23571342ea1c4dc6c12875eaaf3dfMichal Karpinski PendingIntent pendingIntentAccept = PendingIntent.getBroadcast(context, NOTIFICATION_ID, 86ba24409033241e680d111e7dea6501e760d972c5Michal Karpinski new Intent(DevicePolicyManager.ACTION_BUGREPORT_SHARING_ACCEPTED), 87e9377a7d84c23571342ea1c4dc6c12875eaaf3dfMichal Karpinski PendingIntent.FLAG_CANCEL_CURRENT); 88e9377a7d84c23571342ea1c4dc6c12875eaaf3dfMichal Karpinski PendingIntent pendingIntentDecline = PendingIntent.getBroadcast(context, 89ba24409033241e680d111e7dea6501e760d972c5Michal Karpinski NOTIFICATION_ID, new Intent( 90ba24409033241e680d111e7dea6501e760d972c5Michal Karpinski DevicePolicyManager.ACTION_BUGREPORT_SHARING_DECLINED), 913fc437e89b018f258a3dee1a83014555aa156dc4Michal Karpinski PendingIntent.FLAG_CANCEL_CURRENT); 92e9377a7d84c23571342ea1c4dc6c12875eaaf3dfMichal Karpinski builder.addAction(new Notification.Action.Builder(null /* icon */, context.getString( 93ba24409033241e680d111e7dea6501e760d972c5Michal Karpinski R.string.decline_remote_bugreport_action), pendingIntentDecline).build()) 94e9377a7d84c23571342ea1c4dc6c12875eaaf3dfMichal Karpinski .addAction(new Notification.Action.Builder(null /* icon */, context.getString( 95ba24409033241e680d111e7dea6501e760d972c5Michal Karpinski R.string.share_remote_bugreport_action), pendingIntentAccept).build()) 96e9377a7d84c23571342ea1c4dc6c12875eaaf3dfMichal Karpinski .setContentTitle(context.getString( 97ba24409033241e680d111e7dea6501e760d972c5Michal Karpinski R.string.share_remote_bugreport_notification_title)) 98ba24409033241e680d111e7dea6501e760d972c5Michal Karpinski .setContentText(context.getString( 99ba24409033241e680d111e7dea6501e760d972c5Michal Karpinski R.string.share_remote_bugreport_notification_message_finished)) 100ba24409033241e680d111e7dea6501e760d972c5Michal Karpinski .setStyle(new Notification.BigTextStyle().bigText(context.getString( 101ba24409033241e680d111e7dea6501e760d972c5Michal Karpinski R.string.share_remote_bugreport_notification_message_finished))); 1023fc437e89b018f258a3dee1a83014555aa156dc4Michal Karpinski } 103e9377a7d84c23571342ea1c4dc6c12875eaaf3dfMichal Karpinski 10445aab9d974d896e56cf66e4078c1841b7c90907fMichal Karpinski return builder.build(); 1053fc437e89b018f258a3dee1a83014555aa156dc4Michal Karpinski } 1063fc437e89b018f258a3dee1a83014555aa156dc4Michal Karpinski} 1073fc437e89b018f258a3dee1a83014555aa156dc4Michal Karpinski 108