/*
 * 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.pm;

import "frameworks/base/core/proto/android/content/featureinfo.proto";

option java_multiple_files = true;
option java_outer_classname = "PackageServiceProto";

message PackageServiceDumpProto {
    message PackageShortProto {
        // Name of package. e.g. "com.android.providers.telephony".
        optional string name = 1;
        // UID for this package as assigned by Android OS.
        optional int32 uid = 2;
    }
    message SharedLibraryProto {
        optional string name = 1;
        // True if library path is not null (jar), false otherwise (apk)
        optional bool is_jar = 2;
        // Should be filled if is_jar is true
        optional string path = 3;
        // Should be filled if is_jar is false
        optional string apk = 4;
    }
    message SharedUserProto {
        optional int32 user_id = 1;
        optional string name = 2;
    }

    // Installed packages.
    optional PackageShortProto required_verifier_package = 1;
    optional PackageShortProto verifier_package = 2;
    repeated SharedLibraryProto shared_libraries = 3;
    repeated android.content.pm.FeatureInfoProto features = 4;
    repeated PackageProto packages = 5;
    repeated SharedUserProto shared_users = 6;
    // Messages from the settings problem file
    repeated string messages = 7;
}

message PackageProto {
    message SplitProto {
        optional string name = 1;
        optional int32 revision_code = 2;
    }
    message UserInfoProto {
        enum InstallType {
            NOT_INSTALLED_FOR_USER = 0;
            FULL_APP_INSTALL = 1;
            INSTANT_APP_INSTALL = 2;
        }
        // Enum values gotten from PackageManger.java
        enum EnabledState {
            // This component or application is in its default enabled state
            // (as specified in its manifest).
            COMPONENT_ENABLED_STATE_DEFAULT = 0;
            // This component or application has been explictily enabled, regardless
            // of what it has specified in its manifest.
            COMPONENT_ENABLED_STATE_ENABLED = 1;
            // This component or application has been explicitly disabled, regardless of
            // what it has specified in its manifest.
            COMPONENT_ENABLED_STATE_DISABLED = 2;
            // The user has explicitly disabled the application, regardless of what it has
            // specified in its manifest.
            COMPONENT_ENABLED_STATE_DISABLED_USER = 3;
            // This application should be considered, until the point where the user actually
            // wants to use it.
            COMPONENT_ENABLED_STATE_DISABLED_UNTIL_USED = 4;
        }

        optional int32 id = 1;
        optional InstallType install_type = 2;
        // Is the app restricted by owner / admin
        optional bool is_hidden = 3;
        optional bool is_suspended = 4;
        optional bool is_stopped = 5;
        optional bool is_launched = 6;
        optional EnabledState enabled_state = 7;
        optional string last_disabled_app_caller = 8;
    }

    // Name of package. e.g. "com.android.providers.telephony".
    optional string name = 1;
    // UID for this package as assigned by Android OS.
    optional int32 uid = 2;
    // Package's reported version.
    optional int32 version_code = 3;
    // Package's reported version string (what's displayed to the user).
    optional string version_string = 4;
    // UTC timestamp of install
    optional int64 install_time_ms = 5;
    // Millisecond UTC timestamp of latest update adjusted to Google's server clock.
    optional int64 update_time_ms = 6;
    // From "dumpsys package" - name of package which installed this one.
    // Typically "" if system app or "com.android.vending" if Play Store.
    optional string installer_name = 7;
    // Split APKs.
    repeated SplitProto splits = 8;
    // Per-user package info.
    repeated UserInfoProto users = 9;
}
