/*
* Copyright (C) 2011-2012 sakuramilk <c.sakuramilk@gmail.com>
*
* 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 net.sakuramilk.TweakGS2.MultiBoot;
import java.util.ArrayList;
import net.sakuramilk.TweakGS2.R;
import net.sakuramilk.util.Misc;
import android.content.Intent;
import android.os.Bundle;
import android.preference.ListPreference;
import android.preference.Preference;
import android.preference.Preference.OnPreferenceChangeListener;
import android.preference.Preference.OnPreferenceClickListener;
import android.preference.PreferenceActivity;
import android.preference.PreferenceCategory;
import android.preference.PreferenceManager;
import android.preference.PreferenceScreen;
public class MultiBootPreferenceActivity extends PreferenceActivity
implements OnPreferenceClickListener, OnPreferenceChangeListener {
private static final int REQUEST_ROM_EDIT = 1001;
private static final int REQUEST_ROM_CREATE = 1002;
private MbsConf mMbsConf = new MbsConf();
private ListPreference mRomSelect;
private ListPreference mDualRomSelect = null;
private ArrayList<ListPreference> mRomSettingList;
private ArrayList<String> mRomIdEntries;
private ArrayList<String> mRomIdEntryValues;
private String getRomIdEntry(String endtryValue) {
for (int i = 0; i < mRomIdEntryValues.size(); i++) {
if (mRomIdEntryValues.get(i).equals(endtryValue)) {
return mRomIdEntries.get(i);
}
}
return mRomIdEntries.get(0); // if not find, return safe value
}
private void createMultiBootPreference() {
PreferenceManager prefManager = getPreferenceManager();
PreferenceScreen rootPref = (PreferenceScreen)prefManager.findPreference(MultiBootSetting.KEY_ROOT_PREF);
rootPref.removeAll();
int nextRomId = mMbsConf.getNextRomId();
if (nextRomId == 0) {
// nothing rom setting, create rom0 and rom1 setting
mMbsConf.setLabel(0, "Primary");
mMbsConf.setSystemPartition(0, MbsConf.Partition.mmcblk0p9);
mMbsConf.setDataPartition(0, MbsConf.Partition.mmcblk0p10);
mMbsConf.setDataPath(0, "/data0");
mMbsConf.setLabel(1, "Secondary");
mMbsConf.setSystemPartition(1, MbsConf.Partition.mmcblk0p11);
mMbsConf.setDataPartition(1, MbsConf.Partition.mmcblk0p10);
mMbsConf.setDataPath(1, "/data1");
mMbsConf.setBootRomId(0);
nextRomId = mMbsConf.getNextRomId();
}
int bootRomId = mMbsConf.getBootRomId();
mRomIdEntries = new ArrayList<String>();
mRomIdEntryValues = new ArrayList<String>();
for (int i = 0; i <= MbsConf.MAX_ROM_ID; i++) {
if (!Misc.isNullOfEmpty(mMbsConf.getSystemPartition(i))) {
mRomIdEntries.add("ROM" + i + ":" + mMbsConf.getLabel(i));
mRomIdEntryValues.add(String.valueOf(i));
}
}
PreferenceCategory categoryPref = new PreferenceCategory(this);
categoryPref.setTitle(R.string.multi_boot_rom_select_category);
rootPref.addPreference(categoryPref);
mRomSelect = new ListPreference(this);
mRomSelect.setTitle(R.string.multi_boot_rom_select_title);
mRomSelect.setEnabled(false);
if (nextRomId > 0) {
mRomSelect.setOnPreferenceChangeListener(this);
mRomSelect.setEntries(mRomIdEntries.toArray(new String[0]));
mRomSelect.setEntryValues(mRomIdEntryValues.toArray(new String[0]));
mRomSelect.setValue(String.valueOf(bootRomId));
mRomSelect.setSummary(getRomIdEntry(String.valueOf(bootRomId)));
mRomSelect.setEnabled(true);
} else {
mRomSelect.setValue("ROM設定がありません");
mRomSelect.setEnabled(false);
}
rootPref.addPreference(mRomSelect);
categoryPref = new PreferenceCategory(this);
categoryPref.setTitle(R.string.multi_boot_rom_setting);
rootPref.addPreference(categoryPref);
mRomSettingList = new ArrayList<ListPreference>();
int i;
for (i = 0; i <= MbsConf.MAX_ROM_ID; i++) {
String sysPart = mMbsConf.getSystemPartition(i);
if (!Misc.isNullOfEmpty(sysPart)) {
ListPreference pref = new ListPreference(this);
String key = MultiBootSetting.KEY_ROM_SETTING_BASE + i;
String label = mMbsConf.getLabel(i);
pref.setKey(key);
pref.setTitle("ROM" + i + " : " + label);
pref.setEntries(R.array.rom_setting_menu_entries);
pref.setEntryValues(R.array.rom_setting_menu_values);
String sysImg = mMbsConf.getSystemImage(i);
String dataPart = mMbsConf.getDataPartition(i);
String dataImg = mMbsConf.getDataImage(i);
String summary =
"SYS_PART:" + sysPart + "\n" +
(!Misc.isNullOfEmpty(sysImg) ? "SYS_IMG:" + sysImg + "\n" : "") +
(!Misc.isNullOfEmpty(dataPart) ? "DATA_PART:" + dataPart + "\n" : "") +
(!Misc.isNullOfEmpty(dataImg) ? " DATA_IMG:" + dataImg : "");
pref.setSummary(summary);
pref.setOnPreferenceChangeListener(this);
rootPref.addPreference(pref);
mRomSettingList.add(pref);
}
}
if (mMbsConf.getNextRomId() != -1) {
PreferenceScreen pref = prefManager.createPreferenceScreen(this);
pref.setKey(MultiBootSetting.KEY_ROM_CREATE);
pref.setTitle("新規ROMの作成");
pref.setOnPreferenceClickListener(this);
rootPref.addPreference(pref);
}
}
private void createDualBootPreference() {
PreferenceManager prefManager = getPreferenceManager();
PreferenceScreen rootPref = (PreferenceScreen)prefManager.findPreference(MultiBootSetting.KEY_ROOT_PREF);
rootPref.removeAll();
BootConf bootConf = new BootConf();
String curRom = bootConf.getBootRom();
mDualRomSelect = new ListPreference(this);
mDualRomSelect.setTitle(R.string.multi_boot_rom_select_title);
mDualRomSelect.setEntries(R.array.dualboot_rom_select_entries);
mDualRomSelect.setEntryValues(R.array.dualboot_rom_select_values);
mDualRomSelect.setValue(curRom);
mDualRomSelect.setSummary(Misc.getCurrentValueText(this, curRom));
mDualRomSelect.setOnPreferenceChangeListener(this);
rootPref.addPreference(mDualRomSelect);
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
addPreferencesFromResource(R.xml.multi_boot_pref);
if (Misc.getBuildTarget() == Misc.BUILD_TARGET_MULTI) {
createMultiBootPreference();
} else {
createDualBootPreference();
}
}
@Override
public boolean onPreferenceClick(Preference preference) {
String key = preference.getKey();
if (key.equals(MultiBootSetting.KEY_ROM_CREATE)) {
Intent intent = new Intent(getApplicationContext(), RomSettingPreferenceActivity.class);
intent.putExtra("rom_id", mMbsConf.getNextRomId());
startActivityForResult(intent, REQUEST_ROM_CREATE);
}
return false;
}
@Override
public boolean onPreferenceChange(Preference preference, Object objValue) {
if (mDualRomSelect != null && preference == mDualRomSelect) {
BootConf bootConf = new BootConf();
bootConf.setBootRom(objValue.toString());
mDualRomSelect.setValue(objValue.toString());
mDualRomSelect.setSummary(Misc.getCurrentValueText(this, objValue.toString()));
// don't return true
} else if (preference == mRomSelect) {
mMbsConf.setBootRomId(Integer.valueOf((String)objValue));
mRomSelect.setSummary(getRomIdEntry((String)objValue));
mRomSelect.setValue((String)objValue);
// don't return true
} else {
int index = mRomSettingList.indexOf(preference);
if (index >= 0) {
ListPreference pref = mRomSettingList.get(index);
int romId = Integer.valueOf(pref.getKey().substring(MultiBootSetting.KEY_ROM_SETTING_BASE.length()));
if ("modify".equals((String)objValue)) {
Intent intent = new Intent(getApplicationContext(), RomSettingPreferenceActivity.class);
intent.putExtra("rom_id", romId);
startActivityForResult(intent, REQUEST_ROM_EDIT);
} else if ("delete".equals((String)objValue)) {
PreferenceManager prefManager = getPreferenceManager();
PreferenceScreen rootPref = (PreferenceScreen)prefManager.findPreference(MultiBootSetting.KEY_ROOT_PREF);
rootPref.removePreference(pref);
mMbsConf.deleteRomId(romId);
}
}
}
return false;
}
@Override
public void onActivityResult(int requestCode, int resultCode, Intent intent) {
super.onActivityResult(requestCode, resultCode, intent);
if (requestCode == REQUEST_ROM_EDIT || requestCode == REQUEST_ROM_CREATE) {
createMultiBootPreference();
}
}
}