Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1329)

Unified Diff: remoting/host/it2me/it2me_confirmation_dialog_mac.mm

Issue 2344003002: Adding a confirmation dialog for It2Me on Mac (Closed)
Patch Set: Renaming dialog controller callback Created 4 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « remoting/host/it2me/it2me_confirmation_dialog_mac.cc ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: remoting/host/it2me/it2me_confirmation_dialog_mac.mm
diff --git a/remoting/host/it2me/it2me_confirmation_dialog_mac.mm b/remoting/host/it2me/it2me_confirmation_dialog_mac.mm
new file mode 100644
index 0000000000000000000000000000000000000000..2aa5f6ba789dda401aad00614379582cb60f831b
--- /dev/null
+++ b/remoting/host/it2me/it2me_confirmation_dialog_mac.mm
@@ -0,0 +1,190 @@
+// Copyright 2016 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.
+
+#include "remoting/host/it2me/it2me_confirmation_dialog.h"
+
+#import <Cocoa/Cocoa.h>
+
+#include "base/callback.h"
+#include "base/callback_helpers.h"
+#include "base/i18n/message_formatter.h"
+#include "base/location.h"
+#include "base/mac/scoped_nsautorelease_pool.h"
+#include "base/mac/scoped_nsobject.h"
+#include "base/macros.h"
+#include "base/memory/ptr_util.h"
+#include "base/strings/sys_string_conversions.h"
+#include "base/strings/utf_string_conversions.h"
+#include "base/time/time.h"
+#include "base/timer/timer.h"
+#include "remoting/base/string_resources.h"
+#include "ui/base/l10n/l10n_util.h"
+#include "ui/base/l10n/l10n_util_mac.h"
+
+@interface It2MeConfirmationDialogMacController : NSObject {
+ @private
+ base::scoped_nsobject<NSAlert> confirmation_alert_;
+ base::string16 username_;
+ remoting::It2MeConfirmationDialog::ResultCallback dialog_action_callback_;
+}
+
+- (id)initWithCallback:
+ (const remoting::It2MeConfirmationDialog::ResultCallback&)callback
+ username:(const std::string&)username;
+- (void)show;
+- (void)hide;
+- (void)onCancel:(id)sender;
+- (void)onAccept:(id)sender;
+@end
+
+namespace remoting {
+
+namespace {
+// Time to wait before closing the dialog and cancelling the connection.
+constexpr base::TimeDelta kDialogTimeout = base::TimeDelta::FromMinutes(1);
+}
+
+// Bridge between C++ and ObjC implementations of It2MeConfirmationDialog.
+class It2MeConfirmationDialogMac : public It2MeConfirmationDialog {
+ public:
+ It2MeConfirmationDialogMac();
+ ~It2MeConfirmationDialogMac() override;
+
+ // It2MeConfirmationDialog implementation.
+ void Show(const std::string& remote_user_email,
+ const ResultCallback& callback) override;
+
+ private:
+ void OnDialogAction(Result result);
+
+ base::scoped_nsobject<It2MeConfirmationDialogMacController> controller_;
+
+ ResultCallback result_callback_;
+
+ base::OneShotTimer dialog_timer_;
+
+ DISALLOW_COPY_AND_ASSIGN(It2MeConfirmationDialogMac);
+};
+
+It2MeConfirmationDialogMac::It2MeConfirmationDialogMac() {}
+
+It2MeConfirmationDialogMac::~It2MeConfirmationDialogMac() {
+ dialog_timer_.Stop();
+
+ if (controller_) {
+ base::mac::ScopedNSAutoreleasePool pool;
+ [controller_ hide];
+ }
+}
+
+void It2MeConfirmationDialogMac::Show(const std::string& remote_user_email,
+ const ResultCallback& callback) {
+ result_callback_ = callback;
+
+ dialog_timer_.Start(FROM_HERE, kDialogTimeout,
+ base::Bind(&It2MeConfirmationDialogMac::OnDialogAction,
+ base::Unretained(this), Result::CANCEL));
+
+ ResultCallback dialog_action_callback = base::Bind(
+ &It2MeConfirmationDialogMac::OnDialogAction, base::Unretained(this));
+
+ base::mac::ScopedNSAutoreleasePool pool;
+ controller_.reset([[It2MeConfirmationDialogMacController alloc]
+ initWithCallback:dialog_action_callback
+ username:remote_user_email]);
+ [controller_ show];
+}
+
+void It2MeConfirmationDialogMac::OnDialogAction(Result result) {
+ dialog_timer_.Stop();
+
+ if (controller_) {
+ base::mac::ScopedNSAutoreleasePool pool;
+ [controller_ hide];
+ controller_.reset();
+ }
+
+ if (result_callback_) {
+ base::ResetAndReturn(&result_callback_).Run(result);
+ }
+}
+
+std::unique_ptr<It2MeConfirmationDialog>
+It2MeConfirmationDialogFactory::Create() {
+ return base::MakeUnique<It2MeConfirmationDialogMac>();
+}
+
+} // namespace remoting
+
+@implementation It2MeConfirmationDialogMacController
+
+- (id)initWithCallback:
+ (const remoting::It2MeConfirmationDialog::ResultCallback&)callback
+ username:(const std::string&)username {
+ if ((self = [super init])) {
+ username_ = base::UTF8ToUTF16(username);
+ dialog_action_callback_ = callback;
+ }
+ return self;
+}
+
+- (void)show {
+ confirmation_alert_.reset([[NSAlert alloc] init]);
+
+ base::string16 dialog_text =
+ base::i18n::MessageFormatter::FormatWithNumberedArgs(
+ l10n_util::GetStringUTF16(
+ IDS_SHARE_CONFIRM_DIALOG_MESSAGE_WITH_USERNAME),
+ username_);
+ [confirmation_alert_ setMessageText:base::SysUTF16ToNSString(dialog_text)];
+
+ NSButton* cancel_button = [confirmation_alert_
+ addButtonWithTitle:l10n_util::GetNSString(
+ IDS_SHARE_CONFIRM_DIALOG_DECLINE)];
+ [cancel_button setAction:@selector(onCancel:)];
+ [cancel_button setTarget:self];
+
+ NSButton* confirm_button = [confirmation_alert_
+ addButtonWithTitle:l10n_util::GetNSString(
+ IDS_SHARE_CONFIRM_DIALOG_CONFIRM)];
+ [confirm_button setAction:@selector(onAccept:)];
+ [confirm_button setTarget:self];
+
+ NSBundle* bundle = [NSBundle bundleForClass:[self class]];
+ NSString* imagePath = [bundle pathForResource:@"chromoting128" ofType:@"png"];
+ base::scoped_nsobject<NSImage> image(
+ [[NSImage alloc] initByReferencingFile:imagePath]);
+ [confirmation_alert_ setIcon:image];
+ [confirmation_alert_ layout];
+
+ // Force alert to be at the proper level and location.
+ NSWindow* confirmation_window = [confirmation_alert_ window];
+ [confirmation_window center];
+ [confirmation_window setTitle:l10n_util::GetNSString(IDS_PRODUCT_NAME)];
+ [confirmation_window setLevel:NSNormalWindowLevel];
+ [confirmation_window orderFrontRegardless];
+ [confirmation_window makeKeyWindow];
+}
+
+- (void)hide {
+ confirmation_alert_.reset();
+}
+
+- (void)onCancel:(id)sender {
+ [self hide];
+ if (dialog_action_callback_) {
+ base::ResetAndReturn(&dialog_action_callback_)
+ .Run(remoting::It2MeConfirmationDialog::Result::CANCEL);
+ }
+}
+
+- (void)onAccept:(id)sender {
+ [self hide];
+ if (dialog_action_callback_) {
+ base::ResetAndReturn(&dialog_action_callback_)
+ .Run(remoting::It2MeConfirmationDialog::Result::OK);
+ }
+}
+
+@end
« no previous file with comments | « remoting/host/it2me/it2me_confirmation_dialog_mac.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698