@Override public VLocConfig createFromParcel(Parcel source) { return new VLocConfig(source); }
@Override public void setLocation(int userId, String pkg, VLocation loc) throws RemoteException { getOrCreateConfig(userId, pkg).location = loc; mPersistenceLayer.save(); }
@Override public void readPersistenceData(Parcel p) { mGlobalConfig.set(new VLocConfig(p)); mLocConfigs.clear(); int size = p.readInt(); while (size-- > 0) { int userId = p.readInt(); //noinspection unchecked Map<String, VLocConfig> pkgs = p.readHashMap(getClass().getClassLoader()); mLocConfigs.put(userId, pkgs); } } };
@Override public void writePersistenceData(Parcel p) { mGlobalConfig.writeToParcel(p, 0); p.writeInt(mLocConfigs.size()); for (int i = 0; i < mLocConfigs.size(); i++) { int userId = mLocConfigs.keyAt(i); Map<String, VLocConfig> pkgs = mLocConfigs.valueAt(i); p.writeInt(userId); p.writeMap(pkgs); } }
@Override public boolean onCreate() { Context context = getContext(); DaemonService.startup(context); if (!VirtualCore.get().isStartup()) { return true; } VPackageManagerService.systemReady(); addService(ServiceManagerNative.PACKAGE, VPackageManagerService.get()); VActivityManagerService.systemReady(context); addService(ServiceManagerNative.ACTIVITY, VActivityManagerService.get()); addService(ServiceManagerNative.USER, VUserManagerService.get()); VAppManagerService.systemReady(); addService(ServiceManagerNative.APP, VAppManagerService.get()); BroadcastSystem.attach(VActivityManagerService.get(), VAppManagerService.get()); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { addService(ServiceManagerNative.JOB, VJobSchedulerService.get()); } VNotificationManagerService.systemReady(context); addService(ServiceManagerNative.NOTIFICATION, VNotificationManagerService.get()); VAppManagerService.get().scanApps(); VAccountManagerService.systemReady(); addService(ServiceManagerNative.ACCOUNT, VAccountManagerService.get()); addService(ServiceManagerNative.VS, VirtualStorageService.get()); addService(ServiceManagerNative.DEVICE, VDeviceManagerService.get()); addService(ServiceManagerNative.VIRTUAL_LOC, VirtualLocationService.get()); return true; }
@Override public int getMode(int userId, String pkg) throws RemoteException { synchronized (mLocConfigs) { VLocConfig config = getOrCreateConfig(userId, pkg); mPersistenceLayer.save(); return config.mode; } }
private VLocConfig getOrCreateConfig(int userId, String pkg) { Map<String, VLocConfig> pkgs = mLocConfigs.get(userId); if (pkgs == null) { pkgs = new HashMap<>(); mLocConfigs.put(userId, pkgs); } VLocConfig config = pkgs.get(pkg); if (config == null) { config = new VLocConfig(); config.mode = MODE_CLOSE; pkgs.put(pkg, config); } return config; }
@Override public void setCell(int userId, String pkg, VCell cell) throws RemoteException { getOrCreateConfig(userId, pkg).cell = cell; mPersistenceLayer.save(); }
@Override public VLocConfig createFromParcel(Parcel source) { return new VLocConfig(source); }
@Override public void setNeighboringCell(int userId, String pkg, List<VCell> cell) throws RemoteException { getOrCreateConfig(userId, pkg).neighboringCell = cell; mPersistenceLayer.save(); }
@Override public VLocConfig createFromParcel(Parcel source) { return new VLocConfig(source); }
@Override public void setMode(int userId, String pkg, int mode) throws RemoteException { synchronized (mLocConfigs) { getOrCreateConfig(userId, pkg).mode = mode; mPersistenceLayer.save(); } }
@Override public void setAllCell(int userId, String pkg, List<VCell> cell) throws RemoteException { getOrCreateConfig(userId, pkg).allCell = cell; mPersistenceLayer.save(); }
@Override public VLocation getLocation(int userId, String pkg) throws RemoteException { VLocConfig config = getOrCreateConfig(userId, pkg); mPersistenceLayer.save(); switch (config.mode) { case MODE_USE_SELF: return config.location; case MODE_USE_GLOBAL: return mGlobalConfig.location; case MODE_CLOSE: default: return null; } }
@Override public VCell getCell(int userId, String pkg) throws RemoteException { VLocConfig config = getOrCreateConfig(userId, pkg); mPersistenceLayer.save(); switch (config.mode) { case MODE_USE_SELF: return config.cell; case MODE_USE_GLOBAL: return mGlobalConfig.cell; case MODE_CLOSE: default: return null; } }
@Override public List<VCell> getAllCell(int userId, String pkg) throws RemoteException { VLocConfig config = getOrCreateConfig(userId, pkg); mPersistenceLayer.save(); switch (config.mode) { case MODE_USE_SELF: return config.allCell; case MODE_USE_GLOBAL: return mGlobalConfig.allCell; case MODE_CLOSE: default: return null; } }
@Override public List<VCell> getNeighboringCell(int userId, String pkg) throws RemoteException { VLocConfig config = getOrCreateConfig(userId, pkg); mPersistenceLayer.save(); switch (config.mode) { case MODE_USE_SELF: return config.neighboringCell; case MODE_USE_GLOBAL: return mGlobalConfig.neighboringCell; case MODE_CLOSE: default: return null; } }
@Override public int getMode(int userId, String pkg) throws RemoteException { synchronized (mLocConfigs) { VLocConfig config = getOrCreateConfig(userId, pkg); mPersistenceLayer.save(); return config.mode; } }
@Override public int getMode(int userId, String pkg) { synchronized (mLocConfigs) { VLocConfig config = getOrCreateConfig(userId, pkg); mPersistenceLayer.save(); return config.mode; } }
@Override public void setNeighboringCell(int userId, String pkg, List<VCell> cell) throws RemoteException { getOrCreateConfig(userId, pkg).neighboringCell = cell; mPersistenceLayer.save(); }