package net.sakuramilk.TweakGS2.MultiBoot; import net.sakuramilk.TweakGS2.R; import net.sakuramilk.util.Misc; import net.sakuramilk.util.SystemCommand; import net.sakuramilk.widget.ApplyButtonPreferenceActivity; import net.sakuramilk.widget.TextInputDialog; import android.app.AlertDialog; import android.app.ProgressDialog; import android.content.Context; import android.content.DialogInterface; import android.content.Intent; import android.os.Bundle; import android.os.Handler; import android.os.Message; import android.os.PowerManager; import android.os.PowerManager.WakeLock; import android.preference.ListPreference; import android.preference.Preference; import android.preference.Preference.OnPreferenceChangeListener; import android.preference.Preference.OnPreferenceClickListener; import android.preference.PreferenceScreen; import android.view.View; import android.view.View.OnClickListener; import android.widget.Toast; public class ImageCreatePreferenceActivity extends ApplyButtonPreferenceActivity implements OnPreferenceClickListener, OnClickListener, OnPreferenceChangeListener { private static final String TMP_MOUNT_DIR = "/data/TweakGS2/mnt/tmp"; private static final int REQUEST_IMG_DIR = 1000; private PreferenceScreen mDstDirPref; private PreferenceScreen mDstFilePref; private ListPreference mImageSizePref; private String mDstDir = null; private String mDstFile = null; private String mImageSize = null; private Context mContext; private String mDevicePath; private String mRootPath; private boolean mNeedUnmount = false; private WakeLock mWakeLock; private ProgressDialog mProgressDialog; Handler mCreateImageFinishHandler = new Handler() { @Override public void handleMessage(Message msg) { mProgressDialog.dismiss(); mWakeLock.release(); final AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(mContext); alertDialogBuilder.setTitle("情報"); alertDialogBuilder.setMessage("イメージの作成が完了しました"); alertDialogBuilder.setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { Intent intent = new Intent(); String path = mDstDir + "/" + mDstFile; path = path.replace("//", "/"); intent.putExtra("path", path); setResult(RESULT_OK, intent); finish(); } }); alertDialogBuilder.show(); } }; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); addPreferencesFromResource(R.xml.image_create_pref); mContext = this; Intent intent = getIntent(); String target = intent.getStringExtra("target"); mDevicePath = intent.getStringExtra("device_path"); String path; if (MbsConf.Partition.mmcblk0p11.equals(mDevicePath)) { path = Misc.getSdcardPath(true); } else if (MbsConf.Partition.mmcblk1p1.equals(mDevicePath)) { path = Misc.getSdcardPath(false); } else { path = TMP_MOUNT_DIR; } mRootPath = path; mDstDirPref = (PreferenceScreen)findPreference("dst_dir"); mDstDirPref.setOnPreferenceClickListener(this); mDstDir = "/"; mDstDirPref.setSummary(Misc.getCurrentValueText(this, mDstDir)); mDstFilePref = (PreferenceScreen)findPreference("dst_file"); mDstFilePref.setOnPreferenceClickListener(this); mImageSizePref = (ListPreference)findPreference("img_size"); mImageSizePref.setOnPreferenceChangeListener(this); if ("system".equals(target)) { mImageSizePref.setEntries(R.array.system_image_size_entries); mImageSizePref.setEntryValues(R.array.system_image_size_values); } else { mImageSizePref.setEntries(R.array.data_image_size_entries); mImageSizePref.setEntryValues(R.array.data_image_size_values); } mApplyButton.setOnClickListener(this); mApplyButton.setText(R.string.create); mApplyButton.setEnabled(false); } @Override public boolean onPreferenceClick(Preference preference) { if (preference == mDstDirPref) { if (!MbsConf.Partition.mmcblk0p12.equals(mDevicePath) && !MbsConf.Partition.mmcblk1p1.equals(mDevicePath)) { SystemCommand.umount(TMP_MOUNT_DIR); SystemCommand.mount(mDevicePath, TMP_MOUNT_DIR, null, null); mNeedUnmount = true; } Intent intent = new Intent(getApplicationContext(), FileSelectActivity.class); intent.putExtra("title", getText(R.string.select_dir_title)); intent.putExtra("path", mRootPath); intent.putExtra("chroot", mRootPath); intent.putExtra("select", "dir"); this.startActivityForResult(intent, REQUEST_IMG_DIR); } else if (preference == mDstFilePref) { TextInputDialog dlg = new TextInputDialog(this); dlg.setFinishTextInputListener(new TextInputDialog.FinishTextInputListener() { @Override public void onFinishTextInput(CharSequence input) { String inputText = input.toString(); inputText = inputText.replace("\n", "").trim(); int index = inputText.lastIndexOf(".img"); int imgExtPos = inputText.length() - ".img".length(); if (index == -1 || index != imgExtPos) { inputText += ".img"; } mDstFile = inputText; mDstFilePref.setSummary((Misc.getCurrentValueText(mContext, inputText))); if (mDstDir != null && mDstFile != null && mImageSize != null) { mApplyButton.setEnabled(true); } } }); dlg.show(R.string.rom_label_title, R.string.rom_label_message, mDstFile == null ? ".img" : mDstFile); } return false; } @Override public boolean onPreferenceChange(Preference preference, Object objValue) { if (preference == mImageSizePref) { String path; if (MbsConf.Partition.mmcblk0p12.equals(mDevicePath)) { path = Misc.getSdcardPath(true); } else if (MbsConf.Partition.mmcblk1p1.equals(mDevicePath)) { path = Misc.getSdcardPath(false); } else { path = TMP_MOUNT_DIR; SystemCommand.umount(TMP_MOUNT_DIR); SystemCommand.mount(mDevicePath, TMP_MOUNT_DIR, null, null); } long availableSize = Misc.getAvailableSize(path); long size = Integer.valueOf((String)objValue) * 1024; SystemCommand.umount(TMP_MOUNT_DIR); if (availableSize <= size) { Toast.makeText(this, "空き容量が足りません", Toast.LENGTH_SHORT).show(); } else { mImageSize = (String)objValue; mImageSizePref.setValue((String)objValue); mImageSizePref.setSummary(Misc.getCurrentValueText(this, Misc.getEntryFromEntryValue(mImageSizePref.getEntries(), mImageSizePref.getEntryValues(), (String)objValue))); if (mDstDir != null && mDstFile != null && mImageSize != null) { mApplyButton.setEnabled(true); } } } return false; } @Override public void onClick(View v) { PowerManager pm = (PowerManager)getSystemService(Context.POWER_SERVICE); mWakeLock = pm.newWakeLock(PowerManager.SCREEN_DIM_WAKE_LOCK, "Tgs2ImageCreate"); mWakeLock.acquire(); mProgressDialog = new ProgressDialog(this); mProgressDialog.setProgressStyle(ProgressDialog.STYLE_SPINNER); mProgressDialog.setTitle("情報"); mProgressDialog.setMessage("イメージを作成しています\nこの操作は数分かかる場合があります"); mProgressDialog.show(); Thread thread = new Thread(new Runnable() { @Override public void run() { int size = Integer.valueOf(mImageSize) * 1024; String path = mRootPath + mDstDir + "/" + mDstFile; SystemCommand.make_ext4_image(path, 1024, size); mCreateImageFinishHandler.sendEmptyMessage(0); } }); thread.start(); } @Override public void onActivityResult(int requestCode, int resultCode, Intent intent) { super.onActivityResult(requestCode, resultCode, intent); if (resultCode == RESULT_OK) { if (requestCode == REQUEST_IMG_DIR) { if (mNeedUnmount) { mNeedUnmount = false; SystemCommand.umount(TMP_MOUNT_DIR); } String path = intent.getStringExtra("path"); mDstDir = path; mDstDirPref.setSummary(Misc.getCurrentValueText(this, path)); if (mDstDir != null && mDstFile != null && mImageSize != null) { mApplyButton.setEnabled(true); } } } } }