// Copyright 2017 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.

module ash.mojom;

import "ash/public/interfaces/user_info.mojom";
import "chromeos/components/proximity_auth/public/interfaces/auth_type.mojom";
import "mojo/public/mojom/base/string16.mojom";
import "mojo/public/mojom/base/values.mojom";

// Supported multi-profile user behavior values.
// Keep in sync with the enum in chromeos_user_pod_row.js and user_pod_row.js
enum MultiProfileUserBehavior {
  UNRESTRICTED = 0,
  PRIMARY_ONLY = 1,
  NOT_ALLOWED = 2,
  OWNER_PRIMARY_ONLY = 3,
};

// Easy unlock icon choices.
enum EasyUnlockIconId {
  // No icon shown.
  NONE,
  // The user has clicked the easy unlock icon and disabled easy unlock for this
  // login/lock session.
  HARDLOCKED,
  // Phone could not be found.
  LOCKED,
  // Phone found, but it is not unlocked.
  LOCKED_TO_BE_ACTIVATED,
  // Phone found, but it is too far away.
  LOCKED_WITH_PROXIMITY_HINT,
  // Phone found and unlocked. The user can click to dismiss the login/lock
  // screen.
  UNLOCKED,
  // Scanning for phone.
  SPINNER,
};

// The status of fingerprint availability.
enum FingerprintState {
  // The user cannot use fingerprint. This may be because:
  //  - they are not the primary user
  //  - they never registered fingerprint
  //  - the device does not have a fingerprint sensor
  UNAVAILABLE,
  // Fingerprint can be used to unlock the device.
  AVAILABLE,
  // There have been too many attempts, so now fingerprint is disabled.
  DISABLED_FROM_ATTEMPTS,
  // It has been too long since the device was last used.
  DISABLED_FROM_TIMEOUT,
};

// Information about the custom icon in the user pod.
struct EasyUnlockIconOptions {
  // Icon that should be displayed.
  EasyUnlockIconId icon;
  // Tooltip that is associated with the icon. This is shown automatically if
  // |autoshow_tooltip| is true. The user can always see the tooltip if they
  // hover over the icon. The tooltip should be used for the accessibility label
  // if it is present.
  mojo_base.mojom.String16 tooltip;
  // If true, the tooltip should be displayed (even if the user is not currently
  // hovering over the icon, ie, this makes |tooltip| act like a little like a
  // notification).
  bool autoshow_tooltip;
  // Accessibility label. Only used if |tooltip| is empty.
  // TODO(jdufault): Always populate and use |aria_label|, even if |tooltip| is
  // non-empty.
  mojo_base.mojom.String16 aria_label;
  // If true, clicking the easy unlock icon should fire a hardlock event which
  // will disable easy unlock. The hardlock event will request a new icon
  // display via a separate EasyUnlockIconsOption update. See
  // login_screen.mojom::HardlockPod.
  bool hardlock_on_click;
};

// Infomation of each input method. This is used to populate keyboard layouts
// for public account user.
struct InputMethodItem {
  // An id that identifies an input method engine (e.g., "t:latn-post",
  // "pinyin", "hangul").
  string ime_id;

  // Title of the imput method.
  string title;

  // Whether this input method is been selected.
  bool selected;
};

// Information of each available locale. This is used to populate language
// locales for public account user.
struct LocaleItem {
  // Language code of the locale.
  string language_code;

  // Title of the locale.
  string title;

  // Optional, group name of the locale.
  string? group_name;
};

// Infomation about a public account user.
struct PublicAccountInfo {
  // Optional, the domain name displayed in the login screen UI.
  string? enterprise_domain;

  // A list of available user locales.
  array<LocaleItem> available_locales;

  // Default locale for this user.
  string default_locale;

  // Show expanded user view that contains session information/warnings and
  // locale selection.
  bool show_expanded_view;

  // Show the advanced expanded user view if there are at least two recommended
  // locales. This will be the case in multilingual environments where users
  // are likely to want to choose among locales.
  bool show_advanced_view;

  // A list of available keyboard layouts.
  array<InputMethodItem> keyboard_layouts;
};

// Info about a user in login/lock screen.
struct LoginUserInfo {
  // User's basic information including account id, email, avatar etc.
  UserInfo basic_user_info;

  // What method the user can use to sign in.
  proximity_auth.mojom.AuthType auth_type;

  // True if this user has already signed in.
  bool is_signed_in;

  // True if this user is the device owner.
  bool is_device_owner;

  // The initial fingerprint state. There are other mojom methods (ie,
  // login_screen.mojom::SetFingerprintState) which update the current state.
  FingerprintState fingerprint_state;

  // True if multi-profiles sign in is allowed for this user.
  bool is_multiprofile_allowed;

  // Enforced policy for multi-profiles sign in.
  MultiProfileUserBehavior multiprofile_policy;

  // True if this user can be removed.
  bool can_remove;

  // Optional, contains the public account information if user type is
  // PUBLIC_ACCOUNT.
  PublicAccountInfo? public_account_info;
};
