| /* |
| * Copyright (C) 2020 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.internal.app; |
| |
| import android.content.Intent; |
| import android.provider.MediaStore; |
| |
| import com.android.internal.logging.InstanceId; |
| import com.android.internal.logging.UiEvent; |
| import com.android.internal.logging.UiEventLogger; |
| import com.android.internal.util.FrameworkStatsLog; |
| |
| /** |
| * Interface for writing Sharesheet atoms to statsd log. |
| * @hide |
| */ |
| public interface ChooserActivityLogger { |
| /** Logs a UiEventReported event for the system sharesheet completing initial start-up. */ |
| void logShareStarted(int eventId, String packageName, String mimeType, int appProvidedDirect, |
| int appProvidedApp, boolean isWorkprofile, int previewType, String intent); |
| |
| /** Logs a UiEventReported event for the system sharesheet when the user selects a target. */ |
| void logShareTargetSelected(int targetType, String packageName, int positionPicked, |
| boolean isPinned); |
| |
| /** Logs a UiEventReported event for the system sharesheet being triggered by the user. */ |
| default void logSharesheetTriggered() { |
| log(SharesheetStandardEvent.SHARESHEET_TRIGGERED, getInstanceId()); |
| } |
| |
| /** Logs a UiEventReported event for the system sharesheet completing loading app targets. */ |
| default void logSharesheetAppLoadComplete() { |
| log(SharesheetStandardEvent.SHARESHEET_APP_LOAD_COMPLETE, getInstanceId()); |
| } |
| |
| /** |
| * Logs a UiEventReported event for the system sharesheet completing loading service targets. |
| */ |
| default void logSharesheetDirectLoadComplete() { |
| log(SharesheetStandardEvent.SHARESHEET_DIRECT_LOAD_COMPLETE, getInstanceId()); |
| } |
| |
| /** |
| * Logs a UiEventReported event for the system sharesheet timing out loading service targets. |
| */ |
| default void logSharesheetDirectLoadTimeout() { |
| log(SharesheetStandardEvent.SHARESHEET_DIRECT_LOAD_TIMEOUT, getInstanceId()); |
| } |
| |
| /** |
| * Logs a UiEventReported event for the system sharesheet switching |
| * between work and main profile. |
| */ |
| default void logShareheetProfileChanged() { |
| log(SharesheetStandardEvent.SHARESHEET_PROFILE_CHANGED, getInstanceId()); |
| } |
| |
| /** Logs a UiEventReported event for the system sharesheet getting expanded or collapsed. */ |
| default void logSharesheetExpansionChanged(boolean isCollapsed) { |
| log(isCollapsed ? SharesheetStandardEvent.SHARESHEET_COLLAPSED : |
| SharesheetStandardEvent.SHARESHEET_EXPANDED, getInstanceId()); |
| } |
| |
| /** |
| * Logs a UiEventReported event for the system sharesheet app share ranking timing out. |
| */ |
| default void logSharesheetAppShareRankingTimeout() { |
| log(SharesheetStandardEvent.SHARESHEET_APP_SHARE_RANKING_TIMEOUT, getInstanceId()); |
| } |
| |
| /** |
| * Logs a UiEventReported event for the system sharesheet when direct share row is empty. |
| */ |
| default void logSharesheetEmptyDirectShareRow() { |
| log(SharesheetStandardEvent.SHARESHEET_EMPTY_DIRECT_SHARE_ROW, getInstanceId()); |
| } |
| |
| /** |
| * Logs a UiEventReported event for a given share activity |
| * @param event |
| * @param instanceId |
| */ |
| void log(UiEventLogger.UiEventEnum event, InstanceId instanceId); |
| |
| /** |
| * |
| * @return |
| */ |
| InstanceId getInstanceId(); |
| |
| /** |
| * The UiEvent enums that this class can log. |
| */ |
| enum SharesheetStartedEvent implements UiEventLogger.UiEventEnum { |
| @UiEvent(doc = "Basic system Sharesheet has started and is visible.") |
| SHARE_STARTED(228); |
| |
| private final int mId; |
| SharesheetStartedEvent(int id) { |
| mId = id; |
| } |
| @Override |
| public int getId() { |
| return mId; |
| } |
| } |
| |
| /** |
| * The UiEvent enums that this class can log. |
| */ |
| enum SharesheetTargetSelectedEvent implements UiEventLogger.UiEventEnum { |
| INVALID(0), |
| @UiEvent(doc = "User selected a service target.") |
| SHARESHEET_SERVICE_TARGET_SELECTED(232), |
| @UiEvent(doc = "User selected an app target.") |
| SHARESHEET_APP_TARGET_SELECTED(233), |
| @UiEvent(doc = "User selected a standard target.") |
| SHARESHEET_STANDARD_TARGET_SELECTED(234), |
| @UiEvent(doc = "User selected the copy target.") |
| SHARESHEET_COPY_TARGET_SELECTED(235), |
| @UiEvent(doc = "User selected the nearby target.") |
| SHARESHEET_NEARBY_TARGET_SELECTED(626), |
| @UiEvent(doc = "User selected the edit target.") |
| SHARESHEET_EDIT_TARGET_SELECTED(669); |
| |
| private final int mId; |
| SharesheetTargetSelectedEvent(int id) { |
| mId = id; |
| } |
| @Override public int getId() { |
| return mId; |
| } |
| |
| public static SharesheetTargetSelectedEvent fromTargetType(int targetType) { |
| switch(targetType) { |
| case ChooserActivity.SELECTION_TYPE_SERVICE: |
| return SHARESHEET_SERVICE_TARGET_SELECTED; |
| case ChooserActivity.SELECTION_TYPE_APP: |
| return SHARESHEET_APP_TARGET_SELECTED; |
| case ChooserActivity.SELECTION_TYPE_STANDARD: |
| return SHARESHEET_STANDARD_TARGET_SELECTED; |
| case ChooserActivity.SELECTION_TYPE_COPY: |
| return SHARESHEET_COPY_TARGET_SELECTED; |
| case ChooserActivity.SELECTION_TYPE_NEARBY: |
| return SHARESHEET_NEARBY_TARGET_SELECTED; |
| case ChooserActivity.SELECTION_TYPE_EDIT: |
| return SHARESHEET_EDIT_TARGET_SELECTED; |
| default: |
| return INVALID; |
| } |
| } |
| } |
| |
| /** |
| * The UiEvent enums that this class can log. |
| */ |
| enum SharesheetStandardEvent implements UiEventLogger.UiEventEnum { |
| INVALID(0), |
| @UiEvent(doc = "User clicked share.") |
| SHARESHEET_TRIGGERED(227), |
| @UiEvent(doc = "User changed from work to personal profile or vice versa.") |
| SHARESHEET_PROFILE_CHANGED(229), |
| @UiEvent(doc = "User expanded target list.") |
| SHARESHEET_EXPANDED(230), |
| @UiEvent(doc = "User collapsed target list.") |
| SHARESHEET_COLLAPSED(231), |
| @UiEvent(doc = "Sharesheet app targets is fully populated.") |
| SHARESHEET_APP_LOAD_COMPLETE(322), |
| @UiEvent(doc = "Sharesheet direct targets is fully populated.") |
| SHARESHEET_DIRECT_LOAD_COMPLETE(323), |
| @UiEvent(doc = "Sharesheet direct targets timed out.") |
| SHARESHEET_DIRECT_LOAD_TIMEOUT(324), |
| @UiEvent(doc = "Sharesheet app share ranking timed out.") |
| SHARESHEET_APP_SHARE_RANKING_TIMEOUT(831), |
| @UiEvent(doc = "Sharesheet empty direct share row.") |
| SHARESHEET_EMPTY_DIRECT_SHARE_ROW(828); |
| |
| private final int mId; |
| SharesheetStandardEvent(int id) { |
| mId = id; |
| } |
| @Override public int getId() { |
| return mId; |
| } |
| } |
| |
| /** |
| * Returns the enum used in sharesheet started atom to indicate what preview type was used. |
| */ |
| default int typeFromPreviewInt(int previewType) { |
| switch(previewType) { |
| case ChooserActivity.CONTENT_PREVIEW_IMAGE: |
| return FrameworkStatsLog.SHARESHEET_STARTED__PREVIEW_TYPE__CONTENT_PREVIEW_IMAGE; |
| case ChooserActivity.CONTENT_PREVIEW_FILE: |
| return FrameworkStatsLog.SHARESHEET_STARTED__PREVIEW_TYPE__CONTENT_PREVIEW_FILE; |
| case ChooserActivity.CONTENT_PREVIEW_TEXT: |
| default: |
| return FrameworkStatsLog |
| .SHARESHEET_STARTED__PREVIEW_TYPE__CONTENT_PREVIEW_TYPE_UNKNOWN; |
| } |
| } |
| |
| /** |
| * Returns the enum used in sharesheet started atom to indicate what intent triggers the |
| * ChooserActivity. |
| */ |
| default int typeFromIntentString(String intent) { |
| if (intent == null) { |
| return FrameworkStatsLog.SHARESHEET_STARTED__INTENT_TYPE__INTENT_DEFAULT; |
| } |
| switch (intent) { |
| case Intent.ACTION_VIEW: |
| return FrameworkStatsLog.SHARESHEET_STARTED__INTENT_TYPE__INTENT_ACTION_VIEW; |
| case Intent.ACTION_EDIT: |
| return FrameworkStatsLog.SHARESHEET_STARTED__INTENT_TYPE__INTENT_ACTION_EDIT; |
| case Intent.ACTION_SEND: |
| return FrameworkStatsLog.SHARESHEET_STARTED__INTENT_TYPE__INTENT_ACTION_SEND; |
| case Intent.ACTION_SENDTO: |
| return FrameworkStatsLog.SHARESHEET_STARTED__INTENT_TYPE__INTENT_ACTION_SENDTO; |
| case Intent.ACTION_SEND_MULTIPLE: |
| return FrameworkStatsLog |
| .SHARESHEET_STARTED__INTENT_TYPE__INTENT_ACTION_SEND_MULTIPLE; |
| case MediaStore.ACTION_IMAGE_CAPTURE: |
| return FrameworkStatsLog |
| .SHARESHEET_STARTED__INTENT_TYPE__INTENT_ACTION_IMAGE_CAPTURE; |
| case Intent.ACTION_MAIN: |
| return FrameworkStatsLog.SHARESHEET_STARTED__INTENT_TYPE__INTENT_ACTION_MAIN; |
| default: |
| return FrameworkStatsLog.SHARESHEET_STARTED__INTENT_TYPE__INTENT_DEFAULT; |
| } |
| } |
| } |