/* * Copyright (C) 2013 - 2014 Alexander "Evisceration" Martinz * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. * */ package org.namelessrom.devicecontrol.preferences; import android.content.Context; import android.content.res.Resources; import android.content.res.TypedArray; import android.text.TextUtils; import android.util.AttributeSet; import org.namelessrom.devicecontrol.R; import org.namelessrom.devicecontrol.models.BootupConfig; import org.namelessrom.devicecontrol.modules.bootup.BootupItem; import org.namelessrom.devicecontrol.utils.Utils; import alexander.martinz.libs.materialpreferences.MaterialEditTextPreference; import alexander.martinz.libs.materialpreferences.MaterialPreference; /** * Automatically handles reading to files to automatically set the value, * writing to files on preference change, even with multiple files, * handling bootup restoration. */ public class AutoEditTextPreference extends MaterialEditTextPreference { private boolean mStartup = true; private boolean mMultiFile = false; private String mPath; private String[] mPaths; private String mCategory = BootupConfig.CATEGORY_EXTRAS; public AutoEditTextPreference(Context context) { super(context); } public AutoEditTextPreference(Context context, AttributeSet attrs) { super(context, attrs); } public AutoEditTextPreference(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); } @Override public boolean init(final Context context, final AttributeSet attrs) { if (!super.init(context, attrs)) { return false; } final TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.AwesomePreference); int filePath = -1, filePathList = -1; if (a != null) { filePath = a.getResourceId(R.styleable.AwesomePreference_filePath, -1); filePathList = a.getResourceId(R.styleable.AwesomePreference_filePathList, -1); mStartup = a.getBoolean(R.styleable.AwesomePreference_startup, mStartup); mMultiFile = a.getBoolean(R.styleable.AwesomePreference_multifile, mMultiFile); a.recycle(); } final Resources res = context.getResources(); if (filePath != -1) { mPath = Utils.checkPath(res.getString(filePath)); mPaths = null; } else if (filePathList != -1) { mPaths = res.getStringArray(filePathList); mPath = Utils.checkPaths(mPaths); if (mPath.isEmpty() || !mMultiFile) { mPaths = null; } } else { mPath = ""; mPaths = null; } handleSelf(true); return true; } public void initValue() { if (isSupported()) { final String value = Utils.readOneLine(mPath); setValue(value); } } public void setCategory(String category) { mCategory = category; } public String getCategory() { return mCategory; } public String getPath() { return mPath; } public boolean isSupported() { return ((mPath != null && !mPath.isEmpty()) || (mPaths != null && mPaths.length != 0)); } public void setPath(String path) { path = Utils.checkPath(path); if (!TextUtils.isEmpty(path)) { mPath = path; mPaths = null; } } public void setPaths(String[] paths) { String path = Utils.checkPaths(paths); if (!TextUtils.isEmpty(path)) { mPath = path; if (mPath.isEmpty() || !mMultiFile) { mPaths = null; } else { mPaths = paths; } } } public void setMultiFile(boolean isMultiFile) { mMultiFile = isMultiFile; } public void setStartup(boolean isStartup) { mStartup = isStartup; } public void writeValue(final String value) { if (!isSupported()) { return; } if (mPaths != null && mMultiFile) { final int length = mPaths.length; for (int i = 0; i < length; i++) { Utils.writeValue(mPaths[i], value); if (mStartup) { BootupConfig.setBootup(new BootupItem( mCategory, getKey() + String.valueOf(i), mPaths[i], value, true)); } } } else { Utils.writeValue(mPath, value); if (mStartup) { BootupConfig.setBootup( new BootupItem(mCategory, getKey(), mPath, value, true)); } } postDelayed(new Runnable() { @Override public void run() { initValue(); } }, 200); } public void handleSelf(boolean handleSelf) { MaterialPreferenceChangeListener listener = null; if (handleSelf) { listener = new MaterialPreferenceChangeListener() { @Override public boolean onPreferenceChanged(MaterialPreference pref, Object o) { writeValue(String.valueOf(o)); return true; } }; } setOnPreferenceChangeListener(listener); } }