Gio.java raw

   1  // SPDX-License-Identifier: Unlicense OR MIT
   2  
   3  package org.gioui;
   4  
   5  import android.content.ClipboardManager;
   6  import android.content.ClipData;
   7  import android.content.Context;
   8  import android.os.Handler;
   9  import android.os.Looper;
  10  
  11  import java.io.UnsupportedEncodingException;
  12  
  13  public final class Gio {
  14  	private static final Object initLock = new Object();
  15  	private static boolean jniLoaded;
  16  	private static final Handler handler = new Handler(Looper.getMainLooper());
  17  
  18  	/**
  19  	 * init loads and initializes the Go native library and runs
  20  	 * the Go main function.
  21  	 *
  22  	 * It is exported for use by Android apps that need to run Go code
  23  	 * outside the lifecycle of the Gio activity.
  24  	 */
  25  	public static synchronized void init(Context appCtx) {
  26  		synchronized (initLock) {
  27  			if (jniLoaded) {
  28  				return;
  29  			}
  30  			String dataDir = appCtx.getFilesDir().getAbsolutePath();
  31  			byte[] dataDirUTF8;
  32  			try {
  33  				dataDirUTF8 = dataDir.getBytes("UTF-8");
  34  			} catch (UnsupportedEncodingException e) {
  35  				throw new RuntimeException(e);
  36  			}
  37  			System.loadLibrary("gio");
  38  			runGoMain(dataDirUTF8, appCtx);
  39  			jniLoaded = true;
  40  		}
  41  	}
  42  
  43  	static private native void runGoMain(byte[] dataDir, Context context);
  44  
  45  	static void writeClipboard(Context ctx, String s) {
  46  		ClipboardManager m = (ClipboardManager)ctx.getSystemService(Context.CLIPBOARD_SERVICE);
  47  		m.setPrimaryClip(ClipData.newPlainText(null, s));
  48  	}
  49  
  50  	static String readClipboard(Context ctx) {
  51  		ClipboardManager m = (ClipboardManager)ctx.getSystemService(Context.CLIPBOARD_SERVICE);
  52  		ClipData c = m.getPrimaryClip();
  53  		if (c == null || c.getItemCount() < 1) {
  54  			return null;
  55  		}
  56  		return c.getItemAt(0).coerceToText(ctx).toString();
  57  	}
  58  
  59  	static void wakeupMainThread() {
  60  		handler.post(new Runnable() {
  61  			@Override public void run() {
  62  				scheduleMainFuncs();
  63  			}
  64  		});
  65  	}
  66  
  67  	static private native void scheduleMainFuncs();
  68  }
  69