/*
* Copyright (C) 2017 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.googlecode.android_scripting.facade;
import android.app.Service;
import android.content.SharedPreferences;
import android.content.SharedPreferences.Editor;
import android.preference.PreferenceManager;
import com.googlecode.android_scripting.jsonrpc.RpcReceiver;
import com.googlecode.android_scripting.rpc.Rpc;
import com.googlecode.android_scripting.rpc.RpcOptional;
import com.googlecode.android_scripting.rpc.RpcParameter;
import java.io.IOException;
import java.util.Map;
/**
* This facade allows access to the Preferences interface.
*
* <br>
* <b>Notes:</b> <br>
* <b>filename</b> - Filename indicates which preference file to refer to. If no filename is
* supplied (the default) then the SharedPreferences uses is the default for the SL4A application.<br>
* <b>prefPutValue</b> - uses "MODE_PRIVATE" when writing to preferences. Save values to the default
* shared preferences is explicitly disallowed.<br>
* <br>
* See <a
* href=http://developer.android.com/reference/java/util/prefs/Preferences.html>Preferences</a> and
* <a href=http://developer.android.com/guide/topics/data/data-storage.html#pref>Shared
* Preferences</a> in the android documentation on how preferences work.
*
*/
public class PreferencesFacade extends RpcReceiver {
private Service mService;
public PreferencesFacade(FacadeManager manager) {
super(manager);
mService = manager.getService();
}
@Rpc(description = "Read a value from shared preferences")
public Object prefGetValue(
@RpcParameter(name = "key") String key,
@RpcParameter(name = "filename", description = "Desired preferences file. If not defined, uses the default Shared Preferences.") @RpcOptional String filename) {
SharedPreferences p = getPref(filename);
return p.getAll().get(key);
}
@Rpc(description = "Write a value to shared preferences")
public void prefPutValue(
@RpcParameter(name = "key") String key,
@RpcParameter(name = "value") Object value,
@RpcParameter(name = "filename", description = "Desired preferences file. If not defined, uses the default Shared Preferences.") @RpcOptional String filename)
throws IOException {
if (filename == null || filename.equals("")) {
throw new IOException("Can't write to default preferences.");
}
SharedPreferences p = getPref(filename);
Editor e = p.edit();
if (value instanceof Boolean) {
e.putBoolean(key, (Boolean) value);
} else if (value instanceof Long) {
e.putLong(key, (Long) value);
} else if (value instanceof Integer) {
e.putLong(key, (Integer) value);
} else if (value instanceof Float) {
e.putFloat(key, (Float) value);
} else if (value instanceof Double) { // TODO: Not sure if this is a good idea
e.putFloat(key, ((Double) value).floatValue());
} else {
e.putString(key, value.toString());
}
e.commit();
}
@Rpc(description = "Get list of Shared Preference Values", returns = "Map of key,value")
public Map<String, ?> prefGetAll(
@RpcParameter(name = "filename", description = "Desired preferences file. If not defined, uses the default Shared Preferences.") @RpcOptional String filename) {
return getPref(filename).getAll();
}
private SharedPreferences getPref(String filename) {
if (filename == null || filename.equals("")) {
return PreferenceManager.getDefaultSharedPreferences(mService);
}
return mService.getSharedPreferences(filename, 0);
}
@Override
public void shutdown() {
}
}