/*
* Copyright (C) 2015-2016 Willi Ye <williye97@gmail.com>
*
* This file is part of Kernel Adiutor.
*
* Kernel Adiutor 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.
*
* Kernel Adiutor 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 Kernel Adiutor. If not, see <http://www.gnu.org/licenses/>.
*
*/
package com.grarak.kerneladiutor.fragments.tools;
import android.content.DialogInterface;
import android.content.Intent;
import android.graphics.Color;
import android.graphics.drawable.Drawable;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v4.content.ContextCompat;
import android.support.v4.graphics.drawable.DrawableCompat;
import android.support.v7.view.ContextThemeWrapper;
import android.support.v7.widget.AppCompatCheckBox;
import android.support.v7.widget.PopupMenu;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.widget.LinearLayout;
import com.grarak.kerneladiutor.R;
import com.grarak.kerneladiutor.activities.FilePickerActivity;
import com.grarak.kerneladiutor.fragments.BaseFragment;
import com.grarak.kerneladiutor.fragments.RecyclerViewFragment;
import com.grarak.kerneladiutor.utils.Prefs;
import com.grarak.kerneladiutor.utils.Utils;
import com.grarak.kerneladiutor.utils.ViewUtils;
import com.grarak.kerneladiutor.utils.root.RootFile;
import com.grarak.kerneladiutor.utils.root.RootUtils;
import com.grarak.kerneladiutor.utils.tools.Recovery;
import com.grarak.kerneladiutor.views.dialog.Dialog;
import com.grarak.kerneladiutor.views.recyclerview.CardView;
import com.grarak.kerneladiutor.views.recyclerview.DescriptionView;
import com.grarak.kerneladiutor.views.recyclerview.RecyclerViewItem;
import java.io.File;
import java.util.ArrayList;
import java.util.List;
/**
* Created by willi on 12.07.16.
*/
public class RecoveryFragment extends RecyclerViewFragment {
private Dialog mRebootDialog;
private Dialog mRebootConfirmDialog;
private Dialog mAddDialog;
private Dialog mFlashDialog;
private List<Recovery> mCommands = new ArrayList<>();
@Override
public int getSpanCount() {
return 1;
}
@Override
protected Drawable getTopFabDrawable() {
Drawable drawable = DrawableCompat.wrap(ContextCompat.getDrawable(getActivity(), R.drawable.ic_add));
DrawableCompat.setTint(drawable, Color.WHITE);
return drawable;
}
@Override
protected boolean showTopFab() {
return true;
}
@Override
protected void init() {
super.init();
addViewPagerFragment(OptionsFragment.newInstance(this));
if (mRebootDialog != null) {
mRebootDialog.show();
}
if (mRebootConfirmDialog != null) {
mRebootConfirmDialog.show();
}
if (mAddDialog != null) {
mAddDialog.show();
}
if (mFlashDialog != null) {
mFlashDialog.show();
}
}
@Override
protected void addItems(List<RecyclerViewItem> items) {
}
@Override
protected void onTopFabClick() {
super.onTopFabClick();
add();
}
private void add() {
mAddDialog = new Dialog(getActivity()).setItems(getResources().getStringArray(
R.array.recovery_commands), new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i) {
switch (i) {
case 0:
addAction(Recovery.RECOVERY_COMMAND.WIPE_DATA, null);
break;
case 1:
addAction(Recovery.RECOVERY_COMMAND.WIPE_CACHE, null);
break;
case 2:
Intent intent = new Intent(getActivity(), FilePickerActivity.class);
intent.putExtra(FilePickerActivity.PATH_INTENT, "/sdcard");
intent.putExtra(FilePickerActivity.EXTENSION_INTENT, ".zip");
startActivityForResult(intent, 0);
break;
}
}
}).setOnDismissListener(new DialogInterface.OnDismissListener() {
@Override
public void onDismiss(DialogInterface dialogInterface) {
mAddDialog = null;
}
});
mAddDialog.show();
}
private void addAction(Recovery.RECOVERY_COMMAND recovery_command, String path) {
String summary = null;
switch (recovery_command) {
case WIPE_DATA:
summary = getString(R.string.wipe_data);
break;
case WIPE_CACHE:
summary = getString(R.string.wipe_cache);
break;
case FLASH_ZIP:
summary = new File(path).getName();
break;
}
final Recovery recovery = new Recovery(recovery_command, path == null ? null : new File(path));
mCommands.add(recovery);
CardView cardView = new CardView(getActivity());
cardView.setOnMenuListener(new CardView.OnMenuListener() {
@Override
public void onMenuReady(final CardView cardView, PopupMenu popupMenu) {
popupMenu.getMenu().add(Menu.NONE, 0, Menu.NONE, getString(R.string.delete));
popupMenu.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() {
@Override
public boolean onMenuItemClick(MenuItem item) {
if (item.getItemId() == 0) {
mCommands.remove(recovery);
removeItem(cardView);
}
return false;
}
});
}
});
DescriptionView descriptionView = new DescriptionView();
if (path != null) {
descriptionView.setTitle(getString(R.string.flash_zip));
}
descriptionView.setSummary(summary);
cardView.addItem(descriptionView);
addItem(cardView);
}
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == 0 && data != null) {
addAction(Recovery.RECOVERY_COMMAND.FLASH_ZIP,
data.getStringExtra(FilePickerActivity.RESULT_INTENT));
}
}
private void flashNow(final int recoveryOption) {
mFlashDialog = ViewUtils.dialogBuilder(getString(R.string.flash_now_confirm),
new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i) {
}
}, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i) {
String file = "/cache/recovery/" + mCommands.get(0).getFile(recoveryOption == 1 ?
Recovery.RECOVERY.TWRP : Recovery.RECOVERY.CWM);
RootFile recoveryFile = new RootFile(file);
recoveryFile.delete();
for (Recovery commands : mCommands) {
for (String command : commands.getCommands(recoveryOption == 1 ?
Recovery.RECOVERY.TWRP :
Recovery.RECOVERY.CWM))
recoveryFile.write(command, true);
}
RootUtils.runCommand("reboot recovery");
}
}, new DialogInterface.OnDismissListener() {
@Override
public void onDismiss(DialogInterface dialogInterface) {
mFlashDialog = null;
}
}, getActivity());
mFlashDialog.show();
}
private void reboot() {
mRebootDialog = new Dialog(getActivity()).setItems(getResources()
.getStringArray(R.array.recovery_reboot_options), new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, final int selection) {
mRebootConfirmDialog = ViewUtils.dialogBuilder(getString(R.string.sure_question),
new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
}
}, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
RootUtils.runCommand(getActivity().getResources().getStringArray(
R.array.recovery_reboot_values)[selection]);
}
}, new DialogInterface.OnDismissListener() {
@Override
public void onDismiss(DialogInterface dialog) {
mRebootConfirmDialog = null;
}
}, getActivity());
mRebootConfirmDialog.show();
}
}).setOnDismissListener(new DialogInterface.OnDismissListener() {
@Override
public void onDismiss(DialogInterface dialog) {
mRebootDialog = null;
}
});
mRebootDialog.show();
}
public static class OptionsFragment extends BaseFragment {
public static OptionsFragment newInstance(RecoveryFragment recoveryFragment) {
OptionsFragment fragment = new OptionsFragment();
fragment.mRecoveryFragment = recoveryFragment;
return fragment;
}
private RecoveryFragment mRecoveryFragment;
private int mRecoveryOption;
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container,
@Nullable Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout.fragment_recovery_options, container, false);
mRecoveryOption = Prefs.getInt("recovery_option", 0, getActivity());
LinearLayout layout = (LinearLayout) rootView.findViewById(R.id.layout);
String[] options = getResources().getStringArray(R.array.recovery_options);
final List<AppCompatCheckBox> checkBoxes = new ArrayList<>();
for (int i = 0; i < options.length; i++) {
AppCompatCheckBox checkBox = new AppCompatCheckBox(
new ContextThemeWrapper(getActivity(),
R.style.Base_Widget_AppCompat_CompoundButton_CheckBox_Custom), null, 0);
checkBox.setText(options[i]);
checkBox.setTextColor(Color.WHITE);
checkBox.setChecked(i == mRecoveryOption);
checkBox.setLayoutParams(new LinearLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT,
ViewGroup.LayoutParams.WRAP_CONTENT));
final int position = i;
checkBox.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
for (int i = 0; i < checkBoxes.size(); i++) {
checkBoxes.get(i).setChecked(position == i);
}
Prefs.saveInt("recovery_option", position, getActivity());
mRecoveryOption = position;
}
});
checkBoxes.add(checkBox);
layout.addView(checkBox);
}
rootView.findViewById(R.id.button).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
if (mRecoveryFragment != null && mRecoveryFragment.itemsSize() > 0) {
mRecoveryFragment.flashNow(mRecoveryOption);
} else {
Utils.toast(R.string.add_action_first, getActivity());
}
}
});
rootView.findViewById(R.id.reboot_button).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (mRecoveryFragment != null) {
mRecoveryFragment.reboot();
}
}
});
return rootView;
}
}
@Override
public void onDestroy() {
super.onDestroy();
mCommands.clear();
}
}