1 /* 2 * Copyright (C) 2006 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of 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, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 package android.os; 18 19 import java.util.ArrayList; 20 21 import android.util.Log; 22 23 24 /** 25 * Gives access to the system properties store. The system properties 26 * store contains a list of string key-value pairs. 27 * 28 * {@hide} 29 */ 30 public class SystemProperties 31 { 32 public static final int PROP_NAME_MAX = 31; 33 public static final int PROP_VALUE_MAX = 91; 34 35 private static final ArrayList<Runnable> sChangeCallbacks = new ArrayList<Runnable>(); 36 native_get(String key)37 private static native String native_get(String key); native_get(String key, String def)38 private static native String native_get(String key, String def); native_get_int(String key, int def)39 private static native int native_get_int(String key, int def); native_get_long(String key, long def)40 private static native long native_get_long(String key, long def); native_get_boolean(String key, boolean def)41 private static native boolean native_get_boolean(String key, boolean def); native_set(String key, String def)42 private static native void native_set(String key, String def); native_add_change_callback()43 private static native void native_add_change_callback(); 44 45 /** 46 * Get the value for the given key. 47 * @return an empty string if the key isn't found 48 * @throws IllegalArgumentException if the key exceeds 32 characters 49 */ get(String key)50 public static String get(String key) { 51 if (key.length() > PROP_NAME_MAX) { 52 throw new IllegalArgumentException("key.length > " + PROP_NAME_MAX); 53 } 54 return native_get(key); 55 } 56 57 /** 58 * Get the value for the given key. 59 * @return if the key isn't found, return def if it isn't null, or an empty string otherwise 60 * @throws IllegalArgumentException if the key exceeds 32 characters 61 */ get(String key, String def)62 public static String get(String key, String def) { 63 if (key.length() > PROP_NAME_MAX) { 64 throw new IllegalArgumentException("key.length > " + PROP_NAME_MAX); 65 } 66 return native_get(key, def); 67 } 68 69 /** 70 * Get the value for the given key, and return as an integer. 71 * @param key the key to lookup 72 * @param def a default value to return 73 * @return the key parsed as an integer, or def if the key isn't found or 74 * cannot be parsed 75 * @throws IllegalArgumentException if the key exceeds 32 characters 76 */ getInt(String key, int def)77 public static int getInt(String key, int def) { 78 if (key.length() > PROP_NAME_MAX) { 79 throw new IllegalArgumentException("key.length > " + PROP_NAME_MAX); 80 } 81 return native_get_int(key, def); 82 } 83 84 /** 85 * Get the value for the given key, and return as a long. 86 * @param key the key to lookup 87 * @param def a default value to return 88 * @return the key parsed as a long, or def if the key isn't found or 89 * cannot be parsed 90 * @throws IllegalArgumentException if the key exceeds 32 characters 91 */ getLong(String key, long def)92 public static long getLong(String key, long def) { 93 if (key.length() > PROP_NAME_MAX) { 94 throw new IllegalArgumentException("key.length > " + PROP_NAME_MAX); 95 } 96 return native_get_long(key, def); 97 } 98 99 /** 100 * Get the value for the given key, returned as a boolean. 101 * Values 'n', 'no', '0', 'false' or 'off' are considered false. 102 * Values 'y', 'yes', '1', 'true' or 'on' are considered true. 103 * (case sensitive). 104 * If the key does not exist, or has any other value, then the default 105 * result is returned. 106 * @param key the key to lookup 107 * @param def a default value to return 108 * @return the key parsed as a boolean, or def if the key isn't found or is 109 * not able to be parsed as a boolean. 110 * @throws IllegalArgumentException if the key exceeds 32 characters 111 */ getBoolean(String key, boolean def)112 public static boolean getBoolean(String key, boolean def) { 113 if (key.length() > PROP_NAME_MAX) { 114 throw new IllegalArgumentException("key.length > " + PROP_NAME_MAX); 115 } 116 return native_get_boolean(key, def); 117 } 118 119 /** 120 * Set the value for the given key. 121 * @throws IllegalArgumentException if the key exceeds 32 characters 122 * @throws IllegalArgumentException if the value exceeds 92 characters 123 */ set(String key, String val)124 public static void set(String key, String val) { 125 if (key.length() > PROP_NAME_MAX) { 126 throw new IllegalArgumentException("key.length > " + PROP_NAME_MAX); 127 } 128 if (val != null && val.length() > PROP_VALUE_MAX) { 129 throw new IllegalArgumentException("val.length > " + 130 PROP_VALUE_MAX); 131 } 132 native_set(key, val); 133 } 134 addChangeCallback(Runnable callback)135 public static void addChangeCallback(Runnable callback) { 136 synchronized (sChangeCallbacks) { 137 if (sChangeCallbacks.size() == 0) { 138 native_add_change_callback(); 139 } 140 sChangeCallbacks.add(callback); 141 } 142 } 143 callChangeCallbacks()144 static void callChangeCallbacks() { 145 synchronized (sChangeCallbacks) { 146 //Log.i("foo", "Calling " + sChangeCallbacks.size() + " change callbacks!"); 147 if (sChangeCallbacks.size() == 0) { 148 return; 149 } 150 ArrayList<Runnable> callbacks = new ArrayList<Runnable>(sChangeCallbacks); 151 for (int i=0; i<callbacks.size(); i++) { 152 callbacks.get(i).run(); 153 } 154 } 155 } 156 } 157