From ca5354ba9f62d8f700c9482f25d118e94f550ac5 Mon Sep 17 00:00:00 2001 From: Cpt-Hook Date: Tue, 24 Apr 2018 17:02:56 +0200 Subject: [PATCH 1/2] Added temperature of CPU --- .../activities/MainActivity.java | 45 ++++++++++++ .../controllers/TemperatureController.java | 64 ++++++++++++++++++ .../helpers/PreferenceHelper.java | 15 ++++ .../main/res/drawable/ripple_temperature.xml | 6 ++ .../main/res/drawable/shape_temperature.xml | 6 ++ Plugin/src/main/res/drawable/temperature.png | Bin 0 -> 1506 bytes Plugin/src/main/res/layout/activity_main.xml | 53 ++++++++++++++- Plugin/src/main/res/menu/menu_main.xml | 6 ++ Plugin/src/main/res/values/colors.xml | 1 + Plugin/src/main/res/values/strings.xml | 2 + 10 files changed, 197 insertions(+), 1 deletion(-) create mode 100644 Plugin/src/main/java/com/sonelli/juicessh/performancemonitor/controllers/TemperatureController.java create mode 100644 Plugin/src/main/res/drawable/ripple_temperature.xml create mode 100644 Plugin/src/main/res/drawable/shape_temperature.xml create mode 100644 Plugin/src/main/res/drawable/temperature.png 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..d754ddc --- /dev/null +++ b/Plugin/src/main/java/com/sonelli/juicessh/performancemonitor/controllers/TemperatureController.java @@ -0,0 +1,64 @@ +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() { + @Override + public void run() { + try { + getPluginClient().executeCommandOnSession(getSessionId(),getSessionKey(), "cat /sys/class/thermal/thermal_zone*/temp", new OnSessionExecuteListener() { + @Override + public void onCompleted(int exitCode) { + switch(exitCode){ + 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) { + //input is in millidegrees C + double temp = Double.parseDouble(line)/1000; + //only one decimal place + temp = (double)Math.round(temp*10)/10; + setText(Double.toString(temp) + "°C"); + } + + @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 0000000000000000000000000000000000000000..03d8ed2643d462999d275bd9d7628b07895a9c8e GIT binary patch literal 1506 zcmV<81s(c{P)t<88FWQhbW?9;ba!ELWdL_~cP?peYja~^ zaAhuUa%Y?FJQ@H11z$--K~#90?VaC?mPHiDzmsN|rWIycT3%#kTCP`8VW~t&zatV8 zsyibIx(I@TqJJQyy68%%gvz=oN(!k^EHsT0L-R*;k(RoUWv-?y>Zgm@g|yxG%(L$^ zGtav_AK0t2&zUpd^Zc55&de(n3WY+UP$(1%g^`BK9Y83+rIPNKbeE)AlCG6BrqA3f z=~qd+C4DJropbJJjyQ)Mz-(X*aFTFN0`CAf<&M8&0mcJw0H-Sme?F&y*MN(2_ot%( zW&%I8A^iDl1E%EeS4RNM1-fe#zn=rZoZS6uG{E)1;RxdQvmdxBcRw2mFag*XQT%?k z1LJb{x1S4g2k;+Wku)PgJ6)1qNYG9YjTi?2GbQbmG&46zOXQ!DtK2K;9D zJPwSH*|&}WSZ)Y)7PxH)eizsm0ZU`_sR~Va2roA5pF8I^S9R)~`&!caHrtL)6B5v6 z*xzl#w{`5iHhkAY6B2NpVc*h*Z|m6UZTPN*CL~~jVL#l4?}LVYVjI3|A^SK0pq1S@ z*H(w0x}aa_tGe=dwSjeVm~9w6_A;dfXtKxWTqq_GbI6;DGA6- zNkC>gZX8fIWiDuhQxcGwl7P&N_-8xdF%>SnU7~SQ}8e%s_*r(Bp={svLSG2Y4<} zkbi&`0~{ZdM{;PA4Ez$*QvpKk2j&jqBPM?WSEtq`3HV#jcL5^oY$ZZe`91Ha)Fm0f zV*#Dt16*nNNx_||bV&mK?B8p2`WP_F@DsA^s17!z(k2POl7LP>W%!sz+*S1Fb9*X% zq62(nboK|J<(LH66kqdmSe;6rr~qTJm!Y;?tq436U+@2M47f0rPSF7FF*@1}4Ekjb z|NPh$TkSzu5L=%VQxVo0-_M+Lr(4*&B<0%qYEkS4QY7FO!@kk5KTuN~L*eGw4WvlG zOvC=8VbA$a-tx7$4pJn*n)5$k*n{_oh`<%G8%U7=YaQ@0!=7`mx9IDLQzXD@qt-QF zokofT^cZ$)%b1*-Dp|3&O^O6qJJ?P)?ACSzG5ITY11S>lvtgfY*mF*dS+TcGiUjO6 z>~|RUkLwC#2<(g9K#BxxHSG5RqgvRvOWIRoJXQEMb^|FAu+gwjk#zT9M&}%oUaB*o zK#(1KXMmq>Zp8-Ucn55aKJ|7k+frzgsxIg)!@dw$Hkh&RDp)G1yUw5t-cHz7T!6{= zGLu#u0$L9J@q2>yMn3bwf4_)64UrV!^?;7A$M^^WEC!CmRG;Bkqy}rduJfBLB)Oe1+cv|5V@K zFTj}!;_m>)*e!N2_#fp7xfS)Z1$dAa-;D=oV;t}#zR)X_;}~^GG00MWjX$&3sM>3A zx1>+x2SVa6foJ>9%vc-+R$$bj zj%a{ufK~X{!n)`IUS+tBaAN>m4y*(=Q*AKS&l%tw;AtAX9=RiyVFHun>ojkbG)KN- zZK9-0`u?Ry{^S2{NxS6NA8&BZ9Z4T;p-?Ck3WY+UP$;zKU%inz$J(5v2LJ#707*qo IM6N<$f~y|1v;Y7A literal 0 HcmV?d00001 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 From d5eb0a6f3eb2efe0dea1599cf3c40cb5ff7f8eba Mon Sep 17 00:00:00 2001 From: Cpt-Hook Date: Wed, 25 Apr 2018 16:11:07 +0200 Subject: [PATCH 2/2] Displaying average of all temp sensors. --- .../controllers/TemperatureController.java | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) 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 index d754ddc..c3349a4 100644 --- a/Plugin/src/main/java/com/sonelli/juicessh/performancemonitor/controllers/TemperatureController.java +++ b/Plugin/src/main/java/com/sonelli/juicessh/performancemonitor/controllers/TemperatureController.java @@ -22,13 +22,25 @@ public BaseController 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"); @@ -38,11 +50,11 @@ public void onCompleted(int exitCode) { @Override public void onOutputLine(String line) { + Log.d(TAG, "Line: " + line); //input is in millidegrees C double temp = Double.parseDouble(line)/1000; - //only one decimal place - temp = (double)Math.round(temp*10)/10; - setText(Double.toString(temp) + "°C"); + sumOfTemps+=temp; + numOfLines++; } @Override