Browse Source

Added support for muh esp8266_airconditioner to le Android appy, also fixed the fuckin problem where Android sometimes fucked up figuring out the layouts and thus couldn't render them -.-

Wazakindjes 1 year ago
parent
commit
e83574536c

+ 22 - 3
README.md

@@ -11,6 +11,7 @@ Since I wrote this shit for meinself, the Android app only supports devices I ac
 * ADGE RM501 5-port HDMI input switcher
 * JVC MK-KC68 stereo tower
 * Samsung LT22C300 TV
+* ESP8266 (not through infrared but a JSON API though ;])
 
 # Supported commands
 * `!q[uit]`, `!e[xit]` => Attempt clean disconnect
@@ -19,15 +20,33 @@ Since I wrote this shit for meinself, the Android app only supports devices I ac
 * `!stereo[cont | stop] <$button>`
 * `!tv[cont | stop] <$button>`
 
+The ESP8266 is quite different from the other devices, it also supports many more different commands so I'll listem separately:
+* `!esp8266_ac read_temp` => read the current temperature from an attached sensor (prolly een DS18B20)
+* `!esp8266_ac servo_rotate <$microseconds>` => rotate an attached serv0 motor to an absolute position (referred to as microseconds, shit's more reliable than simply using degrees)
+* `!esp8266_ac servo_acbutton` => press the power button on muh air conditioner (actual position is defined by the c0dd on the ESP ;])
+* `!esp8266_ac servo_reset` => reset to neutral position (ditt0)
+* `!esp8266_ac led_onboard <on | off>` => enable/disable on-board LED (usually bl00)
+* `!esp8266_ac led_flasher <on | off>` => enable/disable flasher LED (in my case green, indicates an OTA flash is in br0gress)
+* `!esp8266_ac led_error <on | off>` => enable/disable error LED (red obv)
+* `!esp8266_ac led_http <on | off>` => enable/disable HTTP LED (yell0 lol, indicates an HTTP API request is in br0gress)
+* `!esp8266_ac reboot` => reb00t the fuckin thang
+* `!esp8266_ac deepsleep` => put em in deep sleep (how long once again depends on the c0dd on the ESP ;])
+
+For an example of an ESP8266 supporting all that shit, go [here](https://gitgud.malvager.net/Wazakindjes/arduino_h4x/esp8266_airconditioner).
+
 # Dependencies
-Just some good ol' Perl modules:
+Just some good ol' Perl modules (many should already be available by default):
 * `Config::IniFiles`
+* `Data::Dumper`
 * `DateTime`
 * `File::Basename`
+* `HTTP::Request::Common`
 * `IO::Handle`
 * `IO::Select`
 * `IO::Socket::INET`
 * `IO::Socket::SSL`
+* `JSON`
+* `LWP::UserAgent`
 * `Time::Local`
 
 You also need access to lircd and its `irsend` command in order to actually control devices. It varies wildly how to enable this per RPI model and OS/kernel versions, so look that shit up.
@@ -47,7 +66,7 @@ ez pz ;]
 You'll need to make some adjustments if you want to release signed APKs lol. Refer to the section [right here](https://gitgud.malvager.net/Wazakindjes/Meqqy#android-specific-shit) (only applies to Mac OS X, if you're on Windows then idk how to do something similar :>).
 
 # Usage
-![scr0t](./ass/scr0t_led.png) ![scr0t](./ass/scr0t_hdmi.png) ![scr0t](./ass/scr0t_stereo.png) ![scr0t](./ass/scr0t_tv.png)
+![scr0t](./ass/scr0t_led.png) ![scr0t](./ass/scr0t_hdmi.png) ![scr0t](./ass/scr0t_stereo.png) ![scr0t](./ass/scr0t_tv.png) ![scr0t](./ass/scr0t_esp8266_ac.png)
 Deez ~~nuts~~ scr0ts should be p self-explanatory imo tbh. As you can see, you can specify labels for the HDMI switch's buttons (cuz I always forget which is which ;\_;).
 
-If you longpress on a button (i.e. hold it for 300ms) it will send a `cont` command, then when you release em it will send a `stop` command. This works for all remotes, but there's no real point for it in regards to the HDMI switch. ;;]];];];];
+If you longpress on a button (i.e. hold it for 300ms) it will send a `cont` command, then when you release em it will send a `stop` command. This works for almost all remotes (non-IR shit like the ESP8266 __excluded__), but there's no real point for it in regards to the HDMI switch. ;;]];];];];

BIN
app/rem0t0.apk


+ 6 - 0
app/src/.idea/inspectionProfiles/Project_Default.xml

@@ -0,0 +1,6 @@
+<component name="InspectionProjectProfileManager">
+  <profile version="1.0">
+    <option name="myName" value="Project Default" />
+    <inspection_tool class="RegExpRedundantEscape" enabled="false" level="WARNING" enabled_by_default="false" />
+  </profile>
+</component>

+ 1 - 1
app/src/app_rem0t0/src/main/AndroidManifest.xml

@@ -2,7 +2,7 @@
 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
 	xmlns:tools="http://schemas.android.com/tools"
 	package="com.jemoeder.lief.rem0t0"
-	android:versionName="1.0.2">
+	android:versionName="1.1">
 
 	<!-- Need an internet connection to work 0bv lol -->
 	<uses-permission android:name="android.permission.INTERNET" />

+ 146 - 40
app/src/app_rem0t0/src/main/java/com/jemoeder/lief/rem0t0/MainActivity.java

@@ -45,6 +45,7 @@ import android.view.WindowManager;
 import android.view.inputmethod.InputMethodManager;
 import android.widget.Button;
 import android.widget.RemoteViews;
+import android.widget.SeekBar;
 import android.widget.TextView;
 
 import java.io.BufferedReader;
