diff --git a/example/ivy/android/app/build.gradle b/example/ivy/android/app/build.gradle new file mode 100644 index 0000000..3f84626 --- /dev/null +++ b/example/ivy/android/app/build.gradle @@ -0,0 +1,27 @@ +apply plugin: 'com.android.application' + +android { + compileSdkVersion 22 + buildToolsVersion "22.0.1" + defaultConfig { + applicationId 'org.golang.ivy' + minSdkVersion 15 + targetSdkVersion 22 + versionCode 2 + versionName '1.0.1' + } + buildTypes { + release { + minifyEnabled true + proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' + } + } + productFlavors { + } +} + +dependencies { + compile fileTree(include: ['*.jar'], dir: 'libs') + compile 'com.android.support:appcompat-v7:22.1.1' + compile project(':ivy') +} diff --git a/example/ivy/android/app/proguard-rules.pro b/example/ivy/android/app/proguard-rules.pro new file mode 100644 index 0000000..3e3cea2 --- /dev/null +++ b/example/ivy/android/app/proguard-rules.pro @@ -0,0 +1,17 @@ +# Add project specific ProGuard rules here. +# By default, the flags in this file are appended to flags specified +# in /Users/hakim/Library/Android/sdk/tools/proguard/proguard-android.txt +# You can edit the include path and order by changing the proguardFiles +# directive in build.gradle. +# +# For more details, see +# http://developer.android.com/guide/developing/tools/proguard.html + +# Add any project specific keep options here: + +# If your project uses WebView with JS, uncomment the following +# and specify the fully qualified class name to the JavaScript interface +# class: +#-keepclassmembers class fqcn.of.javascript.interface.for.webview { +# public *; +#} diff --git a/example/ivy/android/app/src/androidTest/java/org/golang/ivy/ApplicationTest.java b/example/ivy/android/app/src/androidTest/java/org/golang/ivy/ApplicationTest.java new file mode 100644 index 0000000..45164f5 --- /dev/null +++ b/example/ivy/android/app/src/androidTest/java/org/golang/ivy/ApplicationTest.java @@ -0,0 +1,13 @@ +package org.golang.ivy; + +import android.app.Application; +import android.test.ApplicationTestCase; + +/** + * Testing Fundamentals + */ +public class ApplicationTest extends ApplicationTestCase { + public ApplicationTest() { + super(Application.class); + } +} diff --git a/example/ivy/android/app/src/main/AndroidManifest.xml b/example/ivy/android/app/src/main/AndroidManifest.xml new file mode 100644 index 0000000..62e28ba --- /dev/null +++ b/example/ivy/android/app/src/main/AndroidManifest.xml @@ -0,0 +1,52 @@ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/example/ivy/android/app/src/main/assets/aboutivy.html b/example/ivy/android/app/src/main/assets/aboutivy.html new file mode 100644 index 0000000..c03f107 --- /dev/null +++ b/example/ivy/android/app/src/main/assets/aboutivy.html @@ -0,0 +1,21 @@ + + + +
+

Ivy

+ + Based on robpike.io/ivy +

+ Copyright 2015 The Go Authors. +
+ The Ivy mascot is designed by + Renee French + and licensed under the + Creative Commons Attribution 3.0 license. +

+ + \ No newline at end of file diff --git a/example/ivy/android/app/src/main/assets/demo.ivy b/example/ivy/android/app/src/main/assets/demo.ivy new file mode 100755 index 0000000..7bc3551 --- /dev/null +++ b/example/ivy/android/app/src/main/assets/demo.ivy @@ -0,0 +1,229 @@ +# This is ivy. Type a newline to advance to each new step. Type one now. +# Each step in the demo is one line of input followed by some output from ivy. Type a newline now to see. +2+2 +# The first line you see above (2+2) is input; the next (4) is output from a running ivy. +# Comments start with # and produce no output. +# Whenever you like, you can type an expression yourself. Try typing 2*3 now, followed by two newlines: +# Keep typing newlines; the ivy demo is about to start. +# Arithmetic has the obvious operations: + - * etc. ** is exponentiation. mod is modulo. +23 +23 + 45 +23 * 45 +23 - 45 +7 ** 3 +7 mod 3 +# Operator precedence is unusual. +# Unary operators operate on everything to the right. +# Binary operators operate on the item immediately to the left, and everything to the right. +2*3+4 # Parsed as 2*(3+4), not the usual (2*3)+4. +2**2+3 # 2**5, not (2**2) + 3 +2**(2+3) # Use parentheses if you need to group differently. +# Ivy can do rational arithmetic, so 1/3 is really 1/3, not 0.333.... +1/3 +1/3 + 4/5 +1/3 ** 2 # We'll see non-integral exponents later. +# Even when a number is input in floating notation, it is still an exact rational number inside. +1.2 +# In fact, ivy is a "bignum" calculator that can handle huge numbers and rationals made of huge numers. +1e10 # Still an integer. +1e100 # Still an integer. +1e10/3 # Not an integer, but an exact rational. +3/1e10 # Not an integer, but an exact rational. +2**64 # They can get big. +2**640 # They can get really big. +# They can get really really big. Type a newline to see 2**6400 scroll by. +2**6400 +# Ivy also has characters, which represent a Unicode code point. +'x' +char 0x61 # char is an operator: character with given value. +char 0x1f4a9 +code '💩' # char's inverse, the value of given character, here printed in decimal. +# Everything in ivy can be placed into a vector. +# Vectors are written and displayed with spaces between the elements. +1 2 3 +1 4/3 5/3 (2+1/3) +# Vectors of characters print without quotes or spaces. +'h' 'e' 'l' 'l' 'o' +# This is a nicer way to write 'h' 'e' 'l' 'l' 'o'. It means the same. +'hello' +# Arithmetic works on vectors. +1 2 3 + 4 5 6 +# Arithmetic between scalar and vector also works, either way. +23 + 1 2 3 +1 2 3 + 23 # Note the grouping: vector is a single value. +# More fun with scalar and vector. +1 << 1 2 3 4 5 +(1 << 1 2 3 4 5) == (2 ** 1 2 3 4 5) # Note: true is 1, false is 0. +# iota is an "index generator": It counts from 1. +iota 10 +2 ** iota 5 +(1 << iota 100) == 2 ** iota 100 +2 ** -1 + iota 32 # Again, see how the precedence rules work. +# The take operator removes n items from the beginning of the vector. +3 take iota 10 +-3 take iota 10 # Negative n takes from the end. +# Drop is the other half: it drops n from the vector. +3 drop iota 10 +-3 drop iota 10 # Negative n drops from the end. +6 drop 'hello world' +# Reduction +iota 15 +# Add them up: +1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 11 + 12 + 13 + 14 + 15 +# Automate this by reducing + over the vector, like this: ++/iota 15 +# We can reduce using any binary operator. This is factorial: +1 * 2 * 3 * 4 * 5 * 6 * 7 * 8 * 9 * 10 +*/iota 10 +*/iota 100 +# Type this: */iota 10000 +# That printed using floating-point notation for manageability but it is still an integer inside. +# max and min are binary operators that do the obvious. (Use semicolons to separate expresssions.) +3 max 7; 'is max and'; 3 min 7; 'is min' +# Like all binary arithmetic operators, max applies elementwise. +2 3 4 max 4 3 2 +# Reduce using max to find maxmimum element in vector. +max/2 34 42 233 2 2 521 14 1 4 1 55 133 +# Ivy allows multidimensional arrays. The shape operator binary rho builds them. +# Dimension (which may be a vector) on the left, data on the right. +5 rho 1 +5 5 rho 1 +5 5 rho 25 +5 5 rho iota 25 +3 5 5 rho iota 125 +# Unary rho tells us the shape of an item. +x = 3 5 rho iota 15; x +rho x +x = 3 5 5 rho iota 75; x +rho x +# Arithmetic on matrices works as you would expect by now. +x/2 +x**2 +x**3 +x**10 +# Inner product is written with a . between the operators. +# This gives dot product: multiply corresponding elements and add the result. +1 2 3 4 +.* 2 3 4 5 +# Any operator works. How many items are the same? +(1 2 3) +.== (1 3 3) +# How many differ? +(1 2 3) +.!= (1 3 3) +# Outer product generates a matrix of all combinations applying the binary operator. +(iota 5) o.* -1 + iota 5 +# That's a letter 'o', dot, star. +# Any operator works; here is how to make an identity matrix. +x = iota 5; x o.== x +# Random numbers: Use a unary ? to roll an n-sided die from 1 to n. +?100 +?100 +?20 rho 6 # 20 rolls of a 6-sided die. +x = ?20 rho 6 # Remember one set of rolls. +x +# Indexing is easy. +x[1] +x[1 19 3] # You can index with a vector. +# The up and down operators generate index vectors that would sort the input. +up x +x[up x] +x[down x] +'hello world'[up 'hello world'] +'hello world'[down 'hello world'] +# More rolls of a die. +?10 rho 6 +# Remember a set of rolls. +x = ?10 rho 6; x +# The outer product of == and the integers puts 1 in each row where that value appeared. +# Compare the last row of the next result to the 6s in x. +(iota 6) o.== x +# Count the number of times each value appears by reducing the matrix horizontally. ++/(iota 6) o.== x +# Do it for a much larger set of rolls: is the die fair? ++/(iota 6) o.== ?60000 rho 6 +# Remember that ivy is a big number calculator. +*/iota 100 +2**64 +2**iota 64 +-1+2**63 +# Settings are made and queried with a leading right paren. )help lists the settings +)help +# Use )base to switch input and output to base 16. +)base 16 +)base # The input and output for settings is always base 10. +# _ is a variable that holds the most recently evaluated expression. It remembers our 63-bit number. +_ +1< + + + + + + + + \ No newline at end of file diff --git a/example/ivy/android/app/src/main/ic_launcher-web.png b/example/ivy/android/app/src/main/ic_launcher-web.png new file mode 100644 index 0000000..dfd4765 Binary files /dev/null and b/example/ivy/android/app/src/main/ic_launcher-web.png differ diff --git a/example/ivy/android/app/src/main/java/org/golang/ivy/AboutIvy.java b/example/ivy/android/app/src/main/java/org/golang/ivy/AboutIvy.java new file mode 100644 index 0000000..3b89eb5 --- /dev/null +++ b/example/ivy/android/app/src/main/java/org/golang/ivy/AboutIvy.java @@ -0,0 +1,55 @@ +/* + * Copyright 2015 The Go Authors. All rights reserved. + * Use of this source code is governed by a BSD-style + * license that can be found in the LICENSE file. + */ + +package org.golang.ivy; + +import android.content.Intent; +import android.net.Uri; +import android.os.Bundle; +import android.support.v7.app.AppCompatActivity; +import android.view.LayoutInflater; +import android.view.MenuItem; +import android.view.View; +import android.view.ViewGroup; +import android.webkit.WebView; +import android.webkit.WebViewClient; + +/* + * Handles About menu item. + */ +public class AboutIvy extends AppCompatActivity { + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_about); + + LayoutInflater inflater = getLayoutInflater(); + View layout = inflater.inflate(R.layout.activity_about, + (ViewGroup) findViewById(R.id.about_layout)); + + WebView webView = (WebView) layout.findViewById(R.id.about_ivy); + webView.setWebViewClient(new WebViewClient(){ + public boolean shouldOverrideUrlLoading(WebView view, String url) { + if (url != null && (url.startsWith("https://") || url.startsWith("http://"))) { + view.getContext().startActivity( + new Intent(Intent.ACTION_VIEW, Uri.parse(url))); + return true; + } else { + return false; + } + } + }); + webView.getSettings().setDefaultTextEncodingName("utf-8"); + webView.loadUrl("file:///android_asset/aboutivy.html"); + } + + @Override + public boolean onOptionsItemSelected(MenuItem item) { + onBackPressed(); // back to parent. + return true; + } +} diff --git a/example/ivy/android/app/src/main/java/org/golang/ivy/Help.java b/example/ivy/android/app/src/main/java/org/golang/ivy/Help.java new file mode 100644 index 0000000..ae6d1eb --- /dev/null +++ b/example/ivy/android/app/src/main/java/org/golang/ivy/Help.java @@ -0,0 +1,51 @@ +/** + * Copyright 2015 The Go Authors. All rights reserved. + * Use of this source code is governed by a BSD-style + * license that can be found in the LICENSE file. + */ + +package org.golang.ivy; + + +import android.content.Intent; +import android.net.Uri; +import android.os.Bundle; +import android.support.v7.app.AppCompatActivity; +import android.view.MenuItem; +import android.webkit.WebView; +import android.webkit.WebViewClient; + +import go.mobile.Mobile; + +/* + * Displays the help message for Ivy. + */ +public class Help extends AppCompatActivity { + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_help); + WebView webView = (WebView) findViewById(R.id.help_webview); + webView.setWebViewClient(new WebViewClient() { + public boolean shouldOverrideUrlLoading(WebView view, String url) { + // we are not a browser; redirect the request to proper apps. + if (url != null) { + view.getContext().startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse(url))); + } + return true; + } + }); + webView.getSettings().setDefaultTextEncodingName("utf-8"); + String helpMsg = Mobile.Help(); + // loadData has a rendering bug: https://code.google.com/p/android/issues/detail?id=6965 + webView.loadDataWithBaseURL("http://godoc.org/robpike.io/ivy", helpMsg, "text/html", "UTF-8", null); + webView.setBackgroundColor(getResources().getColor(R.color.body)); + } + + @Override + public boolean onOptionsItemSelected(MenuItem item) { + onBackPressed(); // back to parent. + return true; + } +} diff --git a/example/ivy/android/app/src/main/java/org/golang/ivy/MainActivity.java b/example/ivy/android/app/src/main/java/org/golang/ivy/MainActivity.java new file mode 100644 index 0000000..60f85d6 --- /dev/null +++ b/example/ivy/android/app/src/main/java/org/golang/ivy/MainActivity.java @@ -0,0 +1,302 @@ +/* + * Copyright 2015 The Go Authors. All rights reserved. + * Use of this source code is governed by a BSD-style + * license that can be found in the LICENSE file. + */ + +package org.golang.ivy; + +import android.content.Intent; +import android.content.pm.ApplicationInfo; +import android.net.Uri; +import android.os.AsyncTask; +import android.os.Build; +import android.os.Bundle; +import android.support.v7.app.AppCompatActivity; +import android.text.TextUtils; +import android.util.Log; +import android.util.Pair; +import android.view.KeyEvent; +import android.view.Menu; +import android.view.MenuInflater; +import android.view.MenuItem; +import android.view.View; +import android.webkit.WebView; +import android.webkit.WebViewClient; +import android.widget.EditText; +import android.widget.ImageButton; +import android.widget.ScrollView; +import android.widget.Toast; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStreamReader; + +import go.mobile.Mobile; // gobind generated class name. golang.org/issues/9660. + +/* + * Main activity that consists of an edit view to accept the expression + * and a web view to display output of the expression. + */ +public class MainActivity extends AppCompatActivity { + final String DEMO_SCRIPT = "demo.ivy"; + final String DEBUG_TAG = "Ivy"; + final String PROMPT = "> "; + + private WebView mWebView; + private EditText mEditText; + private ScrollView mScroller; + + private BufferedReader mDemo; + private ImageButton mOKButton; // enabled only in demo mode. + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_main); + + mScroller = (ScrollView) findViewById(R.id.scroller); + mWebView = (WebView) findViewById(R.id.webView); + mEditText = (EditText) findViewById(R.id.editText); + mOKButton = (ImageButton) findViewById(R.id.imageButton); + mOKButton.setVisibility(View.GONE); + + if (savedInstanceState != null) { + mWebView.restoreState(savedInstanceState); + } else { + clear(); + } + + mWebView.setWebViewClient(new WebViewClient() { + // Disallow arbitrary contents loaded into our own webview. + public boolean shouldOverrideUrlLoading(WebView view, String url) { + view.getContext().startActivity( + new Intent(Intent.ACTION_VIEW, Uri.parse(url))); + return true; + } + }); + mWebView.getSettings().setJavaScriptEnabled(true); + mWebView.setFocusable(false); + mWebView.addOnLayoutChangeListener(new View.OnLayoutChangeListener() { + @Override + public void onLayoutChange(View v, int left, int top, int right, int bottom, + int oldLeft, int oldTop, int oldRight, int oldBottom) { + // It's possible that the layout is not complete. + // In that case we will get all zero values for the positions. Ignore this case. + if (left == 0 && top == 0 && right == 0 && bottom == 0) { + return; + } + scrollToBottom(); + } + }); + + mEditText.requestFocus(); + mEditText.setOnKeyListener(new View.OnKeyListener() { + public boolean onKey(View v, int keyCode, KeyEvent event) { + if ((event.getAction() == KeyEvent.ACTION_DOWN) && (keyCode == KeyEvent.KEYCODE_ENTER)) { + callIvy(); + return true; + } + return false; + } + }); + + mOKButton.setOnClickListener(new View.OnClickListener() { + public void onClick(View v) { + callIvy(); + } + }); + + /* For webview debugging - visit chrome://inspect/#devices */ + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { + if (0 != (getApplicationInfo().flags &= ApplicationInfo.FLAG_DEBUGGABLE)) + { WebView.setWebContentsDebuggingEnabled(true); } + } + } + + @Override + protected void onSaveInstanceState(Bundle outState) { + mWebView.saveState(outState); + super.onSaveInstanceState(outState); + } + + public void onRestoreInstanceState(Bundle savedInstanceState) { + super.onRestoreInstanceState(savedInstanceState); + mWebView.restoreState(savedInstanceState); + } + + @Override + public boolean onCreateOptionsMenu(Menu menu) { + MenuInflater inflater = getMenuInflater(); + inflater.inflate(R.menu.menu_main, menu); + return true; + } + + private long mLastPress = 0; + @Override + public void onBackPressed() { + // TODO: store and restore the state across app restarts. + long currentTime = System.currentTimeMillis(); + if(currentTime - mLastPress > 6000){ + Toast.makeText(getBaseContext(), "Press back again to exit.\nAll app state will be lost upon exit.", Toast.LENGTH_LONG).show(); + mLastPress = currentTime; + }else{ + super.onBackPressed(); + } + } + + @Override + public boolean onOptionsItemSelected(MenuItem item) { + int id = item.getItemId(); + switch (id) { + case R.id.action_about: + startActivity(new Intent(this, AboutIvy.class)); + return true; + case R.id.action_help: + startActivity(new Intent(this, Help.class)); + return true; + case R.id.action_clear: + clear(); + return true; + case R.id.action_demo: + loadDemo(); + return true; + default: + return super.onOptionsItemSelected(item); + } + } + + private void clear() { + mWebView.loadUrl("file:///android_asset/tape.html"); + mWebView.setBackgroundColor(getResources().getColor(R.color.body)); + mEditText.setText(""); + + Mobile.Reset(); + unloadDemo(); + } + + private void appendShowText(final String s, final String tag) { + mWebView.loadUrl("javascript:appendDiv('" + TextUtils.htmlEncode(s).replaceAll("(\r\n|\n)", "
") + "', '" + tag + "')"); + mWebView.setBackgroundColor(getResources().getColor(R.color.body)); + } + + private void callIvy() { + String s = mEditText.getText().toString().trim(); + if (s != null && !s.isEmpty()) { + appendShowText(PROMPT + s, "expr"); + } + new IvyCallTask().execute(s); // where call to Ivy backend occurs. + } + + private synchronized void loadDemo() { + try { + if (mDemo == null) { + mDemo = new BufferedReader(new InputStreamReader(getAssets().open(DEMO_SCRIPT), "UTF-8")); + } + mOKButton.setVisibility(View.VISIBLE); + new IvyCallTask().execute(""); + } catch (IOException e) { + Toast.makeText(this, "Failed to load Demo script.\nContact the app author.", Toast.LENGTH_SHORT); + } + } + + private synchronized void unloadDemo() { + if (mDemo == null) { return; } + try { + mDemo.close(); + } catch (IOException e) { + Log.d(DEBUG_TAG, e.toString()); + } + mDemo = null; + mOKButton.setVisibility(View.GONE); + } + + private synchronized String readDemo() { + if (mDemo == null) { return null; } + try { + return mDemo.readLine(); + } catch (IOException e) { + unloadDemo(); + } + return null; + } + + private void scrollToBottom() { + mScroller.post(new Runnable() { + public void run() { + mScroller.smoothScrollTo(0, mWebView.getBottom()); + } + }); + } + + // AsyncTask that evaluates the expression (string), and returns the strings + // to display in the web view and the edit view respectively. + private class IvyCallTask extends AsyncTask > { + private String ivyEval(final String expr) { + try { + return Mobile.Eval(expr); // Gobind-generated method. + } catch (Exception e) { + return "error: "+e.getMessage(); + } + } + + // doInBackground checks the demo script (if the passed-in param is empty), + // or returns the ivy evaluation result. + @Override + protected Pair doInBackground(String ...param) { + final String expr = param[0]; + // TODO: cancel, timeout + if (expr == null || expr.isEmpty()) { + return checkDemo(); + } + return Pair.create(ivyEval(expr), ""); + } + + // checkDemo reads the demo script and returns the comment, and the next expression. + protected Pair checkDemo() { + String showText = null; + while (true) { + String s = readDemo(); + if (s == null) { return Pair.create(showText, null); } + + int sharp = s.indexOf("#"); + if (sharp < 0) { + return Pair.create(showText, s); + } + s += "\n"; + if (showText == null) { + showText = s.substring(sharp, s.length()); + } else { + showText += s.substring(sharp, s.length()); + } + if (sharp > 0) { + return Pair.create(s.substring(sharp, s.length()), s.substring(0, sharp)); + } + } + } + + @Override + protected void onPostExecute(final Pair result) { + if (result == null || (result.first == null && result.second == null)) { + return; + } + runOnUiThread(new Runnable() { + @Override + public void run() { + String showText = result.first; + if (showText != null) { + if (showText.startsWith("#")) { + appendShowText(showText, "comment"); + } else { + appendShowText(showText, "result"); + } + } + String editText = result.second; + if (editText != null) { + mEditText.setText(editText); + } + } + }); + } + } +} diff --git a/example/ivy/android/app/src/main/res/drawable-hdpi/actionbar_solid.png b/example/ivy/android/app/src/main/res/drawable-hdpi/actionbar_solid.png new file mode 100755 index 0000000..0aa6033 Binary files /dev/null and b/example/ivy/android/app/src/main/res/drawable-hdpi/actionbar_solid.png differ diff --git a/example/ivy/android/app/src/main/res/drawable-hdpi/ic_done_white_24dp.png b/example/ivy/android/app/src/main/res/drawable-hdpi/ic_done_white_24dp.png new file mode 100644 index 0000000..c278b6c Binary files /dev/null and b/example/ivy/android/app/src/main/res/drawable-hdpi/ic_done_white_24dp.png differ diff --git a/example/ivy/android/app/src/main/res/drawable-mdpi/actionbar_solid.png b/example/ivy/android/app/src/main/res/drawable-mdpi/actionbar_solid.png new file mode 100755 index 0000000..632bb32 Binary files /dev/null and b/example/ivy/android/app/src/main/res/drawable-mdpi/actionbar_solid.png differ diff --git a/example/ivy/android/app/src/main/res/drawable-mdpi/ic_done_white_24dp.png b/example/ivy/android/app/src/main/res/drawable-mdpi/ic_done_white_24dp.png new file mode 100644 index 0000000..6d84e14 Binary files /dev/null and b/example/ivy/android/app/src/main/res/drawable-mdpi/ic_done_white_24dp.png differ diff --git a/example/ivy/android/app/src/main/res/drawable-xhdpi/actionbar_solid.png b/example/ivy/android/app/src/main/res/drawable-xhdpi/actionbar_solid.png new file mode 100755 index 0000000..01501ce Binary files /dev/null and b/example/ivy/android/app/src/main/res/drawable-xhdpi/actionbar_solid.png differ diff --git a/example/ivy/android/app/src/main/res/drawable-xhdpi/ic_done_white_24dp.png b/example/ivy/android/app/src/main/res/drawable-xhdpi/ic_done_white_24dp.png new file mode 100644 index 0000000..3b2b65d Binary files /dev/null and b/example/ivy/android/app/src/main/res/drawable-xhdpi/ic_done_white_24dp.png differ diff --git a/example/ivy/android/app/src/main/res/drawable-xxhdpi/actionbar_solid.png b/example/ivy/android/app/src/main/res/drawable-xxhdpi/actionbar_solid.png new file mode 100755 index 0000000..f5c2f2f Binary files /dev/null and b/example/ivy/android/app/src/main/res/drawable-xxhdpi/actionbar_solid.png differ diff --git a/example/ivy/android/app/src/main/res/drawable-xxhdpi/ic_done_white_24dp.png b/example/ivy/android/app/src/main/res/drawable-xxhdpi/ic_done_white_24dp.png new file mode 100644 index 0000000..0ebb555 Binary files /dev/null and b/example/ivy/android/app/src/main/res/drawable-xxhdpi/ic_done_white_24dp.png differ diff --git a/example/ivy/android/app/src/main/res/drawable/circle_shape.xml b/example/ivy/android/app/src/main/res/drawable/circle_shape.xml new file mode 100644 index 0000000..d905d2c --- /dev/null +++ b/example/ivy/android/app/src/main/res/drawable/circle_shape.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/example/ivy/android/app/src/main/res/drawable/ivyabout.png b/example/ivy/android/app/src/main/res/drawable/ivyabout.png new file mode 100644 index 0000000..3b515f7 Binary files /dev/null and b/example/ivy/android/app/src/main/res/drawable/ivyabout.png differ diff --git a/example/ivy/android/app/src/main/res/layout/activity_about.xml b/example/ivy/android/app/src/main/res/layout/activity_about.xml new file mode 100644 index 0000000..90fbd83 --- /dev/null +++ b/example/ivy/android/app/src/main/res/layout/activity_about.xml @@ -0,0 +1,30 @@ + + + + + + + + + \ No newline at end of file diff --git a/example/ivy/android/app/src/main/res/layout/activity_help.xml b/example/ivy/android/app/src/main/res/layout/activity_help.xml new file mode 100644 index 0000000..80d12e8 --- /dev/null +++ b/example/ivy/android/app/src/main/res/layout/activity_help.xml @@ -0,0 +1,14 @@ + + + + + diff --git a/example/ivy/android/app/src/main/res/layout/activity_main.xml b/example/ivy/android/app/src/main/res/layout/activity_main.xml new file mode 100644 index 0000000..7f64795 --- /dev/null +++ b/example/ivy/android/app/src/main/res/layout/activity_main.xml @@ -0,0 +1,69 @@ + + + + + + + + + + + + + + + + + diff --git a/example/ivy/android/app/src/main/res/menu/menu_about.xml b/example/ivy/android/app/src/main/res/menu/menu_about.xml new file mode 100644 index 0000000..354a9fd --- /dev/null +++ b/example/ivy/android/app/src/main/res/menu/menu_about.xml @@ -0,0 +1,10 @@ + + + diff --git a/example/ivy/android/app/src/main/res/menu/menu_main.xml b/example/ivy/android/app/src/main/res/menu/menu_main.xml new file mode 100644 index 0000000..578ceec --- /dev/null +++ b/example/ivy/android/app/src/main/res/menu/menu_main.xml @@ -0,0 +1,24 @@ + + + + + + + + + + + diff --git a/example/ivy/android/app/src/main/res/mipmap-hdpi/ic_launcher.png b/example/ivy/android/app/src/main/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 0000000..b5ae956 Binary files /dev/null and b/example/ivy/android/app/src/main/res/mipmap-hdpi/ic_launcher.png differ diff --git a/example/ivy/android/app/src/main/res/mipmap-mdpi/ic_launcher.png b/example/ivy/android/app/src/main/res/mipmap-mdpi/ic_launcher.png new file mode 100644 index 0000000..0ce0f3d Binary files /dev/null and b/example/ivy/android/app/src/main/res/mipmap-mdpi/ic_launcher.png differ diff --git a/example/ivy/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png b/example/ivy/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png new file mode 100644 index 0000000..14292ee Binary files /dev/null and b/example/ivy/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png differ diff --git a/example/ivy/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png b/example/ivy/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png new file mode 100644 index 0000000..58147bd Binary files /dev/null and b/example/ivy/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png differ diff --git a/example/ivy/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/example/ivy/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png new file mode 100644 index 0000000..a3786cb Binary files /dev/null and b/example/ivy/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png differ diff --git a/example/ivy/android/app/src/main/res/values-w820dp/dimens.xml b/example/ivy/android/app/src/main/res/values-w820dp/dimens.xml new file mode 100644 index 0000000..63fc816 --- /dev/null +++ b/example/ivy/android/app/src/main/res/values-w820dp/dimens.xml @@ -0,0 +1,6 @@ + + + 64dp + diff --git a/example/ivy/android/app/src/main/res/values-w820dp/strings.xml b/example/ivy/android/app/src/main/res/values-w820dp/strings.xml new file mode 100644 index 0000000..4f1fe09 --- /dev/null +++ b/example/ivy/android/app/src/main/res/values-w820dp/strings.xml @@ -0,0 +1,4 @@ + + + OK + \ No newline at end of file diff --git a/example/ivy/android/app/src/main/res/values/colors.xml b/example/ivy/android/app/src/main/res/values/colors.xml new file mode 100644 index 0000000..9a29a7d --- /dev/null +++ b/example/ivy/android/app/src/main/res/values/colors.xml @@ -0,0 +1,11 @@ + + + + + #ffffeb + #e2f6ff + #1997d4 + #f9f9f9 + #000000 + + \ No newline at end of file diff --git a/example/ivy/android/app/src/main/res/values/dimens.xml b/example/ivy/android/app/src/main/res/values/dimens.xml new file mode 100644 index 0000000..47c8224 --- /dev/null +++ b/example/ivy/android/app/src/main/res/values/dimens.xml @@ -0,0 +1,5 @@ + + + 16dp + 16dp + diff --git a/example/ivy/android/app/src/main/res/values/strings.xml b/example/ivy/android/app/src/main/res/values/strings.xml new file mode 100644 index 0000000..77e1016 --- /dev/null +++ b/example/ivy/android/app/src/main/res/values/strings.xml @@ -0,0 +1,51 @@ + + Ivy + + Hello world! + Settings + Help + About + Clear + Demo + + + by Go Authors + About Ivy + Help + ivy_sketch + type an expression + ivy sketch + OK + + + ceil + floor + rho + abs + iota + sgn + rev + flip + up + down + div + idiv + max + min + rho + take + drop + mod + imod + or + and + nor + nand + xor + def + ) format + ) op + ) base + ) origin + + diff --git a/example/ivy/android/app/src/main/res/values/styles.xml b/example/ivy/android/app/src/main/res/values/styles.xml new file mode 100644 index 0000000..e862e92 --- /dev/null +++ b/example/ivy/android/app/src/main/res/values/styles.xml @@ -0,0 +1,16 @@ + + + + + + + diff --git a/example/ivy/android/build.gradle b/example/ivy/android/build.gradle new file mode 100644 index 0000000..9405f3f --- /dev/null +++ b/example/ivy/android/build.gradle @@ -0,0 +1,19 @@ +// Top-level build file where you can add configuration options common to all sub-projects/modules. + +buildscript { + repositories { + jcenter() + } + dependencies { + classpath 'com.android.tools.build:gradle:1.2.3' + + // NOTE: Do not place your application dependencies here; they belong + // in the individual module build.gradle files + } +} + +allprojects { + repositories { + jcenter() + } +} diff --git a/example/ivy/android/gradle.properties b/example/ivy/android/gradle.properties new file mode 100644 index 0000000..1d3591c --- /dev/null +++ b/example/ivy/android/gradle.properties @@ -0,0 +1,18 @@ +# Project-wide Gradle settings. + +# IDE (e.g. Android Studio) users: +# Gradle settings configured through the IDE *will override* +# any settings specified in this file. + +# For more details on how to configure your build environment visit +# http://www.gradle.org/docs/current/userguide/build_environment.html + +# Specifies the JVM arguments used for the daemon process. +# The setting is particularly useful for tweaking memory settings. +# Default value: -Xmx10248m -XX:MaxPermSize=256m +# org.gradle.jvmargs=-Xmx2048m -XX:MaxPermSize=512m -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8 + +# When configured, Gradle will run in incubating parallel mode. +# This option should only be used with decoupled projects. More details, visit +# http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects +# org.gradle.parallel=true \ No newline at end of file diff --git a/example/ivy/android/ivy/build.gradle b/example/ivy/android/ivy/build.gradle new file mode 100644 index 0000000..a9c5833 --- /dev/null +++ b/example/ivy/android/ivy/build.gradle @@ -0,0 +1,24 @@ +// 2015 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +plugins { + id "org.golang.mobile.bind" version "0.2.2" +} + +gobind { + pkg = "robpike.io/ivy/mobile" + + /* Set the following variable(s): + + GOPATH: where the Go package is; check `go env`. This is required. + ex) GOPATH="/my/go/path". + + GO: if the Go binary is not in the usual place, specify + the absolute path to the go binary. + + GOMOBILE: optionally, you can set the absolute path to the gomobile + binary if the gomobile binary is not located in the GOPATH's + bin directory. + */ +} diff --git a/example/ivy/android/settings.gradle b/example/ivy/android/settings.gradle new file mode 100644 index 0000000..8759a03 --- /dev/null +++ b/example/ivy/android/settings.gradle @@ -0,0 +1 @@ +include ':app', ':ivy'