Block editing contact if user has denied contact permissions

// FREEBIE
This commit is contained in:
Michael Kirk 2017-05-03 17:03:26 -04:00
parent b24cf29189
commit 364f416a69
5 changed files with 63 additions and 3 deletions

View File

@ -11,6 +11,7 @@
#import "SignalAccount.h"
#import "SignalsViewController.h"
#import "UIUtil.h"
#import "ViewControllerUtils.h"
#import <AddressBookUI/AddressBookUI.h>
#import <SignalServiceKit/OWSBlockingManager.h>
#import <SignalServiceKit/TSGroupModel.h>
@ -250,7 +251,39 @@ NS_ASSUME_NONNULL_BEGIN
ContactsViewHelper *helper = self.contactsViewHelper;
SignalAccount *signalAccount = [helper signalAccountForRecipientId:recipientId];
if (!helper.contactsManager.isSystemContactsAuthorized) {
UIAlertController *alertController = [UIAlertController
alertControllerWithTitle:NSLocalizedString(@"EDIT_CONTACT_WITHOUT_CONTACTS_PERMISSION_ALERT_TITLE", comment
: @"Alert title for when the user has just tried to edit a "
@"contacts after declining to give Signal contacts "
@"permissions")
message:NSLocalizedString(@"EDIT_CONTACT_WITHOUT_CONTACTS_PERMISSION_ALERT_BODY", comment
: @"Alert body for when the user has just tried to edit a "
@"contacts after declining to give Signal contacts "
@"permissions")
preferredStyle:UIAlertControllerStyleAlert];
[alertController
addAction:[UIAlertAction actionWithTitle:NSLocalizedString(@"AB_PERMISSION_MISSING_ACTION_NOT_NOW",
@"Button text to dismiss missing contacts permission alert")
style:UIAlertActionStyleCancel
handler:nil]];
[alertController addAction:[UIAlertAction actionWithTitle:NSLocalizedString(@"OPEN_SETTINGS_BUTTON",
@"Button text which opens the settings app")
style:UIAlertActionStyleDefault
handler:^(UIAlertAction *_Nonnull action) {
NSURL *settingsUrl = [NSURL
URLWithString:UIApplicationOpenSettingsURLString];
[[UIApplication sharedApplication] openURL:settingsUrl];
}]];
[self presentViewController:alertController animated:YES completion:nil];
return;
}
if (signalAccount) {
// FIXME This is broken until converted to Contacts framework.
ABPersonViewController *view = [[ABPersonViewController alloc] init];
ABAddressBookRef addressBookRef = ABAddressBookCreateWithOptions(NULL, nil);
@ -261,6 +294,7 @@ NS_ASSUME_NONNULL_BEGIN
[self.navigationController pushViewController:view animated:YES];
} else {
// FIXME This is broken until converted to Contacts framework.
ABUnknownPersonViewController *view = [[ABUnknownPersonViewController alloc] init];
ABRecordRef aContact = ABPersonCreate();

View File

@ -31,7 +31,15 @@ extern NSString *const OWSContactsManagerSignalAccountsDidChangeNotification;
#pragma mark - System Contact Fetching
// Must call `requestSystemContactsOnce` before accessing this method
@property (nonatomic, readonly) BOOL isSystemContactsAuthorized;
// Request systems contacts and start syncing changes. The user will see an alert
// if they haven't previously.
- (void)requestSystemContactsOnce;
// Ensure's the app has the latest contacts, but won't prompt the user for contact
// access if they haven't granted it.
- (void)fetchSystemContactsIfAlreadyAuthorized;
// TODO: Remove this method.

View File

@ -62,6 +62,11 @@ NSString *const OWSContactsManagerSignalAccountsDidChangeNotification =
[self.systemContactsFetcher fetchIfAlreadyAuthorized];
}
- (BOOL)isSystemContactsAuthorized
{
return self.systemContactsFetcher.isAuthorized;
}
#pragma mark SystemContactsFetcherDelegate
- (void)systemContactsFetcher:(SystemContactsFetcher *)systemsContactsFetcher

View File

@ -20,6 +20,16 @@ class SystemContactsFetcher: NSObject {
return CNContactStore.authorizationStatus(for: CNEntityType.contacts)
}
public var isAuthorized: Bool {
guard self.authorizationStatus != .notDetermined else {
assertionFailure("should have called `requestOnce` before this point.")
Logger.error("\(TAG) should have called `requestOnce` before checking authorization status.")
return false
}
return self.authorizationStatus == .authorized
}
private let contactStore = CNContactStore()
private var systemContactsHaveBeenRequestedAtLeastOnce = false
private let allowedContactKeys: [CNKeyDescriptor] = [

View File

@ -1,9 +1,6 @@
/* Button text to dismiss missing contacts permission alert */
"AB_PERMISSION_MISSING_ACTION_NOT_NOW" = "Not Now";
/* No comment provided by engineer. */
"AB_PERMISSION_MISSING_BODY" = "Signal requires access to your contacts. We do not store your contacts on our servers.";
/* Alert title when contacts disabled */
"AB_PERMISSION_MISSING_TITLE" = "Sorry!";
@ -328,6 +325,12 @@
/* Generic short text for button to dismiss a dialog */
"DISMISS_BUTTON_TEXT" = "Dismiss";
/* Alert body for when the user has just tried to edit a contacts after declining to give Signal contacts permissions */
"EDIT_CONTACT_WITHOUT_CONTACTS_PERMISSION_ALERT_BODY" = "You can give access in the Settings app.";
/* Alert title for when the user has just tried to edit a contacts after declining to give Signal contacts permissions */
"EDIT_CONTACT_WITHOUT_CONTACTS_PERMISSION_ALERT_TITLE" = "Signal Needs Contact Access to Edit Contact Information";
/* table cell label in conversation settings */
"EDIT_GROUP_ACTION" = "Edit Group";