TestMtpManager.java revision 52652ac7a5f479f7f5e24f78778203bd88c0c4f4
109109567e9816d20f51b5ce0175751116836635fDaichi Hirono/* 209109567e9816d20f51b5ce0175751116836635fDaichi Hirono * Copyright (C) 2015 The Android Open Source Project 309109567e9816d20f51b5ce0175751116836635fDaichi Hirono * 409109567e9816d20f51b5ce0175751116836635fDaichi Hirono * Licensed under the Apache License, Version 2.0 (the "License"); 509109567e9816d20f51b5ce0175751116836635fDaichi Hirono * you may not use this file except in compliance with the License. 609109567e9816d20f51b5ce0175751116836635fDaichi Hirono * You may obtain a copy of the License at 709109567e9816d20f51b5ce0175751116836635fDaichi Hirono * 809109567e9816d20f51b5ce0175751116836635fDaichi Hirono * http://www.apache.org/licenses/LICENSE-2.0 909109567e9816d20f51b5ce0175751116836635fDaichi Hirono * 1009109567e9816d20f51b5ce0175751116836635fDaichi Hirono * Unless required by applicable law or agreed to in writing, software 1109109567e9816d20f51b5ce0175751116836635fDaichi Hirono * distributed under the License is distributed on an "AS IS" BASIS, 1209109567e9816d20f51b5ce0175751116836635fDaichi Hirono * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1309109567e9816d20f51b5ce0175751116836635fDaichi Hirono * See the License for the specific language governing permissions and 1409109567e9816d20f51b5ce0175751116836635fDaichi Hirono * limitations under the License. 1509109567e9816d20f51b5ce0175751116836635fDaichi Hirono */ 1609109567e9816d20f51b5ce0175751116836635fDaichi Hirono 1709109567e9816d20f51b5ce0175751116836635fDaichi Hironopackage com.android.mtp; 1809109567e9816d20f51b5ce0175751116836635fDaichi Hirono 1909109567e9816d20f51b5ce0175751116836635fDaichi Hironoimport android.content.Context; 2052652ac7a5f479f7f5e24f78778203bd88c0c4f4Tomasz Mikolajewskiimport android.os.ParcelFileDescriptor; 2109109567e9816d20f51b5ce0175751116836635fDaichi Hirono 2209109567e9816d20f51b5ce0175751116836635fDaichi Hironoimport java.io.IOException; 23e5323b7493f2bc1537d7e6b2d4595d69fd01d72eDaichi Hironoimport java.util.Arrays; 2409109567e9816d20f51b5ce0175751116836635fDaichi Hironoimport java.util.HashMap; 2509109567e9816d20f51b5ce0175751116836635fDaichi Hironoimport java.util.HashSet; 2609109567e9816d20f51b5ce0175751116836635fDaichi Hironoimport java.util.Map; 2709109567e9816d20f51b5ce0175751116836635fDaichi Hironoimport java.util.Set; 2809109567e9816d20f51b5ce0175751116836635fDaichi Hironoimport java.util.TreeSet; 2909109567e9816d20f51b5ce0175751116836635fDaichi Hirono 306ee4a1c1247e2a1d3032bcd432f843cbb7227dccDaichi Hironopublic class TestMtpManager extends MtpManager { 31e5323b7493f2bc1537d7e6b2d4595d69fd01d72eDaichi Hirono private static String pack(int... args) { 32e5323b7493f2bc1537d7e6b2d4595d69fd01d72eDaichi Hirono return Arrays.toString(args); 33e5323b7493f2bc1537d7e6b2d4595d69fd01d72eDaichi Hirono } 34e5323b7493f2bc1537d7e6b2d4595d69fd01d72eDaichi Hirono 3509109567e9816d20f51b5ce0175751116836635fDaichi Hirono private final Set<Integer> mValidDevices = new HashSet<Integer>(); 3609109567e9816d20f51b5ce0175751116836635fDaichi Hirono private final Set<Integer> mOpenedDevices = new TreeSet<Integer>(); 3709109567e9816d20f51b5ce0175751116836635fDaichi Hirono private final Map<Integer, MtpRoot[]> mRoots = new HashMap<Integer, MtpRoot[]>(); 38e5323b7493f2bc1537d7e6b2d4595d69fd01d72eDaichi Hirono private final Map<String, MtpDocument> mDocuments = new HashMap<String, MtpDocument>(); 395fecc6cf032bbbc2616dd2342a50656bf2857832Daichi Hirono private final Map<String, Integer> mParents = new HashMap<String, Integer>(); 4052652ac7a5f479f7f5e24f78778203bd88c0c4f4Tomasz Mikolajewski private final Map<String, byte[]> mImportFileBytes = new HashMap<String, byte[]>(); 4109109567e9816d20f51b5ce0175751116836635fDaichi Hirono 426ee4a1c1247e2a1d3032bcd432f843cbb7227dccDaichi Hirono TestMtpManager(Context context) { 4309109567e9816d20f51b5ce0175751116836635fDaichi Hirono super(context); 4409109567e9816d20f51b5ce0175751116836635fDaichi Hirono } 4509109567e9816d20f51b5ce0175751116836635fDaichi Hirono 4609109567e9816d20f51b5ce0175751116836635fDaichi Hirono void addValidDevice(int deviceId) { 4709109567e9816d20f51b5ce0175751116836635fDaichi Hirono mValidDevices.add(deviceId); 4809109567e9816d20f51b5ce0175751116836635fDaichi Hirono } 4909109567e9816d20f51b5ce0175751116836635fDaichi Hirono 5009109567e9816d20f51b5ce0175751116836635fDaichi Hirono void setRoots(int deviceId, MtpRoot[] roots) { 5109109567e9816d20f51b5ce0175751116836635fDaichi Hirono mRoots.put(deviceId, roots); 5209109567e9816d20f51b5ce0175751116836635fDaichi Hirono } 5309109567e9816d20f51b5ce0175751116836635fDaichi Hirono 54e5323b7493f2bc1537d7e6b2d4595d69fd01d72eDaichi Hirono void setDocument(int deviceId, int objectHandle, MtpDocument document) { 55e5323b7493f2bc1537d7e6b2d4595d69fd01d72eDaichi Hirono mDocuments.put(pack(deviceId, objectHandle), document); 56e5323b7493f2bc1537d7e6b2d4595d69fd01d72eDaichi Hirono } 57e5323b7493f2bc1537d7e6b2d4595d69fd01d72eDaichi Hirono 5852652ac7a5f479f7f5e24f78778203bd88c0c4f4Tomasz Mikolajewski void setImportFileBytes(int deviceId, int objectHandle, byte[] bytes) { 5952652ac7a5f479f7f5e24f78778203bd88c0c4f4Tomasz Mikolajewski mImportFileBytes.put(pack(deviceId, objectHandle), bytes); 608ba419119d50a031160cab54bef6899bd0051ea9Daichi Hirono } 618ba419119d50a031160cab54bef6899bd0051ea9Daichi Hirono 625fecc6cf032bbbc2616dd2342a50656bf2857832Daichi Hirono void setParent(int deviceId, int objectHandle, int parentObjectHandle) { 635fecc6cf032bbbc2616dd2342a50656bf2857832Daichi Hirono mParents.put(pack(deviceId, objectHandle), parentObjectHandle); 645fecc6cf032bbbc2616dd2342a50656bf2857832Daichi Hirono } 655fecc6cf032bbbc2616dd2342a50656bf2857832Daichi Hirono 6609109567e9816d20f51b5ce0175751116836635fDaichi Hirono @Override 6709109567e9816d20f51b5ce0175751116836635fDaichi Hirono void openDevice(int deviceId) throws IOException { 6809109567e9816d20f51b5ce0175751116836635fDaichi Hirono if (!mValidDevices.contains(deviceId) || mOpenedDevices.contains(deviceId)) { 6909109567e9816d20f51b5ce0175751116836635fDaichi Hirono throw new IOException(); 7009109567e9816d20f51b5ce0175751116836635fDaichi Hirono } 7109109567e9816d20f51b5ce0175751116836635fDaichi Hirono mOpenedDevices.add(deviceId); 7209109567e9816d20f51b5ce0175751116836635fDaichi Hirono } 7309109567e9816d20f51b5ce0175751116836635fDaichi Hirono 7409109567e9816d20f51b5ce0175751116836635fDaichi Hirono @Override 7509109567e9816d20f51b5ce0175751116836635fDaichi Hirono void closeDevice(int deviceId) throws IOException { 7609109567e9816d20f51b5ce0175751116836635fDaichi Hirono if (!mValidDevices.contains(deviceId) || !mOpenedDevices.contains(deviceId)) { 7709109567e9816d20f51b5ce0175751116836635fDaichi Hirono throw new IOException(); 7809109567e9816d20f51b5ce0175751116836635fDaichi Hirono } 7909109567e9816d20f51b5ce0175751116836635fDaichi Hirono mOpenedDevices.remove(deviceId); 8009109567e9816d20f51b5ce0175751116836635fDaichi Hirono } 8109109567e9816d20f51b5ce0175751116836635fDaichi Hirono 8209109567e9816d20f51b5ce0175751116836635fDaichi Hirono @Override 8309109567e9816d20f51b5ce0175751116836635fDaichi Hirono MtpRoot[] getRoots(int deviceId) throws IOException { 8409109567e9816d20f51b5ce0175751116836635fDaichi Hirono if (mRoots.containsKey(deviceId)) { 8509109567e9816d20f51b5ce0175751116836635fDaichi Hirono return mRoots.get(deviceId); 8609109567e9816d20f51b5ce0175751116836635fDaichi Hirono } else { 8709109567e9816d20f51b5ce0175751116836635fDaichi Hirono throw new IOException("getRoots error"); 8809109567e9816d20f51b5ce0175751116836635fDaichi Hirono } 8909109567e9816d20f51b5ce0175751116836635fDaichi Hirono } 9009109567e9816d20f51b5ce0175751116836635fDaichi Hirono 9109109567e9816d20f51b5ce0175751116836635fDaichi Hirono @Override 92e5323b7493f2bc1537d7e6b2d4595d69fd01d72eDaichi Hirono MtpDocument getDocument(int deviceId, int objectHandle) { 93e5323b7493f2bc1537d7e6b2d4595d69fd01d72eDaichi Hirono return mDocuments.get(pack(deviceId, objectHandle)); 94e5323b7493f2bc1537d7e6b2d4595d69fd01d72eDaichi Hirono } 95e5323b7493f2bc1537d7e6b2d4595d69fd01d72eDaichi Hirono 96e5323b7493f2bc1537d7e6b2d4595d69fd01d72eDaichi Hirono @Override 9752652ac7a5f479f7f5e24f78778203bd88c0c4f4Tomasz Mikolajewski void importFile(int deviceId, int storageId, ParcelFileDescriptor target) throws IOException { 9852652ac7a5f479f7f5e24f78778203bd88c0c4f4Tomasz Mikolajewski final String key = pack(deviceId, storageId); 9952652ac7a5f479f7f5e24f78778203bd88c0c4f4Tomasz Mikolajewski if (mImportFileBytes.containsKey(key)) { 10052652ac7a5f479f7f5e24f78778203bd88c0c4f4Tomasz Mikolajewski try (final ParcelFileDescriptor.AutoCloseOutputStream outputStream = 10152652ac7a5f479f7f5e24f78778203bd88c0c4f4Tomasz Mikolajewski new ParcelFileDescriptor.AutoCloseOutputStream(target)) { 10252652ac7a5f479f7f5e24f78778203bd88c0c4f4Tomasz Mikolajewski outputStream.write(mImportFileBytes.get(key)); 10352652ac7a5f479f7f5e24f78778203bd88c0c4f4Tomasz Mikolajewski } 1048ba419119d50a031160cab54bef6899bd0051ea9Daichi Hirono } else { 10552652ac7a5f479f7f5e24f78778203bd88c0c4f4Tomasz Mikolajewski throw new IOException("importFile error: " + key); 1068ba419119d50a031160cab54bef6899bd0051ea9Daichi Hirono } 1078ba419119d50a031160cab54bef6899bd0051ea9Daichi Hirono } 1088ba419119d50a031160cab54bef6899bd0051ea9Daichi Hirono 1098ba419119d50a031160cab54bef6899bd0051ea9Daichi Hirono @Override 1105fecc6cf032bbbc2616dd2342a50656bf2857832Daichi Hirono void deleteDocument(int deviceId, int objectHandle) throws IOException { 1115fecc6cf032bbbc2616dd2342a50656bf2857832Daichi Hirono final String key = pack(deviceId, objectHandle); 1125fecc6cf032bbbc2616dd2342a50656bf2857832Daichi Hirono if (mDocuments.containsKey(key)) { 1135fecc6cf032bbbc2616dd2342a50656bf2857832Daichi Hirono mDocuments.remove(key); 1145fecc6cf032bbbc2616dd2342a50656bf2857832Daichi Hirono } else { 1155fecc6cf032bbbc2616dd2342a50656bf2857832Daichi Hirono throw new IOException(); 1165fecc6cf032bbbc2616dd2342a50656bf2857832Daichi Hirono } 1175fecc6cf032bbbc2616dd2342a50656bf2857832Daichi Hirono } 1185fecc6cf032bbbc2616dd2342a50656bf2857832Daichi Hirono 1195fecc6cf032bbbc2616dd2342a50656bf2857832Daichi Hirono @Override 1205fecc6cf032bbbc2616dd2342a50656bf2857832Daichi Hirono synchronized int getParent(int deviceId, int objectHandle) throws IOException { 1215fecc6cf032bbbc2616dd2342a50656bf2857832Daichi Hirono final String key = pack(deviceId, objectHandle); 1225fecc6cf032bbbc2616dd2342a50656bf2857832Daichi Hirono if (mParents.containsKey(key)) { 1235fecc6cf032bbbc2616dd2342a50656bf2857832Daichi Hirono return mParents.get(key); 1245fecc6cf032bbbc2616dd2342a50656bf2857832Daichi Hirono } else { 1255fecc6cf032bbbc2616dd2342a50656bf2857832Daichi Hirono throw new IOException(); 1265fecc6cf032bbbc2616dd2342a50656bf2857832Daichi Hirono } 1275fecc6cf032bbbc2616dd2342a50656bf2857832Daichi Hirono } 1285fecc6cf032bbbc2616dd2342a50656bf2857832Daichi Hirono 1295fecc6cf032bbbc2616dd2342a50656bf2857832Daichi Hirono @Override 13009109567e9816d20f51b5ce0175751116836635fDaichi Hirono int[] getOpenedDeviceIds() { 13109109567e9816d20f51b5ce0175751116836635fDaichi Hirono int i = 0; 13209109567e9816d20f51b5ce0175751116836635fDaichi Hirono final int[] result = new int[mOpenedDevices.size()]; 13309109567e9816d20f51b5ce0175751116836635fDaichi Hirono for (int deviceId : mOpenedDevices) { 13409109567e9816d20f51b5ce0175751116836635fDaichi Hirono result[i++] = deviceId; 13509109567e9816d20f51b5ce0175751116836635fDaichi Hirono } 13609109567e9816d20f51b5ce0175751116836635fDaichi Hirono return result; 13709109567e9816d20f51b5ce0175751116836635fDaichi Hirono } 13809109567e9816d20f51b5ce0175751116836635fDaichi Hirono} 139