From c29d74a807c5b3502a45e886f89016fb91f391a0 Mon Sep 17 00:00:00 2001 From: techAdmin Date: Mon, 18 Sep 2023 15:32:28 +0900 Subject: [PATCH] =?UTF-8?q?Nexacro14=20=ED=94=84=EB=A1=9C=EC=A0=9D?= =?UTF-8?q?=ED=8A=B8=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .DS_Store | Bin 8196 -> 8196 bytes Nexacro14/.DS_Store | Bin 0 -> 6148 bytes Nexacro14/Android/.DS_Store | Bin 0 -> 6148 bytes .../Android/nexacro14_android/.gitignore | 7 + .../Android/nexacro14_android/.idea/.name | 1 + .../nexacro14_android/.idea/compiler.xml | 22 + .../.idea/copyright/profiles_settings.xml | 3 + .../nexacro14_android/.idea/encodings.xml | 6 + .../nexacro14_android/.idea/gradle.xml | 19 + .../Android/nexacro14_android/.idea/misc.xml | 38 ++ .../nexacro14_android/.idea/modules.xml | 10 + .../.idea/runConfigurations.xml | 12 + .../Android/nexacro14_android/.idea/vcs.xml | 6 + .../Android/nexacro14_android/DroidStudio.iml | 11 + .../Android/nexacro14_android/app/app.iml | 161 ++++++ .../nexacro14_android/app/build.gradle | 33 ++ .../app/google-services.json | 42 ++ .../nexacro14_android/app/nexacro-example.jks | Bin 0 -> 2205 bytes .../nexacro14_android/app/proguard-rules.pro | 17 + .../launcher/droidstudio/ApplicationTest.java | 13 + .../app/src/main/AndroidManifest.xml | 136 +++++ .../java/nexacro/launcher/MainActivity.java | 61 ++ .../launcher/ProjectSelectActivity.java | 341 +++++++++++ .../nexacro/launcher/UserCustomActivity.java | 55 ++ .../app/src/main/res/layout/user_custom.xml | 53 ++ .../src/main/res/mipmap-hdpi/ic_launcher.png | Bin 0 -> 3418 bytes .../src/main/res/mipmap-mdpi/ic_launcher.png | Bin 0 -> 2206 bytes .../src/main/res/mipmap-xhdpi/ic_launcher.png | Bin 0 -> 4842 bytes .../main/res/mipmap-xxhdpi/ic_launcher.png | Bin 0 -> 7718 bytes .../app/src/main/res/values-w820dp/dimens.xml | 6 + .../app/src/main/res/values/dimens.xml | 5 + .../app/src/main/res/values/strings.xml | 6 + .../app/src/main/res/values/styles.xml | 8 + .../Android/nexacro14_android/build.gradle | 22 + .../nexacro14_android/gradle.properties | 18 + .../gradle/wrapper/gradle-wrapper.jar | Bin 0 -> 49896 bytes .../gradle/wrapper/gradle-wrapper.properties | 6 + Nexacro14/Android/nexacro14_android/gradlew | 164 ++++++ .../Android/nexacro14_android/gradlew.bat | 90 +++ .../Android/nexacro14_android/settings.gradle | 1 + .../Android/이프로젝트에대해서.txt | 15 + Nexacro14/iOS/.DS_Store | Bin 0 -> 6148 bytes Nexacro14/iOS/nexacro14_iOS/.DS_Store | Bin 0 -> 6148 bytes .../nexacro14App.xcodeproj/project.pbxproj | 538 ++++++++++++++++++ .../xcschemes/nexacro14App.xcscheme | 78 +++ .../nexacro14_iOS/nexacro14App/AppDelegate.h | 22 + .../nexacro14_iOS/nexacro14App/AppDelegate.m | 93 +++ .../nexacro14App/Library/.gitkeep | 0 .../nexacro14_iOS/nexacro14App/archive/.keep | 0 .../nexacro14App/data/nexacro_config.xml | 17 + .../nexacro14App/en.lproj/Localizable.strings | 27 + .../nexacro14App/ja.lproj/Localizable.strings | 27 + .../nexacro14App/ko.lproj/Localizable.strings | 27 + .../iOS/nexacro14_iOS/nexacro14App/main.m | 16 + .../nexacro14App/nexacro14App-Info.plist | 98 ++++ .../nexacro14App/nexacro14App-Prefix.pch | 14 + .../nexacro14App/nexacro14App.entitlements | 8 + .../nexacro14_iOS/nexacro14App/res/Icon.png | Bin 0 -> 6606 bytes .../nexacro14App/res/Icon@2x.png | Bin 0 -> 12437 bytes .../nexacro14App/res/Launch Screen.storyboard | 29 + .../nexacro14_iOS/nexacro14App/res/check.png | Bin 0 -> 412 bytes .../nexacro14App/res/check_o.png | Bin 0 -> 850 bytes .../res/splashimage/Default-568h@2x.png | Bin 0 -> 70663 bytes .../splashimage/Default-Portrait@2x~ipad.png | Bin 0 -> 49673 bytes .../res/splashimage/Default-Portrait~ipad.png | Bin 0 -> 49673 bytes .../splashimage/splashimage_pad_landscape.png | Bin 0 -> 51638 bytes .../splashimage/splashimage_pad_portrait.png | Bin 0 -> 49673 bytes .../splashimage_phone_landscape.png | Bin 0 -> 56805 bytes .../splashimage_phone_portrait.png | Bin 0 -> 70593 bytes 69 files changed, 2382 insertions(+) create mode 100644 Nexacro14/.DS_Store create mode 100644 Nexacro14/Android/.DS_Store create mode 100644 Nexacro14/Android/nexacro14_android/.gitignore create mode 100644 Nexacro14/Android/nexacro14_android/.idea/.name create mode 100644 Nexacro14/Android/nexacro14_android/.idea/compiler.xml create mode 100644 Nexacro14/Android/nexacro14_android/.idea/copyright/profiles_settings.xml create mode 100644 Nexacro14/Android/nexacro14_android/.idea/encodings.xml create mode 100644 Nexacro14/Android/nexacro14_android/.idea/gradle.xml create mode 100644 Nexacro14/Android/nexacro14_android/.idea/misc.xml create mode 100644 Nexacro14/Android/nexacro14_android/.idea/modules.xml create mode 100644 Nexacro14/Android/nexacro14_android/.idea/runConfigurations.xml create mode 100644 Nexacro14/Android/nexacro14_android/.idea/vcs.xml create mode 100644 Nexacro14/Android/nexacro14_android/DroidStudio.iml create mode 100644 Nexacro14/Android/nexacro14_android/app/app.iml create mode 100644 Nexacro14/Android/nexacro14_android/app/build.gradle create mode 100644 Nexacro14/Android/nexacro14_android/app/google-services.json create mode 100644 Nexacro14/Android/nexacro14_android/app/nexacro-example.jks create mode 100644 Nexacro14/Android/nexacro14_android/app/proguard-rules.pro create mode 100644 Nexacro14/Android/nexacro14_android/app/src/androidTest/java/nexacro/launcher/droidstudio/ApplicationTest.java create mode 100644 Nexacro14/Android/nexacro14_android/app/src/main/AndroidManifest.xml create mode 100644 Nexacro14/Android/nexacro14_android/app/src/main/java/nexacro/launcher/MainActivity.java create mode 100644 Nexacro14/Android/nexacro14_android/app/src/main/java/nexacro/launcher/ProjectSelectActivity.java create mode 100644 Nexacro14/Android/nexacro14_android/app/src/main/java/nexacro/launcher/UserCustomActivity.java create mode 100644 Nexacro14/Android/nexacro14_android/app/src/main/res/layout/user_custom.xml create mode 100644 Nexacro14/Android/nexacro14_android/app/src/main/res/mipmap-hdpi/ic_launcher.png create mode 100644 Nexacro14/Android/nexacro14_android/app/src/main/res/mipmap-mdpi/ic_launcher.png create mode 100644 Nexacro14/Android/nexacro14_android/app/src/main/res/mipmap-xhdpi/ic_launcher.png create mode 100644 Nexacro14/Android/nexacro14_android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png create mode 100644 Nexacro14/Android/nexacro14_android/app/src/main/res/values-w820dp/dimens.xml create mode 100644 Nexacro14/Android/nexacro14_android/app/src/main/res/values/dimens.xml create mode 100644 Nexacro14/Android/nexacro14_android/app/src/main/res/values/strings.xml create mode 100644 Nexacro14/Android/nexacro14_android/app/src/main/res/values/styles.xml create mode 100644 Nexacro14/Android/nexacro14_android/build.gradle create mode 100644 Nexacro14/Android/nexacro14_android/gradle.properties create mode 100644 Nexacro14/Android/nexacro14_android/gradle/wrapper/gradle-wrapper.jar create mode 100644 Nexacro14/Android/nexacro14_android/gradle/wrapper/gradle-wrapper.properties create mode 100644 Nexacro14/Android/nexacro14_android/gradlew create mode 100644 Nexacro14/Android/nexacro14_android/gradlew.bat create mode 100644 Nexacro14/Android/nexacro14_android/settings.gradle create mode 100644 Nexacro14/Android/이프로젝트에대해서.txt create mode 100644 Nexacro14/iOS/.DS_Store create mode 100644 Nexacro14/iOS/nexacro14_iOS/.DS_Store create mode 100644 Nexacro14/iOS/nexacro14_iOS/nexacro14App.xcodeproj/project.pbxproj create mode 100644 Nexacro14/iOS/nexacro14_iOS/nexacro14App.xcodeproj/xcshareddata/xcschemes/nexacro14App.xcscheme create mode 100644 Nexacro14/iOS/nexacro14_iOS/nexacro14App/AppDelegate.h create mode 100644 Nexacro14/iOS/nexacro14_iOS/nexacro14App/AppDelegate.m create mode 100644 Nexacro14/iOS/nexacro14_iOS/nexacro14App/Library/.gitkeep create mode 100644 Nexacro14/iOS/nexacro14_iOS/nexacro14App/archive/.keep create mode 100644 Nexacro14/iOS/nexacro14_iOS/nexacro14App/data/nexacro_config.xml create mode 100644 Nexacro14/iOS/nexacro14_iOS/nexacro14App/en.lproj/Localizable.strings create mode 100644 Nexacro14/iOS/nexacro14_iOS/nexacro14App/ja.lproj/Localizable.strings create mode 100644 Nexacro14/iOS/nexacro14_iOS/nexacro14App/ko.lproj/Localizable.strings create mode 100644 Nexacro14/iOS/nexacro14_iOS/nexacro14App/main.m create mode 100644 Nexacro14/iOS/nexacro14_iOS/nexacro14App/nexacro14App-Info.plist create mode 100644 Nexacro14/iOS/nexacro14_iOS/nexacro14App/nexacro14App-Prefix.pch create mode 100644 Nexacro14/iOS/nexacro14_iOS/nexacro14App/nexacro14App.entitlements create mode 100644 Nexacro14/iOS/nexacro14_iOS/nexacro14App/res/Icon.png create mode 100644 Nexacro14/iOS/nexacro14_iOS/nexacro14App/res/Icon@2x.png create mode 100644 Nexacro14/iOS/nexacro14_iOS/nexacro14App/res/Launch Screen.storyboard create mode 100644 Nexacro14/iOS/nexacro14_iOS/nexacro14App/res/check.png create mode 100644 Nexacro14/iOS/nexacro14_iOS/nexacro14App/res/check_o.png create mode 100644 Nexacro14/iOS/nexacro14_iOS/nexacro14App/res/splashimage/Default-568h@2x.png create mode 100644 Nexacro14/iOS/nexacro14_iOS/nexacro14App/res/splashimage/Default-Portrait@2x~ipad.png create mode 100644 Nexacro14/iOS/nexacro14_iOS/nexacro14App/res/splashimage/Default-Portrait~ipad.png create mode 100644 Nexacro14/iOS/nexacro14_iOS/nexacro14App/res/splashimage/splashimage_pad_landscape.png create mode 100644 Nexacro14/iOS/nexacro14_iOS/nexacro14App/res/splashimage/splashimage_pad_portrait.png create mode 100644 Nexacro14/iOS/nexacro14_iOS/nexacro14App/res/splashimage/splashimage_phone_landscape.png create mode 100644 Nexacro14/iOS/nexacro14_iOS/nexacro14App/res/splashimage/splashimage_phone_portrait.png diff --git a/.DS_Store b/.DS_Store index 3b7abc43db958a6661a8f537c1abc47f4d7f22b8..6cf0e40e86b4d1d7ef517c41ad22da3a8254a04f 100644 GIT binary patch delta 257 zcmZp1XmQw}DiF{4sgHqyfrUYjA)O(Up(Hoo#U&{xKM5$t!NAbKD-?6o5mi0~NuGfl zUA`d0FgQ6sw*aVzfkA8o!(>Gv(aAFfco=s~z9(F$E>T@=W@M_PU~FPstD{hDX=I?I zU}9-hTg%BIs;qAv6rY`wo0s1;SwKvlu^XgU&?F}v$wa<}0 diff --git a/Nexacro14/.DS_Store b/Nexacro14/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..53f1e4a0d7e71266880c45e5d24d27eff4020c3a GIT binary patch literal 6148 zcmeH~%}OId5XY-c*2Is6z$$ob5O0x<(G_GbV~l6f5k08Hj1zR&$#lqvIfTHR^@V%^ zA3@*1yN_U1cLg(v0Z*cC7j*x7x~isAKbY<`0Ekk@UjxViKo%QmdKSAkjQrHbY>H>* zQH6eof&hH4+iG~>ShSt61T2BiMu5KE3~WOLJ~UzI`&Ax#?z~1AwAzKjqnJvie@ti4 z<}zpQmFl|fYP-`aRhuXDbf{G54aQaPD5!NSxrH4SwW~o?YwCo+uVKjPaS-{cTT-3K zZ|PjuIA+i)xusrjv-l@3*EiPtdD+`47V>gqtJv?)WEYoz|2?Su3+s`(F&G8zI@*4+ z4&)XGBUOc$Ywm@rH+0DK)5CZ~U6spTsO!ed&X#?{bj*=JgGie6z-gR;F`Vj%d_Wd63jFEo3C{yS;H!`=DfNZW<2UmvOUL_4(N?AC6Beq z1o-R8&P@)n9!tOy_)iJY{vffDI;^o#y>(!xuK=iNoYsb8x=T=wWOZ0$qv$~sCKc7B z3cg|plaBL};~du5s7VLGmk+@!3%;QUy*j>M>TnQ_QQKPrmOzp~$~@-i{NJ5?|4$~_ zCriK*_*Mi&y6l!qSQ4MDW5v-~E3utpBcr(3s7}F-k7GTcqj(9MHuOmvpgOFvQJg`u Oe*`oJ+gSo1O5g=8<+=+1 literal 0 HcmV?d00001 diff --git a/Nexacro14/Android/.DS_Store b/Nexacro14/Android/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..82721baa6bc584adc343a9e8aef2bb95b4477d2b GIT binary patch literal 6148 zcmeHK&ubGw82zS=O==M%Rp@b`*MLbHh0@C!5qoB0AQQCI}U$~^ey&CYypGV{XD>=2Ra&XX2Vorr1(=E_YJKLPi1Y+y@T zs$gZu7|?_awWve=jcniG9qN^7|X1HL>q=O3BmA4C2hh$mXr$ zHph2Cxe?;UbSxu$ipN2T4n-+gTIS(N6(i4~;D5GkiG(>yVYu9@e_)M`W5u?zI;2g~Kd_Jf8#>Kv^adU@P# zHgxB>y;|+o?j7DgdDefMjdF8=l>iERnZ+&PHGM#(gjd;FD;${7*vfXkek`XNnO;x) z!Dd?=?w@{nR92b%rgD6KX{NQ$JmC`Sdlydf%;aatUOUA~kL%`u{Cl;%>o##eU+;i- z;Ey}N`-4U>2f~G8yLF(jR{(GY%@(Nh2Lfxfa3EYbMh~Ez6zrr*t{BS6(XJ&g5H1`$ zIVrh(DEVb2Hxy-m9ph`8PAYKhOYeYp;Hm@L?y=72|C3+e|F4StlXt*7@LxHgD!s7R z#ggP~-B=u-wHomT!Qi~Yv6Y~Z + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Nexacro14/Android/nexacro14_android/.idea/copyright/profiles_settings.xml b/Nexacro14/Android/nexacro14_android/.idea/copyright/profiles_settings.xml new file mode 100644 index 0000000..e7bedf3 --- /dev/null +++ b/Nexacro14/Android/nexacro14_android/.idea/copyright/profiles_settings.xml @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/Nexacro14/Android/nexacro14_android/.idea/encodings.xml b/Nexacro14/Android/nexacro14_android/.idea/encodings.xml new file mode 100644 index 0000000..97626ba --- /dev/null +++ b/Nexacro14/Android/nexacro14_android/.idea/encodings.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/Nexacro14/Android/nexacro14_android/.idea/gradle.xml b/Nexacro14/Android/nexacro14_android/.idea/gradle.xml new file mode 100644 index 0000000..68b204e --- /dev/null +++ b/Nexacro14/Android/nexacro14_android/.idea/gradle.xml @@ -0,0 +1,19 @@ + + + + + + \ No newline at end of file diff --git a/Nexacro14/Android/nexacro14_android/.idea/misc.xml b/Nexacro14/Android/nexacro14_android/.idea/misc.xml new file mode 100644 index 0000000..e0d5b93 --- /dev/null +++ b/Nexacro14/Android/nexacro14_android/.idea/misc.xml @@ -0,0 +1,38 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/Nexacro14/Android/nexacro14_android/.idea/modules.xml b/Nexacro14/Android/nexacro14_android/.idea/modules.xml new file mode 100644 index 0000000..2a8e725 --- /dev/null +++ b/Nexacro14/Android/nexacro14_android/.idea/modules.xml @@ -0,0 +1,10 @@ + + + + + + + + + + \ No newline at end of file diff --git a/Nexacro14/Android/nexacro14_android/.idea/runConfigurations.xml b/Nexacro14/Android/nexacro14_android/.idea/runConfigurations.xml new file mode 100644 index 0000000..7f68460 --- /dev/null +++ b/Nexacro14/Android/nexacro14_android/.idea/runConfigurations.xml @@ -0,0 +1,12 @@ + + + + + + \ No newline at end of file diff --git a/Nexacro14/Android/nexacro14_android/.idea/vcs.xml b/Nexacro14/Android/nexacro14_android/.idea/vcs.xml new file mode 100644 index 0000000..6564d52 --- /dev/null +++ b/Nexacro14/Android/nexacro14_android/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/Nexacro14/Android/nexacro14_android/DroidStudio.iml b/Nexacro14/Android/nexacro14_android/DroidStudio.iml new file mode 100644 index 0000000..886c753 --- /dev/null +++ b/Nexacro14/Android/nexacro14_android/DroidStudio.iml @@ -0,0 +1,11 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/Nexacro14/Android/nexacro14_android/app/app.iml b/Nexacro14/Android/nexacro14_android/app/app.iml new file mode 100644 index 0000000..a1ec47f --- /dev/null +++ b/Nexacro14/Android/nexacro14_android/app/app.iml @@ -0,0 +1,161 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Nexacro14/Android/nexacro14_android/app/build.gradle b/Nexacro14/Android/nexacro14_android/app/build.gradle new file mode 100644 index 0000000..49118b6 --- /dev/null +++ b/Nexacro14/Android/nexacro14_android/app/build.gradle @@ -0,0 +1,33 @@ +apply plugin: 'com.android.application' + +android { + compileSdkVersion 30 + buildToolsVersion "28.0.3" + + defaultConfig { + applicationId "nexacro.launcher" + minSdkVersion 14 + targetSdkVersion 30 + versionCode 1 + versionName "1.0" + } + buildTypes { + release { + minifyEnabled false + proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' + } + } +} + +dependencies { + implementation fileTree(dir: 'libs', include: ['*.jar']) + implementation 'com.android.support:appcompat-v7:26.1.0' + implementation 'com.android.support:support-v4:26.1.0' + implementation 'com.google.android.gms:play-services-maps:16.0.0' + implementation 'com.google.android.gms:play-services-location:16.0.0' + implementation 'com.google.firebase:firebase-core:16.0.6' + implementation 'com.google.firebase:firebase-messaging:17.3.4' + implementation project(':nexacro14') +} + +apply plugin: 'com.google.gms.google-services' \ No newline at end of file diff --git a/Nexacro14/Android/nexacro14_android/app/google-services.json b/Nexacro14/Android/nexacro14_android/app/google-services.json new file mode 100644 index 0000000..03997e5 --- /dev/null +++ b/Nexacro14/Android/nexacro14_android/app/google-services.json @@ -0,0 +1,42 @@ +{ + "project_info": { + "project_number": "995072755403", + "firebase_url": "https://summer-nexus-581.firebaseio.com", + "project_id": "summer-nexus-581", + "storage_bucket": "summer-nexus-581.appspot.com" + }, + "client": [ + { + "client_info": { + "mobilesdk_app_id": "1:995072755403:android:28b014c688afb816", + "android_client_info": { + "package_name": "nexacro.launcher" + } + }, + "oauth_client": [ + { + "client_id": "995072755403-ksam7299dh20s90batq23eis6gpv1749.apps.googleusercontent.com", + "client_type": 3 + } + ], + "api_key": [ + { + "current_key": "AIzaSyAaOYYoqFY9-AcA_P5jUtK_-2EmeoLvy7g" + } + ], + "services": { + "analytics_service": { + "status": 1 + }, + "appinvite_service": { + "status": 1, + "other_platform_oauth_client": [] + }, + "ads_service": { + "status": 2 + } + } + } + ], + "configuration_version": "1" +} \ No newline at end of file diff --git a/Nexacro14/Android/nexacro14_android/app/nexacro-example.jks b/Nexacro14/Android/nexacro14_android/app/nexacro-example.jks new file mode 100644 index 0000000000000000000000000000000000000000..b33b9850c9d78efa6c227eaa682699fd2cc7d8bf GIT binary patch literal 2205 zcmcIk`8U*y8=lXYjbWI`a*?gNk!5C#T}(wIOGA>e8+)Na*)uU;VQ!T54v~mRS+Zok z=xWH4WmNVp#(F8rRx(}pp8GxD`wx77c+PvC=e*~<=Y8JyJlr+z8VCde9{~6pg4aC5 zDDFX2m4o6R;OBXud-nthTZ2GQFoq7{Vo)%?lP~}RD1p%c00lwlkd=gIk!(BZW1k0E z1yw{8$5v{_DtVBVA!G08uvjJ9RV3*r?-@R|aP__1OnFQv*uXrXfG!K1^ ze(v~WYKa`b3%`1Kp0{PYDVJ2_6S)urxoOd_T_AmX6-rU#Qi-!w7dlX@=S+R)FHXOk zeuxXJJUdCm-Ew1S;&eh)_m>y&;);7t+@ST5qhlTlSeZ-buCr^b&T!8e?(Ylnar4s1 zKy>WS&YEkzBiioSdci4-80i-gy!pwQ)FPjJnJAm^U7eh7_B38<6FXtU!tH!ZWM?Jm zo`Oilhl!-}VcfU>XbYst;f?H}yMEfrb#>f5`~>@?WQw{(*Ox8IhXFL^v*2`TmW@v4 zR>gug^Y#8vagPI+7=iR&(S0dV9g{Rzu6bUv)GHv=ig_w>cl5K<$oAp0{&r&($&&>? zjul9ytoEC}9s6M2(C#gdlOuJ9d5=1@YRX*fBOxlcZ$o;AFFr3tS8SXAu#qu}87QFh z=Bt^~7dKzN3tFLA#%_v?+A*O$1QvG?gQV8Q*=YUPTE z@=LOzdA6HLLhq+3@-V`gMB?MScN^s&%GO=BQ4Jv{KUnQ5Fpiw{XisfDAy7A;=rOf; z{MSjVI3}UmDs&)qN^KPJ{EK7AC|S&jaM>B2Qfn)eOjQ>hk}0jSG>p5sKThce%RO%! zXFaa3p8a@#Y^d&CIW#6WU1I76Zn-53(Lv&SD+1eg{<^i~Bwf-X*|$rH74PXG4QC&( z3AeU0!P`|?yMN;3eu?YJ$O=-9KV?$1$*g+kw7wgl;9%G8y?`EV6{Z| z&x%|DKhTOEf5rcn#|RN?dlWQxR9)~b5d#ao@0C%EFh02eZi(D*FZ48Ny&m!7dnY#Q z$&8r@t7z=O@x@)#dZN&@ijMHICvA3J?dxd#6x})`y%cS)@-^mohK2=dx!t3K>*8vJ z*6->~=cKpHsS^Fh^OO^%YLZcE_(}U&UN!IXUSESYWnT7xLR{J7S&lF86=xp>^7rxz zO3WhJRrd=|_6#24%cX(~FIe8$n!)v!q`r^19{CIy?D$@6!oBTsMpIY2{zRAZfR~0r zCAPIBjYC*fkSb{nJcSFMXtE1pBs_nz>*HqD@>t!Ak)E}-?^M>K$-<9l?H<8xkIcAQPcgL^vg%!pENfk6hm{mG zltXv#RueBQbKRO(uJ7t|Yhb7j!?2s#64mDs#=gTfQ#Z`Qh0Kf23`;KGVUQ7V5j>Tc||Iq)_R5~F4@AVGSpN9?zf-rP|4@?IDP|5=RlC%xg#pk{Hk+weBSaU zH$q>3hIM)_aNmLUdh(~tpY7R)K8Y4%ErgWU6<@qLHHMpgsH*Wo$#(+!$_iKum2YE6 zJpJYnL$ur2xpKr1KypMvISiRvr$Eg~oYlAcv8`NFN+b z8U+!Bh%hNzPif^IHHSv#yYJ=`BKNrbO8++T;71Nj1VB2fr9xpr11O~m3i~UOEjWeHpP#moVC_;y>#Q#say@;mRzrVc ziVTesting Fundamentals + */ +public class ApplicationTest extends ApplicationTestCase { + public ApplicationTest() { + super(Application.class); + } +} \ No newline at end of file diff --git a/Nexacro14/Android/nexacro14_android/app/src/main/AndroidManifest.xml b/Nexacro14/Android/nexacro14_android/app/src/main/AndroidManifest.xml new file mode 100644 index 0000000..86bdd9f --- /dev/null +++ b/Nexacro14/Android/nexacro14_android/app/src/main/AndroidManifest.xml @@ -0,0 +1,136 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Nexacro14/Android/nexacro14_android/app/src/main/java/nexacro/launcher/MainActivity.java b/Nexacro14/Android/nexacro14_android/app/src/main/java/nexacro/launcher/MainActivity.java new file mode 100644 index 0000000..b59c122 --- /dev/null +++ b/Nexacro14/Android/nexacro14_android/app/src/main/java/nexacro/launcher/MainActivity.java @@ -0,0 +1,61 @@ +package nexacro.launcher; + +import android.content.Intent; +import android.content.pm.ApplicationInfo; +import android.os.Build; +import android.os.Bundle; +import android.view.View; +import android.webkit.WebView; + +import com.nexacro.NexacroUpdatorActivity; + +public class MainActivity extends NexacroUpdatorActivity { + + public MainActivity() { + super(); + + setProjectURL("http://your project url"); + setBootstrapURL("http://your bootstrap url/start_android.json"); + + // Default startupClass is NexacroActivity.class + // setStartupClass(UserCustomActivity.class); + } + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + + // Possible work around for market launches. See http://code.google.com/p/android/issues/detail?id=2373 + // for more details. Essentially, the market launches the main activity on top of other activities. + // we never want this to happen. Instead, we check if we are the root and if not, we finish. + if (!isTaskRoot()) { + final Intent intent = getIntent(); + if (intent.hasCategory(Intent.CATEGORY_LAUNCHER) && Intent.ACTION_MAIN.equals(intent.getAction())) { + finish(); + return; + } + } + + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { + if (0 != (getApplicationInfo().flags & ApplicationInfo.FLAG_DEBUGGABLE)) + { + WebView.setWebContentsDebuggingEnabled(true); + } + } + + Intent intent = getIntent(); + if(intent != null) { + String bootstrapURL = intent.getStringExtra("bootstrapURL"); + String projectUrl = intent.getStringExtra("projectUrl"); + if(bootstrapURL != null) { + setBootstrapURL(bootstrapURL); + setProjectURL(projectUrl); + } + } + } + + @Override + public void setContentView(View view) { + super.setContentView(view); + } +} diff --git a/Nexacro14/Android/nexacro14_android/app/src/main/java/nexacro/launcher/ProjectSelectActivity.java b/Nexacro14/Android/nexacro14_android/app/src/main/java/nexacro/launcher/ProjectSelectActivity.java new file mode 100644 index 0000000..4015cf3 --- /dev/null +++ b/Nexacro14/Android/nexacro14_android/app/src/main/java/nexacro/launcher/ProjectSelectActivity.java @@ -0,0 +1,341 @@ +package nexacro.launcher; + +import android.Manifest; +import android.app.Activity; +import android.app.ActivityManager; +import android.app.ActivityManager.RunningTaskInfo; +import android.app.AlertDialog; +import android.content.Context; +import android.content.DialogInterface; +import android.content.Intent; +import android.os.Build; +import android.os.Bundle; +import android.os.Environment; +import android.support.annotation.NonNull; +import android.support.v4.app.ActivityCompat; +import android.support.v4.content.PermissionChecker; +import android.util.Log; +import android.view.Window; +import android.widget.Toast; + +import com.nexacro.NexacroUpdatorActivity; + +import org.xmlpull.v1.XmlPullParser; +import org.xmlpull.v1.XmlPullParserException; +import org.xmlpull.v1.XmlPullParserFactory; + +import java.io.File; +import java.io.FileInputStream; +import java.io.FileNotFoundException; +import java.io.IOException; +import java.io.InputStreamReader; +import java.util.ArrayList; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map.Entry; + +/** + * 앱을 실행할때 시작 프로젝트를 동적으로 선택할수 있는 디버깅용 액티비티 입니다. + * 사용 방법은 폰의 기본저장소 루트 경로에 n14_devFeature.xml 파일의 존재유무 입니다. + * 파일이 없다면 이 액티비티를 무시한채 기존 NexacroUpdatorActivity.java에 설정된 시작 url로 프로젝트가 시작하게 됩니다. + * + * 이미 시작 프로젝트가 적용된후 다른 프로젝트로 전환하고 싶은 경우에는 "기존 꺼 삭제" 를 클릭하시면 됩니다. + * + * n14_devFeature.xml 파일 예) + * + * + * + * + * + * + * + */ + +public class ProjectSelectActivity extends Activity{ + private static final String LOG_TAG = "ProjectSelectActivity"; + + LinkedHashMap updateUrlList = new LinkedHashMap(); + + private AlertDialog dialog; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + + boolean darkTheme = false; + + /* dark */ + if (darkTheme) { + if (Build.VERSION.SDK_INT >= 21 /*Build.VERSION_CODES.LOLLIPOP */) { + setTheme(android.R.style.Theme_Material); + } + else if (Build.VERSION.SDK_INT >= 11 /*Build.VERSION_CODES.HONEYCOMB*/) { + setTheme(android.R.style.Theme_Holo); + } + else { + setTheme(android.R.style.Theme_Black); + } + } + /* light */ + else { + if (Build.VERSION.SDK_INT >= 21 /*Build.VERSION_CODES.LOLLIPOP */) { + setTheme(android.R.style.Theme_Material_Light); + } + else if (Build.VERSION.SDK_INT >= 11 /*Build.VERSION_CODES.HONEYCOMB*/) { + setTheme(android.R.style.Theme_Holo_Light); + } + else { + setTheme(android.R.style.Theme_Light); + } + } + + requestWindowFeature(Window.FEATURE_NO_TITLE); + + // Possible work around for market launches. See http://code.google.com/p/android/issues/detail?id=2373 + // for more details. Essentially, the market launches the main activity on top of other activities. + // we never want this to happen. Instead, we check if we are the root and if not, we finish. + if (!isTaskRoot()) { + final Intent intent = getIntent(); + if (intent.hasCategory(Intent.CATEGORY_LAUNCHER) && Intent.ACTION_MAIN.equals(intent.getAction())) { + finish(); + return; + } + } + } + + @Override + public void onResume() { + super.onResume(); + + if (Build.VERSION.SDK_INT >= 23 /*Build.VERSION_CODES.M*/) { + if (!requestPermisions(new String[]{ + Manifest.permission.READ_EXTERNAL_STORAGE, + Manifest.permission.WRITE_EXTERNAL_STORAGE})) { + start(); + } + } + else { + start(); + } + } + + @Override + public void onPause() { + super.onPause(); + if(dialog != null){ + dialog.dismiss(); + } + } + + @Override + public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { + super.onRequestPermissionsResult(requestCode, permissions, grantResults); + start(); + } + + private void start() { + checkDebugFile(); + + if (updateUrlList.size() > 0) { + showProjectSelector(); + } else { + Intent intent = new Intent(ProjectSelectActivity.this, getStartActivityClass()); + startActivity(intent); + finish(); + } + } + + private static final int REQUEST_PERMISIONS = 100; + + private boolean requestPermisions(final @NonNull String[] permissions) { + + ArrayList grantedPermissions = new ArrayList(); + ArrayList deniedPermissions = new ArrayList(); + ArrayList deniedOpPermissions = new ArrayList(); + + for (String permission : permissions) { + switch (PermissionChecker.checkSelfPermission(this, permission)) { + case PermissionChecker.PERMISSION_GRANTED: { + grantedPermissions.add(permission); + break; + } + case PermissionChecker.PERMISSION_DENIED: { + deniedPermissions.add(permission); + break; + } + case PermissionChecker.PERMISSION_DENIED_APP_OP: { + deniedOpPermissions.add(permission); + break; + } + default: { + deniedPermissions.add(permission); + break; + } + } + } + + ArrayList requestPermissions = new ArrayList(); + ArrayList rationalPermissions = new ArrayList(); + if (deniedPermissions.size() > 0) + requestPermissions.addAll(deniedPermissions); + //if (deniedOpPermissions.size() > 0) + // requestPermissions.addAll(deniedOpPermissions); + + for (String permission : requestPermissions) { + if (ActivityCompat.shouldShowRequestPermissionRationale(this, permission)) { + rationalPermissions.add(permission); + } + } + + if (requestPermissions.size() <= 0) + return false; + + ActivityCompat.requestPermissions(this, requestPermissions.toArray(new String[requestPermissions.size()]), REQUEST_PERMISIONS); + return true; + } + + private void checkDebugFile() { + XmlPullParserFactory factory; + try { + factory = XmlPullParserFactory.newInstance(); + factory.setNamespaceAware(true); + XmlPullParser parser = factory.newPullParser(); + File file = new File(Environment.getExternalStorageDirectory()+ "/n14_devFeature.xml"); + FileInputStream fis = new FileInputStream(file); + parser.setInput(new InputStreamReader(fis)); + + while(parser.getEventType() != XmlPullParser.END_DOCUMENT) { + if(parser.getEventType() == XmlPullParser.START_TAG) { + if(parser.getName().equals("Project")) { + updateUrlList.put(parser.getAttributeValue(0), parser.getAttributeValue(1)); + } + } + parser.next(); + } + } catch (XmlPullParserException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } catch (FileNotFoundException e) { + Log.d(LOG_TAG, "debugging file not exist!"); + } catch (IOException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + + private void showProjectSelector() { + List projectItems = new ArrayList(); + + for(Entry e : updateUrlList.entrySet()) { + String key = e.getKey(); + projectItems.add(key); + } + + final CharSequence[] items = projectItems.toArray(new String[projectItems.size()]); + AlertDialog.Builder builder = new AlertDialog.Builder(ProjectSelectActivity.this); + builder.setTitle("시작 프로젝트를 선택해 주세요."); + builder.setCancelable(false); + + builder.setSingleChoiceItems(items, 0, new DialogInterface.OnClickListener() { + public void onClick(DialogInterface dialog, int whichButton) { + Intent intent = new Intent(ProjectSelectActivity.this, getStartActivityClass()); + intent.putExtra("bootstrapURL", getUpdateUrl(items[whichButton].toString())); + intent.putExtra("projectUrl", getProjectUrl(items[whichButton].toString())); + startActivity(intent); + finish(); + } + }).setPositiveButton("하드 코딩 된 값 로드", new DialogInterface.OnClickListener() { + public void onClick(DialogInterface dialog, int whichButton) { + Intent intent = new Intent(ProjectSelectActivity.this, getStartActivityClass()); + startActivity(intent); + finish(); + } + }).setNegativeButton("기존 꺼 삭제", new DialogInterface.OnClickListener() { + public void onClick(DialogInterface dialog, int whichButton) { + clearApplicationData(); + } + }); + + dialog = builder.create(); + dialog.show(); + } + + private String getUpdateUrl(String key) { + return updateUrlList.get(key); + } + + private String getProjectUrl(String key) { + String projectUrl; + projectUrl = updateUrlList.get(key); + projectUrl = projectUrl.substring(0, projectUrl.lastIndexOf("/")+1); + return projectUrl; + } + + public void clearApplicationData() { + File cache = getCacheDir(); + File appDir = new File(cache.getParent()); + if (appDir.exists()) { + String[] children = appDir.list(); + for (String s : children) { + if (!s.equals("lib")) { + deleteDir(new File(appDir, s)); + Log.i("TAG", "**************** File " + appDir.getAbsolutePath() + "/" + s + " DELETED *******************"); + } + } + } + + cache = getExternalCacheDir(); + appDir = new File(cache.getParent()); + if (appDir.exists()) { + String[] children = appDir.list(); + for (String s : children) { + if (!s.equals("lib")) { + deleteDir(new File(appDir, s)); + Log.i("TAG", "**************** File " + appDir.getAbsolutePath() + "/" + s + " DELETED *******************"); + } + } + } + + Toast.makeText(getApplicationContext(), "기존 프로젝트가 삭제 되었습니다.", Toast.LENGTH_SHORT).show(); + + showProjectSelector(); + } + + public static boolean deleteDir(File dir) { + if (dir != null && dir.isDirectory()) { + String[] children = dir.list(); + for (int i = 0; i < children.length; i++) { + boolean success = deleteDir(new File(dir, children[i])); + if (!success) { + return false; + } + } + } + + return dir.delete(); + } + + public Class getStartActivityClass() + { + ActivityManager activitymanager = (ActivityManager)getSystemService(Context.ACTIVITY_SERVICE); + + List runningtaskinfo = activitymanager.getRunningTasks(1); + String currentPackageName = runningtaskinfo.get(0).baseActivity.getPackageName(); + + Class startActivityClass = null; + + if(currentPackageName.equals("com.nexacro")) { + startActivityClass = NexacroUpdatorActivity.class; + } else { + ClassLoader loader = ProjectSelectActivity.class.getClassLoader(); + try { + startActivityClass = (Class) loader.loadClass("nexacro.launcher.MainActivity"); + } catch (ClassNotFoundException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + + return startActivityClass; + } +} diff --git a/Nexacro14/Android/nexacro14_android/app/src/main/java/nexacro/launcher/UserCustomActivity.java b/Nexacro14/Android/nexacro14_android/app/src/main/java/nexacro/launcher/UserCustomActivity.java new file mode 100644 index 0000000..ef2085a --- /dev/null +++ b/Nexacro14/Android/nexacro14_android/app/src/main/java/nexacro/launcher/UserCustomActivity.java @@ -0,0 +1,55 @@ +package nexacro.launcher; + +import android.content.Context; +import android.os.Bundle; +import android.support.v4.app.FragmentActivity; +import android.view.View; +import android.widget.Button; +import android.widget.CompoundButton; +import android.widget.Toast; +import android.widget.ToggleButton; + +import com.nexacro.view.NexacroLayout; + +public class UserCustomActivity extends FragmentActivity { + final Context context = this; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + + setContentView(getResources().getIdentifier("user_custom", "layout", getPackageName())); + + Button btn = (Button)findViewById(R.id.button); + btn.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + Toast.makeText(UserCustomActivity.this, "Android button component click.", Toast.LENGTH_SHORT).show(); + } + }); + + ToggleButton toggleButton = (ToggleButton) findViewById(R.id.toggleButton); + toggleButton.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { + @Override + public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { + NexacroLayout nexacroLayout = (NexacroLayout) findViewById(R.id.nexacro_layout); + if (isChecked) { + nexacroLayout.setVisibility(View.VISIBLE); + } else { + nexacroLayout.setVisibility(View.INVISIBLE); + } + } + }); + + } + + @Override + protected void onResume() { + super.onResume(); + } + + @Override + protected void onDestroy() { + super.onDestroy(); + } +} diff --git a/Nexacro14/Android/nexacro14_android/app/src/main/res/layout/user_custom.xml b/Nexacro14/Android/nexacro14_android/app/src/main/res/layout/user_custom.xml new file mode 100644 index 0000000..7f5e964 --- /dev/null +++ b/Nexacro14/Android/nexacro14_android/app/src/main/res/layout/user_custom.xml @@ -0,0 +1,53 @@ + + + + + + + +