@@ -70,6 +71,7 @@ public class MainActivity extends AppCompatActivity {
 	private boolean lastpref_rem0t0_hdmiswitch = false;
 	private boolean lastpref_rem0t0_stereo = false;
 	private boolean lastpref_rem0t0_tv = false;
+	private boolean lastpref_rem0t0_esp8266_ac = false;
 
 	// Socket shit fam
 	private boolean coldstart = true;
@@ -98,11 +100,13 @@ public class MainActivity extends AppCompatActivity {
 	private static String txt_hdmiswitch = null;
 	private static String txt_stereo = null;
 	private static String txt_tv = null;
+	private static String txt_esp8266_ac = null;
 	private static String cmdsign = null;
 	private static String cmdprefix_ledstrip = null;
 	private static String cmdprefix_hdmiswitch = null;
 	private static String cmdprefix_stereo = null;
 	private static String cmdprefix_tv = null;
+	private static String cmdprefix_esp8266_ac = null;
 	private static String cmdsuffix_hold = null;
 	private static String cmdsuffix_holdstop = null;
 	private static final int vibems_tap = 50;
@@ -122,6 +126,7 @@ public class MainActivity extends AppCompatActivity {
 	@SuppressLint("UseSparseArrays") static private final Map<Integer, String> demtabs = new HashMap<>();
 	Resources muhres;
 	boolean serverexit = false;
+	private HashMap<String, View> muhviews = new HashMap<>();
 
 	@SuppressLint("CommitPrefEdits")
 	@Override
@@ -148,11 +153,13 @@ public class MainActivity extends AppCompatActivity {
 		txt_hdmiswitch = muhres.getString(R.string.prefs_rem0t0_hdmiswitch);
 		txt_stereo = muhres.getString(R.string.prefs_rem0t0_stereo);
 		txt_tv = muhres.getString(R.string.prefs_rem0t0_tv);
+		txt_esp8266_ac = muhres.getString(R.string.prefs_rem0t0_esp8266_ac);
 		cmdsign = muhres.getString(R.string.rem0t0_cmdsign);
 		cmdprefix_ledstrip = muhres.getString(R.string.rem0t0_cmdprefix_led);
 		cmdprefix_hdmiswitch = muhres.getString(R.string.rem0t0_cmdprefix_hdmi);
 		cmdprefix_stereo = muhres.getString(R.string.rem0t0_cmdprefix_stereo);
 		cmdprefix_tv = muhres.getString(R.string.rem0t0_cmdprefix_tv);
+		cmdprefix_esp8266_ac = muhres.getString(R.string.rem0t0_cmdprefix_esp8266_ac);
 		cmdsuffix_hold = muhres.getString(R.string.rem0t0_cmdsuffix_hold);
 		cmdsuffix_holdstop = muhres.getString(R.string.rem0t0_cmdsuffix_holdstop);
 		ab_col_rip = ContextCompat.getColor(muhctx, R.color.RIP);
@@ -217,6 +224,8 @@ public class MainActivity extends AppCompatActivity {
 		// Tabbed layout y0
 		tabberin0 = findViewById(R.id.tab_layout);
 		viewPager = findViewById(R.id.pager);
+		rebuildTabs();
+
 		viewPager.addOnPageChangeListener(new TabLayout.TabLayoutOnPageChangeListener(tabberin0));
 		tabberin0.addOnTabSelectedListener(new TabLayout.OnTabSelectedListener() {
 			@Override
@@ -276,44 +285,8 @@ public class MainActivity extends AppCompatActivity {
 				connectem();
 		}
 
-		boolean curpref_rem0t0_ledstrip = wrapass.muhprefs.getBoolean("prefs_rem0t0_ledstrip", true);
-		boolean curpref_rem0t0_hdmiswitch = wrapass.muhprefs.getBoolean("prefs_rem0t0_hdmiswitch", true);
-		boolean curpref_rem0t0_stereo = wrapass.muhprefs.getBoolean("prefs_rem0t0_stereo", true);
-		boolean curpref_rem0t0_tv = wrapass.muhprefs.getBoolean("prefs_rem0t0_tv", true);
-		boolean shitchanged = false;
-		if(lastpref_rem0t0_ledstrip != curpref_rem0t0_ledstrip || lastpref_rem0t0_hdmiswitch != curpref_rem0t0_hdmiswitch ||
-				lastpref_rem0t0_stereo != curpref_rem0t0_stereo || lastpref_rem0t0_tv != curpref_rem0t0_tv)
-			shitchanged = true;
-
-		lastpref_rem0t0_ledstrip = curpref_rem0t0_ledstrip;
-		lastpref_rem0t0_hdmiswitch = curpref_rem0t0_hdmiswitch;
-		lastpref_rem0t0_stereo = curpref_rem0t0_stereo;
-		lastpref_rem0t0_tv = curpref_rem0t0_tv;
-
-		if(shitchanged) {
-			// Full (re)build tabbed layout if needed m9
-			int tabnum = 0;
-			tabberin0.removeAllTabs();
-			if(lastpref_rem0t0_ledstrip) {
-				tabberin0.addTab(tabberin0.newTab().setText(txt_ledstrip));
-				demtabs.put(tabnum++, txt_ledstrip);
-			}
-			if(lastpref_rem0t0_hdmiswitch) {
-				tabberin0.addTab(tabberin0.newTab().setText(txt_hdmiswitch));
-				demtabs.put(tabnum++, txt_hdmiswitch);
-			}
-			if(lastpref_rem0t0_stereo) {
-				tabberin0.addTab(tabberin0.newTab().setText(txt_stereo));
-				demtabs.put(tabnum++, txt_stereo);
-			}
-			if(lastpref_rem0t0_tv) {
-				tabberin0.addTab(tabberin0.newTab().setText(txt_tv));
-				demtabs.put(tabnum++, txt_tv);
-			}
-			final PagerAdapter adapter = new rem0t0PagerAdapter(getSupportFragmentManager(), tabnum);
-			viewPager.setAdapter(adapter);
-		}
-
+		// Maybe fully rebuild tabbed layout m9
+		rebuildTabs();
 		super.onResume();
 	}
 
@@ -382,6 +355,19 @@ public class MainActivity extends AppCompatActivity {
 		_dosnackbar(muhres.getString(pm), pl, waserr);
 	}
 
+	public void setRet(String origcmd, String retstr) {
+		if(origcmd == null || retstr == null)
+			return;
+
+		if(muhviews.containsKey(origcmd)) {
+			TextView tv_label = (TextView)muhviews.get(origcmd);
+			tv_label.setText(retstr);
+		}
+
+		// Besides just setting the TextView's value, also show a snaccbar imo tbh
+		doSnackbar("[" + origcmd + "] " + retstr, Snackbar.LENGTH_LONG, false);
+	}
+
 	public void kservShow() {
 		Intent kserv = new Intent(muhctx, rem0t0Service.class);
 		kserv.setAction(wrapass.iaction_shownotif);
@@ -396,6 +382,50 @@ public class MainActivity extends AppCompatActivity {
 		startService(kserv);
 	}
 
+	private void rebuildTabs() {
+		boolean curpref_rem0t0_ledstrip = wrapass.muhprefs.getBoolean("prefs_rem0t0_ledstrip", true);
+		boolean curpref_rem0t0_hdmiswitch = wrapass.muhprefs.getBoolean("prefs_rem0t0_hdmiswitch", true);
+		boolean curpref_rem0t0_stereo = wrapass.muhprefs.getBoolean("prefs_rem0t0_stereo", true);
+		boolean curpref_rem0t0_tv = wrapass.muhprefs.getBoolean("prefs_rem0t0_tv", true);
+		boolean curpref_rem0t0_esp8266_ac = wrapass.muhprefs.getBoolean("prefs_rem0t0_esp8266_ac", true);
+		if(lastpref_rem0t0_ledstrip == curpref_rem0t0_ledstrip && lastpref_rem0t0_hdmiswitch == curpref_rem0t0_hdmiswitch &&
+				lastpref_rem0t0_stereo == curpref_rem0t0_stereo && lastpref_rem0t0_tv == curpref_rem0t0_tv &&
+				lastpref_rem0t0_esp8266_ac == curpref_rem0t0_esp8266_ac)
+			return;
+
+		lastpref_rem0t0_ledstrip = curpref_rem0t0_ledstrip;
+		lastpref_rem0t0_hdmiswitch = curpref_rem0t0_hdmiswitch;
+		lastpref_rem0t0_stereo = curpref_rem0t0_stereo;
+		lastpref_rem0t0_tv = curpref_rem0t0_tv;
+		lastpref_rem0t0_esp8266_ac = curpref_rem0t0_esp8266_ac;
+
+		int tabnum = 0;
+		tabberin0.removeAllTabs();
+		demtabs.clear();
+		if(lastpref_rem0t0_ledstrip) {
+			tabberin0.addTab(tabberin0.newTab().setText(txt_ledstrip));
+			demtabs.put(tabnum++, txt_ledstrip);
+		}
+		if(lastpref_rem0t0_hdmiswitch) {
+			tabberin0.addTab(tabberin0.newTab().setText(txt_hdmiswitch));
+			demtabs.put(tabnum++, txt_hdmiswitch);
+		}
+		if(lastpref_rem0t0_stereo) {
+			tabberin0.addTab(tabberin0.newTab().setText(txt_stereo));
+			demtabs.put(tabnum++, txt_stereo);
+		}
+		if(lastpref_rem0t0_tv) {
+			tabberin0.addTab(tabberin0.newTab().setText(txt_tv));
+			demtabs.put(tabnum++, txt_tv);
+		}
+		if(lastpref_rem0t0_esp8266_ac) {
+			tabberin0.addTab(tabberin0.newTab().setText(txt_esp8266_ac));
+			demtabs.put(tabnum++, txt_esp8266_ac);
+		}
+		final PagerAdapter adapter = new rem0t0PagerAdapter(getSupportFragmentManager(), tabnum);
+		viewPager.setAdapter(adapter);
+	}
+
 	// Connects to the "API" imo tbh fam
 	private void connectem() {
 		connecting = true;
@@ -512,6 +542,10 @@ public class MainActivity extends AppCompatActivity {
 					layout_id = R.layout.rem0t0_tv;
 					cmdbase = cmdprefix_tv;
 				}
+				else if(txt.equals(txt_esp8266_ac)) {
+					layout_id = R.layout.rem0t0_esp8266_ac;
+					cmdbase = cmdprefix_esp8266_ac;
+				}
 			} catch(Exception fuckoff) { /* No flying fucks given */ }
 
 			muhmain = (MainActivity)getActivity();
@@ -531,14 +565,32 @@ public class MainActivity extends AppCompatActivity {
 			String cmdbase_signed = cmdsign + cmdbase;
 			for(int i = 0; i < rewt.getChildCount(); i++) {
 				View v = rewt.getChildAt(i);
+
 				if(v instanceof Button)
 					v.setOnTouchListener(new rem0t0TouchListener(pos, cmdbase_signed));
-				if(v instanceof TextView) {
+
+				else if(v instanceof SeekBar) {
+					final SeekBar sb = (SeekBar)v;
+					ViewGroup rewt_tmp;
+					for(rewt_tmp = rewt; rewt_tmp != null; rewt_tmp = (ViewGroup)rewt_tmp.getParent()) {
+						final View sb_label = rewt_tmp.findViewById(R.id.sb_label_servo_rotate);
+						if(sb_label != null)
+							sb.setOnSeekBarChangeListener(new rem0t0TouchListener_SeekBar(sb, cmdbase_signed, sb_label));
+					}
+				}
+
+				else if(v instanceof TextView) {
 					final TextView tv = (TextView)v;
 					Object muhtag = tv.getTag();
 					if(muhtag == null)
 						continue;
-					final String n0pref_name = "n0pref_" + cmdbase + "_" + muhtag.toString();
+
+					// Certain commands may return a value, so store the TextView to hold that value ;]
+					String muhtag_str = muhtag.toString();
+					if(muhtag_str.equals("read_temp"))
+						muhmain.muhviews.put(muhtag_str, v);
+
+					final String n0pref_name = "n0pref_" + cmdbase + "_" + muhtag_str;
 					String curtxt = wrapass.muhprefs.getString(n0pref_name, null);
 					if(curtxt != null)
 						tv.setText(curtxt);
@@ -558,10 +610,12 @@ public class MainActivity extends AppCompatActivity {
 						}
 					});
 				}
+
 				else if(v instanceof ViewGroup) {
 					v.setOnTouchListener(dismissem);
 					setViewPropsRec(dismissem, (ViewGroup)v, pos, cmdbase);
 				}
+
 				else {
 					v.setOnTouchListener(dismissem);
 				}
@@ -706,6 +760,58 @@ public class MainActivity extends AppCompatActivity {
 				return false;
 			}
 		}
+
+		private class rem0t0TouchListener_SeekBar implements SeekBar.OnSeekBarChangeListener {
+			private final String cmdbase;
+			private int sb_pos;
+			private int sb_last;
+			private TextView sb_label;
+
+			private Vibrator vib0;
+
+			rem0t0TouchListener_SeekBar(SeekBar sb, String cb, View sl) {
+				muhmain = (MainActivity)getActivity();
+				try {
+					//noinspection ConstantConditions
+					vib0 = (Vibrator)muhmain.getSystemService(VIBRATOR_SERVICE);
+				}
+				catch(Exception fuckoff) {
+					if(muhmain != null) // Silences the goddamn warning about hurrrr durrr possible null pointer exception
+						muhmain.doSnackbar("Unable to get vibrator service kek", Snackbar.LENGTH_INDEFINITE, true);
+				}
+				cmdbase = cb;
+				sb_label = (TextView)sl;
+
+				sb_pos = sb_last = wrapass.muhprefs.getInt("lastval_esp8266_ac_servo_rotate", 1500);
+				sb.setProgress(sb_pos);
+				sb_label.setText(String.valueOf(sb_last));
+			}
+
+			@Override
+			public void onStopTrackingTouch(SeekBar v) {
+				final String cmd = v.getTag().toString();
+				final String rotatem = String.valueOf(v.getProgress());
+				if(sb_pos != sb_last) {
+					if(vib0 != null && wrapass.muhprefs.getBoolean("prefs_rem0t0_haptic", true))
+						vib0.vibrate(vibems_tap);
+					v.performClick();
+					muhmain.muhcmds.add(cmdbase + " " + cmd + " " + rotatem);
+				}
+			}
+
+			@Override
+			public void onStartTrackingTouch(SeekBar seekBar) {
+				sb_last = seekBar.getProgress();
+			}
+
+			@Override
+			public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
+				sb_pos = progress;
+				wrapass.muhprefs_ed.putInt("lastval_esp8266_ac_servo_rotate", progress);
+				wrapass.muhprefs_ed.apply();
+				sb_label.setText(String.valueOf(progress));
+			}
+		}
 	}
 
 	// Custom AnyTrust class to just trust everything

+ 19 - 0
app/src/app_rem0t0/src/main/java/com/jemoeder/lief/rem0t0/muhReceiver.java

@@ -5,6 +5,8 @@ import android.os.AsyncTask;
 import android.support.design.widget.Snackbar;
 
 import java.net.SocketTimeoutException;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
 
 // Receiver thread lol, logic is mostly the same as for the sender ;];];]
 @SuppressLint("StaticFieldLeak")
@@ -26,6 +28,8 @@ class muhReceiver extends AsyncTask<Void, Void, Void> {
 
 	@Override
 	protected Void doInBackground(Void... arg0) {
+		Pattern retstr_pattern = Pattern.compile("^\\[RET: ([^\\]]+)\\] (.+)");
+
 		while(muhmain.muhsock != null) {
 			// Let's poll every 100ms with a max polling time of 100ms to prevent using too many CPU cycles
 			try { Thread.sleep(100); } catch(Exception fuckoff) { /* No flying fucks given */ }
@@ -53,6 +57,12 @@ class muhReceiver extends AsyncTask<Void, Void, Void> {
 					// The snackbar with "Sending: !cmd" is probs still in view, so give it some time to be properly animated
 					try { Thread.sleep(500); } catch(Exception fuckoff) { /* No flying fucks given */ }
 
+					Matcher retstr_matcher = retstr_pattern.matcher(muhdata);
+					if(retstr_matcher.find()) {
+						doMainSetRet(retstr_matcher.group(1), retstr_matcher.group(2));
+						continue;
+					}
+
 					// The error should fit in a snackbar lel
 					// Also use GUCCI status text but c0l0ur em red, since we still connected ;];];];]
 					muhdata = muhdata.replaceAll("[\r\n]+", " -- ");
@@ -113,4 +123,13 @@ class muhReceiver extends AsyncTask<Void, Void, Void> {
 			}
 		});
 	}
+
+	private void doMainSetRet(final String origcmd, final String retstr) {
+		muhmain.runOnUiThread(new Runnable() {
+			@Override
+			public void run() {
+				muhmain.setRet(origcmd, retstr);
+			}
+		});
+	}
 }

BIN
app/src/app_rem0t0/src/main/res/drawable-hdpi/ic_rem0t0_sleep.png


BIN
app/src/app_rem0t0/src/main/res/drawable-mdpi/ic_rem0t0_sleep.png


BIN
app/src/app_rem0t0/src/main/res/drawable-xhdpi/ic_rem0t0_sleep.png


BIN
app/src/app_rem0t0/src/main/res/drawable-xxhdpi/ic_rem0t0_sleep.png


BIN
app/src/app_rem0t0/src/main/res/drawable-xxxhdpi/ic_rem0t0_sleep.png


+ 61 - 0
app/src/app_rem0t0/src/main/res/drawable/drw_rem0t0_seekbar.xml

@@ -0,0 +1,61 @@
+<?xml version="1.0" encoding="utf-8"?>
+<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
+	<!-- Premium seekbar styling ;];]]; -->
+	<item>
+		<shape
+			android:shape="rectangle">
+			<corners android:radius="@dimen/rem0t0_seekbar_thiccness" />
+			<stroke
+				android:color="@color/rem0t0_seekbar_bgfill"
+				android:width="@dimen/rem0t0_seekbar_thiccness" />
+		</shape>
+	</item>
+	<item>
+		<shape android:shape="rectangle">
+			<corners android:radius="@dimen/rem0t0_seekbar_stroke_radius" />
+			<stroke android:color="@color/rem0t0_btn_stroke" android:width="@dimen/rem0t0_btn_stroke" />
+		</shape>
+	</item>
+	<item
+		android:top="@dimen/rem0t0_btn_stroke"
+		android:bottom="@dimen/rem0t0_btn_stroke"
+		android:left="@dimen/rem0t0_btn_stroke"
+		android:right="@dimen/rem0t0_btn_stroke">
+		<shape android:shape="rectangle">
+			<corners android:radius="@dimen/rem0t0_seekbar_stroke_radius" />
+			<stroke android:color="@color/rem0t0_btn_stroke_dark" android:width="@dimen/rem0t0_btn_stroke" />
+		</shape>
+	</item>
+
+	<item android:id="@android:id/background">
+		<shape
+			android:shape="line">
+			<stroke
+				android:color="@color/rem0t0_led_btntxt"
+				android:width="@dimen/rem0t0_seekbar_thiccness" />
+		</shape>
+	</item>
+
+	<item android:id="@android:id/progress">
+		<clip>
+			<shape
+				android:shape="line">
+				<stroke
+					android:color="@color/rem0t0_seekbar_progress"
+					android:width="@dimen/rem0t0_seekbar_thiccness" />
+			</shape>
+		</clip>
+	</item>
+
+	<!-- Not entirely sure wtf this is supposed to be, but it's required afaik so ye =] -->
+	<item android:id="@android:id/secondaryProgress">
+		<clip>
+			<shape
+				android:shape="line">
+				<stroke
+					android:color="@color/rem0t0_seekbar_progress2"
+					android:width="@dimen/rem0t0_seekbar_thiccness" />
+			</shape>
+		</clip>
+	</item>
+</layer-list>

+ 13 - 0
app/src/app_rem0t0/src/main/res/drawable/drw_rem0t0_seekbar_thumb.xml

@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="utf-8"?>
+<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
+	<!-- Styles of the seekbar thumb has to be a different file apparently -->
+	<item>
+		<shape xmlns:android="http://schemas.android.com/apk/res/android"
+			android:shape="oval">
+			<size
+				android:height="@dimen/rem0t0_seekbar_thumbsize"
+				android:width="@dimen/rem0t0_seekbar_thumbsize" />
+			<solid android:color="@color/rem0t0_seekbar_thumb"/>
+		</shape>
+	</item>
+</layer-list>

+ 7 - 0
app/src/app_rem0t0/src/main/res/drawable/drw_rem0t0_sleep.xml

@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8"?>
+<layer-list xmlns:android="http://schemas.android.com/apk/res/android" >
+	<item
+		android:drawable="@drawable/ic_rem0t0_sleep"
+		android:width="@dimen/rem0t0_btn_iconsize"
+		android:height="@dimen/rem0t0_btn_iconsize" />
+</layer-list >

+ 355 - 0
app/src/app_rem0t0/src/main/res/layout/rem0t0_esp8266_ac.xml

@@ -0,0 +1,355 @@
+<?xml version="1.0" encoding="utf-8"?>
+<android.support.design.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"
+	xmlns:app="http://schemas.android.com/apk/res-auto"
+	xmlns:tools="http://schemas.android.com/tools"
+	android:layout_width="match_parent"
+	android:layout_height="match_parent"
+	android:id="@+id/muhparent_esp8266_ac">
+
+	<ScrollView
+		android:layout_width="match_parent"
+		android:layout_height="match_parent">
+
+		<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
+			android:layout_width="wrap_content"
+			android:layout_height="wrap_content"
+			android:layout_gravity="center_horizontal"
+			android:layout_marginTop="@dimen/rem0t0_top_margin"
+			xmlns:app="http://schemas.android.com/apk/res-auto">
+
+			<android.support.constraint.ConstraintLayout
+				android:id="@+id/btngroup_read_temp"
+				android:layout_width="0dp"
+				android:layout_height="wrap_content"
+				android:foreground="@drawable/roundcorners"
+				android:background="@drawable/roundcorners"
+				android:backgroundTint="@color/rem0t0_esp8266_ac_btngroup"
+				android:layout_marginTop="@dimen/rem0t0_esp8266_ac_read_temp_offset_top"
+				app:layout_constraintTop_toTopOf="parent"
+				app:layout_constraintStart_toStartOf="parent"
+				app:layout_constraintEnd_toEndOf="@id/btngroup_servo"
+				android:padding="@dimen/rem0t0_btngroup_withlabel_padding">
+
+				<TextView
+					android:id="@+id/grouplabel_read_temp"
+					android:layout_width="wrap_content"
+					android:layout_height="wrap_content"
+					android:textAllCaps="false"
+					android:textColor="@color/rem0t0_grouplabel_txt"
+					android:textSize="@dimen/rem0t0_grouplabel_txtsize"
+					android:textStyle="bold"
+					android:text="@string/rem0t0btn_esp8266_ac_grouplabel_read_temp"
+					android:layout_marginTop="@dimen/rem0t0_grouplabel_margin"
+					app:layout_constraintStart_toStartOf="parent"
+					app:layout_constraintEnd_toEndOf="parent" />
+
+				<Button
+					android:id="@+id/btn_read_temp"
+					android:tag="read_temp"
+					android:layout_width="@dimen/rem0t0_btn_size"
+					android:layout_height="@dimen/rem0t0_btn_size"
+					android:background="@drawable/roundcorners"
+					android:backgroundTint="@color/rem0t0_esp8266_ac_btn"
+					android:foreground="@drawable/roundcorners"
+					android:padding="@dimen/rem0t0_btn_txtpadding"
+					android:textColor="@color/rem0t0_esp8266_ac_btntxt"
+					android:textAllCaps="false"
+					android:textSize="@dimen/rem0t0_btn_txtsize"
+					android:text="@string/rem0t0btn_esp8266_ac_read_temp"
+					android:layout_marginTop="@dimen/rem0t0_grouplabel_margin"
+					app:layout_constraintTop_toBottomOf="@id/grouplabel_read_temp"
+					app:layout_constraintStart_toStartOf="parent" />
+
+				<TextView
+					android:id="@+id/btn_label_read_temp"
+					android:tag="read_temp"
+					android:layout_width="wrap_content"
+					android:layout_height="wrap_content"
+					android:textColor="@color/rem0t0_grouplabel_txt"
+					android:textSize="@dimen/rem0t0_esp8266_ac_servo_rotate_labeltxt"
+					android:text="0.00"
+					android:layout_marginTop="@dimen/rem0t0_btn_margin"
+					android:layout_marginStart="@dimen/rem0t0_btn_margin"
+					app:layout_constraintTop_toTopOf="@id/btn_read_temp"
+					app:layout_constraintStart_toEndOf="@id/btn_read_temp"
+					tools:ignore="HardcodedText" />
+			</android.support.constraint.ConstraintLayout>
+
+
+			<android.support.constraint.ConstraintLayout
+				android:id="@+id/btngroup_servo"
+				android:layout_width="wrap_content"
+				android:layout_height="wrap_content"
+				android:foreground="@drawable/roundcorners"
+				android:background="@drawable/roundcorners"
+				android:backgroundTint="@color/rem0t0_esp8266_ac_btngroup"
+				android:layout_marginTop="@dimen/rem0t0_btn_margin"
+				app:layout_constraintTop_toBottomOf="@id/btngroup_read_temp"
+				app:layout_constraintStart_toStartOf="@id/btngroup_read_temp"
+				android:padding="@dimen/rem0t0_btngroup_withlabel_padding">
+
+				<TextView
+					android:id="@+id/grouplabel_servo"
+					android:layout_width="wrap_content"
+					android:layout_height="wrap_content"
+					android:textAllCaps="false"
+					android:textColor="@color/rem0t0_grouplabel_txt"
+					android:textSize="@dimen/rem0t0_grouplabel_txtsize"
+					android:textStyle="bold"
+					android:text="@string/rem0t0btn_esp8266_ac_grouplabel_servo"
+					app:layout_constraintStart_toStartOf="parent"
+					app:layout_constraintEnd_toEndOf="parent" />
+
+				<android.support.constraint.ConstraintLayout
+					android:id="@+id/sb_servo_rotate_container"
+					android:layout_width="0dp"
+					android:layout_height="match_parent"
+					android:layout_marginTop="@dimen/rem0t0_grouplabel_margin"
+					app:layout_constraintTop_toBottomOf="@id/grouplabel_servo"
+					app:layout_constraintStart_toStartOf="parent"
+					app:layout_constraintEnd_toEndOf="parent">
+
+					<SeekBar
+						android:id="@+id/sb_servo_rotate"
+						android:tag="servo_rotate"
+						android:layout_width="match_parent"
+						android:layout_height="30dp"
+						android:max="3000"
+						android:progress="1500"
+						android:progressDrawable="@drawable/drw_rem0t0_seekbar"
+						android:thumb="@drawable/drw_rem0t0_seekbar_thumb"
+						android:splitTrack="false" />
+				</android.support.constraint.ConstraintLayout>
+
+				<!-- The android:text value for this shit should match the android:progress value of em SeekBar ;] -->
+				<TextView
+					android:id="@+id/sb_label_servo_rotate"
+					android:layout_width="wrap_content"
+					android:layout_height="wrap_content"
+					android:textColor="@color/rem0t0_grouplabel_txt"
+					android:textSize="@dimen/rem0t0_esp8266_ac_servo_rotate_labeltxt"
+					android:text="1500"
+					app:layout_constraintTop_toBottomOf="@id/sb_servo_rotate_container"
+					app:layout_constraintStart_toStartOf="@id/sb_servo_rotate_container"
+					app:layout_constraintEnd_toEndOf="@id/sb_servo_rotate_container"
+					tools:ignore="HardcodedText" />
+
+				<Button
+					android:id="@+id/btn_servo_reset"
+					android:tag="servo_reset"
+					android:layout_width="@dimen/rem0t0_btn_size"
+					android:layout_height="@dimen/rem0t0_btn_size"
+					android:background="@drawable/roundcorners"
+					android:backgroundTint="@color/rem0t0_esp8266_ac_btn"
+					android:foreground="@drawable/roundcorners"
+					android:padding="@dimen/rem0t0_btn_txtpadding"
+					android:textColor="@color/rem0t0_esp8266_ac_btntxt"
+					android:textAllCaps="false"
+					android:textSize="@dimen/rem0t0_btn_txtsize"
+					android:text="@string/rem0t0btn_esp8266_ac_servo_reset"
+					android:layout_marginTop="@dimen/rem0t0_btngroup_margin"
+					app:layout_constraintTop_toBottomOf="@id/sb_label_servo_rotate"
+					app:layout_constraintStart_toStartOf="parent" />
+
+				<Button
+					android:id="@+id/btn_servo_acbutton"
+					android:tag="servo_acbutton"
+					android:layout_width="@dimen/rem0t0_btn_size"
+					android:layout_height="@dimen/rem0t0_btn_size"
+					android:background="@drawable/roundcorners"
+					android:backgroundTint="@color/rem0t0_esp8266_ac_btn"
+					android:foreground="@drawable/roundcorners"
+					android:padding="@dimen/rem0t0_btn_txtpadding"
+					android:textColor="@color/rem0t0_esp8266_ac_btntxt"
+					android:textAllCaps="false"
+					android:textSize="@dimen/rem0t0_btn_txtsize"
+					android:text="@string/rem0t0btn_esp8266_ac_servo_acbutton"
+					android:layout_marginStart="@dimen/rem0t0_btn_margin"
+					app:layout_constraintTop_toTopOf="@id/btn_servo_reset"
+					app:layout_constraintStart_toEndOf="@id/btn_servo_reset" />
+			</android.support.constraint.ConstraintLayout>
+
+
+			<Button
+				android:id="@+id/btn_deepsleep"
+				android:tag="deepsleep"
+				android:layout_width="@dimen/rem0t0_btn_size"
+				android:layout_height="@dimen/rem0t0_btn_size"
+				android:drawableStart="@drawable/drw_rem0t0_sleep"
+				android:drawablePadding="@dimen/rem0t0_btn_iconpadding"
+				android:paddingStart="@dimen/rem0t0_btn_iconpadding"
+				android:background="@drawable/roundcorners"
+				android:backgroundTint="@color/rem0t0_esp8266_ac_power"
+				android:foreground="@drawable/roundcorners"
+				android:layout_marginStart="@dimen/rem0t0_btn_margin"
+				app:layout_constraintTop_toTopOf="parent"
+				app:layout_constraintStart_toEndOf="@id/btngroup_servo"
+				tools:ignore="RtlSymmetry" />
+
+			<Button
+				android:id="@+id/btn_reboot"
+				android:tag="reboot"
+				android:layout_width="@dimen/rem0t0_btn_size"
+				android:layout_height="@dimen/rem0t0_btn_size"
+				android:drawableStart="@drawable/drw_rem0t0_power"
+				android:drawablePadding="@dimen/rem0t0_btn_iconpadding"
+				android:paddingStart="@dimen/rem0t0_btn_iconpadding"
+				android:background="@drawable/roundcorners"
+				android:backgroundTint="@color/rem0t0_esp8266_ac_power"
+				android:foreground="@drawable/roundcorners"
+				android:layout_marginStart="@dimen/rem0t0_btn_margin"
+				app:layout_constraintTop_toTopOf="@id/btn_deepsleep"
+				app:layout_constraintStart_toEndOf="@id/btn_deepsleep"
+				tools:ignore="RtlSymmetry" />
+
+
+			<android.support.constraint.ConstraintLayout
+				android:id="@+id/btngroup_led_onboard"
+				android:layout_width="wrap_content"
+				android:layout_height="wrap_content"
+				android:layout_marginTop="@dimen/rem0t0_btn_margin"
+				app:layout_constraintTop_toBottomOf="@id/btn_reboot"
+				app:layout_constraintEnd_toEndOf="@id/btn_reboot">
+
+				<Button
+					android:id="@+id/btn_led_onboard"
+					android:tag="led_onboard on"
+					android:layout_width="@dimen/rem0t0_btn_size"
+					android:layout_height="@dimen/rem0t0_btn_size"
+					android:background="@drawable/roundcorners"
+					android:backgroundTint="@color/rem0t0_esp8266_ac_led_onboard"
+					android:foreground="@drawable/roundcorners" />
+
+				<Button
+					android:id="@+id/btn_led_onboard_off"
+					android:tag="led_onboard off"
+					android:layout_width="@dimen/rem0t0_btn_size"
+					android:layout_height="@dimen/rem0t0_btn_size"
+					android:background="@drawable/roundcorners"
+					android:backgroundTint="@color/rem0t0_esp8266_ac_btn"
+					android:foreground="@drawable/roundcorners"
+					android:textColor="@color/rem0t0_esp8266_ac_btntxt"
+					android:textAllCaps="false"
+					android:textSize="@dimen/rem0t0_btn_txtsize"
+					android:text="@string/rem0t0btn_esp8266_ac_led_off"
+					android:layout_marginStart="@dimen/rem0t0_btn_margin"
+					app:layout_constraintTop_toTopOf="@id/btn_led_onboard"
+					app:layout_constraintStart_toEndOf="@id/btn_led_onboard" />
+			</android.support.constraint.ConstraintLayout>
+
+
+			<android.support.constraint.ConstraintLayout
+				android:id="@+id/btngroup_led_flasher"
+				android:layout_width="wrap_content"
+				android:layout_height="wrap_content"
+				android:layout_marginTop="@dimen/rem0t0_btn_margin"
+				app:layout_constraintTop_toBottomOf="@id/btngroup_led_onboard"
+				app:layout_constraintStart_toStartOf="@id/btngroup_led_onboard">
+
+				<Button
+					android:id="@+id/btn_led_flasher"
+					android:tag="led_flasher on"
+					android:layout_width="@dimen/rem0t0_btn_size"
+					android:layout_height="@dimen/rem0t0_btn_size"
+					android:background="@drawable/roundcorners"
+					android:backgroundTint="@color/rem0t0_esp8266_ac_led_flasher"
+					android:foreground="@drawable/roundcorners" />
+
+				<Button
+					android:id="@+id/btn_led_flasher_off"
+					android:tag="led_flasher off"
+					android:layout_width="@dimen/rem0t0_btn_size"
+					android:layout_height="@dimen/rem0t0_btn_size"
+					android:background="@drawable/roundcorners"
+					android:backgroundTint="@color/rem0t0_esp8266_ac_btn"
+					android:foreground="@drawable/roundcorners"
+					android:textColor="@color/rem0t0_esp8266_ac_btntxt"
+					android:textAllCaps="false"
+					android:textSize="@dimen/rem0t0_btn_txtsize"
+					android:text="@string/rem0t0btn_esp8266_ac_led_off"
+					android:layout_marginStart="@dimen/rem0t0_btn_margin"
+					app:layout_constraintTop_toTopOf="@id/btn_led_flasher"
+					app:layout_constraintStart_toEndOf="@id/btn_led_flasher" />
+			</android.support.constraint.ConstraintLayout>
+
+
+			<android.support.constraint.ConstraintLayout
+				android:id="@+id/btngroup_led_error"
+				android:layout_width="wrap_content"
+				android:layout_height="wrap_content"
+				android:layout_marginTop="@dimen/rem0t0_btn_margin"
+				app:layout_constraintTop_toBottomOf="@id/btngroup_led_flasher"
+				app:layout_constraintStart_toStartOf="@id/btngroup_led_flasher">
+
+				<Button
+					android:id="@+id/btn_led_error"
+					android:tag="led_error on"
+					android:layout_width="@dimen/rem0t0_btn_size"
+					android:layout_height="@dimen/rem0t0_btn_size"
+					android:background="@drawable/roundcorners"
+					android:backgroundTint="@color/rem0t0_esp8266_ac_led_error"
+					android:foreground="@drawable/roundcorners" />
+
+				<Button
+					android:id="@+id/btn_led_error_off"
+					android:tag="led_error off"
+					android:layout_width="@dimen/rem0t0_btn_size"
+					android:layout_height="@dimen/rem0t0_btn_size"
+					android:background="@drawable/roundcorners"
+					android:backgroundTint="@color/rem0t0_esp8266_ac_btn"
+					android:foreground="@drawable/roundcorners"
+					android:textColor="@color/rem0t0_esp8266_ac_btntxt"
+					android:textAllCaps="false"
+					android:textSize="@dimen/rem0t0_btn_txtsize"
+					android:text="@string/rem0t0btn_esp8266_ac_led_off"
+					android:layout_marginStart="@dimen/rem0t0_btn_margin"
+					app:layout_constraintTop_toTopOf="@id/btn_led_error"
+					app:layout_constraintStart_toEndOf="@id/btn_led_error" />
+			</android.support.constraint.ConstraintLayout>
+
+
+			<android.support.constraint.ConstraintLayout
+				android:id="@+id/btngroup_led_http"
+				android:layout_width="wrap_content"
+				android:layout_height="wrap_content"
+				android:layout_marginTop="@dimen/rem0t0_btn_margin"
+				app:layout_constraintTop_toBottomOf="@id/btngroup_led_error"
+				app:layout_constraintStart_toStartOf="@id/btngroup_led_flasher">
+
+				<Button
+					android:id="@+id/btn_led_http"
+					android:tag="led_http on"
+					android:layout_width="@dimen/rem0t0_btn_size"
+					android:layout_height="@dimen/rem0t0_btn_size"
+					android:background="@drawable/roundcorners"
+					android:backgroundTint="@color/rem0t0_esp8266_ac_led_http"
+					android:foreground="@drawable/roundcorners" />
+
+				<Button
+					android:id="@+id/btn_led_http_off"
+					android:tag="led_http off"
+					android:layout_width="@dimen/rem0t0_btn_size"
+					android:layout_height="@dimen/rem0t0_btn_size"
+					android:background="@drawable/roundcorners"
+					android:backgroundTint="@color/rem0t0_esp8266_ac_btn"
+					android:foreground="@drawable/roundcorners"
+					android:textColor="@color/rem0t0_esp8266_ac_btntxt"
+					android:textAllCaps="false"
+					android:textSize="@dimen/rem0t0_btn_txtsize"
+					android:text="@string/rem0t0btn_esp8266_ac_led_off"
+					android:layout_marginStart="@dimen/rem0t0_btn_margin"
+					app:layout_constraintTop_toTopOf="@id/btn_led_http"
+					app:layout_constraintStart_toEndOf="@id/btn_led_http" />
+			</android.support.constraint.ConstraintLayout>
+
+
+			<!-- Some padding because the ScrollView is kinda gay =] -->
+			<View
+				android:layout_width="1dp"
+				android:layout_height="@dimen/rem0t0_bottom_padding"
+				android:layout_marginTop="@dimen/rem0t0_bottom_padding"
+				app:layout_constraintTop_toBottomOf="@id/btngroup_led_http"
+				app:layout_constraintStart_toStartOf="parent" />
+		</android.support.constraint.ConstraintLayout>
+	</ScrollView>
+</android.support.design.widget.CoordinatorLayout>

