/* Copyright (C) 2011 The University of Michigan This program 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. This program 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 this program. If not, see <http://www.gnu.org/licenses/>. Please send inquiries to powertutor@umich.edu */ package edu.umich.PowerTutor.ui; import edu.umich.PowerTutor.R; import edu.umich.PowerTutor.phone.PhoneSelector; import edu.umich.PowerTutor.service.ICounterService; import edu.umich.PowerTutor.service.UMLoggerService; import android.app.Activity; import android.app.AlertDialog; import android.app.Dialog; import android.content.ComponentName; import android.content.Context; import android.content.DialogInterface; import android.content.Intent; import android.content.ServiceConnection; import android.content.SharedPreferences; import android.content.res.Configuration; import android.os.Bundle; import android.os.Environment; import android.os.IBinder; import android.os.RemoteException; import android.preference.PreferenceManager; import android.util.Log; import android.view.Menu; import android.view.MenuItem; import android.view.View; import android.widget.AdapterView; import android.widget.AdapterView.OnItemSelectedListener; import android.widget.ArrayAdapter; import android.widget.Button; import android.widget.SeekBar; import android.widget.SeekBar.OnSeekBarChangeListener; import android.widget.Spinner; import android.widget.TextView; import android.widget.Toast; import java.io.File; import java.io.FileOutputStream; import java.util.zip.InflaterInputStream; import java.io.BufferedOutputStream; import java.io.IOException; import java.io.OutputStreamWriter; import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.InetAddress; import java.net.UnknownHostException; /** The main view activity for PowerTutor*/ public class UMLogger extends Activity { private static final String TAG = "UMLogger"; public static final String CURRENT_VERSION = "1.2"; // Don't change this... public static final String SERVER_IP = "spidermonkey.eecs.umich.edu"; public static final int SERVER_PORT = 5204; private SharedPreferences prefs; private Intent serviceIntent; private ICounterService counterService; private CounterServiceConnection conn; private Button serviceStartButton; private Button appViewerButton; private Button sysViewerButton; private Button helpButton; private TextView scaleText; /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); prefs = PreferenceManager.getDefaultSharedPreferences(this); serviceIntent = new Intent(this, UMLoggerService.class); conn = new CounterServiceConnection(); setContentView(R.layout.main); ArrayAdapter<?> adapterxaxis = ArrayAdapter.createFromResource( this, R.array.xaxis, android.R.layout.simple_spinner_item); adapterxaxis.setDropDownViewResource( android.R.layout.simple_spinner_dropdown_item); serviceStartButton = (Button)findViewById(R.id.servicestartbutton); appViewerButton = (Button)findViewById(R.id.appviewerbutton); sysViewerButton = (Button)findViewById(R.id.sysviewerbutton); helpButton= (Button)findViewById(R.id.helpbutton); serviceStartButton.setOnClickListener(serviceStartButtonListener); sysViewerButton.setOnClickListener(sysViewerButtonListener); appViewerButton.setOnClickListener(appViewerButtonListener); helpButton.setOnClickListener(helpButtonListener); if(counterService != null) { serviceStartButton.setText("Stop Profiler"); appViewerButton.setEnabled(true); sysViewerButton.setEnabled(true); } else { serviceStartButton.setText("Start Profiler"); appViewerButton.setEnabled(false); sysViewerButton.setEnabled(false); } } @Override public void onResume() { super.onResume(); getApplicationContext().bindService(serviceIntent, conn, 0); if(prefs.getBoolean("firstRun", true)) { if(PhoneSelector.getPhoneType() == PhoneSelector.PHONE_UNKNOWN) { showDialog(DIALOG_UNKNOWN_PHONE); } else { showDialog(DIALOG_TOS); } } Intent startingIntent = getIntent(); if(startingIntent.getBooleanExtra("isFromIcon", false)) { Intent copyIntent = (Intent)getIntent().clone(); copyIntent.putExtra("isFromIcon", false); setIntent(copyIntent); Intent intent = new Intent(this, PowerTabs.class); startActivity(intent); } } @Override public void onPause() { super.onPause(); getApplicationContext().unbindService(conn); } private static final int MENU_PREFERENCES = 0; private static final int MENU_SAVE_LOG = 1; private static final int DIALOG_START_SENDING = 0; private static final int DIALOG_STOP_SENDING = 1; private static final int DIALOG_TOS = 2; private static final int DIALOG_RUNNING_ON_STARTUP = 3; private static final int DIALOG_NOT_RUNNING_ON_STARTUP = 4; private static final int DIALOG_UNKNOWN_PHONE = 5; @Override public boolean onCreateOptionsMenu(Menu menu) { menu.add(0, MENU_PREFERENCES, 0, "Options"); menu.add(0, MENU_SAVE_LOG, 0, "Save log"); return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { switch(item.getItemId()) { case MENU_PREFERENCES: startActivity(new Intent(this, EditPreferences.class)); return true; case MENU_SAVE_LOG: new Thread() { public void start() { File writeFile = new File( Environment.getExternalStorageDirectory(), "PowerTrace" + System.currentTimeMillis() + ".log"); try { InflaterInputStream logIn = new InflaterInputStream( openFileInput("PowerTrace.log")); BufferedOutputStream logOut = new BufferedOutputStream( new FileOutputStream(writeFile)); byte[] buffer = new byte[20480]; for(int ln = logIn.read(buffer); ln != -1; ln = logIn.read(buffer)) { logOut.write(buffer, 0, ln); } logIn.close(); logOut.close(); Toast.makeText(UMLogger.this, "Wrote log to " + writeFile.getAbsolutePath(), Toast.LENGTH_SHORT).show(); return; } catch(java.io.EOFException e) { Toast.makeText(UMLogger.this, "Wrote log to " + writeFile.getAbsolutePath(), Toast.LENGTH_SHORT).show(); return; } catch(IOException e) { } Toast.makeText(UMLogger.this, "Failed to write log to sdcard", Toast.LENGTH_SHORT).show(); } }.start(); return true; } return super.onOptionsItemSelected(item); } /**This function includes all the dialog constructor*/ @Override protected Dialog onCreateDialog(int id) { AlertDialog.Builder builder = new AlertDialog.Builder(this); switch(id) { case DIALOG_TOS: builder.setMessage(R.string.term) .setCancelable(false) .setPositiveButton("Agree", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int id) { prefs.edit().putBoolean("firstRun", false) .putBoolean("runOnStartup", true) .putBoolean("sendPermission", true).commit(); dialog.dismiss(); } }) .setNegativeButton("Do not agree", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int id) { prefs.edit().putBoolean("firstRun", true).commit(); finish(); } }); return builder.create(); case DIALOG_STOP_SENDING: builder.setMessage(R.string.stop_sending_text) .setCancelable(true) .setPositiveButton("Stop", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int id) { prefs.edit().putBoolean("sendPermission", false).commit(); dialog.dismiss(); } }) .setNegativeButton("Cancel", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int id) { dialog.cancel(); } }); return builder.create(); case DIALOG_START_SENDING: builder.setMessage(R.string.start_sending_text) .setCancelable(true) .setPositiveButton("Start", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int id) { prefs.edit().putBoolean("sendPermission", true).commit(); dialog.dismiss(); } }) .setNegativeButton("Cancel", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int id) { dialog.cancel(); } }); return builder.create(); case DIALOG_RUNNING_ON_STARTUP: builder.setMessage(R.string.running_on_startup) .setCancelable(true) .setNeutralButton("Ok", null); return builder.create(); case DIALOG_NOT_RUNNING_ON_STARTUP: builder.setMessage(R.string.not_running_on_startup) .setCancelable(true) .setNeutralButton("Ok", null); return builder.create(); case DIALOG_UNKNOWN_PHONE: builder.setMessage(R.string.unknown_phone) .setCancelable(false) .setNeutralButton("Ok", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int id) { dialog.dismiss(); showDialog(DIALOG_TOS); } }); return builder.create(); } return null; } private Button.OnClickListener appViewerButtonListener = new Button.OnClickListener() { public void onClick(View v) { Intent intent = new Intent(v.getContext(), PowerTop.class); startActivityForResult(intent, 0); } }; private Button.OnClickListener sysViewerButtonListener = new Button.OnClickListener() { public void onClick(View v) { Intent intent = new Intent(v.getContext(), PowerTabs.class); startActivityForResult(intent, 0); } }; private Button.OnClickListener serviceStartButtonListener = new Button.OnClickListener() { public void onClick(View v) { serviceStartButton.setEnabled(false); if(counterService != null) { stopService(serviceIntent); } else { if(conn == null) { Toast.makeText(UMLogger.this, "Profiler failed to start", Toast.LENGTH_SHORT).show(); } else { startService(serviceIntent); } } } }; private class CounterServiceConnection implements ServiceConnection { public void onServiceConnected(ComponentName className, IBinder boundService) { counterService = ICounterService.Stub.asInterface((IBinder)boundService); serviceStartButton.setText("Stop Profiler"); serviceStartButton.setEnabled(true); appViewerButton.setEnabled(true); sysViewerButton.setEnabled(true); } public void onServiceDisconnected(ComponentName className) { counterService = null; getApplicationContext().unbindService(conn); getApplicationContext().bindService(serviceIntent, conn, 0); Toast.makeText(UMLogger.this, "Profiler stopped", Toast.LENGTH_SHORT).show(); serviceStartButton.setText("Start Profiler"); serviceStartButton.setEnabled(true); appViewerButton.setEnabled(false); sysViewerButton.setEnabled(false); } } private Button.OnClickListener helpButtonListener = new Button.OnClickListener() { public void onClick(View v) { Intent myIntent = new Intent(v.getContext(), Help.class); startActivityForResult(myIntent, 0); } }; }