| Index: ios/chrome/browser/ui/activity_services/activity_type_util.mm
|
| diff --git a/ios/chrome/browser/ui/activity_services/activity_type_util.mm b/ios/chrome/browser/ui/activity_services/activity_type_util.mm
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..0675a00194ccd24d7cd6dc1547220e2c046da557
|
| --- /dev/null
|
| +++ b/ios/chrome/browser/ui/activity_services/activity_type_util.mm
|
| @@ -0,0 +1,204 @@
|
| +// 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/logging.h"
|
| +#include "base/metrics/user_metrics.h"
|
| +#include "base/metrics/user_metrics_action.h"
|
| +#import "ios/chrome/browser/ui/activity_services/appex_constants.h"
|
| +#import "ios/chrome/browser/ui/activity_services/print_activity.h"
|
| +#include "ios/chrome/grit/ios_strings.h"
|
| +#include "ui/base/l10n/l10n_util_mac.h"
|
| +
|
| +#if !defined(__has_feature) || !__has_feature(objc_arc)
|
| +#error "This file requires ARC support."
|
| +#endif
|
| +
|
| +namespace {
|
| +// A substring to identify activity strings that are from Password Management
|
| +// App Extensions. This string is intentionally without the leading and
|
| +// trailing "." so it can be used as a prefix, suffix, or substring of the
|
| +// App Extension's bundle ID.
|
| +NSString* const kFindLoginActionBundleSubstring = @"find-login-action";
|
| +}
|
| +
|
| +namespace activity_type_util {
|
| +
|
| +struct PrefixTypeAssociation {
|
| + activity_type_util::ActivityType type_;
|
| + NSString* const prefix_;
|
| + bool requiresExactMatch_;
|
| +};
|
| +
|
| +const PrefixTypeAssociation prefixTypeAssociations[] = {
|
| + {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},
|
| + {PRINT, @"com.google.chrome.printActivity", 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},
|
| + {GOOGLE_UNKNOWN, @"com.google.", false},
|
| + {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},
|
| + {APPEX_PASSWORD_MANAGEMENT_1PASSWORD,
|
| + activity_services::kAppExtensionOnePassword, true},
|
| + {APPEX_PASSWORD_MANAGEMENT_LASTPASS,
|
| + activity_services::kAppExtensionLastPass, true},
|
| + {APPEX_PASSWORD_MANAGEMENT_DASHLANE,
|
| + activity_services::kAppExtensionDashlanePrefix, false}};
|
| +
|
| +ActivityType TypeFromString(NSString* activityString) {
|
| + DCHECK(activityString);
|
| + // Checks for the special case first so the more general patterns in
|
| + // prefixTypeAssociations would not prematurely trapped them.
|
| + NSRange found =
|
| + [activityString rangeOfString:kFindLoginActionBundleSubstring];
|
| + if (found.length)
|
| + return APPEX_PASSWORD_MANAGEMENT_OTHERS;
|
| + for (auto const& assocation : prefixTypeAssociations) {
|
| + if (assocation.requiresExactMatch_) {
|
| + if ([activityString isEqualToString:assocation.prefix_])
|
| + return assocation.type_;
|
| + } else {
|
| + if ([activityString hasPrefix:assocation.prefix_])
|
| + return assocation.type_;
|
| + }
|
| + }
|
| + return UNKNOWN;
|
| +}
|
| +
|
| +NSNumber* PasswordAppExActivityVersion(NSString* activityString) {
|
| + switch (TypeFromString(activityString)) {
|
| + case APPEX_PASSWORD_MANAGEMENT_1PASSWORD:
|
| + case APPEX_PASSWORD_MANAGEMENT_LASTPASS:
|
| + case APPEX_PASSWORD_MANAGEMENT_DASHLANE:
|
| + case APPEX_PASSWORD_MANAGEMENT_OTHERS:
|
| + return activity_services::kPasswordAppExVersionNumber;
|
| + default:
|
| + return nil;
|
| + }
|
| +}
|
| +
|
| +bool IsPasswordAppExActivity(NSString* activityString) {
|
| + return PasswordAppExActivityVersion(activityString) != nil;
|
| +}
|
| +
|
| +NSString* SuccessMessageForActivity(ActivityType type) {
|
| + switch (type) {
|
| + case NATIVE_CLIPBOARD:
|
| + return l10n_util::GetNSString(IDS_IOS_SHARE_TO_CLIPBOARD_SUCCESS);
|
| + case NATIVE_FACEBOOK:
|
| + return l10n_util::GetNSString(IDS_IOS_SHARE_FACEBOOK_COMPLETE);
|
| + case NATIVE_MAIL:
|
| + return l10n_util::GetNSString(IDS_IOS_SHARE_EMAIL_COMPLETE);
|
| + case NATIVE_MESSAGE:
|
| + return l10n_util::GetNSString(IDS_IOS_SHARE_MESSAGES_COMPLETE);
|
| + case NATIVE_TWITTER:
|
| + return l10n_util::GetNSString(IDS_IOS_SHARE_TWITTER_COMPLETE);
|
| + case GOOGLE_GMAIL:
|
| + return l10n_util::GetNSString(IDS_IOS_SHARE_EMAIL_COMPLETE);
|
| + case GOOGLE_GOOGLEPLUS:
|
| + return l10n_util::GetNSString(IDS_IOS_SHARE_GPLUS_COMPLETE);
|
| + case APPEX_PASSWORD_MANAGEMENT_1PASSWORD:
|
| + case APPEX_PASSWORD_MANAGEMENT_LASTPASS:
|
| + case APPEX_PASSWORD_MANAGEMENT_DASHLANE:
|
| + case APPEX_PASSWORD_MANAGEMENT_OTHERS:
|
| + return l10n_util::GetNSString(IDS_IOS_APPEX_PASSWORD_FORM_FILLED_SUCCESS);
|
| + default:
|
| + return nil;
|
| + }
|
| +}
|
| +
|
| +void RecordMetricForActivity(ActivityType type) {
|
| + switch (type) {
|
| + case UNKNOWN:
|
| + base::RecordAction(base::UserMetricsAction("MobileShareMenuUnknown"));
|
| + break;
|
| + case NATIVE_CLIPBOARD:
|
| + base::RecordAction(base::UserMetricsAction("MobileShareMenuClipboard"));
|
| + break;
|
| + case PRINT:
|
| + base::RecordAction(base::UserMetricsAction("MobileShareMenuPrint"));
|
| + 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 APPEX_PASSWORD_MANAGEMENT_1PASSWORD:
|
| + case APPEX_PASSWORD_MANAGEMENT_LASTPASS:
|
| + case APPEX_PASSWORD_MANAGEMENT_DASHLANE:
|
| + case APPEX_PASSWORD_MANAGEMENT_OTHERS:
|
| + base::RecordAction(
|
| + base::UserMetricsAction("MobileAppExFormFilledByPasswordManager"));
|
| + break;
|
| + }
|
| +}
|
| +
|
| +} // activity_type_util
|
|
|