+ 21 - 3
app/src/app_rem0t0/src/main/res/values/colors.xml

@@ -15,6 +15,12 @@
 	<!-- Other text related shit 0bv -->
 	<color name="text_prefheader">@color/colorAccent</color>
 
+	!-- We also hav cust0m stylin for seekbars ;];] -->
+	<color name="rem0t0_seekbar_thumb">@color/colorAccent</color>
+	<color name="rem0t0_seekbar_progressback">#ABABAB</color>
+	<color name="rem0t0_seekbar_progress">@color/gucci</color>
+	<color name="rem0t0_seekbar_progress2">@color/RIP</color>
+
 	<!-- As well as Snackbar notification popups -->
 	<color name="snackbar_background">@color/colorPrimary</color>
 	<color name="snackbar_background_err">#6B0000</color>
@@ -25,6 +31,8 @@
 	<color name="rem0t0_btn_stroke">#EDF1F2</color>
 	<color name="rem0t0_btn_stroke_dark">#000000</color>
 	<color name="rem0t0_grouplabel_txt">@color/colorText</color>
+	<color name="rem0t0_btn">#818F99</color>
+	<color name="rem0t0_seekbar_bgfill">@color/rem0t0_btn</color>
 
 	<!-- LED only shit -->
 	<color name="rem0t0_led_btntxt">@color/colorText</color>
