/*
 * Copyright (C) 2017 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

syntax = "proto2";
package android.service.notification;

option java_multiple_files = true;
option java_outer_classname = "NotificationServiceProto";

import "frameworks/base/core/proto/android/app/notification_channel.proto";
import "frameworks/base/core/proto/android/app/notification_channel_group.proto";
import "frameworks/base/core/proto/android/app/notificationmanager.proto";
import "frameworks/base/core/proto/android/content/component_name.proto";
import "frameworks/base/core/proto/android/media/audioattributes.proto";
import "frameworks/base/core/proto/android/privacy.proto";

message NotificationServiceDumpProto {
    option (.android.msg_privacy).dest = DEST_AUTOMATIC;

    repeated NotificationRecordProto records = 1;

    optional ZenModeProto zen = 2;

    optional ManagedServicesProto notification_listeners = 3;

    optional int32 listener_hints = 4;

    repeated ListenersDisablingEffectsProto listeners_disabling_effects = 5;

    optional ManagedServicesProto notification_assistants = 6;

    optional ManagedServicesProto condition_providers = 7;

    optional RankingHelperProto ranking_config = 8;
}

message NotificationRecordProto {
    option (.android.msg_privacy).dest = DEST_AUTOMATIC;

    optional string key = 1;

    enum State {
        ENQUEUED = 0;
        POSTED = 1;
        SNOOZED = 2;
    }
    optional State state = 2;
    optional int32 flags = 3;
    optional string channel_id = 4 [ (.android.privacy).dest = DEST_EXPLICIT ];
    optional string sound = 5 [ (.android.privacy).dest = DEST_EXPLICIT ];
    optional .android.media.AudioAttributesProto audio_attributes = 6;
    optional bool can_vibrate = 7;
    optional bool can_show_light = 8;
    optional string group_key = 9 [ (.android.privacy).dest = DEST_EXPLICIT ];
    optional sint32 importance = 10;
    // The package the notification was posted for.
    optional string package = 11;
    // The package that posted the notification. It might not be the same as package.
    optional string delegate_package = 12;
}

message ListenersDisablingEffectsProto {
    option (android.msg_privacy).dest = DEST_AUTOMATIC;

    optional int32 hint = 1;
    reserved 2; // ManagedServiceInfoProto listeners
    repeated android.content.ComponentNameProto listener_components = 3;
}

message ManagedServiceInfoProto {
    option (android.msg_privacy).dest = DEST_AUTOMATIC;

    optional android.content.ComponentNameProto component = 1;
    optional int32 user_id = 2;
    optional string service = 3;
    optional bool is_system = 4;
    optional bool is_guest = 5;
}

message ManagedServicesProto {
    option (android.msg_privacy).dest = DEST_AUTOMATIC;

    // Hard-coded string identifying what the service config is for
    // (eg: "notification assistant" or "notification listener").
    optional string caption = 1;

    message ServiceProto {
        option (android.msg_privacy).dest = DEST_AUTOMATIC;

        // Package or component name.
        repeated string name = 1;
        optional int32 user_id = 2;
        optional bool is_primary = 3;
    }
    repeated ServiceProto approved = 2;

    // All of this type/caption enabled for current profiles.
    repeated android.content.ComponentNameProto enabled = 3;

    repeated ManagedServiceInfoProto live_services = 4;

    // Was: repeated ComponentNameProto, when snoozed services were not per-user-id.
    reserved 5;

    message SnoozedServices {
        option (android.msg_privacy).dest = DEST_AUTOMATIC;

        optional int32 user_id = 1;
        repeated android.content.ComponentNameProto snoozed = 2;
    }

    // Snoozed for current profiles.
    repeated SnoozedServices snoozed = 6;
}

message RankingHelperProto {
    option (android.msg_privacy).dest = DEST_AUTOMATIC;

    repeated string notification_signal_extractors = 1;

    message RecordProto {
        option (android.msg_privacy).dest = DEST_AUTOMATIC;

        optional string package = 1;
        // Default value is UNKNOWN_UID = USER_NULL = -10000.
        optional int32 uid = 2;
        // Default is IMPORTANCE_UNSPECIFIED (-1000).
        optional sint32 importance = 3;
        // Default is PRIORITY_DEFAULT (0).
        optional int32 priority = 4;
        // Default is VISIBILITY_NO_OVERRIDE (-1000).
        optional sint32 visibility = 5;
        // Default is true.
        optional bool show_badge = 6;
        repeated android.app.NotificationChannelProto channels = 7;
        repeated android.app.NotificationChannelGroupProto channel_groups = 8;
    }
    repeated RecordProto records = 2;
    repeated RecordProto records_restored_without_uid = 3;
}

enum ZenMode {
    ZEN_MODE_OFF = 0;
    ZEN_MODE_IMPORTANT_INTERRUPTIONS = 1;
    ZEN_MODE_NO_INTERRUPTIONS = 2;
    ZEN_MODE_ALARMS = 3;
}

// An android.service.notification.Condition object.
message ConditionProto {
    option (android.msg_privacy).dest = DEST_EXPLICIT;

    // The URI representing the rule being updated.
    optional string id = 1;
    // A user visible description of the rule state.
    optional string summary = 2;
    // Android generated strings that detail when ZenMode will end.
    optional string line_1 = 3;
    optional string line_2 = 4;
    optional int32 icon = 5 [ (android.privacy).dest = DEST_AUTOMATIC ];

    enum State {
        // Indicates that Do Not Disturb should be turned off.
        STATE_FALSE = 0;
        // Indicates that Do Not Disturb should be turned on.
        STATE_TRUE = 1;
        STATE_UNKNOWN = 2;
        STATE_ERROR = 3;
    }
    optional State state = 6 [ (android.privacy).dest = DEST_AUTOMATIC ];

    optional int32 flags = 7 [ (android.privacy).dest = DEST_AUTOMATIC ];
}

// An android.service.notification.ZenModeConfig.ZenRule object.
message ZenRuleProto {
    option (android.msg_privacy).dest = DEST_EXPLICIT;

    // Required for automatic ZenRules (unique).
    optional string id = 1;
    // Required for automatic ZenRules.
    optional string name = 2;
    // Required for automatic ZenRules.
    optional int64 creation_time_ms = 3 [
        (android.privacy).dest = DEST_AUTOMATIC
    ];
    optional bool enabled = 4 [ (android.privacy).dest = DEST_AUTOMATIC ];
    // Package name, only used for manual ZenRules.
    optional string enabler = 5 [ (android.privacy).dest = DEST_AUTOMATIC ];
    // User manually disabled this instance.
    optional bool is_snoozing = 6 [
        (android.privacy).dest = DEST_AUTOMATIC
    ];
    optional ZenMode zen_mode = 7 [
        (android.privacy).dest = DEST_AUTOMATIC
    ];

    // Required for automatic ZenRules. The condition's ID, which is the URI
    // representing the rule being updated.
    optional string condition_id = 8;
    optional ConditionProto condition = 9;
    optional android.content.ComponentNameProto component = 10;
    optional ZenPolicyProto zenPolicy = 11;

    // Indicates whether this ZenRule has been modified after its initial creation
    optional bool modified = 12 [ (android.privacy).dest = DEST_AUTOMATIC ];
}

// A dump from com.android.server.notification.ZenModeHelper.
message ZenModeProto {
    option (android.msg_privacy).dest = DEST_AUTOMATIC;

    optional ZenMode zen_mode = 1;
    repeated ZenRuleProto enabled_active_conditions = 2;
    optional int32 suppressed_effects = 3;
    repeated android.content.ComponentNameProto suppressors = 4;
    optional android.app.PolicyProto policy = 5;
}

// An android.service.notification.ZenPolicy object
message ZenPolicyProto {
    option (android.msg_privacy).dest = DEST_AUTOMATIC;

    enum State {
        STATE_UNSET = 0;
        STATE_ALLOW = 1;
        STATE_DISALLOW = 2;
    }

    // Notifications and sounds allowed/disallowed when DND is active
    optional State reminders = 1;
    optional State events = 2;
    optional State messages = 3;
    optional State calls = 4;
    optional State repeat_callers = 5;
    optional State alarms = 6;
    optional State media = 7;
    optional State system = 8;

    // Visual effects allowed/disallowed for intercepted notifications when DND is active
    optional State full_screen_intent = 9;
    optional State lights = 10;
    optional State peek = 11;
    optional State status_bar = 12;
    optional State badge= 13;
    optional State ambient = 14;
    optional State notification_list = 15;

    enum Sender {
        SENDER_UNSET = 0;
        // Any sender is prioritized.
        SENDER_ANY = 1;
        // Saved contacts are prioritized.
        SENDER_CONTACTS = 2;
        // Only starred contacts are prioritized.
        SENDER_STARRED = 3;
        // No calls/messages are prioritized.
        SENDER_NONE = 4;
    }
    optional Sender priority_calls = 16;
    optional Sender priority_messages = 17;
}

// Next Tag: 2
message PackageRemoteViewInfoProto {
    optional string package_name = 1;
    // add per-package additional info here (like channels)
}

// Next Tag: 2
message NotificationRemoteViewsProto {
    repeated PackageRemoteViewInfoProto package_remote_view_info = 1;
}

// Enum used in DNDModeProto to specify the zen mode setting.
enum LoggedZenMode {
    ROOT_CONFIG = -1;  // Used to distinguish config (one per user) from the rules.
    OFF = 0;
    IMPORTANT_INTERRUPTIONS = 1;
    NO_INTERRUPTIONS = 2;
    ALARMS = 3;
}

/**
 * Atom that represents an item in the list of Do Not Disturb rules, pulled from
 * NotificationManagerService.java.
 */
