blob: 37b98d0c03bbe12bbe3023609232589f6baca02e [file] [log] [blame]
// Copyright 2014 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#import "ios/chrome/browser/ui/activity_services/activity_type_util.h"
#include "base/check.h"
#include "base/metrics/user_metrics.h"
#include "base/metrics/user_metrics_action.h"
#include "base/strings/sys_string_conversions.h"
#if !defined(__has_feature) || !__has_feature(objc_arc)
#error "This file requires ARC support."
#endif
namespace activity_type_util {
struct PrefixTypeAssociation {
activity_type_util::ActivityType type_;
NSString* const prefix_;
bool requiresExactMatch_;
};
const PrefixTypeAssociation prefixTypeAssociations[] = {
{BOOKMARK, @"com.google.chrome.bookmarkActivity", true},
{COPY, @"com.google.chrome.copyActivity", true},
{NATIVE_FACEBOOK, @"com.apple.UIKit.activity.PostToFacebook", true},
{NATIVE_MAIL, @"com.apple.UIKit.activity.Mail", true},
{NATIVE_MESSAGE, @"com.apple.UIKit.activity.Message", true},
{NATIVE_TWITTER, @"com.apple.UIKit.activity.PostToTwitter", true},
{NATIVE_WEIBO, @"com.apple.UIKit.activity.PostToWeibo", true},
{NATIVE_CLIPBOARD, @"com.apple.UIKit.activity.CopyToPasteboard", true},
{NATIVE_SAVE_IMAGE, @"com.apple.UIKit.activity.SaveToCameraRoll", true},
{NATIVE_PRINT, @"com.apple.UIKit.activity.Print", true},
{PRINT, @"com.google.chrome.printActivity", true},
{FIND_IN_PAGE, @"com.google.chrome.FindInPageActivityType", true},
{GENERATE_QR_CODE, @"com.google.chrome.GenerateQrCodeActivityType", true},
// The trailing '.' prevents false positives.
// For instance, "com.viberific" won't be matched by the "com.viber.".
{GOOGLE_DRIVE, @"com.google.Drive.", false},
{GOOGLE_GMAIL, @"com.google.Gmail.", false},
{GOOGLE_GOOGLEPLUS, @"com.google.GooglePlus.", false},
{GOOGLE_HANGOUTS, @"com.google.hangouts.", false},
{GOOGLE_INBOX, @"com.google.inbox.", false},
{READ_LATER, @"com.google.chrome.readingListActivity", true},
{REQUEST_DESKTOP_MOBILE_SITE,
@"com.google.chrome.requestDesktopOrMobileSiteActivity", true},
{SEND_TAB_TO_SELF, @"com.google.com.sendTabToSelfActivity", true},
{THIRD_PARTY_MAILBOX, @"com.orchestra.v2.", false},
{THIRD_PARTY_FACEBOOK_MESSENGER, @"com.facebook.Messenger.", false},
{THIRD_PARTY_WHATS_APP, @"net.whatsapp.WhatsApp.", false},
{THIRD_PARTY_LINE, @"jp.naver.line.", false},
{THIRD_PARTY_VIBER, @"com.viber.", false},
{THIRD_PARTY_SKYPE, @"com.skype.", false},
{THIRD_PARTY_TANGO, @"com.sgiggle.Tango.", false},
{THIRD_PARTY_WECHAT, @"com.tencent.xin.", false},
{THIRD_PARTY_EVERNOTE, @"com.evernote.", false},
{THIRD_PARTY_PINTEREST, @"pinterest.", false},
{THIRD_PARTY_POCKET, @"com.ideashower.ReadItLaterPro.", false},
{THIRD_PARTY_READABILITY, @"com.readability.ReadabilityMobile.", false},
{THIRD_PARTY_INSTAPAPER, @"com.marcoarment.instapaperpro.", false},
// Put Google Unknown at the end to make sure it doesn't prevent anything
// else from being recorded.
{GOOGLE_UNKNOWN, @"com.google.", false},
};
ActivityType TypeFromString(NSString* activityString) {
DCHECK(activityString);
for (auto const& association : prefixTypeAssociations) {
if (association.requiresExactMatch_) {
if ([activityString isEqualToString:association.prefix_])
return association.type_;
} else {
if ([activityString hasPrefix:association.prefix_])
return association.type_;
}
}
return UNKNOWN;
}
void RecordMetricForActivity(ActivityType type) {
switch (type) {
case UNKNOWN:
base::RecordAction(base::UserMetricsAction("MobileShareMenuUnknown"));
break;
case BOOKMARK:
base::RecordAction(base::UserMetricsAction("MobileShareMenuBookmark"));
break;
case COPY:
case NATIVE_CLIPBOARD:
base::RecordAction(base::UserMetricsAction("MobileShareMenuClipboard"));
break;
case NATIVE_SAVE_IMAGE:
base::RecordAction(base::UserMetricsAction("MobileShareMenuSaveImage"));
break;
case FIND_IN_PAGE:
base::RecordAction(base::UserMetricsAction("MobileShareMenuFindInPage"));
break;
case PRINT:
case NATIVE_PRINT:
base::RecordAction(base::UserMetricsAction("MobileShareMenuPrint"));
break;
case READ_LATER:
base::RecordAction(base::UserMetricsAction("MobileShareMenuReadLater"));
break;
case REQUEST_DESKTOP_MOBILE_SITE:
base::RecordAction(base::UserMetricsAction("MobileShareMenuRequestSite"));
break;
case GOOGLE_GMAIL:
base::RecordAction(base::UserMetricsAction("MobileShareMenuGmail"));
break;
case GOOGLE_GOOGLEPLUS:
base::RecordAction(base::UserMetricsAction("MobileShareMenuGooglePlus"));
break;
case GOOGLE_DRIVE:
base::RecordAction(base::UserMetricsAction("MobileShareMenuGoogleDrive"));
break;
case GOOGLE_HANGOUTS:
base::RecordAction(base::UserMetricsAction("MobileShareMenuHangouts"));
break;
case GOOGLE_INBOX:
base::RecordAction(base::UserMetricsAction("MobileShareMenuInbox"));
break;
case GOOGLE_UNKNOWN:
base::RecordAction(
base::UserMetricsAction("MobileShareMenuGoogleUnknown"));
break;
case NATIVE_MAIL:
case THIRD_PARTY_MAILBOX:
base::RecordAction(base::UserMetricsAction("MobileShareMenuToMail"));
break;
case NATIVE_FACEBOOK:
case NATIVE_TWITTER:
base::RecordAction(
base::UserMetricsAction("MobileShareMenuToSocialNetwork"));
break;
case NATIVE_MESSAGE:
base::RecordAction(base::UserMetricsAction("MobileShareMenuToSMSApp"));
break;
case NATIVE_WEIBO:
case THIRD_PARTY_FACEBOOK_MESSENGER:
case THIRD_PARTY_WHATS_APP:
case THIRD_PARTY_LINE:
case THIRD_PARTY_VIBER:
case THIRD_PARTY_SKYPE:
case THIRD_PARTY_TANGO:
case THIRD_PARTY_WECHAT:
base::RecordAction(
base::UserMetricsAction("MobileShareMenuToInstantMessagingApp"));
break;
case THIRD_PARTY_EVERNOTE:
case THIRD_PARTY_PINTEREST:
case THIRD_PARTY_POCKET:
case THIRD_PARTY_READABILITY:
case THIRD_PARTY_INSTAPAPER:
base::RecordAction(
base::UserMetricsAction("MobileShareMenuToContentApp"));
break;
case SEND_TAB_TO_SELF:
base::RecordAction(
base::UserMetricsAction("MobileShareMenuSendTabToSelf"));
break;
case GENERATE_QR_CODE:
base::RecordAction(
base::UserMetricsAction("MobileShareMenuGenerateQRCode"));
break;
}
}
} // activity_type_util