@@ -62,11 +70,11 @@
 	<color name="rem0t0_led_rgbflash">#8D9FAC</color>
 
 	<!-- HDMI only shit -->
-	<color name="rem0t0_hdmi_btn">#818F99</color>
+	<color name="rem0t0_hdmi_btn">@color/rem0t0_btn</color>
 	<color name="rem0t0_hdmi_btntxt">@color/rem0t0_led_btntxt</color>
 
 	<!-- Stereo -->
-	<color name="rem0t0_stereo_btn">@color/rem0t0_hdmi_btn</color>
+	<color name="rem0t0_stereo_btn">@color/rem0t0_btn</color>
 	<color name="rem0t0_stereo_btntxt">@color/rem0t0_led_btntxt</color>
 	<color name="rem0t0_stereo_btngroup">@color/rem0t0_led_btngroup</color>
 
@@ -75,7 +83,7 @@
 	<color name="rem0t0_stereo_down">@color/rem0t0_led_btntxt</color>
 
 	<!-- TV lol -->
-	<color name="rem0t0_tv_btn">@color/rem0t0_stereo_btn</color>
+	<color name="rem0t0_tv_btn">@color/rem0t0_btn</color>
 	<color name="rem0t0_tv_btntxt">@color/rem0t0_led_btntxt</color>
 	<color name="rem0t0_tv_btngroup">@color/rem0t0_led_btngroup</color>
 
