Browse Source

First commit

master
Nero Ignis 5 years ago
parent
commit
3c730f7742
  1. 4
      .idea/deployment.xml
  2. 9
      .idea/html.iml
  3. 6
      .idea/jsLibraryMappings.xml
  4. 8
      .idea/modules.xml
  5. 6
      .idea/vcs.xml
  6. 25
      .idea/watcherTasks.xml
  7. 87
      .idea/workspace.xml
  8. 90
      ADBKeyCodes.php
  9. 34
      ADBService.php
  10. 0
      app.js
  11. 11
      execute.php
  12. 102
      index.html
  13. 8
      remote.css

4
.idea/deployment.xml

@ -0,0 +1,4 @@ @@ -0,0 +1,4 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="PublishConfigData" serverName="Homeserver" />
</project>

9
.idea/html.iml

@ -0,0 +1,9 @@ @@ -0,0 +1,9 @@
<?xml version="1.0" encoding="UTF-8"?>
<module version="4">
<component name="NewModuleRootManager">
<content url="file://$MODULE_DIR$" />
<orderEntry type="inheritedJdk" />
<orderEntry type="sourceFolder" forTests="false" />
<orderEntry type="library" name="jquery" level="application" />
</component>
</module>

6
.idea/jsLibraryMappings.xml

@ -0,0 +1,6 @@ @@ -0,0 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="JavaScriptLibraryMappings">
<file url="PROJECT" libraries="{jquery}" />
</component>
</project>

8
.idea/modules.xml

@ -0,0 +1,8 @@ @@ -0,0 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ProjectModuleManager">
<modules>
<module fileurl="file://$PROJECT_DIR$/.idea/html.iml" filepath="$PROJECT_DIR$/.idea/html.iml" />
</modules>
</component>
</project>

6
.idea/vcs.xml

@ -0,0 +1,6 @@ @@ -0,0 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="VcsDirectoryMappings">
<mapping directory="$PROJECT_DIR$/shield-remote" vcs="Git" />
</component>
</project>

25
.idea/watcherTasks.xml

@ -0,0 +1,25 @@ @@ -0,0 +1,25 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ProjectTasksOptions">
<TaskOptions isEnabled="false">
<option name="arguments" value="$FileName$:$FileNameWithoutExtension$.css" />
<option name="checkSyntaxErrors" value="true" />
<option name="description" />
<option name="exitCodeBehavior" value="ERROR" />
<option name="fileExtension" value="scss" />
<option name="immediateSync" value="true" />
<option name="name" value="SCSS" />
<option name="output" value="$FileNameWithoutExtension$.css:$FileNameWithoutExtension$.css.map" />
<option name="outputFilters">
<array />
</option>
<option name="outputFromStdout" value="false" />
<option name="program" value="sass" />
<option name="runOnExternalChanges" value="true" />
<option name="scopeName" value="Current File" />
<option name="trackOnlyRoot" value="true" />
<option name="workingDir" value="$FileDir$" />
<envs />
</TaskOptions>
</component>
</project>

87
.idea/workspace.xml

