Pitometsu/CruiserWebViewController

View on GitHub
Source/Classes/CruiserPolyActivity.m

Summary

Maintainability
Test Coverage
//
//  CruiserPolyActivity.m
//  CruiserWebViewController
//  https://github.com/dzenbot/CruiserWebViewController
//
//  Created by Ignacio Romero Zurbuchen on 3/28/14.
//  Improved by Yuriy Pitomets on 23/01/2015
//  Copyright (c) 2014 DZN Labs. All rights reserved.
//  Copyright (c) 2015 Yuriy Pitomets. No rights reserved.
//  Licence: MIT-Licence
//

#import "CruiserPolyActivity.h"

@implementation CruiserPolyActivity

+ (instancetype)activityWithType:(CruiserPolyActivityType)type
{
    return [[CruiserPolyActivity alloc] initWithActivityType:type];
}

- (instancetype)initWithActivityType:(CruiserPolyActivityType)type
{
    self = [super init];
    if (self) {
        _type = type;
    }
    return self;
}


#pragma mark - Getter methods

+ (UIActivityCategory)activityCategory
{
    return UIActivityCategoryAction;
}

- (NSString *)activityType
{
    switch (self.type) {
        case CruiserPolyActivityTypeLink:           return @"com.appcruiser.CruiserWebViewController.activity.CopyLink";
        case CruiserPolyActivityTypeSafari:         return @"com.appcruiser.CruiserWebViewController.activity.OpenInSafari";
        case CruiserPolyActivityTypeChrome:         return @"com.appcruiser.CruiserWebViewController.activity.OpenInChrome";
        case CruiserPolyActivityTypeOpera:          return @"com.appcruiser.CruiserWebViewController.activity.OpenInOperaMini";
        case CruiserPolyActivityTypeDolphin:        return @"com.appcruiser.CruiserWebViewController.activity.OpenInDolphin";
    }
}

- (NSString *)activityTitle
{
    switch (self.type) {
        case CruiserPolyActivityTypeLink:           return NSLocalizedString(@"Copy Link", nil);
        case CruiserPolyActivityTypeSafari:         return NSLocalizedString(@"Open in Safari", nil);
        case CruiserPolyActivityTypeChrome:         return NSLocalizedString(@"Open in Chrome", nil);
        case CruiserPolyActivityTypeOpera:          return NSLocalizedString(@"Open in Opera", nil);
        case CruiserPolyActivityTypeDolphin:        return NSLocalizedString(@"Open in Dolphin", nil);
    }
}

- (UIImage *)activityImage
{
    switch (self.type) {
        case CruiserPolyActivityTypeLink:           return [UIImage imageNamed:@"cruiser_icn_activity_link"];
        case CruiserPolyActivityTypeSafari:         return [UIImage imageNamed:@"cruiser_icn_activity_safari"];
        case CruiserPolyActivityTypeChrome:         return [UIImage imageNamed:@"cruiser_icn_activity_chrome"];
        case CruiserPolyActivityTypeOpera:          return [UIImage imageNamed:@"cruiser_icn_activity_opera"];
        case CruiserPolyActivityTypeDolphin:        return [UIImage imageNamed:@"cruiser_icn_activity_dolphin"];
        default:                                return nil;
    }
}

- (NSURL *)chromeURLWithURL:(NSURL *)URL
{
    return [self customURLWithURL:URL andType:CruiserPolyActivityTypeChrome];
}

- (NSURL *)operaURLWithURL:(NSURL *)URL
{
    return [self customURLWithURL:URL andType:CruiserPolyActivityTypeOpera];
}

- (NSURL *)dolphinURLWithURL:(NSURL *)URL
{
    return [self customURLWithURL:URL andType:CruiserPolyActivityTypeDolphin];
}

- (NSURL *)customURLWithURL:(NSURL *)URL andType:(CruiserPolyActivityType)type
{
    // Replaces the URL Scheme with the type equivalent.
    NSString *scheme = nil;
    if ([URL.scheme isEqualToString:@"http"]) {
        if (type == CruiserPolyActivityTypeChrome) scheme = @"googlechrome";
        if (type == CruiserPolyActivityTypeOpera) scheme = @"ohttp";
        if (type == CruiserPolyActivityTypeDolphin) scheme = @"dolphin";
    }
    else if ([URL.scheme isEqualToString:@"https"]) {
        if (type == CruiserPolyActivityTypeChrome) scheme = @"googlechromes";
        if (type == CruiserPolyActivityTypeOpera) scheme = @"ohttps";
        if (type == CruiserPolyActivityTypeDolphin) scheme = @"dolphin";
    }

    // Proceeds only if a valid URI Scheme is available.
    if (scheme) {
        NSRange range = [[URL absoluteString] rangeOfString:@":"];
        NSString *urlNoScheme = [[URL absoluteString] substringFromIndex:range.location];
        return [NSURL URLWithString:[scheme stringByAppendingString:urlNoScheme]];
    }

    return nil;
}

- (BOOL)canPerformWithActivityItems:(NSArray *)activityItems
{
    for (UIActivity *item in activityItems) {

        if ([item isKindOfClass:[NSString class]]) {

            NSURL *URL = [NSURL URLWithString:(NSString *)item];
            if (!URL) continue;

            if (self.type == CruiserPolyActivityTypeLink) {
                return URL ? YES : NO;
            }
            if (self.type == CruiserPolyActivityTypeSafari) {
                return [[UIApplication sharedApplication] canOpenURL:URL];
            }
            if (self.type == CruiserPolyActivityTypeChrome) {
                return [[UIApplication sharedApplication] canOpenURL:[self chromeURLWithURL:URL]];
            }
            if (self.type == CruiserPolyActivityTypeOpera) {
                return [[UIApplication sharedApplication] canOpenURL:[self operaURLWithURL:URL]];
            }
            if (self.type == CruiserPolyActivityTypeDolphin) {
                return [[UIApplication sharedApplication] canOpenURL:[self dolphinURLWithURL:URL]];
            }

            break;
        }
    }

    return NO;
}

- (void)prepareWithActivityItems:(NSArray *)activityItems
{
    for (id item in activityItems) {

        if ([item isKindOfClass:[NSString class]]) {
            _URL = [NSURL URLWithString:(NSString *)item];
            if (!self.URL) continue;
            else break;
        }
    }
}

- (void)performActivity
{
    BOOL completed = NO;

    if (!self.URL) {
        [self activityDidFinish:completed];
        return;
    }

    switch (self.type) {
        case CruiserPolyActivityTypeLink:
            [[UIPasteboard generalPasteboard] setURL:self.URL];
            completed = YES;
            break;
        case CruiserPolyActivityTypeSafari:
            completed = [[UIApplication sharedApplication] openURL:self.URL];
            break;
        case CruiserPolyActivityTypeChrome:
            completed = [[UIApplication sharedApplication] openURL:[self chromeURLWithURL:self.URL]];
            break;
        case CruiserPolyActivityTypeOpera:
            completed = [[UIApplication sharedApplication] openURL:[self operaURLWithURL:self.URL]];
            break;
        case CruiserPolyActivityTypeDolphin:
            completed = [[UIApplication sharedApplication] openURL:[self dolphinURLWithURL:self.URL]];
            break;
    }

    [self activityDidFinish:completed];
}

@end