From 0fb1281cb3b02d3bd6174e861fb2da16c0154bd3 Mon Sep 17 00:00:00 2001 From: Andrew n marshall Date: Thu, 2 Aug 2018 11:50:40 -0700 Subject: [PATCH 1/9] Android demo initial project creation. --- demos/android/.gitignore | 26 +++ demos/android/app/.gitignore | 1 + demos/android/app/build.gradle | 30 +++ demos/android/app/proguard-rules.pro | 21 +++ .../ExampleInstrumentedTest.java | 26 +++ .../android/app/src/main/AndroidManifest.xml | 21 +++ .../android/webview/demo/MainActivity.java | 15 ++ .../drawable-v24/ic_launcher_foreground.xml | 34 ++++ .../res/drawable/ic_launcher_background.xml | 74 ++++++++ .../app/src/main/res/layout/activity_main.xml | 19 ++ .../res/mipmap-anydpi-v26/ic_launcher.xml | 5 + .../mipmap-anydpi-v26/ic_launcher_round.xml | 5 + .../src/main/res/mipmap-hdpi/ic_launcher.png | Bin 0 -> 3056 bytes .../res/mipmap-hdpi/ic_launcher_round.png | Bin 0 -> 5024 bytes .../src/main/res/mipmap-mdpi/ic_launcher.png | Bin 0 -> 2096 bytes .../res/mipmap-mdpi/ic_launcher_round.png | Bin 0 -> 2858 bytes .../src/main/res/mipmap-xhdpi/ic_launcher.png | Bin 0 -> 4569 bytes .../res/mipmap-xhdpi/ic_launcher_round.png | Bin 0 -> 7098 bytes .../main/res/mipmap-xxhdpi/ic_launcher.png | Bin 0 -> 6464 bytes .../res/mipmap-xxhdpi/ic_launcher_round.png | Bin 0 -> 10676 bytes .../main/res/mipmap-xxxhdpi/ic_launcher.png | Bin 0 -> 9250 bytes .../res/mipmap-xxxhdpi/ic_launcher_round.png | Bin 0 -> 15523 bytes .../app/src/main/res/values/colors.xml | 6 + .../app/src/main/res/values/strings.xml | 3 + .../app/src/main/res/values/styles.xml | 11 ++ .../blocklywebview/ExampleUnitTest.java | 17 ++ demos/android/build.gradle | 27 +++ demos/android/gradle.properties | 13 ++ .../android/gradle/wrapper/gradle-wrapper.jar | Bin 0 -> 54708 bytes .../gradle/wrapper/gradle-wrapper.properties | 6 + demos/android/gradlew | 172 ++++++++++++++++++ demos/android/gradlew.bat | 84 +++++++++ demos/android/settings.gradle | 1 + 33 files changed, 617 insertions(+) create mode 100644 demos/android/.gitignore create mode 100644 demos/android/app/.gitignore create mode 100644 demos/android/app/build.gradle create mode 100644 demos/android/app/proguard-rules.pro create mode 100644 demos/android/app/src/androidTest/java/com/example/blocklywebview/ExampleInstrumentedTest.java create mode 100644 demos/android/app/src/main/AndroidManifest.xml create mode 100644 demos/android/app/src/main/java/com/google/blockly/android/webview/demo/MainActivity.java create mode 100644 demos/android/app/src/main/res/drawable-v24/ic_launcher_foreground.xml create mode 100644 demos/android/app/src/main/res/drawable/ic_launcher_background.xml create mode 100644 demos/android/app/src/main/res/layout/activity_main.xml create mode 100644 demos/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml create mode 100644 demos/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml create mode 100644 demos/android/app/src/main/res/mipmap-hdpi/ic_launcher.png create mode 100644 demos/android/app/src/main/res/mipmap-hdpi/ic_launcher_round.png create mode 100644 demos/android/app/src/main/res/mipmap-mdpi/ic_launcher.png create mode 100644 demos/android/app/src/main/res/mipmap-mdpi/ic_launcher_round.png create mode 100644 demos/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png create mode 100644 demos/android/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png create mode 100644 demos/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png create mode 100644 demos/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png create mode 100644 demos/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png create mode 100644 demos/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png create mode 100644 demos/android/app/src/main/res/values/colors.xml create mode 100644 demos/android/app/src/main/res/values/strings.xml create mode 100644 demos/android/app/src/main/res/values/styles.xml create mode 100644 demos/android/app/src/test/java/com/example/blocklywebview/ExampleUnitTest.java create mode 100644 demos/android/build.gradle create mode 100644 demos/android/gradle.properties create mode 100644 demos/android/gradle/wrapper/gradle-wrapper.jar create mode 100644 demos/android/gradle/wrapper/gradle-wrapper.properties create mode 100755 demos/android/gradlew create mode 100644 demos/android/gradlew.bat create mode 100644 demos/android/settings.gradle diff --git a/demos/android/.gitignore b/demos/android/.gitignore new file mode 100644 index 000000000..0718494ec --- /dev/null +++ b/demos/android/.gitignore @@ -0,0 +1,26 @@ +/build +/captures +.settings +.project + +# Local Settings +local.properties + +# Project files +*.komodoproject +.gradle +*.iml +.idea + +# Build files +*.pyc +*.apk +*.ap_ +*.class +*.dex + +# OSX Files +.DS_Store + +# Windows Files +Thumb.db diff --git a/demos/android/app/.gitignore b/demos/android/app/.gitignore new file mode 100644 index 000000000..796b96d1c --- /dev/null +++ b/demos/android/app/.gitignore @@ -0,0 +1 @@ +/build diff --git a/demos/android/app/build.gradle b/demos/android/app/build.gradle new file mode 100644 index 000000000..e80e4cbce --- /dev/null +++ b/demos/android/app/build.gradle @@ -0,0 +1,30 @@ +apply plugin: 'com.android.application' + +android { + compileSdkVersion 27 + defaultConfig { + applicationId 'com.google.blockly.android.webview.demo' + minSdkVersion 19 + targetSdkVersion 27 + versionCode 1 + versionName "1.0" + testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" + } + buildTypes { + release { + minifyEnabled false + proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' + } + } + productFlavors { + } +} + +dependencies { + implementation fileTree(include: ['*.jar'], dir: 'libs') + implementation 'com.android.support:appcompat-v7:27.1.1' + implementation 'com.android.support.constraint:constraint-layout:1.1.2' + testImplementation 'junit:junit:4.12' + androidTestImplementation 'com.android.support.test:runner:1.0.2' + androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2' +} diff --git a/demos/android/app/proguard-rules.pro b/demos/android/app/proguard-rules.pro new file mode 100644 index 000000000..f1b424510 --- /dev/null +++ b/demos/android/app/proguard-rules.pro @@ -0,0 +1,21 @@ +# Add project specific ProGuard rules here. +# You can control the set of applied configuration files using the +# proguardFiles setting in build.gradle. +# +# For more details, see +# http://developer.android.com/guide/developing/tools/proguard.html + +# 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 *; +#} + +# Uncomment this to preserve the line number information for +# debugging stack traces. +#-keepattributes SourceFile,LineNumberTable + +# If you keep the line number information, uncomment this to +# hide the original source file name. +#-renamesourcefileattribute SourceFile diff --git a/demos/android/app/src/androidTest/java/com/example/blocklywebview/ExampleInstrumentedTest.java b/demos/android/app/src/androidTest/java/com/example/blocklywebview/ExampleInstrumentedTest.java new file mode 100644 index 000000000..587556632 --- /dev/null +++ b/demos/android/app/src/androidTest/java/com/example/blocklywebview/ExampleInstrumentedTest.java @@ -0,0 +1,26 @@ +package com.example.blocklywebview; + +import android.content.Context; +import android.support.test.InstrumentationRegistry; +import android.support.test.runner.AndroidJUnit4; + +import org.junit.Test; +import org.junit.runner.RunWith; + +import static org.junit.Assert.*; + +/** + * Instrumented test, which will execute on an Android device. + * + * @see Testing documentation + */ +@RunWith(AndroidJUnit4.class) +public class ExampleInstrumentedTest { + @Test + public void useAppContext() { + // Context of the app under test. + Context appContext = InstrumentationRegistry.getTargetContext(); + + assertEquals("com.example.blocklywebview", appContext.getPackageName()); + } +} diff --git a/demos/android/app/src/main/AndroidManifest.xml b/demos/android/app/src/main/AndroidManifest.xml new file mode 100644 index 000000000..1531ff2dd --- /dev/null +++ b/demos/android/app/src/main/AndroidManifest.xml @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/demos/android/app/src/main/java/com/google/blockly/android/webview/demo/MainActivity.java b/demos/android/app/src/main/java/com/google/blockly/android/webview/demo/MainActivity.java new file mode 100644 index 000000000..58cb54d92 --- /dev/null +++ b/demos/android/app/src/main/java/com/google/blockly/android/webview/demo/MainActivity.java @@ -0,0 +1,15 @@ +package com.google.blockly.android.webview.demo; + +import android.support.v7.app.AppCompatActivity; +import android.os.Bundle; + +import com.example.blocklywebview.R; + +public class MainActivity extends AppCompatActivity { + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_main); + } +} diff --git a/demos/android/app/src/main/res/drawable-v24/ic_launcher_foreground.xml b/demos/android/app/src/main/res/drawable-v24/ic_launcher_foreground.xml new file mode 100644 index 000000000..c3903edf4 --- /dev/null +++ b/demos/android/app/src/main/res/drawable-v24/ic_launcher_foreground.xml @@ -0,0 +1,34 @@ + + + + + + + + + + + diff --git a/demos/android/app/src/main/res/drawable/ic_launcher_background.xml b/demos/android/app/src/main/res/drawable/ic_launcher_background.xml new file mode 100644 index 000000000..9d478f4c2 --- /dev/null +++ b/demos/android/app/src/main/res/drawable/ic_launcher_background.xml @@ -0,0 +1,74 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/demos/android/app/src/main/res/layout/activity_main.xml b/demos/android/app/src/main/res/layout/activity_main.xml new file mode 100644 index 000000000..3dc9926ad --- /dev/null +++ b/demos/android/app/src/main/res/layout/activity_main.xml @@ -0,0 +1,19 @@ + + + + + + \ No newline at end of file diff --git a/demos/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml b/demos/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml new file mode 100644 index 000000000..bbd3e0212 --- /dev/null +++ b/demos/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/demos/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml b/demos/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml new file mode 100644 index 000000000..bbd3e0212 --- /dev/null +++ b/demos/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/demos/android/app/src/main/res/mipmap-hdpi/ic_launcher.png b/demos/android/app/src/main/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..a2f5908281d070150700378b64a84c7db1f97aa1 GIT binary patch literal 3056 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 axPAxe%7rDusX+w*00006jj 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⁣ zwiG+x#%j}{0gU~J8;<|!B1@-XaB@{KORFwrYg_8rOv({b0EO#DbeQRm;B6_9=mXGf z-x|VL{zd`)#@yN}HkCSJbjbNlE|zL3Wm9Q8HY`sV)}3%pgN>cL^67{Z;PPL(*wT8N zUjXU{@|*hvm}({wsAC=x0^ok0%UAz0;sogW{B!nDqk|JJ5x~4NfTDgP49^zeu`csl?5mY@JdQdISc zFs!E{^grmkLnUk9 zny~m)1vws@5BFI<-0Tuo2JWX(0v`W|t(wg;s--L47WTvTMz-8l#TL^=OJNRS2?_Qj z3AKT+gvbyBi#H*-tJ%tWD|>EV3wy|8qxfzS!5RW;Jpl5*zo&^UBU=fG#2}UvRyNkK zA06Dy9;K1ca@r2T>yThYgI!ont$(G{6q#2QT+00r_x0(b)gsE`lBB?2gr55gq^D3Fi&p%E(p9>U%bv zkg1Jco(RbyTX7FDHOnl7-O@ zI$AaIl?9NJKPm(WiBP`1-#CB1QzU>&hKm)fpa5DKE{2$X0hGz-0uZ?cyTk(YC!Y&| zL=1VrNERSA5NA2jq7FACfX4JfPyj5XXl1yv0>~s;eF7L2$>&oMqeTFT2m$y7FlkON z_yurD1yIOvA;5C6016pyxBznGUt0kJ&k5r#;&>Jow`r)sp9R~PmK~lz$3xH%LT*1U zJdOyABZ3!FvNoR*vN$5ykHS8f`jA4zV+|L}i1C4`B2c{R0;UdYxaU|H)2avz@ z=mEYc|2S<+(B2Tj+FkX+2D+yFI!k9lWMA61DJ{)e;lum$(;O87?vGJJe!KtK04+N_ zI*P~t@dUb>9Xh{dbyl{-ZQ(UMgz7$|QfL5XSPkskt^NgctYC#;4WcZB1@%@wy@2t3 z2z0DI7&%b$*Aw~abe?GxE`ez@+6hOh-6*8fHRV{1os$EL@}uUZeG4h1&Be`98q*7j z=3-v+lhIjfWVo12!<>%V^a6lTgW3+_#W6n|p*~==zOH7z$0{LSZk(Tpd7EaD04hnA zL;#fxS0aD{`5^&D`}>0Uq?byDD-l2=!wm_bLcUl4gc(% za1p|itVANvFF>hghAS07Im1;IK;|b*W)}VDyI;BIp2=K*yu2a)j?B|f<44NI$NbmJ z#dE0>jI$fMr&@>4kN8MLFb4&2O9fEKaQg%(QO$4_1rVQywG^CmBLh#}_7gKW3vd?| z2?1^&KWq8}8I^_S0|)MowU_pw$q@nl@Nkn$z>BQq_KA^9yaR`(R3u{{Ig;cwt z@AJ^{ODQCm^neroM9nKNUAXi9RCK`OsP_LuR0PUR(YZCCX5dNF6VzcoK&=b^r`W?ltt|*F zpkoae%ZT{C1h~EcFui~b7fF`vb<<~j_VquuUA$}QqIKYELPp#;{u?q8Dz}WAG-(3; zjrm$i%7UbyZMM(Y{>!uJ#vNB?R~B{6Htp=>e*<{fQQ5W7V(1coCWlOON!MzZxhum| ztZBQpGR z;~#ur^&PockKdV{Q6R>o`Pl{0x!DEbpZ7y9Y;*ZvE!*gU`V1W3znva{f=?WO5I&>B z&hw6}tjECtaghm5z|C#%M;Yf_*pI^};h}Vl=^r9EN=tVDj86D;C$jIJ?K7VP+00000NkvXXu0mjf D5i!M* literal 0 HcmV?d00001 diff --git a/demos/android/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png b/demos/android/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png new file mode 100644 index 0000000000000000000000000000000000000000..459ca609d3ae0d3943ab44cdc27feef9256dc6d7 GIT binary patch literal 7098 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 literal 0 HcmV?d00001 diff --git a/demos/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png b/demos/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..8ca12fe024be86e868d14e91120a6902f8e88ac6 GIT binary patch literal 6464 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 B0*L?s literal 0 HcmV?d00001 diff --git a/demos/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png b/demos/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png new file mode 100644 index 0000000000000000000000000000000000000000..8e19b410a1b15ff180f3dacac19395fe3046cdec GIT binary patch literal 10676 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 literal 0 HcmV?d00001 diff --git a/demos/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png b/demos/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png new file mode 100644 index 0000000000000000000000000000000000000000..4c19a13c239cb67b8a2134ddd5f325db1d2d5bee GIT binary patch literal 15523 zcmZu&byQSev_3Py&@gnDfPjP`DLFJqiULXtibx~fLnvK>bPOP+(%nO&(%r2fA>H-( zz4z~1>*iYL?tRWZ_k8=?-?=ADTT_`3j}{LAK&YyspmTRd|F`47?v6Thw%7njTB|C^ zKKGc}$-p)u@1g1$=G5ziQhGf`pecnFHQK@{)H)R`NQF;K%92o17K-93yUfN21$b29 zQwz1oFs@r6GO|&!sP_4*_5J}y@1EmX38MLHp9O5Oe0Nc6{^^wzO4l(d z;mtZ_YZu`gPyE@_DZic*_^gGkxh<(}XliiFNpj1&`$dYO3scX$PHr^OPt}D-`w9aR z4}a$o1nmaz>bV)|i2j5($CXJ<=V0%{^_5JXJ2~-Q=5u(R41}kRaj^33P50Hg*ot1f z?w;RDqu}t{QQ%88FhO3t>0-Sy@ck7!K1c53XC+HJeY@B0BH+W}BTA1!ueRG49Clr? z+R!2Jlc`n)zZ?XWaZO0BnqvRN#k{$*;dYA4UO&o_-b>h3>@8fgSjOUsv0wVwlxy0h z{E1|}P_3K!kMbGZt_qQIF~jd+Km4P8D0dwO{+jQ1;}@_Weti;`V}a_?BkaNJA?PXD zNGH$uRwng<4o9{nk4gW z3E-`-*MB=(J%0*&SA1UclA>pLfP4H?eSsQV$G$t!uXTEio7TY9E35&?0M-ERfX4he z{_Hb&AE`T%j8hIZEp@yBVycpvW2!bHrfxbuu6>_i<^9@?ak)9gHU*#bS~}$sGY*Fi z=%P&i3aH%N`b;I~s8{&6uGo$>-`ukQ<8ri(6aH6p_F`Fhdi6HuacwfQn10HVL7Om1 z4aZpjatkbgjp$L5Mceab#G#C)Hr{^W|TJX~?B3@2buj0;kfuNTf4c3*Au~O^aj=W2$j^4okeCxh#lwexN@eam-u4dNz zN2NIuIM4566{T&^k%4ftShcPk#=im-zXm>QWqH^0>A@?MqlDZCZ@8Wi*@tvhn5p<} zRwFm@gz|WZp91S5Z{}tB^e9|FBg(~Ik+?&_53J6ye_QQOSJ*846~H%s#LD}|O9v9H z1fLrrgoPo_&bs}eqEr}2en3iqAcP^>YsKiez$5-6m6(#3ZZ$@M5Ck=_Vv`QA>1A*v z3w-nJ_;5Nc(0_%`kG91#sotIlhO!*5#|yg+Gx{V;0ty`*=Y9=jCh$l*=fE(~t}%R# zc}iNpO)OZX`P=leQY^?^DF1w%FJh>Dkp}-o5Ig|2!6^E>|W|zc~W7gF;MtxX7 zV~UjQNsUC$EYXpN?~o{83D2c*0~7;Tm~%FRTAnnt3ln{?DcLZ=NsBY|JxwUA-6K3V zP&#|9t#a}Q4{Sg{6v-OmjJBkCh>m)8vLNm4lStMUT$)FZeJG05A)px&o3H)5oAl9= z31@?HyCriHcCDnt628BFN+T;U69Wl#itfvqIDBydMvOJO0Zl?go$cfG5>TK75CMj3 zakLaH3=&J0e}Xmqlav$S0>E@_Yo_V~3SiiXrw)$&!XhrHCDQ%P1BHPusuKr0LthAB zg)mDrLy>2*yevMMOQe6fZ|)%PEb!lC^*9yaX9UMy7-v!fSICssTR|wML0Ic2BhKAq z3I1X~ z7^_!M&;6Z9?br3#HU_&kfJ~%botXQkC1v<}ZZxN5q-T)|Sb2cW3WYUBbDZ`TH{!*^ zrmAeRM+(QI>D+?}guZ+dH*X)@^!O|oL69&Avbtw2^M3HP(+2kV{O$^3BN1RLfrC8nwz7=VhBR%>!;7WR<~;34B_j3A{>^@e@H+Q! zL=UNr1(JvKAQLKT0b}EMn|QUWtY>!>8-t@fVj_&`~gGd{_aPy5W>0u5L$zrsU^rBO=i$`#Xd*>kh)lPf}A znNXSEl`+HlhXtylgS9(#N02A=zVV?#OF?)Gr>(HszVa+1*2VG@qYttJuXaBlzP`Pb zX)ueu?s&}R>xI#^*r4gR?tMFi!_eeKlIM5g)Nk)Y^h=ZCR**xY>$E5knctRrq!zw? zX{2|hwR9LXTY1)pTlKg7U4_ej{dcj2{!+1sZ6<@9^?mn)=37V)DIAvS(}S`IgFO!6 zn({?nYw`Z-@jvt@!q|5z?TI3(dx^1szSn%azAwp>N#fk^kt|=MejKtacAs@Rdku#zT>9$s z=m7ek)`=O7hO2n+2Uj$QUs&2EIqycF{(L9Y#^IyxXA%R@ z&j`VAprIV~d!pH-7~zA+bjwVn3kOB3;rlg{nr&wHV12N}g^i>Upls~=z`VX>9HQ#= zTu&luVb@_Lkz63&&^_M!6(-2^0?GCAX9XKp{O={pd|AlIMGriX6s_Jy8_q9|{5jLc zxd1aj_ucE7Vcti#$r!s~w~W=XpaLQ}#mX`apR7^n9-d3?O+adJYr*L;{c)x@REewM@vZN0njS3iE$88KHPWAkWt((OUMherUnPm?i&8@!9E@ zUW^$%CpdruZR0ohzUq-XQ$KEIB8Sjgs1+wKSUH&Y;=ee%E&O$X18{&979d~K2uJW` zd*8awHCXb;Q>4z$B|sPNv+Zd__f6&@KmS+L`z3H1x+x|Xs7-N-iw|1C=QiJdU)f~z z{vO4hpP`0MyqmwIHN=l?jSq>OKG6CEC#O`*blP`?>)CUWj5j1cB>%6N7;`kfZ1iQV zam~SDB?{uyp^=vF_u|=8xn3S)L;wF8ZRZV{bezM-EH;MC91JQZ{KcZZ$IWJUy?SJGeGUWm6PeuO8-K2|hD~p;Ls~9Y-4lE+?|bF)XaNKUNX(K7 zBQk0Z{n>hrH-CA`bTr$6z0n@Cn9EL$XZ3=X7NopjcI=;z<(X7-oEmK}BId=PxX*!b7Q6oL@ufd%eEPc`_la(}WkT zKe?-YJWn^6b$^{dhdJZ)I!Kn6c}iw%o5mLDyvM7qJZbkGG?zLU;M|W;Wis|A;SuY3{_X53`+>9g^B%O4b{;^t$^;{oKHbo*CY%u91 zp#2d8Pg=I0&UX{qwr=y=o_^BLdk=KYH$=Z8+k|p8V5`ph~3b^{^NnL4m_+4zx( zeoTt@f<$DmsB1}o%R1Hx`ToPuBl+P6cb-?uF{1!z-2WvdR4+vJ*SYTic5@gwnzu%e zD!HF^X=$ha^#1hi*@~^nDL!HQ;MC&e+6=onaJgm-J-+|>PpmU=SIe?EQE5vJiqziw z*K=Z%bWZz_we!qiFqE`I?#$yozNxIE7Ei;csv>++r*?)0bozFpF&oLh94u z-2c2L`5BarP7l>87|f)vxaT*9(!Q`2xBMZ&^JVj-|1)Tg!6OW=lk=w zLwVlr!*<(l*L$a?ox3+%!~UIj3Ej@KD;W>1E_c)1szDi93BC;0K?drOQ>@$yi|DtT zSir}!Yx>znf&b0KS;Lk7VKPDF@e>(qQr0%SNcGQd(p9StjqJ`QSW&c{ggF?5{d22w zlkX%JTUq`;(3WSH+)WHl%qlF)iNG_?}K?ZM3cS7#u5v zZ!apx4Apv=PWsn}eD%MI#=KA)OlNy0)l@~D^1;NC5k@|OPW3wt>WNYDN+8~+gM%E! z$ z`Olr0;eytiK&~O*ps%KV?2vq+DhuRh*!6Ilzu>A;iMe9 zI?zug9nT9CI_o)O}KF_I_U z_Cswu{)3pCYgw{eOt#E?UCqBwkAugSl>5 zX?G=Ci(Lo+r3suuJezyQyDvw*<1b{rx*&ZaY2HlJ>k{Qc%IZeU43pQXw4mh!4I5>l zZ@4$uxaPY#!*IhL4Hctn#!n#S+SiPcZP_PTd5fXf1exhFi5zf3kl`UcW2RUk)F2oF z_ogN`{03PiseQR;fa#{Uy;jeNlJ0Sle`~;ZYhLjkuy>a^!Z_nR~`$&F?NVuIE3HX;i zD82snwlwPb`7yE)ZA_Ndmq5zuSO1{{1}(d9u4#!Fl_|eOuxKBwOfQ*tG`VjCV$-WF zxi0c&+w}Z)rqz{%f46@`ADPdGm#x)+zpT+gyfDi;_P zR{#Ta`Mzd=putKO@5lQJO*aNy(i?}Ltwy^Z;69f|eqi#UCI1$vL!+(#mi?dK`OL$! z3jQnx$_$+Li2<__CL@Wuk4^J7-!n3j2I4N8e#=qpir+iEQcrn3`B4yNOd1BBLEni<(tdRWE>m0I^ zt(^*Td+S3}$5rOzXy=MW>%#MN_qy%5St!>HrGZ~Fq1WKw-&kv@2TrCcPCPzY%2aO- zN?7@+$4?&qA|uv{QHuV)O9haZpG7Jx2f%D)7J@oWTxJ#E_YSq_6qT1tomOD?02(1otT{Hk8{?g(944>h4f% zOJ8tzjecV{x2uWde&6oAP)*({ zFkW0Q%gdI*9@W)oKO65DgP<3F_BIKvRXLAR?Z61&0g2TR6mEZ7OZK?dP7zukdg?s_tNZeuOsh^e1Tmdlz5rIg?LcK|%aQ1FsSDv#W0EnHd z9M)p;gAL_R~Z5cojTdwy+qDsd6R01Vtxmq&FhfPz{wxmB$${zW~z@{Ro_ zK#y5^KqIp!#@or>GD`c+aZ(PV1=`Eo1?a55p6a*WepFgxvmp!^2518YEU-;{F}fLr zD~)=S0m=+px3TUN8-El}Xb}{2ET*_i3-|WlY@V7vr6#&cOr*+oS9?GF?@)K6op>>o z4af0@%KwaLr`{3P&)474<3rDMsd!IM-bepWfhfuMmJt}#0%PgDSx*q(s0m%ZFgWTj zwwvH%2!(i9{RHX~FVUB5qHvF{+ZF}+(bZVPG1)a*Ph>KV;cYNK^aB@R#dS~&`^60V zn2Z24Y{{djzK33}t@q%!v5k)u7jAXB_H{#4Ut2 z1}0j5$RXcTyfazqL9=^Qe%GL`G)=!lirv7AgVRf^=XyEM&kiOe_%JD!O?sXK&hrDo zF}m9B68im!oGshuZluy2H#T$`XPZQu@zf;(nBCZB-cjQ&w*p@Tm_$pe^MTN3EauI) zJG&G^H-4S|1OCd#@A6jO+IcAXG#5M-d9E!^YNmV7Z(=F^?8bfrYf&mLMnRd_22&Q} z2*msbLsrI!XPeOK@|V?n>`kNC`8eSFmekELLr|!-wQRltxZnuRedup<7VflowJ+gC z)F}P6lUSsh^B41?=~0*68YA6z63lKG`W$@{GV!cC2FCl0s<7yz6!3JWoBbUDTgpg% z4VNUk%xblMy7PjLF2We*3XY7K*N(*9Yx!_M zjU$&JXLiNxaTzoa&k@NSbzbLJTn$6bu6SPWYx)Zc1Li~Lqj($GuWsA#;zg85eH{yx zz3IIOea3A4QFGmJCfn7N_d$8a77j+T^W}Sr%0XdVLFf&zJ$s^D5Vrc!iV&GXyb5*A z6mG8d*6EDN7a;=dgVjYI--~4@Fe{{fcJ4B|;_Qg~&%6#?I(?X_$S4rDw{=>=8iZS=M^I#EF!m zXn%K_xXWwmm7R40LKXPo6ZzNZfN1-$S6RuVU=JlC|3#Xjo-%ebJvvC4n%IM)Q8NDh zGXd)L;ay_JMozc^mU*Uifnp=#+if>LD*O9MV#@wB1l``z|tlu(7PJqS6rm)0@ zJzP50{0Vpa`_?92oB;*i(?i225a6tZgT+9Dg?vTh)N4OKA~(c8{$8-ZKz=mb@$4IT9g8>;k11WIT+Y=%Z})`y#OJ zK-~rlEy!T%0h!Qo+jjPF2RQz2Z^B;dbvYg2JS`+@D~OWH{2-EEs^BdnuJskh>CKeT z1b;%8dU6QU%i@z?^6Q-{XESe^qRiw`ka+k!d-{c%&lXM}vCX^T=|?|;t6r?N*h-W4 z?o4Hy%BWqW+5=+md#5^8|49zjM zon_Do@rhzZ4XAb}-m|bMH$Vg<;^Bo6A8cfhUQ>|wFk~j(`>1NgD3sTg)He1pWrUj9WZ8R(Wn5Rr zhc&dXvv_m%HrwwHo9l_))NgdVUff%d&@4^$Pc=MDZdZ^xHL$KX^ z7W1{3UJ%>9v$W{Y3>vBvflE-soDj8{`>#F|8Z$EF%lN$NylORTn5JsI4mTMHWd*%- z2sD(RO(H-&i8&Ge)5i12slI5VekYCZ)s8rv&_)194;vKY2m8DIC2{4<&xTM3HHxwT zd(42n)gCJ$O4I|8sJq07#0U7Yk7PjPK&bMdy-5b)OdhSsBo^|IB_H43@&F@tpdJR0 z#~)=UJdP|=)O{0(rVZnjbTtwHV^}&kfLJQP@R6rda;K;O>9J9bnW$BgbzOZ8aO{D8 zPuJ%=Nqg~rdzk-IW0ZC5I%cc;ek5~=lDXl4?gMOQQ!KE5Aq$9qeGFM6jFP;Xy6)%N zjg{q(E6fnF02P3L*tutbHRR-gyYK3g^y9H?GMtIs;ojG zY~3*C>qD)(8jz}89w|xfb7L`^d>AG#%D-uq=qz}(o9kzzrx0LSBX90ykr*5oM+YmoTRWe+Cj6aq^xnWRymLmE>krCpoC9K%2LT0aK0Y< zt@kUUrrj1WL9rmBB8B;WXqg-BztOiUZX-!`*a&-75+!WZ!R0OPiZz?w`Of4q#+(;m z`${Ea6GnTCY3`V2R8w*}knf)*`RA@(8k{Lp4VP;<+ z9O_z0_{3=HcVi z5)&QGEB_&$)mu@)(Z8zuw#>Gc6C>^O-FUZEo;TO1@$>-xu%`v`tMS3V-8R1pb5w&zP%&rAP2*5h z$k{jqReFXCJhJ?-{x(2j5gH_zQ>;#Ec*@bUqF0u}XB09+U-K}+jQd>)k#AOkr6M8x zHyhrfJ`99@Vzr_B@*p@`DxeJ#`jimavZ9ZV%v{mO0!%9$TY(f%_}BU~3R%QxmSdD1 z2Bp45R0C=8qtx-~+oULrzCMHMof!&H<~~>BhOu9t%ti7ERzy&MfeFI`yIK^$C)AW3 zNQRoy0G}{Z0U#b~iYF^Jc^xOlG#4#C=;O>}m0(@{S^B2chkhuBA^ur)c`E;iGC9@z z7%fqif|WXh26-3;GTi8YpXUOSVWuR&C%jb}s5V4o;X~?V>XaR)8gBIQvmh3-xs)|E z8CExUnh>Ngjb^6YLgG<K?>j`V4Zp4G4%h8vUG^ouv)P!AnMkAWurg1zX2{E)hFp5ex ziBTDWLl+>ihx>1Um{+p<{v-zS?fx&Ioeu#9;aON_P4|J-J)gPF2-0?yt=+nHsn^1G z2bM#YbR1hHRbR9Or49U3T&x=1c0%dKX4HI!55MQv`3gt5ENVMAhhgEp@kG2k+qT|<5K~u`9G7x z?eB%b2B#mq)&K}m$lwDv|MU~=Y(D2jO{j*Box$GUn=$90z6O^7F?7pn=P;{r4C8qa zv1n*5N7uIvTn`8$>}(74>Oqk=E7){#pHUFd5XRJ5ObMhqODTa}=V0;+a(7JZR-4<3 zBTvsqRwLh?*ZF)JWsWOkEq7*XMQ!G3Rmkdh7ZbM#v1~?jt((e2y}u}Ky>1qa&Y7m@ zveIzH@?5Gexr79*?sbZGkVS;s1U<7D(%~7HjAmzj$aDYv_FGl5JX@LW8>w=HCDl6W z%?rsr0)bErYJ5G1v&zjr{8=lW)ZYcstgZAuL}!0~8HAcgOm@nJ9cvOOtL@)Fpl2Dr z8876Lt<|1eF88Jx#C*XyGI)C5z_o!Os!t=Xy0$Kj^4fG1pb@16%g z+<)zJ1n1QO78g#$3yHj+(Smv`HW5y_-PP{h2A1UXMG-c%hMvHLbF6t}G>KA)H# z`AWL~>8JUT(iq7;zJr!Aj)AS+n{mRbA3aM+Gj}b#PhHdTM_NkwQm330EC9waM$=slPfxR1vmr!vf~t_M?a%`@`&tdE}ipY-p#Q#zhLK zd9eFC;PjIEAKLkRkO94{rTuNFqKbNUGtaNZRRbax9;|%2WbnGu!44#64RriY5u0O} z05G^e&JB?Wb*8^g)aM`yt|}~QJkKCipFNeyex~P~SFPVEafD(73rncKmm)m~&`O*YUyY9z7tO%ec7z@wWcoOr-ebP z1k+|y?d{>1jLC=s4B2tEhiTtu->WVJno&%%6bG46KuU9D`GEN!C!9chM>zd=cl0+- z^k>4rpkq7_iWGHtBvy$Q`dja2;1ZdYmF6cANU6{v>l1=fSKRpsTRonp@alC%p{bhU z>g+(%-)&_nDQ~#bq5;xo^06RggA&uH4RMVb6wt;oQI+`m_zt>SiI5hXkfEnn6@ZNk zh9KUr1jtt6lBg$O#TAoTRvwUtWeMP3EjnGoRPQppiNF(sX%|Q4@kIjas|WZWXSENO zfF#2yOb;%XO*LeOoAwlf{u7_39$x(w3xT~)2BNJ2l5u4n3a0NkNLT4yT);7fA?1Vt zCz*`hbw-doYa09E!05zcfOT0EOORY``E@D z5{v%@F~&|UfNt@>vrj66W5f>jy+G_8&VB9D0*>N!7_Nr=-x6N?A)M8>1~q(X34sXp zpA%@w&c};L7u*G3;(Qe=LFL}NbTF$|aX#A%P(h`-N=ZRxCvlG$>Klv}jo0MS|UR8qKq-1FokBJmrbTJjQ!k#Is0tY+0c)m4Gp80YzYD zEGXd~ihaihk;?xUknXNH?rssjzaF+l6?HnDQjVP$i=q}{lp_WbOTKKg}HPKW)2sW`L#NvgmaY0^b2Ldk|t{P6{L{>ym;Xgao1PrudBgEMRFb^ zkPJ6v0h^tJ>K@;maHk_|6Z>yFzq@YvDOeO6Ob_?P4Ey>kHiJv`Wlh_MX4fBY36f%^ zV#2t;$Rg&}!Kwifm z;TVZXMxw3~$--{&A8-6vnUZ#s4`Z-zQ#+y7UI8#Hgsc|ompLUc zqlAG!Ti>t{JzYF^5pM925*PUWUvDuYDGKhC4FMx45c`L#V7%V+88@|khLj|V=J9Un zJEcP5qVCzR6p{FK!nIY~TXo)tJ!{>CG;~&u;EPlnNrwJ=5)ke@hJosN!siM$8b2mM zmc&weo-rY{n1+%c`c<{AT3i zjF{p253Ul-)s5A+!8Dp7?viXAdH1+qlY%mK5pp?{pS1t!3qmmDOq2TnoV`F3<>(XK z1=gfH39N_~8O+~({MZX~+QHyB>vtgwK0@uqGkX^eaf$UFHiO#>LB*7@=c0o6`0muj zmH00_F#p)s3E*$A-zP+p2bvXARTg3)Lxh`tf~9X>7!Z^kHV`uE%V9+BiBG=mxj*)M zr%3rn=)>GR`{#zmwD)$3ToLMx++uqsCx(+50Uk*5QJp2c6msxLD&P-y{c|XK6zZl3 z_Fgu8kp|gKVWv`GS!c56FWPO)ZrCCtYh#*yp-ssus)ot>_~UB zyGfjTjz#fXod{^KEQK1~@jN|;SZw5OgH#0wK78Oe4#vV3*|&XPQU z$r~5u8ziT0<#ICrX^<1){mvtaqT9OqlW?wiSu4X#rOC(0uL{Ownb%i1F_G&d>=l51 zx!FEO4_LK+)W^N6UF+fAccyyp{t)TE`;vF@1irbNjcXF8b?yFh zl5UEB>@;wO`~gMF!QB;h<``+f(lxAb_8B$;&vT7)(bXG(7x_5f%AZ5;h#3WjHisX{ zLTSguapAADXMwWZ&jsD0+K!+8#*6z7-(T+QUk>(~!Q|0&!d)PgEw8F6RK;LkB;!HXg79$+l*KU&-fRF|$o+kR4mJ36k9p&>*uS~RhCV+*Y$3U-k%~M)jxCFW zl9;bQ-fx4HPy)*(bhrKL!81M6*@6p5W?z*W`jb;@JKMFwmic{gQPv*) z?I{Fh)y)}(-6uh^I52xKo!LRZV0c*1X)Z(g+GVFN{2n%vD*@&IkVI{R_0;M28M z8vu?M+xVF-&<{l@1g{PA#hnyAq(gudz4WKSFL5YOr3q!|qrxa7z~F~rEJ29VQKgNe z1*L^m9&acg2p7&`u&V%oY|AKF(Xpv=)wf&j#n|;2UYEaUIHLJuTQw$SbrNn+)38PlfV^0<6s>)|hT#IAAS*T)_^_q@I} z0S%tV-HrXOjzkvW!YSbDjdH=g;=4A@whsDB zI8^aX6n=|ab(?!Ay!)CxH(wC(iX~Q@%FEx>C{Hmp98f2ku$Bsw%lk6v50(U@; zu68Z9U&za}O#-Mv^+!V=eyj6S)5oS{My`1MVs)nlnYl_$xU^QId1_jMf7&K8ij)jQ zJ|+~@l)xpV%~Y{P()$`+nBihkjE|3t3t8PoKU3wZ_Eg%0P<>%(A@oW#*8i$X!nfG& z;&&2ZIKlD~*Gff+p3A7QB!}Ei>RGhUUz^UoEpeJ{`2ov>wH!O@1$VW>A#D#{i2z9l z{d)FK9OYxRY#(6NUMO=q^5Ve7R|72%f}ZDlsm0BN&LzyaSHurXV4p5HGf7|Z)}8)g z5J#S6h{-+_U0m$k#+|N{6_8MYactWzWb+1~ea8wX3zX<@O0>pU*q($J{=R&7)P&jg z6Kb)o=HAnC_MP;cIeBq}{gG^0CZzOUJZ|7C-VjE}!?*UtKTcwwF33v^BYC&}Rq)C* zpAJ07-!{`flYX1@n;ZK-=x4)!o(%(1UqulVmes(D z^`_HNfM#umEYy~=zh$9&+?8$4!l(4rr?d#8hS4iks@9w%E4l`BKmhUtvsm1X-mKC3 z>4(u4yS45OgZIOQ;EQ6s`sjNelo!~mLe7gS69TW2WnFwEKcAwioq2mLXV<9CIa#(0`sQpl>vwW`A$D?!2%nt*HEb;Ga=o?92 zHAOICmXHEQ%Cc{m2>dLjPU1J}^w7zilFIxy9nG(OZbYPtW?3KJyv@A7|1A*NiD_v! zTLC}%E4kI*d?$lQBRL==MPsD#FyN0ZSr`;aeQ4C6a2INH9klU~_gCH;G2%8R4EuHb z44Ej^6301>?c06FP3X~xyP{77p`-3td;HKAGf4mZw1qRd6Z^^L#?qaiAKv~px)*jAV^re~beps9m{kJzb6n(oS8uCt#Lnjofg;Rl z=apY)JsV;^dVkzCW)jDrii_WTT`3iKri(xmCC1^AO}Vqt-1B*wwIlBAmE1AmdRtMc zD!fB@mtwHPHyV-^VIVU??*~*{olz-Ub)NCX941BDj_CKZ+QYQ?+``tyhy_7WFXF}_ z?~CVO#LsDYD!&}cph22{PZ*TK?$K^u`E7%{^na89Rm%!jSZs7vI-D zL1POD!1cu56G)*p1gui3-i^JZPX3tI*_Fq&JRwbz*#8LUSiMRWjuu`zD|uk;+X&d@ zuxF5C2{Zp#O?GtOB+R2~tF>MDI(}%p-W=M>1tEY}8E=b_l*WbOO zY9tCPgL3vMEqz)_eWeqmN{qobq_4)XdXJSe6Hj;Eie0??2ZZ?p;*_K8@(&v~1evu- zxQCA2YYvv@qhzamqdi`?{Z{c*7$arCdz4-4G(`O5It%y&8>d{#Y9Vax^FZ99ZK zUdIPpkNhp8uP3T+W4lhvUIYaoY##y6KtxBFoj3&5^@Q(^{677%C#3YJh$p-Ee2M6F ztJAoQv1N0L!|N8XBD(eAYcB#gRaIX7T8U5xXbx~cJSon~YnC zaJYE%zOj9y?E==_B$*9NiAm{~)2Z}t1$$l?qOYct5Ep5HvqFKvuSE7A5YF$K@2>UE zbQOdTNzjD#zS(L>wa2$K-WK!Pc%pY^8To58;^JaXZ}F30wuYl;WWs~rCoo&vrEtUh zTBLMU??yx1#;-weCPZyOJ%Yeb?14z+OXW0L_E+<)(q=;xz74U-Q~R~n*oC;MxyrJo(74r$y2t;x`D~{nhUw`N{Bbc zo`l5kb`Yy;L=&@MTQ~Ml_%V%){mCIj4WC}5q=A_ACx2^by!4w1rVX6H0ifayJsw;; z=+}5kjC?RG*q)^FA;udd?fK$7vU1x>y0w;A-)YbE%l$J%nRRjAIlrItFPgQvJ7Ytb z%HSFnjF2||X&L_g-Q>1{(mholW_-EJmSzsO%*VVVB4)#OAv<(kOIx2H!f)I9#e_Nyjdb$&*1KN^gM}yFIhi%%BWB}7Ke0M{0WY>CxJQUuL<9GW$I>S z8~;QmE{^wS?I`=DyV^l+MozMPWLoFz=uSLu99tiVHdCN>7jRs~vd13`&Gey!!7_+< z6o@25%!eN~+Eki#7iq@#{Hxl7pF0^`N;~p~#tc6HXJP0g5xvK|AuLSwNHVI2_Y-!& z4hemc%vOM5!ySDypyEGe=lAeFbIp`w8FIUcTqUwens>sTIV-jDhrcKGX7XHFXyazb z^DO8=ZgefY6R6&+)c1_i*WoenjtR5@_JU#Ph;4M8fpmznxE9R`=r@-#_y zkD?Muq|*gg7f*BQeI|Np#}Q|NXLJHM6GE{;SJn8ce`V1Gehym~{8c+M<2~=HcCRuk z-v&$8dc8YG+tK}NYVhwdm1iZ&A#r+T<>Ez88)Eq9j+G5h5D(_u{WQdUTOs+QbA(=? z{F6n6UV8D2*lvb)0vDrca$729KG$xO2aH$jWoWl0drlmefYsTswh)`GjMtmR=vEkJ zN$aTp_@@KL%KQ-VDB2ppbZK@X`6cJA5n`g>sbCTvU_xdid!{9gWA|>Mfs6rtHx6s` z_wMt*FgUTBZ@I2C62&zbs?pPvK9TpatkXzqDqe4YTr^nnQg8gWxjKt*s&eOMEp!Qc zG~PT`>xg76Xqh^dKI-Eu#K*VnvEf9qT{L0yNpVj)eVD#kQzGgVRbTB!5nWY=?t!cggiEGBAcWM2xNtW&9 zZB_6RZ}|a87CuEYRYCRJ`Sg+_gBK$_J@*zoWcJJw>eBw?G9WY(Jw~qN|A3MBR^~jm?>k5oGv7z+0jWOox(co@%nya|* zE-2peyX)#@svgwwDMPJ89dT=iO>}@wtNR@NUQ|cJZ};sX(w2uWP4AE5)@A ziJgy_TIZ+T&vG&xPh@Jmt!OJ|zA6C0ZxfF2 z7>aIZqecbmM$lyvDMwg2?Ipo9b)-WL6K_7(X_rmJgdd$-Qc^ywEw4SThChz6*_yu= z{v~a4V|RJtH-GThc2C0Z|JHPl{II-!?B~7cWnRz&dgP*UqoY!iCo&i-xeM}kl?ID* zKTX`w+;z0+MCdGcl{N?xb|tYb%Id=k++k_@(V%bTS&n09`0{S0)|>IH_F;V@_zrxS-dKDDc7+i`nHN8J z;38w69lzAS*WWa+dnVvk(0-KD3%*)TerLH zSCc}Tjc-mR5|1HAL$C1}oue|Qp&M!hmyDUcg)Cz>GXPEyeYf}+s48kIl*pL{{treP BIP(Ai literal 0 HcmV?d00001 diff --git a/demos/android/app/src/main/res/values/colors.xml b/demos/android/app/src/main/res/values/colors.xml new file mode 100644 index 000000000..3ab3e9cbc --- /dev/null +++ b/demos/android/app/src/main/res/values/colors.xml @@ -0,0 +1,6 @@ + + + #3F51B5 + #303F9F + #FF4081 + diff --git a/demos/android/app/src/main/res/values/strings.xml b/demos/android/app/src/main/res/values/strings.xml new file mode 100644 index 000000000..b4a84c151 --- /dev/null +++ b/demos/android/app/src/main/res/values/strings.xml @@ -0,0 +1,3 @@ + + Blockly WebView + diff --git a/demos/android/app/src/main/res/values/styles.xml b/demos/android/app/src/main/res/values/styles.xml new file mode 100644 index 000000000..5885930df --- /dev/null +++ b/demos/android/app/src/main/res/values/styles.xml @@ -0,0 +1,11 @@ + + + + + + diff --git a/demos/android/app/src/test/java/com/example/blocklywebview/ExampleUnitTest.java b/demos/android/app/src/test/java/com/example/blocklywebview/ExampleUnitTest.java new file mode 100644 index 000000000..a2d19cf5c --- /dev/null +++ b/demos/android/app/src/test/java/com/example/blocklywebview/ExampleUnitTest.java @@ -0,0 +1,17 @@ +package com.example.blocklywebview; + +import org.junit.Test; + +import static org.junit.Assert.*; + +/** + * Example local unit test, which will execute on the development machine (host). + * + * @see Testing documentation + */ +public class ExampleUnitTest { + @Test + public void addition_isCorrect() { + assertEquals(4, 2 + 2); + } +} \ No newline at end of file diff --git a/demos/android/build.gradle b/demos/android/build.gradle new file mode 100644 index 000000000..43c070853 --- /dev/null +++ b/demos/android/build.gradle @@ -0,0 +1,27 @@ +// Top-level build file where you can add configuration options common to all sub-projects/modules. + +buildscript { + + repositories { + google() + jcenter() + } + dependencies { + classpath 'com.android.tools.build:gradle:3.1.3' + + + // NOTE: Do not place your application dependencies here; they belong + // in the individual module build.gradle files + } +} + +allprojects { + repositories { + google() + jcenter() + } +} + +task clean(type: Delete) { + delete rootProject.buildDir +} diff --git a/demos/android/gradle.properties b/demos/android/gradle.properties new file mode 100644 index 000000000..743d692ce --- /dev/null +++ b/demos/android/gradle.properties @@ -0,0 +1,13 @@ +# 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. +org.gradle.jvmargs=-Xmx1536m +# 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 diff --git a/demos/android/gradle/wrapper/gradle-wrapper.jar b/demos/android/gradle/wrapper/gradle-wrapper.jar new file mode 100644 index 0000000000000000000000000000000000000000..7a3265ee94c0ab25cf079ac8ccdf87f41d455d42 GIT binary patch literal 54708 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

