// Copyright (c) 2012 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.

#ifndef CHROME_BROWSER_EXTENSIONS_APP_NOTIFY_CHANNEL_UI_H_
#define CHROME_BROWSER_EXTENSIONS_APP_NOTIFY_CHANNEL_UI_H_

#include <string>

class Profile;
class TabContents;

namespace extensions {

// An interface for prompting a user to sign in to sync so that we can create
// an app notification channel for one of their apps.
class AppNotifyChannelUI {
 public:
  virtual ~AppNotifyChannelUI() {}

  // Used to customize the UI we show.
  enum UIType {
    // Do not prompt the user with an infobar.
    NO_INFOBAR,

    // Ask if the app can show notifications.
    NOTIFICATION_INFOBAR,
  };

  class Delegate {
   public:
    // A callback for whether the user successfully set up sync or not.
    virtual void OnSyncSetupResult(bool enabled) = 0;

   protected:
    virtual ~Delegate() {}
  };

  // Shows a prompt for sync setup - |delegate| will be called back later when
  // setup is complete or cancelled. This should only be called once per
  // instance.
  virtual void PromptSyncSetup(Delegate* delegate) = 0;

  // Builds the platform specific AppNotifyChannelUI.
  static AppNotifyChannelUI* Create(Profile* profile,
                                    TabContents* tab_contents,
                                    const std::string& app_name,
                                    AppNotifyChannelUI::UIType ui_type);
};

}  // namespace extensions

#endif  // CHROME_BROWSER_EXTENSIONS_APP_NOTIFY_CHANNEL_UI_H_