@@ -88,4 +96,14 @@
 	<color name="rem0t0_tv_b">@color/rem0t0_led_green</color>
 	<color name="rem0t0_tv_c">@color/rem0t0_led_red2</color>
 	<color name="rem0t0_tv_d">@color/rem0t0_led_blue</color>
+
+	<!-- esp8266-ac imo tbh -->
+	<color name="rem0t0_esp8266_ac_btngroup">@color/rem0t0_led_btngroup</color>
+	<color name="rem0t0_esp8266_ac_btn">@color/rem0t0_btn</color>
+	<color name="rem0t0_esp8266_ac_btntxt">@color/rem0t0_led_btntxt</color>
+	<color name="rem0t0_esp8266_ac_power">@color/rem0t0_led_poweron</color>
+	<color name="rem0t0_esp8266_ac_led_onboard">@color/rem0t0_led_blue</color>
+	<color name="rem0t0_esp8266_ac_led_flasher">@color/rem0t0_led_green</color>
+	<color name="rem0t0_esp8266_ac_led_error">@color/rem0t0_led_red</color>
+	<color name="rem0t0_esp8266_ac_led_http">@color/rem0t0_led_red5</color>
 </resources>

+ 13 - 0
app/src/app_rem0t0/src/main/res/values/dimens.xml

