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:
		
							
								
								
									
										5
									
								
								Makefile
									
									
									
									
									
								
							
							
						
						
									
										5
									
								
								Makefile
									
									
									
									
									
								
							| @@ -462,6 +462,11 @@ out/%.apk: out/%.unsigned.apk | ||||
| apk: out/TildeFriends-debug.apk | ||||
| .PHONY: apk | ||||
|  | ||||
| apkgo: out/TildeFriends-debug.apk | ||||
| 	@adb install $< | ||||
| 	@adb shell am start com.unprompted.tildefriends/.MainActivity | ||||
| .PHONY: apkgo | ||||
|  | ||||
| clean: | ||||
| 	rm -rf $(BUILD_DIR) | ||||
| .PHONY: clean | ||||
|   | ||||
| @@ -555,7 +555,17 @@ let kBacklog = 8; | ||||
| let kHost = "0.0.0.0" | ||||
|  | ||||
| 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() { | ||||
| 		try { | ||||
| 			let client = await socket.accept(); | ||||
|   | ||||
| @@ -18,18 +18,26 @@ import android.webkit.WebResourceRequest; | ||||
| import android.webkit.WebView; | ||||
| import android.webkit.WebViewClient; | ||||
| import android.widget.Button; | ||||
| import java.lang.Process; | ||||
| import java.lang.Thread; | ||||
|  | ||||
| import java.io.BufferedInputStream; | ||||
| import java.io.BufferedReader; | ||||
| import java.io.File; | ||||
| import java.io.FileReader; | ||||
| import java.io.FileInputStream; | ||||
| 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.ZipInputStream; | ||||
|  | ||||
| public class MainActivity extends Activity { | ||||
| 	WebView web_view; | ||||
| 	String base_url; | ||||
|  | ||||
| 	@Override | ||||
| 	protected void onCreate(Bundle savedInstanceState) { | ||||
| @@ -70,8 +78,45 @@ public class MainActivity extends Activity { | ||||
| 			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"; | ||||
| 		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", "exe = " + exe); | ||||
| 		builder.directory(getFilesDir()); | ||||
| @@ -120,7 +165,7 @@ public class MainActivity extends Activity { | ||||
| 			@Override | ||||
| 			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; | ||||
| 				} else { | ||||
| 					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); | ||||
| 		refresh.setOnClickListener(new View.OnClickListener() { | ||||
| 			public void onClick(View view) { | ||||
| @@ -147,12 +190,30 @@ public class MainActivity extends Activity { | ||||
| 		} else if (keyCode == KeyEvent.KEYCODE_FORWARD && web_view.canGoForward()) { | ||||
| 			web_view.goForward(); | ||||
| 			return true; | ||||
| /* | ||||
| 		} else if (keyCode == KeyEvent.KEYCODE_REFRESH) { | ||||
| 			web_view.reload(); | ||||
| 			return true; | ||||
| */ | ||||
| 		} | ||||
| 		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 | ||||
| 		{ | ||||
| 			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); | ||||
|   | ||||
		Reference in New Issue
	
	Block a user