1963295ea105314e28e4ca9563aa09cb7440de4c3Andres Morales/*
2963295ea105314e28e4ca9563aa09cb7440de4c3Andres Morales * Copyright (C) 2014 The Android Open Source Project
3963295ea105314e28e4ca9563aa09cb7440de4c3Andres Morales *
4963295ea105314e28e4ca9563aa09cb7440de4c3Andres Morales * Licensed under the Apache License, Version 2.0 (the "License");
5963295ea105314e28e4ca9563aa09cb7440de4c3Andres Morales * you may not use this file except in compliance with the License.
6963295ea105314e28e4ca9563aa09cb7440de4c3Andres Morales * You may obtain a copy of the License at
7963295ea105314e28e4ca9563aa09cb7440de4c3Andres Morales *
8963295ea105314e28e4ca9563aa09cb7440de4c3Andres Morales *      http://www.apache.org/licenses/LICENSE-2.0
9963295ea105314e28e4ca9563aa09cb7440de4c3Andres Morales *
10963295ea105314e28e4ca9563aa09cb7440de4c3Andres Morales * Unless required by applicable law or agreed to in writing, software
11963295ea105314e28e4ca9563aa09cb7440de4c3Andres Morales * distributed under the License is distributed on an "AS IS" BASIS,
12963295ea105314e28e4ca9563aa09cb7440de4c3Andres Morales * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13963295ea105314e28e4ca9563aa09cb7440de4c3Andres Morales * See the License for the specific language governing permissions and
14963295ea105314e28e4ca9563aa09cb7440de4c3Andres Morales * limitations under the License.
15963295ea105314e28e4ca9563aa09cb7440de4c3Andres Morales */
16963295ea105314e28e4ca9563aa09cb7440de4c3Andres Morales
1768d4acd205e8c2da524e62734ca42847306cc029Andres Moralespackage android.service.persistentdata;
1868d4acd205e8c2da524e62734ca42847306cc029Andres Morales
19396181b0cb0d8b83c6abde333963b2acf871272fAndres Moralesimport android.annotation.SystemApi;
2068d4acd205e8c2da524e62734ca42847306cc029Andres Moralesimport android.os.RemoteException;
2168d4acd205e8c2da524e62734ca42847306cc029Andres Moralesimport android.util.Slog;
2268d4acd205e8c2da524e62734ca42847306cc029Andres Morales
2368d4acd205e8c2da524e62734ca42847306cc029Andres Morales/**
2468d4acd205e8c2da524e62734ca42847306cc029Andres Morales * Interface for reading and writing data blocks to a persistent partition.
2568d4acd205e8c2da524e62734ca42847306cc029Andres Morales *
2668d4acd205e8c2da524e62734ca42847306cc029Andres Morales * Allows writing one block at a time. Namely, each time
27963295ea105314e28e4ca9563aa09cb7440de4c3Andres Morales * {@link PersistentDataBlockManager#write(byte[])}
2868d4acd205e8c2da524e62734ca42847306cc029Andres Morales * is called, it will overwite the data that was previously written on the block.
2968d4acd205e8c2da524e62734ca42847306cc029Andres Morales *
3068d4acd205e8c2da524e62734ca42847306cc029Andres Morales * Clients can query the size of the currently written block via
31963295ea105314e28e4ca9563aa09cb7440de4c3Andres Morales * {@link PersistentDataBlockManager#getDataBlockSize()}.
32963295ea105314e28e4ca9563aa09cb7440de4c3Andres Morales *
33963295ea105314e28e4ca9563aa09cb7440de4c3Andres Morales * Clients can query the maximum size for a block via
34396181b0cb0d8b83c6abde333963b2acf871272fAndres Morales * {@link PersistentDataBlockManager#getMaximumDataBlockSize()}
3568d4acd205e8c2da524e62734ca42847306cc029Andres Morales *
36963295ea105314e28e4ca9563aa09cb7440de4c3Andres Morales * Clients can read the currently written block by invoking
37963295ea105314e28e4ca9563aa09cb7440de4c3Andres Morales * {@link PersistentDataBlockManager#read()}.
3868d4acd205e8c2da524e62734ca42847306cc029Andres Morales *
3968d4acd205e8c2da524e62734ca42847306cc029Andres Morales * @hide
4068d4acd205e8c2da524e62734ca42847306cc029Andres Morales */
41396181b0cb0d8b83c6abde333963b2acf871272fAndres Morales@SystemApi
4268d4acd205e8c2da524e62734ca42847306cc029Andres Moralespublic class PersistentDataBlockManager {
4368d4acd205e8c2da524e62734ca42847306cc029Andres Morales    private static final String TAG = PersistentDataBlockManager.class.getSimpleName();
4468d4acd205e8c2da524e62734ca42847306cc029Andres Morales    private IPersistentDataBlockService sService;
4568d4acd205e8c2da524e62734ca42847306cc029Andres Morales
4668d4acd205e8c2da524e62734ca42847306cc029Andres Morales    public PersistentDataBlockManager(IPersistentDataBlockService service) {
4768d4acd205e8c2da524e62734ca42847306cc029Andres Morales        sService = service;
4868d4acd205e8c2da524e62734ca42847306cc029Andres Morales    }
4968d4acd205e8c2da524e62734ca42847306cc029Andres Morales
5068d4acd205e8c2da524e62734ca42847306cc029Andres Morales    /**
5168d4acd205e8c2da524e62734ca42847306cc029Andres Morales     * Writes {@code data} to the persistent partition. Previously written data
5268d4acd205e8c2da524e62734ca42847306cc029Andres Morales     * will be overwritten. This data will persist across factory resets.
5368d4acd205e8c2da524e62734ca42847306cc029Andres Morales     *
54963295ea105314e28e4ca9563aa09cb7440de4c3Andres Morales     * Returns the number of bytes written or -1 on error. If the block is too big
55963295ea105314e28e4ca9563aa09cb7440de4c3Andres Morales     * to fit on the partition, returns -MAX_BLOCK_SIZE.
56963295ea105314e28e4ca9563aa09cb7440de4c3Andres Morales     *
5768d4acd205e8c2da524e62734ca42847306cc029Andres Morales     * @param data the data to write
5868d4acd205e8c2da524e62734ca42847306cc029Andres Morales     */
59963295ea105314e28e4ca9563aa09cb7440de4c3Andres Morales    public int write(byte[] data) {
6068d4acd205e8c2da524e62734ca42847306cc029Andres Morales        try {
61963295ea105314e28e4ca9563aa09cb7440de4c3Andres Morales            return sService.write(data);
6268d4acd205e8c2da524e62734ca42847306cc029Andres Morales        } catch (RemoteException e) {
6368d4acd205e8c2da524e62734ca42847306cc029Andres Morales            onError("writing data");
64963295ea105314e28e4ca9563aa09cb7440de4c3Andres Morales            return -1;
6568d4acd205e8c2da524e62734ca42847306cc029Andres Morales        }
6668d4acd205e8c2da524e62734ca42847306cc029Andres Morales    }
6768d4acd205e8c2da524e62734ca42847306cc029Andres Morales
6868d4acd205e8c2da524e62734ca42847306cc029Andres Morales    /**
69963295ea105314e28e4ca9563aa09cb7440de4c3Andres Morales     * Returns the data block stored on the persistent partition.
7068d4acd205e8c2da524e62734ca42847306cc029Andres Morales     */
71963295ea105314e28e4ca9563aa09cb7440de4c3Andres Morales    public byte[] read() {
7268d4acd205e8c2da524e62734ca42847306cc029Andres Morales        try {
73963295ea105314e28e4ca9563aa09cb7440de4c3Andres Morales            return sService.read();
7468d4acd205e8c2da524e62734ca42847306cc029Andres Morales        } catch (RemoteException e) {
7568d4acd205e8c2da524e62734ca42847306cc029Andres Morales            onError("reading data");
76963295ea105314e28e4ca9563aa09cb7440de4c3Andres Morales            return null;
7768d4acd205e8c2da524e62734ca42847306cc029Andres Morales        }
7868d4acd205e8c2da524e62734ca42847306cc029Andres Morales    }
7968d4acd205e8c2da524e62734ca42847306cc029Andres Morales
8068d4acd205e8c2da524e62734ca42847306cc029Andres Morales    /**
8168d4acd205e8c2da524e62734ca42847306cc029Andres Morales     * Retrieves the size of the block currently written to the persistent partition.
82963295ea105314e28e4ca9563aa09cb7440de4c3Andres Morales     *
83963295ea105314e28e4ca9563aa09cb7440de4c3Andres Morales     * Return -1 on error.
8468d4acd205e8c2da524e62734ca42847306cc029Andres Morales     */
8568d4acd205e8c2da524e62734ca42847306cc029Andres Morales    public int getDataBlockSize() {
8668d4acd205e8c2da524e62734ca42847306cc029Andres Morales        try {
8768d4acd205e8c2da524e62734ca42847306cc029Andres Morales            return sService.getDataBlockSize();
8868d4acd205e8c2da524e62734ca42847306cc029Andres Morales        } catch (RemoteException e) {
8968d4acd205e8c2da524e62734ca42847306cc029Andres Morales            onError("getting data block size");
90963295ea105314e28e4ca9563aa09cb7440de4c3Andres Morales            return -1;
91963295ea105314e28e4ca9563aa09cb7440de4c3Andres Morales        }
92963295ea105314e28e4ca9563aa09cb7440de4c3Andres Morales    }
93963295ea105314e28e4ca9563aa09cb7440de4c3Andres Morales
94963295ea105314e28e4ca9563aa09cb7440de4c3Andres Morales    /**
95963295ea105314e28e4ca9563aa09cb7440de4c3Andres Morales     * Retrieves the maximum size allowed for a data block.
96963295ea105314e28e4ca9563aa09cb7440de4c3Andres Morales     *
97963295ea105314e28e4ca9563aa09cb7440de4c3Andres Morales     * Returns -1 on error.
98963295ea105314e28e4ca9563aa09cb7440de4c3Andres Morales     */
99963295ea105314e28e4ca9563aa09cb7440de4c3Andres Morales    public long getMaximumDataBlockSize() {
100963295ea105314e28e4ca9563aa09cb7440de4c3Andres Morales        try {
101963295ea105314e28e4ca9563aa09cb7440de4c3Andres Morales            return sService.getMaximumDataBlockSize();
102963295ea105314e28e4ca9563aa09cb7440de4c3Andres Morales        } catch (RemoteException e) {
103963295ea105314e28e4ca9563aa09cb7440de4c3Andres Morales            onError("getting maximum data block size");
104963295ea105314e28e4ca9563aa09cb7440de4c3Andres Morales            return -1;
105963295ea105314e28e4ca9563aa09cb7440de4c3Andres Morales        }
106963295ea105314e28e4ca9563aa09cb7440de4c3Andres Morales    }
107963295ea105314e28e4ca9563aa09cb7440de4c3Andres Morales
108963295ea105314e28e4ca9563aa09cb7440de4c3Andres Morales    /**
109963295ea105314e28e4ca9563aa09cb7440de4c3Andres Morales     * Zeroes the previously written block in its entirety. Calling this method
110963295ea105314e28e4ca9563aa09cb7440de4c3Andres Morales     * will erase all data written to the persistent data partition.
111963295ea105314e28e4ca9563aa09cb7440de4c3Andres Morales     */
112963295ea105314e28e4ca9563aa09cb7440de4c3Andres Morales    public void wipe() {
113963295ea105314e28e4ca9563aa09cb7440de4c3Andres Morales        try {
114963295ea105314e28e4ca9563aa09cb7440de4c3Andres Morales            sService.wipe();
115963295ea105314e28e4ca9563aa09cb7440de4c3Andres Morales        } catch (RemoteException e) {
116963295ea105314e28e4ca9563aa09cb7440de4c3Andres Morales            onError("wiping persistent partition");
11768d4acd205e8c2da524e62734ca42847306cc029Andres Morales        }
11868d4acd205e8c2da524e62734ca42847306cc029Andres Morales    }
11968d4acd205e8c2da524e62734ca42847306cc029Andres Morales
12068d4acd205e8c2da524e62734ca42847306cc029Andres Morales    /**
12168d4acd205e8c2da524e62734ca42847306cc029Andres Morales     * Writes a byte enabling or disabling the ability to "OEM unlock" the device.
12268d4acd205e8c2da524e62734ca42847306cc029Andres Morales     */
12368d4acd205e8c2da524e62734ca42847306cc029Andres Morales    public void setOemUnlockEnabled(boolean enabled) {
12468d4acd205e8c2da524e62734ca42847306cc029Andres Morales        try {
12568d4acd205e8c2da524e62734ca42847306cc029Andres Morales            sService.setOemUnlockEnabled(enabled);
12668d4acd205e8c2da524e62734ca42847306cc029Andres Morales        } catch (RemoteException e) {
12768d4acd205e8c2da524e62734ca42847306cc029Andres Morales            onError("setting OEM unlock enabled to " + enabled);
12868d4acd205e8c2da524e62734ca42847306cc029Andres Morales        }
12968d4acd205e8c2da524e62734ca42847306cc029Andres Morales    }
13068d4acd205e8c2da524e62734ca42847306cc029Andres Morales
13168d4acd205e8c2da524e62734ca42847306cc029Andres Morales    /**
13268d4acd205e8c2da524e62734ca42847306cc029Andres Morales     * Returns whether or not "OEM unlock" is enabled or disabled on this device.
13368d4acd205e8c2da524e62734ca42847306cc029Andres Morales     */
13468d4acd205e8c2da524e62734ca42847306cc029Andres Morales    public boolean getOemUnlockEnabled() {
13568d4acd205e8c2da524e62734ca42847306cc029Andres Morales        try {
13668d4acd205e8c2da524e62734ca42847306cc029Andres Morales            return sService.getOemUnlockEnabled();
13768d4acd205e8c2da524e62734ca42847306cc029Andres Morales        } catch (RemoteException e) {
13868d4acd205e8c2da524e62734ca42847306cc029Andres Morales            onError("getting OEM unlock enabled bit");
13968d4acd205e8c2da524e62734ca42847306cc029Andres Morales            return false;
14068d4acd205e8c2da524e62734ca42847306cc029Andres Morales        }
14168d4acd205e8c2da524e62734ca42847306cc029Andres Morales    }
14268d4acd205e8c2da524e62734ca42847306cc029Andres Morales
14368d4acd205e8c2da524e62734ca42847306cc029Andres Morales    private void onError(String msg) {
14468d4acd205e8c2da524e62734ca42847306cc029Andres Morales        Slog.v(TAG, "Remote exception while " + msg);
14568d4acd205e8c2da524e62734ca42847306cc029Andres Morales    }
14668d4acd205e8c2da524e62734ca42847306cc029Andres Morales}
147