package com.dsht.kerneltweaker;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.concurrent.TimeoutException;
import com.dsht.glossary.CpuGlossaryFragment;
import com.dsht.glossary.GpuGlossaryFragment;
import com.dsht.glossary.KernelGlossaryFragment;
import com.dsht.glossary.LmkGlossaryFragment;
import com.dsht.glossary.UvGlossaryFragment;
import com.dsht.glossary.VmGlossaryFragment;
import com.dsht.kerneltweaker.database.DatabaseHandler;
import com.dsht.kerneltweaker.database.VddDatabaseHandler;
import com.dsht.kerneltweaker.fragments.BackupFragment;
import com.dsht.kerneltweaker.fragments.CpuPreferenceFragment;
import com.dsht.kerneltweaker.fragments.CustomRecoveryCommandFragment;
import com.dsht.kerneltweaker.fragments.FileManagerFragment;
import com.dsht.kerneltweaker.fragments.GpuPreferenceFragment;
import com.dsht.kerneltweaker.fragments.InitD;
import com.dsht.kerneltweaker.fragments.KernelPreferenceFragment;
import com.dsht.kerneltweaker.fragments.LowMemoryKillerFragment;
import com.dsht.kerneltweaker.fragments.PropModder;
import com.dsht.kerneltweaker.fragments.ReviewBootPreferenceFragment;
import com.dsht.kerneltweaker.fragments.UvPreferenceFragment;
import com.dsht.kerneltweaker.fragments.WallpaperEffectsFragment;
import com.dsht.open.CPUInfo;
import com.dsht.open.TimeInState;
import com.dsht.open.VM;
import com.dsht.settings.SettingsFragment;
import com.dsht.settings.infos;
import com.google.analytics.tracking.android.EasyTracker;
import com.jeremyfeinstein.slidingmenu.lib.SlidingMenu;
import com.stericson.RootTools.RootTools;
import com.stericson.RootTools.exceptions.RootDeniedException;
import com.stericson.RootTools.execution.CommandCapture;
import android.os.Bundle;
import android.preference.PreferenceManager;
import android.app.Activity;
import android.app.AlertDialog;
import android.app.AlertDialog.Builder;
import android.app.Fragment;
import android.app.FragmentManager;
import android.support.v4.app.FragmentActivity;
import android.text.Html;
import android.app.FragmentTransaction;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.SharedPreferences;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager.NameNotFoundException;
import android.graphics.Color;
import android.graphics.drawable.ColorDrawable;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.FrameLayout;
import android.widget.ListView;
public class MainActivity extends FragmentActivity implements OnItemClickListener {
private static FrameLayout mContainer;
public static SlidingMenu menu;
private String[] colors;
public static DatabaseHandler db;
public static VddDatabaseHandler vddDb;
public static Context mContext;
public static SharedPreferences mPrefs;
public static ListView menulist;
private static FrameLayout mGlossaryContainer;
public static CustomArrayAdapter mAdapter;
public static final int[] icons = {
0,
R.drawable.meter,
R.drawable.bar_chart,
0,
R.drawable.flash_on,
R.drawable.lcd,
R.drawable.plus_minus,
0,
R.drawable.beaker,
R.drawable.life_guard,
R.drawable.settings_two,
0,
R.drawable.heart,
0,
R.drawable.doc_zip,
R.drawable.backup,
R.drawable.radiation,
0,
R.drawable.doc,
R.drawable.magic_wand,
R.drawable.eye,
0,
R.drawable.settings_one,
R.drawable.info
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main_container);
RootTools.debugMode = false;
boolean access = RootTools.isAccessGiven();
boolean busybox = RootTools.isBusyboxAvailable();
if(!access) {
showRootWarning();
}
if(!busybox) {
showBusyBoxWarning();
}
mContainer = (FrameLayout) findViewById(R.id.activity_container);
mContext = this;
mPrefs = PreferenceManager.getDefaultSharedPreferences(this);
getActionBar().setDisplayHomeAsUpEnabled(true);
getActionBar().setHomeButtonEnabled(true);
View v = this.getLayoutInflater().inflate(R.layout.menu_list, null, false);
menulist = (ListView) v.findViewById(R.id.navbarlist);
db = new DatabaseHandler(this);
vddDb = new VddDatabaseHandler(this);
menu = new SlidingMenu(this);
menu.setMode(SlidingMenu.LEFT_RIGHT);
menu.setTouchModeAbove(SlidingMenu.TOUCHMODE_FULLSCREEN);
menu.setShadowWidthRes(R.dimen.shadow_width);
menu.setShadowDrawable(R.drawable.shadow);
//menu.setBehindOffsetRes(R.dimen.slidingmenu_offset);
menu.setBehindWidthRes(R.dimen.slidingmenu_offset);
menu.setFadeDegree(0.35f);
menu.attachToActivity(this, SlidingMenu.SLIDING_CONTENT);
menu.setMenu(v);
View vv = this.getLayoutInflater().inflate(R.layout.menu_glossary, null, false);
mGlossaryContainer = (FrameLayout) vv.findViewById(R.id.menu_frame);
menu.setSecondaryMenu(vv);
menu.setSecondaryShadowDrawable(R.drawable.shadow_right);
mAdapter = new CustomArrayAdapter(
this,
R.layout.menu_main_list_item,
getResources().getStringArray(R.array.menu_entries),
getResources().getStringArray(R.array.menu_descs),
getResources().getStringArray(R.array.menu_colors),
icons);
menulist.setAdapter(mAdapter);
menulist.setChoiceMode(ListView.CHOICE_MODE_SINGLE);
menulist.setOnItemClickListener(this);
colors = getResources().getStringArray(R.array.menu_colors);
FragmentTransaction ft = getFragmentManager().beginTransaction();
Fragment prefs = new TimeInState();
CpuGlossaryFragment glo = new CpuGlossaryFragment();
ft.replace(R.id.activity_container,prefs);
ft.replace(R.id.menu_frame, glo);
ft.commit();
setAppTheme();
mountPartitions();
copyHelpers();
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.menu_main_container, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch(item.getItemId()) {
case android.R.id.home:
menu.toggle(true);
break;
case R.id.help:
if(menu.isSecondaryMenuShowing()) {
menu.toggle(true);
} else {
menu.showSecondaryMenu(true);
}
break;
}
return false;
}
@Override
public void onStart() {
super.onStart();
EasyTracker.getInstance(this).activityStart(this); // Add this method.
}
@Override
public void onStop() {
super.onStop();
EasyTracker.getInstance(this).activityStop(this); // Add this method.
}
@Override
public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) {
// TODO Auto-generated method stub
Fragment f = null;
Fragment glo = null;
switch(arg2) {
case 1:
f = new TimeInState();
glo = new CpuGlossaryFragment();
break;
case 2:
f = new CPUInfo();
glo = new CpuGlossaryFragment();
break;
case 4:
f = new CpuPreferenceFragment();
glo = new CpuGlossaryFragment();
break;
case 5:
f = new GpuPreferenceFragment();
glo = new GpuGlossaryFragment();
break;
case 6:
f = new UvPreferenceFragment();
glo = new UvGlossaryFragment();
break;
case 8:
f = new KernelPreferenceFragment();
glo = new KernelGlossaryFragment();
break;
case 9:
f = new LowMemoryKillerFragment();
glo = new LmkGlossaryFragment();
break;
case 10:
f = new VM();
glo = new VmGlossaryFragment();
break;
case 12:
f = new ReviewBootPreferenceFragment();
glo = new CpuGlossaryFragment();
break;
case 14:
f = new FileManagerFragment();
glo = new CpuGlossaryFragment();
break;
case 15:
f = new BackupFragment();
glo = new CpuGlossaryFragment();
break;
case 16:
f = new CustomRecoveryCommandFragment();
glo = new CpuGlossaryFragment();
break;
case 18:
f = new PropModder();
glo = new CpuGlossaryFragment();
break;
case 19:
f = new InitD();
glo = new CpuGlossaryFragment();
break;
case 20:
f = new WallpaperEffectsFragment();
glo = new CpuGlossaryFragment();
break;
case 22:
f = new SettingsFragment();
glo = new CpuGlossaryFragment();
break;
case 23:
f = new infos();
glo = new CpuGlossaryFragment();
//showCredits();
break;
}
FragmentTransaction ft = getFragmentManager().beginTransaction();
// This adds the newly created Preference fragment to my main layout, shown below
ft.replace(R.id.activity_container,f);
ft.replace(R.id.menu_frame, glo);
// By hiding the main fragment, transparency isn't an issue
ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN);
ft.addToBackStack("TAG");
ft.commit();
//menu.toggle(true);
}
@Override
public void onBackPressed(){
FragmentManager fm = getFragmentManager();
if (fm.getBackStackEntryCount() > 0) {
Log.i("MainActivity", "popping backstack");
fm.popBackStack();
} else {
Log.i("MainActivity", "nothing on backstack, calling super");
super.onBackPressed();
}
}
public void showRootWarning() {
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setTitle(getResources().getString(R.string.rc_title));
builder.setMessage(getResources().getString(R.string.rc_desc));
builder.setPositiveButton("ok", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
// TODO Auto-generated method stub
dialog.cancel();
MainActivity.this.finish();
}
});
builder.create().show();
}
public void showBusyBoxWarning() {
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setTitle(getResources().getString(R.string.bb_title));
builder.setMessage(getResources().getString(R.string.bb_desc));
builder.setPositiveButton("ok", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
// TODO Auto-generated method stub
dialog.cancel();
MainActivity.this.finish();
}
});
builder.create().show();
}
public void showCredits() {
PackageInfo pInfo = null;
try {
pInfo = getPackageManager().getPackageInfo(getPackageName(), 0);
} catch (NameNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
String version = pInfo.versionName;
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setTitle(getResources().getString(R.string.app_name) + " V: "+version);
builder.setIcon(R.drawable.ic_launcher);
builder.setMessage(Html.fromHtml("<p>"+
"Some <strong>KernelTweaker</strong> classes and xmls are based on OpenSource projects:</p>"+
"<br><p><strong>AOKP</strong> : <a href=\"https://github.com/AOKP\">https://github.com/AOKP</a><br />"+
"<strong>OMNI</strong>: <a href=\"https://github.com/omnirom/\">https://github.com/omnirom/</a><br />"+
"<strong>Root-Tools </strong>: <a href=\"https://code.google.com/p/roottools/\">https://code.google.com/p/roottools/</a><br />"+
"<strong>SlidingMenu by jfeinstein10 </strong>: <a href=\"https://github.com/jfeinstein10/SlidingMenu\">https://github.com/jfeinstein10/SlidingMenu</a></p>"+
"<p>"+
"<u>A HUGE thanks goes to these guys, who makes Android better every day. A lot of thanks also to all our kernel developers, without their work this application has no reason to exist!</u></p>"));
builder.setPositiveButton("OK", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
// TODO Auto-generated method stub
dialog.cancel();
}
});
builder.create().show();
}
private void mountPartitions() {
CommandCapture command = new CommandCapture(0, "busybox mount -o rw,remount /sys");
try {
RootTools.getShell(true).add(command);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (TimeoutException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (RootDeniedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public static void setAppTheme() {
boolean light = mPrefs.getBoolean(SettingsFragment.KEY_THEME, false);
if(light) {
mContext.setTheme(R.style.AppLight);
menu.setBackground(mContext.getResources().getDrawable(R.drawable.bg_menu_light));
mContainer.setBackground(mContext.getResources().getDrawable(R.drawable.bg_light));
mGlossaryContainer.setBackground(mContext.getResources().getDrawable(R.drawable.bg_menu_light));
menulist.setDivider(new ColorDrawable(Color.parseColor("#bbbbbb")));
menulist.setDividerHeight(2);
}else {
mContext.setTheme(R.style.AppTheme);
menu.setBackground(mContext.getResources().getDrawable(R.drawable.bg_menu_dark));;
mContainer.setBackground(mContext.getResources().getDrawable(R.drawable.bg_dark));
mGlossaryContainer.setBackground(mContext.getResources().getDrawable(R.drawable.bg_menu_dark));
}
}
private void copyHelpers() {
if(!new File(this.getFilesDir().getPath()+"/helpers.sh").exists()) {
InputStream stream = null;
OutputStream output = null;
try {
stream = this.getAssets().open("helpers.sh");
output = new BufferedOutputStream(new FileOutputStream(this.getFilesDir() + "/helpers.sh"));
byte data[] = new byte[1024];
int count;
while((count = stream.read(data)) != -1)
{
output.write(data, 0, count);
}
output.flush();
output.close();
stream.close();
stream = null;
output = null;
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}