diff --git a/Plugin/src/main/java/com/sonelli/juicessh/performancemonitor/activities/MainActivity.java b/Plugin/src/main/java/com/sonelli/juicessh/performancemonitor/activities/MainActivity.java index 5acf396..d981bdd 100644 --- a/Plugin/src/main/java/com/sonelli/juicessh/performancemonitor/activities/MainActivity.java +++ b/Plugin/src/main/java/com/sonelli/juicessh/performancemonitor/activities/MainActivity.java @@ -13,11 +13,13 @@ import android.support.v7.app.ActionBar; import android.support.v7.app.AppCompatActivity; import android.util.Log; +import android.util.TypedValue; import android.view.Menu; import android.view.MenuItem; import android.view.View; import android.view.WindowManager; import android.widget.Button; +import android.widget.LinearLayout; import android.widget.Toast; import com.sonelli.juicessh.performancemonitor.R; @@ -28,6 +30,7 @@ import com.sonelli.juicessh.performancemonitor.controllers.FreeRamController; import com.sonelli.juicessh.performancemonitor.controllers.LoadAverageController; import com.sonelli.juicessh.performancemonitor.controllers.NetworkUsageController; +import com.sonelli.juicessh.performancemonitor.controllers.TemperatureController; import com.sonelli.juicessh.performancemonitor.helpers.PreferenceHelper; import com.sonelli.juicessh.performancemonitor.loaders.ConnectionListLoader; import com.sonelli.juicessh.performancemonitor.views.AutoResizeTextView; @@ -55,6 +58,8 @@ public class MainActivity extends AppCompatActivity implements ActionBar.OnNavig private Button connectButton; private Button disconnectButton; + private LinearLayout temperatureLayout; + private ConnectionSpinnerAdapter spinnerAdapter; // Controllers @@ -63,6 +68,7 @@ public class MainActivity extends AppCompatActivity implements ActionBar.OnNavig private BaseController cpuUsageController; private BaseController diskUsageController; private BaseController networkUsageController; + private BaseController temperatureController; // Text displays private AutoResizeTextView loadAverageTextView; @@ -70,6 +76,7 @@ public class MainActivity extends AppCompatActivity implements ActionBar.OnNavig private AutoResizeTextView cpuUsageTextView; private AutoResizeTextView networkUsageTextView; private AutoResizeTextView diskUsageTextView; + private AutoResizeTextView temperatureTextView; // State private volatile int sessionId; @@ -101,6 +108,7 @@ protected void onCreate(Bundle savedInstanceState) { this.cpuUsageTextView = (AutoResizeTextView) findViewById(R.id.cpu_usage); this.networkUsageTextView = (AutoResizeTextView) findViewById(R.id.network_usage); this.diskUsageTextView = (AutoResizeTextView) findViewById(R.id.disk_usage); + this.temperatureTextView = (AutoResizeTextView) findViewById(R.id.temperature); this.connectButton = (Button) findViewById(R.id.connect_button); Drawable drawable = getDrawable(R.drawable.login); @@ -108,6 +116,9 @@ protected void onCreate(Bundle savedInstanceState) { drawable.setBounds(0, 0, (int)(drawable.getIntrinsicWidth()*0.2), (int)(drawable.getIntrinsicHeight()*0.2)); } + + this.temperatureLayout = (LinearLayout) findViewById(R.id.temperatureLayout); + connectButton.setCompoundDrawables(drawable, null, null, null); connectButton.setOnClickListener(new View.OnClickListener() { @Override @@ -170,6 +181,14 @@ public void run() { } }); + if (preferenceHelper.getShowTemperatureFlag()) { + loadAverageTextView.setTextSize(TypedValue.COMPLEX_UNIT_SP,36); + temperatureLayout.setVisibility(View.VISIBLE); + } else { + loadAverageTextView.setTextSize(TypedValue.COMPLEX_UNIT_SP,55); + temperatureLayout.setVisibility(View.GONE); + } + } @Override @@ -239,6 +258,7 @@ public boolean onCreateOptionsMenu(Menu menu) { // assigning the keep screen on menu the value of its saved status PreferenceHelper preferenceHelper = new PreferenceHelper(this); menu.findItem(R.id.keep_screen_on).setChecked(preferenceHelper.getKeepScreenOnFlag()); + menu.findItem(R.id.show_temperature).setChecked(preferenceHelper.getShowTemperatureFlag()); return true; } @@ -308,6 +328,13 @@ public void onSessionStarted(final int sessionId, final String sessionKey) { .setTextview(networkUsageTextView) .start(); + this.temperatureController = new TemperatureController(this) + .setSessionId(sessionId) + .setSessionKey(sessionKey) + .setPluginClient(client) + .setTextview(temperatureTextView) + .start(); + } @Override @@ -343,11 +370,16 @@ public void onSessionFinished() { networkUsageController.stop(); } + if(temperatureController != null){ + temperatureController.stop(); + } + loadAverageTextView.setText("-"); freeRamTextView.setText("-"); cpuUsageTextView.setText("-"); networkUsageTextView.setText("-"); diskUsageTextView.setText("-"); + temperatureTextView.setText("-"); disconnectButton.setVisibility(View.GONE); disconnectButton.setEnabled(false); @@ -386,6 +418,19 @@ public boolean onOptionsItemSelected(MenuItem item) { } return true; + case R.id.show_temperature: + item.setChecked(!item.isChecked()); + PreferenceHelper preferenceHelper1 = new PreferenceHelper(this); + preferenceHelper1.setShowTemperatureFlag(item.isChecked()); + if (item.isChecked()) { + loadAverageTextView.setTextSize(TypedValue.COMPLEX_UNIT_SP,36); + temperatureLayout.setVisibility(View.VISIBLE); + } else { + loadAverageTextView.setTextSize(TypedValue.COMPLEX_UNIT_SP,55); + temperatureLayout.setVisibility(View.GONE); + } + return true; + case R.id.rate_plugin: String packageName = getResources().getString(R.string.app_package); Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse("market://details?id=" + packageName)); diff --git a/Plugin/src/main/java/com/sonelli/juicessh/performancemonitor/controllers/TemperatureController.java b/Plugin/src/main/java/com/sonelli/juicessh/performancemonitor/controllers/TemperatureController.java new file mode 100644 index 0000000..c3349a4 --- /dev/null +++ b/Plugin/src/main/java/com/sonelli/juicessh/performancemonitor/controllers/TemperatureController.java @@ -0,0 +1,76 @@ +package com.sonelli.juicessh.performancemonitor.controllers; + +import android.content.Context; +import android.os.Handler; +import android.util.Log; + +import com.sonelli.juicessh.performancemonitor.R; +import com.sonelli.juicessh.pluginlibrary.exceptions.ServiceNotConnectedException; +import com.sonelli.juicessh.pluginlibrary.listeners.OnSessionExecuteListener; + +public class TemperatureController extends BaseController { + + public static final String TAG = "TemperatureController"; + + public TemperatureController(Context context) { + super(context); + } + + @Override + public BaseController start() { + super.start(); + + final Handler handler = new Handler(); + handler.post(new Runnable() { + + private int numOfLines; + private double sumOfTemps; + + @Override + public void run() { + numOfLines = 0; + sumOfTemps = 0; + try { + getPluginClient().executeCommandOnSession(getSessionId(),getSessionKey(), "cat /sys/class/thermal/thermal_zone*/temp", new OnSessionExecuteListener() { + @Override + public void onCompleted(int exitCode) { + Log.d(TAG, "Exit code: " + exitCode); + switch(exitCode){ + case 0: + sumOfTemps/=numOfLines; //calc avarage + sumOfTemps = (double)Math.round(sumOfTemps*10)/10; //one decimal place + setText(Double.toString(sumOfTemps) + "°C"); + break; + case 127: + setText(getString(R.string.error)); + Log.d(TAG, "Tried to run a command but the command was not found on the server"); + break; + } + } + + @Override + public void onOutputLine(String line) { + Log.d(TAG, "Line: " + line); + //input is in millidegrees C + double temp = Double.parseDouble(line)/1000; + sumOfTemps+=temp; + numOfLines++; + } + + @Override + public void onError(int error, String reason) { + toast(reason); + } + }); + } catch (ServiceNotConnectedException e) { + Log.d(TAG, "Tried to execute a command but could not connect to JuiceSSH plugin service"); + } + if(isRunning()){ + handler.postDelayed(this, INTERVAL_SECONDS * 1000L); + } + } + }); + + return this; + } +} diff --git a/Plugin/src/main/java/com/sonelli/juicessh/performancemonitor/helpers/PreferenceHelper.java b/Plugin/src/main/java/com/sonelli/juicessh/performancemonitor/helpers/PreferenceHelper.java index 7129b0d..45937c0 100644 --- a/Plugin/src/main/java/com/sonelli/juicessh/performancemonitor/helpers/PreferenceHelper.java +++ b/Plugin/src/main/java/com/sonelli/juicessh/performancemonitor/helpers/PreferenceHelper.java @@ -7,6 +7,7 @@ public class PreferenceHelper { private static final String KEEP_SCREEN_ON_KEY = "keep_screen_on_key"; + private static final String SHOW_TEMPERATURE= "show_temperature_key"; private Context context; public PreferenceHelper(Context context){ @@ -26,4 +27,18 @@ public boolean getKeepScreenOnFlag() { PreferenceManager.getDefaultSharedPreferences(context); return sharedPreferences.getBoolean(KEEP_SCREEN_ON_KEY, false); } + + public boolean getShowTemperatureFlag(){ + SharedPreferences sharedPreferences = + PreferenceManager.getDefaultSharedPreferences(context); + return sharedPreferences.getBoolean(SHOW_TEMPERATURE, false); + } + + public void setShowTemperatureFlag(boolean flag) { + SharedPreferences sharedPreferences = PreferenceManager + .getDefaultSharedPreferences(context); + SharedPreferences.Editor editor = sharedPreferences.edit(); + editor.putBoolean(SHOW_TEMPERATURE, flag); + editor.apply(); + } } diff --git a/Plugin/src/main/res/drawable/ripple_temperature.xml b/Plugin/src/main/res/drawable/ripple_temperature.xml new file mode 100644 index 0000000..903c863 --- /dev/null +++ b/Plugin/src/main/res/drawable/ripple_temperature.xml @@ -0,0 +1,6 @@ + + + + \ No newline at end of file diff --git a/Plugin/src/main/res/drawable/shape_temperature.xml b/Plugin/src/main/res/drawable/shape_temperature.xml new file mode 100644 index 0000000..fc9e200 --- /dev/null +++ b/Plugin/src/main/res/drawable/shape_temperature.xml @@ -0,0 +1,6 @@ + + + + + \ No newline at end of file diff --git a/Plugin/src/main/res/drawable/temperature.png b/Plugin/src/main/res/drawable/temperature.png new file mode 100644 index 0000000..03d8ed2 Binary files /dev/null and b/Plugin/src/main/res/drawable/temperature.png differ diff --git a/Plugin/src/main/res/layout/activity_main.xml b/Plugin/src/main/res/layout/activity_main.xml index 89d65bc..39f6eac 100644 --- a/Plugin/src/main/res/layout/activity_main.xml +++ b/Plugin/src/main/res/layout/activity_main.xml @@ -1,4 +1,5 @@ + + + + + + + + + + + + diff --git a/Plugin/src/main/res/menu/menu_main.xml b/Plugin/src/main/res/menu/menu_main.xml index ef46036..d06a698 100644 --- a/Plugin/src/main/res/menu/menu_main.xml +++ b/Plugin/src/main/res/menu/menu_main.xml @@ -8,6 +8,12 @@ android:checkable="true" compat:showAsAction="never" /> + + #ce432c + #e64a19 #FF37BAB3 #FF04B1C5 #FFF2663D diff --git a/Plugin/src/main/res/values/strings.xml b/Plugin/src/main/res/values/strings.xml index 9dd8fc0..23f4042 100644 --- a/Plugin/src/main/res/values/strings.xml +++ b/Plugin/src/main/res/values/strings.xml @@ -32,5 +32,7 @@ Dark Theme Bytes This plugin requires access to list JuiceSSH connections, and to connect to them. + Temperature + Show temperature