forked from cory/tildefriends
		
	android: Don't log from the main thread. It might block?
This commit is contained in:
		@@ -19,7 +19,6 @@ import android.os.RemoteException;
 | 
				
			|||||||
import android.os.StrictMode;
 | 
					import android.os.StrictMode;
 | 
				
			||||||
import android.text.InputType;
 | 
					import android.text.InputType;
 | 
				
			||||||
import android.util.Base64;
 | 
					import android.util.Base64;
 | 
				
			||||||
import android.util.Log;
 | 
					 | 
				
			||||||
import android.view.KeyEvent;
 | 
					import android.view.KeyEvent;
 | 
				
			||||||
import android.view.MotionEvent;
 | 
					import android.view.MotionEvent;
 | 
				
			||||||
import android.view.View;
 | 
					import android.view.View;
 | 
				
			||||||
@@ -44,6 +43,7 @@ import java.io.File;
 | 
				
			|||||||
import java.io.FileOutputStream;
 | 
					import java.io.FileOutputStream;
 | 
				
			||||||
import java.io.FileReader;
 | 
					import java.io.FileReader;
 | 
				
			||||||
import java.io.OutputStream;
 | 
					import java.io.OutputStream;
 | 
				
			||||||
 | 
					import java.util.concurrent.LinkedBlockingQueue;
 | 
				
			||||||
import java.util.concurrent.TimeUnit;
 | 
					import java.util.concurrent.TimeUnit;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
public class TildeFriendsActivity extends Activity {
 | 
					public class TildeFriendsActivity extends Activity {
 | 
				