_x$+l{{cH8$W#CT literal 0 HcmV?d00001 diff --git a/demos/android/gradle/wrapper/gradle-wrapper.properties b/demos/android/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 000000000..c9e243031 --- /dev/null +++ b/demos/android/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,6 @@ +#Tue Jul 24 10:14:53 PDT 2018 +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-4.4-all.zip diff --git a/demos/android/gradlew b/demos/android/gradlew new file mode 100755 index 000000000..cccdd3d51 --- /dev/null +++ b/demos/android/gradlew @@ -0,0 +1,172 @@ +#!/usr/bin/env sh + +############################################################################## +## +## Gradle start up script for UN*X +## +############################################################################## + +# Attempt to set APP_HOME +# Resolve links: $0 may be a link +PRG="$0" +# Need this for relative symlinks. +while [ -h "$PRG" ] ; do + ls=`ls -ld "$PRG"` + link=`expr "$ls" : '.*-> \(.*\)$'` + if expr "$link" : '/.*' > /dev/null; then + PRG="$link" + else + PRG=`dirname "$PRG"`"/$link" + fi +done +SAVED="`pwd`" +cd "`dirname \"$PRG\"`/" >/dev/null +APP_HOME="`pwd -P`" +cd "$SAVED" >/dev/null + +APP_NAME="Gradle" +APP_BASE_NAME=`basename "$0"` + +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS="" + +# Use the maximum available, or set MAX_FD != -1 to use that value. +MAX_FD="maximum" + +warn () { + echo "$*" +} + +die () { + echo + echo "$*" + echo + exit 1 +} + +# OS specific support (must be 'true' or 'false'). +cygwin=false +msys=false +darwin=false +nonstop=false +case "`uname`" in + CYGWIN* ) + cygwin=true + ;; + Darwin* ) + darwin=true + ;; + MINGW* ) + msys=true + ;; + NONSTOP* ) + nonstop=true + ;; +esac + +CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar + +# Determine the Java command to use to start the JVM. +if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD="$JAVA_HOME/jre/sh/java" + else + JAVACMD="$JAVA_HOME/bin/java" + fi + if [ ! -x "$JAVACMD" ] ; then + die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +else + JAVACMD="java" + which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." +fi + +# Increase the maximum file descriptors if we can. +if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then + MAX_FD_LIMIT=`ulimit -H -n` + if [ $? -eq 0 ] ; then + if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then + MAX_FD="$MAX_FD_LIMIT" + fi + ulimit -n $MAX_FD + if [ $? -ne 0 ] ; then + warn "Could not set maximum file descriptor limit: $MAX_FD" + fi + else + warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" + fi +fi + +# For Darwin, add options to specify how the application appears in the dock +if $darwin; then + GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" +fi + +# For Cygwin, switch paths to Windows format before running java +if $cygwin ; then + APP_HOME=`cygpath --path --mixed "$APP_HOME"` + CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` + JAVACMD=`cygpath --unix "$JAVACMD"` + + # We build the pattern for arguments to be converted via cygpath + ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` + SEP="" + for dir in $ROOTDIRSRAW ; do + ROOTDIRS="$ROOTDIRS$SEP$dir" + SEP="|" + done + OURCYGPATTERN="(^($ROOTDIRS))" + # Add a user-defined pattern to the cygpath arguments + if [ "$GRADLE_CYGPATTERN" != "" ] ; then + OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" + fi + # Now convert the arguments - kludge to limit ourselves to /bin/sh + i=0 + for arg in "$@" ; do + CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` + CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option + + if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition + eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` + else + eval `echo args$i`="\"$arg\"" + fi + i=$((i+1)) + done + case $i in + (0) set -- ;; + (1) set -- "$args0" ;; + (2) set -- "$args0" "$args1" ;; + (3) set -- "$args0" "$args1" "$args2" ;; + (4) set -- "$args0" "$args1" "$args2" "$args3" ;; + (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; + (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; + (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; + (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; + (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; + esac +fi + +# Escape application args +save () { + for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done + echo " " +} +APP_ARGS=$(save "$@") + +# Collect all arguments for the java command, following the shell quoting and substitution rules +eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS" + +# by default we should be in the correct project dir, but when run from Finder on Mac, the cwd is wrong +if [ "$(uname)" = "Darwin" ] && [ "$HOME" = "$PWD" ]; then + cd "$(dirname "$0")" +fi + +exec "$JAVACMD" "$@" diff --git a/demos/android/gradlew.bat b/demos/android/gradlew.bat new file mode 100644 index 000000000..e95643d6a --- /dev/null +++ b/demos/android/gradlew.bat @@ -0,0 +1,84 @@ +@if "%DEBUG%" == "" @echo off +@rem ########################################################################## +@rem +@rem Gradle startup script for Windows +@rem +@rem ########################################################################## + +@rem Set local scope for the variables with windows NT shell +if "%OS%"=="Windows_NT" setlocal + +set DIRNAME=%~dp0 +if "%DIRNAME%" == "" set DIRNAME=. +set APP_BASE_NAME=%~n0 +set APP_HOME=%DIRNAME% + +@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +set DEFAULT_JVM_OPTS= + +@rem Find java.exe +if defined JAVA_HOME goto findJavaFromJavaHome + +set JAVA_EXE=java.exe +%JAVA_EXE% -version >NUL 2>&1 +if "%ERRORLEVEL%" == "0" goto init + +echo. +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:findJavaFromJavaHome +set JAVA_HOME=%JAVA_HOME:"=% +set JAVA_EXE=%JAVA_HOME%/bin/java.exe + +if exist "%JAVA_EXE%" goto init + +echo. +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:init +@rem Get command-line arguments, handling Windows variants + +if not "%OS%" == "Windows_NT" goto win9xME_args + +:win9xME_args +@rem Slurp the command line arguments. +set CMD_LINE_ARGS= +set _SKIP=2 + +:win9xME_args_slurp +if "x%~1" == "x" goto execute + +set CMD_LINE_ARGS=%* + +:execute +@rem Setup the command line + +set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar + +@rem Execute Gradle +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS% + +:end +@rem End local scope for the variables with windows NT shell +if "%ERRORLEVEL%"=="0" goto mainEnd + +:fail +rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of +rem the _cmd.exe /c_ return code! +if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 +exit /b 1 + +:mainEnd +if "%OS%"=="Windows_NT" endlocal + +:omega diff --git a/demos/android/settings.gradle b/demos/android/settings.gradle new file mode 100644 index 000000000..e7b4def49 --- /dev/null +++ b/demos/android/settings.gradle @@ -0,0 +1 @@ +include ':app' From 5262544538a09be0b672f70def454c66bbe84523 Mon Sep 17 00:00:00 2001 From: Andrew n marshall Date: Tue, 7 Aug 2018 11:37:11 -0700 Subject: [PATCH 2/9] Basic Fragment with webview, and Blockly inside. The necessary Blockly files are copied from the parent directories via a gradle task. --- demos/android/.gitignore | 1 + demos/android/README.md | 45 +++ demos/android/app/.gitignore | 5 + demos/android/app/build.gradle | 12 + .../main/assets/blockly/toolbox_standard.js | 333 ++++++++++++++++++ .../app/src/main/assets/blockly/webview.html | 29 ++ .../webview/BlocklyWebViewFragment.java | 37 ++ .../android/webview/demo/MainActivity.java | 5 +- .../app/src/main/res/layout/activity_main.xml | 14 +- 9 files changed, 472 insertions(+), 9 deletions(-) create mode 100644 demos/android/README.md create mode 100644 demos/android/app/src/main/assets/blockly/toolbox_standard.js create mode 100644 demos/android/app/src/main/assets/blockly/webview.html create mode 100644 demos/android/app/src/main/java/com/google/blockly/android/webview/BlocklyWebViewFragment.java diff --git a/demos/android/.gitignore b/demos/android/.gitignore index 0718494ec..0d7a3d8a8 100644 --- a/demos/android/.gitignore +++ b/demos/android/.gitignore @@ -1,5 +1,6 @@ /build /captures +/app/src/main/assets/blockly/msg .settings .project diff --git a/demos/android/README.md b/demos/android/README.md new file mode 100644 index 000000000..9c63f70b6 --- /dev/null +++ b/demos/android/README.md @@ -0,0 +1,45 @@ +# Blockly in an Android WebView + +This code demonstrates how to get Blockly running in an Android app by +embedding it in a WebView. + +### BlocklyWebViewFragment + +Most of the work is done within the fragment class `BlocklyWebViewFragment`. +This fragment instantiates the WebView, loads the HTML +(`assets/blockly/webview.html`), and provides a few helper methods. + +### Copying web assets with gradle + +This android project copies the necessary files from the main Blockly +repository (i.e., parent directory). In `app/build.gradle`, note the +`copyBlocklyWebFiles` task and `preBuild.dependsOn copyBlocklyWebFiles` line. + +In your own project, these files can be placed directly in the `assets/blockly` +directory without the copy step. However, if you do use the copy step, make +sure you adapt the copy paths appropriately. Additionally, you may want to +update your `.gitignore` or similar file. + +### Loading Block Definitions and Generator functions + +The `webview.html` loads the block definitions and generator functions directly +into the page, without support or coordination with the Android classes. This +assumes the app will always utilize the same blocks. This does not mean all +blocks are visible to the user all the time; that is controlled by the toolbox +and workspace files. This should accommodate almost all applications. + +This does mean loading your own block definitions and generators will involve +editing the HTML, adding you own `<script>` tag, and possibly removing +the `blocks_compressed.js` if you do not use any standard blocks. + +### Connecting a Developer Console + +While the console output of the WebView will be visible in the Android log +(i.e., `logcat`), some times a more intrusive approach is required to isolate +a problem. For instructions on connecting the WebView to Chrome's Developer +Tools, see this article: + + https://developers.google.com/web/tools/chrome-devtools/remote-debugging/ + +The WebView must be visible in the connect device or emulator before the +WebView will included in the list of available pages to connect to. \ No newline at end of file diff --git a/demos/android/app/.gitignore b/demos/android/app/.gitignore index 796b96d1c..d67f7b424 100644 --- a/demos/android/app/.gitignore +++ b/demos/android/app/.gitignore @@ -1 +1,6 @@ /build + +# Files copied during build: +src/main/assets/blockly/blockly_compressed.js +src/main/assets/blockly/blocks_compressed.js +src/main/assets/blockly/media diff --git a/demos/android/app/build.gradle b/demos/android/app/build.gradle index e80e4cbce..661a3db87 100644 --- a/demos/android/app/build.gradle +++ b/demos/android/app/build.gradle @@ -20,6 +20,18 @@ android { } } +task copyBlocklyWebFiles(type: Copy) { + from('../../..') { + include 'blockly_compressed.js', 'blocks_compressed.js', 'msg/js/**', 'media/**' + exclude 'media/test_*' + } + into project(':app').file('./src/main/assets/blockly') +} + +project.afterEvaluate { + preBuild.dependsOn copyBlocklyWebFiles +} + dependencies { implementation fileTree(include: ['*.jar'], dir: 'libs') implementation 'com.android.support:appcompat-v7:27.1.1' diff --git a/demos/android/app/src/main/assets/blockly/toolbox_standard.js b/demos/android/app/src/main/assets/blockly/toolbox_standard.js new file mode 100644 index 000000000..77e1a6863 --- /dev/null +++ b/demos/android/app/src/main/assets/blockly/toolbox_standard.js @@ -0,0 +1,333 @@ + +var BLOCKLY_TOOLBOX_XML = BLOCKLY_TOOLBOX_XML || Object.create(null); + +/* BEGINNING BLOCKLY_TOOLBOX_XML ASSIGNMENT. DO NOT EDIT. USE BLOCKLY DEVTOOLS. */ +BLOCKLY_TOOLBOX_XML['standard'] = +// From XML string/file, replace ^\s?(\s*)?(<.*>)$ with \+$1'$2' +// Tweak first and last line. +'' ++ '' ++ '' ++ '' ++ '' ++ '' ++ '' ++ '' ++ '' ++ '' ++ '' ++ '' ++ '' ++ '' ++ '10' ++ '' ++ '' ++ '' ++ '' ++ '' ++ '' ++ '' ++ '' ++ '1' ++ '' ++ '' ++ '' ++ '' ++ '10' ++ '' ++ '' ++ '' ++ '' ++ '1' ++ '' ++ '' ++ '' ++ '' ++ '' ++ '' ++ '' ++ '' ++ '123' ++ '' ++ '' ++ '' ++ '' ++ '1' ++ '' ++ '' ++ '' ++ '' ++ '1' ++ '' ++ '' ++ '' ++ '' ++ '' ++ '' ++ '9' ++ '' ++ '' ++ '' ++ '' ++ '' ++ '' ++ '45' ++ '' ++ '' ++ '' ++ '' ++ '' ++ '' ++ '' ++ '0' ++ '' ++ '' ++ '' ++ '' ++ '' ++ '' ++ '3.1' ++ '' ++ '' ++ '' ++ '' ++ '' ++ '' ++ '' ++ '64' ++ '' ++ '' ++ '' ++ '' ++ '10' ++ '' ++ '' ++ '' ++ '' ++ '' ++ '' ++ '50' ++ '' ++ '' ++ '' ++ '' ++ '1' ++ '' ++ '' ++ '' ++ '' ++ '100' ++ '' ++ '' ++ '' ++ '' ++ '' ++ '' ++ '1' ++ '' ++ '' ++ '' ++ '' ++ '100' ++ '' ++ '' ++ '' ++ '' ++ '' ++ '' ++ '' ++ '' ++ '' ++ '' ++ '' ++ '' ++ '' ++ '' ++ '' ++ '' ++ 'abc' ++ '' ++ '' ++ '' ++ '' ++ '' ++ '' ++ '' ++ '' ++ '' ++ '' ++ '' ++ '' ++ '' ++ 'text' ++ '' ++ '' ++ '' ++ '' ++ 'abc' ++ '' ++ '' ++ '' ++ '' ++ '' ++ '' ++ 'text' ++ '' ++ '' ++ '' ++ '' ++ '' ++ '' ++ 'text' ++ '' ++ '' ++ '' ++ '' ++ '' ++ '' ++ 'abc' ++ '' ++ '' ++ '' ++ '' ++ '' ++ '' ++ 'abc' ++ '' ++ '' ++ '' ++ '' ++ '' ++ '' ++ '' ++ '' ++ '' ++ '' ++ '' ++ '' ++ '' ++ '' ++ '' ++ '' ++ '' ++ '' ++ '' ++ '' ++ '' ++ '' ++ '' ++ '' ++ '' ++ '' ++ '' ++ '' ++ '' ++ '' ++ '' ++ 'abc' ++ '' ++ '' ++ '' ++ '' ++ '' ++ '' ++ 'abc' ++ '' ++ '' ++ '' ++ '' ++ '' ++ '' ++ '' ++ '' ++ '' ++ '' ++ '' ++ '' ++ '5' ++ '' ++ '' ++ '' ++ '' ++ '' ++ '' ++ '' ++ '' ++ 'list' ++ '' ++ '' ++ '' ++ '' ++ '' ++ '' ++ 'list' ++ '' ++ '' ++ '' ++ '' ++ '' ++ '' ++ 'list' ++ '' ++ '' ++ '' ++ '' ++ '' ++ '' ++ 'list' ++ '' ++ '' ++ '' ++ '' ++ '' ++ '' ++ ',' ++ '' ++ '' ++ '' ++ '' ++ '' ++ '' ++ '' ++ '' ++ '' ++ '' ++ '' ++ '' ++ '100' ++ '' ++ '' ++ '' ++ '' ++ '50' ++ '' ++ '' ++ '' ++ '' ++ '0' ++ '' ++ '' ++ '' ++ '' ++ '' ++ '' ++ '#ff0000' ++ '' ++ '' ++ '' ++ '' ++ '#3333ff' ++ '' ++ '' ++ '' ++ '' ++ '0.5' ++ '' ++ '' ++ '' ++ '' ++ '' ++ '' ++ '' ++ ''; +/* END BLOCKLY_TOOLBOX_XML ASSIGNMENT. DO NOT EDIT. */ diff --git a/demos/android/app/src/main/assets/blockly/webview.html b/demos/android/app/src/main/assets/blockly/webview.html new file mode 100644 index 000000000..0ecbea2f1 --- /dev/null +++ b/demos/android/app/src/main/assets/blockly/webview.html @@ -0,0 +1,29 @@ + + + + + + + + + + + + +

+ + + \ No newline at end of file diff --git a/demos/android/app/src/main/java/com/google/blockly/android/webview/BlocklyWebViewFragment.java b/demos/android/app/src/main/java/com/google/blockly/android/webview/BlocklyWebViewFragment.java new file mode 100644 index 000000000..c9629d2f3 --- /dev/null +++ b/demos/android/app/src/main/java/com/google/blockly/android/webview/BlocklyWebViewFragment.java @@ -0,0 +1,37 @@ +package com.google.blockly.android.webview; + +import android.os.Bundle; +import android.support.annotation.NonNull; +import android.support.annotation.Nullable; +import android.support.v4.app.Fragment; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.webkit.WebSettings; +import android.webkit.WebView; + +/** + * This fragments contains and manages the web view that hosts Blockly. + */ +public class BlocklyWebViewFragment extends Fragment { + protected @Nullable WebView mWebView = null; + + @Nullable + @Override + public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, + @Nullable Bundle savedInstanceState) { + mWebView = new WebView(inflater.getContext()); + WebSettings webSettings = mWebView.getSettings(); + webSettings.setJavaScriptEnabled(true); + mWebView.loadUrl("file:///android_asset/blockly/webview.html"); + return mWebView; + } + + // TODO: Method to invoke code generation + // TODO: Method to load workspace from string (or InputStream?) + // TODO: Method to serialize workspace to string (or OutputStream?) + // TODO: Clear / reset workspace + // TODO: Load toolbox + // TODO: Listener for event JSON + // TODO: Method to evaluate JavaScript string in the WebView +} diff --git a/demos/android/app/src/main/java/com/google/blockly/android/webview/demo/MainActivity.java b/demos/android/app/src/main/java/com/google/blockly/android/webview/demo/MainActivity.java index 58cb54d92..ea7bf5659 100644 --- a/demos/android/app/src/main/java/com/google/blockly/android/webview/demo/MainActivity.java +++ b/demos/android/app/src/main/java/com/google/blockly/android/webview/demo/MainActivity.java @@ -5,8 +5,11 @@ import android.os.Bundle; import com.example.blocklywebview.R; +/** + * The primary activity of the demo application. The activity embeds the + * {@link com.google.blockly.android.webview.BlocklyWebViewFragment}. + */ public class MainActivity extends AppCompatActivity { - @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); diff --git a/demos/android/app/src/main/res/layout/activity_main.xml b/demos/android/app/src/main/res/layout/activity_main.xml index 3dc9926ad..37dc152b0 100644 --- a/demos/android/app/src/main/res/layout/activity_main.xml +++ b/demos/android/app/src/main/res/layout/activity_main.xml @@ -7,13 +7,11 @@ android:layout_height="match_parent" tools:context="com.google.blockly.android.webview.demo.MainActivity"> - + \ No newline at end of file From 43f10c52c3c1507ab1eac1dcb8d9116e72aedd51 Mon Sep 17 00:00:00 2001 From: Andrew n marshall Date: Tue, 7 Aug 2018 13:36:21 -0700 Subject: [PATCH 3/9] Empty/baseline project for iOS app. --- .../Blockly WebView.xcodeproj/project.pbxproj | 339 ++++++++++++++++++ .../contents.xcworkspacedata | 7 + .../xcshareddata/IDEWorkspaceChecks.plist | 8 + .../UserInterfaceState.xcuserstate | Bin 0 -> 18262 bytes .../xcschemes/xcschememanagement.plist | 14 + demos/ios/Blockly WebView/AppDelegate.swift | 46 +++ .../AppIcon.appiconset/Contents.json | 98 +++++ .../Assets.xcassets/Contents.json | 6 + .../Base.lproj/LaunchScreen.storyboard | 25 ++ .../Base.lproj/Main.storyboard | 24 ++ demos/ios/Blockly WebView/Info.plist | 45 +++ .../ios/Blockly WebView/ViewController.swift | 25 ++ 12 files changed, 637 insertions(+) create mode 100644 demos/ios/Blockly WebView.xcodeproj/project.pbxproj create mode 100644 demos/ios/Blockly WebView.xcodeproj/project.xcworkspace/contents.xcworkspacedata create mode 100644 demos/ios/Blockly WebView.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 demos/ios/Blockly WebView.xcodeproj/project.xcworkspace/xcuserdata/marshalla.xcuserdatad/UserInterfaceState.xcuserstate create mode 100644 demos/ios/Blockly WebView.xcodeproj/xcuserdata/marshalla.xcuserdatad/xcschemes/xcschememanagement.plist create mode 100644 demos/ios/Blockly WebView/AppDelegate.swift create mode 100644 demos/ios/Blockly WebView/Assets.xcassets/AppIcon.appiconset/Contents.json create mode 100644 demos/ios/Blockly WebView/Assets.xcassets/Contents.json create mode 100644 demos/ios/Blockly WebView/Base.lproj/LaunchScreen.storyboard create mode 100644 demos/ios/Blockly WebView/Base.lproj/Main.storyboard create mode 100644 demos/ios/Blockly WebView/Info.plist create mode 100644 demos/ios/Blockly WebView/ViewController.swift diff --git a/demos/ios/Blockly WebView.xcodeproj/project.pbxproj b/demos/ios/Blockly WebView.xcodeproj/project.pbxproj new file mode 100644 index 000000000..94ba7cea4 --- /dev/null +++ b/demos/ios/Blockly WebView.xcodeproj/project.pbxproj @@ -0,0 +1,339 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 50; + objects = { + +/* Begin PBXBuildFile section */ + AB980111211A37B50025AFF2 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = AB980110211A37B50025AFF2 /* AppDelegate.swift */; }; + AB980113211A37B50025AFF2 /* ViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = AB980112211A37B50025AFF2 /* ViewController.swift */; }; + AB980116211A37B50025AFF2 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = AB980114211A37B50025AFF2 /* Main.storyboard */; }; + AB980118211A37B70025AFF2 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = AB980117211A37B70025AFF2 /* Assets.xcassets */; }; + AB98011B211A37B70025AFF2 /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = AB980119211A37B70025AFF2 /* LaunchScreen.storyboard */; }; +/* End PBXBuildFile section */ + +/* Begin PBXFileReference section */ + AB98010D211A37B50025AFF2 /* Blockly WebView.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "Blockly WebView.app"; sourceTree = BUILT_PRODUCTS_DIR; }; + AB980110211A37B50025AFF2 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; + AB980112211A37B50025AFF2 /* ViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ViewController.swift; sourceTree = ""; }; + AB980115211A37B50025AFF2 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; + AB980117211A37B70025AFF2 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; + AB98011A211A37B70025AFF2 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; + AB98011C211A37B70025AFF2 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + AB98010A211A37B50025AFF2 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + AB980104211A37B50025AFF2 = { + isa = PBXGroup; + children = ( + AB98010F211A37B50025AFF2 /* Blockly WebView */, + AB98010E211A37B50025AFF2 /* Products */, + ); + sourceTree = ""; + }; + AB98010E211A37B50025AFF2 /* Products */ = { + isa = PBXGroup; + children = ( + AB98010D211A37B50025AFF2 /* Blockly WebView.app */, + ); + name = Products; + sourceTree = ""; + }; + AB98010F211A37B50025AFF2 /* Blockly WebView */ = { + isa = PBXGroup; + children = ( + AB980110211A37B50025AFF2 /* AppDelegate.swift */, + AB980112211A37B50025AFF2 /* ViewController.swift */, + AB980114211A37B50025AFF2 /* Main.storyboard */, + AB980117211A37B70025AFF2 /* Assets.xcassets */, + AB980119211A37B70025AFF2 /* LaunchScreen.storyboard */, + AB98011C211A37B70025AFF2 /* Info.plist */, + ); + path = "Blockly WebView"; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + AB98010C211A37B50025AFF2 /* Blockly WebView */ = { + isa = PBXNativeTarget; + buildConfigurationList = AB98011F211A37B70025AFF2 /* Build configuration list for PBXNativeTarget "Blockly WebView" */; + buildPhases = ( + AB980109211A37B50025AFF2 /* Sources */, + AB98010A211A37B50025AFF2 /* Frameworks */, + AB98010B211A37B50025AFF2 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = "Blockly WebView"; + productName = "Blockly WebView"; + productReference = AB98010D211A37B50025AFF2 /* Blockly WebView.app */; + productType = "com.apple.product-type.application"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + AB980105211A37B50025AFF2 /* Project object */ = { + isa = PBXProject; + attributes = { + LastSwiftUpdateCheck = 0940; + LastUpgradeCheck = 0940; + ORGANIZATIONNAME = Google; + TargetAttributes = { + AB98010C211A37B50025AFF2 = { + CreatedOnToolsVersion = 9.4.1; + }; + }; + }; + buildConfigurationList = AB980108211A37B50025AFF2 /* Build configuration list for PBXProject "Blockly WebView" */; + compatibilityVersion = "Xcode 9.3"; + developmentRegion = en; + hasScannedForEncodings = 0; + knownRegions = ( + en, + Base, + ); + mainGroup = AB980104211A37B50025AFF2; + productRefGroup = AB98010E211A37B50025AFF2 /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + AB98010C211A37B50025AFF2 /* Blockly WebView */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + AB98010B211A37B50025AFF2 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + AB98011B211A37B70025AFF2 /* LaunchScreen.storyboard in Resources */, + AB980118211A37B70025AFF2 /* Assets.xcassets in Resources */, + AB980116211A37B50025AFF2 /* Main.storyboard in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + AB980109211A37B50025AFF2 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + AB980113211A37B50025AFF2 /* ViewController.swift in Sources */, + AB980111211A37B50025AFF2 /* AppDelegate.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXVariantGroup section */ + AB980114211A37B50025AFF2 /* Main.storyboard */ = { + isa = PBXVariantGroup; + children = ( + AB980115211A37B50025AFF2 /* Base */, + ); + name = Main.storyboard; + sourceTree = ""; + }; + AB980119211A37B70025AFF2 /* LaunchScreen.storyboard */ = { + isa = PBXVariantGroup; + children = ( + AB98011A211A37B70025AFF2 /* Base */, + ); + name = LaunchScreen.storyboard; + sourceTree = ""; + }; +/* End PBXVariantGroup section */ + +/* Begin XCBuildConfiguration section */ + AB98011D211A37B70025AFF2 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + CODE_SIGN_IDENTITY = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = dwarf; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_DYNAMIC_NO_PIC = NO; + GCC_NO_COMMON_BLOCKS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 11.4; + MTL_ENABLE_DEBUG_INFO = YES; + ONLY_ACTIVE_ARCH = YES; + SDKROOT = iphoneos; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + }; + name = Debug; + }; + AB98011E211A37B70025AFF2 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + CODE_SIGN_IDENTITY = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 11.4; + MTL_ENABLE_DEBUG_INFO = NO; + SDKROOT = iphoneos; + SWIFT_COMPILATION_MODE = wholemodule; + SWIFT_OPTIMIZATION_LEVEL = "-O"; + VALIDATE_PRODUCT = YES; + }; + name = Release; + }; + AB980120211A37B70025AFF2 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CODE_SIGN_STYLE = Automatic; + DEVELOPMENT_TEAM = 3KZF7Q7Q49; + INFOPLIST_FILE = "Blockly WebView/Info.plist"; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + PRODUCT_BUNDLE_IDENTIFIER = "com.google.kidscoding.Blockly-WebView"; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 4.0; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Debug; + }; + AB980121211A37B70025AFF2 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CODE_SIGN_STYLE = Automatic; + DEVELOPMENT_TEAM = 3KZF7Q7Q49; + INFOPLIST_FILE = "Blockly WebView/Info.plist"; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + PRODUCT_BUNDLE_IDENTIFIER = "com.google.kidscoding.Blockly-WebView"; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 4.0; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + AB980108211A37B50025AFF2 /* Build configuration list for PBXProject "Blockly WebView" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + AB98011D211A37B70025AFF2 /* Debug */, + AB98011E211A37B70025AFF2 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + AB98011F211A37B70025AFF2 /* Build configuration list for PBXNativeTarget "Blockly WebView" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + AB980120211A37B70025AFF2 /* Debug */, + AB980121211A37B70025AFF2 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = AB980105211A37B50025AFF2 /* Project object */; +} diff --git a/demos/ios/Blockly WebView.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/demos/ios/Blockly WebView.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 000000000..2a4f4ae83 --- /dev/null +++ b/demos/ios/Blockly WebView.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/demos/ios/Blockly WebView.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/demos/ios/Blockly WebView.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 000000000..18d981003 --- /dev/null +++ b/demos/ios/Blockly WebView.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/demos/ios/Blockly WebView.xcodeproj/project.xcworkspace/xcuserdata/marshalla.xcuserdatad/UserInterfaceState.xcuserstate b/demos/ios/Blockly WebView.xcodeproj/project.xcworkspace/xcuserdata/marshalla.xcuserdatad/UserInterfaceState.xcuserstate new file mode 100644 index 0000000000000000000000000000000000000000..a4dea93447f0a4fd008ddf4293e753e1c1970851 GIT binary patch literal 18262 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 sUQ5}U@>a_Bl$|M`r~KY8uwP8S_ + + + + SchemeUserState + + Blockly WebView.xcscheme + + orderHint + 0 + + + + diff --git a/demos/ios/Blockly WebView/AppDelegate.swift b/demos/ios/Blockly WebView/AppDelegate.swift new file mode 100644 index 000000000..1f2bf6eed --- /dev/null +++ b/demos/ios/Blockly WebView/AppDelegate.swift @@ -0,0 +1,46 @@ +// +// AppDelegate.swift +// Blockly WebView +// +// Created by Andrew Marshall on 8/7/18. +// Copyright © 2018 Google. All rights reserved. +// + +import UIKit + +@UIApplicationMain +class AppDelegate: UIResponder, UIApplicationDelegate { + + var window: UIWindow? + + + func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool { + // Override point for customization after application launch. + return true + } + + func applicationWillResignActive(_ application: UIApplication) { + // Sent when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state. + // Use this method to pause ongoing tasks, disable timers, and invalidate graphics rendering callbacks. Games should use this method to pause the game. + } + + func applicationDidEnterBackground(_ application: UIApplication) { + // Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later. + // If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits. + } + + func applicationWillEnterForeground(_ application: UIApplication) { + // Called as part of the transition from the background to the active state; here you can undo many of the changes made on entering the background. + } + + func applicationDidBecomeActive(_ application: UIApplication) { + // Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface. + } + + func applicationWillTerminate(_ application: UIApplication) { + // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:. + } + + +} + diff --git a/demos/ios/Blockly WebView/Assets.xcassets/AppIcon.appiconset/Contents.json b/demos/ios/Blockly WebView/Assets.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 000000000..d8db8d65f --- /dev/null +++ b/demos/ios/Blockly WebView/Assets.xcassets/AppIcon.appiconset/Contents.json @@ -0,0 +1,98 @@ +{ + "images" : [ + { + "idiom" : "iphone", + "size" : "20x20", + "scale" : "2x" + }, + { + "idiom" : "iphone", + "size" : "20x20", + "scale" : "3x" + }, + { + "idiom" : "iphone", + "size" : "29x29", + "scale" : "2x" + }, + { + "idiom" : "iphone", + "size" : "29x29", + "scale" : "3x" + }, + { + "idiom" : "iphone", + "size" : "40x40", + "scale" : "2x" + }, + { + "idiom" : "iphone", + "size" : "40x40", + "scale" : "3x" + }, + { + "idiom" : "iphone", + "size" : "60x60", + "scale" : "2x" + }, + { + "idiom" : "iphone", + "size" : "60x60", + "scale" : "3x" + }, + { + "idiom" : "ipad", + "size" : "20x20", + "scale" : "1x" + }, + { + "idiom" : "ipad", + "size" : "20x20", + "scale" : "2x" + }, + { + "idiom" : "ipad", + "size" : "29x29", + "scale" : "1x" + }, + { + "idiom" : "ipad", + "size" : "29x29", + "scale" : "2x" + }, + { + "idiom" : "ipad", + "size" : "40x40", + "scale" : "1x" + }, + { + "idiom" : "ipad", + "size" : "40x40", + "scale" : "2x" + }, + { + "idiom" : "ipad", + "size" : "76x76", + "scale" : "1x" + }, + { + "idiom" : "ipad", + "size" : "76x76", + "scale" : "2x" + }, + { + "idiom" : "ipad", + "size" : "83.5x83.5", + "scale" : "2x" + }, + { + "idiom" : "ios-marketing", + "size" : "1024x1024", + "scale" : "1x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/demos/ios/Blockly WebView/Assets.xcassets/Contents.json b/demos/ios/Blockly WebView/Assets.xcassets/Contents.json new file mode 100644 index 000000000..da4a164c9 --- /dev/null +++ b/demos/ios/Blockly WebView/Assets.xcassets/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/demos/ios/Blockly WebView/Base.lproj/LaunchScreen.storyboard b/demos/ios/Blockly WebView/Base.lproj/LaunchScreen.storyboard new file mode 100644 index 000000000..f83f6fd58 --- /dev/null +++ b/demos/ios/Blockly WebView/Base.lproj/LaunchScreen.storyboard @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/demos/ios/Blockly WebView/Base.lproj/Main.storyboard b/demos/ios/Blockly WebView/Base.lproj/Main.storyboard new file mode 100644 index 000000000..03c13c228 --- /dev/null +++ b/demos/ios/Blockly WebView/Base.lproj/Main.storyboard @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/demos/ios/Blockly WebView/Info.plist b/demos/ios/Blockly WebView/Info.plist new file mode 100644 index 000000000..16be3b681 --- /dev/null +++ b/demos/ios/Blockly WebView/Info.plist @@ -0,0 +1,45 @@ + + + + + CFBundleDevelopmentRegion + $(DEVELOPMENT_LANGUAGE) + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + APPL + CFBundleShortVersionString + 1.0 + CFBundleVersion + 1 + LSRequiresIPhoneOS + + UILaunchStoryboardName + LaunchScreen + UIMainStoryboardFile + Main + UIRequiredDeviceCapabilities + + armv7 + + UISupportedInterfaceOrientations + + UIInterfaceOrientationPortrait + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + UISupportedInterfaceOrientations~ipad + + UIInterfaceOrientationPortrait + UIInterfaceOrientationPortraitUpsideDown + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + + diff --git a/demos/ios/Blockly WebView/ViewController.swift b/demos/ios/Blockly WebView/ViewController.swift new file mode 100644 index 000000000..94df7b750 --- /dev/null +++ b/demos/ios/Blockly WebView/ViewController.swift @@ -0,0 +1,25 @@ +// +// ViewController.swift +// Blockly WebView +// +// Created by Andrew Marshall on 8/7/18. +// Copyright © 2018 Google. All rights reserved. +// + +import UIKit + +class ViewController: UIViewController { + + override func viewDidLoad() { + super.viewDidLoad() + // Do any additional setup after loading the view, typically from a nib. + } + + override func didReceiveMemoryWarning() { + super.didReceiveMemoryWarning() + // Dispose of any resources that can be recreated. + } + + +} + From 7e375ce7a765aebd1ef495f35cec8ede59ec56a8 Mon Sep 17 00:00:00 2001 From: Andrew n marshall Date: Thu, 9 Aug 2018 15:32:31 -0700 Subject: [PATCH 4/9] Load HTML from Resources, into WebView The resource file URL appears to be wrong in some way --- .../Blockly WebView.xcodeproj/project.pbxproj | 32 ++++++++++++++++++ .../UserInterfaceState.xcuserstate | Bin 18262 -> 36560 bytes .../Base.lproj/Main.storyboard | 26 ++++++++++++-- .../ios/Blockly WebView/ViewController.swift | 17 +++++++++- .../Non-Localized/Blockly/webview.html | 5 +++ 5 files changed, 76 insertions(+), 4 deletions(-) create mode 100644 demos/ios/Resources/Non-Localized/Blockly/webview.html diff --git a/demos/ios/Blockly WebView.xcodeproj/project.pbxproj b/demos/ios/Blockly WebView.xcodeproj/project.pbxproj index 94ba7cea4..eeea4d2eb 100644 --- a/demos/ios/Blockly WebView.xcodeproj/project.pbxproj +++ b/demos/ios/Blockly WebView.xcodeproj/project.pbxproj @@ -7,14 +7,17 @@ objects = { /* Begin PBXBuildFile section */ + AB036C55211B89D600CCC9D8 /* WebKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AB036C54211B89D600CCC9D8 /* WebKit.framework */; }; AB980111211A37B50025AFF2 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = AB980110211A37B50025AFF2 /* AppDelegate.swift */; }; AB980113211A37B50025AFF2 /* ViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = AB980112211A37B50025AFF2 /* ViewController.swift */; }; AB980116211A37B50025AFF2 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = AB980114211A37B50025AFF2 /* Main.storyboard */; }; AB980118211A37B70025AFF2 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = AB980117211A37B70025AFF2 /* Assets.xcassets */; }; AB98011B211A37B70025AFF2 /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = AB980119211A37B70025AFF2 /* LaunchScreen.storyboard */; }; + ABA1B7FC212214E7000D3CC5 /* Blockly in Resources */ = {isa = PBXBuildFile; fileRef = ABA1B7FB212214E7000D3CC5 /* Blockly */; }; /* End PBXBuildFile section */ /* Begin PBXFileReference section */ + AB036C54211B89D600CCC9D8 /* WebKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = WebKit.framework; path = System/Library/Frameworks/WebKit.framework; sourceTree = SDKROOT; }; AB98010D211A37B50025AFF2 /* Blockly WebView.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "Blockly WebView.app"; sourceTree = BUILT_PRODUCTS_DIR; }; AB980110211A37B50025AFF2 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; AB980112211A37B50025AFF2 /* ViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ViewController.swift; sourceTree = ""; }; @@ -22,6 +25,7 @@ AB980117211A37B70025AFF2 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; AB98011A211A37B70025AFF2 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; AB98011C211A37B70025AFF2 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + ABA1B7FB212214E7000D3CC5 /* Blockly */ = {isa = PBXFileReference; lastKnownFileType = folder; name = Blockly; path = "Resources/Non-Localized/Blockly"; sourceTree = SOURCE_ROOT; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -29,17 +33,27 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( + AB036C55211B89D600CCC9D8 /* WebKit.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ + AB036C53211B89D500CCC9D8 /* Frameworks */ = { + isa = PBXGroup; + children = ( + AB036C54211B89D600CCC9D8 /* WebKit.framework */, + ); + name = Frameworks; + sourceTree = ""; + }; AB980104211A37B50025AFF2 = { isa = PBXGroup; children = ( AB98010F211A37B50025AFF2 /* Blockly WebView */, AB98010E211A37B50025AFF2 /* Products */, + AB036C53211B89D500CCC9D8 /* Frameworks */, ); sourceTree = ""; }; @@ -54,6 +68,7 @@ AB98010F211A37B50025AFF2 /* Blockly WebView */ = { isa = PBXGroup; children = ( + ABA1B7F9212214B9000D3CC5 /* Resources */, AB980110211A37B50025AFF2 /* AppDelegate.swift */, AB980112211A37B50025AFF2 /* ViewController.swift */, AB980114211A37B50025AFF2 /* Main.storyboard */, @@ -64,6 +79,22 @@ path = "Blockly WebView"; sourceTree = ""; }; + ABA1B7F9212214B9000D3CC5 /* Resources */ = { + isa = PBXGroup; + children = ( + ABA1B7FA212214C6000D3CC5 /* Non-Localized */, + ); + path = Resources; + sourceTree = ""; + }; + ABA1B7FA212214C6000D3CC5 /* Non-Localized */ = { + isa = PBXGroup; + children = ( + ABA1B7FB212214E7000D3CC5 /* Blockly */, + ); + path = "Non-Localized"; + sourceTree = ""; + }; /* End PBXGroup section */ /* Begin PBXNativeTarget section */ @@ -125,6 +156,7 @@ AB98011B211A37B70025AFF2 /* LaunchScreen.storyboard in Resources */, AB980118211A37B70025AFF2 /* Assets.xcassets in Resources */, AB980116211A37B50025AFF2 /* Main.storyboard in Resources */, + ABA1B7FC212214E7000D3CC5 /* Blockly in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; diff --git a/demos/ios/Blockly WebView.xcodeproj/project.xcworkspace/xcuserdata/marshalla.xcuserdatad/UserInterfaceState.xcuserstate b/demos/ios/Blockly WebView.xcodeproj/project.xcworkspace/xcuserdata/marshalla.xcuserdatad/UserInterfaceState.xcuserstate index a4dea93447f0a4fd008ddf4293e753e1c1970851..3e3e55daa1ae3f2c74a8adf45376767485f1c23a 100644 GIT binary patch literal 36560 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 - + + + + - + + @@ -9,16 +13,32 @@ - + + + + + + + + + + + + + + + + + diff --git a/demos/ios/Blockly WebView/ViewController.swift b/demos/ios/Blockly WebView/ViewController.swift index 94df7b750..b84798535 100644 --- a/demos/ios/Blockly WebView/ViewController.swift +++ b/demos/ios/Blockly WebView/ViewController.swift @@ -7,12 +7,27 @@ // import UIKit +import WebKit class ViewController: UIViewController { - + /// The name used to reference this iOS object when executing callbacks from the JS code. + /// If this value is changed, it should also be changed in the `CODE_GENERATOR_BRIDGE_JS` file. + fileprivate static let HOST_HTML = "Blockly/webview.html" + + @IBOutlet weak var webView: WKWebView! + override func viewDidLoad() { super.viewDidLoad() // Do any additional setup after loading the view, typically from a nib. + loadWebView() + } + + func loadWebView() { + print("loadWebView: Bundle.main = ", Bundle.main); // This prints + if let htmlUrl = Bundle.main.url(forResource: "webview", withExtension: "html", subdirectory: "Blockly") { + print("htmlUrl = ", htmlUrl) // Doesn't print + webView.load(URLRequest.init(url: htmlUrl)) + } } override func didReceiveMemoryWarning() { diff --git a/demos/ios/Resources/Non-Localized/Blockly/webview.html b/demos/ios/Resources/Non-Localized/Blockly/webview.html new file mode 100644 index 000000000..5f5c045fa --- /dev/null +++ b/demos/ios/Resources/Non-Localized/Blockly/webview.html @@ -0,0 +1,5 @@ + + +

Blockly/webview.html

+ + \ No newline at end of file From 852ad5e7b2d4a6f3a9f392904e25234498348256 Mon Sep 17 00:00:00 2001 From: Andrew n marshall Date: Mon, 13 Aug 2018 12:57:41 -0700 Subject: [PATCH 5/9] Load Blockly into webpage from files in Resources. --- .../UserInterfaceState.xcuserstate | Bin 36560 -> 36555 bytes .../ios/Blockly WebView/ViewController.swift | 2 - .../Blockly/blockly_compressed.js | 1756 +++++++++++++++++ .../Blockly/blocks_compressed.js | 163 ++ .../Non-Localized/Blockly/media/1x1.gif | Bin 0 -> 43 bytes .../Non-Localized/Blockly/media/click.mp3 | Bin 0 -> 2304 bytes .../Non-Localized/Blockly/media/click.ogg | Bin 0 -> 4865 bytes .../Non-Localized/Blockly/media/click.wav | Bin 0 -> 3782 bytes .../Non-Localized/Blockly/media/delete.mp3 | Bin 0 -> 3123 bytes .../Non-Localized/Blockly/media/delete.ogg | Bin 0 -> 5731 bytes .../Non-Localized/Blockly/media/delete.wav | Bin 0 -> 9164 bytes .../Blockly/media/disconnect.mp3 | Bin 0 -> 1586 bytes .../Blockly/media/disconnect.ogg | Bin 0 -> 4404 bytes .../Blockly/media/disconnect.wav | Bin 0 -> 1492 bytes .../Blockly/media/handclosed.cur | Bin 0 -> 326 bytes .../Blockly/media/handdelete.cur | Bin 0 -> 766 bytes .../Non-Localized/Blockly/media/handopen.cur | Bin 0 -> 198 bytes .../Non-Localized/Blockly/media/quote0.png | Bin 0 -> 796 bytes .../Non-Localized/Blockly/media/quote1.png | Bin 0 -> 738 bytes .../Non-Localized/Blockly/media/sprites.png | Bin 0 -> 4146 bytes .../Non-Localized/Blockly/media/sprites.svg | 74 + .../Non-Localized/Blockly/msg/js/ab.js | 432 ++++ .../Non-Localized/Blockly/msg/js/ar.js | 432 ++++ .../Non-Localized/Blockly/msg/js/az.js | 432 ++++ .../Non-Localized/Blockly/msg/js/ba.js | 432 ++++ .../Non-Localized/Blockly/msg/js/bcc.js | 432 ++++ .../Non-Localized/Blockly/msg/js/be-tarask.js | 432 ++++ .../Non-Localized/Blockly/msg/js/be.js | 432 ++++ .../Non-Localized/Blockly/msg/js/bg.js | 432 ++++ .../Non-Localized/Blockly/msg/js/bn.js | 432 ++++ .../Non-Localized/Blockly/msg/js/br.js | 432 ++++ .../Non-Localized/Blockly/msg/js/ca.js | 432 ++++ .../Non-Localized/Blockly/msg/js/cs.js | 432 ++++ .../Non-Localized/Blockly/msg/js/da.js | 432 ++++ .../Non-Localized/Blockly/msg/js/de.js | 432 ++++ .../Non-Localized/Blockly/msg/js/diq.js | 432 ++++ .../Non-Localized/Blockly/msg/js/dty.js | 432 ++++ .../Non-Localized/Blockly/msg/js/el.js | 432 ++++ .../Non-Localized/Blockly/msg/js/en-gb.js | 432 ++++ .../Non-Localized/Blockly/msg/js/en.js | 432 ++++ .../Non-Localized/Blockly/msg/js/eo.js | 432 ++++ .../Non-Localized/Blockly/msg/js/es.js | 432 ++++ .../Non-Localized/Blockly/msg/js/et.js | 432 ++++ .../Non-Localized/Blockly/msg/js/eu.js | 432 ++++ .../Non-Localized/Blockly/msg/js/fa.js | 432 ++++ .../Non-Localized/Blockly/msg/js/fi.js | 432 ++++ .../Non-Localized/Blockly/msg/js/fr.js | 432 ++++ .../Non-Localized/Blockly/msg/js/gl.js | 432 ++++ .../Non-Localized/Blockly/msg/js/gor.js | 432 ++++ .../Non-Localized/Blockly/msg/js/he.js | 432 ++++ .../Non-Localized/Blockly/msg/js/hi.js | 432 ++++ .../Non-Localized/Blockly/msg/js/hrx.js | 432 ++++ .../Non-Localized/Blockly/msg/js/hu.js | 432 ++++ .../Non-Localized/Blockly/msg/js/ia.js | 432 ++++ .../Non-Localized/Blockly/msg/js/id.js | 432 ++++ .../Non-Localized/Blockly/msg/js/is.js | 432 ++++ .../Non-Localized/Blockly/msg/js/it.js | 432 ++++ .../Non-Localized/Blockly/msg/js/ja.js | 432 ++++ .../Non-Localized/Blockly/msg/js/kab.js | 432 ++++ .../Non-Localized/Blockly/msg/js/ko.js | 432 ++++ .../Non-Localized/Blockly/msg/js/lb.js | 432 ++++ .../Non-Localized/Blockly/msg/js/lki.js | 432 ++++ .../Non-Localized/Blockly/msg/js/lo.js | 432 ++++ .../Non-Localized/Blockly/msg/js/lrc.js | 432 ++++ .../Non-Localized/Blockly/msg/js/lt.js | 432 ++++ .../Non-Localized/Blockly/msg/js/lv.js | 432 ++++ .../Non-Localized/Blockly/msg/js/mk.js | 432 ++++ .../Non-Localized/Blockly/msg/js/ms.js | 432 ++++ .../Non-Localized/Blockly/msg/js/nb.js | 432 ++++ .../Non-Localized/Blockly/msg/js/nl.js | 432 ++++ .../Non-Localized/Blockly/msg/js/oc.js | 432 ++++ .../Non-Localized/Blockly/msg/js/pl.js | 432 ++++ .../Non-Localized/Blockly/msg/js/pms.js | 432 ++++ .../Non-Localized/Blockly/msg/js/pt-br.js | 432 ++++ .../Non-Localized/Blockly/msg/js/pt.js | 432 ++++ .../Non-Localized/Blockly/msg/js/ro.js | 432 ++++ .../Non-Localized/Blockly/msg/js/ru.js | 432 ++++ .../Non-Localized/Blockly/msg/js/sc.js | 432 ++++ .../Non-Localized/Blockly/msg/js/sd.js | 432 ++++ .../Non-Localized/Blockly/msg/js/shn.js | 432 ++++ .../Non-Localized/Blockly/msg/js/sk.js | 432 ++++ .../Non-Localized/Blockly/msg/js/skr-arab.js | 432 ++++ .../Non-Localized/Blockly/msg/js/sl.js | 432 ++++ .../Non-Localized/Blockly/msg/js/sq.js | 432 ++++ .../Non-Localized/Blockly/msg/js/sr-latn.js | 432 ++++ .../Non-Localized/Blockly/msg/js/sr.js | 432 ++++ .../Non-Localized/Blockly/msg/js/sv.js | 432 ++++ .../Non-Localized/Blockly/msg/js/ta.js | 432 ++++ .../Non-Localized/Blockly/msg/js/tcy.js | 432 ++++ .../Non-Localized/Blockly/msg/js/te.js | 432 ++++ .../Non-Localized/Blockly/msg/js/th.js | 432 ++++ .../Non-Localized/Blockly/msg/js/tl.js | 432 ++++ .../Non-Localized/Blockly/msg/js/tlh.js | 432 ++++ .../Non-Localized/Blockly/msg/js/tr.js | 432 ++++ .../Non-Localized/Blockly/msg/js/ug-arab.js | 432 ++++ .../Non-Localized/Blockly/msg/js/uk.js | 432 ++++ .../Non-Localized/Blockly/msg/js/ur.js | 432 ++++ .../Non-Localized/Blockly/msg/js/vi.js | 432 ++++ .../Non-Localized/Blockly/msg/js/xmf.js | 432 ++++ .../Non-Localized/Blockly/msg/js/zh-hans.js | 432 ++++ .../Non-Localized/Blockly/msg/js/zh-hant.js | 432 ++++ .../Non-Localized/Blockly/toolbox_standard.js | 333 ++++ .../Non-Localized/Blockly/webview.html | 26 +- 103 files changed, 36911 insertions(+), 3 deletions(-) create mode 100644 demos/ios/Resources/Non-Localized/Blockly/blockly_compressed.js create mode 100644 demos/ios/Resources/Non-Localized/Blockly/blocks_compressed.js create mode 100644 demos/ios/Resources/Non-Localized/Blockly/media/1x1.gif create mode 100644 demos/ios/Resources/Non-Localized/Blockly/media/click.mp3 create mode 100644 demos/ios/Resources/Non-Localized/Blockly/media/click.ogg create mode 100644 demos/ios/Resources/Non-Localized/Blockly/media/click.wav create mode 100644 demos/ios/Resources/Non-Localized/Blockly/media/delete.mp3 create mode 100644 demos/ios/Resources/Non-Localized/Blockly/media/delete.ogg create mode 100644 demos/ios/Resources/Non-Localized/Blockly/media/delete.wav create mode 100644 demos/ios/Resources/Non-Localized/Blockly/media/disconnect.mp3 create mode 100644 demos/ios/Resources/Non-Localized/Blockly/media/disconnect.ogg create mode 100644 demos/ios/Resources/Non-Localized/Blockly/media/disconnect.wav create mode 100644 demos/ios/Resources/Non-Localized/Blockly/media/handclosed.cur create mode 100644 demos/ios/Resources/Non-Localized/Blockly/media/handdelete.cur create mode 100644 demos/ios/Resources/Non-Localized/Blockly/media/handopen.cur create mode 100644 demos/ios/Resources/Non-Localized/Blockly/media/quote0.png create mode 100644 demos/ios/Resources/Non-Localized/Blockly/media/quote1.png create mode 100644 demos/ios/Resources/Non-Localized/Blockly/media/sprites.png create mode 100644 demos/ios/Resources/Non-Localized/Blockly/media/sprites.svg create mode 100644 demos/ios/Resources/Non-Localized/Blockly/msg/js/ab.js create mode 100644 demos/ios/Resources/Non-Localized/Blockly/msg/js/ar.js create mode 100644 demos/ios/Resources/Non-Localized/Blockly/msg/js/az.js create mode 100644 demos/ios/Resources/Non-Localized/Blockly/msg/js/ba.js create mode 100644 demos/ios/Resources/Non-Localized/Blockly/msg/js/bcc.js create mode 100644 demos/ios/Resources/Non-Localized/Blockly/msg/js/be-tarask.js create mode 100644 demos/ios/Resources/Non-Localized/Blockly/msg/js/be.js create mode 100644 demos/ios/Resources/Non-Localized/Blockly/msg/js/bg.js create mode 100644 demos/ios/Resources/Non-Localized/Blockly/msg/js/bn.js create mode 100644 demos/ios/Resources/Non-Localized/Blockly/msg/js/br.js create mode 100644 demos/ios/Resources/Non-Localized/Blockly/msg/js/ca.js create mode 100644 demos/ios/Resources/Non-Localized/Blockly/msg/js/cs.js create mode 100644 demos/ios/Resources/Non-Localized/Blockly/msg/js/da.js create mode 100644 demos/ios/Resources/Non-Localized/Blockly/msg/js/de.js create mode 100644 demos/ios/Resources/Non-Localized/Blockly/msg/js/diq.js create mode 100644 demos/ios/Resources/Non-Localized/Blockly/msg/js/dty.js create mode 100644 demos/ios/Resources/Non-Localized/Blockly/msg/js/el.js create mode 100644 demos/ios/Resources/Non-Localized/Blockly/msg/js/en-gb.js create mode 100644 demos/ios/Resources/Non-Localized/Blockly/msg/js/en.js create mode 100644 demos/ios/Resources/Non-Localized/Blockly/msg/js/eo.js create mode 100644 demos/ios/Resources/Non-Localized/Blockly/msg/js/es.js create mode 100644 demos/ios/Resources/Non-Localized/Blockly/msg/js/et.js create mode 100644 demos/ios/Resources/Non-Localized/Blockly/msg/js/eu.js create mode 100644 demos/ios/Resources/Non-Localized/Blockly/msg/js/fa.js create mode 100644 demos/ios/Resources/Non-Localized/Blockly/msg/js/fi.js create mode 100644 demos/ios/Resources/Non-Localized/Blockly/msg/js/fr.js create mode 100644 demos/ios/Resources/Non-Localized/Blockly/msg/js/gl.js create mode 100644 demos/ios/Resources/Non-Localized/Blockly/msg/js/gor.js create mode 100644 demos/ios/Resources/Non-Localized/Blockly/msg/js/he.js create mode 100644 demos/ios/Resources/Non-Localized/Blockly/msg/js/hi.js create mode 100644 demos/ios/Resources/Non-Localized/Blockly/msg/js/hrx.js create mode 100644 demos/ios/Resources/Non-Localized/Blockly/msg/js/hu.js create mode 100644 demos/ios/Resources/Non-Localized/Blockly/msg/js/ia.js create mode 100644 demos/ios/Resources/Non-Localized/Blockly/msg/js/id.js create mode 100644 demos/ios/Resources/Non-Localized/Blockly/msg/js/is.js create mode 100644 demos/ios/Resources/Non-Localized/Blockly/msg/js/it.js create mode 100644 demos/ios/Resources/Non-Localized/Blockly/msg/js/ja.js create mode 100644 demos/ios/Resources/Non-Localized/Blockly/msg/js/kab.js create mode 100644 demos/ios/Resources/Non-Localized/Blockly/msg/js/ko.js create mode 100644 demos/ios/Resources/Non-Localized/Blockly/msg/js/lb.js create mode 100644 demos/ios/Resources/Non-Localized/Blockly/msg/js/lki.js create mode 100644 demos/ios/Resources/Non-Localized/Blockly/msg/js/lo.js create mode 100644 demos/ios/Resources/Non-Localized/Blockly/msg/js/lrc.js create mode 100644 demos/ios/Resources/Non-Localized/Blockly/msg/js/lt.js create mode 100644 demos/ios/Resources/Non-Localized/Blockly/msg/js/lv.js create mode 100644 demos/ios/Resources/Non-Localized/Blockly/msg/js/mk.js create mode 100644 demos/ios/Resources/Non-Localized/Blockly/msg/js/ms.js create mode 100644 demos/ios/Resources/Non-Localized/Blockly/msg/js/nb.js create mode 100644 demos/ios/Resources/Non-Localized/Blockly/msg/js/nl.js create mode 100644 demos/ios/Resources/Non-Localized/Blockly/msg/js/oc.js create mode 100644 demos/ios/Resources/Non-Localized/Blockly/msg/js/pl.js create mode 100644 demos/ios/Resources/Non-Localized/Blockly/msg/js/pms.js create mode 100644 demos/ios/Resources/Non-Localized/Blockly/msg/js/pt-br.js create mode 100644 demos/ios/Resources/Non-Localized/Blockly/msg/js/pt.js create mode 100644 demos/ios/Resources/Non-Localized/Blockly/msg/js/ro.js create mode 100644 demos/ios/Resources/Non-Localized/Blockly/msg/js/ru.js create mode 100644 demos/ios/Resources/Non-Localized/Blockly/msg/js/sc.js create mode 100644 demos/ios/Resources/Non-Localized/Blockly/msg/js/sd.js create mode 100644 demos/ios/Resources/Non-Localized/Blockly/msg/js/shn.js create mode 100644 demos/ios/Resources/Non-Localized/Blockly/msg/js/sk.js create mode 100644 demos/ios/Resources/Non-Localized/Blockly/msg/js/skr-arab.js create mode 100644 demos/ios/Resources/Non-Localized/Blockly/msg/js/sl.js create mode 100644 demos/ios/Resources/Non-Localized/Blockly/msg/js/sq.js create mode 100644 demos/ios/Resources/Non-Localized/Blockly/msg/js/sr-latn.js create mode 100644 demos/ios/Resources/Non-Localized/Blockly/msg/js/sr.js create mode 100644 demos/ios/Resources/Non-Localized/Blockly/msg/js/sv.js create mode 100644 demos/ios/Resources/Non-Localized/Blockly/msg/js/ta.js create mode 100644 demos/ios/Resources/Non-Localized/Blockly/msg/js/tcy.js create mode 100644 demos/ios/Resources/Non-Localized/Blockly/msg/js/te.js create mode 100644 demos/ios/Resources/Non-Localized/Blockly/msg/js/th.js create mode 100644 demos/ios/Resources/Non-Localized/Blockly/msg/js/tl.js create mode 100644 demos/ios/Resources/Non-Localized/Blockly/msg/js/tlh.js create mode 100644 demos/ios/Resources/Non-Localized/Blockly/msg/js/tr.js create mode 100644 demos/ios/Resources/Non-Localized/Blockly/msg/js/ug-arab.js create mode 100644 demos/ios/Resources/Non-Localized/Blockly/msg/js/uk.js create mode 100644 demos/ios/Resources/Non-Localized/Blockly/msg/js/ur.js create mode 100644 demos/ios/Resources/Non-Localized/Blockly/msg/js/vi.js create mode 100644 demos/ios/Resources/Non-Localized/Blockly/msg/js/xmf.js create mode 100644 demos/ios/Resources/Non-Localized/Blockly/msg/js/zh-hans.js create mode 100644 demos/ios/Resources/Non-Localized/Blockly/msg/js/zh-hant.js create mode 100644 demos/ios/Resources/Non-Localized/Blockly/toolbox_standard.js diff --git a/demos/ios/Blockly WebView.xcodeproj/project.xcworkspace/xcuserdata/marshalla.xcuserdatad/UserInterfaceState.xcuserstate b/demos/ios/Blockly WebView.xcodeproj/project.xcworkspace/xcuserdata/marshalla.xcuserdatad/UserInterfaceState.xcuserstate index 3e3e55daa1ae3f2c74a8adf45376767485f1c23a..0e3c5338dffdd5a5de0d7e306db2c0e5b3300122 100644 GIT binary patch delta 2758 zcmXZUd3+3q0tfKS?0AF_)wrUFQuk4DJ|Q9~5g{a*nVp&4+1)vIW_NaGcV~9auqbf_ zWhG5S9IYzV5K?DbrPLLaB95j~%7=QWqe#nZ-+O)i{qz0({`sA&1Zyk7>Uk|~16wE8 zENFRjOp}CH+ZIlaP0Q{D4jW#hWj}y`4KXIS$VRqKiam}``mpy5TepVRi8J%^3t$Ab zV>sb(k}kK0q8XOqc%NSgh*E5P{;&?nw7e`in=#;Nc?DTn6VU(795*k}go8WEm zKKKxP1U|8~wDq(Nunn>ewhf8errEqU!DiSBZA)#Hwu83Qwu`pAwx_n25D2w^xfD6iEPsB-}@MBGy)T)VX`0&)4sY;6NuOexqTSc3| z&EU3hZ@3>k5FQK znSjhhNW_ECh!^o80un(?WEL_9nTM=EN|AD8EwUcjjBG`=A={B^|fa*Vr{U&SOzu| zBQX!gU>xSh0$3C)##UgfuxJTZhONOq#r9)|up`(p>?C#$yMWbUSF!K0dh8+g0*CN; zJONL{lkoOTV zv~~=2%y2{;iySK*s~oExdmTp|-#e~5Za8i^?l|r_9ylI3o;sd8esjEXMqhWfb#`zj zJ3Bj5oZX#0oqe4BoCBP1J5!xGPQqz9W6lqpdz|N-x15b+64{5$AhXCR2jG*)`oY)0OW+ zTy|H;^^vPK>bmHOs9l^`eGSW2sDP zA~l)HrlwJLil9i!P0^H>;;A{*DyoW#)>A)I_o-i~C)6|Q1szYfqdU@X&|T?nba%QJ zJ(M0nkD|xW8FVH+ozA6a(0R0rrf8PtX@M4Li!P*R(NVgT{*c~6Z=<)^JOj_7r=DJ;z>PqnFr5 z?`z&3-c)avH{Z*7quvtl25*&jyLX3or}v=uu=l9b*UFNQFKX5;Czi>~u zXIvxqlKX>?<86GCDBp(f!vB-c;dy=`AL9@4XZSk)Dqqhx@HhE?@elY%{8Rop-{?#7 z_4ZBkd3}mc^O?R`zNl}muhRF4Z?Erw?@Qky-x1$2-$`Gc@2aof*WkP9yY0K<``P!a zKhB@*ALqyYqTlk*_b>D>@fZ8w_iyrleQGwBcv4I%@ zXTTkx0&GAJEC?(LEDbCRlm;(jn=TbXmGC-H>iccch2X zW9g|BeJ(Wydjv-Z^Mj6{D@X;IU^qB8I6t^BxFonN_+Bs;EDe4X+!EXt+#cK+{4BUP zcp&&i@MQ2(@KFc~rG(N$Q$l1&2w9=op}C>?p@pF(p=F`>LhC~tLz_aILt8@ILRF#a z(5}$cP-D1DI5W(JmxXtSzYZS{pA4UlhR=sDgzLgr!gs>=!uMrBhUBJlb2&jylsm|s zz)pAs5KHyg*(gFO`?eE9IEHPChArCpXA9<=gUI`LWVX>8lJ- z-d0kTECp5^ic6ssRtYFUC9FggO_`&-s}w1VloDl=^05;AM5$7$l^SJ_vR^r&)GB9{ z^U6i#vT{xNL1|E)MZm~wk)%lbNOGieBqh>4(latFG9of6GCGnT$%te|CPdze1R}+e zU6H!TE47=NrNSz%I#id+s9u#<{i><1P*hD@pt+|$+}u!XZm6Ns2)A0pVUw5XZ6c^z22bT)NkpJ^+x@r{)Yh=&5RaCOQW^X#^_}9Fa{eV zjWi?O7-vj2vW*-g*O+M#M!=Y7tTpx;2aGR`L&g!K-nebtHyX`OW-qgk+20&wrkaz? zDQ1qDYv!2+rqg6h&h(q288l~^bE4+EW|0{)OU*K~!rWqRGpo#M^K0{4^E>mBdD(nq zJ~f}2jppx`&1z<~uv%HItv*(NYmk*{4YkHt8P<4fqUE$)7G<#(Z_T#mTJx=i)?%yJ zDzVmBmDUF918ax1%i3-2vp%=Jv`$%PtaH`{tIoP&-LTrg8R5%l`o!=97;A delta 2758 zcmY*aX?zR^AKuwrbreNYaTF9{^ z%(l&T(00{!*Y?QX%>JgmlfAz^**?V%+c~>#&$BPL7uZ+XSKABiMfT6_YwV@=GW!Pm zCi|C`e_;jwr;S_vAME9oO~9KStc$i5+~YE=4ol?-zI78@Qu5Hs3^~E}uVK~Etz#{~ zR$wQvKR5^+3XTAi!O`Fta2%KpP6ScV3A#ZaNP;vN069J5#6 zG9d^eAV0)FL5PP$$be!{9yA|X2(5&Qp*7GtXalqb`UctxRYE(UgHSbe1FD1WLG>^I z+u^2gix}J%j)U979pTRKyYOH*6;6XEz?twAcp97y=fVW+hgmoT3$O$$unwE>8hAf^ z27cgZ>lom2JH8y#Odwm8Ziha3-)cw_{Ujz9>3 z_z@NfAp#Oc<{`_GmB?x&R)mxwYmsfpe&jH61UZJBM9v`>kQ(GFaviBf9wIN%=4flQ zEgFY*MBhfcq3@u5(UE8hnu?~O6Vb_N7CIeup#fAtB~(F8bT;}SIv34H3(;b94Z059 zfNnx7(e3CCbQgLOtwFD%wP+oB3%!j#L7$^9W9Tc)irKNYSR59Qb;7z}-LQVxKx_y$ z92<#^!ZNT)*i>vfHWSOme3*#In2H(LENl)o7h8a>!d7FSVZ~Spwia85ZNN5RC$Rg@ zx17mN&}lfAIzM%;c7EopavpVFciwQ`bl!H}b>4SAa6WcEbG~r?;{sf<4z5nFF0O8_ z?yf{vFIQjJ0M{Vb5Z7>5k}KQgb);#c8|h2)P4H#3X!TaIK_;@@6 zpM+1vr{gnm7w*LgoWdDAh;#USd^KKy$7=Dv@W1g#_*1+de@V0^Iul)qcZhe1o$A={Ci$?jw#*^BH;_9sV?W6AMk204kG5hHU*kaUnJ$&o5KkIW~R zk;}=IWHGshEG5^I8_7ztiabhIlV{2Eb2bD;@ zNA;#MD27s~d}7wOL)1^y5$YG}ICY9TL!F~8P_au? zgTKAMw?E0B<#+f){(1f)|3-g>ztX?mztexv|C9fy|G58@|Fr)({TkhzZb`pEx1;0e zj&x7DKRt*ZN{^sZ=u~|ORR_IaR5 zpj%)_*8x>pUvm;Fz@6&JkFE6#253Wd^umi@8Eay`}ptqgZyFs6n~k&!QbR>^LP1& z{1g5eAA7+!2)%`|f=eEes)Pf= z55h^|lJHn;E+&d;;xv&EMRATeS6m=25|@Y{iz~!c;s$Y(xLMpHmWx}(3UPLVpdqofomRZ5f6B}AGfEtZx_pGXDLr&6J`UOFlLCe=x|q&w0*>51G^9w-lyhs#NF zmW;|inUrZcAcy6MtjdNQmFLSJ$@%h9xk%nDe=Wzpl`G^O@@{#ryk9;cSIcMR^YTUc zvV2YcU9OYsBTXaiBON1eN4iD2M-n5wB7GyHBBLW?B4Z%J%9Jfig|b80t?X6yDZeNuVoJ4gR=J}* zRqB{`i9z8jZ=H7L)8&#viiQ7sb;IWDy$-^sLoaws*Ba7>L+S}`nkGREmJqB zU#Oea3bji8S-qy-RUfO*)EDYM8lbh%T57GeHd;F^P8*_4)52Q5R;U$gYqWLRdTpcj zo%WMX7c$!}>yfonECM(0|kq>qqoj{f_>(-e4pc{fq&|U}Kn(WK1!p8QDgz z0UL;c8>|sB1Vb_+MxHT0W_)Di8-+%(QDT%D<;GT{!q{Q_Z2W5cW?V8Z8;^}=M!nHs zyfT}at;{y&o90{Q0CTW8%uF(q&2eVBInkVC;wEX*X29gkx#j|Mk-5ZNW-d32%(Z5j zxzYT>+-~kN_n7<4@68|0Q|1}-oO!{lF|U|6&G`G#j?u2siP0HRH5!eUMfXKdMSqQ6 LD%i5D8*ur*N8FX? diff --git a/demos/ios/Blockly WebView/ViewController.swift b/demos/ios/Blockly WebView/ViewController.swift index b84798535..6a8f2418d 100644 --- a/demos/ios/Blockly WebView/ViewController.swift +++ b/demos/ios/Blockly WebView/ViewController.swift @@ -23,9 +23,7 @@ class ViewController: UIViewController { } func loadWebView() { - print("loadWebView: Bundle.main = ", Bundle.main); // This prints if let htmlUrl = Bundle.main.url(forResource: "webview", withExtension: "html", subdirectory: "Blockly") { - print("htmlUrl = ", htmlUrl) // Doesn't print webView.load(URLRequest.init(url: htmlUrl)) } } diff --git a/demos/ios/Resources/Non-Localized/Blockly/blockly_compressed.js b/demos/ios/Resources/Non-Localized/Blockly/blockly_compressed.js new file mode 100644 index 000000000..b9edf8252 --- /dev/null +++ b/demos/ios/Resources/Non-Localized/Blockly/blockly_compressed.js @@ -0,0 +1,1756 @@ +// Do not edit this file; automatically generated by build.py. +'use strict'; + +var $jscomp=$jscomp||{};$jscomp.scope={};var COMPILED=!0,goog=goog||{};goog.global=this;goog.isDef=function(a){return void 0!==a};goog.isString=function(a){return"string"==typeof a};goog.isBoolean=function(a){return"boolean"==typeof a};goog.isNumber=function(a){return"number"==typeof a}; +goog.exportPath_=function(a,b,c){a=a.split(".");c=c||goog.global;a[0]in c||"undefined"==typeof c.execScript||c.execScript("var "+a[0]);for(var d;a.length&&(d=a.shift());)!a.length&&goog.isDef(b)?c[d]=b:c=c[d]&&c[d]!==Object.prototype[d]?c[d]:c[d]={}}; +goog.define=function(a,b){var c=b;if(!COMPILED){var d=goog.global.CLOSURE_UNCOMPILED_DEFINES,e=goog.global.CLOSURE_DEFINES;d&&void 0===d.nodeType&&Object.prototype.hasOwnProperty.call(d,a)?c=d[a]:e&&void 0===e.nodeType&&Object.prototype.hasOwnProperty.call(e,a)&&(c=e[a])}goog.exportPath_(a,c)};goog.DEBUG=!1;goog.LOCALE="en";goog.TRUSTED_SITE=!0;goog.STRICT_MODE_COMPATIBLE=!1;goog.DISALLOW_TEST_ONLY_CODE=COMPILED&&!goog.DEBUG;goog.ENABLE_CHROME_APP_SAFE_SCRIPT_LOADING=!1; +goog.provide=function(a){if(goog.isInModuleLoader_())throw Error("goog.provide cannot be used within a module.");if(!COMPILED&&goog.isProvided_(a))throw Error('Namespace "'+a+'" already declared.');goog.constructNamespace_(a)};goog.constructNamespace_=function(a,b){if(!COMPILED){delete goog.implicitNamespaces_[a];for(var c=a;(c=c.substring(0,c.lastIndexOf(".")))&&!goog.getObjectByName(c);)goog.implicitNamespaces_[c]=!0}goog.exportPath_(a,b)}; +goog.getScriptNonce=function(){null===goog.cspNonce_&&(goog.cspNonce_=goog.getScriptNonce_(goog.global.document)||"");return goog.cspNonce_};goog.NONCE_PATTERN_=/^[\w+/_-]+[=]{0,2}$/;goog.cspNonce_=null;goog.getScriptNonce_=function(a){return(a=a.querySelector("script[nonce]"))&&(a=a.nonce||a.getAttribute("nonce"))&&goog.NONCE_PATTERN_.test(a)?a:null};goog.VALID_MODULE_RE_=/^[a-zA-Z_$][a-zA-Z0-9._$]*$/; +goog.module=function(a){if(!goog.isString(a)||!a||-1==a.search(goog.VALID_MODULE_RE_))throw Error("Invalid module identifier");if(!goog.isInGoogModuleLoader_())throw Error("Module "+a+" has been loaded incorrectly. Note, modules cannot be loaded as normal scripts. They require some kind of pre-processing step. You're likely trying to load a module via a script tag or as a part of a concatenated bundle without rewriting the module. For more info see: https://github.com/google/closure-library/wiki/goog.module:-an-ES6-module-like-alternative-to-goog.provide."); +if(goog.moduleLoaderState_.moduleName)throw Error("goog.module may only be called once per module.");goog.moduleLoaderState_.moduleName=a;if(!COMPILED){if(goog.isProvided_(a))throw Error('Namespace "'+a+'" already declared.');delete goog.implicitNamespaces_[a]}};goog.module.get=function(a){return goog.module.getInternal_(a)}; +goog.module.getInternal_=function(a){if(!COMPILED){if(a in goog.loadedModules_)return goog.loadedModules_[a].exports;if(!goog.implicitNamespaces_[a])return a=goog.getObjectByName(a),null!=a?a:null}return null};goog.ModuleType={ES6:"es6",GOOG:"goog"};goog.moduleLoaderState_=null;goog.isInModuleLoader_=function(){return goog.isInGoogModuleLoader_()||goog.isInEs6ModuleLoader_()};goog.isInGoogModuleLoader_=function(){return!!goog.moduleLoaderState_&&goog.moduleLoaderState_.type==goog.ModuleType.GOOG}; +goog.isInEs6ModuleLoader_=function(){if(goog.moduleLoaderState_&&goog.moduleLoaderState_.type==goog.ModuleType.ES6)return!0;var a=goog.global.$jscomp;return a?"function"!=typeof a.getCurrentModulePath?!1:!!a.getCurrentModulePath():!1}; +goog.module.declareLegacyNamespace=function(){if(!COMPILED&&!goog.isInGoogModuleLoader_())throw Error("goog.module.declareLegacyNamespace must be called from within a goog.module");if(!COMPILED&&!goog.moduleLoaderState_.moduleName)throw Error("goog.module must be called prior to goog.module.declareLegacyNamespace.");goog.moduleLoaderState_.declareLegacyNamespace=!0}; +goog.module.declareNamespace=function(a){if(!COMPILED){if(!goog.isInEs6ModuleLoader_())throw Error("goog.module.declareNamespace may only be called from within an ES6 module");if(goog.moduleLoaderState_&&goog.moduleLoaderState_.moduleName)throw Error("goog.module.declareNamespace may only be called once per module.");if(a in goog.loadedModules_)throw Error('Module with namespace "'+a+'" already exists.');}if(goog.moduleLoaderState_)goog.moduleLoaderState_.moduleName=a;else{var b=goog.global.$jscomp; +if(!b||"function"!=typeof b.getCurrentModulePath)throw Error('Module with namespace "'+a+'" has been loaded incorrectly.');b=b.require(b.getCurrentModulePath());goog.loadedModules_[a]={exports:b,type:goog.ModuleType.ES6,moduleId:a}}};goog.setTestOnly=function(a){if(goog.DISALLOW_TEST_ONLY_CODE)throw a=a||"",Error("Importing test-only code into non-debug environment"+(a?": "+a:"."));};goog.forwardDeclare=function(a){}; +COMPILED||(goog.isProvided_=function(a){return a in goog.loadedModules_||!goog.implicitNamespaces_[a]&&goog.isDefAndNotNull(goog.getObjectByName(a))},goog.implicitNamespaces_={"goog.module":!0});goog.getObjectByName=function(a,b){for(var c=a.split("."),d=b||goog.global,e=0;e>>0);goog.uidCounter_=0;goog.getHashCode=goog.getUid; +goog.removeHashCode=goog.removeUid;goog.cloneObject=function(a){var b=goog.typeOf(a);if("object"==b||"array"==b){if("function"===typeof a.clone)return a.clone();b="array"==b?[]:{};for(var c in a)b[c]=goog.cloneObject(a[c]);return b}return a};goog.bindNative_=function(a,b,c){return a.call.apply(a.bind,arguments)}; +goog.bindJs_=function(a,b,c){if(!a)throw Error();if(2Number(a[1])?!1:b('(()=>{"use strict";class X{constructor(){if(new.target!=String)throw 1;this.x=42}}let q=Reflect.construct(X,[],String);if(q.x!=42||!(q instanceof String))throw 1;for(const a of[2,3]){if(a==2)continue;function f(z={a}){let a=0;return z.a}{function f(){return 0;}}return f()==3}})()')});a("es6-impl",function(){return!0});a("es7",function(){return b("2 ** 2 == 4")}); +a("es8",function(){return b("async () => 1, true")});a("es9",function(){return b("({...rest} = {}), true")});a("es_next",function(){return!1});return c},goog.Transpiler.prototype.needsTranspile=function(a,b){if("always"==goog.TRANSPILE)return!0;if("never"==goog.TRANSPILE)return!1;this.requiresTranspilation_||(this.requiresTranspilation_=this.createRequiresTranspilation_());if(a in this.requiresTranspilation_)return this.requiresTranspilation_[a]?!0:!goog.inHtmlDocument_()||"es6"!=b||"noModule"in goog.global.document.createElement("script")? +!1:!0;throw Error("Unknown language mode: "+a);},goog.Transpiler.prototype.transpile=function(a,b){return goog.transpile_(a,b)},goog.transpiler_=new goog.Transpiler,goog.protectScriptTag_=function(a){return a.replace(/<\/(SCRIPT)/ig,"\\x3c/$1")},goog.DebugLoader_=function(){this.dependencies_={};this.idToPath_={};this.written_={};this.loadingDeps_=[];this.depsToLoad_=[];this.paused_=!1;this.factory_=new goog.DependencyFactory(goog.transpiler_);this.deferredCallbacks_={};this.deferredQueue_=[]},goog.DebugLoader_.prototype.bootstrap= +function(a,b){function c(){d&&(goog.global.setTimeout(d,0),d=null)}var d=b;if(a.length){for(var e=[],f=0;f\x3c/script>")}else{var e=b.createElement("script");e.defer=goog.Dependency.defer_;e.async=!1;e.type="text/javascript";(d=goog.getScriptNonce())&&e.setAttribute("nonce",d);goog.DebugLoader_.IS_OLD_IE_? +(a.pause(),e.onreadystatechange=function(){if("loaded"==e.readyState||"complete"==e.readyState)a.loaded(),a.resume()}):e.onload=function(){e.onload=null;a.loaded()};e.src=this.path;b.head.appendChild(e)}}else goog.logToConsole_("Cannot use default debug loader outside of HTML documents."),"deps.js"==this.relativePath?(goog.logToConsole_("Consider setting CLOSURE_IMPORT_SCRIPT before loading base.js, or seting CLOSURE_NO_DEPS to true."),a.loaded()):a.pause()},goog.Es6ModuleDependency=function(a,b, +c,d,e){goog.Dependency.call(this,a,b,c,d,e)},goog.inherits(goog.Es6ModuleDependency,goog.Dependency),goog.Es6ModuleDependency.prototype.load=function(a){function b(a,b){b?d.write(' + + + + + -

Blockly/webview.html

+
+ \ No newline at end of file From 59c22169d6ef3006b98dd1b619f994aa8ae227e8 Mon Sep 17 00:00:00 2001 From: Andrew n marshall Date: Tue, 14 Aug 2018 12:56:32 -0700 Subject: [PATCH 6/9] Adding demo/ios/.gitignore --- demos/ios/.gitignore | 21 ++++++++++++++++++ .../Blockly WebView.xcodeproj/project.pbxproj | 2 ++ .../UserInterfaceState.xcuserstate | Bin 36555 -> 0 bytes 3 files changed, 23 insertions(+) create mode 100644 demos/ios/.gitignore delete mode 100644 demos/ios/Blockly WebView.xcodeproj/project.xcworkspace/xcuserdata/marshalla.xcuserdatad/UserInterfaceState.xcuserstate diff --git a/demos/ios/.gitignore b/demos/ios/.gitignore new file mode 100644 index 000000000..baf18b425 --- /dev/null +++ b/demos/ios/.gitignore @@ -0,0 +1,21 @@ +# Xcode.gitignore + +## User settings +xcuserdata/ + +## compatibility with Xcode 8 and earlier (ignoring not required starting Xcode 9) +*.xcscmblueprint +*.xccheckout + +## compatibility with Xcode 3 and earlier (ignoring not required starting Xcode 4) +build/ +DerivedData/ +*.moved-aside +*.pbxuser +!default.pbxuser +*.mode1v3 +!default.mode1v3 +*.mode2v3 +!default.mode2v3 +*.perspectivev3 +!default.perspectivev3 diff --git a/demos/ios/Blockly WebView.xcodeproj/project.pbxproj b/demos/ios/Blockly WebView.xcodeproj/project.pbxproj index eeea4d2eb..4b0aaac57 100644 --- a/demos/ios/Blockly WebView.xcodeproj/project.pbxproj +++ b/demos/ios/Blockly WebView.xcodeproj/project.pbxproj @@ -315,6 +315,7 @@ CODE_SIGN_STYLE = Automatic; DEVELOPMENT_TEAM = 3KZF7Q7Q49; INFOPLIST_FILE = "Blockly WebView/Info.plist"; + IPHONEOS_DEPLOYMENT_TARGET = 11.0; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", @@ -333,6 +334,7 @@ CODE_SIGN_STYLE = Automatic; DEVELOPMENT_TEAM = 3KZF7Q7Q49; INFOPLIST_FILE = "Blockly WebView/Info.plist"; + IPHONEOS_DEPLOYMENT_TARGET = 11.0; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", diff --git a/demos/ios/Blockly WebView.xcodeproj/project.xcworkspace/xcuserdata/marshalla.xcuserdatad/UserInterfaceState.xcuserstate b/demos/ios/Blockly WebView.xcodeproj/project.xcworkspace/xcuserdata/marshalla.xcuserdatad/UserInterfaceState.xcuserstate deleted file mode 100644 index 0e3c5338dffdd5a5de0d7e306db2c0e5b3300122..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 36555 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 GwEhpzuZfrd From 3ea0d08c1f9beb3d0723df619e91183f213ac538 Mon Sep 17 00:00:00 2001 From: Andrew n marshall Date: Tue, 14 Aug 2018 14:34:31 -0700 Subject: [PATCH 7/9] Replacing repo copies with copy script. Xcode project runs script during build. --- demos/ios/.gitignore | 7 + .../Blockly WebView.xcodeproj/project.pbxproj | 17 + .../Blockly/blockly_compressed.js | 1756 ----------------- .../Blockly/blocks_compressed.js | 163 -- .../Non-Localized/Blockly/media/1x1.gif | Bin 43 -> 0 bytes .../Non-Localized/Blockly/media/click.mp3 | Bin 2304 -> 0 bytes .../Non-Localized/Blockly/media/click.ogg | Bin 4865 -> 0 bytes .../Non-Localized/Blockly/media/click.wav | Bin 3782 -> 0 bytes .../Non-Localized/Blockly/media/delete.mp3 | Bin 3123 -> 0 bytes .../Non-Localized/Blockly/media/delete.ogg | Bin 5731 -> 0 bytes .../Non-Localized/Blockly/media/delete.wav | Bin 9164 -> 0 bytes .../Blockly/media/disconnect.mp3 | Bin 1586 -> 0 bytes .../Blockly/media/disconnect.ogg | Bin 4404 -> 0 bytes .../Blockly/media/disconnect.wav | Bin 1492 -> 0 bytes .../Blockly/media/handclosed.cur | Bin 326 -> 0 bytes .../Blockly/media/handdelete.cur | Bin 766 -> 0 bytes .../Non-Localized/Blockly/media/handopen.cur | Bin 198 -> 0 bytes .../Non-Localized/Blockly/media/quote0.png | Bin 796 -> 0 bytes .../Non-Localized/Blockly/media/quote1.png | Bin 738 -> 0 bytes .../Non-Localized/Blockly/media/sprites.png | Bin 4146 -> 0 bytes .../Non-Localized/Blockly/media/sprites.svg | 74 - .../Non-Localized/Blockly/msg/js/ab.js | 432 ---- .../Non-Localized/Blockly/msg/js/ar.js | 432 ---- .../Non-Localized/Blockly/msg/js/az.js | 432 ---- .../Non-Localized/Blockly/msg/js/ba.js | 432 ---- .../Non-Localized/Blockly/msg/js/bcc.js | 432 ---- .../Non-Localized/Blockly/msg/js/be-tarask.js | 432 ---- .../Non-Localized/Blockly/msg/js/be.js | 432 ---- .../Non-Localized/Blockly/msg/js/bg.js | 432 ---- .../Non-Localized/Blockly/msg/js/bn.js | 432 ---- .../Non-Localized/Blockly/msg/js/br.js | 432 ---- .../Non-Localized/Blockly/msg/js/ca.js | 432 ---- .../Non-Localized/Blockly/msg/js/cs.js | 432 ---- .../Non-Localized/Blockly/msg/js/da.js | 432 ---- .../Non-Localized/Blockly/msg/js/de.js | 432 ---- .../Non-Localized/Blockly/msg/js/diq.js | 432 ---- .../Non-Localized/Blockly/msg/js/dty.js | 432 ---- .../Non-Localized/Blockly/msg/js/el.js | 432 ---- .../Non-Localized/Blockly/msg/js/en-gb.js | 432 ---- .../Non-Localized/Blockly/msg/js/en.js | 432 ---- .../Non-Localized/Blockly/msg/js/eo.js | 432 ---- .../Non-Localized/Blockly/msg/js/es.js | 432 ---- .../Non-Localized/Blockly/msg/js/et.js | 432 ---- .../Non-Localized/Blockly/msg/js/eu.js | 432 ---- .../Non-Localized/Blockly/msg/js/fa.js | 432 ---- .../Non-Localized/Blockly/msg/js/fi.js | 432 ---- .../Non-Localized/Blockly/msg/js/fr.js | 432 ---- .../Non-Localized/Blockly/msg/js/gl.js | 432 ---- .../Non-Localized/Blockly/msg/js/gor.js | 432 ---- .../Non-Localized/Blockly/msg/js/he.js | 432 ---- .../Non-Localized/Blockly/msg/js/hi.js | 432 ---- .../Non-Localized/Blockly/msg/js/hrx.js | 432 ---- .../Non-Localized/Blockly/msg/js/hu.js | 432 ---- .../Non-Localized/Blockly/msg/js/ia.js | 432 ---- .../Non-Localized/Blockly/msg/js/id.js | 432 ---- .../Non-Localized/Blockly/msg/js/is.js | 432 ---- .../Non-Localized/Blockly/msg/js/it.js | 432 ---- .../Non-Localized/Blockly/msg/js/ja.js | 432 ---- .../Non-Localized/Blockly/msg/js/kab.js | 432 ---- .../Non-Localized/Blockly/msg/js/ko.js | 432 ---- .../Non-Localized/Blockly/msg/js/lb.js | 432 ---- .../Non-Localized/Blockly/msg/js/lki.js | 432 ---- .../Non-Localized/Blockly/msg/js/lo.js | 432 ---- .../Non-Localized/Blockly/msg/js/lrc.js | 432 ---- .../Non-Localized/Blockly/msg/js/lt.js | 432 ---- .../Non-Localized/Blockly/msg/js/lv.js | 432 ---- .../Non-Localized/Blockly/msg/js/mk.js | 432 ---- .../Non-Localized/Blockly/msg/js/ms.js | 432 ---- .../Non-Localized/Blockly/msg/js/nb.js | 432 ---- .../Non-Localized/Blockly/msg/js/nl.js | 432 ---- .../Non-Localized/Blockly/msg/js/oc.js | 432 ---- .../Non-Localized/Blockly/msg/js/pl.js | 432 ---- .../Non-Localized/Blockly/msg/js/pms.js | 432 ---- .../Non-Localized/Blockly/msg/js/pt-br.js | 432 ---- .../Non-Localized/Blockly/msg/js/pt.js | 432 ---- .../Non-Localized/Blockly/msg/js/ro.js | 432 ---- .../Non-Localized/Blockly/msg/js/ru.js | 432 ---- .../Non-Localized/Blockly/msg/js/sc.js | 432 ---- .../Non-Localized/Blockly/msg/js/sd.js | 432 ---- .../Non-Localized/Blockly/msg/js/shn.js | 432 ---- .../Non-Localized/Blockly/msg/js/sk.js | 432 ---- .../Non-Localized/Blockly/msg/js/skr-arab.js | 432 ---- .../Non-Localized/Blockly/msg/js/sl.js | 432 ---- .../Non-Localized/Blockly/msg/js/sq.js | 432 ---- .../Non-Localized/Blockly/msg/js/sr-latn.js | 432 ---- .../Non-Localized/Blockly/msg/js/sr.js | 432 ---- .../Non-Localized/Blockly/msg/js/sv.js | 432 ---- .../Non-Localized/Blockly/msg/js/ta.js | 432 ---- .../Non-Localized/Blockly/msg/js/tcy.js | 432 ---- .../Non-Localized/Blockly/msg/js/te.js | 432 ---- .../Non-Localized/Blockly/msg/js/th.js | 432 ---- .../Non-Localized/Blockly/msg/js/tl.js | 432 ---- .../Non-Localized/Blockly/msg/js/tlh.js | 432 ---- .../Non-Localized/Blockly/msg/js/tr.js | 432 ---- .../Non-Localized/Blockly/msg/js/ug-arab.js | 432 ---- .../Non-Localized/Blockly/msg/js/uk.js | 432 ---- .../Non-Localized/Blockly/msg/js/ur.js | 432 ---- .../Non-Localized/Blockly/msg/js/vi.js | 432 ---- .../Non-Localized/Blockly/msg/js/xmf.js | 432 ---- .../Non-Localized/Blockly/msg/js/zh-hans.js | 432 ---- .../Non-Localized/Blockly/msg/js/zh-hant.js | 432 ---- demos/ios/cp_resources.sh | 19 + 102 files changed, 43 insertions(+), 36553 deletions(-) delete mode 100644 demos/ios/Resources/Non-Localized/Blockly/blockly_compressed.js delete mode 100644 demos/ios/Resources/Non-Localized/Blockly/blocks_compressed.js delete mode 100644 demos/ios/Resources/Non-Localized/Blockly/media/1x1.gif delete mode 100644 demos/ios/Resources/Non-Localized/Blockly/media/click.mp3 delete mode 100644 demos/ios/Resources/Non-Localized/Blockly/media/click.ogg delete mode 100644 demos/ios/Resources/Non-Localized/Blockly/media/click.wav delete mode 100644 demos/ios/Resources/Non-Localized/Blockly/media/delete.mp3 delete mode 100644 demos/ios/Resources/Non-Localized/Blockly/media/delete.ogg delete mode 100644 demos/ios/Resources/Non-Localized/Blockly/media/delete.wav delete mode 100644 demos/ios/Resources/Non-Localized/Blockly/media/disconnect.mp3 delete mode 100644 demos/ios/Resources/Non-Localized/Blockly/media/disconnect.ogg delete mode 100644 demos/ios/Resources/Non-Localized/Blockly/media/disconnect.wav delete mode 100644 demos/ios/Resources/Non-Localized/Blockly/media/handclosed.cur delete mode 100644 demos/ios/Resources/Non-Localized/Blockly/media/handdelete.cur delete mode 100644 demos/ios/Resources/Non-Localized/Blockly/media/handopen.cur delete mode 100644 demos/ios/Resources/Non-Localized/Blockly/media/quote0.png delete mode 100644 demos/ios/Resources/Non-Localized/Blockly/media/quote1.png delete mode 100644 demos/ios/Resources/Non-Localized/Blockly/media/sprites.png delete mode 100644 demos/ios/Resources/Non-Localized/Blockly/media/sprites.svg delete mode 100644 demos/ios/Resources/Non-Localized/Blockly/msg/js/ab.js delete mode 100644 demos/ios/Resources/Non-Localized/Blockly/msg/js/ar.js delete mode 100644 demos/ios/Resources/Non-Localized/Blockly/msg/js/az.js delete mode 100644 demos/ios/Resources/Non-Localized/Blockly/msg/js/ba.js delete mode 100644 demos/ios/Resources/Non-Localized/Blockly/msg/js/bcc.js delete mode 100644 demos/ios/Resources/Non-Localized/Blockly/msg/js/be-tarask.js delete mode 100644 demos/ios/Resources/Non-Localized/Blockly/msg/js/be.js delete mode 100644 demos/ios/Resources/Non-Localized/Blockly/msg/js/bg.js delete mode 100644 demos/ios/Resources/Non-Localized/Blockly/msg/js/bn.js delete mode 100644 demos/ios/Resources/Non-Localized/Blockly/msg/js/br.js delete mode 100644 demos/ios/Resources/Non-Localized/Blockly/msg/js/ca.js delete mode 100644 demos/ios/Resources/Non-Localized/Blockly/msg/js/cs.js delete mode 100644 demos/ios/Resources/Non-Localized/Blockly/msg/js/da.js delete mode 100644 demos/ios/Resources/Non-Localized/Blockly/msg/js/de.js delete mode 100644 demos/ios/Resources/Non-Localized/Blockly/msg/js/diq.js delete mode 100644 demos/ios/Resources/Non-Localized/Blockly/msg/js/dty.js delete mode 100644 demos/ios/Resources/Non-Localized/Blockly/msg/js/el.js delete mode 100644 demos/ios/Resources/Non-Localized/Blockly/msg/js/en-gb.js delete mode 100644 demos/ios/Resources/Non-Localized/Blockly/msg/js/en.js delete mode 100644 demos/ios/Resources/Non-Localized/Blockly/msg/js/eo.js delete mode 100644 demos/ios/Resources/Non-Localized/Blockly/msg/js/es.js delete mode 100644 demos/ios/Resources/Non-Localized/Blockly/msg/js/et.js delete mode 100644 demos/ios/Resources/Non-Localized/Blockly/msg/js/eu.js delete mode 100644 demos/ios/Resources/Non-Localized/Blockly/msg/js/fa.js delete mode 100644 demos/ios/Resources/Non-Localized/Blockly/msg/js/fi.js delete mode 100644 demos/ios/Resources/Non-Localized/Blockly/msg/js/fr.js delete mode 100644 demos/ios/Resources/Non-Localized/Blockly/msg/js/gl.js delete mode 100644 demos/ios/Resources/Non-Localized/Blockly/msg/js/gor.js delete mode 100644 demos/ios/Resources/Non-Localized/Blockly/msg/js/he.js delete mode 100644 demos/ios/Resources/Non-Localized/Blockly/msg/js/hi.js delete mode 100644 demos/ios/Resources/Non-Localized/Blockly/msg/js/hrx.js delete mode 100644 demos/ios/Resources/Non-Localized/Blockly/msg/js/hu.js delete mode 100644 demos/ios/Resources/Non-Localized/Blockly/msg/js/ia.js delete mode 100644 demos/ios/Resources/Non-Localized/Blockly/msg/js/id.js delete mode 100644 demos/ios/Resources/Non-Localized/Blockly/msg/js/is.js delete mode 100644 demos/ios/Resources/Non-Localized/Blockly/msg/js/it.js delete mode 100644 demos/ios/Resources/Non-Localized/Blockly/msg/js/ja.js delete mode 100644 demos/ios/Resources/Non-Localized/Blockly/msg/js/kab.js delete mode 100644 demos/ios/Resources/Non-Localized/Blockly/msg/js/ko.js delete mode 100644 demos/ios/Resources/Non-Localized/Blockly/msg/js/lb.js delete mode 100644 demos/ios/Resources/Non-Localized/Blockly/msg/js/lki.js delete mode 100644 demos/ios/Resources/Non-Localized/Blockly/msg/js/lo.js delete mode 100644 demos/ios/Resources/Non-Localized/Blockly/msg/js/lrc.js delete mode 100644 demos/ios/Resources/Non-Localized/Blockly/msg/js/lt.js delete mode 100644 demos/ios/Resources/Non-Localized/Blockly/msg/js/lv.js delete mode 100644 demos/ios/Resources/Non-Localized/Blockly/msg/js/mk.js delete mode 100644 demos/ios/Resources/Non-Localized/Blockly/msg/js/ms.js delete mode 100644 demos/ios/Resources/Non-Localized/Blockly/msg/js/nb.js delete mode 100644 demos/ios/Resources/Non-Localized/Blockly/msg/js/nl.js delete mode 100644 demos/ios/Resources/Non-Localized/Blockly/msg/js/oc.js delete mode 100644 demos/ios/Resources/Non-Localized/Blockly/msg/js/pl.js delete mode 100644 demos/ios/Resources/Non-Localized/Blockly/msg/js/pms.js delete mode 100644 demos/ios/Resources/Non-Localized/Blockly/msg/js/pt-br.js delete mode 100644 demos/ios/Resources/Non-Localized/Blockly/msg/js/pt.js delete mode 100644 demos/ios/Resources/Non-Localized/Blockly/msg/js/ro.js delete mode 100644 demos/ios/Resources/Non-Localized/Blockly/msg/js/ru.js delete mode 100644 demos/ios/Resources/Non-Localized/Blockly/msg/js/sc.js delete mode 100644 demos/ios/Resources/Non-Localized/Blockly/msg/js/sd.js delete mode 100644 demos/ios/Resources/Non-Localized/Blockly/msg/js/shn.js delete mode 100644 demos/ios/Resources/Non-Localized/Blockly/msg/js/sk.js delete mode 100644 demos/ios/Resources/Non-Localized/Blockly/msg/js/skr-arab.js delete mode 100644 demos/ios/Resources/Non-Localized/Blockly/msg/js/sl.js delete mode 100644 demos/ios/Resources/Non-Localized/Blockly/msg/js/sq.js delete mode 100644 demos/ios/Resources/Non-Localized/Blockly/msg/js/sr-latn.js delete mode 100644 demos/ios/Resources/Non-Localized/Blockly/msg/js/sr.js delete mode 100644 demos/ios/Resources/Non-Localized/Blockly/msg/js/sv.js delete mode 100644 demos/ios/Resources/Non-Localized/Blockly/msg/js/ta.js delete mode 100644 demos/ios/Resources/Non-Localized/Blockly/msg/js/tcy.js delete mode 100644 demos/ios/Resources/Non-Localized/Blockly/msg/js/te.js delete mode 100644 demos/ios/Resources/Non-Localized/Blockly/msg/js/th.js delete mode 100644 demos/ios/Resources/Non-Localized/Blockly/msg/js/tl.js delete mode 100644 demos/ios/Resources/Non-Localized/Blockly/msg/js/tlh.js delete mode 100644 demos/ios/Resources/Non-Localized/Blockly/msg/js/tr.js delete mode 100644 demos/ios/Resources/Non-Localized/Blockly/msg/js/ug-arab.js delete mode 100644 demos/ios/Resources/Non-Localized/Blockly/msg/js/uk.js delete mode 100644 demos/ios/Resources/Non-Localized/Blockly/msg/js/ur.js delete mode 100644 demos/ios/Resources/Non-Localized/Blockly/msg/js/vi.js delete mode 100644 demos/ios/Resources/Non-Localized/Blockly/msg/js/xmf.js delete mode 100644 demos/ios/Resources/Non-Localized/Blockly/msg/js/zh-hans.js delete mode 100644 demos/ios/Resources/Non-Localized/Blockly/msg/js/zh-hant.js create mode 100755 demos/ios/cp_resources.sh diff --git a/demos/ios/.gitignore b/demos/ios/.gitignore index baf18b425..c3b00e539 100644 --- a/demos/ios/.gitignore +++ b/demos/ios/.gitignore @@ -1,3 +1,10 @@ +# Files copied by cp_resources.sh +/Resources/Non-Localized/Blockly/blockly_compressed.js +/Resources/Non-Localized/Blockly/blocks_compressed.js +/Resources/Non-Localized/Blockly/media +/Resources/Non-Localized/Blockly/msg + + # Xcode.gitignore ## User settings diff --git a/demos/ios/Blockly WebView.xcodeproj/project.pbxproj b/demos/ios/Blockly WebView.xcodeproj/project.pbxproj index 4b0aaac57..a3f72fcd4 100644 --- a/demos/ios/Blockly WebView.xcodeproj/project.pbxproj +++ b/demos/ios/Blockly WebView.xcodeproj/project.pbxproj @@ -104,6 +104,7 @@ buildPhases = ( AB980109211A37B50025AFF2 /* Sources */, AB98010A211A37B50025AFF2 /* Frameworks */, + ABEDABD1212372E700A66667 /* ShellScript */, AB98010B211A37B50025AFF2 /* Resources */, ); buildRules = ( @@ -162,6 +163,22 @@ }; /* End PBXResourcesBuildPhase section */ +/* Begin PBXShellScriptBuildPhase section */ + ABEDABD1212372E700A66667 /* ShellScript */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + ); + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = ./cp_resources.sh; + }; +/* End PBXShellScriptBuildPhase section */ + /* Begin PBXSourcesBuildPhase section */ AB980109211A37B50025AFF2 /* Sources */ = { isa = PBXSourcesBuildPhase; diff --git a/demos/ios/Resources/Non-Localized/Blockly/blockly_compressed.js b/demos/ios/Resources/Non-Localized/Blockly/blockly_compressed.js deleted file mode 100644 index b9edf8252..000000000 --- a/demos/ios/Resources/Non-Localized/Blockly/blockly_compressed.js +++ /dev/null @@ -1,1756 +0,0 @@ -// Do not edit this file; automatically generated by build.py. -'use strict'; - -var $jscomp=$jscomp||{};$jscomp.scope={};var COMPILED=!0,goog=goog||{};goog.global=this;goog.isDef=function(a){return void 0!==a};goog.isString=function(a){return"string"==typeof a};goog.isBoolean=function(a){return"boolean"==typeof a};goog.isNumber=function(a){return"number"==typeof a}; -goog.exportPath_=function(a,b,c){a=a.split(".");c=c||goog.global;a[0]in c||"undefined"==typeof c.execScript||c.execScript("var "+a[0]);for(var d;a.length&&(d=a.shift());)!a.length&&goog.isDef(b)?c[d]=b:c=c[d]&&c[d]!==Object.prototype[d]?c[d]:c[d]={}}; -goog.define=function(a,b){var c=b;if(!COMPILED){var d=goog.global.CLOSURE_UNCOMPILED_DEFINES,e=goog.global.CLOSURE_DEFINES;d&&void 0===d.nodeType&&Object.prototype.hasOwnProperty.call(d,a)?c=d[a]:e&&void 0===e.nodeType&&Object.prototype.hasOwnProperty.call(e,a)&&(c=e[a])}goog.exportPath_(a,c)};goog.DEBUG=!1;goog.LOCALE="en";goog.TRUSTED_SITE=!0;goog.STRICT_MODE_COMPATIBLE=!1;goog.DISALLOW_TEST_ONLY_CODE=COMPILED&&!goog.DEBUG;goog.ENABLE_CHROME_APP_SAFE_SCRIPT_LOADING=!1; -goog.provide=function(a){if(goog.isInModuleLoader_())throw Error("goog.provide cannot be used within a module.");if(!COMPILED&&goog.isProvided_(a))throw Error('Namespace "'+a+'" already declared.');goog.constructNamespace_(a)};goog.constructNamespace_=function(a,b){if(!COMPILED){delete goog.implicitNamespaces_[a];for(var c=a;(c=c.substring(0,c.lastIndexOf(".")))&&!goog.getObjectByName(c);)goog.implicitNamespaces_[c]=!0}goog.exportPath_(a,b)}; -goog.getScriptNonce=function(){null===goog.cspNonce_&&(goog.cspNonce_=goog.getScriptNonce_(goog.global.document)||"");return goog.cspNonce_};goog.NONCE_PATTERN_=/^[\w+/_-]+[=]{0,2}$/;goog.cspNonce_=null;goog.getScriptNonce_=function(a){return(a=a.querySelector("script[nonce]"))&&(a=a.nonce||a.getAttribute("nonce"))&&goog.NONCE_PATTERN_.test(a)?a:null};goog.VALID_MODULE_RE_=/^[a-zA-Z_$][a-zA-Z0-9._$]*$/; -goog.module=function(a){if(!goog.isString(a)||!a||-1==a.search(goog.VALID_MODULE_RE_))throw Error("Invalid module identifier");if(!goog.isInGoogModuleLoader_())throw Error("Module "+a+" has been loaded incorrectly. Note, modules cannot be loaded as normal scripts. They require some kind of pre-processing step. You're likely trying to load a module via a script tag or as a part of a concatenated bundle without rewriting the module. For more info see: https://github.com/google/closure-library/wiki/goog.module:-an-ES6-module-like-alternative-to-goog.provide."); -if(goog.moduleLoaderState_.moduleName)throw Error("goog.module may only be called once per module.");goog.moduleLoaderState_.moduleName=a;if(!COMPILED){if(goog.isProvided_(a))throw Error('Namespace "'+a+'" already declared.');delete goog.implicitNamespaces_[a]}};goog.module.get=function(a){return goog.module.getInternal_(a)}; -goog.module.getInternal_=function(a){if(!COMPILED){if(a in goog.loadedModules_)return goog.loadedModules_[a].exports;if(!goog.implicitNamespaces_[a])return a=goog.getObjectByName(a),null!=a?a:null}return null};goog.ModuleType={ES6:"es6",GOOG:"goog"};goog.moduleLoaderState_=null;goog.isInModuleLoader_=function(){return goog.isInGoogModuleLoader_()||goog.isInEs6ModuleLoader_()};goog.isInGoogModuleLoader_=function(){return!!goog.moduleLoaderState_&&goog.moduleLoaderState_.type==goog.ModuleType.GOOG}; -goog.isInEs6ModuleLoader_=function(){if(goog.moduleLoaderState_&&goog.moduleLoaderState_.type==goog.ModuleType.ES6)return!0;var a=goog.global.$jscomp;return a?"function"!=typeof a.getCurrentModulePath?!1:!!a.getCurrentModulePath():!1}; -goog.module.declareLegacyNamespace=function(){if(!COMPILED&&!goog.isInGoogModuleLoader_())throw Error("goog.module.declareLegacyNamespace must be called from within a goog.module");if(!COMPILED&&!goog.moduleLoaderState_.moduleName)throw Error("goog.module must be called prior to goog.module.declareLegacyNamespace.");goog.moduleLoaderState_.declareLegacyNamespace=!0}; -goog.module.declareNamespace=function(a){if(!COMPILED){if(!goog.isInEs6ModuleLoader_())throw Error("goog.module.declareNamespace may only be called from within an ES6 module");if(goog.moduleLoaderState_&&goog.moduleLoaderState_.moduleName)throw Error("goog.module.declareNamespace may only be called once per module.");if(a in goog.loadedModules_)throw Error('Module with namespace "'+a+'" already exists.');}if(goog.moduleLoaderState_)goog.moduleLoaderState_.moduleName=a;else{var b=goog.global.$jscomp; -if(!b||"function"!=typeof b.getCurrentModulePath)throw Error('Module with namespace "'+a+'" has been loaded incorrectly.');b=b.require(b.getCurrentModulePath());goog.loadedModules_[a]={exports:b,type:goog.ModuleType.ES6,moduleId:a}}};goog.setTestOnly=function(a){if(goog.DISALLOW_TEST_ONLY_CODE)throw a=a||"",Error("Importing test-only code into non-debug environment"+(a?": "+a:"."));};goog.forwardDeclare=function(a){}; -COMPILED||(goog.isProvided_=function(a){return a in goog.loadedModules_||!goog.implicitNamespaces_[a]&&goog.isDefAndNotNull(goog.getObjectByName(a))},goog.implicitNamespaces_={"goog.module":!0});goog.getObjectByName=function(a,b){for(var c=a.split("."),d=b||goog.global,e=0;e>>0);goog.uidCounter_=0;goog.getHashCode=goog.getUid; -goog.removeHashCode=goog.removeUid;goog.cloneObject=function(a){var b=goog.typeOf(a);if("object"==b||"array"==b){if("function"===typeof a.clone)return a.clone();b="array"==b?[]:{};for(var c in a)b[c]=goog.cloneObject(a[c]);return b}return a};goog.bindNative_=function(a,b,c){return a.call.apply(a.bind,arguments)}; -goog.bindJs_=function(a,b,c){if(!a)throw Error();if(2Number(a[1])?!1:b('(()=>{"use strict";class X{constructor(){if(new.target!=String)throw 1;this.x=42}}let q=Reflect.construct(X,[],String);if(q.x!=42||!(q instanceof String))throw 1;for(const a of[2,3]){if(a==2)continue;function f(z={a}){let a=0;return z.a}{function f(){return 0;}}return f()==3}})()')});a("es6-impl",function(){return!0});a("es7",function(){return b("2 ** 2 == 4")}); -a("es8",function(){return b("async () => 1, true")});a("es9",function(){return b("({...rest} = {}), true")});a("es_next",function(){return!1});return c},goog.Transpiler.prototype.needsTranspile=function(a,b){if("always"==goog.TRANSPILE)return!0;if("never"==goog.TRANSPILE)return!1;this.requiresTranspilation_||(this.requiresTranspilation_=this.createRequiresTranspilation_());if(a in this.requiresTranspilation_)return this.requiresTranspilation_[a]?!0:!goog.inHtmlDocument_()||"es6"!=b||"noModule"in goog.global.document.createElement("script")? -!1:!0;throw Error("Unknown language mode: "+a);},goog.Transpiler.prototype.transpile=function(a,b){return goog.transpile_(a,b)},goog.transpiler_=new goog.Transpiler,goog.protectScriptTag_=function(a){return a.replace(/<\/(SCRIPT)/ig,"\\x3c/$1")},goog.DebugLoader_=function(){this.dependencies_={};this.idToPath_={};this.written_={};this.loadingDeps_=[];this.depsToLoad_=[];this.paused_=!1;this.factory_=new goog.DependencyFactory(goog.transpiler_);this.deferredCallbacks_={};this.deferredQueue_=[]},goog.DebugLoader_.prototype.bootstrap= -function(a,b){function c(){d&&(goog.global.setTimeout(d,0),d=null)}var d=b;if(a.length){for(var e=[],f=0;f\x3c/script>")}else{var e=b.createElement("script");e.defer=goog.Dependency.defer_;e.async=!1;e.type="text/javascript";(d=goog.getScriptNonce())&&e.setAttribute("nonce",d);goog.DebugLoader_.IS_OLD_IE_? -(a.pause(),e.onreadystatechange=function(){if("loaded"==e.readyState||"complete"==e.readyState)a.loaded(),a.resume()}):e.onload=function(){e.onload=null;a.loaded()};e.src=this.path;b.head.appendChild(e)}}else goog.logToConsole_("Cannot use default debug loader outside of HTML documents."),"deps.js"==this.relativePath?(goog.logToConsole_("Consider setting CLOSURE_IMPORT_SCRIPT before loading base.js, or seting CLOSURE_NO_DEPS to true."),a.loaded()):a.pause()},goog.Es6ModuleDependency=function(a,b, -c,d,e){goog.Dependency.call(this,a,b,c,d,e)},goog.inherits(goog.Es6ModuleDependency,goog.Dependency),goog.Es6ModuleDependency.prototype.load=function(a){function b(a,b){b?d.write(' - - - - - - -
- - - \ No newline at end of file diff --git a/demos/android/.gitignore b/demos/mobile/android/.gitignore similarity index 100% rename from demos/android/.gitignore rename to demos/mobile/android/.gitignore diff --git a/demos/android/README.md b/demos/mobile/android/README.md similarity index 100% rename from demos/android/README.md rename to demos/mobile/android/README.md diff --git a/demos/android/app/.gitignore b/demos/mobile/android/app/.gitignore similarity index 81% rename from demos/android/app/.gitignore rename to demos/mobile/android/app/.gitignore index d67f7b424..8a24dfadb 100644 --- a/demos/android/app/.gitignore +++ b/demos/mobile/android/app/.gitignore @@ -4,3 +4,4 @@ src/main/assets/blockly/blockly_compressed.js src/main/assets/blockly/blocks_compressed.js src/main/assets/blockly/media +src/main/assets/blockly/webview.html diff --git a/demos/android/app/build.gradle b/demos/mobile/android/app/build.gradle similarity index 78% rename from demos/android/app/build.gradle rename to demos/mobile/android/app/build.gradle index 661a3db87..5a843e070 100644 --- a/demos/android/app/build.gradle +++ b/demos/mobile/android/app/build.gradle @@ -20,8 +20,16 @@ android { } } -task copyBlocklyWebFiles(type: Copy) { - from('../../..') { +task copyBlocklyHtmlFile(type: Copy) { + from('../../html') { + include 'index.html' + } + into project(':app').file('./src/main/assets/blockly') + rename('index.html', 'webview.html') +} + +task copyBlocklyMoreFiles(type: Copy) { + from('../../../..') { include 'blockly_compressed.js', 'blocks_compressed.js', 'msg/js/**', 'media/**' exclude 'media/test_*' } @@ -29,7 +37,7 @@ task copyBlocklyWebFiles(type: Copy) { } project.afterEvaluate { - preBuild.dependsOn copyBlocklyWebFiles + preBuild.dependsOn(copyBlocklyHtmlFile, copyBlocklyMoreFiles) } dependencies { diff --git a/demos/android/app/proguard-rules.pro b/demos/mobile/android/app/proguard-rules.pro similarity index 100% rename from demos/android/app/proguard-rules.pro rename to demos/mobile/android/app/proguard-rules.pro diff --git a/demos/android/app/src/androidTest/java/com/example/blocklywebview/ExampleInstrumentedTest.java b/demos/mobile/android/app/src/androidTest/java/com/example/blocklywebview/ExampleInstrumentedTest.java similarity index 100% rename from demos/android/app/src/androidTest/java/com/example/blocklywebview/ExampleInstrumentedTest.java rename to demos/mobile/android/app/src/androidTest/java/com/example/blocklywebview/ExampleInstrumentedTest.java diff --git a/demos/android/app/src/main/AndroidManifest.xml b/demos/mobile/android/app/src/main/AndroidManifest.xml similarity index 100% rename from demos/android/app/src/main/AndroidManifest.xml rename to demos/mobile/android/app/src/main/AndroidManifest.xml diff --git a/demos/android/app/src/main/assets/blockly/toolbox_standard.js b/demos/mobile/android/app/src/main/assets/blockly/toolbox_standard.js similarity index 100% rename from demos/android/app/src/main/assets/blockly/toolbox_standard.js rename to demos/mobile/android/app/src/main/assets/blockly/toolbox_standard.js diff --git a/demos/android/app/src/main/java/com/google/blockly/android/webview/BlocklyWebViewFragment.java b/demos/mobile/android/app/src/main/java/com/google/blockly/android/webview/BlocklyWebViewFragment.java similarity index 100% rename from demos/android/app/src/main/java/com/google/blockly/android/webview/BlocklyWebViewFragment.java rename to demos/mobile/android/app/src/main/java/com/google/blockly/android/webview/BlocklyWebViewFragment.java diff --git a/demos/android/app/src/main/java/com/google/blockly/android/webview/demo/MainActivity.java b/demos/mobile/android/app/src/main/java/com/google/blockly/android/webview/demo/MainActivity.java similarity index 100% rename from demos/android/app/src/main/java/com/google/blockly/android/webview/demo/MainActivity.java rename to demos/mobile/android/app/src/main/java/com/google/blockly/android/webview/demo/MainActivity.java diff --git a/demos/android/app/src/main/res/drawable-v24/ic_launcher_foreground.xml b/demos/mobile/android/app/src/main/res/drawable-v24/ic_launcher_foreground.xml similarity index 100% rename from demos/android/app/src/main/res/drawable-v24/ic_launcher_foreground.xml rename to demos/mobile/android/app/src/main/res/drawable-v24/ic_launcher_foreground.xml diff --git a/demos/android/app/src/main/res/drawable/ic_launcher_background.xml b/demos/mobile/android/app/src/main/res/drawable/ic_launcher_background.xml similarity index 100% rename from demos/android/app/src/main/res/drawable/ic_launcher_background.xml rename to demos/mobile/android/app/src/main/res/drawable/ic_launcher_background.xml diff --git a/demos/android/app/src/main/res/layout/activity_main.xml b/demos/mobile/android/app/src/main/res/layout/activity_main.xml similarity index 100% rename from demos/android/app/src/main/res/layout/activity_main.xml rename to demos/mobile/android/app/src/main/res/layout/activity_main.xml diff --git a/demos/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml b/demos/mobile/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml similarity index 100% rename from demos/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml rename to demos/mobile/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml diff --git a/demos/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml b/demos/mobile/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml similarity index 100% rename from demos/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml rename to demos/mobile/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml diff --git a/demos/android/app/src/main/res/mipmap-hdpi/ic_launcher.png b/demos/mobile/android/app/src/main/res/mipmap-hdpi/ic_launcher.png similarity index 100% rename from demos/android/app/src/main/res/mipmap-hdpi/ic_launcher.png rename to demos/mobile/android/app/src/main/res/mipmap-hdpi/ic_launcher.png diff --git a/demos/android/app/src/main/res/mipmap-hdpi/ic_launcher_round.png b/demos/mobile/android/app/src/main/res/mipmap-hdpi/ic_launcher_round.png similarity index 100% rename from demos/android/app/src/main/res/mipmap-hdpi/ic_launcher_round.png rename to demos/mobile/android/app/src/main/res/mipmap-hdpi/ic_launcher_round.png diff --git a/demos/android/app/src/main/res/mipmap-mdpi/ic_launcher.png b/demos/mobile/android/app/src/main/res/mipmap-mdpi/ic_launcher.png similarity index 100% rename from demos/android/app/src/main/res/mipmap-mdpi/ic_launcher.png rename to demos/mobile/android/app/src/main/res/mipmap-mdpi/ic_launcher.png diff --git a/demos/android/app/src/main/res/mipmap-mdpi/ic_launcher_round.png b/demos/mobile/android/app/src/main/res/mipmap-mdpi/ic_launcher_round.png similarity index 100% rename from demos/android/app/src/main/res/mipmap-mdpi/ic_launcher_round.png rename to demos/mobile/android/app/src/main/res/mipmap-mdpi/ic_launcher_round.png diff --git a/demos/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png b/demos/mobile/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png similarity index 100% rename from demos/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png rename to demos/mobile/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png diff --git a/demos/android/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png b/demos/mobile/android/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png similarity index 100% rename from demos/android/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png rename to demos/mobile/android/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png diff --git a/demos/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png b/demos/mobile/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png similarity index 100% rename from demos/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png rename to demos/mobile/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png diff --git a/demos/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png b/demos/mobile/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png similarity index 100% rename from demos/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png rename to demos/mobile/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png diff --git a/demos/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/demos/mobile/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png similarity index 100% rename from demos/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png rename to demos/mobile/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png diff --git a/demos/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png b/demos/mobile/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png similarity index 100% rename from demos/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png rename to demos/mobile/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png diff --git a/demos/android/app/src/main/res/values/colors.xml b/demos/mobile/android/app/src/main/res/values/colors.xml similarity index 100% rename from demos/android/app/src/main/res/values/colors.xml rename to demos/mobile/android/app/src/main/res/values/colors.xml diff --git a/demos/android/app/src/main/res/values/strings.xml b/demos/mobile/android/app/src/main/res/values/strings.xml similarity index 100% rename from demos/android/app/src/main/res/values/strings.xml rename to demos/mobile/android/app/src/main/res/values/strings.xml diff --git a/demos/android/app/src/main/res/values/styles.xml b/demos/mobile/android/app/src/main/res/values/styles.xml similarity index 100% rename from demos/android/app/src/main/res/values/styles.xml rename to demos/mobile/android/app/src/main/res/values/styles.xml diff --git a/demos/android/app/src/test/java/com/example/blocklywebview/ExampleUnitTest.java b/demos/mobile/android/app/src/test/java/com/example/blocklywebview/ExampleUnitTest.java similarity index 100% rename from demos/android/app/src/test/java/com/example/blocklywebview/ExampleUnitTest.java rename to demos/mobile/android/app/src/test/java/com/example/blocklywebview/ExampleUnitTest.java diff --git a/demos/android/build.gradle b/demos/mobile/android/build.gradle similarity index 100% rename from demos/android/build.gradle rename to demos/mobile/android/build.gradle diff --git a/demos/android/gradle.properties b/demos/mobile/android/gradle.properties similarity index 100% rename from demos/android/gradle.properties rename to demos/mobile/android/gradle.properties diff --git a/demos/android/gradle/wrapper/gradle-wrapper.jar b/demos/mobile/android/gradle/wrapper/gradle-wrapper.jar similarity index 100% rename from demos/android/gradle/wrapper/gradle-wrapper.jar rename to demos/mobile/android/gradle/wrapper/gradle-wrapper.jar diff --git a/demos/android/gradle/wrapper/gradle-wrapper.properties b/demos/mobile/android/gradle/wrapper/gradle-wrapper.properties similarity index 100% rename from demos/android/gradle/wrapper/gradle-wrapper.properties rename to demos/mobile/android/gradle/wrapper/gradle-wrapper.properties diff --git a/demos/android/gradlew b/demos/mobile/android/gradlew similarity index 100% rename from demos/android/gradlew rename to demos/mobile/android/gradlew diff --git a/demos/android/gradlew.bat b/demos/mobile/android/gradlew.bat similarity index 100% rename from demos/android/gradlew.bat rename to demos/mobile/android/gradlew.bat diff --git a/demos/android/settings.gradle b/demos/mobile/android/settings.gradle similarity index 100% rename from demos/android/settings.gradle rename to demos/mobile/android/settings.gradle diff --git a/demos/android/app/src/main/assets/blockly/webview.html b/demos/mobile/html/index.html similarity index 100% rename from demos/android/app/src/main/assets/blockly/webview.html rename to demos/mobile/html/index.html diff --git a/demos/ios/.gitignore b/demos/mobile/ios/.gitignore similarity index 93% rename from demos/ios/.gitignore rename to demos/mobile/ios/.gitignore index c3b00e539..d6ce9d3ab 100644 --- a/demos/ios/.gitignore +++ b/demos/mobile/ios/.gitignore @@ -3,6 +3,7 @@ /Resources/Non-Localized/Blockly/blocks_compressed.js /Resources/Non-Localized/Blockly/media /Resources/Non-Localized/Blockly/msg +/Resources/Non-Localized/Blockly/webview.html # Xcode.gitignore diff --git a/demos/ios/Blockly WebView.xcodeproj/project.pbxproj b/demos/mobile/ios/Blockly WebView.xcodeproj/project.pbxproj similarity index 100% rename from demos/ios/Blockly WebView.xcodeproj/project.pbxproj rename to demos/mobile/ios/Blockly WebView.xcodeproj/project.pbxproj diff --git a/demos/ios/Blockly WebView.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/demos/mobile/ios/Blockly WebView.xcodeproj/project.xcworkspace/contents.xcworkspacedata similarity index 100% rename from demos/ios/Blockly WebView.xcodeproj/project.xcworkspace/contents.xcworkspacedata rename to demos/mobile/ios/Blockly WebView.xcodeproj/project.xcworkspace/contents.xcworkspacedata diff --git a/demos/ios/Blockly WebView.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/demos/mobile/ios/Blockly WebView.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist similarity index 100% rename from demos/ios/Blockly WebView.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist rename to demos/mobile/ios/Blockly WebView.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist diff --git a/demos/ios/Blockly WebView.xcodeproj/xcuserdata/marshalla.xcuserdatad/xcschemes/xcschememanagement.plist b/demos/mobile/ios/Blockly WebView.xcodeproj/xcuserdata/marshalla.xcuserdatad/xcschemes/xcschememanagement.plist similarity index 100% rename from demos/ios/Blockly WebView.xcodeproj/xcuserdata/marshalla.xcuserdatad/xcschemes/xcschememanagement.plist rename to demos/mobile/ios/Blockly WebView.xcodeproj/xcuserdata/marshalla.xcuserdatad/xcschemes/xcschememanagement.plist diff --git a/demos/ios/Blockly WebView/AppDelegate.swift b/demos/mobile/ios/Blockly WebView/AppDelegate.swift similarity index 100% rename from demos/ios/Blockly WebView/AppDelegate.swift rename to demos/mobile/ios/Blockly WebView/AppDelegate.swift diff --git a/demos/ios/Blockly WebView/Assets.xcassets/AppIcon.appiconset/Contents.json b/demos/mobile/ios/Blockly WebView/Assets.xcassets/AppIcon.appiconset/Contents.json similarity index 100% rename from demos/ios/Blockly WebView/Assets.xcassets/AppIcon.appiconset/Contents.json rename to demos/mobile/ios/Blockly WebView/Assets.xcassets/AppIcon.appiconset/Contents.json diff --git a/demos/ios/Blockly WebView/Assets.xcassets/Contents.json b/demos/mobile/ios/Blockly WebView/Assets.xcassets/Contents.json similarity index 100% rename from demos/ios/Blockly WebView/Assets.xcassets/Contents.json rename to demos/mobile/ios/Blockly WebView/Assets.xcassets/Contents.json diff --git a/demos/ios/Blockly WebView/Base.lproj/LaunchScreen.storyboard b/demos/mobile/ios/Blockly WebView/Base.lproj/LaunchScreen.storyboard similarity index 100% rename from demos/ios/Blockly WebView/Base.lproj/LaunchScreen.storyboard rename to demos/mobile/ios/Blockly WebView/Base.lproj/LaunchScreen.storyboard diff --git a/demos/ios/Blockly WebView/Base.lproj/Main.storyboard b/demos/mobile/ios/Blockly WebView/Base.lproj/Main.storyboard similarity index 100% rename from demos/ios/Blockly WebView/Base.lproj/Main.storyboard rename to demos/mobile/ios/Blockly WebView/Base.lproj/Main.storyboard diff --git a/demos/ios/Blockly WebView/Info.plist b/demos/mobile/ios/Blockly WebView/Info.plist similarity index 100% rename from demos/ios/Blockly WebView/Info.plist rename to demos/mobile/ios/Blockly WebView/Info.plist diff --git a/demos/ios/Blockly WebView/ViewController.swift b/demos/mobile/ios/Blockly WebView/ViewController.swift similarity index 100% rename from demos/ios/Blockly WebView/ViewController.swift rename to demos/mobile/ios/Blockly WebView/ViewController.swift diff --git a/demos/ios/Resources/Non-Localized/Blockly/toolbox_standard.js b/demos/mobile/ios/Resources/Non-Localized/Blockly/toolbox_standard.js similarity index 100% rename from demos/ios/Resources/Non-Localized/Blockly/toolbox_standard.js rename to demos/mobile/ios/Resources/Non-Localized/Blockly/toolbox_standard.js diff --git a/demos/ios/cp_resources.sh b/demos/mobile/ios/cp_resources.sh similarity index 63% rename from demos/ios/cp_resources.sh rename to demos/mobile/ios/cp_resources.sh index 6a39b652f..0221c9290 100755 --- a/demos/ios/cp_resources.sh +++ b/demos/mobile/ios/cp_resources.sh @@ -1,10 +1,10 @@ #!/bin/bash set -eux -BLOCKLY_ROOT=../.. +BLOCKLY_ROOT=../../.. IOS_RESOURCES=Resources/Non-Localized/Blockly -FILES_TO_COPY=( +MORE_FILES_TO_COPY=( "blockly_compressed.js" "blocks_compressed.js" "media" @@ -13,7 +13,8 @@ FILES_TO_COPY=( mkdir -p $IOS_RESOURCES/media mkdir -p $IOS_RESOURCES/msg/js -for i in "${FILES_TO_COPY[@]}"; do # The quotes are necessary here +rsync -rp ../html/index.html $IOS_RESOURCES/webview.html +for i in "${MORE_FILES_TO_COPY[@]}"; do # The quotes are necessary here TARGET_DIR=$(dirname $IOS_RESOURCES/$i) rsync -rp $BLOCKLY_ROOT/$i $TARGET_DIR done From 0eb7d09afb2d3e7aef2a71bae590cee645328bcf Mon Sep 17 00:00:00 2001 From: Andrew n marshall Date: Wed, 19 Sep 2018 12:30:26 -0700 Subject: [PATCH 9/9] Don't use XML escape inside a markdown code segment. --- demos/mobile/android/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/demos/mobile/android/README.md b/demos/mobile/android/README.md index 9c63f70b6..b03837ecf 100644 --- a/demos/mobile/android/README.md +++ b/demos/mobile/android/README.md @@ -29,7 +29,7 @@ blocks are visible to the user all the time; that is controlled by the toolbox and workspace files. This should accommodate almost all applications. This does mean loading your own block definitions and generators will involve -editing the HTML, adding you own `<script>` tag, and possibly removing +editing the HTML, adding you own `