package com.aero.control;
import android.app.ActionBar;
import android.app.Activity;
import android.app.ActivityManager;
import android.app.AlertDialog;
import android.app.Fragment;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.pm.ActivityInfo;
import android.content.res.Configuration;
import android.graphics.Typeface;
import android.os.Build;
import android.os.Bundle;
import android.os.Handler;
import android.os.Looper;
import android.support.v4.view.GravityCompat;
import android.support.v4.widget.DrawerLayout;
import android.util.TypedValue;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewConfiguration;
import android.view.ViewGroup;
import android.view.Window;
import android.view.WindowManager;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.FrameLayout;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;
import com.aero.control.fragments.AeroFragment;
import com.aero.control.fragments.AppMonitorFragment;
import com.aero.control.fragments.CPUFragment;
import com.aero.control.fragments.DefyPartsFragment;
import com.aero.control.fragments.GPUFragment;
import com.aero.control.fragments.MemoryFragment;
import com.aero.control.fragments.MiscSettingsFragment;
import com.aero.control.fragments.ProfileFragment;
import com.aero.control.fragments.StatisticsFragment;
import com.aero.control.fragments.UpdaterFragment;
import com.aero.control.helpers.GenericHelper;
import com.aero.control.helpers.PerApp.AppMonitor.JobManager;
import com.aero.control.helpers.Util;
import com.aero.control.helpers.rootHelper;
import com.aero.control.helpers.shellHelper;
import com.aero.control.navItems.NavBarItems;
import com.aero.control.navItems.NavBarItems.PreferenceItem;
import com.aero.control.service.PerAppService;
import com.aero.control.service.PerAppServiceHelper;
import com.aero.control.settings.PrefsActivity;
import com.aero.control.testsuite.TestSuiteFragment;
import com.ikimuhendis.ldrawer.ActionBarDrawerToggle;
import com.ikimuhendis.ldrawer.DrawerArrowDrawable;
import java.util.ArrayList;
import java.util.Stack;
public final class AeroActivity extends Activity {
private static final String SELECTED_ITEM = "SelectedItem";
private DrawerLayout mDrawerLayout;
private ListView mDrawerList;
private ActionBarDrawerToggle mDrawerToggle;
private ItemAdapter mAdapter;
public static Stack<Fragment> mFragmentStack;
private DrawerArrowDrawable mDrawerArrow;
private CharSequence mTitle;
private String[] mAeroTitle;
private int mPreviousTitle;
private static int mBackCounter = 0;
// Fragment Keys;
private static final int OVERVIEW = 0;
private static final int CPU = 1;
private static final int STATISTICS = 2;
private static final int GPU = 3;
private static final int MEMORY = 4;
private static final int MISC = 5;
private static final int DEFY = 6;
private static final int UPDATER = 7;
private static final int PROFILE = 8;
private static final int APPSTATISTICS = 9;
private static final int TESTSUITE = 10;
// Fragments;
private AeroFragment mAeroFragment;
private CPUFragment mCPUFragement;
private GPUFragment mGPUFragement;
private DefyPartsFragment mDefyPartsFragment;
private MemoryFragment mMemoryFragment;
private UpdaterFragment mUpdaterFragement;
private ProfileFragment mProfileFragment;
private StatisticsFragment mStatisticsFragment;
private MiscSettingsFragment mMiscSettingsFragment;
private AppMonitorFragment mAppStatisticsFragment;
private TestSuiteFragment mTestSuiteFragment;
public static final Handler mHandler = new Handler(Looper.getMainLooper());
public static final Typeface font = Typeface.create("sans-serif-condensed", Typeface.NORMAL);
public int mActionBarTitleID;
public TextView mActionBarTitle;
private ActionBar mActionBar;
public static final shellHelper shell = shellHelper.instance();
public static PerAppServiceHelper perAppService;
public static GenericHelper genHelper = new GenericHelper();
public static JobManager mJobManager;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
if(getResources().getBoolean(R.bool.portrait_only)){
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
}
mJobManager = JobManager.instance(AeroActivity.this);
int actionBarHeight = 0;
if (getActionBar() != null) {
getActionBar().setIcon(android.R.color.transparent);
}
mFragmentStack = new Stack<Fragment>();
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT &&
!(ViewConfiguration.get(getBaseContext()).hasPermanentMenuKey())) {
Window win = getWindow();
WindowManager.LayoutParams winParams = win.getAttributes();
final int bits = WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION;
winParams.flags |= bits;
win.setAttributes(winParams);
TypedValue tv = new TypedValue();
if (getTheme().resolveAttribute(android.R.attr.actionBarSize, tv, true)) {
actionBarHeight = TypedValue.complexToDimensionPixelSize(tv.data,getResources().getDisplayMetrics());
}
}
// Start the service if needed;
if (!isServiceUp()) {
// Service is not running, check if it should;
perAppService = new PerAppServiceHelper(this);
if (perAppService.shouldBeStarted()) {
Util.showUsageStatDialog(AeroActivity.this);
perAppService.startService();
}
}
// Assign action bar title;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
mActionBar = getActionBar();
} else {
mActionBarTitleID = getResources().getIdentifier("action_bar_title", "id", "android");
mActionBarTitle = (TextView) findViewById(mActionBarTitleID);
mActionBarTitle.setTypeface(font);
}
mTitle = getTitle();
mAeroTitle = getResources().getStringArray(R.array.aero_array);
mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);
mDrawerList = (ListView) findViewById(R.id.left_drawer);
if (actionBarHeight != 0) {
FrameLayout.LayoutParams params = (FrameLayout.LayoutParams)mDrawerLayout.getLayoutParams();
params.setMargins(0, actionBarHeight + (int)TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 24, getResources().getDisplayMetrics()), 0, 0);
mDrawerLayout.setLayoutParams(params);
}
// set a custom shadow that overlays the main content when the drawer opens
mDrawerLayout.setDrawerShadow(R.drawable.drawer_shadow, GravityCompat.START);
// set up the drawer's list view with items and click listener
// Set up lists;
NavBarItems content = new NavBarItems(this);
mAdapter = new ItemAdapter(this, R.layout.activity_main, content.ITEMS);
mDrawerList.setAdapter(mAdapter);
mDrawerList.setOnItemClickListener(new DrawerItemClickListener());
// enable ActionBar app icon to behave as action to toggle nav drawer
getActionBar().setDisplayHomeAsUpEnabled(true);
getActionBar().setHomeButtonEnabled(true);
// ActionBarDrawerToggle ties together the the proper interactions
// between the sliding drawer and the action bar app icon
mDrawerArrow = new DrawerArrowDrawable(this) {
@Override
public boolean isLayoutRtl() {
return false;
}
};
// Navigation Drawer with toggle and animation;
mDrawerToggle = new ActionBarDrawerToggle(this,
mDrawerLayout,
mDrawerArrow,
R.string.drawer_open,
R.string.drawer_close) {
public void onDrawerClosed(View view) {
super.onDrawerClosed(view);
invalidateOptionsMenu();
}
public void onDrawerOpened(View drawerView) {
super.onDrawerOpened(drawerView);
invalidateOptionsMenu();
}
};
mDrawerLayout.setDrawerListener(mDrawerToggle);
mDrawerToggle.syncState();
if (savedInstanceState == null) {
selectItem(OVERVIEW);
} else {
selectItem(savedInstanceState.getInt(SELECTED_ITEM));
}
// Handle notification click here;
if(savedInstanceState == null) {
Bundle extras = getIntent().getExtras();
if (extras != null) {
if (extras.getString("NOTIFY_STRING").equals("APPMONITOR")) {
selectItem(!(Build.MODEL.equals("MB525") || Build.MODEL.equals("MB526")) ? PROFILE : APPSTATISTICS);
}
}
} else {
if (savedInstanceState.getSerializable("NOTIFY_STRING") != null) {
if (savedInstanceState.getSerializable("NOTIFY_STRING").equals("APPMONITOR")) {
selectItem(!(Build.MODEL.equals("MB525") || Build.MODEL.equals("MB526")) ? PROFILE : APPSTATISTICS);
}
}
}
}
private final class ItemAdapter extends ArrayAdapter<PreferenceItem> {
private ArrayList<PreferenceItem> items;
public ItemAdapter(Context context, int textViewResourceId,
ArrayList<PreferenceItem> objects) {
super(context, textViewResourceId, objects);
this.items = objects;
}
public View getView(int position, View convertView, ViewGroup parent) {
View v = convertView;
if (v == null) {
LayoutInflater vi = getLayoutInflater();
v = vi.inflate(R.layout.adapter_item, null);
}
PreferenceItem item = items.get(position);
if (item != null) {
ImageView icon = (ImageView) v.findViewById(R.id.icon);
TextView text = (TextView) v.findViewById(R.id.text);
text.setTypeface(font);
if (icon != null) {
icon.setImageResource(item.drawable);
}
if (text != null) {
text.setText(getString(item.content));
}
}
return v;
}
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.main, menu);
return super.onCreateOptionsMenu(menu);
}
@Override
protected void onNewIntent(Intent intent) {
super.onNewIntent(intent);
//If we don't do this, the application will crash when resume via a notification.
setIntent(intent);
}
@Override
protected void onResume() {
super.onResume();
Bundle extras = getIntent().getExtras();
// Display the appmonitor upon resume;
if (extras != null) {
if (extras.getString("NOTIFY_STRING").equals("APPMONITOR")) {
selectItem(!(Build.MODEL.equals("MB525") || Build.MODEL.equals("MB526")) ? PROFILE : APPSTATISTICS);
}
}
// Reset the string;
getIntent().putExtra("NOTIFY_STRING", new String());
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// The action bar home/up action should open or close the drawer.
// ActionBarDrawerToggle will take care of this.
if (mDrawerToggle.onOptionsItemSelected(item)) {
return true;
}
switch (item.getItemId()) {
case R.id.aero_settings:
Intent trIntent = new Intent("android.intent.action.PREFS");
trIntent.setClass(this, PrefsActivity.class);
trIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
this.startActivity(trIntent);
overridePendingTransition(android.R.anim.fade_in, android.R.anim.fade_out);
break;
}
return super.onOptionsItemSelected(item);
}
/* The click listener for ListView in the navigation drawer */
private class DrawerItemClickListener implements ListView.OnItemClickListener {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
selectItem(position);
}
}
private boolean isServiceUp() {
final ActivityManager manager = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);
for (ActivityManager.RunningServiceInfo service : manager.getRunningServices(Integer.MAX_VALUE)) {
if (PerAppService.class.getName().equals(service.service.getClassName())) {
// its already up and running
return true;
}
}
return false;
}
private void selectItem(int position) {
int j = position;
if(mDrawerLayout != null)
mDrawerLayout.closeDrawers();
// update the main content by replacing fragments
Fragment fragment = null;
if (!(Build.MODEL.equals("MB525") || Build.MODEL.equals("MB526"))
&& position >= DEFY)
j++;
// Switch to show different fragments;
switch (j) {
case OVERVIEW:
if (mAeroFragment == null) {
mAeroFragment = new AeroFragment();
}
fragment = mAeroFragment;
break;
case CPU:
if (mCPUFragement == null) {
mCPUFragement = new CPUFragment();
}
fragment = mCPUFragement;
break;
case STATISTICS:
if (mStatisticsFragment == null) {
mStatisticsFragment = new StatisticsFragment();
}
fragment = mStatisticsFragment;
break;
case GPU:
if (mGPUFragement == null) {
mGPUFragement = new GPUFragment();
}
fragment = mGPUFragement;
break;
case MEMORY:
if (mMemoryFragment == null) {
mMemoryFragment = new MemoryFragment();
}
fragment = mMemoryFragment;
break;
case MISC:
if (mMiscSettingsFragment == null) {
mMiscSettingsFragment = new MiscSettingsFragment();
}
fragment = mMiscSettingsFragment;
break;
case DEFY:
if (mDefyPartsFragment == null) {
mDefyPartsFragment = new DefyPartsFragment();
}
fragment = mDefyPartsFragment;
break;
case UPDATER:
if (mUpdaterFragement == null) {
mUpdaterFragement = new UpdaterFragment();
}
fragment = mUpdaterFragement;
break;
case PROFILE:
if (mProfileFragment == null) {
mProfileFragment = new ProfileFragment();
}
fragment = mProfileFragment;
break;
case APPSTATISTICS:
if (mAppStatisticsFragment == null) {
mAppStatisticsFragment = new AppMonitorFragment();
}
fragment = mAppStatisticsFragment;
break;
case TESTSUITE:
if (mTestSuiteFragment == null) {
mTestSuiteFragment = new TestSuiteFragment();
}
fragment = mTestSuiteFragment;
break;
}
if (fragment != null)
switchContent(fragment);
// update selected item and title, then close the drawer
mDrawerList.setItemChecked(position, true);
mPreviousTitle = j;
setTitle(mAeroTitle[j]);
mBackCounter = 0;
mDrawerLayout.closeDrawer(mDrawerList);
}
public void setActionBarTitle(String title) {
setTitle(title);
}
public final void setTitle(CharSequence title) {
mTitle = title;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
if (mActionBar != null)
mActionBar.setTitle(mTitle);
} else {
if (mActionBarTitle != null)
mActionBarTitle.setText(mTitle);
}
}
/**
* When using the ActionBarDrawerToggle, you must call it during
* onPostCreate() and onConfigurationChanged()...
*/
@Override
protected void onPostCreate(Bundle savedInstanceState) {
super.onPostCreate(savedInstanceState);
// Sync the toggle state after onRestoreInstanceState has occurred.
mDrawerToggle.syncState();
}
@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
// Pass any configuration change to the drawer toggls
mDrawerToggle.onConfigurationChanged(newConfig);
}
@Override
public void onBackPressed() {
if (mFragmentStack.size() > 1) {
switchContent(mFragmentStack.lastElement());
setTitle(mAeroTitle[mPreviousTitle]);
}
// Back-Button logic;
mBackCounter++;
if (mBackCounter == 1) {
Toast.makeText(this, R.string.back_for_close, Toast.LENGTH_LONG).show();
}
if (mBackCounter == 2)
finish();
}
/**
* Resets the back button counter logic.
*/
public static void resetBackCounter() {
mBackCounter = 0;
}
public final void switchContent(final Fragment fragment) {
// Reduce the navigation drawer delay for a smoother UI;
mHandler.postDelayed(new Runnable() {
@Override
public void run() {
/*
* Somehow the activity is destroyed sometimes when we switched activities which
* forced an orientation. To hopefully avoid this, we are just restarting the app
* safely.
*/
try {
getFragmentManager().beginTransaction().setCustomAnimations(android.R.animator.fade_in,
android.R.animator.fade_out).replace(R.id.content_frame, fragment).commitAllowingStateLoss();
} catch (IllegalStateException e) {
recreate();
}
}
},genHelper.getDefaultDelay());
mFragmentStack.push(fragment);
}
}