element-ios/Riot/Modules/MatrixKit/Models/Contact/MXKPhoneNumber.m

206 lines
5.5 KiB
Objective-C

/*
Copyright 2024 New Vector Ltd.
Copyright 2017 Vector Creations Ltd
Copyright 2015 OpenMarket Ltd
SPDX-License-Identifier: AGPL-3.0-only
Please see LICENSE in the repository root for full details.
*/
#import "MXKPhoneNumber.h"
@import libPhoneNumber_iOS;
@implementation MXKPhoneNumber
@synthesize msisdn;
- (id)initWithTextNumber:(NSString*)textNumber type:(NSString*)type contactID:(NSString*)contactID matrixID:(NSString*)matrixID
{
self = [super initWithContactID:contactID matrixID:matrixID];
if (self)
{
_type = type ? type : @"";
_textNumber = textNumber ? textNumber : @"" ;
_cleanedPhonenumber = [MXKPhoneNumber cleanPhonenumber:_textNumber];
_defaultCountryCode = nil;
msisdn = nil;
_nbPhoneNumber = [[NBPhoneNumberUtil sharedInstance] parse:_cleanedPhonenumber defaultRegion:nil error:nil];
}
return self;
}
// remove the unuseful characters in a phonenumber
+ (NSString*)cleanPhonenumber:(NSString*)phoneNumber
{
// sanity check
if (nil == phoneNumber)
{
return nil;
}
// empty string
if (0 == [phoneNumber length])
{
return @"";
}
static NSCharacterSet *invertedPhoneCharSet = nil;
if (!invertedPhoneCharSet)
{
invertedPhoneCharSet = [[NSCharacterSet characterSetWithCharactersInString:@"0123456789+*#,()"] invertedSet];
}
return [[phoneNumber componentsSeparatedByCharactersInSet:invertedPhoneCharSet] componentsJoinedByString:@""];
}
- (BOOL)matchedWithPatterns:(NSArray*)patterns
{
// no number -> cannot match
if (_textNumber.length == 0)
{
return NO;
}
if (patterns.count > 0)
{
for (NSString *pattern in patterns)
{
if ([_textNumber rangeOfString:pattern].location == NSNotFound)
{
NSString *cleanPattern = [[pattern componentsSeparatedByCharactersInSet:[NSCharacterSet whitespaceCharacterSet]] componentsJoinedByString:@""];
if ([_cleanedPhonenumber rangeOfString:cleanPattern].location == NSNotFound)
{
NSString *msisdnPattern;
if ([cleanPattern hasPrefix:@"+"])
{
msisdnPattern = [cleanPattern substringFromIndex:1];
}
else if ([cleanPattern hasPrefix:@"00"])
{
msisdnPattern = [cleanPattern substringFromIndex:2];
}
else
{
msisdnPattern = cleanPattern;
}
// Check the msisdn
if (!self.msisdn || !msisdnPattern.length || [self.msisdn rangeOfString:msisdnPattern].location == NSNotFound)
{
return NO;
}
}
}
}
}
return YES;
}
- (BOOL)hasPrefix:(NSString*)prefix
{
// no number -> cannot match
if (_textNumber.length == 0)
{
return NO;
}
if ([_textNumber hasPrefix:prefix])
{
return YES;
}
// Remove whitespace before checking the cleaned phone number
prefix = [[prefix componentsSeparatedByCharactersInSet:[NSCharacterSet whitespaceCharacterSet]] componentsJoinedByString:@""];
if ([_cleanedPhonenumber hasPrefix:prefix])
{
return YES;
}
if (self.msisdn)
{
if ([prefix hasPrefix:@"+"])
{
prefix = [prefix substringFromIndex:1];
}
else if ([prefix hasPrefix:@"00"])
{
prefix = [prefix substringFromIndex:2];
}
return [self.msisdn hasPrefix:prefix];
}
return NO;
}
- (void)setDefaultCountryCode:(NSString *)defaultCountryCode
{
if (![defaultCountryCode isEqualToString:_defaultCountryCode])
{
_nbPhoneNumber = [[NBPhoneNumberUtil sharedInstance] parse:_cleanedPhonenumber defaultRegion:defaultCountryCode error:nil];
_defaultCountryCode = defaultCountryCode;
msisdn = nil;
}
}
- (NSString*)msisdn
{
if (!msisdn && _nbPhoneNumber)
{
NSString *e164 = [[NBPhoneNumberUtil sharedInstance] format:_nbPhoneNumber numberFormat:NBEPhoneNumberFormatE164 error:nil];
if ([e164 hasPrefix:@"+"])
{
msisdn = [e164 substringFromIndex:1];
}
else if ([e164 hasPrefix:@"00"])
{
msisdn = [e164 substringFromIndex:2];
}
}
return msisdn;
}
#pragma mark NSCoding
- (id)initWithCoder:(NSCoder *)coder
{
self = [super initWithCoder:coder];
if (self)
{
_type = [coder decodeObjectForKey:@"type"];
_textNumber = [coder decodeObjectForKey:@"textNumber"];
_cleanedPhonenumber = [coder decodeObjectForKey:@"cleanedPhonenumber"];
_defaultCountryCode = [coder decodeObjectForKey:@"countryCode"];
_nbPhoneNumber = [[NBPhoneNumberUtil sharedInstance] parse:_cleanedPhonenumber defaultRegion:_defaultCountryCode error:nil];
msisdn = nil;
}
return self;
}
- (void)encodeWithCoder:(NSCoder *)coder
{
[super encodeWithCoder:coder];
[coder encodeObject:_type forKey:@"type"];
[coder encodeObject:_textNumber forKey:@"textNumber"];
[coder encodeObject:_cleanedPhonenumber forKey:@"cleanedPhonenumber"];
[coder encodeObject:_defaultCountryCode forKey:@"countryCode"];
}
@end