Skip to content

Instantly share code, notes, and snippets.

@tovask
Last active October 6, 2017 13:05
Show Gist options
  • Save tovask/f487a1dde8bec50d148ba37c3e10f6ff to your computer and use it in GitHub Desktop.
Save tovask/f487a1dde8bec50d148ba37c3e10f6ff to your computer and use it in GitHub Desktop.
minimal php to access android touch inputs
<?php
if(!isset($_SERVER['REMOTE_ADDR']) || $_SERVER['SERVER_ADDR'] != $_SERVER['REMOTE_ADDR']){
// for security, deny access outside of localhost (comment it out if you want to allow control from outside)
exit();
}
//error_reporting(E_ALL);
//ini_set('display_errors', 1);
$adb_command = './adb';
if(isset($_POST['action'])){
switch($_POST['action']){
case 'getScreenshot':
print shell_exec($adb_command.' shell screencap -p | perl -pe "s/\x0D\x0A/\x0A/g"');
break;
case 'sendText':
print shell_exec(escapeshellcmd($adb_command.' shell input text '.escapeshellarg($_POST['data'])));
break;
case 'sendKey':
print shell_exec(escapeshellcmd($adb_command.' shell input keyevent '.$_POST['code']));
break;
case 'sendTap':
print shell_exec(escapeshellcmd($adb_command.' shell input tap '.$_POST['x'].' '.$_POST['y']));
break;
case 'sendSwipe':
print shell_exec(escapeshellcmd($adb_command.' shell input swipe '.$_POST['x1'].' '.$_POST['y1'].' '.$_POST['x2'].' '.$_POST['y2'].' '.$_POST['duration']));
break;
default:
//
break;
}
exit();
}
?>
<!DOCTYPE html>
<html>
<head>
<title>Android control</title>
<style>
* {
margin: 0px;
padding: 0px;
}
html, body{
width: 100%;
height: 100%;
}
</style>
<script>
"use strict";
var screenWidth = 1080,
screenHeight = 1920;
var delayBetweenScreenRefresh = 100, // in ms
logPressMinTime = 500, // in ms
screenImg, lastRefresh;
function log(msg){
console.log(msg);
}
function send(action, params){
var xhr = new XMLHttpRequest();
xhr.open('POST', location.href.split('?')[0] );
xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded; charset=UTF-8');
var data = 'action='+action;
for(var i in params){
data += '&'+i+'='+params[i];
}
xhr.send(data);
}
function refreshScreen(){
var xhr = new XMLHttpRequest();
xhr.responseType = 'arraybuffer';
xhr.onload = function() {
var blb = new Blob([xhr.response], {type: 'image/png'}); // from https://stackoverflow.com/a/25334606
var url = URL.createObjectURL(blb);
screenImg.src = url;
setTimeout(refreshScreen, delayBetweenScreenRefresh);
if(lastRefresh.interval){
clearInterval(lastRefresh.interval);
}
lastRefresh.innerHTML = 0;
lastRefresh.interval = setInterval(function(){ // show how old is the currently visible image
lastRefresh.innerHTML = Number(lastRefresh.innerHTML)+500;
}, 500);
}
xhr.open('POST', location.href.split('?')[0] );
xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded; charset=UTF-8');
xhr.send('action=getScreenshot');
}
window.addEventListener('load', function(){
lastRefresh = document.getElementById('lastRefresh');
var startX, startY, startTime;
screenImg = document.getElementById('screenImg');
screenImg.addEventListener('mousedown', function(e){
var offset = screenImg.getBoundingClientRect()
startX = e.clientX - offset.left;
startY = e.clientY - offset.top;
startTime = (new Date()).getTime();
e.preventDefault();
e.stopPropagation();
});
screenImg.addEventListener('mouseup', function(e){
var endX, endY, endTime;
var offset = screenImg.getBoundingClientRect()
endX = e.clientX - offset.left;
endY = e.clientY - offset.top;
endTime = (new Date()).getTime();
//if( (startX - endX) < 5 && (startY - endY) < 5 ){
if(startX == endX && startY == endY && (endTime-startTime)<logPressMinTime ){
send('sendTap', {'x': (startX*screenWidth/offset.width), 'y': (startY*screenHeight/offset.height)} );
}else{
send('sendSwipe', {'x1': (startX*screenWidth/offset.width), 'y1': (startY*screenHeight/offset.height),
'x2': (endX*screenWidth/offset.width), 'y2': (endY*screenHeight/offset.height),
'duration': (endTime-startTime) } )
}
e.preventDefault();
e.stopPropagation();
});
document.getElementById('textSendButton').addEventListener('click', function(){
send('sendText', {'data': document.getElementById('textSendContent').innerHTML } );
});
var pressbuttons = document.getElementsByClassName('pressButton');
function sendButtonEvent(e){
send('sendKey', {'code': e.target.getAttribute('data-value') } );
}
for(var i in pressbuttons){
if(!pressbuttons[i].addEventListener){
continue;
}
pressbuttons[i].addEventListener('click', sendButtonEvent);
}
lastRefresh = document.getElementById('lastRefresh');
refreshScreen();
});
</script>
</head>
<body>
<div style="float: left; height: 100%;" >
<img src="" style="display: block; max-height: 100%;" id="screenImg" />
</div>
<div>
<div>
Long press minimum time: <script>document.write(logPressMinTime);</script>ms<br>
Last screen refresh was <span id="lastRefresh" ></span>ms ago
</div>
<div>
<h3>Type Text:</h3>
<textarea style="" id="textSendContent" ></textarea>
<button type="button" id="textSendButton">Send</button>
</div>
<div>
<h3>Press Button:</h3>
<button type="button" class="pressButton" data-value="KEYCODE_POWER">POWER</button>
<button type="button" class="pressButton" data-value="KEYCODE_HOME">Home</button>
<button type="button" class="pressButton" data-value="KEYCODE_BACK">Back</button>
<button type="button" class="pressButton" data-value="KEYCODE_MENU">Menu</button>
<br>
<button type="button" class="pressButton" data-value="KEYCODE_VOLUME_DOWN">Volume Down</button>
<button type="button" class="pressButton" data-value="KEYCODE_VOLUME_MUTE">Volume Mute</button>
<button type="button" class="pressButton" data-value="KEYCODE_VOLUME_UP">Volume Up</button>
<br>
<button type="button" class="pressButton" data-value="KEYCODE_DEL">Backspace</button>
<button type="button" class="pressButton" data-value="KEYCODE_ENTER">Enter</button>
<button type="button" class="pressButton" data-value="KEYCODE_ESCAPE">Escape</button>
<button type="button" class="pressButton" data-value="KEYCODE_MUTE">Mute</button>
<button type="button" class="pressButton" data-value="KEYCODE_SPACE">Space</button>
<br>
<button type="button" class="pressButton" data-value="KEYCODE_PAGE_DOWN">Page Down</button>
<button type="button" class="pressButton" data-value="KEYCODE_PAGE_UP">Page Up</button>
<button type="button" class="pressButton" data-value="KEYCODE_DPAD_LEFT">DPad Left</button>
<button type="button" class="pressButton" data-value="KEYCODE_DPAD_RIGHT">DPad Right</button>
<button type="button" class="pressButton" data-value="KEYCODE_DPAD_UP">DPad Up</button>
<button type="button" class="pressButton" data-value="KEYCODE_DPAD_DOWN">DPad Down</button>
<br>
<a href="https://developer.android.com/reference/android/view/KeyEvent.html" target="_blank">(keycodes)</a>
</div>
</div>
</body>
</html>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment