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