Home | History | Annotate | Download | only in facade
      1 /*
      2  * Copyright (C) 2016 Google Inc.
      3  *
      4  * Licensed under the Apache License, Version 2.0 (the "License"); you may not
      5  * use this file except in compliance with the License. You may obtain a copy of
      6  * the License at
      7  *
      8  * http://www.apache.org/licenses/LICENSE-2.0
      9  *
     10  * Unless required by applicable law or agreed to in writing, software
     11  * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
     12  * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
     13  * License for the specific language governing permissions and limitations under
     14  * the License.
     15  */
     16 
     17 package com.googlecode.android_scripting.facade;
     18 
     19 import android.app.Service;
     20 import android.content.SharedPreferences;
     21 import android.content.SharedPreferences.Editor;
     22 import android.preference.PreferenceManager;
     23 
     24 import com.googlecode.android_scripting.jsonrpc.RpcReceiver;
     25 import com.googlecode.android_scripting.rpc.Rpc;
     26 import com.googlecode.android_scripting.rpc.RpcOptional;
     27 import com.googlecode.android_scripting.rpc.RpcParameter;
     28 
     29 import java.io.IOException;
     30 import java.util.Map;
     31 
     32 /**
     33  * This facade allows access to the Preferences interface.
     34  *
     35  * <br>
     36  * <b>Notes:</b> <br>
     37  * <b>filename</b> - Filename indicates which preference file to refer to. If no filename is
     38  * supplied (the default) then the SharedPreferences uses is the default for the SL4A application.<br>
     39  * <b>prefPutValue</b> - uses "MODE_PRIVATE" when writing to preferences. Save values to the default
     40  * shared preferences is explicitly disallowed.<br>
     41  * <br>
     42  * See <a
     43  * href=http://developer.android.com/reference/java/util/prefs/Preferences.html>Preferences</a> and
     44  * <a href=http://developer.android.com/guide/topics/data/data-storage.html#pref>Shared
     45  * Preferences</a> in the android documentation on how preferences work.
     46  *
     47  * @author Robbie Matthews (rjmatthews62 (at) gmail.com)
     48  */
     49 
     50 public class PreferencesFacade extends RpcReceiver {
     51 
     52   private Service mService;
     53 
     54   public PreferencesFacade(FacadeManager manager) {
     55     super(manager);
     56     mService = manager.getService();
     57   }
     58 
     59   @Rpc(description = "Read a value from shared preferences")
     60   public Object prefGetValue(
     61       @RpcParameter(name = "key") String key,
     62       @RpcParameter(name = "filename", description = "Desired preferences file. If not defined, uses the default Shared Preferences.") @RpcOptional String filename) {
     63     SharedPreferences p = getPref(filename);
     64     return p.getAll().get(key);
     65   }
     66 
     67   @Rpc(description = "Write a value to shared preferences")
     68   public void prefPutValue(
     69       @RpcParameter(name = "key") String key,
     70       @RpcParameter(name = "value") Object value,
     71       @RpcParameter(name = "filename", description = "Desired preferences file. If not defined, uses the default Shared Preferences.") @RpcOptional String filename)
     72       throws IOException {
     73     if (filename == null || filename.equals("")) {
     74       throw new IOException("Can't write to default preferences.");
     75     }
     76     SharedPreferences p = getPref(filename);
     77     Editor e = p.edit();
     78     if (value instanceof Boolean) {
     79       e.putBoolean(key, (Boolean) value);
     80     } else if (value instanceof Long) {
     81       e.putLong(key, (Long) value);
     82     } else if (value instanceof Integer) {
     83       e.putLong(key, (Integer) value);
     84     } else if (value instanceof Float) {
     85       e.putFloat(key, (Float) value);
     86     } else if (value instanceof Double) { // TODO: Not sure if this is a good idea
     87       e.putFloat(key, ((Double) value).floatValue());
     88     } else {
     89       e.putString(key, value.toString());
     90     }
     91     e.commit();
     92   }
     93 
     94   @Rpc(description = "Get list of Shared Preference Values", returns = "Map of key,value")
     95   public Map<String, ?> prefGetAll(
     96       @RpcParameter(name = "filename", description = "Desired preferences file. If not defined, uses the default Shared Preferences.") @RpcOptional String filename) {
     97     return getPref(filename).getAll();
     98   }
     99 
    100   private SharedPreferences getPref(String filename) {
    101     if (filename == null || filename.equals("")) {
    102       return PreferenceManager.getDefaultSharedPreferences(mService);
    103     }
    104     return mService.getSharedPreferences(filename, 0);
    105 
    106   }
    107 
    108   @Override
    109   public void shutdown() {
    110 
    111   }
    112 }
    113