summaryrefslogtreecommitdiffstats
path: root/sl4a/Common/src/com/googlecode/android_scripting/facade/PreferencesFacade.java
blob: 8d39d2bb5c1062afde8f291af392941def69059d (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
/*
 * Copyright (C) 2015 Google Inc.
 *
 * 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.
 * 
 * @author Robbie Matthews (rjmatthews62@gmail.com)
 */

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() {

  }
}