| /* |
| * Copyright (C) 2019 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| package com.android.systemui.screenshot; |
| |
| import static android.content.Context.NOTIFICATION_SERVICE; |
| |
| import android.app.Notification; |
| import android.app.NotificationManager; |
| import android.app.PendingIntent; |
| import android.app.admin.DevicePolicyManager; |
| import android.content.Context; |
| import android.content.Intent; |
| import android.content.res.Resources; |
| import android.os.UserHandle; |
| import android.util.DisplayMetrics; |
| import android.view.WindowManager; |
| |
| import com.android.internal.messages.nano.SystemMessageProto; |
| import com.android.systemui.R; |
| import com.android.systemui.SystemUI; |
| import com.android.systemui.util.NotificationChannels; |
| |
| import javax.inject.Inject; |
| |
| /** |
| * Convenience class to handle showing and hiding notifications while taking a screenshot. |
| */ |
| public class ScreenshotNotificationsController { |
| private static final String TAG = "ScreenshotNotificationManager"; |
| |
| private final Context mContext; |
| private final Resources mResources; |
| private final NotificationManager mNotificationManager; |
| |
| @Inject |
| ScreenshotNotificationsController(Context context, WindowManager windowManager) { |
| mContext = context; |
| mResources = context.getResources(); |
| mNotificationManager = |
| (NotificationManager) context.getSystemService(NOTIFICATION_SERVICE); |
| |
| DisplayMetrics displayMetrics = new DisplayMetrics(); |
| windowManager.getDefaultDisplay().getRealMetrics(displayMetrics); |
| } |
| |
| /** |
| * Sends a notification that the screenshot capture has failed. |
| */ |
| public void notifyScreenshotError(int msgResId) { |
| Resources res = mContext.getResources(); |
| String errorMsg = res.getString(msgResId); |
| |
| // Repurpose the existing notification to notify the user of the error |
| Notification.Builder b = new Notification.Builder(mContext, NotificationChannels.ALERTS) |
| .setTicker(res.getString(R.string.screenshot_failed_title)) |
| .setContentTitle(res.getString(R.string.screenshot_failed_title)) |
| .setContentText(errorMsg) |
| .setSmallIcon(R.drawable.stat_notify_image_error) |
| .setWhen(System.currentTimeMillis()) |
| .setVisibility(Notification.VISIBILITY_PUBLIC) // ok to show outside lockscreen |
| .setCategory(Notification.CATEGORY_ERROR) |
| .setAutoCancel(true) |
| .setColor(mContext.getColor( |
| com.android.internal.R.color.system_notification_accent_color)); |
| final DevicePolicyManager dpm = |
| (DevicePolicyManager) mContext.getSystemService(Context.DEVICE_POLICY_SERVICE); |
| final Intent intent = |
| dpm.createAdminSupportIntent(DevicePolicyManager.POLICY_DISABLE_SCREEN_CAPTURE); |
| if (intent != null) { |
| final PendingIntent pendingIntent = PendingIntent.getActivityAsUser( |
| mContext, 0, intent, PendingIntent.FLAG_IMMUTABLE, null, UserHandle.CURRENT); |
| b.setContentIntent(pendingIntent); |
| } |
| |
| SystemUI.overrideNotificationAppName(mContext, b, true); |
| |
| Notification n = new Notification.BigTextStyle(b) |
| .bigText(errorMsg) |
| .build(); |
| mNotificationManager.notify(SystemMessageProto.SystemMessage.NOTE_GLOBAL_SCREENSHOT, n); |
| } |
| } |