@@ -22,6 +22,11 @@
 	<dimen name="rem0t0_top_margin">18dp</dimen>
 	<dimen name="rem0t0_bottom_padding">18dp</dimen>
 
+	<!-- Some default dimensions for some widgets -->
+	<dimen name="rem0t0_seekbar_thiccness">6dp</dimen>
+	<dimen name="rem0t0_seekbar_thumbsize">22dp</dimen>
+	<dimen name="rem0t0_seekbar_stroke_radius">4dp</dimen>
+
 	<!-- Some shit for all rem0tes -->
 	<dimen name="rem0t0_btn_cornerradius">50dp</dimen>
 	<dimen name="rem0t0_btn_stroke">1dp</dimen>
@@ -51,4 +56,12 @@
 
 	<!-- TV lol -->
 	<dimen name="rem0t0_tv_menu_margin">50dp</dimen>
+
+	<!-- esp8266-ac imo tbh -->
+	<dimen name="rem0t0_esp8266_ac_group_margin">45dp</dimen>
+	<dimen name="rem0t0_esp8266_ac_read_temp_offset_top">48dp</dimen>
+	<dimen name="rem0t0_esp8266_ac_servo_rotate_desctxt">18sp</dimen>
+	<dimen name="rem0t0_esp8266_ac_servo_rotate_desctxt_margin">25dp</dimen>
+	<dimen name="rem0t0_esp8266_ac_servo_rotate_margin">20dp</dimen>
+	<dimen name="rem0t0_esp8266_ac_servo_rotate_labeltxt">12sp</dimen>
 </resources>

