1507d11c9353666a75fee014565f900825a907691Andrew Scullpackage com.android.server.locksettings;
27b7424b0b7c5b6be09ed6fb0ec70272574dfe718Rubin Xu
37b7424b0b7c5b6be09ed6fb0ec70272574dfe718Rubin Xuimport android.hardware.weaver.V1_0.IWeaver;
47b7424b0b7c5b6be09ed6fb0ec70272574dfe718Rubin Xuimport android.hardware.weaver.V1_0.WeaverConfig;
57b7424b0b7c5b6be09ed6fb0ec70272574dfe718Rubin Xuimport android.hardware.weaver.V1_0.WeaverReadResponse;
67b7424b0b7c5b6be09ed6fb0ec70272574dfe718Rubin Xuimport android.hardware.weaver.V1_0.WeaverStatus;
77b7424b0b7c5b6be09ed6fb0ec70272574dfe718Rubin Xuimport android.hidl.base.V1_0.DebugInfo;
87b7424b0b7c5b6be09ed6fb0ec70272574dfe718Rubin Xuimport android.os.IHwBinder;
97b7424b0b7c5b6be09ed6fb0ec70272574dfe718Rubin Xuimport android.os.IHwBinder.DeathRecipient;
107b7424b0b7c5b6be09ed6fb0ec70272574dfe718Rubin Xuimport android.os.RemoteException;
117b7424b0b7c5b6be09ed6fb0ec70272574dfe718Rubin Xuimport android.util.Pair;
127b7424b0b7c5b6be09ed6fb0ec70272574dfe718Rubin Xu
137b7424b0b7c5b6be09ed6fb0ec70272574dfe718Rubin Xuimport android.util.Log;
147b7424b0b7c5b6be09ed6fb0ec70272574dfe718Rubin Xu
157b7424b0b7c5b6be09ed6fb0ec70272574dfe718Rubin Xuimport java.util.ArrayList;
167b7424b0b7c5b6be09ed6fb0ec70272574dfe718Rubin Xuimport java.util.Arrays;
177b7424b0b7c5b6be09ed6fb0ec70272574dfe718Rubin Xu
187b7424b0b7c5b6be09ed6fb0ec70272574dfe718Rubin Xupublic class MockWeaverService implements IWeaver {
197b7424b0b7c5b6be09ed6fb0ec70272574dfe718Rubin Xu
207b7424b0b7c5b6be09ed6fb0ec70272574dfe718Rubin Xu    private static final int MAX_SLOTS = 8;
217b7424b0b7c5b6be09ed6fb0ec70272574dfe718Rubin Xu    private static final int KEY_LENGTH = 256 / 8;
227b7424b0b7c5b6be09ed6fb0ec70272574dfe718Rubin Xu    private static final int VALUE_LENGTH = 256 / 8;
237b7424b0b7c5b6be09ed6fb0ec70272574dfe718Rubin Xu
247b7424b0b7c5b6be09ed6fb0ec70272574dfe718Rubin Xu    private Pair<ArrayList<Byte>, ArrayList<Byte>>[] slots = new Pair[MAX_SLOTS];
257b7424b0b7c5b6be09ed6fb0ec70272574dfe718Rubin Xu    @Override
267b7424b0b7c5b6be09ed6fb0ec70272574dfe718Rubin Xu    public void getConfig(getConfigCallback cb) throws RemoteException {
277b7424b0b7c5b6be09ed6fb0ec70272574dfe718Rubin Xu        WeaverConfig config = new WeaverConfig();
287b7424b0b7c5b6be09ed6fb0ec70272574dfe718Rubin Xu        config.keySize = KEY_LENGTH;
297b7424b0b7c5b6be09ed6fb0ec70272574dfe718Rubin Xu        config.valueSize = VALUE_LENGTH;
307b7424b0b7c5b6be09ed6fb0ec70272574dfe718Rubin Xu        config.slots = MAX_SLOTS;
317b7424b0b7c5b6be09ed6fb0ec70272574dfe718Rubin Xu        cb.onValues(WeaverStatus.OK, config);
327b7424b0b7c5b6be09ed6fb0ec70272574dfe718Rubin Xu    }
337b7424b0b7c5b6be09ed6fb0ec70272574dfe718Rubin Xu
347b7424b0b7c5b6be09ed6fb0ec70272574dfe718Rubin Xu    @Override
357b7424b0b7c5b6be09ed6fb0ec70272574dfe718Rubin Xu    public int write(int slotId, ArrayList<Byte> key, ArrayList<Byte> value)
367b7424b0b7c5b6be09ed6fb0ec70272574dfe718Rubin Xu            throws RemoteException {
377b7424b0b7c5b6be09ed6fb0ec70272574dfe718Rubin Xu        if (slotId < 0 || slotId >= MAX_SLOTS) {
387b7424b0b7c5b6be09ed6fb0ec70272574dfe718Rubin Xu            throw new RuntimeException("Invalid slot id");
397b7424b0b7c5b6be09ed6fb0ec70272574dfe718Rubin Xu        }
407b7424b0b7c5b6be09ed6fb0ec70272574dfe718Rubin Xu        slots[slotId] = Pair.create((ArrayList<Byte>) key.clone(), (ArrayList<Byte>) value.clone());
417b7424b0b7c5b6be09ed6fb0ec70272574dfe718Rubin Xu        return WeaverStatus.OK;
427b7424b0b7c5b6be09ed6fb0ec70272574dfe718Rubin Xu    }
437b7424b0b7c5b6be09ed6fb0ec70272574dfe718Rubin Xu
447b7424b0b7c5b6be09ed6fb0ec70272574dfe718Rubin Xu    @Override
457b7424b0b7c5b6be09ed6fb0ec70272574dfe718Rubin Xu    public void read(int slotId, ArrayList<Byte> key, readCallback cb) throws RemoteException {
467b7424b0b7c5b6be09ed6fb0ec70272574dfe718Rubin Xu        if (slotId < 0 || slotId >= MAX_SLOTS) {
477b7424b0b7c5b6be09ed6fb0ec70272574dfe718Rubin Xu            throw new RuntimeException("Invalid slot id");
487b7424b0b7c5b6be09ed6fb0ec70272574dfe718Rubin Xu        }
497b7424b0b7c5b6be09ed6fb0ec70272574dfe718Rubin Xu
507b7424b0b7c5b6be09ed6fb0ec70272574dfe718Rubin Xu        WeaverReadResponse response = new WeaverReadResponse();
517b7424b0b7c5b6be09ed6fb0ec70272574dfe718Rubin Xu        if (key.equals(slots[slotId].first)) {
527b7424b0b7c5b6be09ed6fb0ec70272574dfe718Rubin Xu            response.value.addAll(slots[slotId].second);
537b7424b0b7c5b6be09ed6fb0ec70272574dfe718Rubin Xu            cb.onValues(WeaverStatus.OK, response);
547b7424b0b7c5b6be09ed6fb0ec70272574dfe718Rubin Xu        } else {
557b7424b0b7c5b6be09ed6fb0ec70272574dfe718Rubin Xu            cb.onValues(WeaverStatus.FAILED, response);
567b7424b0b7c5b6be09ed6fb0ec70272574dfe718Rubin Xu        }
577b7424b0b7c5b6be09ed6fb0ec70272574dfe718Rubin Xu    }
587b7424b0b7c5b6be09ed6fb0ec70272574dfe718Rubin Xu
597b7424b0b7c5b6be09ed6fb0ec70272574dfe718Rubin Xu    @Override
607b7424b0b7c5b6be09ed6fb0ec70272574dfe718Rubin Xu    public IHwBinder asBinder() {
617b7424b0b7c5b6be09ed6fb0ec70272574dfe718Rubin Xu        throw new UnsupportedOperationException();
627b7424b0b7c5b6be09ed6fb0ec70272574dfe718Rubin Xu    }
637b7424b0b7c5b6be09ed6fb0ec70272574dfe718Rubin Xu
647b7424b0b7c5b6be09ed6fb0ec70272574dfe718Rubin Xu    @Override
657b7424b0b7c5b6be09ed6fb0ec70272574dfe718Rubin Xu    public ArrayList<String> interfaceChain() throws RemoteException {
667b7424b0b7c5b6be09ed6fb0ec70272574dfe718Rubin Xu        throw new UnsupportedOperationException();
677b7424b0b7c5b6be09ed6fb0ec70272574dfe718Rubin Xu    }
687b7424b0b7c5b6be09ed6fb0ec70272574dfe718Rubin Xu
697b7424b0b7c5b6be09ed6fb0ec70272574dfe718Rubin Xu    @Override
707b7424b0b7c5b6be09ed6fb0ec70272574dfe718Rubin Xu    public String interfaceDescriptor() throws RemoteException {
717b7424b0b7c5b6be09ed6fb0ec70272574dfe718Rubin Xu        throw new UnsupportedOperationException();
727b7424b0b7c5b6be09ed6fb0ec70272574dfe718Rubin Xu    }
737b7424b0b7c5b6be09ed6fb0ec70272574dfe718Rubin Xu
747b7424b0b7c5b6be09ed6fb0ec70272574dfe718Rubin Xu    @Override
757b7424b0b7c5b6be09ed6fb0ec70272574dfe718Rubin Xu    public void setHALInstrumentation() throws RemoteException {
767b7424b0b7c5b6be09ed6fb0ec70272574dfe718Rubin Xu        throw new UnsupportedOperationException();
777b7424b0b7c5b6be09ed6fb0ec70272574dfe718Rubin Xu    }
787b7424b0b7c5b6be09ed6fb0ec70272574dfe718Rubin Xu
797b7424b0b7c5b6be09ed6fb0ec70272574dfe718Rubin Xu    @Override
807b7424b0b7c5b6be09ed6fb0ec70272574dfe718Rubin Xu    public boolean linkToDeath(DeathRecipient recipient, long cookie) throws RemoteException {
817b7424b0b7c5b6be09ed6fb0ec70272574dfe718Rubin Xu        throw new UnsupportedOperationException();
827b7424b0b7c5b6be09ed6fb0ec70272574dfe718Rubin Xu    }
837b7424b0b7c5b6be09ed6fb0ec70272574dfe718Rubin Xu
847b7424b0b7c5b6be09ed6fb0ec70272574dfe718Rubin Xu    @Override
857b7424b0b7c5b6be09ed6fb0ec70272574dfe718Rubin Xu    public void ping() throws RemoteException {
867b7424b0b7c5b6be09ed6fb0ec70272574dfe718Rubin Xu        throw new UnsupportedOperationException();
877b7424b0b7c5b6be09ed6fb0ec70272574dfe718Rubin Xu    }
887b7424b0b7c5b6be09ed6fb0ec70272574dfe718Rubin Xu
897b7424b0b7c5b6be09ed6fb0ec70272574dfe718Rubin Xu    @Override
907b7424b0b7c5b6be09ed6fb0ec70272574dfe718Rubin Xu    public DebugInfo getDebugInfo() throws RemoteException {
917b7424b0b7c5b6be09ed6fb0ec70272574dfe718Rubin Xu        throw new UnsupportedOperationException();
927b7424b0b7c5b6be09ed6fb0ec70272574dfe718Rubin Xu    }
937b7424b0b7c5b6be09ed6fb0ec70272574dfe718Rubin Xu
947b7424b0b7c5b6be09ed6fb0ec70272574dfe718Rubin Xu    @Override
957b7424b0b7c5b6be09ed6fb0ec70272574dfe718Rubin Xu    public void notifySyspropsChanged() throws RemoteException {
967b7424b0b7c5b6be09ed6fb0ec70272574dfe718Rubin Xu        throw new UnsupportedOperationException();
977b7424b0b7c5b6be09ed6fb0ec70272574dfe718Rubin Xu    }
987b7424b0b7c5b6be09ed6fb0ec70272574dfe718Rubin Xu
997b7424b0b7c5b6be09ed6fb0ec70272574dfe718Rubin Xu    @Override
1007b7424b0b7c5b6be09ed6fb0ec70272574dfe718Rubin Xu    public boolean unlinkToDeath(DeathRecipient recipient) throws RemoteException {
1017b7424b0b7c5b6be09ed6fb0ec70272574dfe718Rubin Xu        throw new UnsupportedOperationException();
1027b7424b0b7c5b6be09ed6fb0ec70272574dfe718Rubin Xu    }
1037b7424b0b7c5b6be09ed6fb0ec70272574dfe718Rubin Xu
1047b7424b0b7c5b6be09ed6fb0ec70272574dfe718Rubin Xu    @Override
1057b7424b0b7c5b6be09ed6fb0ec70272574dfe718Rubin Xu    public ArrayList<byte[]> getHashChain() throws RemoteException {
1067b7424b0b7c5b6be09ed6fb0ec70272574dfe718Rubin Xu        throw new UnsupportedOperationException();
1077b7424b0b7c5b6be09ed6fb0ec70272574dfe718Rubin Xu    }
1087b7424b0b7c5b6be09ed6fb0ec70272574dfe718Rubin Xu}
109