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