forked from cory/tildefriends
Bind tildefriends HTTP to an arbitrary port, write it to a file, and have the Android activity notice that file write and load the correct URL.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4233 ed5197a5-7fde-0310-b194-c3ffbd925b24
This commit is contained in:
parent
63615747a7
commit
d6be2f7d54
5
Makefile
5
Makefile
@ -462,6 +462,11 @@ out/%.apk: out/%.unsigned.apk
|
|||||||
apk: out/TildeFriends-debug.apk
|
apk: out/TildeFriends-debug.apk
|
||||||
.PHONY: apk
|
.PHONY: apk
|
||||||
|
|
||||||
|
apkgo: out/TildeFriends-debug.apk
|
||||||
|
@adb install $<
|
||||||
|
@adb shell am start com.unprompted.tildefriends/.MainActivity
|
||||||
|
.PHONY: apkgo
|
||||||
|
|
||||||
clean:
|
clean:
|
||||||
rm -rf $(BUILD_DIR)
|
rm -rf $(BUILD_DIR)
|
||||||
.PHONY: clean
|
.PHONY: clean
|
||||||
|
@ -555,7 +555,17 @@ let kBacklog = 8;
|
|||||||
let kHost = "0.0.0.0"
|
let kHost = "0.0.0.0"
|
||||||
|
|
||||||
let socket = new Socket();
|
let socket = new Socket();
|
||||||
socket.bind(kHost, tildefriends.http_port).then(function() {
|
socket.bind(kHost, tildefriends.http_port).then(function(port) {
|
||||||
|
print("bound to", port);
|
||||||
|
print("checking", tildefriends.args.out_http_port_file);
|
||||||
|
if (tildefriends.args.out_http_port_file) {
|
||||||
|
print("going to write the file");
|
||||||
|
File.writeFile(tildefriends.args.out_http_port_file, port.toString() + '\n').then(function(r) {
|
||||||
|
print("wrote port file", tildefriends.args.out_http_port_file, r);
|
||||||
|
}).catch(function() {
|
||||||
|
print("failed to write port file");
|
||||||
|
});
|
||||||
|
}
|
||||||
let listenResult = socket.listen(kBacklog, async function() {
|
let listenResult = socket.listen(kBacklog, async function() {
|
||||||
try {
|
try {
|
||||||
let client = await socket.accept();
|
let client = await socket.accept();
|
||||||
|
@ -18,18 +18,26 @@ import android.webkit.WebResourceRequest;
|
|||||||
import android.webkit.WebView;
|
import android.webkit.WebView;
|
||||||
import android.webkit.WebViewClient;
|
import android.webkit.WebViewClient;
|
||||||
import android.widget.Button;
|
import android.widget.Button;
|
||||||
import java.lang.Process;
|
import java.io.BufferedInputStream;
|
||||||
import java.lang.Thread;
|
import java.io.BufferedReader;
|
||||||
|
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
|
import java.io.FileReader;
|
||||||
import java.io.FileInputStream;
|
import java.io.FileInputStream;
|
||||||
import java.io.FileOutputStream;
|
import java.io.FileOutputStream;
|
||||||
import java.io.BufferedInputStream;
|
import java.lang.Process;
|
||||||
|
import java.lang.Thread;
|
||||||
|
import java.nio.file.FileSystems;
|
||||||
|
import java.nio.file.Paths;
|
||||||
|
import java.nio.file.StandardWatchEventKinds;
|
||||||
|
import java.nio.file.WatchEvent;
|
||||||
|
import java.nio.file.WatchKey;
|
||||||
|
import java.nio.file.WatchService;
|
||||||
import java.util.zip.ZipEntry;
|
import java.util.zip.ZipEntry;
|
||||||
import java.util.zip.ZipInputStream;
|
import java.util.zip.ZipInputStream;
|
||||||
|
|
||||||
public class MainActivity extends Activity {
|
public class MainActivity extends Activity {
|
||||||
WebView web_view;
|
WebView web_view;
|
||||||
|
String base_url;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void onCreate(Bundle savedInstanceState) {
|
protected void onCreate(Bundle savedInstanceState) {
|
||||||
@ -70,8 +78,45 @@ public class MainActivity extends Activity {
|
|||||||
Log.w("tildefriends", e.toString());
|
Log.w("tildefriends", e.toString());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
String port_file_path = getFilesDir().toString() + "/port.txt";
|
||||||
|
base_url = "http://127.0.0.1:12345/";
|
||||||
|
|
||||||
|
new Thread(new Runnable() {
|
||||||
|
@Override
|
||||||
|
public void run() {
|
||||||
|
try {
|
||||||
|
Log.w("tildefriends", "Watching for changes in: " + getFilesDir().toString());
|
||||||
|
WatchService watcher = FileSystems.getDefault().newWatchService();
|
||||||
|
Paths.get(getFilesDir().toString()).register(
|
||||||
|
watcher,
|
||||||
|
StandardWatchEventKinds.ENTRY_CREATE,
|
||||||
|
StandardWatchEventKinds.ENTRY_MODIFY);
|
||||||
|
while (true) {
|
||||||
|
WatchKey key = watcher.take();
|
||||||
|
for (WatchEvent event : key.pollEvents()) {
|
||||||
|
if (event.context().toString().equals("port.txt")) {
|
||||||
|
Log.w("tildefriends", "Observed file write: " + event.context().toString());
|
||||||
|
base_url = "http://127.0.0.1:" + String.valueOf(read_port(port_file_path)) + "/";
|
||||||
|
web_view.loadUrl(base_url);
|
||||||
|
watcher.close();
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (!key.reset()) {
|
||||||
|
Log.w("tildefriends", "watcher is no longer valid");
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} catch (java.io.IOException e) {
|
||||||
|
Log.w("tildefriends", "IOException: " + e.toString());
|
||||||
|
} catch (InterruptedException e) {
|
||||||
|
Log.w("tildefriends", "InterruptedException: " + e.toString());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}).start();
|
||||||
|
|
||||||
String exe = getFilesDir().toString() + "/tildefriends";
|
String exe = getFilesDir().toString() + "/tildefriends";
|
||||||
ProcessBuilder builder = new ProcessBuilder(exe, "run", "-z", getPackageResourcePath().toString());
|
ProcessBuilder builder = new ProcessBuilder(exe, "run", "-z", getPackageResourcePath().toString(), "-a", "out_http_port_file=" + port_file_path);
|
||||||
Log.w("tildefriends", "files = " + getFilesDir().toString());
|
Log.w("tildefriends", "files = " + getFilesDir().toString());
|
||||||
Log.w("tildefriends", "exe = " + exe);
|
Log.w("tildefriends", "exe = " + exe);
|
||||||
builder.directory(getFilesDir());
|
builder.directory(getFilesDir());
|
||||||
@ -120,7 +165,7 @@ public class MainActivity extends Activity {
|
|||||||
@Override
|
@Override
|
||||||
public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request)
|
public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request)
|
||||||
{
|
{
|
||||||
if (request.getUrl() != null && request.getUrl().toString().startsWith("http://127.0.0.1:12345/")) {
|
if (request.getUrl() != null && request.getUrl().toString().startsWith(base_url)) {
|
||||||
return false;
|
return false;
|
||||||
} else {
|
} else {
|
||||||
view.getContext().startActivity(new Intent(Intent.ACTION_VIEW, request.getUrl()));
|
view.getContext().startActivity(new Intent(Intent.ACTION_VIEW, request.getUrl()));
|
||||||
@ -129,8 +174,6 @@ public class MainActivity extends Activity {
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
web_view.loadUrl("http://127.0.0.1:12345/");
|
|
||||||
|
|
||||||
Button refresh = (Button)findViewById(R.id.refresh);
|
Button refresh = (Button)findViewById(R.id.refresh);
|
||||||
refresh.setOnClickListener(new View.OnClickListener() {
|
refresh.setOnClickListener(new View.OnClickListener() {
|
||||||
public void onClick(View view) {
|
public void onClick(View view) {
|
||||||
@ -147,12 +190,30 @@ public class MainActivity extends Activity {
|
|||||||
} else if (keyCode == KeyEvent.KEYCODE_FORWARD && web_view.canGoForward()) {
|
} else if (keyCode == KeyEvent.KEYCODE_FORWARD && web_view.canGoForward()) {
|
||||||
web_view.goForward();
|
web_view.goForward();
|
||||||
return true;
|
return true;
|
||||||
/*
|
|
||||||
} else if (keyCode == KeyEvent.KEYCODE_REFRESH) {
|
} else if (keyCode == KeyEvent.KEYCODE_REFRESH) {
|
||||||
web_view.reload();
|
web_view.reload();
|
||||||
return true;
|
return true;
|
||||||
*/
|
|
||||||
}
|
}
|
||||||
return super.onKeyDown(keyCode, event);
|
return super.onKeyDown(keyCode, event);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private int read_port(String path) {
|
||||||
|
BufferedReader reader = null;
|
||||||
|
try {
|
||||||
|
reader = new BufferedReader(new FileReader(path));
|
||||||
|
return Integer.parseInt(reader.readLine());
|
||||||
|
} catch (java.io.FileNotFoundException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
} catch (java.io.IOException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
} finally {
|
||||||
|
try {
|
||||||
|
if (reader != null) {
|
||||||
|
reader.close();
|
||||||
|
}
|
||||||
|
} catch (java.io.IOException e) {
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -456,7 +456,21 @@ void _socket_onResolvedForBind(uv_getaddrinfo_t* resolver, int status, struct ad
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
tf_task_resolve_promise(data->socket->_task, data->promise, JS_UNDEFINED);
|
struct sockaddr_storage addr = { 0 };
|
||||||
|
int port = 0;
|
||||||
|
int size = (int)sizeof(addr);
|
||||||
|
if (uv_tcp_getsockname(&data->socket->_socket, (struct sockaddr*)&addr, &size) == 0)
|
||||||
|
{
|
||||||
|
if (addr.ss_family == AF_INET)
|
||||||
|
{
|
||||||
|
port = ntohs(((struct sockaddr_in*)&addr)->sin_port);
|
||||||
|
}
|
||||||
|
else if (addr.ss_family == AF_INET6)
|
||||||
|
{
|
||||||
|
port = ntohs(((struct sockaddr_in6*)&addr)->sin6_port);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
tf_task_resolve_promise(data->socket->_task, data->promise, JS_NewInt32(tf_task_get_context(data->socket->_task), port));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
tf_free(data);
|
tf_free(data);
|
||||||
|
Loading…
Reference in New Issue
Block a user