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);
}
}
}