			||||||
@@ -53,8 +53,10 @@ public class TildeFriendsActivity extends Activity {
 | 
				
			|||||||
	String port_file_path;
 | 
						String port_file_path;
 | 
				
			||||||
	Thread create_thread;
 | 
						Thread create_thread;
 | 
				
			||||||
	Thread server_thread;
 | 
						Thread server_thread;
 | 
				
			||||||
 | 
						Thread log_thread;
 | 
				
			||||||
	ServiceConnection service_connection;
 | 
						ServiceConnection service_connection;
 | 
				
			||||||
	FileObserver observer;
 | 
						FileObserver observer;
 | 
				
			||||||
 | 
						LinkedBlockingQueue<String> log_queue = new LinkedBlockingQueue<String>();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	private ValueCallback<Uri[]> upload_message;
 | 
						private ValueCallback<Uri[]> upload_message;
 | 
				
			||||||
	private final static int FILECHOOSER_RESULT = 1;
 | 
						private final static int FILECHOOSER_RESULT = 1;
 | 
				
			||||||
@@ -63,19 +65,29 @@ public class TildeFriendsActivity extends Activity {
 | 
				
			|||||||
	private boolean loaded = false;
 | 
						private boolean loaded = false;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	static {
 | 
						static {
 | 
				
			||||||
		Log.w("tildefriends", "Calling system.loadLibrary().");
 | 
							log("Calling system.loadLibrary().");
 | 
				
			||||||
		System.loadLibrary("tildefriends");
 | 
							System.loadLibrary("tildefriends");
 | 
				
			||||||
		Log.w("tildefriends", "system.loadLibrary() completed.");
 | 
							log("system.loadLibrary() completed.");
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	public static native int tf_server_main(String files_dir, String apk_path, String out_port_file_path, ConnectivityManager connectivity_manager);
 | 
						public static native int tf_server_main(String files_dir, String apk_path, String out_port_file_path, ConnectivityManager connectivity_manager);
 | 
				
			||||||
	public static native int tf_sandbox_main(int pipe_fd);
 | 
						public static native int tf_sandbox_main(int pipe_fd);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						public static void log(String message) {
 | 
				
			||||||
 | 
							if (s_activity != null && s_activity.log_queue != null && message != null) {
 | 
				
			||||||
 | 
								try {
 | 
				
			||||||
 | 
									s_activity.log_queue.put(message);
 | 
				
			||||||
 | 
								} catch (InterruptedException e) {
 | 
				
			||||||
 | 
									android.util.Log.w("tildefriends", message);
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	private void createThread() {
 | 
						private void createThread() {
 | 
				
			||||||
		web_view = (TildeFriendsWebView)findViewById(R.id.web);
 | 
							web_view = (TildeFriendsWebView)findViewById(R.id.web);
 | 
				
			||||||
		Log.w("tildefriends", String.format("getFilesDir() is %s", getFilesDir().toString()));
 | 
							log(String.format("getFilesDir() is %s", getFilesDir().toString()));
 | 
				
			||||||
		Log.w("tildefriends", String.format("getPackageResourcePath() is %s", getPackageResourcePath().toString()));
 | 
							log(String.format("getPackageResourcePath() is %s", getPackageResourcePath().toString()));
 | 
				
			||||||
		Log.w("tildefriends", String.format("nativeLibraryDir is %s", getApplicationInfo().nativeLibraryDir));
 | 
							log(String.format("nativeLibraryDir is %s", getApplicationInfo().nativeLibraryDir));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		port_file_path = getFilesDir().toString() + "/port.txt";
 | 
							port_file_path = getFilesDir().toString() + "/port.txt";
 | 
				
			||||||
		new File(port_file_path).delete();
 | 
							new File(port_file_path).delete();
 | 
				
			||||||
@@ -86,17 +98,17 @@ public class TildeFriendsActivity extends Activity {
 | 
				
			|||||||
		server_thread = new Thread(new Runnable() {
 | 
							server_thread = new Thread(new Runnable() {
 | 
				
			||||||
			@Override
 | 
								@Override
 | 
				
			||||||
			public void run() {
 | 
								public void run() {
 | 
				
			||||||
				Log.w("tildefriends", "Watching for changes in: " + getFilesDir().toString());
 | 
									log("Watching for changes in: " + getFilesDir().toString());
 | 
				
			||||||
				observer = make_file_observer(getFilesDir().toString(), port_file_path);
 | 
									observer = make_file_observer(getFilesDir().toString(), port_file_path);
 | 
				
			||||||
				observer.startWatching();
 | 
									observer.startWatching();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
				Log.w("tildefriends", "Calling tf_server_main.");
 | 
									log("Calling tf_server_main.");
 | 
				
			||||||
				int result = tf_server_main(
 | 
									int result = tf_server_main(
 | 
				
			||||||
					getFilesDir().toString(),
 | 
										getFilesDir().toString(),
 | 
				
			||||||
					getPackageResourcePath().toString(),
 | 
										getPackageResourcePath().toString(),
 | 
				
			||||||
					port_file_path,
 | 
										port_file_path,
 | 
				
			||||||
					(ConnectivityManager)getApplicationContext().getSystemService(CONNECTIVITY_SERVICE));
 | 
										(ConnectivityManager)getApplicationContext().getSystemService(CONNECTIVITY_SERVICE));
 | 
				
			||||||
				Log.w("tildefriends", "tf_server_main returned " + result + ".");
 | 
									log("tf_server_main returned " + result + ".");
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
		});
 | 
							});
 | 
				
			||||||
		server_thread.start();
 | 
							server_thread.start();
 | 
				
			||||||
@@ -110,17 +122,17 @@ public class TildeFriendsActivity extends Activity {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
			web_view.setDownloadListener(new DownloadListener() {
 | 
								web_view.setDownloadListener(new DownloadListener() {
 | 
				
			||||||
				public void onDownloadStart(String url, String userAgent, String content_disposition, String mime_type, long content_length) {
 | 
									public void onDownloadStart(String url, String userAgent, String content_disposition, String mime_type, long content_length) {
 | 
				
			||||||
					Log.w("tildefriends", "Let's download: " + url + " (" + content_disposition + ")");
 | 
										log("Let's download: " + url + " (" + content_disposition + ")");
 | 
				
			||||||
					String file_name = URLUtil.guessFileName(url, content_disposition, mime_type);
 | 
										String file_name = URLUtil.guessFileName(url, content_disposition, mime_type);
 | 
				
			||||||
					if (url.startsWith("data:") && url.indexOf(',') != -1) {
 | 
										if (url.startsWith("data:") && url.indexOf(',') != -1) {
 | 
				
			||||||
						String b64 = url.substring(url.indexOf(',') + 1);
 | 
											String b64 = url.substring(url.indexOf(',') + 1);
 | 
				
			||||||
						byte[] data = Base64.decode(b64, Base64.DEFAULT);
 | 
											byte[] data = Base64.decode(b64, Base64.DEFAULT);
 | 
				
			||||||
						Log.w("tildefriends", "Downloaded " + data.length + " bytes.");
 | 
											log("Downloaded " + data.length + " bytes.");
 | 
				
			||||||
						File path = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS);
 | 
											File path = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS);
 | 
				
			||||||
						try (OutputStream stream = new FileOutputStream(new File(path, file_name))) {
 | 
											try (OutputStream stream = new FileOutputStream(new File(path, file_name))) {
 | 
				
			||||||
							stream.write(data);
 | 
												stream.write(data);
 | 
				
			||||||
						} catch (java.io.IOException e) {
 | 
											} catch (java.io.IOException e) {
 | 
				
			||||||
							Log.w("tildefriends", "IOException: " + e.toString());
 | 
												log("IOException: " + e.toString());
 | 
				
			||||||
						}
 | 
											}
 | 
				
			||||||
						Toast.makeText(getApplicationContext(), "Downloaded File", Toast.LENGTH_LONG).show();
 | 
											Toast.makeText(getApplicationContext(), "Downloaded File", Toast.LENGTH_LONG).show();
 | 
				
			||||||
					} else {
 | 
										} else {
 | 
				
			||||||
@@ -228,7 +240,7 @@ public class TildeFriendsActivity extends Activity {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
				@Override
 | 
									@Override
 | 
				
			||||||
				public boolean onConsoleMessage(android.webkit.ConsoleMessage consoleMessage) {
 | 
									public boolean onConsoleMessage(android.webkit.ConsoleMessage consoleMessage) {
 | 
				
			||||||
					Log.d("tildefriends", consoleMessage.message() + " -- From line " + consoleMessage.lineNumber() + " of " + consoleMessage.sourceId());
 | 
										log(consoleMessage.message() + " -- From line " + consoleMessage.lineNumber() + " of " + consoleMessage.sourceId());
 | 
				
			||||||
					return true;
 | 
										return true;
 | 
				
			||||||
				}
 | 
									}
 | 
				
			||||||
			});
 | 
								});
 | 
				
			||||||
@@ -259,6 +271,24 @@ public class TildeFriendsActivity extends Activity {
 | 
				
			|||||||
	protected void onCreate(Bundle savedInstanceState) {
 | 
						protected void onCreate(Bundle savedInstanceState) {
 | 
				
			||||||
		s_activity = this;
 | 
							s_activity = this;
 | 
				
			||||||
		super.onCreate(savedInstanceState);
 | 
							super.onCreate(savedInstanceState);
 | 
				
			||||||
 | 
							log_thread = new Thread(new Runnable() {
 | 
				
			||||||
 | 
								@Override
 | 
				
			||||||
 | 
								public void run() {
 | 
				
			||||||
 | 
									while (true) {
 | 
				
			||||||
 | 
										try {
 | 
				
			||||||
 | 
											String message = log_queue.take();
 | 
				
			||||||
 | 
											if (message != null) {
 | 
				
			||||||
 | 
												android.util.Log.w("tildefriends", message);
 | 
				
			||||||
 | 
											} else {
 | 
				
			||||||
 | 
												break;
 | 
				
			||||||
 | 
											}
 | 
				
			||||||
 | 
										} catch (InterruptedException e) {
 | 
				
			||||||
 | 
										}
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
 | 
									log_thread = null;
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
							});
 | 
				
			||||||
 | 
							log_thread.start();
 | 
				
			||||||
		StrictMode.setThreadPolicy(
 | 
							StrictMode.setThreadPolicy(
 | 
				
			||||||
			new StrictMode.ThreadPolicy.Builder()
 | 
								new StrictMode.ThreadPolicy.Builder()
 | 
				
			||||||
				.detectAll()
 | 
									.detectAll()
 | 
				
			||||||
@@ -306,6 +336,10 @@ public class TildeFriendsActivity extends Activity {
 | 
				
			|||||||
	protected void onDestroy()
 | 
						protected void onDestroy()
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		super.onDestroy();
 | 
							super.onDestroy();
 | 
				
			||||||
 | 
							try {
 | 
				
			||||||
 | 
								log_queue.put(null);
 | 
				
			||||||
 | 
							} catch (InterruptedException e) {
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
		s_activity = null;
 | 
							s_activity = null;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -399,32 +433,32 @@ public class TildeFriendsActivity extends Activity {
 | 
				
			|||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	public static void start_sandbox(int pipe_fd) {
 | 
						public static void start_sandbox(int pipe_fd) {
 | 
				
			||||||
		Log.w("tildefriends", "starting service with fd: " + pipe_fd);
 | 
							log("starting service with fd: " + pipe_fd);
 | 
				
			||||||
		Intent intent = new Intent(s_activity, TildeFriendsSandboxService.class);
 | 
							Intent intent = new Intent(s_activity, TildeFriendsSandboxService.class);
 | 
				
			||||||
		s_activity.service_connection = new ServiceConnection() {
 | 
							s_activity.service_connection = new ServiceConnection() {
 | 
				
			||||||
			@Override
 | 
								@Override
 | 
				
			||||||
			public void onBindingDied(ComponentName name) {
 | 
								public void onBindingDied(ComponentName name) {
 | 
				
			||||||
				Log.w("tildefriends", "onBindingDied");
 | 
									log("onBindingDied");
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			@Override
 | 
								@Override
 | 
				
			||||||
			public void onNullBinding(ComponentName name) {
 | 
								public void onNullBinding(ComponentName name) {
 | 
				
			||||||
				Log.w("tildefriends", "onNullBinding");
 | 
									log("onNullBinding");
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			@Override
 | 
								@Override
 | 
				
			||||||
			public void onServiceConnected(ComponentName name, IBinder binder) {
 | 
								public void onServiceConnected(ComponentName name, IBinder binder) {
 | 
				
			||||||
				Log.w("tildefriends", "onServiceConnected");
 | 
									log("onServiceConnected");
 | 
				
			||||||
				Parcel data = Parcel.obtain();
 | 
									Parcel data = Parcel.obtain();
 | 
				
			||||||
				try (ParcelFileDescriptor pfd = ParcelFileDescriptor.fromFd(pipe_fd)) {
 | 
									try (ParcelFileDescriptor pfd = ParcelFileDescriptor.fromFd(pipe_fd)) {
 | 
				
			||||||
					data.writeParcelable(pfd, 0);
 | 
										data.writeParcelable(pfd, 0);
 | 
				
			||||||
				} catch (java.io.IOException e) {
 | 
									} catch (java.io.IOException e) {
 | 
				
			||||||
					Log.w("tildefriends", "IOException: " + e);
 | 
										log("IOException: " + e);
 | 
				
			||||||
				}
 | 
									}
 | 
				
			||||||
				try {
 | 
									try {
 | 
				
			||||||
					binder.transact(TildeFriendsSandboxService.START_CALL,  data, null, IBinder.FLAG_ONEWAY);
 | 
										binder.transact(TildeFriendsSandboxService.START_CALL,  data, null, IBinder.FLAG_ONEWAY);
 | 
				
			||||||
				} catch (RemoteException e) {
 | 
									} catch (RemoteException e) {
 | 
				
			||||||
					Log.w("tildefriends", "RemoteException");
 | 
										log("RemoteException");
 | 
				
			||||||
				} finally {
 | 
									} finally {
 | 
				
			||||||
					data.recycle();
 | 
										data.recycle();
 | 
				
			||||||
				}
 | 
									}
 | 
				
			||||||
@@ -432,14 +466,14 @@ public class TildeFriendsActivity extends Activity {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
			@Override
 | 
								@Override
 | 
				
			||||||
			public void onServiceDisconnected(ComponentName name) {
 | 
								public void onServiceDisconnected(ComponentName name) {
 | 
				
			||||||
				Log.w("tildefriends", "onServiceDisconnected");
 | 
									log("onServiceDisconnected");
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
		};
 | 
							};
 | 
				
			||||||
		s_activity.bindService(intent, s_activity.service_connection, BIND_AUTO_CREATE | BIND_NOT_FOREGROUND);
 | 
							s_activity.bindService(intent, s_activity.service_connection, BIND_AUTO_CREATE | BIND_NOT_FOREGROUND);
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	public static void stop_sandbox() {
 | 
						public static void stop_sandbox() {
 | 
				
			||||||
		Log.w("tildefriends", "stop_sandbox");
 | 
							log("stop_sandbox");
 | 
				
			||||||
		if (s_activity.service_connection != null) {
 | 
							if (s_activity.service_connection != null) {
 | 
				
			||||||
			s_activity.unbindService(s_activity.service_connection);
 | 
								s_activity.unbindService(s_activity.service_connection);
 | 
				
			||||||
			s_activity.service_connection = null;
 | 
								s_activity.service_connection = null;
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -6,7 +6,6 @@ import android.os.Binder;
 | 
				
			|||||||
import android.os.IBinder;
 | 
					import android.os.IBinder;
 | 
				
			||||||
import android.os.Parcel;
 | 
					import android.os.Parcel;
 | 
				
			||||||
import android.os.ParcelFileDescriptor;
 | 
					import android.os.ParcelFileDescriptor;
 | 
				
			||||||
import android.util.Log;
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
public class TildeFriendsSandboxService extends Service {
 | 
					public class TildeFriendsSandboxService extends Service {
 | 
				
			||||||
	public static final int START_CALL = IBinder.FIRST_CALL_TRANSACTION;
 | 
						public static final int START_CALL = IBinder.FIRST_CALL_TRANSACTION;
 | 
				
			||||||
@@ -14,12 +13,12 @@ public class TildeFriendsSandboxService extends Service {
 | 
				
			|||||||
	Thread thread;
 | 
						Thread thread;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	public int onStartCommand(Intent intent, int flags, int start_id) {
 | 
						public int onStartCommand(Intent intent, int flags, int start_id) {
 | 
				
			||||||
		Log.w("tildefriends", "TildeFriendsSandboxService: onStartCommand");
 | 
							TildeFriendsActivity.log("TildeFriendsSandboxService: onStartCommand");
 | 
				
			||||||
		return super.onStartCommand(intent, flags, start_id);
 | 
							return super.onStartCommand(intent, flags, start_id);
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	public void onDestroy() {
 | 
						public void onDestroy() {
 | 
				
			||||||
		Log.w("tildefriends", "TildeFriendsSandboxService: onDestroy");
 | 
							TildeFriendsActivity.log("TildeFriendsSandboxService: onDestroy");
 | 
				
			||||||
		super.onDestroy();
 | 
							super.onDestroy();
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -27,9 +26,9 @@ public class TildeFriendsSandboxService extends Service {
 | 
				
			|||||||
		thread = new Thread(new Runnable() {
 | 
							thread = new Thread(new Runnable() {
 | 
				
			||||||
			@Override
 | 
								@Override
 | 
				
			||||||
			public void run() {
 | 
								public void run() {
 | 
				
			||||||
				Log.w("tildefriends", "Calling tf_sandbox_main.");
 | 
									TildeFriendsActivity.log("Calling tf_sandbox_main.");
 | 
				
			||||||
				int result = TildeFriendsActivity.tf_sandbox_main(pipe_fd);
 | 
									int result = TildeFriendsActivity.tf_sandbox_main(pipe_fd);
 | 
				
			||||||
				Log.w("tildefriends", "tf_sandbox_main returned " + result + ".");
 | 
									TildeFriendsActivity.log("tf_sandbox_main returned " + result + ".");
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
		});
 | 
							});
 | 
				
			||||||
		thread.start();
 | 
							thread.start();
 | 
				
			||||||
@@ -43,7 +42,7 @@ public class TildeFriendsSandboxService extends Service {
 | 
				
			|||||||
				if (code == START_CALL) {
 | 
									if (code == START_CALL) {
 | 
				
			||||||
					ParcelFileDescriptor pfd = read_pfd(data);
 | 
										ParcelFileDescriptor pfd = read_pfd(data);
 | 
				
			||||||
					if (pfd != null) {
 | 
										if (pfd != null) {
 | 
				
			||||||
						Log.w("tildefriends", "fd is " + pfd.getFd());
 | 
											TildeFriendsActivity.log("fd is " + pfd.getFd());
 | 
				
			||||||
						start_thread(pfd.detachFd());
 | 
											start_thread(pfd.detachFd());
 | 
				
			||||||
						try {
 | 
											try {
 | 
				
			||||||
							pfd.close();
 | 
												pfd.close();
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user