chiark / gitweb /
868b3d2e212999f2005852d76b15827eedf999b6
[tripe-android] / toy-activity.scala
1 package uk.org.distorted.tripe;
2
3 import java.io.{File, FileOutputStream, InputStream, IOException};
4
5 import android.app.{Activity, Application};
6 import android.content.Context; import Context.MODE_WORLD_READABLE;
7 import android.content.res.AssetManager;
8 import android.os.Build; import Build.{CPU_ABI, CPU_ABI2};
9 import android.os.Bundle;
10 import android.util.Log;
11 import android.view.View;
12
13 import scala.util.control.Breaks;
14
15 object Setup {
16   private final val TAG = "Setup";
17   private val BREAK = new Breaks;
18   import BREAK.{breakable, break};
19
20   def setup(ctx: Context) {
21     val bindir = ctx.getDir("bin", MODE_WORLD_READABLE);
22     val assets = ctx.getAssets;
23
24     val abis =
25       try { classOf[Build].getField("SUPPORTED_ABIS").get(null).asInstanceOf[Array[String]] }
26       catch {
27         case _: NoSuchFieldException => Array(CPU_ABI, CPU_ABI2) flatMap {
28           case null | "" => None
29           case s => Some(s)
30         }
31       };
32
33     Log.d(TAG, s"abis = ${abis.mkString(", ")}");
34     Log.d(TAG, s"assets: ${assets.list("bin").mkString(", ")}");
35
36     for (abi <- abis) {
37       val binsrc = s"bin/$abi";
38       for (base <- assets.list(binsrc)) {
39         val prog = new File(bindir, base);
40         if (!prog.exists) try {
41           Log.d(TAG, s"creating $prog...");
42           val in = assets.open(s"$binsrc/$base");
43           Log.d(TAG, "opened source...");
44           val out = new FileOutputStream(prog);
45           Log.d(TAG, "opened target...");
46           val buf = new Array[Byte](4096);
47           breakable {
48             while (true) {
49               val n = in.read(buf);
50               Log.d(TAG, s"read $n bytes...");
51               if (n <= 0) break;
52               out.write(buf, 0, n);
53             }
54           }
55           in.close();
56           out.close();
57           Log.d(TAG, "set permissions...");
58           if (!prog.setReadable(true, false) ||
59               !prog.setExecutable(true, false))
60             throw new IOException("failed to set program permissions");
61         } catch {
62           case exc: IOException =>
63             Log.wtf(TAG, "fuck, failed to create prog", exc);
64         }
65       }
66     }
67     Log.d(TAG, "all OK");
68   }
69 }
70
71 object ToyActivity {
72   private final val TAG = "ToyActivity";
73   System.loadLibrary("jni");
74   @native protected def foo();
75 }
76
77 class ToyActivity extends Activity {
78   import ToyActivity._;
79
80   override protected def onCreate(joy: Bundle) {
81     super.onCreate(joy);
82     Setup.setup(this);
83     setContentView(R.layout.toy);
84   }
85   def clickOk(v: View) {
86     Log.d(TAG, "OK, OK.  (Scala was here.)");
87     foo();
88
89     val bindir = getDir("bin", MODE_WORLD_READABLE);
90     Runtime.getRuntime.exec(Array(new File(bindir, "prog").getPath,
91                                   "testing", "1", "2", "3"));
92   }
93 }