@ -0,0 +1,87 @@ @@ -0,0 +1,87 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="AutoImportSettings">
<option name="autoReloadType" value="SELECTIVE" />
</component>
<component name="ChangeListManager">
<list default="true" id="770ea386-39b9-422e-9e8d-15b616f9ec1c" name="Default Changelist" comment="" />
<option name="SHOW_DIALOG" value="false" />
<option name="HIGHLIGHT_CONFLICTS" value="true" />
<option name="HIGHLIGHT_NON_ACTIVE_CHANGELIST" value="false" />
<option name="LAST_RESOLUTION" value="IGNORE" />
</component>
<component name="ComposerSettings">
<execution />
</component>
<component name="FileTemplateManagerImpl">
<option name="RECENT_TEMPLATES">
<list>
<option value="CSS File" />
<option value="JavaScript File" />
</list>
</option>
</component>
<component name="Git.Settings">
<option name="RECENT_GIT_ROOT_PATH" value="$PROJECT_DIR$/shield-remote" />
</component>
<component name="PhpDebugGeneral" listening_started="true" />
<component name="ProjectId" id="1knpyvR38KQ5CcG0946GdBJ6dRs" />
<component name="ProjectLevelVcsManager" settingsEditedManually="true" />
<component name="ProjectViewState">
<option name="hideEmptyMiddlePackages" value="true" />
<option name="showLibraryContents" value="true" />
</component>
<component name="PropertiesComponent">
<property name="RunOnceActivity.OpenProjectViewOnStart" value="true" />
<property name="WebServerToolWindowFactoryState" value="false" />
<property name="list.type.of.created.stylesheet" value="CSS" />
<property name="settings.editor.selected.configurable" value="watcher.settings" />
<property name="vue.rearranger.settings.migration" value="true" />
</component>
<component name="RecentsManager">
<key name="MoveFile.RECENT_KEYS">
<recent name="$PROJECT_DIR$" />
</key>
</component>
<component name="SpellCheckerSettings" RuntimeDictionaries="0" Folders="0" CustomDictionaries="0" DefaultDictionary="application-level" UseSingleDictionary="true" transferred="true" />
<component name="TaskManager">
<task active="true" id="Default" summary="Default task">
<changelist id="770ea386-39b9-422e-9e8d-15b616f9ec1c" name="Default Changelist" comment="" />
<created>1606346468032</created>
<option name="number" value="Default" />
<option name="presentableId" value="Default" />
<updated>1606346468032</updated>
<workItem from="1606346469059" duration="5052000" />
</task>
<servers />
</component>
<component name="TypeScriptGeneratedFilesManager">
<option name="version" value="3" />
</component>
<component name="WindowStateProjectService">
<state x="317" y="133" width="722" height="459" key="EditFileWatcherDialog" timestamp="1606348204010">
<screen x="0" y="0" width="1366" height="720" />
</state>
<state x="317" y="133" width="722" height="459" key="EditFileWatcherDialog/0.0.1366.720@0.0.1366.720" timestamp="1606348204010" />
<state x="478" y="281" width="399" height="163" key="NewPhpFileDialog" timestamp="1606349091045">
<screen x="0" y="0" width="1366" height="720" />
</state>
<state x="478" y="281" width="399" height="163" key="NewPhpFileDialog/0.0.1366.720@0.0.1366.720" timestamp="1606349091045" />
<state x="172" y="0" key="SettingsEditor" timestamp="1606348206869">
<screen x="0" y="0" width="1366" height="720" />
</state>
<state x="172" y="0" key="SettingsEditor/0.0.1366.720@0.0.1366.720" timestamp="1606348206869" />
<state x="347" y="155" key="run.anything.popup" timestamp="1606347435018">
<screen x="0" y="0" width="1366" height="720" />
</state>
<state x="347" y="155" key="run.anything.popup/0.0.1366.720@0.0.1366.720" timestamp="1606347435018" />
<state x="346" y="41" width="672" height="678" key="search.everywhere.popup" timestamp="1606350711537">
<screen x="0" y="0" width="1366" height="720" />
</state>
<state x="346" y="41" width="672" height="678" key="search.everywhere.popup/0.0.1366.720@0.0.1366.720" timestamp="1606350711537" />
<state x="403" y="269" width="540" height="192" key="vcs.readOnlyHandler.ReadOnlyStatusDialog" timestamp="1606346509232">
<screen x="0" y="0" width="1366" height="720" />
</state>
<state x="403" y="269" width="540" height="192" key="vcs.readOnlyHandler.ReadOnlyStatusDialog/0.0.1366.720@0.0.1366.720" timestamp="1606346509232" />
</component>
</project>

90
ADBKeyCodes.php

@ -0,0 +1,90 @@ @@ -0,0 +1,90 @@
<?php
const ADB_KEYCODES = array(
"UNKNOWN" => 0,
// "MENU" => 1,
"SOFT_RIGHT" => 2,
"HOME" => 3,
"BACK" => 4,
"CALL" => 5,
// "ENDCALL" => 6,
"0" => 7,
"1" => 8,
"2" => 9,
"3" => 10,
"4" => 11,
"5" => 12,
"6" => 13,
"7" => 14,
"8" => 15,
"9" => 16,
"STAR" => 17,
"POUND" => 18,
"DPAD_UP" => 19,
"DPAD_DOWN" => 20,
"DPAD_LEFT" => 21,
"DPAD_RIGHT" => 22,
"DPAD_CENTER" => 23,
"VOLUME_UP" => 24,
"VOLUME_DOWN" => 25,
"POWER" => 26,
"CAMERA" => 27,
"CLEAR" => 28,
"A" => 29,
"B" => 30,
"C" => 31,
"D" => 32,
"E" => 33,
"F" => 34,
"G" => 35,
"H" => 36,
"I" => 37,
"J" => 38,
"K" => 39,
"L" => 40,
"M" => 41,
"N" => 42,
"O" => 43,
"P" => 44,
"Q" => 45,
"R" => 46,
"S" => 47,
"T" => 48,
"U" => 49,
"V" => 50,
"W" => 51,
"X" => 52,
"Y" => 53,
"Z" => 54,
"COMMA" => 55,
"PERIOD" => 56,
"ALT_LEFT" => 57,
"ALT_RIGHT" => 58,
"SHIFT_LEFT" => 59,
"SHIFT_RIGHT" => 60,
"TAB" => 61,
"SPACE" => 62,
"SYM" => 63,
"EXPLORER" => 64,
"ENVELOPE" => 65,
"ENTER" => 66,
"DEL" => 67,
"GRAVE" => 68,
"MINUS" => 69,
"EQUALS" => 70,
"LEFT_BRACKET" => 71,
"RIGHT_BRACKET" => 72,
"BACKSLASH" => 73,
"SEMICOLON" => 74,
"APOSTROPHE" => 75,
"SLASH" => 76,
"AT" => 77,
"NUM" => 78,
// "HEADSETHOOK" => 79,
"FOCUS" => 80,
"PLUS" => 81,
"MENU" => 82,
"NOTIFICATION" => 83,
"SEARCH" => 84,
"TAG_LAST_KEYCODE" => 85,
);