+ 12 - 2
app/src/app_rem0t0/src/main/res/values/strings.xml

@@ -33,6 +33,7 @@
 	<string name="prefs_rem0t0_hdmiswitch">HDMI Switch</string>
 	<string name="prefs_rem0t0_stereo">Stereo t0wer</string>
 	<string name="prefs_rem0t0_tv">TV</string>
+	<string name="prefs_rem0t0_esp8266_ac">ESP8266-AC</string>
 
 	<!-- (Error) description texts for snackbars yo -->
 	<string name="main_status_errtxt_key">Invalid key length</string>
@@ -49,12 +50,13 @@
 
 	<!-- Command pre/suffixes m9 -->
 	<string name="rem0t0_cmdsign">!</string>
-	<string name="rem0t0_cmdsuffix_hold">cont</string>
-	<string name="rem0t0_cmdsuffix_holdstop">stop</string>
+	<string name="rem0t0_cmdsuffix_hold">_cont</string>
+	<string name="rem0t0_cmdsuffix_holdstop">_stop</string>
 	<string name="rem0t0_cmdprefix_led">led</string>
 	<string name="rem0t0_cmdprefix_hdmi">hdmi</string>
 	<string name="rem0t0_cmdprefix_stereo">stereo</string>
 	<string name="rem0t0_cmdprefix_tv">tv</string>