message DNDModeProto {
    optional int32 user = 1;  // Android user ID (0, 1, 10, ...)
    optional bool enabled = 2;  // true for ROOT_CONFIG if a manualRule is enabled
    optional bool channels_bypassing = 3; // only valid for ROOT_CONFIG
    optional LoggedZenMode zen_mode = 4;
    // id is one of the system default rule IDs, or empty
    // May also be "MANUAL_RULE" to indicate app-activation of the manual rule.
    optional string id = 5;
    optional int32 uid = 6; // currently only SYSTEM_UID or 0 for other
    optional DNDPolicyProto policy = 7;
}

// Enum used in DNDPolicyProto for a particular policy parameter's state.
enum State {
    STATE_UNSET = 0;
    STATE_ALLOW = 1;
    STATE_DISALLOW = 2;
}

// Enum used in DNDPolicyProto for which people are allowed to break through.
enum PeopleType {
    PEOPLE_UNSET = 0;
    PEOPLE_ANYONE = 1;
    PEOPLE_CONTACTS = 2;
    PEOPLE_STARRED = 3;
    PEOPLE_NONE = 4;
}

// Enum used in DNDPolicyProto for conversation types allowed to break through.
enum ConversationType {
    CONV_UNSET = 0;
    CONV_ANYONE = 1;
    CONV_IMPORTANT = 2;
    CONV_NONE = 3;
}

/**
 * Message that represents a Do Not Disturb policy, an optional detail proto for DNDModeProto.
 */
message DNDPolicyProto {
    optional State calls = 1;
    optional State repeat_callers = 2;
    optional State messages = 3;
    optional State conversations = 4;
    optional State reminders = 5;
    optional State events = 6;
    optional State alarms = 7;
    optional State media = 8;
    optional State system = 9;
    optional State fullscreen = 10;
    optional State lights = 11;
    optional State peek = 12;
    optional State status_bar = 13;
    optional State badge = 14;
    optional State ambient = 15;
    optional State notification_list = 16;

    optional PeopleType allow_calls_from = 17;
    optional PeopleType allow_messages_from = 18;

    optional ConversationType allow_conversations_from = 19;
}

// Enum identifying the type of rule that changed; values set to match ones used in the
// DNDStateChanged proto.
enum RuleType {
    RULE_TYPE_UNKNOWN = 0;
    RULE_TYPE_MANUAL = 1;
    RULE_TYPE_AUTOMATIC = 2;
}