34
ADBService.php

@ -0,0 +1,34 @@ @@ -0,0 +1,34 @@
<?php
include_once 'ADBKeyCodes.php';
class ADBService
{
private $host;
public function __construct($host)
{
$this->host = $host;
$this->connect();
}
public function connect()
{
return $this->executeCommand('connect ' . escapeshellarg($this->host));
}
public function disconnect()
{
return $this->executeCommand('disconnect');
}
public function executeCommand($command)
{
return shell_exec('adb ' . $command);
}
public function sendKey($keyIdentifier)
{
return $this->executeCommand(' shell input keyevent ' . ADB_KEYCODES[$keyIdentifier]);
}
}

11
execute.php

@ -0,0 +1,11 @@ @@ -0,0 +1,11 @@
<?php
$axiosRequest = json_decode(file_get_contents('php://input'));
include_once 'ADBService.php';
const HOST = '192.168.1.132';
$service = new ADBService(HOST);
$service->connect();
echo json_encode([$service->sendKey($axiosRequest->keyCode)]);

102
index.html

@ -0,0 +1,102 @@ @@ -0,0 +1,102 @@
<!doctype html>
<html lang="de">
<head>
<meta charset="UTF-8">
<meta name="viewport"
content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<link rel="stylesheet" href="https://bootswatch.com/4/slate/bootstrap.min.css">
<link rel="stylesheet" href="remote.css">
<title>Android TV Web Remote</title>
</head>
<body>
<div class="container">
<div class="row" id="remote-control">
<a class="col-sm-4 btn btn-danger" onclick="sendKey('POWER')"><i class="fas fa-power-off"></i></a>
<a class="col-sm-4 btn btn-secondary" onclick="sendKey('DPAD_UP')"><i class="fas fa-caret-up fa-1c5x"></i></a>
<a class="col-sm-4"></a>
<a class="col-sm-4 btn btn-secondary" onclick="sendKey('DPAD_LEFT')"><i class="fas fa-caret-left fa-1c5x"></i></a>
<a class="col-sm-4 btn btn-secondary" onclick="sendKey('DPAD_CENTER')">OK</a>
<a class="col-sm-4 btn btn-secondary" onclick="sendKey('DPAD_RIGHT')"><i class="fas fa-caret-right fa-1c5x"></i></a>
<a class="col-sm-4"></a>
<a class="col-sm-4 btn btn-secondary" onclick="sendKey('DPAD_DOWN')"><i class="fas fa-caret-down fa-1c5x"></i></a>
<a class="col-sm-4"></a>
<hr class="col-md-12"/>
<a class="col-sm-4 btn btn-secondary" onclick="sendKey('BACK')"><i class="fas fa-long-arrow-alt-left"></i></a>
<a class="col-sm-4 btn btn-secondary" onclick="sendKey('HOME')"><i class="fas fa-home"></i></a>
<a class="col-sm-4 btn btn-secondary" onclick="sendKey('VOLUME_UP')"><i class="fas fa-volume-up"></i></a>
<a class="col-sm-4"></a>
<a class="col-sm-4"></a>
<a class="col-sm-4 btn btn-secondary" onclick="sendKey('VOLUME_DOWN')"><i class="fas fa-volume-down"></i></a>
<a class="col-sm-4"></a>
<a class="col-sm-4"></a>
<a class="col-sm-4"></a>
</div>
</div>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/axios/dist/axios.min.js"></script>
<script src="https://kit.fontawesome.com/b54a4cceff.js" crossorigin="anonymous"></script>
<script>
function sendKey(key) {
axios.post('execute.php', {
keyCode: key
}).then((response) => {
// console.log(response);
}).catch((error) => {
console.log(error);
})
}
// Check for Keypress
jQuery(document).keydown(function (e) {
switch (e.keyCode) {
// SPACE / ENTER
case 13:
case 32:
sendKey('DPAD_CENTER');
break;
// W
case 87:
sendKey('DPAD_UP');
break;
// D
case 68:
sendKey('DPAD_RIGHT');
break;
// S
case 83:
sendKey('DPAD_LEFT');
break;
// A
case 65:
sendKey('DPAD_LEFT');
break;
// UP
case 38:
sendKey('VOLUME_UP');
break;
// DOWN
case 40:
sendKey('VOLUME_DOWN');
break;
// H
case 72:
sendKey('HOME');
break;
// B
case 72:
sendKey('BACK');
break;
}
}
);
</script>
</body>
</html>

8
remote.css

@ -0,0 +1,8 @@ @@ -0,0 +1,8 @@
#remote-control {
margin: 3em auto;
max-width: 300px;
}
.fa-1c5x {
font-size: 1.5em;
}
Loading…
Cancel
Save