+	<string name="rem0t0_cmdprefix_esp8266_ac">esp8266_ac</string>
 
 	<!-- Button/view texts for em rem0tes -->
 	<!-- LED y0 -->
@@ -149,4 +151,12 @@
 	<string name="rem0t0btn_tv_pip">PIP</string>
 	<string name="rem0t0btn_tv_psize">Picture Size</string>
 	<string name="rem0t0btn_tv_ad_subt">Ad/Subtitle</string>
+
+	<!-- esp8266-ac imo tbh -->
+	<string name="rem0t0btn_esp8266_ac_grouplabel_read_temp">Temperature</string>
+	<string name="rem0t0btn_esp8266_ac_read_temp">Read Current</string>
+	<string name="rem0t0btn_esp8266_ac_led_off">Off</string>
+	<string name="rem0t0btn_esp8266_ac_servo_reset">Reset</string>
+	<string name="rem0t0btn_esp8266_ac_servo_acbutton">AC Button</string>
+	<string name="rem0t0btn_esp8266_ac_grouplabel_servo">Rotate Serv0</string>
 </resources>

+ 5 - 0
app/src/app_rem0t0/src/main/res/xml/preferences.xml

@@ -93,6 +93,11 @@
 			android:key="prefs_rem0t0_tv"
 			android:title="@string/prefs_rem0t0_tv"
 			android:defaultValue="true" />
+
+		<CheckBoxPreference
+			android:key="prefs_rem0t0_esp8266_ac"
+			android:title="@string/prefs_rem0t0_esp8266_ac"
+			android:defaultValue="true" />
 	</PreferenceCategory>
 
 	<PreferenceCategory

+ 2 - 2
app/src/app_rem0t0/version.properties

@@ -1,2 +1,2 @@
-#Mon Dec 09 18:22:56 CET 2019
-VERSION_CODE=315
+#Sat Jun 27 19:21:26 CEST 2020
+VERSION_CODE=350

BIN
ass/icinz/ic_rem0t0_sleep.png


BIN
ass/scr0t_esp8266_ac.png