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

package android.os;

import android.os.IVoldListener;
import android.os.IVoldTaskListener;

/** {@hide} */
interface IVold {
    void setListener(IVoldListener listener);

    void monitor();
    void reset();
    void shutdown();

    void onUserAdded(int userId, int userSerial);
    void onUserRemoved(int userId);
    void onUserStarted(int userId);
    void onUserStopped(int userId);

    void onSecureKeyguardStateChanged(boolean isShowing);

    void partition(@utf8InCpp String diskId, int partitionType, int ratio);
    void forgetPartition(@utf8InCpp String partGuid, @utf8InCpp String fsUuid);

    void mount(@utf8InCpp String volId, int mountFlags, int mountUserId);
    void unmount(@utf8InCpp String volId);
    void format(@utf8InCpp String volId, @utf8InCpp String fsType);
    void benchmark(@utf8InCpp String volId, IVoldTaskListener listener);
    void checkEncryption(@utf8InCpp String volId);

    void moveStorage(@utf8InCpp String fromVolId, @utf8InCpp String toVolId,
                     IVoldTaskListener listener);

    void remountUid(int uid, int remountMode);

    void mkdirs(@utf8InCpp String path);

    @utf8InCpp String createObb(@utf8InCpp String sourcePath, @utf8InCpp String sourceKey,
                                int ownerGid);
    void destroyObb(@utf8InCpp String volId);

    void fstrim(int fstrimFlags, IVoldTaskListener listener);
    void runIdleMaint(IVoldTaskListener listener);
    void abortIdleMaint(IVoldTaskListener listener);

    FileDescriptor mountAppFuse(int uid, int pid, int mountId);
    void unmountAppFuse(int uid, int pid, int mountId);

    void fdeCheckPassword(@utf8InCpp String password);
    void fdeRestart();
    int fdeComplete();
    void fdeEnable(int passwordType, @utf8InCpp String password, int encryptionFlags);
    void fdeChangePassword(int passwordType, @utf8InCpp String password);
    void fdeVerifyPassword(@utf8InCpp String password);
    @utf8InCpp String fdeGetField(@utf8InCpp String key);
    void fdeSetField(@utf8InCpp String key, @utf8InCpp String value);
    int fdeGetPasswordType();
    @utf8InCpp String fdeGetPassword();
    void fdeClearPassword();

    void fbeEnable();

    void mountDefaultEncrypted();
    void initUser0();
    boolean isConvertibleToFbe();
    void mountFstab(@utf8InCpp String mountPoint);
    void encryptFstab(@utf8InCpp String mountPoint);

    void createUserKey(int userId, int userSerial, boolean ephemeral);
    void destroyUserKey(int userId);

    void addUserKeyAuth(int userId, int userSerial, @utf8InCpp String token,
                        @utf8InCpp String secret);
    void fixateNewestUserKeyAuth(int userId);

    void unlockUserKey(int userId, int userSerial, @utf8InCpp String token,
                       @utf8InCpp String secret);
    void lockUserKey(int userId);

    void prepareUserStorage(@nullable @utf8InCpp String uuid, int userId, int userSerial,
                            int storageFlags);
    void destroyUserStorage(@nullable @utf8InCpp String uuid, int userId, int storageFlags);

    boolean startCheckpoint(int retry);
    boolean needsCheckpoint();
    boolean needsRollback();
    void abortChanges();
    boolean commitChanges();
    boolean prepareDriveForCheckpoint(@utf8InCpp String mountPoint);
    boolean restoreCheckpoint(@utf8InCpp String device);
    boolean markBootAttempt();

    const int ENCRYPTION_FLAG_NO_UI = 4;

    const int ENCRYPTION_STATE_NONE = 1;
    const int ENCRYPTION_STATE_OK = 0;
    const int ENCRYPTION_STATE_ERROR_UNKNOWN = -1;
    const int ENCRYPTION_STATE_ERROR_INCOMPLETE = -2;
    const int ENCRYPTION_STATE_ERROR_INCONSISTENT = -3;
    const int ENCRYPTION_STATE_ERROR_CORRUPT = -4;

    const int FSTRIM_FLAG_DEEP_TRIM = 1;

    const int MOUNT_FLAG_PRIMARY = 1;
    const int MOUNT_FLAG_VISIBLE = 2;

    const int PARTITION_TYPE_PUBLIC = 0;
    const int PARTITION_TYPE_PRIVATE = 1;
    const int PARTITION_TYPE_MIXED = 2;

    const int PASSWORD_TYPE_PASSWORD = 0;
    const int PASSWORD_TYPE_DEFAULT = 1;
    const int PASSWORD_TYPE_PATTERN = 2;
    const int PASSWORD_TYPE_PIN = 3;

    const int STORAGE_FLAG_DE = 1;
    const int STORAGE_FLAG_CE = 2;

    const int REMOUNT_MODE_NONE = 0;
    const int REMOUNT_MODE_DEFAULT = 1;
    const int REMOUNT_MODE_READ = 2;
    const int REMOUNT_MODE_WRITE = 3;

    const int VOLUME_STATE_UNMOUNTED = 0;
    const int VOLUME_STATE_CHECKING = 1;
    const int VOLUME_STATE_MOUNTED = 2;
    const int VOLUME_STATE_MOUNTED_READ_ONLY = 3;
    const int VOLUME_STATE_FORMATTING = 4;
    const int VOLUME_STATE_EJECTING = 5;
    const int VOLUME_STATE_UNMOUNTABLE = 6;
    const int VOLUME_STATE_REMOVED = 7;
    const int VOLUME_STATE_BAD_REMOVAL = 8;

    const int VOLUME_TYPE_PUBLIC = 0;
    const int VOLUME_TYPE_PRIVATE = 1;
    const int VOLUME_TYPE_EMULATED = 2;
    const int VOLUME_TYPE_ASEC = 3;
    const int VOLUME_TYPE_OBB = 4;
}
