chromium/chrome/browser/ash/power/ml/user_activity_event.proto

// Copyright 2017 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

syntax = "proto2";

package ash.power.ml;

option optimize_for = LITE_RUNTIME;

// This proto will represent one logged event to be used as a training example.
// It contains both features and labels.
message UserActivityEvent {
  message ModelParams {
    // Event logging will be triggered after inactivity of start_delay_sec.
    // Value will be in the range of 10sec - 20sec, which may be tuned following
    // experiments.
    optional int32 start_delay_sec = 1;
    // timeout_delay_sec defines extended idle period following screen-off, at
    // which point we will log event type to be TIMEOUT. Value will be ~10sec or
    // shorter, which may be tuned following experiments.
    optional int32 timeout_delay_sec = 2;
  }

  // Event describes what happens after user is inactive for start_delay_sec. It
  // will be used as training labels.
  message Event {
    // Event type describes whether user reactivates or turns off the system or
    // remains idle until model times out. This will be used as labels.
    enum Type {
      REACTIVATE = 1;
      OFF = 2;
      TIMEOUT = 3;
    }
    optional Type type = 1;

    // Trigger of the event. They won't be used as labels and will be used for
    // analysis only.
    enum Reason {
      USER_ACTIVITY = 1;
      VIDEO_ACTIVITY = 2;
      POWER_CHANGED = 3;
      LID_CLOSED = 4;
      SHUTDOWN = 5;
      SESSION_STOPPED = 6;
      SCREEN_OFF = 7;
      SCREEN_LOCK = 8;
      IDLE_SLEEP = 9;
      MANUAL_SLEEP = 10;
    }
    optional Reason reason = 2;

    // Time taken in seconds from when we start logging the features to the
    // moment when the event type is known and we finish logging the complete
    // event.
    optional int32 log_duration_sec = 3;

    // Whether screen dim/off occurred before final event was logged.
    // Screen should be on (not dimmed not turned off) when an idle event is
    // reported because we report idle event after a short period of inactivity,
    // which isn't long enough for screen to be dimmed. However, in the unlikely
    // event that screen is dimmed when an idle event is reported,
    // |screen_dim_occurred| is true only if screen is subsequently turned on
    // and dimmed again. In other words, if screen remains dimmed,
    // |screen_dim_occurred| will be false. Similar logic for
    // |screen_off_occurred|.
    optional bool screen_dim_occurred = 4;
    optional bool screen_off_occurred = 5;
    // Whether screen lock occurred before final event was logged.
    optional bool screen_lock_occurred = 6;
  }

  message Features {
    // Time taken to transition between states.
    optional int32 on_to_dim_sec = 1;
    optional int32 dim_to_screen_off_sec = 2;

    // Last activity and last user activity as seconds since midnight in the
    // local time zone. Last activity may not be user-related, e.g. it may be a
    // video-playing activity. Below we record both general activity time and
    // user activity time.
    optional int32 last_activity_time_sec = 3;
    optional int32 last_user_activity_time_sec = 4;

    // This must match the week range in base::Time::Exploded.
    enum DayOfWeek {
      SUN = 0;
      MON = 1;
      TUE = 2;
      WED = 3;
      THU = 4;
      FRI = 5;
      SAT = 6;
    }
    optional DayOfWeek last_activity_day = 5;

    // Time from last mouse/key event to when the logging starts (for training
    // data generation). This may not be the same as start_delay_sec, depending
    // on what the last activity is.
    optional int32 time_since_last_mouse_sec = 6;
    optional int32 time_since_last_key_sec = 7;
    optional int32 time_since_last_touch_sec = 21;

    // Duration of activity (user or video) up to last_activity_time_sec. If
    // activity starts at time t1, then recent_time_active_sec =
    // |last_activity_time_sec - t1|. We ignore short periods of idle time (i.e.
    // user is considered active in this idle period), but the short periods
    // must be shorter than start_delay_sec.
    // TODO(jiameng): we may consider a different way of measuring continued
    // activity following experiments.
    optional int32 recent_time_active_sec = 8;

    // At the moment, we only log events when device is Chromebook, hence we
    // ignore types such as Chromebase, Chromebit and Chromebox.
    enum DeviceType {
      UNKNOWN_DEVICE = 0;
      CHROMEBOOK = 1;
    }

    optional DeviceType device_type = 9;

    // Device mode.
    enum DeviceMode {
      UNKNOWN_MODE = 0;
      // Lid is closed.
      CLOSED_LID = 1;
      // Lid is open, tablet mode is off or unsupported.
      CLAMSHELL = 2;
      // Lid is open, tablet mode is on or no lid at all.
      TABLET = 3;
    }
    optional DeviceMode device_mode = 10;

    optional float battery_percent = 11;
    optional bool on_battery = 12;

    // Whether user/device is managed.
    enum ManagementType {
      UNKNOWN_MANAGEMENT = 0;
      MANAGED = 1;
      UNMANAGED = 2;
    }
    optional ManagementType user_management = 13;
    optional ManagementType device_management = 14;

    // Whether network is connected.
    optional bool is_online = 15;

    // Duration of latest non-stop video playing before the current idle
    // event. If a video paused/stopped temporarily (i.e. less than
    // start_delay_sec), we consider it as non-stop.
    optional int32 video_playing_time_sec = 16;
    // Duration from the time video ended to the time of idle event.
    optional int32 time_since_video_ended_sec = 17;

    // Number of key/mouse/touch events in the past hour.
    optional int32 key_events_in_last_hour = 18;
    optional int32 mouse_events_in_last_hour = 19;
    optional int32 touch_events_in_last_hour = 20;

    // Whether screen was dimmed/turned off when an idle event was reported.
    optional bool screen_dimmed_initially = 22;
    optional bool screen_off_initially = 23;
    optional bool screen_locked_initially = 24;

    // Properties associated with the active tab of the visible focused/topmost
    // browser. Unset if there's no such tab.
    optional int32 engagement_score = 25;
    optional bool has_form_entry = 26;
    optional int64 source_id = 27;
    // A valid URL could still have empty domain.
    optional string tab_domain = 28;

    // Number of times user reactivated and thus undimmed the screen before
    // system was suspended.
    optional int32 previous_negative_actions_count = 29;
    // Number of times user remained idle after dim until system was suspended
    // or closed.
    optional int32 previous_positive_actions_count = 30;
  }  // next id = 31

  // All fields except |model_applied| in ModelPrediction are populated by the
  // model. |model_applied| is populated by the UserActivityManager when
  // deciding whether to apply the model decision.
  message ModelPrediction {
    enum Response {
      // Dim should go ahead.
      DIM = 0;
      // Dim should be deferred.
      NO_DIM = 1;
      // Model could fail to make a prediction due to various reasons, e.g. it
      // could fail to load the preprocessor or process the features for
      // inference.
      MODEL_ERROR = 2;
    }

    // Both |inactivity_score| and |decision_threshold| are in the range of
    // [0,100]. These values are the quantized versions of actual values used in
    // making a model prediction, so that they can be logged later. If
    // |inactivity_score| < |decision_threshold| then dim will be deferred.
    optional int32 decision_threshold = 1;
    // How likely user will remain inactive if screen is dimmed.
    optional int32 inactivity_score = 2;
    // Whether model decision (regardless if dim is to be deferred) is
    // taken by powerd. It is false if model response is MODEL_ERROR or if dim
    // was deferred last time dim imminent occurred.
    optional bool model_applied = 3;
    optional Response response = 4;
  }

  optional ModelParams params = 1;
  optional Event event = 2;
  optional Features features = 3;
  // Unset if model prediction is disabled in an experiment.
  optional ModelPrediction model_prediction = 4;
}