Swiftgram/Classes/BITFeedbackComposeViewController.m
Andreas Linde 34bb4cb758 Add option to Feedback compose UI to be pre filled with data
Accepts an array with data to fill it up with, much like UIActivity. Allows easier option to expand with more content types in the future
2012-10-18 20:04:51 +02:00

246 lines
7.6 KiB
Objective-C

/*
* Author: Andreas Linde <mail@andreaslinde.de>
*
* Copyright (c) 2012 HockeyApp, Bit Stadium GmbH.
* All rights reserved.
*
* Permission is hereby granted, free of charge, to any person
* obtaining a copy of this software and associated documentation
* files (the "Software"), to deal in the Software without
* restriction, including without limitation the rights to use,
* copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the
* Software is furnished to do so, subject to the following
* conditions:
*
* The above copyright notice and this permission notice shall be
* included in all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
* OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
* OTHER DEALINGS IN THE SOFTWARE.
*/
#import "HockeySDK.h"
#import "HockeySDKPrivate.h"
#import "BITFeedbackManagerPrivate.h"
#import "BITFeedbackComposeViewController.h"
#import "BITFeedbackUserDataViewController.h"
#import "BITHockeyHelper.h"
@interface BITFeedbackComposeViewController () <BITFeedbackUserDataDelegate>
@property (nonatomic, assign) BITFeedbackManager *manager;
@property (nonatomic, retain) UITextView *textView;
@property (nonatomic, retain) NSString *text;
- (void)setUserDataAction;
@end
@implementation BITFeedbackComposeViewController {
BOOL _blockUserDataScreen;
}
#pragma mark - NSObject
- (id)init {
self = [super init];
if (self) {
self.title = BITHockeyLocalizedString(@"HockeyFeedbackComposeTitle");
_blockUserDataScreen = NO;
_delegate = nil;
_manager = [BITHockeyManager sharedHockeyManager].feedbackManager;
_text = nil;
}
return self;
}
- (void)dealloc {
[_text release];
[_textView release], _textView = nil;
[super dealloc];
}
#pragma mark - Public
- (void)prepareWithItems:(NSArray *)items {
for (id item in items) {
if ([item isKindOfClass:[NSString class]]) {
self.text = [(self.text ? self.text : @"") stringByAppendingFormat:@"%@%@", (self.text ? @" " : @""), item];
} else if ([item isKindOfClass:[NSURL class]]) {
self.text = [(self.text ? self.text : @"") stringByAppendingFormat:@"%@%@", (self.text ? @" " : @""), [(NSURL *)item absoluteString]];
} else {
BITHockeyLog(@"Unknown item type %@", item);
}
}
}
#pragma mark - View lifecycle
- (void)viewDidLoad {
[super viewDidLoad];
self.view.backgroundColor = [UIColor whiteColor];
// Do any additional setup after loading the view.
self.navigationItem.leftBarButtonItem = [[[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemCancel
target:self
action:@selector(dismissAction:)] autorelease];
self.navigationItem.rightBarButtonItem = [[[UIBarButtonItem alloc] initWithTitle:BITHockeyLocalizedString(@"HockeyFeedbackComposeSend")
style:UIBarButtonItemStyleDone
target:self
action:@selector(sendAction:)] autorelease];
// message input textfield
CGRect frame = CGRectZero;
if (UI_USER_INTERFACE_IDIOM() != UIUserInterfaceIdiomPad) {
frame = CGRectMake(0, 0, self.view.bounds.size.width, 200);
} else {
frame = CGRectMake(0, 0, self.view.bounds.size.width, self.view.bounds.size.height);
}
self.textView = [[[UITextView alloc] initWithFrame:frame] autorelease];
self.textView.font = [UIFont systemFontOfSize:17];
self.textView.delegate = self;
self.textView.backgroundColor = [UIColor whiteColor];
self.textView.returnKeyType = UIReturnKeyDefault;
self.textView.autoresizingMask = UIViewAutoresizingFlexibleWidth;
[self.view addSubview:self.textView];
}
- (void)viewWillAppear:(BOOL)animated {
self.manager.currentFeedbackComposeViewController = self;
[super viewWillAppear:animated];
[[UIApplication sharedApplication] setStatusBarStyle:(self.navigationController.navigationBar.barStyle == UIBarStyleDefault) ? UIStatusBarStyleDefault : UIStatusBarStyleBlackOpaque];
if (_text) {
self.textView.text = _text;
self.navigationItem.rightBarButtonItem.enabled = YES;
} else {
self.navigationItem.rightBarButtonItem.enabled = NO;
}
}
- (void)viewDidAppear:(BOOL)animated {
[super viewDidAppear:animated];
if ([self.manager askManualUserDataAvailable] &&
([self.manager requireManualUserDataMissing] ||
![self.manager didAskUserData])
) {
if (!_blockUserDataScreen)
[self setUserDataAction];
} else {
[self.textView becomeFirstResponder];
}
}
- (void)viewWillDisappear:(BOOL)animated {
self.manager.currentFeedbackComposeViewController = nil;
[super viewWillDisappear:animated];
}
- (void)viewDidDisappear:(BOOL)animated {
[super viewDidDisappear:animated];
}
#pragma mark - Private methods
- (void)dismiss {
if (self.delegate && [self.delegate respondsToSelector:@selector(feedbackComposeViewControllerDidFinish:)]) {
[self.delegate feedbackComposeViewControllerDidFinish:self];
} else {
[self dismissModalViewControllerAnimated:YES];
}
}
- (void)setUserDataAction {
BITFeedbackUserDataViewController *userController = [[[BITFeedbackUserDataViewController alloc] initWithStyle:UITableViewStyleGrouped] autorelease];
userController.delegate = self;
UINavigationController *navController = [[[UINavigationController alloc] initWithRootViewController:userController] autorelease];
[self.navigationController presentModalViewController:navController animated:YES];
}
- (void)dismissAction:(id)sender {
[self dismiss];
}
- (void)sendAction:(id)sender {
if ([self.textView isFirstResponder])
[self.textView resignFirstResponder];
NSString *text = self.textView.text;
[self.manager submitMessageWithText:text];
[self dismiss];
}
#pragma mark - CNSFeedbackUserDataDelegate
- (void)userDataUpdateCancelled {
_blockUserDataScreen = YES;
if ([self.manager requireManualUserDataMissing]) {
if ([self.navigationController respondsToSelector:@selector(dismissViewControllerAnimated:completion:)]) {
[self.navigationController dismissViewControllerAnimated:YES
completion:^(void) {
[self dismissModalViewControllerAnimated:YES];
}];
} else {
[self dismissModalViewControllerAnimated:YES];
[self performSelector:@selector(dismissAction:) withObject:nil afterDelay:0.4];
}
} else {
[self.navigationController dismissModalViewControllerAnimated:YES];
}
}
- (void)userDataUpdateFinished {
[self.manager saveMessages];
[self.navigationController dismissModalViewControllerAnimated:YES];
}
#pragma mark - UITextViewDelegate
- (void)textViewDidChange:(UITextView *)textView {
NSUInteger newLength = [textView.text length];
if (newLength == 0) {
self.navigationItem.rightBarButtonItem.enabled = NO;
} else {
self.navigationItem.rightBarButtonItem.enabled = YES;
}
}
@end