package com.ericsson.uecontrol.gui; import android.app.ActionBar; import android.content.Context; import android.content.Intent; import android.content.SharedPreferences; import android.content.SharedPreferences.OnSharedPreferenceChangeListener; import android.content.pm.ApplicationInfo; import android.content.pm.PackageManager; import android.os.Bundle; import android.os.Handler; import android.preference.PreferenceManager; import android.support.v4.app.FragmentActivity; import android.view.Menu; import android.view.MenuItem; import android.view.WindowManager; import android.widget.Toast; import com.ericsson.uecontrol.R; import com.ericsson.uecontrol.core.UeControlExecutor; import com.ericsson.uecontrol.core.behaviour.UeBehaviourSleep; import com.ericsson.uecontrol.core.behaviour.UeBehaviourSurfing; import com.ericsson.uecontrol.gui.fragments.BehaviourListFragment; import com.ericsson.uecontrol.gui.fragments.NavigationDrawerFragment; import com.ericsson.uecontrol.gui.fragments.StatusFragment; import com.ericsson.uecontrol.gui.util.CSVWriter; import org.apache.log4j.Level; import org.apache.log4j.Logger; import java.io.File; import de.mindpipe.android.logging.log4j.LogConfigurator; public class MainActivity extends FragmentActivity implements OnSharedPreferenceChangeListener{ private static final Logger log = Logger.getLogger(MainActivity.class); public static final String DEFAULT_LOG_PATH = "/sdcard/uecontrol/"; public static final String BEHAVIOUR_SAVE_FILE = "behaviour_list.dat"; /** Fragments **/ private StatusFragment statusFragment; private MenuItem action_execute; private boolean backButtonPressed = false; private static UeControlExecutor currentExecutor; private static CSVWriter csvLogger; private static int uid; private static Context context; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // Set static fields uid = getApplicationInfo().uid; context = this; // Setup Debugging setupDebugLogging(); // Setup Main GUI setContentView(R.layout.activity_main); statusFragment = (StatusFragment) getFragmentManager().findFragmentById(R.id.status_fragment); getFragmentManager().beginTransaction() .replace(R.id.container, new BehaviourListFragment()).commit(); if(currentExecutor == null) { log.info("Creating new instance of executor"); currentExecutor = new UeControlExecutor(); File input = new File(this.getFilesDir(), BEHAVIOUR_SAVE_FILE); if (input.exists()) { try { log.debug("Reading saved state"); currentExecutor.read(input.getAbsolutePath()); } catch (Exception e) { Toast.makeText(this, "Unable to load saved state", Toast.LENGTH_SHORT).show(); log.error(null, e); } } else { log.debug("No saved state found, creating default behaviours"); currentExecutor.addBehaviour(new UeBehaviourSleep()); currentExecutor.addBehaviour(new UeBehaviourSurfing()); currentExecutor.addBehaviour(new UeBehaviourSleep(4000)); } } else { log.info("Using existing executor"); } currentExecutor.setThroughputListener(statusFragment.getThroughputListener()); updateExecutionState(); } public void setupDebugLogging(){ SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this); String path = prefs.getString("logging_path", DEFAULT_LOG_PATH); if(!path.endsWith("/")) path += File.separator; LogConfigurator logConfigurator = new LogConfigurator(); logConfigurator.setFileName(path + "uecontrol.log"); if(prefs.getBoolean("debug", false)) logConfigurator.setRootLevel(Level.DEBUG); else logConfigurator.setRootLevel(Level.WARN); // Set log level of a specific logger logConfigurator.setLevel("org.apache", Level.ERROR); logConfigurator.configure(); prefs.registerOnSharedPreferenceChangeListener(this); } public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) { log.debug("Preference changed: "+key); if(key.equals("debug")) { if (sharedPreferences.getBoolean("debug", false)) { Logger.getRootLogger().setLevel(Level.DEBUG); log.info("Enabling debug logging."); } else { log.info("Disabling debug logging."); Logger.getRootLogger().setLevel(Level.WARN); } } } @Override public boolean onCreateOptionsMenu(Menu menu) { // Only show items in the action bar relevant to this screen // if the drawer is not showing. Otherwise, let the drawer // decide what to show in the action bar. getMenuInflater().inflate(R.menu.main, menu); ActionBar actionBar = getActionBar(); actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_STANDARD); actionBar.setDisplayShowTitleEnabled(true); action_execute = (MenuItem) menu.findItem(R.id.action_execute); updateExecutionState(); return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { // Handle action bar item clicks here. The action bar will // automatically handle clicks on the Home/Up button, so long // as you specify a parent activity in AndroidManifest.xml. int id = item.getItemId(); if (id == R.id.action_execute) { if(currentExecutor.isRunning()) { currentExecutor.terminate(); csvLogger = null; } else { SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this); if(prefs.getBoolean("logging", true)) csvLogger = new CSVWriter(this); else csvLogger = null; currentExecutor.execute(); } updateExecutionState(); return true; } else if (id == R.id.action_reset) { if(currentExecutor != null) currentExecutor.reset(); if(statusFragment != null) statusFragment.reset(); updateExecutionState(); } else if (id == R.id.action_edit) { if(!currentExecutor.isRunning()) { Intent intent = new Intent(this, EditActivity.class); startActivity(intent); } else Toast.makeText(this, "Stop execution to edit behaviours", Toast.LENGTH_SHORT).show(); return true; } else if (id == R.id.action_settings) { startActivity(new Intent(this, SettingsActivity.class)); return true; } return super.onOptionsItemSelected(item); } private void updateExecutionState(){ SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this); if(action_execute != null) { if (currentExecutor.isRunning()) { action_execute.setTitle(R.string.action_stop); if(prefs.getBoolean("screen_on", false)) getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); } else { action_execute.setTitle(R.string.action_run); getWindow().clearFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); } } } @Override public void onBackPressed() { if (backButtonPressed) { if(currentExecutor != null){ log.info("Terminating executor"); currentExecutor.terminate(); } super.onBackPressed(); return; } this.backButtonPressed = true; Toast.makeText(this, "Press BACK again to Exit", Toast.LENGTH_SHORT).show(); new Handler().postDelayed(new Runnable() { @Override public void run() { backButtonPressed = false; } }, 2000); } public static void logThroughput(double downThroughput, double upThroughput) { if(csvLogger == null || currentExecutor == null || currentExecutor.getRunningBehaviour() == null) return; csvLogger.write(currentExecutor.getRunningBehaviour().getName(), downThroughput, upThroughput); } public static UeControlExecutor getExecutor() { return currentExecutor; } public static int getUID(){ return uid; } public static Context getContext(){return context;} }