/*
PreferenceUtil.java
Copyright (c) 2016 NTT DOCOMO,INC.
Released under the MIT license
http://opensource.org/licenses/mit-license.php
*/
package org.deviceconnect.android.deviceplugin.linking.util;
import android.content.Context;
import android.content.SharedPreferences;
import android.content.SharedPreferences.Editor;
import android.preference.PreferenceManager;
import org.json.JSONException;
import org.json.JSONObject;
import java.util.HashMap;
import java.util.Map;
/**
* PreferenceManagerのユーティリティー.
*/
public final class PreferenceUtil {
private static final String PREF_LED_ON_COLOR_SETTING = "pref_ledOnColorSetting";
private static final String PREF_LED_ON_PATTERN_SETTING = "pref_ledOnPatternSetting";
private static final String PREF_LED_OFF_SETTING = "pref_lightOffSetting";
private static final String PREF_VIB_ON_SETTING = "pref_vibrationOnSetting";
private static final String PREF_VIB_OFF_SETTING = "pref_vibrationOffSetting";
private static final String PREF_BEACON_SCAN_STATUS = "forceBeaconScanStatus";
private static final String PREF_BEACON_SCAN_MODE = "beaconScanMode";
private static PreferenceUtil mInstance;
private SharedPreferences mPreferences;
private PreferenceUtil(final Context context) {
mPreferences = PreferenceManager.getDefaultSharedPreferences(context);
}
public static PreferenceUtil getInstance(final Context context) {
if (mInstance == null) {
mInstance = new PreferenceUtil(context);
}
return mInstance;
}
public Integer getVibrationOnSetting(final String address) {
Map<String, Integer> map = getVibrationOnSetting();
return map == null ? null : map.get(address);
}
public void setVibrationOnSetting(final String address, final Integer id) {
Map<String, Integer> map = getVibrationOnSetting();
if (map == null) {
return;
}
map.put(address, id);
putValue(PREF_VIB_ON_SETTING, new JSONObject(map).toString());
}
public Integer getVibrationOffSetting(final String address) {
Map<String, Integer> map = getVibrationOffSetting();
return map == null ? null : map.get(address);
}
public void setVibrationOffSetting(final String address, final Integer id) {
Map<String, Integer> map = getVibrationOffSetting();
if (map == null) {
return;
}
map.put(address, id);
putValue(PREF_VIB_OFF_SETTING, new JSONObject(map).toString());
}
public Integer getLEDColorSetting(final String address) {
Map<String, Integer> map = getLEDColorSetting();
return map == null ? null : map.get(address);
}
public void setLEDColorSetting(final String address, final Integer id) {
Map<String, Integer> map = getLEDColorSetting();
if (map == null) {
return;
}
map.put(address, id);
putValue(PREF_LED_ON_COLOR_SETTING, new JSONObject(map).toString());
}
public Integer getLEDPatternSetting(final String address) {
Map<String, Integer> map = getLEDPatternSetting();
return map == null ? null : map.get(address);
}
public void setLEDPatternSetting(final String address, final Integer id) {
Map<String, Integer> map = getLEDPatternSetting();
if (map == null) {
return;
}
map.put(address, id);
putValue(PREF_LED_ON_PATTERN_SETTING, new JSONObject(map).toString());
}
public Integer getLEDOffSetting(final String address) {
Map<String, Integer> map = getLightOffSetting();
return map == null ? null : map.get(address);
}
public void setLightOffSetting(final String address, final Integer id) {
Map<String, Integer> map = getLightOffSetting();
if (map == null) {
return;
}
map.put(address, id);
putValue(PREF_LED_OFF_SETTING, new JSONObject(map).toString());
}
public void setForceBeaconScanStatus(final boolean status) {
putValue(PREF_BEACON_SCAN_STATUS, status);
}
public boolean getForceBeaconScanStatus() {
return mPreferences.getBoolean(PREF_BEACON_SCAN_STATUS, false);
}
public void setBeaconScanMode(final int mode) {
putValue(PREF_BEACON_SCAN_MODE, mode);
}
public int getBeaconScanMode() {
return mPreferences.getInt(PREF_BEACON_SCAN_MODE, 0);
}
private Map<String, Integer> getLEDColorSetting() {
return getSetting(PREF_LED_ON_COLOR_SETTING);
}
private Map<String, Integer> getLEDPatternSetting() {
return getSetting(PREF_LED_ON_PATTERN_SETTING);
}
private Map<String, Integer> getVibrationOnSetting() {
return getSetting(PREF_VIB_ON_SETTING);
}
private Map<String, Integer> getVibrationOffSetting() {
return getSetting(PREF_VIB_OFF_SETTING);
}
private Map<String, Integer> getLightOffSetting() {
return getSetting(PREF_LED_OFF_SETTING);
}
private Map<String, Integer> getSetting(final String pref) {
String jsonString = mPreferences.getString(pref, null);
if (jsonString == null) {
return new HashMap<>();
}
try {
JSONObject obj = new JSONObject(jsonString);
Map<String, Integer> newMap = new HashMap<>();
for (Map.Entry<String, Object> entry : JsonUtil.toMap(obj).entrySet()) {
try {
newMap.put(entry.getKey(), (Integer) entry.getValue());
} catch (ClassCastException cce) {
return null;
}
}
return newMap;
} catch (JSONException e) {
return null;
}
}
private void putValue(final String key, final Object value) {
if (value == null) {
throw new IllegalArgumentException();
}
Editor editor = mPreferences.edit();
if (value instanceof Integer) {
editor.putInt(key, (Integer) value);
} else if (value instanceof Boolean) {
editor.putBoolean(key, (Boolean) value);
} else if (value instanceof String) {
editor.putString(key, (String) value);
} else if (value instanceof Long) {
editor.putLong(key, (Long) value);
} else {
throw new IllegalArgumentException();
}
editor.apply();
}
}