package com.lody.virtual.server.vs; import android.os.RemoteException; import android.util.SparseArray; import com.lody.virtual.server.IVirtualStorageService; import com.lody.virtual.server.pm.VUserManagerService; import java.util.HashMap; /** * @author Lody */ public class VirtualStorageService extends IVirtualStorageService.Stub { private static final VirtualStorageService sService = new VirtualStorageService(); private final VSPersistenceLayer mLayer = new VSPersistenceLayer(this); private final SparseArray<HashMap<String, VSConfig>> mConfigs = new SparseArray<>(); public static VirtualStorageService get() { return sService; } private VirtualStorageService() { mLayer.read(); } SparseArray<HashMap<String, VSConfig>> getConfigs() { return mConfigs; } @Override public void setVirtualStorage(String packageName, int userId, String vsPath) throws RemoteException { checkUserId(userId); synchronized (mConfigs) { VSConfig config = getOrCreateVSConfigLocked(packageName, userId); config.vsPath = vsPath; mLayer.save(); } } private VSConfig getOrCreateVSConfigLocked(String packageName, int userId) { HashMap<String, VSConfig> userMap = mConfigs.get(userId); if (userMap == null) { userMap = new HashMap<>(); mConfigs.put(userId, userMap); } VSConfig config = userMap.get(packageName); if (config == null) { config = new VSConfig(); config.enable = true; userMap.put(packageName, config); } return config; } @Override public String getVirtualStorage(String packageName, int userId) throws RemoteException { checkUserId(userId); synchronized (mConfigs) { VSConfig config = getOrCreateVSConfigLocked(packageName, userId); return config.vsPath; } } @Override public void setVirtualStorageState(String packageName, int userId, boolean enable) throws RemoteException { checkUserId(userId); synchronized (mConfigs) { VSConfig config = getOrCreateVSConfigLocked(packageName, userId); config.enable = enable; mLayer.save(); } } @Override public boolean isVirtualStorageEnable(String packageName, int userId) throws RemoteException { checkUserId(userId); synchronized (mConfigs) { VSConfig config = getOrCreateVSConfigLocked(packageName, userId); return config.enable; } } private void checkUserId(int userId) { if (!VUserManagerService.get().exists(userId)) { throw new IllegalStateException("Invalid userId " + userId); } } }